sp_arm32.c 4.8 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981113982113983113984113985113986113987113988113989113990113991113992113993113994113995113996113997113998113999114000114001114002114003114004114005114006114007114008114009114010114011114012114013114014114015114016114017114018114019114020114021114022114023114024114025114026114027114028114029114030114031114032114033114034114035114036114037114038114039114040114041114042114043114044114045114046114047114048114049114050114051114052114053114054114055114056114057114058114059114060114061114062114063114064114065114066114067114068114069114070114071114072114073114074114075114076114077114078114079114080114081114082114083114084114085114086114087114088114089114090114091114092114093114094114095114096114097114098114099114100114101114102114103114104114105114106114107114108114109114110114111114112114113114114114115114116114117114118114119114120114121114122114123114124114125114126114127114128114129114130114131114132114133114134114135114136114137114138114139114140114141114142114143114144114145114146114147114148114149114150114151114152114153114154114155114156114157114158114159114160114161114162114163114164114165114166114167114168114169114170114171114172114173114174114175114176114177114178114179114180114181114182114183114184114185114186114187114188114189114190114191114192114193114194114195114196114197114198114199114200114201114202114203114204114205114206114207114208114209114210114211114212114213114214114215114216114217114218114219114220114221114222114223114224114225114226114227114228114229114230114231114232114233114234114235114236114237114238114239114240114241114242114243114244114245114246114247114248114249114250114251114252114253114254114255114256114257114258114259114260114261114262114263114264114265114266114267114268114269114270114271114272114273114274114275114276114277114278114279114280114281114282114283114284114285114286114287114288114289114290114291114292114293114294114295114296114297114298114299114300114301114302114303114304114305114306114307114308114309114310114311114312114313114314114315114316114317114318114319114320114321114322114323114324114325114326114327114328114329114330114331114332114333114334114335114336114337114338114339114340114341114342114343114344114345114346114347114348114349114350114351114352114353114354114355114356114357114358114359114360114361114362114363114364114365114366114367114368114369114370114371114372114373114374114375114376114377114378114379114380114381114382114383114384114385114386114387114388114389114390114391114392114393114394114395114396114397114398114399114400114401114402114403114404114405114406114407114408114409114410114411114412114413114414114415114416114417114418114419114420114421114422114423114424114425114426114427114428114429114430114431114432114433114434114435114436114437114438114439114440114441114442114443114444114445114446114447114448114449114450114451114452114453114454114455114456114457114458114459114460114461114462114463114464114465114466114467114468114469114470114471114472114473114474114475114476114477114478114479114480114481114482114483114484114485114486114487114488114489114490114491114492114493114494114495114496114497114498114499114500114501114502114503114504114505114506114507114508114509114510114511114512114513114514114515114516114517114518114519114520114521114522114523114524114525114526114527114528114529114530114531114532114533114534114535114536114537114538114539114540114541114542114543114544114545114546114547114548114549114550114551114552114553114554114555114556114557114558114559114560114561114562114563114564114565114566114567114568114569114570114571114572114573114574114575114576114577114578114579114580114581114582114583114584114585114586114587114588114589114590114591114592114593114594114595114596114597114598114599114600114601114602114603114604114605114606114607114608114609114610114611114612114613114614114615114616114617114618114619114620114621114622114623114624114625114626114627114628114629114630114631114632114633114634114635114636114637114638114639114640114641114642114643114644114645114646114647114648114649114650114651114652114653114654114655114656114657114658114659114660114661114662114663114664114665114666114667114668114669114670114671114672114673114674114675114676114677114678114679114680114681114682114683114684114685114686114687114688114689114690114691114692114693114694114695114696114697114698114699114700114701114702114703114704114705114706114707114708114709114710114711114712114713114714114715114716114717114718114719114720114721114722114723114724114725114726114727114728114729114730114731114732114733114734114735114736114737114738114739114740114741114742114743114744114745114746114747114748114749114750114751114752114753114754114755114756114757114758114759114760114761114762114763114764114765114766114767114768114769114770114771114772114773114774114775114776114777114778114779114780114781114782114783114784114785114786114787114788114789114790114791114792114793114794114795114796114797114798114799114800114801114802114803114804114805114806114807114808114809114810114811114812114813114814114815114816114817114818114819114820114821114822114823114824114825114826114827114828114829114830114831114832114833114834114835114836114837114838114839114840114841114842114843114844114845114846114847114848114849114850114851114852114853114854114855114856114857114858114859114860114861114862114863114864114865114866114867114868114869114870114871114872114873114874114875114876114877114878114879114880114881114882114883114884114885114886114887114888114889114890114891114892114893114894114895114896114897114898114899114900114901114902114903114904114905114906114907114908114909114910114911114912114913114914114915114916114917114918114919114920114921114922114923114924114925114926114927114928114929114930114931114932114933114934114935114936114937114938114939114940114941114942114943114944114945114946114947114948114949114950114951114952114953114954114955114956114957114958114959114960114961114962114963114964114965114966114967114968114969114970114971114972114973114974114975114976114977114978114979114980114981114982114983114984114985114986114987114988114989114990114991114992114993114994114995114996114997114998114999115000115001115002115003115004115005115006115007115008115009115010115011115012115013115014115015115016115017115018115019115020115021115022115023115024115025115026115027115028115029115030115031115032115033115034115035115036115037115038115039115040115041115042115043115044115045115046115047115048115049115050115051115052115053115054115055115056115057115058115059115060115061115062115063115064115065115066115067115068115069115070115071115072115073115074115075115076115077115078115079115080115081115082115083115084115085115086115087115088115089115090115091115092115093115094115095115096115097115098115099115100115101115102115103115104115105115106115107115108115109115110115111115112115113115114115115115116115117115118115119115120115121115122115123115124115125115126115127115128115129115130115131115132115133115134115135115136115137115138115139115140115141115142115143115144115145115146115147115148115149115150115151115152115153115154115155115156115157115158115159115160115161115162115163115164115165115166115167115168115169115170115171115172115173115174115175115176115177115178115179115180115181115182115183115184115185115186115187115188115189115190115191115192115193115194115195115196115197115198115199115200115201115202115203115204115205115206115207115208115209115210115211115212115213115214115215115216115217115218115219115220115221115222115223115224115225115226115227115228115229115230115231115232115233115234115235115236115237115238115239115240115241115242115243115244115245115246115247115248115249115250115251115252115253115254115255115256115257115258115259115260115261115262115263115264115265115266115267115268115269115270115271115272115273115274115275115276115277115278115279115280115281115282115283115284115285115286115287115288115289115290115291115292115293115294115295115296115297115298115299115300115301115302115303115304115305115306115307115308115309115310115311115312115313115314115315115316115317115318115319115320115321115322115323115324115325115326115327115328115329115330115331115332115333115334115335115336115337115338115339115340115341115342115343115344115345115346115347115348115349115350115351115352115353115354115355115356115357115358115359115360115361115362115363115364115365115366115367115368115369115370115371115372115373115374115375115376115377115378115379115380115381115382115383115384115385115386115387115388115389115390115391115392115393115394115395115396115397115398115399115400115401115402115403115404115405115406115407115408115409115410115411115412115413115414115415115416115417115418115419115420115421115422115423115424115425115426115427115428115429115430115431115432115433115434115435115436115437115438115439115440115441115442115443115444115445115446115447115448115449115450115451115452115453115454115455115456115457115458115459115460115461115462115463115464115465115466115467115468115469115470115471115472115473115474115475115476115477115478115479115480115481115482115483115484115485115486115487115488115489115490115491115492115493115494115495115496115497115498115499115500115501115502115503115504115505115506115507115508115509115510115511115512115513115514115515115516115517115518115519115520115521115522115523115524115525115526115527115528115529115530115531115532115533115534115535115536115537115538115539115540115541115542115543115544115545115546115547115548115549115550115551115552115553115554115555115556115557115558115559115560115561115562115563115564115565115566115567115568115569115570115571115572115573115574115575115576115577115578115579115580115581115582115583115584115585115586115587115588115589115590115591115592115593115594115595115596115597115598115599115600115601115602115603115604115605115606115607115608115609115610115611115612115613115614115615115616115617115618115619115620115621115622115623115624115625115626115627115628115629115630115631115632115633115634115635115636115637115638115639115640115641115642115643115644115645115646115647115648115649115650115651115652115653115654115655115656115657115658115659115660115661115662115663115664115665115666115667115668115669115670115671115672115673115674115675115676115677115678115679115680115681115682115683115684115685115686115687115688115689115690115691115692115693115694115695115696115697115698115699115700115701115702115703115704115705115706115707115708115709115710115711115712115713115714115715115716115717115718115719115720115721115722115723115724115725115726115727115728115729115730115731115732115733115734115735115736115737115738115739115740115741115742115743115744115745115746115747115748115749115750115751115752115753115754115755115756115757115758115759115760115761115762115763115764115765115766115767115768115769115770115771115772115773115774115775115776115777115778115779115780115781115782115783115784115785115786115787115788115789115790115791115792115793115794115795115796115797115798115799115800115801115802115803115804115805115806115807115808115809115810115811115812115813115814115815115816115817115818115819115820115821115822115823115824115825115826115827115828115829115830115831115832115833115834115835115836115837115838115839115840115841115842115843115844115845115846115847115848115849115850115851115852115853115854115855115856115857115858115859115860115861115862115863115864115865115866115867115868115869115870115871115872115873115874115875115876115877115878115879115880115881115882115883115884115885115886115887115888115889115890115891115892115893115894115895115896115897115898115899115900115901115902115903115904115905115906115907115908115909115910115911115912115913115914115915115916115917115918115919115920115921115922115923115924115925115926115927115928115929115930115931115932115933115934115935115936115937115938115939115940115941115942115943115944115945115946115947115948115949115950115951115952115953115954115955115956115957115958115959115960115961115962115963115964115965115966115967115968115969115970115971115972115973115974115975115976115977115978115979115980115981115982115983115984115985115986115987115988115989115990115991115992115993115994115995115996115997115998115999116000116001116002116003116004116005116006116007116008116009116010116011116012116013116014116015116016116017116018116019116020116021116022116023116024116025116026116027116028116029116030116031116032116033116034116035116036116037116038116039116040116041116042116043116044116045116046116047116048116049116050116051116052116053116054116055116056116057116058116059116060116061116062116063116064116065116066116067116068116069116070116071116072116073116074116075116076116077116078116079116080116081116082116083116084116085116086116087116088116089116090116091116092116093116094116095116096116097116098116099116100116101116102116103116104116105116106116107116108116109116110116111116112116113116114116115116116116117116118116119116120116121116122116123116124116125116126116127116128116129116130116131116132116133116134116135116136116137116138116139116140116141116142116143116144116145116146116147116148116149116150116151116152116153116154116155116156116157116158116159116160116161116162116163116164116165116166116167116168116169116170116171116172116173116174116175116176116177116178116179116180116181116182116183116184116185116186116187116188116189116190116191116192116193116194116195116196116197116198116199116200116201116202116203116204116205116206116207116208116209116210116211116212116213116214116215116216116217116218116219116220116221116222116223116224116225116226116227116228116229116230116231116232116233116234116235116236116237116238116239116240116241116242116243116244116245116246116247116248116249116250116251116252116253116254116255116256116257116258116259116260116261116262116263116264116265116266116267116268116269116270116271116272116273116274116275116276116277116278116279116280116281116282116283116284116285116286116287116288116289116290116291116292116293116294116295116296116297116298116299116300116301116302116303116304116305116306116307116308116309116310116311116312116313116314116315116316116317116318116319116320116321116322116323116324116325116326116327116328116329116330116331116332116333116334116335116336116337116338116339116340116341116342116343116344116345116346116347116348116349116350116351116352116353116354116355116356116357116358116359116360116361116362116363116364116365116366116367116368116369116370116371116372116373116374116375116376116377116378116379116380116381116382116383116384116385116386116387116388116389116390116391116392116393116394116395116396116397116398116399116400116401116402116403116404116405116406116407116408116409116410116411116412116413116414116415116416116417116418116419116420116421116422116423116424116425116426116427116428116429116430116431116432116433116434116435116436116437116438116439116440116441116442116443116444116445116446116447116448116449116450116451116452116453116454116455116456116457116458116459116460116461116462116463116464116465116466116467116468116469116470116471116472116473116474116475116476116477116478116479116480116481116482116483116484116485116486116487116488116489116490116491116492116493116494116495116496116497116498116499116500116501116502116503116504116505116506116507116508116509116510116511116512116513116514116515116516116517116518116519116520116521116522116523116524116525116526116527116528116529116530116531116532116533116534116535116536116537116538116539116540116541116542116543116544116545116546116547116548116549116550116551116552116553116554116555116556116557116558116559116560116561116562116563116564116565116566116567116568116569116570116571116572116573116574116575116576116577116578116579116580116581116582116583116584116585116586116587116588116589116590116591116592116593116594116595116596116597116598116599116600116601116602116603116604116605116606116607116608116609116610116611116612116613116614116615116616116617116618116619116620116621116622116623116624116625116626116627116628116629116630116631116632116633116634116635116636116637116638116639116640116641116642116643116644116645116646116647116648116649116650116651116652116653116654116655116656116657116658116659116660116661116662116663116664116665116666116667116668116669116670116671116672116673116674116675116676116677116678116679116680116681116682116683116684116685116686116687116688116689116690116691116692116693116694116695116696116697116698116699116700116701116702116703116704116705116706116707116708116709116710116711116712116713116714116715116716116717116718116719116720116721116722116723116724116725116726116727116728116729116730116731116732116733116734116735116736116737116738116739116740116741116742116743116744116745116746116747116748116749116750116751116752116753116754116755116756116757116758116759116760116761116762116763116764116765116766116767116768116769116770116771116772116773116774116775116776116777116778116779116780116781116782116783116784116785116786116787116788116789116790116791116792116793116794116795116796116797116798116799116800116801116802116803116804116805116806116807116808116809116810116811116812116813116814116815116816116817116818116819116820116821116822116823116824116825116826116827116828116829116830116831116832116833116834116835116836116837116838116839116840116841116842116843116844116845116846116847116848116849116850116851116852116853116854116855116856116857116858116859116860116861116862116863116864116865116866116867116868116869116870116871116872116873116874116875116876116877116878116879116880116881116882116883116884116885116886116887116888116889116890116891116892116893116894116895116896116897116898116899116900116901116902116903116904116905116906116907116908116909116910116911116912116913116914116915116916116917116918116919116920116921116922116923116924116925116926116927116928116929116930116931116932116933116934116935116936116937116938116939116940116941116942116943116944116945116946116947116948116949116950116951116952116953116954116955116956116957116958116959116960116961116962116963116964116965116966116967116968116969116970116971116972116973116974116975116976116977116978116979116980116981116982116983116984116985116986116987116988116989116990116991116992116993116994116995116996116997116998116999117000117001117002117003117004117005117006117007117008117009117010117011117012117013117014117015117016117017117018117019117020117021117022117023117024117025117026117027117028117029117030117031117032117033117034117035117036117037117038117039117040117041117042117043117044117045117046117047117048117049117050117051117052117053117054117055117056117057117058117059117060117061117062117063117064117065117066117067117068117069117070117071117072117073117074117075117076117077117078117079117080117081117082117083117084117085117086117087117088117089117090117091117092117093117094117095117096117097117098117099117100117101117102117103117104117105117106117107117108117109117110117111117112117113117114117115117116117117117118117119117120117121117122117123117124117125117126117127117128117129117130117131117132117133117134117135117136117137117138117139117140117141117142117143117144117145117146117147117148117149117150117151117152117153117154117155117156117157117158117159117160117161117162117163117164117165117166117167117168117169117170117171117172117173117174117175117176117177117178117179117180117181117182117183117184117185117186117187117188117189117190117191117192117193117194117195117196117197117198117199117200117201117202117203117204117205117206117207117208117209117210117211117212117213117214117215117216117217117218117219117220117221117222117223117224117225117226117227117228117229117230117231117232117233117234117235117236117237117238117239117240117241117242117243117244117245117246117247117248117249117250117251117252117253117254117255117256117257117258117259117260117261117262117263117264117265117266117267117268117269117270117271117272117273117274117275117276117277117278117279117280117281117282117283117284117285117286117287117288117289117290117291117292117293117294117295117296117297117298117299117300117301117302117303117304117305117306117307117308117309117310117311117312117313117314117315117316117317117318117319117320117321117322117323117324117325117326117327117328117329117330117331117332117333117334117335117336117337117338117339117340117341117342117343117344117345117346117347117348117349117350117351117352117353117354117355117356117357117358117359117360117361117362117363117364117365117366117367117368117369117370117371117372117373117374117375117376117377117378117379117380117381117382117383117384117385117386117387117388117389117390117391117392117393117394117395117396117397117398117399117400117401117402117403117404117405117406117407117408117409117410117411117412117413117414117415117416117417117418117419117420117421117422117423117424117425117426117427117428117429117430117431117432117433117434117435117436117437117438117439117440117441117442117443117444117445117446117447117448117449117450117451117452117453117454117455117456117457117458117459117460117461117462117463117464117465117466117467117468117469117470117471117472117473117474117475117476117477117478117479117480117481117482117483117484117485117486117487117488117489117490117491117492117493117494117495117496117497117498117499117500117501117502117503117504117505117506117507117508117509117510117511117512117513117514117515117516117517117518117519117520117521117522117523117524117525117526117527117528117529117530117531117532117533117534117535117536117537117538117539117540117541117542117543117544117545117546117547117548117549117550117551117552117553117554117555117556117557117558117559117560117561117562117563117564117565117566117567117568117569117570117571117572117573117574117575117576117577117578117579117580117581117582117583117584117585117586117587117588117589117590117591117592117593117594117595117596117597117598117599117600117601117602117603117604117605117606117607117608117609117610117611117612117613117614117615117616117617117618117619117620117621117622117623117624117625117626117627117628117629117630117631117632117633117634117635117636117637117638117639117640117641117642117643117644117645117646117647117648117649117650117651117652117653117654117655117656117657117658117659117660117661117662117663117664117665117666117667117668117669117670117671117672117673117674117675117676117677117678117679117680117681117682117683117684117685117686117687117688117689117690117691117692117693117694117695117696117697117698117699117700117701117702117703117704117705117706117707117708117709117710117711117712117713117714117715117716117717117718117719117720117721117722117723117724117725117726117727117728117729117730117731117732117733117734117735117736117737117738117739117740117741117742117743117744117745117746117747117748117749117750117751117752117753117754117755117756117757117758117759117760117761117762117763117764117765117766117767117768117769117770117771117772117773117774117775117776117777117778117779117780117781117782117783117784117785117786117787117788117789117790117791117792117793117794117795117796117797117798117799117800117801117802117803117804117805117806117807117808117809117810117811117812117813117814117815117816117817117818117819117820117821117822117823117824117825117826117827117828117829117830117831117832117833117834117835117836117837117838117839117840117841117842117843117844117845117846117847117848117849117850117851117852117853117854117855117856117857117858117859117860117861117862117863117864117865117866117867117868117869117870117871117872117873117874117875117876117877117878117879117880117881117882117883117884117885117886117887117888117889117890117891117892117893117894117895117896117897117898117899117900117901117902117903117904117905117906117907117908117909117910117911117912117913117914117915117916117917117918117919117920117921117922117923117924117925117926117927117928117929117930117931117932117933117934117935117936117937117938117939117940117941117942117943117944117945117946117947117948117949117950117951117952117953117954117955117956117957117958117959117960117961117962117963117964117965117966117967117968117969117970117971117972117973117974117975117976117977117978117979117980117981117982117983117984117985117986117987117988117989117990117991117992117993117994117995117996117997117998117999118000118001118002118003118004118005118006118007118008118009118010118011118012118013118014118015118016118017118018118019118020118021118022118023118024118025118026118027118028118029118030118031118032118033118034118035118036118037118038118039118040118041118042118043118044118045118046118047118048118049118050118051118052118053118054118055118056118057118058118059118060118061118062118063118064118065118066118067118068118069118070118071118072118073118074118075118076118077118078118079118080118081118082118083118084118085118086118087118088118089118090118091118092118093118094118095118096118097118098118099118100118101118102118103118104118105118106118107118108118109118110118111118112118113118114118115118116118117118118118119118120118121118122118123118124118125118126118127118128118129118130118131118132118133118134118135118136118137118138118139118140118141118142118143118144118145118146118147118148118149118150118151118152118153118154118155118156118157118158118159118160118161118162118163118164118165118166118167118168118169118170118171118172118173118174118175118176118177118178118179118180118181118182118183118184118185118186118187118188118189118190118191118192118193118194118195118196118197118198118199118200118201118202118203118204118205118206118207118208118209118210118211118212118213118214118215118216118217118218118219118220118221118222118223118224118225118226118227118228118229118230118231118232118233118234118235118236118237118238118239118240118241118242118243118244118245118246118247118248118249118250118251118252118253118254118255118256118257118258118259118260118261118262118263118264118265118266118267118268118269118270118271118272118273118274118275118276118277118278118279118280118281118282118283118284118285118286118287118288118289118290118291118292118293118294118295118296118297118298118299118300118301118302118303118304118305118306118307118308118309118310118311118312118313118314118315118316118317118318118319118320118321118322118323118324118325118326118327118328118329118330118331118332118333118334118335118336118337118338118339118340118341118342118343118344118345118346118347118348118349118350118351118352118353118354118355118356118357118358118359118360118361118362118363118364118365118366118367118368118369118370118371118372118373118374118375118376118377118378118379118380118381118382118383118384118385118386118387118388118389118390118391118392118393118394118395118396118397118398118399118400118401118402118403118404118405118406118407118408118409118410118411118412118413118414118415118416118417118418118419118420118421118422118423118424118425118426118427118428118429118430118431118432118433118434118435118436118437118438118439118440118441118442118443118444118445118446118447118448118449118450118451118452118453118454118455118456118457118458118459118460118461118462118463118464118465118466118467118468118469118470118471118472118473118474118475118476118477118478118479118480118481118482118483118484118485118486118487118488118489118490118491118492118493118494118495118496118497118498118499118500118501118502118503118504118505118506118507118508118509118510118511118512118513118514118515118516118517118518118519118520118521118522118523118524118525118526118527118528118529118530118531118532118533118534118535118536118537118538118539118540118541118542118543118544118545118546118547118548118549118550118551118552118553118554118555118556118557118558118559118560118561118562118563118564118565118566118567118568118569118570118571118572118573118574118575118576118577118578118579118580118581118582118583118584118585118586118587118588118589118590118591118592118593118594118595118596118597118598118599118600118601118602118603118604118605118606118607118608118609118610118611118612118613118614118615118616118617118618118619118620118621118622118623118624118625118626118627118628118629118630118631118632118633118634118635118636118637118638118639118640118641118642118643118644118645118646118647118648118649118650118651118652118653118654118655118656118657118658118659118660118661118662118663118664118665118666118667118668118669118670118671118672118673118674118675118676118677118678118679118680118681118682118683118684118685118686118687118688118689118690118691118692118693118694118695118696118697118698118699118700118701118702118703118704118705118706118707118708118709118710118711118712118713118714118715118716118717118718118719118720118721118722118723118724118725118726118727118728118729118730118731118732118733118734118735118736118737118738118739118740118741118742118743118744118745118746118747118748118749118750118751118752118753118754118755118756118757118758118759118760118761118762118763118764118765118766118767118768118769118770118771118772118773118774118775118776118777118778118779118780118781118782118783118784118785118786118787118788118789118790118791118792118793118794118795118796118797118798118799118800118801118802118803118804118805118806118807118808118809118810118811118812118813118814118815118816118817118818118819118820118821118822118823118824118825118826118827118828118829118830118831118832118833118834118835118836118837118838118839118840118841118842118843118844118845118846118847118848118849118850118851118852118853118854118855118856118857118858118859118860118861118862118863118864118865118866118867118868118869118870118871118872118873118874118875118876118877118878118879118880118881118882118883118884118885118886118887118888118889118890118891118892118893118894118895118896118897118898118899118900118901118902118903118904118905118906118907118908118909118910118911118912118913118914118915118916118917118918118919118920118921118922118923118924118925118926118927118928118929118930118931118932118933118934118935118936118937118938118939118940118941118942118943118944118945118946118947118948118949118950118951118952118953118954118955118956118957118958118959118960118961118962118963118964118965118966118967118968118969118970118971118972118973118974118975118976118977118978118979118980118981118982118983118984118985118986118987118988118989118990118991118992118993118994118995118996118997118998118999119000119001119002119003119004119005119006119007119008119009119010119011119012119013119014119015119016119017119018119019119020119021119022119023119024119025119026119027119028119029119030119031119032119033119034119035119036119037119038119039119040119041119042119043119044119045119046119047119048119049119050119051119052119053119054119055119056119057119058119059119060119061119062119063119064119065119066119067119068119069119070119071119072119073119074119075119076119077119078119079119080119081119082119083119084119085119086119087119088119089119090119091119092119093119094119095119096119097119098119099119100119101119102119103119104119105119106119107119108119109119110119111119112119113119114119115119116119117119118119119119120119121119122119123119124119125119126119127119128119129119130119131119132119133119134119135119136119137119138119139119140119141119142119143119144119145119146119147119148119149119150119151119152119153119154119155119156119157119158119159119160119161119162119163119164119165119166119167119168119169119170119171119172119173119174119175119176119177119178119179119180119181119182119183119184119185119186119187119188119189119190119191119192119193119194119195119196119197119198119199119200119201119202119203119204119205119206119207119208119209119210119211119212119213119214119215119216119217119218119219119220119221119222119223119224119225119226119227119228119229119230119231119232119233119234119235119236119237119238119239119240119241119242119243119244119245119246119247119248119249119250119251119252119253119254119255119256119257119258119259119260119261119262119263119264119265119266119267119268119269119270119271119272119273119274119275119276119277119278119279119280119281119282119283119284119285119286119287119288119289119290119291119292119293119294119295119296119297119298119299119300119301119302119303119304119305119306119307119308119309119310119311119312119313119314119315119316119317119318119319119320119321119322119323119324119325119326119327119328119329119330119331119332119333119334119335119336119337119338119339119340119341119342119343119344119345119346119347119348119349119350119351119352119353119354119355119356119357119358119359119360119361119362119363119364119365119366119367119368119369119370119371119372119373119374119375119376119377119378119379119380119381119382119383119384119385119386119387119388119389119390119391119392119393119394119395119396119397119398119399119400119401119402119403119404119405119406119407119408119409119410119411119412119413119414119415119416119417119418119419119420119421119422119423119424119425119426119427119428119429119430119431119432119433119434119435119436119437119438119439119440119441119442119443119444119445119446119447119448119449119450119451119452119453119454119455119456119457119458119459119460119461119462119463119464119465119466119467119468119469119470119471119472119473119474119475119476119477119478119479119480119481119482119483119484119485119486119487119488119489119490119491119492119493119494119495119496119497119498119499119500119501119502119503119504119505119506119507119508119509119510119511119512119513119514119515119516119517119518119519119520119521119522119523119524119525119526119527119528119529119530119531119532119533119534119535119536119537119538119539119540119541119542119543119544119545119546119547119548119549119550119551119552119553119554119555119556119557119558119559119560119561119562119563119564119565119566119567119568119569119570119571119572119573119574119575119576119577119578119579119580119581119582119583119584119585119586119587119588119589119590119591119592119593119594119595119596119597119598119599119600119601119602119603119604119605119606119607119608119609119610119611119612119613119614119615119616119617119618119619119620119621119622119623119624119625119626119627119628119629119630119631119632119633119634119635119636119637119638119639119640119641119642119643119644119645119646119647119648119649119650119651119652119653119654119655119656119657119658119659119660119661119662119663119664119665119666119667119668119669119670119671119672119673119674119675119676119677119678119679119680119681119682119683119684119685119686119687119688119689119690119691119692119693119694119695119696119697119698119699119700119701119702119703119704119705119706119707119708119709119710119711119712119713119714119715119716119717119718119719119720119721119722119723119724119725119726119727119728119729119730119731119732119733119734119735119736119737119738119739119740119741119742119743119744119745119746119747119748119749119750119751119752119753119754119755119756119757119758119759119760119761119762119763119764119765119766119767119768119769119770119771119772119773119774119775119776119777119778119779119780119781119782119783119784119785119786119787119788119789119790119791119792119793119794119795119796119797119798119799119800119801119802119803119804119805119806119807119808119809119810119811119812119813119814119815119816119817119818119819119820119821119822119823119824119825119826119827119828119829119830119831119832119833119834119835119836119837119838119839119840119841119842119843119844119845119846119847119848119849119850119851119852119853119854119855119856119857119858119859119860119861119862119863119864119865119866119867119868119869119870119871119872119873119874119875119876119877119878119879119880119881119882119883119884119885119886119887119888119889119890119891119892119893119894119895119896119897119898119899119900119901119902119903119904119905119906119907119908119909119910119911119912119913119914119915119916119917119918119919119920119921119922119923119924119925119926119927119928119929119930119931119932119933119934119935119936119937119938119939119940119941119942119943119944119945119946119947119948119949119950119951119952119953119954119955119956119957119958119959119960119961119962119963119964119965119966119967119968119969119970119971119972119973119974119975119976119977119978119979119980119981119982119983119984119985119986119987119988119989119990119991119992119993119994119995119996119997119998119999120000120001120002120003120004120005120006120007120008120009120010120011120012120013120014120015120016120017120018120019120020120021120022120023120024120025120026120027120028120029120030120031120032120033120034120035120036120037120038120039120040120041120042120043120044120045120046120047120048120049120050120051120052120053120054120055120056120057120058120059120060120061120062120063120064120065120066120067120068120069120070120071120072120073120074120075120076120077120078120079120080120081120082120083120084120085120086120087120088120089120090120091120092120093120094120095120096120097120098120099120100120101120102120103120104120105120106120107120108120109120110120111120112120113120114120115120116120117120118120119120120120121120122120123120124120125120126120127120128120129120130120131120132120133120134120135120136120137120138120139120140120141120142120143120144120145120146120147120148120149120150120151120152120153120154120155120156120157120158120159120160120161120162120163120164120165120166120167120168120169120170120171120172120173120174120175120176120177120178120179120180120181120182120183120184120185120186120187120188120189120190120191120192120193120194120195120196120197120198120199120200120201120202120203120204120205120206120207120208120209120210120211120212120213120214120215120216120217120218120219120220120221120222120223120224120225120226120227120228120229120230120231120232120233120234120235120236120237120238120239120240120241120242120243120244120245120246120247120248120249120250120251120252120253120254120255120256120257120258120259120260120261120262120263120264120265120266120267120268120269120270120271120272120273120274120275120276120277120278120279120280120281120282120283120284120285120286120287120288120289120290120291120292120293120294120295120296120297120298120299120300120301120302120303120304120305120306120307120308120309120310120311120312120313120314120315120316120317120318120319120320120321120322120323120324120325120326120327120328120329120330120331120332120333120334120335120336120337120338120339120340120341120342120343120344120345120346120347120348120349120350120351120352120353120354120355120356120357120358120359120360120361120362120363120364120365120366120367120368120369120370120371120372120373120374120375120376120377120378120379120380120381120382120383120384120385120386120387120388120389120390120391120392120393120394120395120396120397120398120399120400120401120402120403120404120405120406120407120408120409120410120411120412120413120414120415120416120417120418120419120420120421120422120423120424120425120426120427120428120429120430120431120432120433120434120435120436120437120438120439120440120441120442120443120444120445120446120447120448120449120450120451120452120453120454120455120456120457120458120459120460120461120462120463120464120465120466120467120468120469120470120471120472120473120474120475120476120477120478120479120480120481120482120483120484120485120486120487120488120489120490120491120492120493120494120495120496120497120498120499120500120501120502120503120504120505120506120507120508120509120510120511120512120513120514120515120516120517120518120519120520120521120522120523120524120525120526120527120528120529120530120531120532120533120534120535120536120537120538120539120540120541120542120543120544120545120546120547120548120549120550120551120552120553120554120555120556120557120558120559120560120561120562120563120564120565120566120567120568120569120570120571120572120573120574120575120576120577120578120579120580120581120582120583120584120585120586120587120588120589120590120591120592120593120594120595120596120597120598120599120600120601120602120603120604120605120606120607120608120609120610120611120612120613120614120615120616120617120618120619120620120621120622120623120624120625120626120627120628120629120630120631120632120633120634120635120636120637120638120639120640120641120642120643120644120645120646120647120648120649120650120651120652120653120654120655120656120657120658120659120660120661120662120663120664120665120666120667120668120669120670120671120672120673120674120675120676120677120678120679120680120681120682120683120684120685120686120687120688120689120690120691120692120693120694120695120696120697120698120699120700120701120702120703120704120705120706120707120708120709120710120711120712120713120714120715120716120717120718120719120720120721120722120723120724120725120726120727120728120729120730120731120732120733120734120735120736120737120738120739120740120741120742120743120744120745120746120747120748120749120750120751120752120753120754120755120756120757120758120759120760120761120762120763120764120765120766120767120768120769120770120771120772120773120774120775120776120777120778120779120780120781120782120783120784120785120786120787120788120789120790120791120792120793120794120795120796120797120798120799120800120801120802120803120804120805120806120807120808120809120810120811120812120813120814120815120816120817120818120819120820120821120822120823120824120825120826120827120828120829120830120831120832120833120834120835120836120837120838120839120840120841120842120843120844120845120846120847120848120849120850120851120852120853120854120855120856120857120858120859120860120861120862120863120864120865120866120867120868120869120870120871120872120873120874120875120876120877120878120879120880120881120882120883120884120885120886120887120888120889120890120891120892120893120894120895120896120897120898120899120900120901120902120903120904120905120906120907120908120909120910120911120912120913120914120915120916120917120918120919120920120921120922120923120924120925120926120927120928120929120930120931120932120933120934120935120936120937120938120939120940120941120942120943120944120945120946120947120948120949120950120951120952120953120954120955120956120957120958120959120960120961120962120963120964120965120966120967120968120969120970120971120972120973120974120975120976120977120978120979120980120981120982120983120984120985120986120987120988120989120990120991120992120993120994120995120996120997120998120999121000121001121002121003121004121005121006121007121008121009121010121011121012121013121014121015121016121017121018121019121020121021121022121023121024121025121026121027121028121029121030121031121032121033121034121035121036121037121038121039121040121041121042121043121044121045121046121047121048121049121050121051121052121053121054121055121056121057121058121059121060121061121062121063121064121065121066121067121068121069121070121071121072121073121074121075121076121077121078121079121080121081121082121083121084121085121086121087121088121089121090121091121092121093121094121095121096121097121098121099121100121101121102121103121104121105121106121107121108121109121110121111121112121113121114121115121116121117121118121119121120121121121122121123121124121125121126121127121128121129121130121131121132121133121134121135121136121137121138121139121140121141121142121143121144121145121146121147121148121149121150121151121152121153121154121155121156121157121158121159121160121161121162121163121164121165121166121167121168121169121170121171121172121173121174121175121176121177121178121179121180121181121182121183121184121185121186121187121188121189121190121191121192121193121194121195121196121197121198121199121200121201121202121203121204121205121206121207121208121209121210121211121212121213121214121215121216121217121218121219121220121221121222121223121224121225121226121227121228121229121230121231121232121233121234121235121236121237121238121239121240121241121242121243121244121245121246121247121248121249121250121251121252121253121254121255121256121257121258121259121260121261121262121263121264121265121266121267121268121269121270121271121272121273121274121275121276121277121278121279121280121281121282121283121284121285121286121287121288121289121290121291121292121293121294121295121296121297121298121299121300121301121302121303121304121305121306121307121308121309121310121311121312121313121314121315121316121317121318121319121320121321121322121323121324121325121326121327121328121329121330121331121332121333121334121335121336121337121338121339121340121341121342121343121344121345121346121347121348121349121350121351121352121353121354121355121356121357121358121359121360121361121362121363121364121365121366121367121368121369121370121371121372121373121374121375121376121377121378121379121380121381121382121383121384121385121386121387121388121389121390121391121392121393121394121395121396121397121398121399121400121401121402121403121404121405121406121407121408121409121410121411121412121413121414121415121416121417121418121419121420121421121422121423121424121425121426121427121428121429121430121431121432121433121434121435121436121437121438121439121440121441121442121443121444121445121446121447121448121449121450121451121452121453121454121455121456121457121458121459121460121461121462121463121464121465121466121467121468121469121470121471121472121473121474121475121476121477121478121479121480121481121482121483121484121485121486121487121488121489121490121491121492121493121494121495121496121497121498121499121500121501121502121503121504121505121506121507121508121509121510121511121512121513121514121515121516121517121518121519121520121521121522121523121524121525121526121527121528121529121530121531121532121533121534121535121536121537121538121539121540121541121542121543121544121545121546121547121548121549121550121551121552121553121554121555121556121557121558121559121560121561121562121563121564121565121566121567121568121569121570121571121572121573121574121575121576121577121578121579121580121581121582121583121584121585121586121587121588121589121590121591121592121593121594121595121596121597121598121599121600121601121602121603121604121605121606121607121608121609121610121611121612121613121614121615121616121617121618121619121620121621121622121623121624121625121626121627121628121629121630121631121632121633121634121635121636121637121638121639121640121641121642121643121644121645121646121647121648121649121650121651121652121653121654121655121656121657121658121659121660121661121662121663121664121665121666121667121668121669121670121671121672121673121674121675121676121677121678121679121680121681121682121683121684121685121686121687121688121689121690121691121692121693121694121695121696121697121698121699121700121701121702121703121704121705121706121707121708121709121710121711121712121713121714121715121716121717121718121719121720121721121722121723121724121725121726121727121728121729121730121731121732121733121734121735121736121737121738121739121740121741121742121743121744121745121746121747121748121749121750121751121752121753121754121755121756121757121758121759121760121761121762121763121764121765121766121767121768121769121770121771121772121773121774121775121776121777121778121779121780121781121782121783121784121785121786121787121788121789121790121791121792121793121794121795121796121797121798121799121800121801121802121803121804121805121806121807121808121809121810121811121812121813121814121815121816121817121818121819121820121821121822121823121824121825121826121827121828121829121830121831121832121833121834121835121836121837121838121839121840121841121842121843121844121845121846121847121848121849121850121851121852121853121854121855121856121857121858121859121860121861121862121863121864121865121866121867121868121869121870121871121872121873121874121875121876121877121878121879121880121881121882121883121884121885121886121887121888121889121890121891121892121893121894121895121896121897121898121899121900121901121902121903121904121905121906121907121908121909121910121911121912121913121914121915121916121917121918121919121920121921121922121923121924121925121926121927121928121929121930121931121932121933121934121935121936121937121938121939121940121941121942121943121944121945121946121947121948121949121950121951121952121953121954121955121956121957121958121959121960121961121962121963121964121965121966121967121968121969121970121971121972121973121974121975121976121977121978121979121980121981121982121983121984121985121986121987121988121989121990121991121992121993121994121995121996121997121998121999122000122001122002122003122004122005122006122007122008122009122010122011122012122013122014122015122016122017122018122019122020122021122022122023122024122025122026122027122028122029122030122031122032122033122034122035122036122037122038122039122040122041122042122043122044122045122046122047122048122049122050122051122052122053122054122055122056122057122058122059122060122061122062122063122064122065122066122067122068122069122070122071122072122073122074122075122076122077122078122079122080122081122082122083122084122085122086122087122088122089122090122091122092122093122094122095122096122097122098122099122100122101122102122103122104122105122106122107122108122109122110122111122112122113122114122115122116122117122118122119122120122121122122122123122124122125122126122127122128122129122130122131122132122133122134122135122136122137122138122139122140122141122142122143122144122145122146122147122148122149122150122151122152122153122154122155122156122157122158122159122160122161122162122163122164122165122166122167122168122169122170122171122172122173122174122175122176122177122178122179122180122181122182122183122184122185122186122187122188122189122190122191122192122193122194122195122196122197122198122199122200122201122202122203122204122205122206122207122208122209122210122211122212122213122214122215122216122217122218122219122220122221122222122223122224122225122226122227122228122229122230122231122232122233122234122235122236122237122238122239122240122241122242122243122244122245122246122247122248122249122250122251122252122253122254122255122256122257122258122259122260122261122262122263122264122265122266122267122268122269122270122271122272122273122274122275122276122277122278122279122280122281122282122283122284122285122286122287122288122289122290122291122292122293122294122295122296122297122298122299122300122301122302122303122304122305122306122307122308122309122310122311122312122313122314122315122316122317122318122319122320122321122322122323122324122325122326122327122328122329122330122331122332122333122334122335122336122337122338122339122340122341122342122343122344122345122346122347122348122349122350122351122352122353122354122355122356122357122358122359122360122361122362122363122364122365122366122367122368122369122370122371122372122373122374122375122376122377122378122379122380122381122382122383122384122385122386122387122388122389122390122391122392122393122394122395122396122397122398122399122400122401122402122403122404122405122406122407122408122409122410122411122412122413122414122415122416122417122418122419122420122421122422122423122424122425122426122427122428122429122430122431122432122433122434122435122436122437122438122439122440122441122442122443122444122445122446122447122448122449122450122451122452122453122454122455122456122457122458122459122460122461122462122463122464122465122466122467122468122469122470122471122472122473122474122475122476122477122478122479122480122481122482122483122484122485122486122487122488122489122490122491122492122493122494122495122496122497122498122499122500122501122502122503122504122505122506122507122508122509122510122511122512122513122514122515122516122517122518122519122520122521122522122523122524122525122526122527122528122529122530122531122532122533122534122535122536122537122538122539122540122541122542122543122544122545122546122547122548122549122550122551122552122553122554122555122556122557122558122559122560122561122562122563122564122565122566122567122568122569122570122571122572122573122574122575122576122577122578122579122580122581122582122583122584122585122586122587122588122589122590122591122592122593122594122595122596122597122598122599122600122601122602122603122604122605122606122607122608122609122610122611122612122613122614122615122616122617122618122619122620122621122622122623122624122625122626122627122628122629122630122631122632122633122634122635122636122637122638122639122640122641122642122643122644122645122646122647122648122649122650122651122652122653122654122655122656122657122658122659122660122661122662122663122664122665122666122667122668122669122670122671122672122673122674122675122676122677122678122679122680122681122682122683122684122685122686122687122688122689122690122691122692122693122694122695122696122697122698122699122700122701122702122703122704122705122706122707122708122709122710122711122712122713122714122715122716122717122718122719122720122721122722122723122724122725122726122727122728122729122730122731122732122733122734122735122736122737122738122739122740122741122742122743122744122745122746122747122748122749122750122751122752122753122754122755122756122757122758122759122760122761122762122763122764122765122766122767122768122769122770122771122772122773122774122775122776122777122778122779122780122781122782122783122784122785122786122787122788122789122790122791122792122793122794122795122796122797122798122799122800122801122802122803122804122805122806122807122808122809122810122811122812122813122814122815122816122817122818122819122820122821122822122823122824122825122826122827122828122829122830122831122832122833122834122835122836122837122838122839122840122841122842122843122844122845122846122847122848122849122850122851122852122853122854122855122856122857122858122859122860122861122862122863122864122865122866122867122868122869122870122871122872122873122874122875122876122877122878122879122880122881122882122883122884122885122886122887122888122889122890122891122892122893122894122895122896122897122898122899122900122901122902122903122904122905122906122907122908122909122910122911122912122913122914122915122916122917122918122919122920122921122922122923122924122925122926122927122928122929122930122931122932122933122934122935122936122937122938122939122940122941122942122943122944122945122946122947122948122949122950122951122952122953122954122955122956122957122958122959122960122961122962122963122964122965122966122967122968122969122970122971122972122973122974122975122976122977122978122979122980122981122982122983122984122985122986122987122988122989122990122991122992122993122994122995122996122997122998122999123000123001123002123003123004123005123006123007123008123009123010123011123012123013123014123015123016123017123018123019123020123021123022123023123024123025123026123027123028123029123030123031123032123033123034123035123036123037123038123039123040123041123042123043123044123045123046123047123048123049123050123051123052123053123054123055123056123057123058123059123060123061123062123063123064123065123066123067123068123069123070123071123072123073123074123075123076123077123078123079123080123081123082123083123084123085123086123087123088123089123090123091123092123093123094123095123096123097123098123099123100123101123102123103123104123105123106123107123108123109123110123111123112123113123114123115123116123117123118123119123120123121123122123123123124123125123126123127123128123129123130123131123132123133123134123135123136123137123138123139123140123141123142123143123144123145123146123147123148123149123150123151123152123153123154123155123156123157123158123159123160123161123162123163123164123165123166123167123168123169123170123171123172123173123174123175123176123177123178123179123180123181123182123183123184123185123186123187123188123189123190123191123192123193123194123195123196123197123198123199123200123201123202123203123204123205123206123207123208123209123210123211123212123213123214123215123216123217123218123219123220123221123222123223123224123225123226123227123228123229123230123231123232123233123234123235123236123237123238123239123240123241123242123243123244123245123246123247123248123249123250123251123252123253123254123255123256123257123258123259123260123261123262123263123264123265123266123267123268123269123270123271123272123273123274123275123276123277123278123279123280123281123282123283123284123285123286123287123288123289123290123291123292123293123294123295123296123297123298123299123300123301123302123303123304123305123306123307123308123309123310123311123312123313123314123315123316123317123318123319123320123321123322123323123324123325123326123327123328123329123330123331123332123333123334123335123336123337123338123339123340123341123342123343123344123345123346123347123348123349123350123351123352123353123354123355123356123357123358123359123360123361123362123363123364123365123366123367123368123369123370123371123372123373123374123375123376123377123378123379123380123381123382123383123384123385123386123387123388123389123390123391123392123393123394123395123396123397123398123399123400123401123402123403123404123405123406123407123408123409123410123411123412123413123414123415123416123417123418123419123420123421123422123423123424123425123426123427123428123429123430123431123432123433123434123435123436123437123438123439123440123441123442123443123444123445123446123447123448123449123450123451123452123453123454123455123456123457123458123459123460123461123462123463123464123465123466123467123468123469123470123471123472123473123474123475123476123477123478123479123480123481123482123483123484123485123486123487123488123489123490123491123492123493123494123495123496123497123498123499123500123501123502123503123504123505123506123507123508123509123510123511123512123513123514123515123516123517123518123519123520123521123522123523123524123525123526123527123528123529123530123531123532123533123534123535123536123537123538123539123540123541123542123543123544123545123546123547123548123549123550123551123552123553123554123555123556123557123558123559123560123561123562123563123564123565123566123567123568123569123570123571123572123573123574123575123576123577123578123579123580123581123582123583123584123585123586123587123588123589123590123591123592123593123594123595123596123597123598123599123600123601123602123603123604123605123606123607123608123609123610123611123612123613123614123615123616123617123618123619123620123621123622123623123624123625123626123627123628123629123630123631123632123633123634123635123636123637123638123639123640123641123642123643123644123645123646123647123648123649123650123651123652123653123654123655123656123657123658123659123660123661123662123663123664123665123666123667123668123669123670123671123672123673123674123675123676123677123678123679123680123681123682123683123684123685123686123687123688123689123690123691123692123693123694123695123696123697123698123699123700123701123702123703123704123705123706123707123708123709123710123711123712123713123714123715123716123717123718123719123720123721123722123723123724123725123726123727123728123729123730123731123732123733123734123735123736123737123738123739123740123741123742123743123744123745123746123747123748123749123750123751123752123753123754123755123756123757123758123759123760123761123762123763123764123765123766123767123768123769123770123771123772123773123774123775123776123777123778123779123780123781123782123783123784123785123786123787123788123789123790123791123792123793123794123795123796123797123798123799123800123801123802123803123804123805123806123807123808123809123810123811123812123813123814123815123816123817123818123819123820123821123822123823123824123825123826123827123828123829123830123831123832123833123834123835123836123837123838123839123840123841123842123843123844123845123846123847123848123849123850123851123852123853123854123855123856123857123858123859123860123861123862123863123864123865123866123867123868123869123870123871123872123873123874123875123876123877123878123879123880123881123882123883123884123885123886123887123888123889123890123891123892123893123894123895123896123897123898123899123900123901123902123903123904123905123906123907123908123909123910123911123912123913123914123915123916123917123918123919123920123921123922123923123924123925123926123927123928123929123930123931123932123933123934123935123936123937123938123939123940123941123942123943123944123945123946123947123948123949123950123951123952123953123954123955123956123957123958123959123960123961123962123963123964123965123966123967123968123969123970123971123972123973123974123975123976123977123978123979123980123981123982123983123984123985123986123987123988123989123990123991123992123993123994123995123996123997123998123999124000124001124002124003124004124005124006124007124008124009124010124011124012124013124014124015124016124017124018124019124020124021124022124023124024124025124026124027124028124029124030124031124032124033124034124035124036124037124038124039124040124041124042124043124044124045124046124047124048124049124050124051124052124053124054124055124056124057124058124059124060124061124062124063124064124065124066124067124068124069124070124071124072124073124074124075124076124077124078124079124080124081124082124083124084124085124086124087124088124089124090124091124092124093124094124095124096124097124098124099124100124101124102124103124104124105124106124107124108124109124110124111124112124113124114124115124116124117124118124119124120124121124122124123124124124125124126124127124128124129124130124131124132124133124134124135124136124137124138124139124140124141124142124143124144124145124146124147124148124149124150124151124152124153124154124155124156124157124158124159124160124161124162124163124164124165124166124167124168124169124170124171124172124173124174124175124176124177124178124179124180124181124182124183124184124185124186124187124188124189124190124191124192124193124194124195124196124197124198124199124200124201124202124203124204124205124206124207124208124209124210124211124212124213124214124215124216124217124218124219124220124221124222124223124224124225124226124227124228124229124230124231124232124233124234124235124236124237124238124239124240124241124242124243124244124245124246124247124248124249124250124251124252124253124254124255124256124257124258124259124260124261124262124263124264124265124266124267124268124269124270124271124272124273124274124275124276124277124278124279124280124281124282124283124284124285124286124287124288124289124290124291124292124293124294124295124296124297124298124299124300124301124302124303124304124305124306124307124308124309124310124311124312124313124314124315124316124317124318124319124320124321124322124323124324124325124326124327124328124329124330124331124332124333124334124335124336124337124338124339124340124341124342124343124344124345124346124347124348124349124350124351124352124353124354124355124356124357124358124359124360124361124362124363124364124365124366124367124368124369124370124371124372124373124374124375124376124377124378124379124380124381124382124383124384124385124386124387124388124389124390124391124392124393124394124395124396124397124398124399124400124401124402124403124404124405124406124407124408124409124410124411124412124413124414124415124416124417124418124419124420124421124422124423124424124425124426124427124428124429124430124431124432124433124434124435124436124437124438124439124440124441124442124443124444124445124446124447124448124449124450124451124452124453124454124455124456124457124458124459124460124461124462124463124464124465124466124467124468124469124470124471124472124473124474124475124476124477124478124479124480124481124482124483124484124485124486124487124488124489124490124491124492124493124494124495124496124497124498124499124500124501124502124503124504124505124506124507124508124509124510124511124512124513124514124515124516124517124518124519124520124521124522124523124524124525124526124527124528124529124530124531124532124533124534124535124536124537124538124539124540124541124542124543124544124545124546124547124548124549124550124551124552124553124554124555124556124557124558124559124560124561124562124563124564124565124566124567124568124569124570124571124572124573124574124575124576124577124578124579124580124581124582124583124584124585124586124587124588124589124590124591124592124593124594124595124596124597124598124599124600124601124602124603124604124605124606124607124608124609124610124611124612124613124614124615124616124617124618124619124620124621124622124623124624124625124626124627124628124629124630124631124632124633124634124635124636124637124638124639124640124641124642124643124644124645124646124647124648124649124650124651124652124653124654124655124656124657124658124659124660124661124662124663124664124665124666124667124668124669124670124671124672124673124674124675124676124677124678124679124680124681124682124683124684124685124686124687124688124689124690124691124692124693124694124695124696124697124698124699124700124701124702124703124704124705124706124707124708124709124710124711124712124713124714124715124716124717124718124719124720124721124722124723124724124725124726124727124728124729124730124731124732124733124734124735124736124737124738124739124740124741124742124743124744124745124746124747124748124749124750124751124752124753124754124755124756124757124758124759124760124761124762124763124764124765124766124767124768124769124770124771124772124773124774124775124776124777124778124779124780124781124782124783124784124785124786124787124788124789124790124791124792124793124794124795124796124797124798124799124800124801124802124803124804124805124806124807124808124809124810124811124812124813124814124815124816124817124818124819124820124821124822124823124824124825124826124827124828124829124830124831124832124833124834124835124836124837124838124839124840124841124842124843124844124845124846124847124848124849124850124851124852124853124854124855124856124857124858124859124860124861124862124863124864124865124866124867124868124869124870124871124872124873124874124875124876124877124878124879124880124881124882124883124884124885124886124887124888124889124890124891124892124893124894124895124896124897124898124899124900124901124902124903124904124905124906124907124908124909124910124911124912124913124914124915124916124917124918124919124920124921124922124923124924124925124926124927124928124929124930124931124932124933124934124935124936124937124938124939124940124941124942124943124944124945124946124947124948124949124950124951124952124953124954124955124956124957124958124959124960124961124962124963124964124965124966124967124968124969124970124971124972124973124974124975124976124977124978124979124980124981124982124983124984124985124986124987124988124989124990124991124992124993124994124995124996124997124998124999125000125001125002125003125004125005125006125007125008125009125010125011125012125013125014125015125016125017125018125019125020125021125022125023125024125025125026125027125028125029125030125031125032125033125034125035125036125037125038125039125040125041125042125043125044125045125046125047125048125049125050125051125052125053125054125055125056125057125058125059125060125061125062125063125064125065125066125067125068125069125070125071125072125073125074125075125076125077125078125079125080125081125082125083125084125085125086125087125088125089125090125091125092125093125094125095125096125097125098125099125100125101125102125103125104125105125106125107125108125109125110125111125112125113125114125115125116125117125118125119125120125121125122125123125124125125125126125127125128125129125130125131125132125133125134125135125136125137125138125139125140125141125142125143125144125145125146125147125148125149125150125151125152125153125154125155125156125157125158125159125160125161125162125163125164125165125166125167125168125169125170125171125172125173125174125175125176125177125178125179125180125181125182125183125184125185125186125187125188125189125190125191125192125193125194125195125196125197125198125199125200125201125202125203125204125205125206125207125208125209125210125211125212125213125214125215125216125217125218125219125220125221125222125223125224125225125226125227125228125229125230125231125232125233125234125235125236125237125238125239125240125241125242125243125244125245125246125247125248125249125250125251125252125253125254125255125256125257125258125259125260125261125262125263125264125265125266125267125268125269125270125271125272125273125274125275125276125277125278125279125280125281125282125283125284125285125286125287125288125289125290125291125292125293125294125295125296125297125298125299125300125301125302125303125304125305125306125307125308125309125310125311125312125313125314125315125316125317125318125319125320125321125322125323125324125325125326125327125328125329125330125331125332125333125334125335125336125337125338125339125340125341125342125343125344125345125346125347125348125349125350125351125352125353125354125355125356125357125358125359125360125361125362125363125364125365125366125367125368125369125370125371125372125373125374125375125376125377125378125379125380125381125382125383125384125385125386125387125388125389125390125391125392125393125394125395125396125397125398125399125400125401125402125403125404125405125406125407125408125409125410125411125412125413125414125415125416125417125418125419125420125421125422125423125424125425125426125427125428125429125430125431125432125433125434125435125436125437125438125439125440125441125442125443125444125445125446125447125448125449125450125451125452125453125454125455125456125457125458125459125460125461125462125463125464125465125466125467125468125469125470125471125472125473125474125475125476125477125478125479125480125481125482125483125484125485125486125487125488125489125490125491125492125493125494125495125496125497125498125499125500125501125502125503125504125505125506125507125508125509125510125511125512125513125514125515125516125517125518125519125520125521125522125523125524125525125526125527125528125529125530125531125532125533125534125535125536125537125538125539125540125541125542125543125544125545125546125547125548125549125550125551125552125553125554125555125556125557125558125559125560125561125562125563125564125565125566125567125568125569125570125571125572125573125574125575125576125577125578125579125580125581125582125583125584125585125586125587125588125589125590125591125592125593125594125595125596125597125598125599125600125601125602125603125604125605125606125607125608125609125610125611125612125613125614125615125616125617125618125619125620125621125622125623125624125625125626125627125628125629125630125631125632125633125634125635125636125637125638125639125640125641125642125643125644125645125646125647125648125649125650125651125652125653125654125655125656125657125658125659125660125661125662125663125664125665125666125667125668125669125670125671125672125673125674125675125676125677125678125679125680125681125682125683125684125685125686125687125688125689125690125691125692125693125694125695125696125697125698125699125700125701125702125703125704125705125706125707125708125709125710125711125712125713125714125715125716125717125718125719125720125721125722125723125724125725125726125727125728125729125730125731125732125733125734125735125736125737125738125739125740125741125742125743125744125745125746125747125748125749125750125751125752125753125754125755125756125757125758125759125760125761125762125763125764125765125766125767125768125769125770125771125772125773125774125775125776125777125778125779125780125781125782125783125784125785125786125787125788125789125790125791125792125793125794125795125796125797125798125799125800125801125802125803125804125805125806125807125808125809125810125811125812125813125814125815125816125817125818125819125820125821125822125823125824125825125826125827125828125829125830125831125832125833125834125835125836125837125838125839125840125841125842125843125844125845125846125847125848125849125850125851125852125853125854125855125856125857125858125859125860125861125862125863125864125865125866125867125868125869125870125871125872125873125874125875125876125877125878125879125880125881125882125883125884125885125886125887125888125889125890125891125892125893125894125895125896125897125898125899125900125901125902125903125904125905125906125907125908125909125910125911125912125913125914125915125916125917125918125919125920125921125922125923125924125925125926125927125928125929125930125931125932125933125934125935125936125937125938125939125940125941125942125943125944125945125946125947125948125949125950125951125952125953125954125955125956125957125958125959125960125961125962125963125964125965125966125967125968125969125970125971125972125973125974125975125976125977125978125979125980125981125982125983125984125985125986125987125988125989125990125991125992125993125994125995125996125997125998125999126000126001126002126003126004126005126006126007126008126009126010126011126012126013126014126015126016126017126018126019126020126021126022126023126024126025126026126027126028126029126030126031126032126033126034126035126036126037126038126039126040126041126042126043126044126045126046126047126048126049126050126051126052126053126054126055126056126057126058126059126060126061126062126063126064126065126066126067126068126069126070126071126072126073126074126075126076126077126078126079126080126081126082126083126084126085126086126087126088126089126090126091126092126093126094126095126096126097126098126099126100126101126102126103126104126105126106126107126108126109126110126111126112126113126114126115126116126117126118126119126120126121126122126123126124126125126126126127126128126129126130126131126132126133126134126135126136126137126138126139126140126141126142126143126144126145126146126147126148126149126150126151126152126153126154126155126156126157126158126159126160126161126162126163126164126165126166126167126168126169126170126171126172126173126174126175126176126177126178126179126180126181126182126183126184126185126186126187126188126189126190126191126192126193126194126195126196126197126198126199126200126201126202126203126204126205126206126207126208126209126210126211126212126213126214126215126216126217126218126219126220126221126222126223126224126225126226126227126228126229126230126231126232126233126234126235126236126237126238126239126240126241126242126243126244126245126246126247126248126249126250126251126252126253126254126255126256126257126258126259126260126261126262126263126264126265126266126267126268126269126270126271126272126273126274126275126276126277126278126279126280126281126282126283126284126285126286126287126288126289126290126291126292126293126294126295126296126297126298126299126300126301126302126303126304126305126306126307126308126309126310126311126312126313126314126315126316126317126318126319126320126321126322126323126324126325126326126327126328126329126330126331126332126333126334126335126336126337126338126339126340126341126342126343126344126345126346126347126348126349126350126351126352126353126354126355126356126357126358126359126360126361126362126363126364126365126366126367126368126369126370126371126372126373126374126375126376126377126378126379126380126381126382126383126384126385126386126387126388126389126390126391126392126393126394126395126396126397126398126399126400126401126402126403126404126405126406126407126408126409126410126411126412126413126414126415126416126417126418126419126420126421126422126423126424126425126426126427126428126429126430126431126432126433126434126435126436126437126438126439126440126441126442126443126444126445126446126447126448126449126450126451126452126453126454126455126456126457126458126459126460126461126462126463126464126465126466126467126468126469126470126471126472126473126474126475126476126477126478126479126480126481126482126483126484126485126486126487126488126489126490126491126492126493126494126495126496126497126498126499126500126501126502126503126504126505126506126507126508126509126510126511126512126513126514126515126516126517126518126519126520126521126522126523126524126525126526126527126528126529126530126531126532126533126534126535126536126537126538126539126540126541126542126543126544126545126546126547126548126549126550126551126552126553126554126555126556126557126558126559126560126561126562126563126564126565126566126567126568126569126570126571126572126573126574126575126576126577126578126579126580126581126582126583126584126585126586126587126588126589126590126591126592126593126594126595126596126597126598126599126600126601126602126603126604126605126606126607126608126609126610126611126612126613126614126615126616126617126618126619126620126621126622126623126624126625126626126627126628126629126630126631126632126633126634126635126636126637126638126639126640126641126642126643126644126645126646126647126648126649126650126651126652126653126654126655126656126657126658126659126660126661126662126663126664126665126666126667126668126669126670126671126672126673126674126675126676126677126678126679126680126681126682126683126684126685126686126687126688126689126690126691126692126693126694126695126696126697126698126699126700126701126702126703126704126705126706126707126708126709126710126711126712126713126714126715126716126717126718126719126720126721126722126723126724126725126726126727126728126729126730126731126732126733126734126735126736126737126738126739126740126741126742126743126744126745126746126747126748126749126750126751126752126753126754126755126756126757126758126759126760126761126762126763126764126765126766126767126768126769126770126771126772126773126774126775126776126777126778126779126780126781126782126783126784126785126786126787126788126789126790126791126792126793126794126795126796126797126798126799126800126801126802126803126804126805126806126807126808126809126810126811126812126813126814126815126816126817126818126819126820126821126822126823126824126825126826126827126828126829126830126831126832126833126834126835126836126837126838126839126840126841126842126843126844126845126846126847126848126849126850126851126852126853126854126855126856126857126858126859126860126861126862126863126864126865126866126867126868126869126870126871126872126873126874126875126876126877126878126879126880126881126882126883126884126885126886126887126888126889126890126891126892126893126894126895126896126897126898126899126900126901126902126903126904126905126906126907126908126909126910126911126912126913126914126915126916126917126918126919126920126921126922126923126924126925126926126927126928126929126930126931126932126933126934126935126936126937126938126939126940126941126942126943126944126945126946126947126948126949126950126951126952126953126954126955126956126957126958126959126960126961126962126963126964126965126966126967126968126969126970126971126972126973126974126975126976126977126978126979126980126981126982126983126984126985126986126987126988126989126990126991126992126993126994126995126996126997126998126999127000127001127002127003127004127005127006127007127008127009127010127011127012127013127014127015127016127017127018127019127020127021127022127023127024127025127026127027127028127029127030127031127032127033127034127035127036127037127038127039127040127041127042127043127044127045127046127047127048127049127050127051127052127053127054127055127056127057127058127059127060127061127062127063127064127065127066127067127068127069127070127071127072127073127074127075127076127077127078127079127080127081127082127083127084127085127086127087127088127089127090127091127092127093127094127095127096127097127098127099127100127101127102127103127104127105127106127107127108127109127110127111127112127113127114127115127116127117127118127119127120127121127122127123127124127125127126127127127128127129127130127131127132127133127134127135127136127137127138127139127140127141127142127143127144127145127146127147127148127149127150127151127152127153127154127155127156127157127158127159127160127161127162127163127164127165127166127167127168127169127170127171127172127173127174127175127176127177127178127179127180127181127182127183127184127185127186127187127188127189127190127191127192127193127194127195127196127197127198127199127200127201127202127203127204127205127206127207127208127209127210127211127212127213127214127215127216127217127218127219127220127221127222127223127224127225127226127227127228127229127230127231127232127233127234127235127236127237127238127239127240127241127242127243127244127245127246127247127248127249127250127251127252127253127254127255127256127257127258127259127260127261127262127263127264127265127266127267127268127269127270127271127272127273127274127275127276127277127278127279127280127281127282127283127284127285127286127287127288127289127290127291127292127293127294127295127296127297127298127299127300127301127302127303127304127305127306127307127308127309127310127311127312127313127314127315127316127317127318127319127320127321127322127323127324127325127326127327127328127329127330127331127332127333127334127335127336127337127338127339127340127341127342127343127344127345127346127347127348127349127350127351127352127353127354127355127356127357127358127359127360127361127362127363127364127365127366127367127368127369127370127371127372127373127374127375127376127377127378127379127380127381127382127383127384127385127386127387127388127389127390127391127392127393127394127395127396127397127398127399127400127401127402127403127404127405127406127407127408127409127410127411127412127413127414127415127416127417127418127419127420127421127422127423127424127425127426127427127428127429127430127431127432127433127434127435127436127437127438127439127440127441127442127443127444127445127446127447127448127449127450127451127452127453127454127455127456127457127458127459127460127461127462127463127464127465127466127467127468127469127470127471127472127473127474127475127476127477127478127479127480127481127482127483127484127485127486127487127488127489127490127491127492127493127494127495127496127497127498127499127500127501127502127503127504127505127506127507127508127509127510127511127512127513127514127515127516127517127518127519127520127521127522127523127524127525127526127527127528127529127530127531127532127533127534127535127536127537127538127539127540127541127542127543127544127545127546127547127548127549127550127551127552127553127554127555127556127557127558127559127560127561127562127563127564127565127566127567127568127569127570127571127572127573127574127575127576127577127578127579127580127581127582127583127584127585127586127587127588127589127590127591127592127593127594127595127596127597127598127599127600127601127602127603127604127605127606127607127608127609127610127611127612127613127614127615127616127617127618127619127620127621127622127623127624127625127626127627127628127629127630127631127632127633127634127635127636127637127638127639127640127641127642127643127644127645127646127647127648127649127650127651127652127653127654127655127656127657127658127659127660127661127662127663127664127665127666127667127668127669127670127671127672127673127674127675127676127677127678127679127680127681127682127683127684127685127686127687127688127689127690127691127692127693127694127695127696127697127698127699127700127701127702127703127704127705127706127707127708127709127710127711127712127713127714127715127716127717127718127719127720127721127722127723127724127725127726127727127728127729127730127731127732127733127734127735127736127737127738127739127740127741127742127743127744127745127746127747127748127749127750127751127752127753127754127755127756127757127758127759127760127761127762127763127764127765127766127767127768127769127770127771127772127773127774127775127776127777127778127779127780127781127782127783127784127785127786127787127788127789127790127791127792127793127794127795127796127797127798127799127800127801127802127803127804127805127806127807127808127809127810127811127812127813127814127815127816127817127818127819127820127821127822127823127824127825127826127827127828127829127830127831127832127833127834127835127836127837127838127839127840127841127842127843127844127845127846127847127848127849127850127851127852127853127854127855127856127857127858127859127860127861127862127863127864127865127866127867127868127869127870127871127872127873127874127875127876127877127878127879127880127881127882127883127884127885127886127887127888127889127890127891127892127893127894127895127896127897127898127899127900127901127902127903127904127905127906127907127908127909127910127911127912127913127914127915127916127917127918127919127920127921127922127923127924127925127926127927127928127929127930127931127932127933127934127935127936127937127938127939127940127941127942127943127944127945127946127947127948127949127950127951127952127953127954127955127956127957127958127959127960127961127962127963127964127965127966127967127968127969127970127971127972127973127974127975127976127977127978127979127980127981127982127983127984127985127986127987127988127989127990127991127992127993127994127995127996127997127998127999128000128001128002128003128004128005128006128007128008128009128010128011128012128013128014128015128016128017128018128019128020128021128022128023128024128025128026128027128028128029128030128031128032128033128034128035128036128037128038128039128040128041128042128043128044128045128046128047128048128049128050128051128052128053128054128055128056128057128058128059128060128061128062128063128064128065128066128067128068128069128070128071128072128073128074128075128076128077128078128079128080128081128082128083128084128085128086128087128088128089128090128091128092128093128094128095128096128097128098128099128100128101128102128103128104128105128106128107128108128109128110128111128112128113128114128115128116128117128118128119128120128121128122128123128124128125128126128127128128128129128130128131128132128133128134128135128136128137128138128139128140128141128142128143128144128145128146128147128148128149128150128151128152128153128154128155128156128157128158128159128160128161128162128163128164128165128166128167128168128169128170128171128172128173128174128175128176128177128178128179128180128181128182128183128184128185128186128187128188128189128190128191128192128193128194128195128196128197128198128199128200128201128202128203128204128205128206128207128208128209128210128211128212128213128214128215128216128217128218128219128220128221128222128223128224128225128226128227128228128229128230128231128232128233128234128235128236128237128238128239128240128241128242128243128244128245128246128247128248128249128250128251128252128253128254128255128256128257128258128259128260128261128262128263128264128265128266128267128268128269128270128271128272128273128274128275128276128277128278128279128280128281128282128283128284128285128286128287128288128289128290128291128292128293128294128295128296128297128298128299128300128301128302128303128304128305128306128307128308128309128310128311128312128313128314128315128316128317128318128319128320128321128322128323128324128325128326128327128328128329128330128331128332128333128334128335128336128337128338128339128340128341128342128343128344128345128346128347128348128349128350128351128352128353128354128355128356128357128358128359128360128361128362128363128364128365128366128367128368128369128370128371128372128373128374128375128376128377128378128379128380128381128382128383128384128385128386128387128388128389128390128391128392128393128394128395128396128397128398128399128400128401128402128403128404128405128406128407128408128409128410128411128412128413128414128415128416128417128418128419128420128421128422128423128424128425128426128427128428128429128430128431128432128433128434128435128436128437128438128439128440128441128442128443128444128445128446128447128448128449128450128451128452128453128454128455128456128457128458128459128460128461128462128463128464128465128466128467128468128469128470128471128472128473128474128475128476128477128478128479128480128481128482128483128484128485128486128487128488128489128490128491128492128493128494128495128496128497128498128499128500128501128502128503128504128505128506128507128508128509128510128511128512128513128514128515128516128517128518128519128520128521128522128523128524128525128526128527128528128529128530128531128532128533128534128535128536128537128538128539128540128541128542128543128544128545128546128547128548128549128550128551128552128553128554128555128556128557128558128559128560128561128562128563128564128565128566128567128568128569128570128571128572128573128574128575128576128577128578128579128580128581128582128583128584128585128586128587128588128589128590128591128592128593128594128595128596128597128598128599128600128601128602128603128604128605128606128607128608128609128610128611128612128613128614128615128616128617128618128619128620128621128622128623128624128625128626128627128628128629128630128631128632128633128634128635128636128637128638128639128640128641128642128643128644128645128646128647128648128649128650128651128652128653128654128655128656128657128658128659128660128661128662128663128664128665128666128667128668128669128670128671128672128673128674128675128676128677128678128679128680128681128682128683128684128685128686128687128688128689128690128691128692128693128694128695128696128697128698128699128700128701128702128703128704128705128706128707128708128709128710128711128712128713128714128715128716128717128718128719128720128721128722128723128724128725128726128727128728128729128730128731128732128733128734128735128736128737128738128739128740128741128742128743128744128745128746128747128748128749128750128751128752128753128754128755128756128757128758128759128760128761128762128763128764128765128766128767128768128769128770128771128772128773128774128775128776128777128778128779128780128781128782128783128784128785128786128787128788128789128790128791128792128793128794128795128796128797128798128799128800128801128802128803128804128805128806128807128808128809128810128811128812128813128814128815128816128817128818128819128820128821128822128823128824128825128826128827128828128829128830128831128832128833128834128835128836128837128838128839128840128841128842128843128844128845128846128847128848128849128850128851128852128853128854128855128856128857128858128859128860128861128862128863128864128865128866128867128868128869128870128871128872128873128874128875128876128877128878128879128880128881128882128883128884128885128886128887128888128889128890128891128892128893128894128895128896128897128898128899128900128901128902128903128904128905128906128907128908128909128910128911128912128913128914128915128916128917128918128919128920128921128922128923128924128925128926128927128928128929128930128931128932128933128934128935128936128937128938128939128940128941128942128943128944128945128946128947128948128949128950128951128952128953128954128955128956128957128958128959128960128961128962128963128964128965128966128967128968128969128970128971128972128973128974128975128976128977128978128979128980128981128982128983128984128985128986128987128988128989128990128991128992128993128994128995128996128997128998128999129000129001129002129003129004129005129006129007129008129009129010129011129012129013129014129015129016129017129018129019129020129021129022129023129024129025129026129027129028129029129030129031129032129033129034129035129036129037129038129039129040129041129042129043129044129045129046129047129048129049129050129051129052129053129054129055129056129057129058129059129060129061129062129063129064129065129066129067129068129069129070129071129072129073129074129075129076129077129078129079129080129081129082129083129084129085129086129087129088129089129090129091129092129093129094129095129096129097129098129099129100129101129102129103129104129105129106129107129108129109129110129111129112129113129114129115129116129117129118129119129120129121129122129123129124129125129126129127129128129129129130129131129132129133129134129135129136129137129138129139129140129141129142129143129144129145129146129147129148129149129150129151129152129153129154129155129156129157129158129159129160129161129162129163129164129165129166129167129168129169129170129171129172129173129174129175129176129177129178129179129180129181129182129183129184129185129186129187129188129189129190129191129192129193129194129195129196129197129198129199129200129201129202129203129204129205129206129207129208129209129210129211129212129213129214129215129216129217129218129219129220129221129222129223129224129225129226129227129228129229129230129231129232129233129234129235129236129237129238129239129240129241129242129243129244129245129246129247129248129249129250129251129252129253129254129255129256129257129258129259129260129261129262129263129264129265129266129267129268129269129270129271129272129273129274129275129276129277129278129279129280129281129282129283129284129285129286129287129288129289129290129291129292129293129294129295129296129297129298129299129300129301129302129303129304129305129306129307129308129309129310129311129312129313129314129315129316129317129318129319129320129321129322129323129324129325129326129327129328129329129330129331129332129333129334129335129336129337129338129339129340129341129342129343129344129345129346129347129348129349129350129351129352129353129354129355129356129357129358129359129360129361129362129363129364129365129366129367129368129369129370129371129372129373129374129375129376129377129378129379129380129381129382129383129384129385129386129387129388129389129390129391129392129393129394129395129396129397129398129399129400129401129402129403129404129405129406129407129408129409129410129411129412129413129414129415129416129417129418129419129420129421129422129423129424129425129426129427129428129429129430129431129432129433129434129435129436129437129438129439129440129441129442129443129444129445129446129447129448129449129450129451129452129453129454129455129456129457129458129459129460129461129462129463129464129465129466129467129468129469129470129471129472129473129474129475129476129477129478129479129480129481129482129483129484129485129486129487129488129489129490129491129492129493129494129495129496129497129498129499129500129501129502129503129504129505129506129507129508129509129510129511129512129513129514129515129516129517129518129519129520129521129522129523129524129525129526129527129528129529129530129531129532129533129534129535129536129537129538129539129540129541129542129543129544129545129546129547129548129549129550129551129552129553129554129555129556129557129558129559129560129561129562129563129564129565129566129567129568129569129570129571129572129573129574129575129576129577129578129579129580129581129582129583129584129585129586129587129588129589129590129591129592129593129594129595129596129597129598129599129600129601129602129603129604129605129606129607129608129609129610129611129612129613129614129615129616129617129618129619129620129621129622129623129624129625129626129627129628129629129630129631129632129633129634129635129636129637129638129639129640129641129642129643129644129645129646129647129648129649129650129651129652129653129654129655129656129657129658129659129660129661129662129663129664129665129666129667129668129669129670129671129672129673129674129675129676129677129678129679129680129681129682129683129684129685129686129687129688129689129690129691129692129693129694129695129696129697129698129699129700129701129702129703129704129705129706129707129708129709129710129711129712129713129714129715129716129717129718129719129720129721129722129723129724129725129726129727129728129729129730129731129732129733129734129735129736129737129738129739129740129741129742129743129744129745129746129747129748129749129750129751129752129753129754129755129756129757129758129759129760129761129762129763129764129765129766129767129768129769129770129771129772129773129774129775129776129777129778129779129780129781129782129783129784129785129786129787129788129789129790129791129792129793129794129795129796129797129798129799129800129801129802129803129804129805129806129807129808129809129810129811129812129813129814129815129816129817129818129819129820129821129822129823129824129825129826129827129828129829129830129831129832129833129834129835129836129837129838129839129840129841129842129843129844129845129846129847129848129849129850129851129852129853129854129855129856129857129858129859129860129861129862129863129864129865129866129867129868129869129870129871129872129873129874129875129876129877129878129879129880129881129882129883129884129885129886129887129888129889129890129891129892129893129894129895129896129897129898129899129900129901129902129903129904129905129906129907129908129909129910129911129912129913129914129915129916129917129918129919129920129921129922129923129924129925129926129927129928129929129930129931129932129933129934129935129936129937129938129939129940129941129942129943129944129945129946129947129948129949129950129951129952129953129954129955129956129957129958129959129960129961129962129963129964129965129966129967129968129969129970129971129972129973129974129975129976129977129978129979129980129981129982129983129984129985129986129987129988129989129990129991129992129993129994129995129996129997129998129999130000130001130002130003130004130005130006130007130008130009130010130011130012130013130014130015130016130017130018130019130020130021130022130023130024130025130026130027130028130029130030130031130032130033130034130035130036130037130038130039130040130041130042130043130044130045130046130047130048130049130050130051130052130053130054130055130056130057130058130059130060130061130062130063130064130065130066130067130068130069130070130071130072130073130074130075130076130077130078130079130080130081130082130083130084130085130086130087130088130089130090130091130092130093130094130095130096130097130098130099130100130101130102130103130104130105130106130107130108130109130110130111130112130113130114130115130116130117130118130119130120130121130122130123130124130125130126130127130128130129130130130131130132130133130134130135130136130137130138130139130140130141130142130143130144130145130146130147130148130149130150130151130152130153130154130155130156130157130158130159130160130161130162130163130164130165130166130167130168130169130170130171130172130173130174130175130176130177130178130179130180130181130182130183130184130185130186130187130188130189130190130191130192130193130194130195130196130197130198130199130200130201130202130203130204130205130206130207130208130209130210130211130212130213130214130215130216130217130218130219130220130221130222130223130224130225130226130227130228130229130230130231130232130233130234130235130236130237130238130239130240130241130242130243130244130245130246130247130248130249130250130251130252130253130254130255130256130257130258130259130260130261130262130263130264130265130266130267130268130269130270130271130272130273130274130275130276130277130278130279130280130281130282130283130284130285130286130287130288130289130290130291130292130293130294130295130296130297130298130299130300130301130302130303130304130305130306130307130308130309130310130311130312130313130314130315130316130317130318130319130320130321130322130323130324130325130326130327130328130329130330130331130332130333130334130335130336130337130338130339130340130341130342130343130344130345130346130347130348130349130350130351130352130353130354130355130356130357130358130359130360130361130362130363130364130365130366130367130368130369130370130371130372130373130374130375130376130377130378130379130380130381130382130383130384130385130386130387130388130389130390130391130392130393130394130395130396130397130398130399130400130401130402130403130404130405130406130407130408130409130410130411130412130413130414130415130416130417130418130419130420130421130422130423130424130425130426130427130428130429130430130431130432130433130434130435130436130437130438130439130440130441130442130443130444130445130446130447130448130449130450130451130452130453130454130455130456130457130458130459130460130461130462130463130464130465130466130467130468130469130470130471130472130473130474130475130476130477130478130479130480130481130482130483130484130485130486130487130488130489130490130491130492130493130494130495130496130497130498130499130500130501130502130503130504130505130506130507130508130509130510130511130512130513130514130515130516130517130518130519130520130521130522130523130524130525130526130527130528130529130530130531130532130533130534130535130536130537130538130539130540130541130542130543130544130545130546130547130548130549130550130551130552130553130554130555130556130557130558130559130560130561130562130563130564130565130566130567130568130569130570130571130572130573130574130575130576130577130578130579130580130581130582130583130584130585130586130587130588130589130590130591130592130593130594130595130596130597130598130599130600130601130602130603130604130605130606130607130608130609130610130611130612130613130614130615130616130617130618130619130620130621130622130623130624130625130626130627130628130629130630130631130632130633130634130635130636130637130638130639130640130641130642130643130644130645130646130647130648130649130650130651130652130653130654130655130656130657130658130659130660130661130662130663130664130665130666130667130668130669130670130671130672130673130674130675130676130677130678130679130680130681130682130683130684130685130686130687130688130689130690130691130692130693130694130695130696130697130698130699130700130701130702130703130704130705130706130707130708130709130710130711130712130713130714130715130716130717130718130719130720130721130722130723130724130725130726130727130728130729130730130731130732130733130734130735130736130737130738130739130740130741130742130743130744130745130746130747130748130749130750130751130752130753130754130755130756130757130758130759130760130761130762130763130764130765130766130767130768130769130770130771130772130773130774130775130776130777130778130779130780130781130782130783130784130785130786130787130788130789130790130791130792130793130794130795130796130797130798130799130800130801130802130803130804130805130806130807130808130809130810130811130812130813130814130815130816130817130818130819130820130821130822130823130824130825130826130827130828130829130830130831130832130833130834130835130836130837130838130839130840130841130842130843130844130845130846130847130848130849130850130851130852130853130854130855130856130857130858130859130860130861130862130863130864130865130866130867130868130869130870130871130872130873130874130875130876130877130878130879130880130881130882130883130884130885130886130887130888130889130890130891130892130893130894130895130896130897130898130899130900130901130902130903130904130905130906130907130908130909130910130911130912130913130914130915130916130917130918130919130920130921130922130923130924130925130926130927130928130929130930130931130932130933130934130935130936130937130938130939130940130941130942130943130944130945130946130947130948130949130950130951130952130953130954130955130956130957130958130959130960130961130962130963130964130965130966130967130968130969130970130971130972130973130974130975130976130977130978130979130980130981130982130983130984130985130986130987130988130989130990130991130992130993130994130995130996130997130998130999131000131001131002131003131004131005131006131007131008131009131010131011131012131013131014131015131016131017131018131019131020131021131022131023131024131025131026131027131028131029131030131031131032131033131034131035131036131037131038131039131040131041131042131043131044131045131046131047131048131049131050131051131052131053131054131055131056131057131058131059131060131061131062131063131064131065131066131067131068131069131070131071131072131073131074131075131076131077131078131079131080131081131082131083131084131085131086131087131088131089131090131091131092131093131094131095131096131097131098131099131100131101131102131103131104131105131106131107131108131109131110131111131112131113131114131115131116131117131118131119131120131121131122131123131124131125131126131127131128131129131130131131131132131133131134131135131136131137131138131139131140131141131142131143131144131145131146131147131148131149131150131151131152131153131154131155131156131157131158131159131160131161131162131163131164131165131166131167131168131169131170131171131172131173131174131175131176131177131178131179131180131181131182131183131184131185131186131187131188131189131190131191131192131193131194131195131196131197131198131199131200131201131202131203131204131205131206131207131208131209131210131211131212131213131214131215131216131217131218131219131220131221131222131223131224131225131226131227131228131229131230131231131232131233131234131235131236131237131238131239131240131241131242131243131244131245131246131247131248131249131250131251131252131253131254131255131256131257131258131259131260131261131262131263131264131265131266131267131268131269131270131271131272131273131274131275131276131277131278131279131280131281131282131283131284131285131286131287131288131289131290131291131292131293131294131295131296131297131298131299131300131301131302131303131304131305131306131307131308131309131310131311131312131313131314131315131316131317131318131319131320131321131322131323131324131325131326131327131328131329131330131331131332131333131334131335131336131337131338131339131340131341131342131343131344131345131346131347131348131349131350131351131352131353131354131355131356131357131358131359131360131361131362131363131364131365131366131367131368131369131370131371131372131373131374131375131376131377131378131379131380131381131382131383131384131385131386131387131388131389131390131391131392131393131394131395131396131397131398131399131400131401131402131403131404131405131406131407131408131409131410131411131412131413131414131415131416131417131418131419131420131421131422131423131424131425131426131427131428131429131430131431131432131433131434131435131436131437131438131439131440131441131442131443131444131445131446131447131448131449131450131451131452131453131454131455131456131457131458131459131460131461131462131463131464131465131466131467131468131469131470131471131472131473131474131475131476131477131478131479131480131481131482131483131484131485131486131487131488131489131490131491131492131493131494131495131496131497131498131499131500131501131502131503131504131505131506131507131508131509131510131511131512131513131514131515131516131517131518131519131520131521131522131523131524131525131526131527131528131529131530131531131532131533131534131535131536131537131538131539131540131541131542131543131544131545131546131547131548131549131550131551131552131553131554131555131556131557131558131559131560131561131562131563131564131565131566131567131568131569131570131571131572131573131574131575131576131577131578131579131580131581131582131583131584131585131586131587131588131589131590131591131592131593131594131595131596131597131598131599131600131601131602131603131604131605131606131607131608131609131610131611131612131613131614131615131616131617131618131619131620131621131622131623131624131625131626131627131628131629131630131631131632131633131634131635131636131637131638131639131640131641131642131643131644131645131646131647131648131649131650131651131652131653131654131655131656131657131658131659131660131661131662131663131664131665131666131667131668131669131670131671131672131673131674131675131676131677131678131679131680131681131682131683131684131685131686131687131688131689131690131691131692131693131694131695131696131697131698131699131700131701131702131703131704131705131706131707131708131709131710131711131712131713131714131715131716131717131718131719131720131721131722131723131724131725131726131727131728131729131730131731131732131733131734131735131736131737131738131739131740131741131742131743131744131745131746131747131748131749131750131751131752131753131754131755131756131757131758131759131760131761131762131763131764131765131766131767131768131769131770131771131772131773131774131775131776131777131778131779131780131781131782131783131784131785131786131787131788131789131790131791131792131793131794131795131796131797131798131799131800131801131802131803131804131805131806131807131808131809131810131811131812131813131814131815131816131817131818131819131820131821131822131823131824131825131826131827131828131829131830131831131832131833131834131835131836131837131838131839131840131841131842131843131844131845131846131847131848131849131850131851131852131853131854131855131856131857131858131859131860131861131862131863131864131865131866131867131868131869131870131871131872131873131874131875131876131877131878131879131880131881131882131883131884131885131886131887131888131889131890131891131892131893131894131895131896131897131898131899131900131901131902131903131904131905131906131907131908131909131910131911131912131913131914131915131916131917131918131919131920131921131922131923131924131925131926131927131928131929131930131931131932131933131934131935131936131937131938131939131940131941131942131943131944131945131946131947131948131949131950131951131952131953131954131955131956131957131958131959131960131961131962131963131964131965131966131967131968131969131970131971131972131973131974131975131976131977131978131979131980131981131982131983131984131985131986131987131988131989131990131991131992131993131994131995131996131997131998131999132000132001132002132003132004132005132006132007132008132009132010132011132012132013132014132015132016132017132018132019132020132021132022132023132024132025132026132027132028132029132030132031132032132033132034132035132036132037132038132039132040132041132042132043132044132045132046132047132048132049132050132051132052132053132054132055132056132057132058132059132060132061132062132063132064132065132066132067132068132069132070132071132072132073132074132075132076132077132078132079132080132081132082132083132084132085132086132087132088132089132090132091132092132093132094132095132096132097132098132099132100132101132102132103132104132105132106132107132108132109132110132111132112132113132114132115132116132117132118132119132120132121132122132123132124132125132126132127132128132129132130132131132132132133132134132135132136132137132138132139132140132141132142132143132144132145132146132147132148132149132150132151132152132153132154132155132156132157132158132159132160132161132162132163132164132165132166132167132168132169132170132171132172132173132174132175132176132177132178132179132180132181132182132183132184132185132186132187132188132189132190132191132192132193132194132195132196132197132198132199132200132201132202132203132204132205132206132207132208132209132210132211132212132213132214132215132216132217132218132219132220132221132222132223132224132225132226132227132228132229132230132231132232132233132234132235132236132237132238132239132240132241132242132243132244132245132246132247132248132249132250132251132252132253132254132255132256132257132258132259132260132261132262132263132264132265132266132267132268132269132270132271132272132273132274132275132276132277132278132279132280132281132282132283132284132285132286132287132288132289132290132291132292132293132294132295132296132297132298132299132300132301132302132303132304132305132306132307132308132309132310132311132312132313132314132315132316132317132318132319132320132321132322132323132324132325132326132327132328132329132330132331132332132333132334132335132336132337132338132339132340132341132342132343132344132345132346132347132348132349132350132351132352132353132354132355132356132357132358132359132360132361132362132363132364132365132366132367132368132369132370132371132372132373132374132375132376132377132378132379132380132381132382132383132384132385132386132387132388132389132390132391132392132393132394132395132396132397132398132399132400132401132402132403132404132405132406132407132408132409132410132411132412132413132414132415132416132417132418132419132420132421132422132423132424132425132426132427132428132429132430132431132432132433132434132435132436132437132438132439132440132441132442132443132444132445132446132447132448132449132450132451132452132453132454132455132456132457132458132459132460132461132462132463132464132465132466132467132468132469132470132471132472132473132474132475132476132477132478132479132480132481132482132483132484132485132486132487132488132489132490132491132492132493132494132495132496132497132498132499132500132501132502132503132504132505132506132507132508132509132510132511132512132513132514132515132516132517132518132519132520132521132522132523132524132525132526132527132528132529132530132531132532132533132534132535132536132537132538132539132540132541132542132543132544132545132546132547132548132549132550132551132552132553132554132555132556132557132558132559132560132561132562132563132564132565132566132567132568132569132570132571132572132573132574132575132576132577132578132579132580132581132582132583132584132585132586132587132588132589132590132591132592132593132594132595132596132597132598132599132600132601132602132603132604132605132606132607132608132609132610132611132612132613132614132615132616132617132618132619132620132621132622132623132624132625132626132627132628132629132630132631132632132633132634132635132636132637132638132639132640132641132642132643132644132645132646132647132648132649132650132651132652132653132654132655132656132657132658132659132660132661132662132663132664132665132666132667132668132669132670132671132672132673132674132675132676132677132678132679132680132681132682132683132684132685132686132687132688132689132690132691132692132693132694132695132696132697132698132699132700132701132702132703132704132705132706132707132708132709132710132711132712132713132714132715132716132717132718132719132720132721132722132723132724132725132726132727132728132729132730132731132732132733132734132735132736132737132738132739132740132741132742132743132744132745132746132747132748132749132750132751132752132753132754132755132756132757132758132759132760132761132762132763132764132765132766132767132768132769132770132771132772132773132774132775132776132777132778132779132780132781132782132783132784132785132786132787132788132789132790132791132792132793132794132795132796132797132798132799132800132801132802132803132804132805132806132807132808132809132810132811132812132813132814132815132816132817132818132819132820132821132822132823132824132825132826132827132828132829132830132831132832132833132834132835132836132837132838132839132840132841132842132843132844132845132846132847132848132849132850132851132852132853132854132855132856132857132858132859132860132861132862132863132864132865132866132867132868132869132870132871132872132873132874132875132876132877132878132879132880132881132882132883132884132885132886132887132888132889132890132891132892132893132894132895132896132897132898132899132900132901132902132903132904132905132906132907132908132909132910132911132912132913132914132915132916132917132918132919132920132921132922132923132924132925132926132927132928132929132930132931132932132933132934132935132936132937132938132939132940132941132942132943132944132945132946132947132948132949132950132951132952132953132954132955132956132957132958132959132960132961132962132963132964132965132966132967132968132969132970132971132972132973132974132975132976132977132978132979132980132981132982132983132984132985132986132987132988132989132990132991132992132993132994132995132996132997132998132999133000133001133002133003133004133005133006133007133008133009133010133011133012133013133014133015133016133017133018133019133020133021133022133023133024133025133026133027133028133029133030133031133032133033133034133035133036133037133038133039133040133041133042133043133044133045133046133047133048133049133050133051133052133053133054133055133056133057133058133059133060133061133062133063133064133065133066133067133068133069133070133071133072133073133074133075133076133077133078133079133080133081133082133083133084133085133086133087133088133089133090133091133092133093133094133095133096133097133098133099133100133101133102133103133104133105133106133107133108133109133110133111133112133113133114133115133116133117133118133119133120133121133122133123133124133125133126133127133128133129133130133131133132133133133134133135133136133137133138133139133140133141133142133143133144133145133146133147133148133149133150133151133152133153133154133155133156133157133158133159133160133161133162133163133164133165133166133167133168133169133170133171133172133173133174133175133176133177133178133179133180133181133182133183133184133185133186133187133188133189133190133191133192133193133194133195133196133197133198133199133200133201133202133203133204133205133206133207133208133209133210133211133212133213133214133215133216133217133218133219133220133221133222133223133224133225133226133227133228133229133230133231133232133233133234133235133236133237133238133239133240133241133242133243133244133245133246133247133248133249133250133251133252133253133254133255133256133257133258133259133260133261133262133263133264133265133266133267133268133269133270133271133272133273133274133275133276133277133278133279133280133281133282133283133284133285133286133287133288133289133290133291133292133293133294133295133296133297133298133299133300133301133302133303133304133305133306133307133308133309133310133311133312133313133314133315133316133317133318133319133320133321133322133323133324133325133326133327133328133329133330133331133332133333133334133335133336133337133338133339133340133341133342133343133344133345133346133347133348133349133350133351133352133353133354133355133356133357133358133359133360133361133362133363133364133365133366133367133368133369133370133371133372133373133374133375133376133377133378133379133380133381133382133383133384133385133386133387133388133389133390133391133392133393133394133395133396133397133398133399133400133401133402133403133404133405133406133407133408133409133410133411133412133413133414133415133416133417133418133419133420133421133422133423133424133425133426133427133428133429133430133431133432133433133434133435133436133437133438133439133440133441133442133443133444133445133446133447133448133449133450133451133452133453133454133455133456133457133458133459133460133461133462133463133464133465133466133467133468133469133470133471133472133473133474133475133476133477133478133479133480133481133482133483133484133485133486133487133488133489133490133491133492133493133494133495133496133497133498133499133500133501133502133503133504133505133506133507133508133509133510133511133512133513133514133515133516133517133518133519133520133521133522133523133524133525133526133527133528133529133530133531133532133533133534133535133536133537133538133539133540133541133542133543133544133545133546133547133548133549133550133551133552133553133554133555133556133557133558133559133560133561133562133563133564133565133566133567133568133569133570133571133572133573133574133575133576133577133578133579133580133581133582133583133584133585133586133587133588133589133590133591133592133593133594133595133596133597133598133599133600133601133602133603133604133605133606133607133608133609133610133611133612133613133614133615133616133617133618133619133620133621133622133623133624133625133626133627133628133629133630133631133632133633133634133635133636133637133638133639133640133641133642133643133644133645133646133647133648133649133650133651133652133653133654133655133656133657133658133659133660133661133662133663133664133665133666133667133668133669133670133671133672133673133674133675133676133677133678133679133680133681133682133683133684133685133686133687133688133689133690133691133692133693133694133695133696133697133698133699133700133701133702133703133704133705133706133707133708133709133710133711133712133713133714133715133716133717133718133719133720133721133722133723133724133725133726133727133728133729133730133731133732133733133734133735133736133737133738133739133740133741133742133743133744133745133746133747133748133749133750133751133752133753133754133755133756133757133758133759133760133761133762133763133764133765133766133767133768133769133770133771133772133773133774133775133776133777133778133779133780133781133782133783133784133785133786133787133788133789133790133791133792133793133794133795133796133797133798133799133800133801133802133803133804133805133806133807133808133809133810133811133812133813133814133815133816133817133818133819133820133821133822133823133824133825133826133827133828133829133830133831133832133833133834133835133836133837133838133839133840133841133842133843133844133845133846133847133848133849133850133851133852133853133854133855133856133857133858133859133860133861133862133863133864133865133866133867133868133869133870133871133872133873133874133875133876133877133878133879133880133881133882133883133884133885133886133887133888133889133890133891133892133893133894133895133896133897133898133899133900133901133902133903133904133905133906133907133908133909133910133911133912133913133914133915133916133917133918133919133920133921133922133923133924133925133926133927133928133929133930133931133932133933133934133935133936133937133938133939133940133941133942133943133944133945133946133947133948133949133950133951133952133953133954133955133956133957133958133959133960133961133962133963133964133965133966133967133968133969133970133971133972133973133974133975133976133977133978133979133980133981133982133983133984133985133986133987133988133989133990133991133992133993133994133995133996133997133998133999134000134001134002134003134004134005134006134007134008134009134010134011134012134013134014134015134016134017134018134019134020134021134022134023134024134025134026134027134028134029134030134031134032134033134034134035134036134037134038134039134040134041134042134043134044134045134046134047134048134049134050134051134052134053134054134055134056134057134058134059134060134061134062134063134064134065134066134067134068134069134070134071134072134073134074134075134076134077134078134079134080134081134082134083134084134085134086134087134088134089134090134091134092134093134094134095134096134097134098134099134100134101134102134103134104134105134106134107134108134109134110134111134112134113134114134115134116134117134118134119134120134121134122134123134124134125134126134127134128134129134130134131134132134133134134134135134136134137134138134139134140134141134142134143134144134145134146134147134148134149134150134151134152134153134154134155134156134157134158134159134160134161134162134163134164134165134166134167134168134169134170134171134172134173134174134175134176134177134178134179134180134181134182134183134184134185134186134187134188134189134190134191134192134193134194134195134196134197134198134199134200134201134202134203134204134205134206134207134208134209134210134211134212134213134214134215134216134217134218134219134220134221134222134223134224134225134226134227134228134229134230134231134232134233134234134235134236134237134238134239134240134241134242134243134244134245134246134247134248134249134250134251134252134253134254134255134256134257134258134259134260134261134262134263134264134265134266134267134268134269134270134271134272134273134274134275134276134277134278134279134280134281134282134283134284134285134286134287134288134289134290134291134292134293134294134295134296134297134298134299134300134301134302134303134304134305134306134307134308134309134310134311134312134313134314134315134316134317134318134319134320134321134322134323134324134325134326134327134328134329134330134331134332134333134334134335134336134337134338134339134340134341134342134343134344134345134346134347134348134349134350134351134352134353134354134355134356134357134358134359134360134361134362134363134364134365134366134367134368134369134370134371134372134373134374134375134376134377134378134379134380134381134382134383134384134385134386134387134388134389134390134391134392134393134394134395134396134397134398134399134400134401134402134403134404134405134406134407134408134409134410134411134412134413134414134415134416134417134418134419134420134421134422134423134424134425134426134427134428134429134430134431134432134433134434134435134436134437134438134439134440134441134442134443134444134445134446134447134448134449134450134451134452134453134454134455134456134457134458134459134460134461134462134463134464134465134466134467134468134469134470134471134472134473134474134475134476134477134478134479134480134481134482134483134484134485134486134487134488134489134490134491134492134493134494134495134496134497134498134499134500134501134502134503134504134505134506134507134508134509134510134511134512134513134514134515134516134517134518134519134520134521134522134523134524134525134526134527134528134529134530134531134532134533134534134535134536134537134538134539134540134541134542134543134544134545134546134547134548134549134550134551134552134553134554134555134556134557134558134559134560134561134562134563134564134565134566134567134568134569134570134571134572134573134574134575134576134577134578134579134580134581134582134583134584134585134586134587134588134589134590134591134592134593134594134595134596134597134598134599134600134601134602134603134604134605134606134607134608134609134610134611134612134613134614134615134616134617134618134619134620134621134622134623134624134625134626134627134628134629134630134631134632134633134634134635134636134637134638134639134640134641134642134643134644134645134646134647134648134649134650134651134652134653134654134655134656134657134658134659134660134661134662134663134664134665134666134667134668134669134670134671134672134673134674134675134676134677134678134679134680134681134682134683134684134685134686134687134688134689134690134691134692134693134694134695134696134697134698134699134700134701134702134703134704134705134706134707134708134709134710134711134712134713134714134715134716134717134718134719134720134721134722134723134724134725134726134727134728134729134730134731134732134733134734134735134736134737134738134739134740134741134742134743134744134745134746134747134748134749134750134751134752134753134754134755134756134757134758134759134760134761134762134763134764134765134766134767134768134769134770134771134772134773134774134775134776134777134778134779134780134781134782134783134784134785134786134787134788134789134790134791134792134793134794134795134796134797134798134799134800134801134802134803134804134805134806134807134808134809134810134811134812134813134814134815134816134817134818134819134820134821134822134823134824134825134826134827134828134829134830134831134832134833134834134835134836134837134838134839134840134841134842134843134844134845134846134847134848134849134850134851134852134853134854134855134856134857134858134859134860134861134862134863134864134865134866134867134868134869134870134871134872134873134874134875134876134877134878134879134880134881134882134883134884134885134886134887134888134889134890134891134892134893134894134895134896134897134898134899134900134901134902134903134904134905134906134907134908134909134910134911134912134913134914134915134916134917134918134919134920134921134922134923134924134925134926134927134928134929134930134931134932134933134934134935134936134937134938134939134940134941134942134943134944134945134946134947134948134949134950134951134952134953134954134955134956134957134958134959134960134961134962134963134964134965134966134967134968134969134970134971134972134973134974134975134976134977134978134979134980134981134982134983134984134985134986134987134988134989134990134991134992134993134994134995134996134997134998134999135000135001135002135003135004135005135006135007135008135009135010135011135012135013135014135015135016135017135018135019135020135021135022135023135024135025135026135027135028135029135030135031135032135033135034135035135036135037135038135039135040135041135042135043135044135045135046135047135048135049135050135051135052135053135054135055135056135057135058135059135060135061135062135063135064135065135066135067135068135069135070135071135072135073135074135075135076135077135078135079135080135081135082135083135084135085135086135087135088135089135090135091135092135093135094135095135096135097135098135099135100135101135102135103135104135105135106135107135108135109135110135111135112135113135114135115135116135117135118135119135120135121135122135123135124135125135126135127135128135129135130135131135132135133135134135135135136135137135138135139135140135141135142135143135144135145135146135147135148135149135150135151135152135153135154135155135156135157135158135159135160135161135162135163135164135165135166135167135168135169135170135171135172135173135174135175135176135177135178135179135180135181135182135183135184135185135186135187135188135189135190135191135192135193135194135195135196135197135198135199135200135201135202135203135204135205135206135207135208135209135210135211135212135213135214135215135216135217135218135219135220135221135222135223135224135225135226135227135228135229135230135231135232135233135234135235135236135237135238135239135240135241135242135243135244135245135246135247135248135249135250135251135252135253135254135255135256135257135258135259135260135261135262135263135264135265135266135267135268135269135270135271135272135273135274135275135276135277135278135279135280135281135282135283135284135285135286135287135288135289135290135291135292135293135294135295135296135297135298135299135300135301135302135303135304135305135306135307135308135309135310135311135312135313135314135315135316135317135318135319135320135321135322135323135324135325135326135327135328135329135330135331135332135333135334135335135336135337135338135339135340135341135342135343135344135345135346135347135348135349135350135351135352135353135354135355135356135357135358135359135360135361135362135363135364135365135366135367135368135369135370135371135372135373135374135375135376135377135378135379135380135381135382135383135384135385135386135387135388135389135390135391135392135393135394135395135396135397135398135399135400135401135402135403135404135405135406135407135408135409135410135411135412135413135414135415135416135417135418135419135420135421135422135423135424135425135426135427135428135429135430135431135432135433135434135435135436135437135438135439135440135441135442135443135444135445135446135447135448135449135450135451135452135453135454135455135456135457135458135459135460135461135462135463135464135465135466135467135468135469135470135471135472135473135474135475135476135477135478135479135480135481135482135483135484135485135486135487135488135489135490135491135492135493135494135495135496135497135498135499135500135501135502135503135504135505135506135507135508135509135510135511135512135513135514135515135516135517135518135519135520135521135522135523135524135525135526135527135528135529135530135531135532135533135534135535135536135537135538135539135540135541135542135543135544135545135546135547135548135549135550135551135552135553135554135555135556135557135558135559135560135561135562135563135564135565135566135567135568135569135570135571135572135573135574135575135576135577135578135579135580135581135582135583135584135585135586135587135588135589135590135591135592135593135594135595135596135597135598135599135600135601135602135603135604135605135606135607135608135609135610135611135612135613135614135615135616135617135618135619135620135621135622135623135624135625135626135627135628135629135630135631135632135633135634135635135636135637135638135639135640135641135642135643135644135645135646135647135648135649135650135651135652135653135654135655135656135657135658135659135660135661135662135663135664135665135666135667135668135669135670135671135672135673135674135675135676135677135678135679135680135681135682135683135684135685135686135687135688135689135690135691135692135693135694135695135696135697135698135699135700135701135702135703135704135705135706135707135708135709135710135711135712135713135714135715135716135717135718135719135720135721135722135723135724135725135726135727135728135729135730135731135732135733135734135735135736135737135738135739135740135741135742135743135744135745135746135747135748135749135750135751135752135753135754135755135756135757135758135759135760135761135762135763135764135765135766135767135768135769135770135771135772135773135774135775135776135777135778135779135780135781135782135783135784135785135786135787135788135789135790135791135792135793135794135795135796135797135798135799135800135801135802135803135804135805135806135807135808135809135810135811135812135813135814135815135816135817135818135819135820135821135822135823135824135825135826135827135828135829135830135831135832135833135834135835135836135837135838135839135840135841135842135843135844135845135846135847135848135849135850135851135852135853135854135855135856135857135858135859135860135861135862135863135864135865135866135867135868135869135870135871135872135873135874135875135876135877135878135879135880135881135882135883135884135885135886135887135888135889135890135891135892135893135894135895135896135897135898135899135900135901135902135903135904135905135906135907135908135909135910135911135912135913135914135915135916135917135918135919135920135921135922135923135924135925135926135927135928135929135930135931135932135933135934135935135936135937135938135939135940135941135942135943135944135945135946135947135948135949135950135951135952135953135954135955135956135957135958135959135960135961135962135963135964135965135966135967135968135969135970135971135972135973135974135975135976135977135978135979135980135981135982135983135984135985135986135987135988135989135990135991135992135993135994135995135996135997135998135999136000136001136002136003136004136005136006136007136008136009136010136011136012136013136014136015136016136017136018136019136020136021136022136023136024136025136026136027136028136029136030136031136032136033136034136035136036136037136038136039136040136041136042136043136044136045136046136047136048136049136050136051136052136053136054136055136056136057136058136059136060136061136062136063136064136065136066136067136068136069136070136071136072136073136074136075136076136077136078136079136080136081136082136083136084136085136086136087136088136089136090136091136092136093136094136095136096136097136098136099136100136101136102136103136104136105136106136107136108136109136110136111136112136113136114136115136116136117136118136119136120136121136122136123136124136125136126136127136128136129136130136131136132136133136134136135136136136137136138136139136140136141136142136143136144136145136146136147136148136149136150136151136152136153136154136155136156136157136158136159136160136161136162136163136164136165136166136167136168136169136170136171136172136173136174136175136176136177136178136179136180136181136182136183136184136185136186136187136188136189136190136191136192136193136194136195136196136197136198136199136200136201136202136203136204136205136206136207136208136209136210136211136212136213136214136215136216136217136218136219136220136221136222136223136224136225136226136227136228136229136230136231136232136233136234136235136236136237136238136239136240136241136242136243136244136245136246136247136248136249136250136251136252136253136254136255136256136257136258136259136260136261136262136263136264136265136266136267136268136269136270136271136272136273136274136275136276136277136278136279136280136281136282136283136284136285136286136287136288136289136290136291136292136293136294136295136296136297136298136299136300136301136302136303136304136305136306136307136308136309136310136311136312136313136314136315136316136317136318136319136320136321136322136323136324136325136326136327136328136329136330136331136332136333136334136335136336136337136338136339136340136341136342136343136344136345136346136347136348136349136350136351136352136353136354136355136356136357136358136359136360136361136362136363136364136365136366136367136368136369136370136371136372136373136374136375136376136377136378136379136380136381136382136383136384136385136386136387136388136389136390136391136392136393136394136395136396136397136398136399136400136401136402136403136404136405136406136407136408136409136410136411136412136413136414136415136416136417136418136419136420136421136422136423136424136425136426136427136428136429136430136431136432136433136434136435136436136437136438136439136440136441136442136443136444136445136446136447136448136449136450136451136452136453136454136455136456136457136458136459136460136461136462136463136464136465136466136467136468136469136470136471136472136473136474136475136476136477136478136479136480136481136482136483136484136485136486136487136488136489136490136491136492136493136494136495136496136497136498136499136500136501136502136503136504136505136506136507136508136509136510136511136512136513136514136515136516136517136518136519136520136521136522136523136524136525136526136527136528136529136530136531136532136533136534136535136536136537136538136539136540136541136542136543136544136545136546136547136548136549136550136551136552136553136554136555136556136557136558136559136560136561136562136563136564136565136566136567136568136569136570136571136572136573136574136575136576136577136578136579136580136581136582136583136584136585136586136587136588136589136590136591136592136593136594136595136596136597136598136599136600136601136602136603136604136605136606136607136608136609136610136611136612136613136614136615136616136617136618136619136620136621136622136623136624136625136626136627136628136629136630136631136632136633136634136635136636136637136638136639136640136641136642136643136644136645136646136647136648136649136650136651136652136653136654136655136656136657136658136659136660136661136662136663136664136665136666136667136668136669136670136671136672136673136674136675136676136677136678136679136680136681136682136683136684136685136686136687136688136689136690136691136692136693136694136695136696136697136698136699136700136701136702136703136704136705136706136707136708136709136710136711136712136713136714136715136716136717136718136719136720136721136722136723136724136725136726136727136728136729136730136731136732136733136734136735136736136737136738136739136740136741136742136743136744136745136746136747136748136749136750136751136752136753136754136755136756136757136758136759136760136761136762136763136764136765136766136767136768136769136770136771136772136773136774136775136776136777136778136779136780136781136782136783136784136785136786136787136788136789136790136791136792136793136794136795136796136797136798136799136800136801136802136803136804136805136806136807136808136809136810136811136812136813136814136815136816136817136818136819136820136821136822136823136824136825136826136827136828136829136830136831136832136833136834136835136836136837136838136839136840136841136842136843136844136845136846136847136848136849136850136851136852136853136854136855136856136857136858136859136860136861136862136863136864136865136866136867136868136869136870136871136872136873136874136875136876136877136878136879136880136881136882136883136884136885136886136887136888136889136890136891136892136893136894136895136896136897136898136899136900136901136902136903136904136905136906136907136908136909136910136911136912136913136914136915136916136917136918136919136920136921136922136923136924136925136926136927136928136929136930136931136932136933136934136935136936136937136938136939136940136941136942136943136944136945136946136947136948136949136950136951136952136953136954136955136956136957136958136959136960136961136962136963136964136965136966136967136968136969136970136971136972136973136974136975136976136977136978136979136980136981136982136983136984136985136986136987136988136989136990136991136992136993136994136995136996136997136998136999137000137001137002137003137004137005137006137007137008137009137010137011137012137013137014137015137016137017137018137019137020137021137022137023137024137025137026137027137028137029137030137031137032137033137034137035137036137037137038137039137040137041137042137043137044137045137046137047137048137049137050137051137052137053137054137055137056137057137058137059137060137061137062137063137064137065137066137067137068137069137070137071137072137073137074137075137076137077137078137079137080137081137082137083137084137085137086137087137088137089137090137091137092137093137094137095137096137097137098137099137100137101137102137103137104137105137106137107137108137109137110137111137112137113137114137115137116137117137118137119137120137121137122137123137124137125137126137127137128137129137130137131137132137133137134137135137136137137137138137139137140137141137142137143137144137145137146137147137148137149137150137151137152137153137154137155137156137157137158137159137160137161137162137163137164137165137166137167137168137169137170137171137172137173137174137175137176137177137178137179137180137181137182137183137184137185137186137187137188137189137190137191137192137193137194137195137196137197137198137199137200137201137202137203137204137205137206137207137208137209137210137211137212137213137214137215137216137217137218137219137220137221137222137223137224137225137226137227137228137229137230137231137232137233137234137235137236137237137238137239137240137241137242137243137244137245137246137247137248137249137250137251137252137253137254137255137256137257137258137259137260137261137262137263137264137265137266137267137268137269137270137271137272137273137274137275137276137277137278137279137280137281137282137283137284137285137286137287137288137289137290137291137292137293137294137295137296137297137298137299137300137301137302137303137304137305137306137307137308137309137310137311137312137313137314137315137316137317137318137319137320137321137322137323137324137325137326137327137328137329137330137331137332137333137334137335137336137337137338137339137340137341137342137343137344137345137346137347137348137349137350137351137352137353137354137355137356137357137358137359137360137361137362137363137364137365137366137367137368137369137370137371137372137373137374137375137376137377137378137379137380137381137382137383137384137385137386137387137388137389137390137391137392137393137394137395137396137397137398137399137400137401137402137403137404137405137406137407137408137409137410137411137412137413137414137415137416137417137418137419137420137421137422137423137424137425137426137427137428137429137430137431137432137433137434137435137436137437137438137439137440137441137442137443137444137445137446137447137448137449137450137451137452137453137454137455137456137457137458137459137460137461137462137463137464137465137466137467137468137469137470137471137472137473137474137475137476137477137478137479137480137481137482137483137484137485137486137487137488137489137490137491137492137493137494137495137496137497137498137499137500137501137502137503137504137505137506137507137508137509137510137511137512137513137514137515137516137517137518137519137520137521137522137523137524137525137526137527137528137529137530137531137532137533137534137535137536137537137538137539137540137541137542137543137544137545137546137547137548137549137550137551137552137553137554137555137556137557137558137559137560137561137562137563137564137565137566137567137568137569137570137571137572137573137574137575137576137577137578137579137580137581137582137583137584137585137586137587137588137589137590137591137592137593137594137595137596137597137598137599137600137601137602137603137604137605137606137607137608137609137610137611137612137613137614137615137616137617137618137619137620137621137622137623137624137625137626137627137628137629137630137631137632137633137634137635137636137637137638137639137640137641137642137643137644137645137646137647137648137649137650137651137652137653137654137655137656137657137658137659137660137661137662137663137664137665137666137667137668137669137670137671137672137673137674137675137676137677137678137679137680137681137682137683137684137685137686137687137688137689137690137691137692137693137694137695137696137697137698137699137700137701137702137703137704137705137706137707137708137709137710137711137712137713137714137715137716137717137718137719137720137721137722137723137724137725137726137727137728137729137730137731137732137733137734137735137736137737137738137739137740137741137742137743137744137745137746137747137748137749137750137751137752137753137754137755137756137757137758137759137760137761137762137763137764137765137766137767137768137769137770137771137772137773137774137775137776137777137778137779137780137781137782137783137784137785137786137787137788137789137790137791137792137793137794137795137796137797137798137799137800137801137802137803137804137805137806137807137808137809137810137811137812137813137814137815137816137817137818137819137820137821137822137823137824137825137826137827137828137829137830137831137832137833137834137835137836137837137838137839137840137841137842137843137844137845137846137847137848137849137850137851137852137853137854137855137856137857137858137859137860137861137862137863137864137865137866137867137868137869137870137871137872137873137874137875137876137877137878137879137880137881137882137883137884137885137886137887137888137889137890137891137892137893137894137895137896137897137898137899137900137901137902137903137904137905137906137907137908137909137910137911137912137913137914137915137916137917137918137919137920137921137922137923137924137925137926137927137928137929137930137931137932137933137934137935137936137937137938137939137940137941137942137943137944137945137946137947137948137949137950137951137952137953137954137955137956137957137958137959137960137961137962137963137964137965137966137967137968137969137970137971137972137973137974137975137976137977137978137979137980137981137982137983137984137985137986137987137988137989137990137991137992137993137994137995137996137997137998137999138000138001138002138003138004138005138006138007138008138009138010138011138012138013138014138015138016138017138018138019138020138021138022138023138024138025138026138027138028138029138030138031138032138033138034138035138036138037138038138039138040138041138042138043138044138045138046138047138048138049138050138051138052138053138054138055138056138057138058138059138060138061138062138063138064138065138066138067138068138069138070138071138072138073138074138075138076138077138078138079138080138081138082138083138084138085138086138087138088138089138090138091138092138093138094138095138096138097138098138099138100138101138102138103138104138105138106138107138108138109138110138111138112138113138114138115138116138117138118138119138120138121138122138123138124138125138126138127138128138129138130138131138132138133138134138135138136138137138138138139138140138141138142138143138144138145138146138147138148138149138150138151138152138153138154138155138156138157138158138159138160138161138162138163138164138165138166138167138168138169138170138171138172138173138174138175138176138177138178138179138180138181138182138183138184138185138186138187138188138189138190138191138192138193138194138195138196138197138198138199138200138201138202138203138204138205138206138207138208138209138210138211138212138213138214138215138216138217138218138219138220138221138222138223138224138225138226138227138228138229138230138231138232138233138234138235138236138237138238138239138240138241138242138243138244138245138246138247138248138249138250138251138252138253138254138255138256138257138258138259138260138261138262138263138264138265138266138267138268138269138270138271138272138273138274138275138276138277138278138279138280138281138282138283138284138285138286138287138288138289138290138291138292138293138294138295138296138297138298138299138300138301138302138303138304138305138306138307138308138309138310138311138312138313138314138315138316138317138318138319138320138321138322138323138324138325138326138327138328138329138330138331138332138333138334138335138336138337138338138339138340138341138342138343138344138345138346138347138348138349138350138351138352138353138354138355138356138357138358138359138360138361138362138363138364138365138366138367138368138369138370138371138372138373138374138375138376138377138378138379138380138381138382138383138384138385138386138387138388138389138390138391138392138393138394138395138396138397138398138399138400138401138402138403138404138405138406138407138408138409138410138411138412138413138414138415138416138417138418138419138420138421138422138423138424138425138426138427138428138429138430138431138432138433138434138435138436138437138438138439138440138441138442138443138444138445138446138447138448138449138450138451138452138453138454138455138456138457138458138459138460138461138462138463138464138465138466138467138468138469138470138471138472138473138474138475138476138477138478138479138480138481138482138483138484138485138486138487138488138489138490138491138492138493138494138495138496138497138498138499138500138501138502138503138504138505138506138507138508138509138510138511138512138513138514138515138516138517138518138519138520138521138522138523138524138525138526138527138528138529138530138531138532138533138534138535138536138537138538138539138540138541138542138543138544138545138546138547138548138549138550138551138552138553138554138555138556138557138558138559138560138561138562138563138564138565138566138567138568138569138570138571138572138573138574138575138576138577138578138579138580138581138582138583138584138585138586138587138588138589138590138591138592138593138594138595138596138597138598138599138600138601138602138603138604138605138606138607138608138609138610138611138612138613138614138615138616138617138618138619138620138621138622138623138624138625138626138627138628138629138630138631138632138633138634138635138636138637138638138639138640138641138642138643138644138645138646138647138648138649138650138651138652138653138654138655138656138657138658138659138660138661138662138663138664138665138666138667138668138669138670138671138672138673138674138675138676138677138678138679138680138681138682138683138684138685138686138687138688138689138690138691138692138693138694138695138696138697138698138699138700138701138702138703138704138705138706138707138708138709138710138711138712138713138714138715138716138717138718138719138720138721138722138723138724138725138726138727138728138729138730138731138732138733138734138735138736138737138738138739138740138741138742138743138744138745138746138747138748138749138750138751138752138753138754138755138756138757138758138759138760138761138762138763138764138765138766138767138768138769138770138771138772138773138774138775138776138777138778138779138780138781138782138783138784138785138786138787138788138789138790138791138792138793138794138795138796138797138798138799138800138801138802138803138804138805138806138807138808138809138810138811138812138813138814138815138816138817138818138819138820138821138822138823138824138825138826138827138828138829138830138831138832138833138834138835138836138837138838138839138840138841138842138843138844138845138846138847138848138849138850138851138852138853138854138855138856138857138858138859138860138861138862138863138864138865138866138867138868138869138870138871138872138873138874138875138876138877138878138879138880138881138882138883138884138885138886138887138888138889138890138891138892138893138894138895138896138897138898138899138900138901138902138903138904138905138906138907138908138909138910138911138912138913138914138915138916138917138918138919138920138921138922138923138924138925138926138927138928138929138930138931138932138933138934138935138936138937138938138939138940138941138942138943138944138945138946138947138948138949138950138951138952138953138954138955138956138957138958138959138960138961138962138963138964138965138966138967138968138969138970138971138972138973138974138975138976138977138978138979138980138981138982138983138984138985138986138987138988138989138990138991138992138993138994138995138996138997138998138999139000139001139002139003139004139005139006139007139008139009139010139011139012139013139014139015139016139017139018139019139020139021139022139023139024139025139026139027139028139029139030139031139032139033139034139035139036139037139038139039139040139041139042139043139044139045139046139047139048139049139050139051139052139053139054139055139056139057139058139059139060139061139062139063139064139065139066139067139068139069139070139071139072139073139074139075139076139077139078139079139080139081139082139083139084139085139086139087139088139089139090139091139092139093139094139095139096139097139098139099139100139101139102139103139104139105139106139107139108139109139110139111139112139113139114139115139116139117139118139119139120139121139122139123139124139125139126139127139128139129139130139131139132139133139134139135139136139137139138139139139140139141139142139143139144139145139146139147139148139149139150139151139152139153139154139155139156139157139158139159139160139161139162139163139164139165139166139167139168139169139170139171139172139173139174139175139176139177139178139179139180139181139182139183139184139185139186139187139188139189139190139191139192139193139194139195139196139197139198139199139200139201139202139203139204139205139206139207139208139209139210139211139212139213139214139215139216139217139218139219139220139221139222139223139224139225139226139227139228139229139230139231139232139233139234139235139236139237139238139239139240139241139242139243139244139245139246139247139248139249139250139251139252139253139254139255139256139257139258139259139260139261139262139263139264139265139266139267139268139269139270139271139272139273139274139275139276139277139278139279139280139281139282139283139284139285139286139287139288139289139290139291139292139293139294139295139296139297139298139299139300139301139302139303139304139305139306139307139308139309139310139311139312139313139314139315139316139317139318139319139320139321139322139323139324139325139326139327139328139329139330139331139332139333139334139335139336139337139338139339139340139341139342139343139344139345139346139347139348139349139350139351139352139353139354139355139356139357139358139359139360139361139362139363139364139365139366139367139368139369139370139371139372139373139374139375139376139377139378139379139380139381139382139383139384139385139386139387139388139389139390139391139392139393139394139395139396139397139398139399139400139401139402139403139404139405139406139407139408139409139410139411139412139413139414139415139416139417139418139419139420139421139422139423139424139425139426139427139428139429139430139431139432139433139434139435139436139437139438139439139440139441139442139443139444139445139446139447139448139449139450139451139452139453139454139455139456139457139458139459139460139461139462139463139464139465139466139467139468139469139470139471139472139473139474139475139476139477139478139479139480139481139482139483139484139485139486139487139488139489139490139491139492139493139494139495139496139497139498139499139500139501139502139503139504139505139506139507139508139509139510139511139512139513139514139515139516139517139518139519139520139521139522139523139524139525139526139527139528139529139530139531139532139533139534139535139536139537139538139539139540139541139542139543139544139545139546139547139548139549139550139551139552139553139554139555139556139557139558139559139560139561139562139563139564139565139566139567139568139569139570139571139572139573139574139575139576139577139578139579139580139581139582139583139584139585139586139587139588139589139590139591139592139593139594139595139596139597139598139599139600139601139602139603139604139605139606139607139608139609139610139611139612139613139614139615139616139617139618139619139620139621139622139623139624139625139626139627139628139629139630139631139632139633139634139635139636139637139638139639139640139641139642139643139644139645139646139647139648139649139650139651139652139653139654139655139656139657139658139659139660139661139662139663139664139665139666139667139668139669139670139671139672139673139674139675139676139677139678139679139680139681139682139683139684139685139686139687139688139689139690139691139692139693139694139695139696139697139698139699139700139701139702139703139704139705139706139707139708139709139710139711139712139713139714139715139716139717139718139719139720139721139722139723139724139725139726139727139728139729139730139731139732139733139734139735139736139737139738139739139740139741139742139743139744139745139746139747139748139749139750139751139752139753139754139755139756139757139758139759139760139761139762139763139764139765139766139767139768139769139770139771139772139773139774139775139776139777139778139779139780139781139782139783139784139785139786139787139788139789139790139791139792139793139794139795139796139797139798139799139800139801139802139803139804139805139806139807139808139809139810139811139812139813139814139815139816139817139818139819139820139821139822139823139824139825139826139827139828139829139830139831139832139833139834139835139836139837139838139839139840139841139842139843139844139845139846139847139848139849139850139851139852139853139854139855139856139857139858139859139860139861139862139863139864139865139866139867139868139869139870139871139872139873139874139875139876139877139878139879139880139881139882139883139884139885139886139887139888139889139890139891139892139893139894139895139896139897139898139899139900139901139902139903139904139905139906139907139908139909139910139911139912139913139914139915139916139917139918139919139920139921139922139923139924139925139926139927139928139929139930139931139932139933139934139935139936139937139938139939139940139941139942139943139944139945139946139947139948139949139950139951139952139953139954139955139956139957139958139959139960139961139962139963139964139965139966139967139968139969139970139971139972139973139974139975139976139977139978139979139980139981139982139983139984139985139986139987139988139989139990139991139992139993139994139995139996139997139998139999140000140001140002140003140004140005140006140007140008140009140010140011140012140013140014140015140016140017140018140019140020140021140022140023140024140025140026140027140028140029140030140031140032140033140034140035140036140037140038140039140040140041140042140043140044140045140046140047140048140049140050140051140052140053140054140055140056140057140058140059140060140061140062140063140064140065140066140067140068140069140070140071140072140073140074140075140076140077140078140079140080140081140082140083140084140085140086140087140088140089140090140091140092140093140094140095140096140097140098140099140100140101140102140103140104140105140106140107140108140109140110140111140112140113140114140115140116140117140118140119140120140121140122140123140124140125140126140127140128140129140130140131140132140133140134140135140136140137140138140139140140140141140142140143140144140145140146140147140148140149140150140151140152140153140154140155140156140157140158140159140160140161140162140163140164140165140166140167140168140169140170140171140172140173140174140175140176140177140178140179140180140181140182140183140184140185140186140187140188140189140190140191140192140193140194140195140196140197140198140199140200140201140202140203140204140205140206140207140208140209140210140211140212140213140214140215140216140217140218140219140220140221140222140223140224140225140226140227140228140229140230140231140232140233140234140235140236140237140238140239140240140241140242140243140244140245140246140247140248140249140250140251140252140253140254140255140256140257140258140259140260140261140262140263140264140265140266140267140268140269140270140271140272140273140274140275140276140277140278140279140280140281140282140283140284140285140286140287140288140289140290140291140292140293140294140295140296140297140298140299140300140301140302140303140304140305140306140307140308140309140310140311140312140313140314140315140316140317140318140319140320140321140322140323140324140325140326140327140328140329140330140331140332140333140334140335140336140337140338140339140340140341140342140343140344140345140346140347140348140349140350140351140352140353140354140355140356140357140358140359140360140361140362140363140364140365140366140367140368140369140370140371140372140373140374140375140376140377140378140379140380140381140382140383140384140385140386140387140388140389140390140391140392140393140394140395140396140397140398140399140400140401140402140403140404140405140406140407140408140409140410140411140412140413140414140415140416140417140418140419140420140421140422140423140424140425140426140427140428140429140430140431140432140433140434140435140436140437140438140439140440140441140442140443140444140445140446140447140448140449140450140451140452140453140454140455140456140457140458140459140460140461140462140463140464140465140466140467140468140469140470140471140472140473140474140475140476140477140478140479140480140481140482140483140484140485140486140487140488140489140490140491140492140493140494140495140496140497140498140499140500140501140502140503140504140505140506140507140508140509140510140511140512140513140514140515140516140517140518140519140520140521140522140523140524140525140526140527140528140529140530140531140532140533140534140535140536140537140538140539140540140541140542140543140544140545140546140547140548140549140550140551140552140553140554140555140556140557140558140559140560140561140562140563140564140565140566140567140568140569140570140571140572140573140574140575140576140577140578140579140580140581140582140583140584140585140586140587140588140589140590140591140592140593140594140595140596140597140598140599140600140601140602140603140604140605140606140607140608140609140610140611140612140613140614140615140616140617140618140619140620140621140622140623140624140625140626140627140628140629140630140631140632140633140634140635140636140637140638140639140640140641140642140643140644140645140646140647140648140649140650140651140652140653140654140655140656140657140658140659140660140661140662140663140664140665140666140667140668140669140670140671140672140673140674140675140676140677140678140679140680140681140682140683140684140685140686140687140688140689140690140691140692140693140694140695140696140697140698140699140700140701140702140703140704140705140706140707140708140709140710140711140712140713140714140715140716140717140718140719140720140721140722140723140724140725140726140727140728140729140730140731140732140733140734140735140736140737140738140739140740140741140742140743140744140745140746140747140748140749140750140751140752140753140754140755140756140757140758140759140760140761140762140763140764140765140766140767140768140769140770140771140772140773140774140775140776140777140778140779140780140781140782140783140784140785140786140787140788140789140790140791140792140793140794140795140796140797140798140799140800140801140802140803140804140805140806140807140808140809140810140811140812140813140814140815140816140817140818140819140820140821140822140823140824140825140826140827140828140829140830140831140832140833140834140835140836140837140838140839140840140841140842140843140844140845140846140847140848140849140850140851140852140853140854140855140856140857140858140859140860140861140862140863140864140865140866140867140868140869140870140871140872140873140874140875140876140877140878140879140880140881140882140883140884140885140886140887140888140889140890140891140892140893140894140895140896140897140898140899140900140901140902140903140904140905140906140907140908140909140910140911140912140913140914140915140916140917140918140919140920140921140922140923140924140925140926140927140928140929140930140931140932140933140934140935140936140937140938140939140940140941140942140943140944140945140946140947140948140949140950140951140952140953140954140955140956140957140958140959140960140961140962140963140964140965140966140967140968140969140970140971140972140973140974140975140976140977140978140979140980140981140982140983140984140985140986140987140988140989140990140991140992140993140994140995140996140997140998140999141000141001141002141003141004141005141006141007141008141009141010141011141012141013141014141015141016141017141018141019141020141021141022141023141024141025141026141027141028141029141030141031141032141033141034141035141036141037141038141039141040141041141042141043141044141045141046141047141048141049141050141051141052141053141054141055141056141057141058141059141060141061141062141063141064141065141066141067141068141069141070141071141072141073141074141075141076141077141078141079141080141081141082141083141084141085141086141087141088141089141090141091141092141093141094141095141096141097141098141099141100141101141102141103141104141105141106141107141108141109141110141111141112141113141114141115141116141117141118141119141120141121141122141123141124141125141126141127141128141129141130141131141132141133141134141135141136141137141138141139141140141141141142141143141144141145141146141147141148141149141150141151141152141153141154141155141156141157141158141159141160141161141162141163141164141165141166141167141168141169141170141171141172141173141174141175141176141177141178141179141180141181141182141183141184141185141186141187141188141189141190141191141192141193141194141195141196141197141198141199141200141201141202141203141204141205141206141207141208141209141210141211141212141213141214141215141216141217141218141219141220141221141222141223141224141225141226141227141228141229141230141231141232141233141234141235141236141237141238141239141240141241141242141243141244141245141246141247141248141249141250141251141252141253141254141255141256141257141258141259141260141261141262141263141264141265141266141267141268141269141270141271141272141273141274141275141276141277141278141279141280141281141282141283141284141285141286141287141288141289141290141291141292141293141294141295141296141297141298141299141300141301141302141303141304141305141306141307141308141309141310141311141312141313141314141315141316141317141318141319141320141321141322141323141324141325141326141327141328141329141330141331141332141333141334141335141336141337141338141339141340141341141342141343141344141345141346141347141348141349141350141351141352141353141354141355141356141357141358141359141360141361141362141363141364141365141366141367141368141369141370141371141372141373141374141375141376141377141378141379141380141381141382141383141384141385141386141387141388141389141390141391141392141393141394141395141396141397141398141399141400141401141402141403141404141405141406141407141408141409141410141411141412141413141414141415141416141417141418141419141420141421141422141423141424141425141426141427141428141429141430141431141432141433141434141435141436141437141438141439141440141441141442141443141444141445141446141447141448141449141450141451141452141453141454141455141456141457141458141459141460141461141462141463141464141465141466141467141468141469141470141471141472141473141474141475141476141477141478141479141480141481141482141483141484141485141486141487141488141489141490141491141492141493141494141495141496141497141498141499141500141501141502141503141504141505141506141507141508141509141510141511141512141513141514141515141516141517141518141519141520141521141522141523141524141525141526141527141528141529141530141531141532141533141534141535141536141537141538141539141540141541141542141543141544141545141546141547141548141549141550141551141552141553141554141555141556141557141558141559141560141561141562141563141564141565141566141567141568141569141570141571141572141573141574141575141576141577141578141579141580141581141582141583141584141585141586141587141588141589141590141591141592141593141594141595141596141597141598141599141600141601141602141603141604141605141606141607141608141609141610141611141612141613141614141615141616141617141618141619141620141621141622141623141624141625141626141627141628141629141630141631141632141633141634141635141636141637141638141639141640141641141642141643141644141645141646141647141648141649141650141651141652141653141654141655141656141657141658141659141660141661141662141663141664141665141666141667141668141669141670141671141672141673141674141675141676141677141678141679141680141681141682141683141684141685141686141687141688141689141690141691141692141693141694141695141696141697141698141699141700141701141702141703141704141705141706141707141708141709141710141711141712141713141714141715141716141717141718141719141720141721141722141723141724141725141726141727141728141729141730141731141732141733141734141735141736141737141738141739141740141741141742141743141744141745141746141747141748141749141750141751141752141753141754141755141756141757141758141759141760141761141762141763141764141765141766141767141768141769141770141771141772141773141774141775141776141777141778141779141780141781141782141783141784141785141786141787141788141789141790141791141792141793141794141795141796141797141798141799141800141801141802141803141804141805141806141807141808141809141810141811141812141813141814141815141816141817141818141819141820141821141822141823141824141825141826141827141828141829141830141831141832141833141834141835141836141837141838141839141840141841141842141843141844141845141846141847141848141849141850141851141852141853141854141855141856141857141858141859141860141861141862141863141864141865141866141867141868141869141870141871141872141873141874141875141876141877141878141879141880141881141882141883141884141885141886141887141888141889141890141891141892141893141894141895141896141897141898141899141900141901141902141903141904141905141906141907141908141909141910141911141912141913141914141915141916141917141918141919141920141921141922141923141924141925141926141927141928141929141930141931141932141933141934141935141936141937141938141939141940141941141942141943141944141945141946141947141948141949141950141951141952141953141954141955141956141957141958141959141960141961141962141963141964141965141966141967141968141969141970141971141972141973141974141975141976141977141978141979141980141981141982141983141984141985141986141987141988141989141990141991141992141993141994141995141996141997141998141999142000142001142002142003142004142005142006142007142008142009142010142011142012142013142014142015142016142017142018142019142020142021142022142023142024142025142026142027142028142029142030142031142032142033142034142035142036142037142038142039142040142041142042142043142044142045142046142047142048142049142050142051142052142053142054142055142056142057142058142059142060142061142062142063142064142065142066142067142068142069142070142071142072142073142074142075142076142077142078142079142080142081142082142083142084142085142086142087142088142089142090142091142092142093142094142095142096142097142098142099142100142101142102142103142104142105142106142107142108142109142110142111142112142113142114142115142116142117142118142119142120142121142122142123142124142125142126142127142128142129142130142131142132142133142134142135142136142137142138142139142140142141142142142143142144142145142146142147142148142149142150142151142152142153142154142155142156142157142158142159142160142161142162142163142164142165142166142167142168142169142170142171142172142173142174142175142176142177142178142179142180142181142182142183142184142185142186142187142188142189142190142191142192142193142194142195142196142197142198142199142200142201142202142203142204142205142206142207142208142209142210142211142212142213142214142215142216142217142218142219142220142221142222142223142224142225142226142227142228142229142230142231142232142233142234142235142236142237142238142239142240142241142242142243142244142245142246142247142248142249142250142251142252142253142254142255142256142257142258142259142260142261142262142263142264142265142266142267142268142269142270142271142272142273142274142275142276142277142278142279142280142281142282142283142284142285142286142287142288142289142290142291142292142293142294142295142296142297142298142299142300142301142302142303142304142305142306142307142308142309142310142311142312142313142314142315142316142317142318142319142320142321142322142323142324142325142326142327142328142329142330142331142332142333142334142335142336142337142338142339142340142341142342142343142344142345142346142347142348142349142350142351142352142353142354142355142356142357142358142359142360142361142362142363142364142365142366142367142368142369142370142371142372142373142374142375142376142377142378142379142380142381142382142383142384142385142386142387142388142389142390142391142392142393142394142395142396142397142398142399142400142401142402142403142404142405142406142407142408142409142410142411142412142413142414142415142416142417142418142419142420142421142422142423142424142425142426142427142428142429142430142431142432142433142434142435142436142437142438142439142440142441142442142443142444142445142446142447142448142449142450142451142452142453142454142455142456142457142458142459142460142461142462142463142464142465142466142467142468142469142470142471142472142473142474142475142476142477142478142479142480142481142482142483142484142485142486142487142488142489142490142491142492142493142494142495142496142497142498142499142500142501142502142503142504142505142506142507142508142509142510142511142512142513142514142515142516142517142518142519142520142521142522142523142524142525142526142527142528142529142530142531142532142533142534142535142536142537142538142539142540142541142542142543142544142545142546142547142548142549142550142551142552142553142554142555142556142557142558142559142560142561142562142563142564142565142566142567142568142569142570142571142572142573142574142575142576142577142578142579142580142581142582142583142584142585142586142587142588142589142590142591142592142593142594142595142596142597142598142599142600142601142602142603142604142605142606142607142608142609142610142611142612142613142614142615142616142617142618142619142620142621142622142623142624142625142626142627142628142629142630142631142632142633142634142635142636142637142638142639142640142641142642142643142644142645142646142647142648142649142650142651142652142653142654142655142656142657142658142659142660142661142662142663142664142665142666142667142668142669142670142671142672142673142674142675142676142677142678142679142680142681142682142683142684142685142686142687142688142689142690142691142692142693142694142695142696142697142698142699142700142701142702142703142704142705142706142707142708142709142710142711142712142713142714142715142716142717142718142719142720142721142722142723142724142725142726142727142728142729142730142731142732142733142734142735142736142737142738142739142740142741142742142743142744142745142746142747142748142749142750142751142752142753142754142755142756142757142758142759142760142761142762142763142764142765142766142767142768142769142770142771142772142773142774142775142776142777142778142779142780142781142782142783142784142785142786142787142788142789142790142791142792142793142794142795142796142797142798142799142800142801142802142803142804142805142806142807142808142809142810142811142812142813142814142815142816142817142818142819142820142821142822142823142824142825142826142827142828142829142830142831142832142833142834142835142836142837142838142839142840142841142842142843142844142845142846142847142848142849142850142851142852142853142854142855142856142857142858142859142860142861142862142863142864142865142866142867142868142869142870142871142872142873142874142875142876142877142878142879142880142881142882142883142884142885142886142887142888142889142890142891142892142893142894142895142896142897142898142899142900142901142902142903142904142905142906142907142908142909142910142911142912142913142914142915142916142917142918142919142920142921142922142923142924142925142926142927142928142929142930142931142932142933142934142935142936142937142938142939142940142941142942142943142944142945142946142947142948142949142950142951142952142953142954142955142956142957142958142959142960142961142962142963142964142965142966142967142968142969142970142971142972142973142974142975142976142977142978142979142980142981142982142983142984142985142986142987142988142989142990142991142992142993142994142995142996142997142998142999143000143001143002143003143004143005143006143007143008143009143010143011143012143013143014143015143016143017143018143019143020143021143022143023143024143025143026143027143028143029143030143031143032143033143034143035143036143037143038143039143040143041143042143043143044143045143046143047143048143049143050143051143052143053143054143055143056143057143058143059143060143061143062143063143064143065143066143067143068143069143070143071143072143073143074143075143076143077143078143079143080143081143082143083143084143085143086143087143088143089143090143091143092143093143094143095143096143097143098143099143100143101143102143103143104143105143106143107143108143109143110143111143112143113143114143115143116143117143118143119143120143121143122143123143124143125143126143127143128143129143130143131143132143133143134143135143136143137143138143139143140143141143142143143143144143145143146143147143148143149143150143151143152143153143154143155143156143157143158143159143160143161143162143163143164143165143166143167143168143169143170143171143172143173143174143175143176143177143178143179143180143181143182143183143184143185143186143187143188143189143190143191143192143193143194143195143196143197143198143199143200143201143202143203143204143205143206143207143208143209143210143211143212143213143214143215143216143217143218143219143220143221143222143223143224143225143226143227143228143229143230143231143232143233143234143235143236143237143238143239143240143241143242143243143244143245143246143247143248143249143250143251143252143253143254143255143256143257143258143259143260143261143262143263143264143265143266143267143268143269143270143271143272143273143274143275143276143277143278143279143280143281143282143283143284143285143286143287143288143289143290143291143292143293143294143295143296143297143298143299143300143301143302143303143304143305143306143307143308143309143310143311143312143313143314143315143316143317143318143319143320143321143322143323143324143325143326143327143328143329143330143331143332143333143334143335143336143337143338143339143340143341143342143343143344143345143346143347143348143349143350143351143352143353143354143355143356143357143358143359143360143361143362143363143364143365143366143367143368143369143370143371143372143373143374143375143376143377143378143379143380143381143382143383143384143385143386143387143388143389143390143391143392143393143394143395143396143397143398143399143400143401143402143403143404143405143406143407143408143409143410143411143412143413143414143415143416143417143418143419143420143421143422143423143424143425143426143427143428143429143430143431143432143433143434143435143436143437143438143439143440143441143442143443143444143445143446143447143448143449143450143451143452143453143454143455143456143457143458143459143460143461143462143463143464143465143466143467143468143469143470143471143472143473143474143475143476143477143478143479143480143481143482143483143484143485143486143487143488143489143490143491143492143493143494143495143496143497143498143499143500143501143502143503143504143505143506143507143508143509143510143511143512143513143514143515143516143517143518143519143520143521143522143523143524143525143526143527143528143529143530143531143532143533143534143535143536143537143538143539143540143541143542143543143544143545143546143547143548143549143550143551143552143553143554143555143556143557143558143559143560143561143562143563143564143565143566143567143568143569143570143571143572143573143574143575143576143577143578143579143580143581143582143583143584143585143586143587143588143589143590143591143592143593143594143595143596143597143598143599143600143601143602143603143604143605143606143607143608143609143610143611143612143613143614143615143616143617143618143619143620143621143622143623143624143625143626143627143628143629143630143631143632143633143634143635143636143637143638143639143640143641143642143643143644143645143646143647143648143649143650143651143652143653143654143655143656143657143658143659143660143661143662143663143664143665143666143667143668143669143670143671143672143673143674143675143676143677143678143679143680143681143682143683143684143685143686143687143688143689143690143691143692143693143694143695143696143697143698143699143700143701143702143703143704143705143706143707143708143709143710143711143712143713143714143715143716143717143718143719143720143721143722143723143724143725143726143727143728143729143730143731143732143733143734143735143736143737143738143739143740143741143742143743143744143745143746143747143748143749143750143751143752143753143754143755143756143757143758143759143760143761143762143763143764143765143766143767143768143769143770143771143772143773143774143775143776143777143778143779143780143781143782143783143784143785143786143787143788143789143790143791143792143793143794143795143796143797143798143799143800143801143802143803143804143805143806143807143808143809143810143811143812143813143814143815143816143817143818143819143820143821143822143823143824143825143826143827143828143829143830143831143832143833143834143835143836143837143838143839143840143841143842143843143844143845143846143847143848143849143850143851143852143853143854143855143856143857143858143859143860143861143862143863143864143865143866143867143868143869143870143871143872143873143874143875143876143877143878143879143880143881143882143883143884143885143886143887143888143889143890143891143892143893143894143895143896143897143898143899143900143901143902143903143904143905143906143907143908143909143910143911143912143913143914143915143916143917143918143919143920143921143922143923143924143925143926143927143928143929143930143931143932143933143934143935143936143937143938143939143940143941143942143943143944143945143946143947143948143949143950143951143952143953143954143955143956143957143958143959143960143961143962143963143964143965143966143967143968143969143970143971143972143973143974143975143976143977143978143979143980143981143982143983143984143985143986143987143988143989143990143991143992143993143994143995143996143997143998143999144000144001144002144003144004144005144006144007144008144009144010144011144012144013144014144015144016144017144018144019144020144021144022144023144024144025144026144027144028144029144030144031144032144033144034144035144036144037144038144039144040144041144042144043144044144045144046144047144048144049144050144051144052144053144054144055144056144057144058144059144060144061144062144063144064144065144066144067144068144069144070144071144072144073144074144075144076144077144078144079144080144081144082144083144084144085144086144087144088144089144090144091144092144093144094144095144096144097144098144099144100144101144102144103144104144105144106144107144108144109144110144111144112144113144114144115144116144117144118144119144120144121144122144123144124144125144126144127144128144129144130144131144132144133144134144135144136144137144138144139144140144141144142144143144144144145144146144147144148144149144150144151144152144153144154144155144156144157144158144159144160144161144162144163144164144165144166144167144168144169144170144171144172144173144174144175144176144177144178144179144180144181144182144183144184144185144186144187144188144189144190144191144192144193144194144195144196144197144198144199144200144201144202144203144204144205144206144207144208144209144210144211144212144213144214144215144216144217144218144219144220144221144222144223144224144225144226144227144228144229144230144231144232144233144234144235144236144237144238144239144240144241144242144243144244144245144246144247144248144249144250144251144252144253144254144255144256144257144258144259144260144261144262144263144264144265144266144267144268144269144270144271144272144273144274144275144276144277144278144279144280144281144282144283144284144285144286144287144288144289144290144291144292144293144294144295144296144297144298144299144300144301144302144303144304144305144306144307144308144309144310144311144312144313144314144315144316144317144318144319144320144321144322144323144324144325144326144327144328144329144330144331144332144333144334144335144336144337144338144339144340144341144342144343144344144345144346144347144348144349144350144351144352144353144354144355144356144357144358144359144360144361144362144363144364144365144366144367144368144369144370144371144372144373144374144375144376144377144378144379144380144381144382144383144384144385144386144387144388144389144390144391144392144393144394144395144396144397144398144399144400144401144402144403144404144405144406144407144408144409144410144411144412144413144414144415144416144417144418144419144420144421144422144423144424144425144426144427144428144429144430144431144432144433144434144435144436144437144438144439144440144441144442144443144444144445144446144447144448144449144450144451144452144453144454144455144456144457144458144459144460144461144462144463144464144465144466144467144468144469144470144471144472144473144474144475144476144477144478144479144480144481144482144483144484144485144486144487144488144489144490144491144492144493144494144495144496144497144498144499144500144501144502144503144504144505144506144507144508144509144510144511144512144513144514144515144516144517144518144519144520144521144522144523144524144525144526144527144528144529144530144531144532144533144534144535144536144537144538144539144540144541144542144543144544144545144546144547144548144549144550144551144552144553144554144555144556144557144558144559144560144561144562144563144564144565144566144567144568144569144570144571144572144573144574144575144576144577144578144579144580144581144582144583144584144585144586144587144588144589144590144591144592144593144594144595144596144597144598144599144600144601144602144603144604144605144606144607144608144609144610144611144612144613144614144615144616144617144618144619144620144621144622144623144624144625144626144627144628144629144630144631144632144633144634144635144636144637144638144639144640144641144642144643144644144645144646144647144648144649144650144651144652144653144654144655144656144657144658144659144660144661144662144663144664144665144666144667144668144669144670144671144672144673144674144675144676144677144678144679144680144681144682144683144684144685144686144687144688144689144690144691144692144693144694144695144696144697144698144699144700144701144702144703144704144705144706144707144708144709144710144711144712144713144714144715144716144717144718144719144720144721144722144723144724144725144726144727144728144729144730144731144732144733144734144735144736144737144738144739144740144741144742144743144744144745144746144747144748144749144750144751144752144753144754144755144756144757144758144759144760144761144762144763144764144765144766144767144768144769144770144771144772144773144774144775144776144777144778144779144780144781144782144783144784144785144786144787144788144789144790144791144792144793144794144795144796144797144798144799144800144801144802144803144804144805144806144807144808144809144810144811144812144813144814144815144816144817144818144819144820144821144822144823144824144825144826144827144828144829144830144831144832144833144834144835144836144837144838144839144840144841144842144843144844144845144846144847144848144849144850144851144852144853144854144855144856144857144858144859144860144861144862144863144864144865144866144867144868144869144870144871144872144873144874144875144876144877144878144879144880144881144882144883144884144885144886144887144888144889144890144891144892144893144894144895144896144897144898144899144900144901144902144903144904144905144906144907144908144909144910144911144912144913144914144915144916144917144918144919144920144921144922144923144924144925144926144927144928144929144930144931144932144933144934144935144936144937144938144939144940144941144942144943144944144945144946144947144948144949144950144951144952144953144954144955144956144957144958144959144960144961144962144963144964144965144966144967144968144969144970144971144972144973144974144975144976144977144978144979144980144981144982144983144984144985144986144987144988144989144990144991144992144993144994144995144996144997144998144999145000145001145002145003145004145005145006145007145008145009145010145011145012145013145014145015145016145017145018145019145020145021145022145023145024145025145026145027145028145029145030145031145032145033145034145035145036145037145038145039145040145041145042145043145044145045145046145047145048145049145050145051145052145053145054145055145056145057145058145059145060145061145062145063145064145065145066145067145068145069145070145071145072145073145074145075145076145077145078145079145080145081145082145083145084145085145086145087145088145089145090145091145092145093145094145095145096145097145098145099145100145101145102145103145104145105145106145107145108145109145110145111145112145113145114145115145116145117145118145119145120145121145122145123145124145125145126145127145128145129145130145131145132145133145134145135145136145137145138145139145140145141145142145143145144145145145146145147145148145149145150145151145152145153145154145155145156145157145158145159145160145161145162145163145164145165145166145167145168145169145170145171145172145173145174145175145176145177145178145179145180145181145182145183145184145185145186145187145188145189145190145191145192145193145194145195145196145197145198145199145200145201145202145203145204145205145206145207145208145209145210145211145212145213145214145215145216145217145218145219145220145221145222145223145224145225145226145227145228145229145230145231145232145233145234145235145236145237145238145239145240145241145242145243145244145245145246145247145248145249145250145251145252145253145254145255145256145257145258145259145260145261145262145263145264145265145266145267145268145269145270145271145272145273145274145275145276145277145278145279145280145281145282145283145284145285145286145287145288145289145290145291145292145293145294145295145296145297145298145299145300145301145302145303145304145305145306145307145308145309145310145311145312145313145314145315145316145317145318145319145320145321145322145323145324145325145326145327145328145329145330145331145332145333145334145335145336145337145338145339145340145341145342145343145344145345145346145347145348145349145350145351145352145353145354145355145356145357145358145359145360145361145362145363145364145365145366145367145368145369145370145371145372145373145374145375145376145377145378145379145380145381145382145383145384145385145386145387145388145389145390145391145392145393145394145395145396145397145398145399145400145401145402145403145404145405145406145407145408145409145410145411145412145413145414145415145416145417145418145419145420145421145422145423145424145425145426145427145428145429145430145431145432145433145434145435145436145437145438145439145440145441145442145443145444145445145446145447145448145449145450145451145452145453145454145455145456145457145458145459145460145461145462145463145464145465145466145467145468145469145470145471145472145473145474145475145476145477145478145479145480145481145482145483145484145485145486145487145488145489145490145491145492145493145494145495145496145497145498145499145500145501145502145503145504145505145506145507145508145509145510145511145512145513145514145515145516145517145518145519145520145521145522145523145524145525145526145527145528145529145530145531145532145533145534145535145536145537145538145539145540145541145542145543145544145545145546145547145548145549145550145551145552145553145554145555145556145557145558145559145560145561145562145563145564145565145566145567145568145569145570145571145572145573145574145575145576145577145578145579145580145581145582145583145584145585145586145587145588145589145590145591145592145593145594145595145596145597145598145599145600145601145602145603145604145605145606145607145608145609145610145611145612145613145614145615145616145617145618145619145620145621145622145623145624145625145626145627145628145629145630145631145632145633145634145635145636145637145638145639145640145641145642145643145644145645145646145647145648145649145650145651145652145653145654145655145656145657145658145659145660145661145662145663145664145665145666145667145668145669145670145671145672145673145674145675145676145677145678145679145680145681145682145683145684145685145686145687145688145689145690145691145692145693145694145695145696145697145698145699145700145701145702145703145704145705145706145707145708145709145710145711145712145713145714145715145716145717145718145719145720145721145722145723145724145725145726145727145728145729145730145731145732145733145734145735145736145737145738145739145740145741145742145743145744145745145746145747145748145749145750145751145752145753145754145755145756145757145758145759145760145761145762145763145764145765145766145767145768145769145770145771145772145773145774145775145776145777145778145779145780145781145782145783145784145785145786145787145788145789145790145791145792145793145794145795145796145797145798145799145800145801145802145803145804145805145806145807145808145809145810145811145812145813145814145815145816145817145818145819145820145821145822145823145824145825145826145827145828145829145830145831145832145833145834145835145836145837145838145839145840145841145842145843145844145845145846145847145848145849145850145851145852145853145854145855145856145857145858145859145860145861145862145863145864145865145866145867145868145869145870145871145872145873145874145875145876145877145878145879145880145881145882145883145884145885145886145887145888145889145890145891145892145893145894145895145896145897145898145899145900145901145902145903145904145905145906145907145908145909145910145911145912145913145914145915145916145917145918145919145920145921145922145923145924145925145926145927145928145929145930145931145932145933145934145935145936145937145938145939145940145941145942145943145944145945145946145947145948145949145950145951145952145953145954145955145956145957145958145959145960145961145962145963145964145965145966145967145968145969145970145971145972145973145974145975145976145977145978145979145980145981145982145983145984145985145986145987145988145989145990145991145992145993145994145995145996145997145998145999146000146001146002146003146004146005146006146007146008146009146010146011146012146013146014146015146016146017146018146019146020146021146022146023146024146025146026146027146028146029146030146031146032146033146034146035146036146037146038146039146040146041146042146043146044146045146046146047146048146049146050146051146052146053146054146055146056146057146058146059146060146061146062146063146064146065146066146067146068146069146070146071146072146073146074146075146076146077146078146079146080146081146082146083146084146085146086146087146088146089146090146091146092146093146094146095146096146097146098146099146100146101146102146103146104146105146106146107146108146109146110146111146112146113146114146115146116146117146118146119146120146121146122146123146124146125146126146127146128146129146130146131146132146133146134146135146136146137146138146139146140146141146142146143146144146145146146146147146148146149146150146151146152146153146154146155146156146157146158146159146160146161146162146163146164146165146166146167146168146169146170146171146172146173146174146175146176146177146178146179146180146181146182146183146184146185146186146187146188146189146190146191146192146193146194146195146196146197146198146199146200146201146202146203146204146205146206146207146208146209146210146211146212146213146214146215146216146217146218146219146220146221146222146223146224146225146226146227146228146229146230146231146232146233146234146235146236146237146238146239146240146241146242146243146244146245146246146247146248146249146250146251146252146253146254146255146256146257146258146259146260146261146262146263146264146265146266146267146268146269146270146271146272146273146274146275146276146277146278146279146280146281146282146283146284146285146286146287146288146289146290146291146292146293146294146295146296146297146298146299146300146301146302146303146304146305146306146307146308146309146310146311146312146313146314146315146316146317146318146319146320146321146322146323146324146325146326146327146328146329146330146331146332146333146334146335146336146337146338146339146340146341146342146343146344146345146346146347146348146349146350146351146352146353146354146355146356146357146358146359146360146361146362146363146364146365146366146367146368146369146370146371146372146373146374146375146376146377146378146379146380146381146382146383146384146385146386146387146388146389146390146391146392146393146394146395146396146397146398146399146400146401146402146403146404146405146406146407146408146409146410146411146412146413146414146415146416146417146418146419146420146421146422146423146424146425146426146427146428146429146430146431146432146433146434146435146436146437146438146439146440146441146442146443146444146445146446146447146448146449146450146451146452146453146454146455146456146457146458146459146460146461146462146463146464146465146466146467146468146469146470146471146472146473146474146475146476146477146478146479146480146481146482146483146484146485146486146487146488146489146490146491146492146493146494146495146496146497146498146499146500146501146502146503146504146505146506146507146508146509146510146511146512146513146514146515146516146517146518146519146520146521146522146523146524146525146526146527146528146529146530146531146532146533146534146535146536146537146538146539146540146541146542146543146544146545146546146547146548146549146550146551146552146553146554146555146556146557146558146559146560146561146562146563146564146565146566146567146568146569146570146571146572146573146574146575146576146577146578146579146580146581146582146583146584146585146586146587146588146589146590146591146592146593146594146595146596146597146598146599146600146601146602146603146604146605146606146607146608146609146610146611146612146613146614146615146616146617146618146619146620146621146622146623146624146625146626146627146628146629146630146631146632146633146634146635146636146637146638146639146640146641146642146643146644146645146646146647146648146649146650146651146652146653146654146655146656146657146658146659146660146661146662146663146664146665146666146667146668146669146670146671146672146673146674146675146676146677146678146679146680146681146682146683146684146685146686146687146688146689146690146691146692146693146694146695146696146697146698146699146700146701146702146703146704146705146706146707146708146709146710146711146712146713146714146715146716146717146718146719146720146721146722146723146724146725146726146727146728146729146730146731146732146733146734146735146736146737146738146739146740146741146742146743146744146745146746146747146748146749146750146751146752146753146754146755146756146757146758146759146760146761146762146763146764146765146766146767146768146769146770146771146772146773146774146775146776146777146778146779146780146781146782146783146784146785146786146787146788146789146790146791146792146793146794146795146796146797146798146799146800146801146802146803146804146805146806146807146808146809146810146811146812146813146814146815146816146817146818146819146820146821146822146823146824146825146826146827146828146829146830146831146832146833146834146835146836146837146838146839146840146841146842146843146844146845146846146847146848146849146850146851146852146853146854146855146856146857146858146859146860146861146862146863146864146865146866146867146868146869146870146871146872146873146874146875146876146877146878146879146880146881146882146883146884146885146886146887146888146889146890146891146892146893146894146895146896146897146898146899146900146901146902146903146904146905146906146907146908146909146910146911146912146913146914146915146916146917146918146919146920146921146922146923146924146925146926146927146928146929146930146931146932146933146934146935146936146937146938146939146940146941146942146943146944146945146946146947146948146949146950146951146952146953146954146955146956146957146958146959146960146961146962146963146964146965146966146967146968146969146970146971146972146973146974146975146976146977146978146979146980146981146982146983146984146985146986146987146988146989146990146991146992146993146994146995146996146997146998146999147000147001147002147003147004147005147006147007147008147009147010147011147012147013147014147015147016147017147018147019147020147021147022147023147024147025147026147027147028147029147030147031147032147033147034147035147036147037147038147039147040147041147042147043147044147045147046147047147048147049147050147051147052147053147054147055147056147057147058147059147060147061147062147063147064147065147066147067147068147069147070147071147072147073147074147075147076147077147078147079147080147081147082147083147084147085147086147087147088147089147090147091147092147093147094147095147096147097147098147099147100147101147102147103147104147105147106147107147108147109147110147111147112147113147114147115147116147117147118147119147120147121147122147123147124147125147126147127147128147129147130147131147132147133147134147135147136147137147138147139147140147141147142147143147144147145147146147147147148147149147150147151147152147153147154147155147156147157147158147159147160147161147162147163147164147165147166147167147168147169147170147171147172147173147174147175147176147177147178147179147180147181147182147183147184147185147186147187147188147189147190147191147192147193147194147195147196147197147198147199147200147201147202147203147204147205147206147207147208147209147210147211147212147213147214147215147216147217147218147219147220147221147222147223147224147225147226147227147228147229147230147231147232147233147234147235147236147237147238147239147240147241147242147243147244147245147246147247147248147249147250147251147252147253147254147255147256147257147258147259147260147261147262147263147264147265147266147267147268147269147270147271147272147273147274147275147276147277147278147279147280147281147282147283147284147285147286147287147288147289147290147291147292147293147294147295147296147297147298147299147300147301147302147303147304147305147306147307147308147309147310147311147312147313147314147315147316147317147318147319147320147321147322147323147324147325147326147327147328147329147330147331147332147333147334147335147336147337147338147339147340147341147342147343147344147345147346147347147348147349147350147351147352147353147354147355147356147357147358147359147360147361147362147363147364147365147366147367147368147369147370147371147372147373147374147375147376147377147378147379147380147381147382147383147384147385147386147387147388147389147390147391147392147393147394147395147396147397147398147399147400147401147402147403147404147405147406147407147408147409147410147411147412147413147414147415147416147417147418147419147420147421147422147423147424147425147426147427147428147429147430147431147432147433147434147435147436147437147438147439147440147441147442147443147444147445147446147447147448147449147450147451147452147453147454147455147456147457147458147459147460147461147462147463147464147465147466147467147468147469147470147471147472147473147474147475147476147477147478147479147480147481147482147483147484147485147486147487147488147489147490147491147492147493147494147495147496147497147498147499147500147501147502147503147504147505147506147507147508147509147510147511147512147513147514147515147516147517147518147519147520147521147522147523147524147525147526147527147528147529147530147531147532147533147534147535147536147537147538147539147540147541147542147543147544147545147546147547147548147549147550147551147552147553147554147555147556147557147558147559147560147561147562147563147564147565147566147567147568147569147570147571147572147573147574147575147576147577147578147579147580147581147582147583147584147585147586147587147588147589147590147591147592147593147594147595147596147597147598147599147600147601147602147603147604147605147606147607147608147609147610147611147612147613147614147615147616147617147618147619147620147621147622147623147624147625147626147627147628147629147630147631147632147633147634147635147636147637147638147639147640147641147642147643147644147645147646147647147648147649147650147651147652147653147654147655147656147657147658147659147660147661147662147663147664147665147666147667147668147669147670147671147672147673147674147675147676147677147678147679147680147681147682147683147684147685147686147687147688147689147690147691147692147693147694147695147696147697147698147699147700147701147702147703147704147705147706147707147708147709147710147711147712147713147714147715147716147717147718147719147720147721147722147723147724147725147726147727147728147729147730147731147732147733147734147735147736147737147738147739147740147741147742147743147744147745147746147747147748147749147750147751147752147753147754147755147756147757147758147759147760147761147762147763147764147765147766147767147768147769147770147771147772147773147774147775147776147777147778147779147780147781147782147783147784147785147786147787147788147789147790147791147792147793147794147795147796147797147798147799147800147801147802147803147804147805147806147807147808147809147810147811147812147813147814147815147816147817147818147819147820147821147822147823147824147825147826147827147828147829147830147831147832147833147834147835147836147837147838147839147840147841147842147843147844147845147846147847147848147849147850147851147852147853147854147855147856147857147858147859147860147861147862147863147864147865147866147867147868147869147870147871147872147873147874147875147876147877147878147879147880147881147882147883147884147885147886147887147888147889147890147891147892147893147894147895147896147897147898147899147900147901147902147903147904147905147906147907147908147909147910147911147912147913147914147915147916147917147918147919147920147921147922147923147924147925147926147927147928147929147930147931147932147933147934147935147936147937147938147939147940147941147942147943147944147945147946147947147948147949147950147951147952147953147954147955147956147957147958147959147960147961147962147963147964147965147966147967147968147969147970147971147972147973147974147975147976147977147978147979147980147981147982147983147984147985147986147987147988147989147990147991147992147993147994147995147996147997147998147999148000148001148002148003148004148005148006148007148008148009148010148011148012148013148014148015148016148017148018148019148020148021148022148023148024148025148026148027148028148029148030148031148032148033148034148035148036148037148038148039148040148041148042148043148044148045148046148047148048148049148050148051148052148053148054148055148056148057148058148059148060148061148062148063148064148065148066148067148068148069148070148071148072148073148074148075148076148077148078148079148080148081148082148083148084148085148086148087148088148089148090148091148092148093148094148095148096148097148098148099148100148101148102148103148104148105148106148107148108148109148110148111148112148113148114148115148116148117148118148119148120148121148122148123148124148125148126148127148128148129148130148131148132148133148134148135148136148137148138148139148140148141148142148143148144148145148146148147148148148149148150148151148152148153148154148155148156148157148158148159148160148161148162148163148164148165148166148167148168148169148170148171148172148173148174148175148176148177148178148179148180148181148182148183148184148185148186148187148188148189148190148191148192148193148194148195148196148197148198148199148200148201148202148203148204148205148206148207148208148209148210148211148212148213148214148215148216148217148218148219148220148221148222148223148224148225148226148227148228148229148230148231148232148233148234148235148236148237148238148239148240148241148242148243148244148245148246148247148248148249148250148251148252148253148254148255148256148257148258148259148260148261148262148263148264148265148266148267148268148269148270148271148272148273148274148275148276148277148278148279148280148281148282148283148284148285148286148287148288148289148290148291148292148293148294148295148296148297148298148299148300148301148302148303148304148305148306148307148308148309148310148311148312148313148314148315148316148317148318148319148320148321148322148323148324148325148326148327148328148329148330148331148332148333148334148335148336148337148338148339148340148341148342148343148344148345148346148347148348148349148350148351148352148353148354148355148356148357148358148359148360148361148362148363148364148365148366148367148368148369148370148371148372148373148374148375148376148377148378148379148380148381148382148383148384148385148386148387148388148389148390148391148392148393148394148395148396148397148398148399148400148401148402148403148404148405148406148407148408148409148410148411148412148413148414148415148416148417148418148419148420148421148422148423148424148425148426148427148428148429148430148431148432148433148434148435148436148437148438148439148440148441148442148443148444148445148446148447148448148449148450148451148452148453148454148455148456148457148458148459148460148461148462148463148464148465148466148467148468148469148470148471148472148473148474148475148476148477148478148479148480148481148482148483148484148485148486148487148488148489148490148491148492148493148494148495148496148497148498148499148500148501148502148503148504148505148506148507148508148509148510148511148512148513148514148515148516148517148518148519148520148521148522148523148524148525148526148527148528148529148530148531148532148533148534148535148536148537148538148539148540148541148542148543148544148545148546148547148548148549148550148551148552148553148554148555148556148557148558148559148560148561148562148563148564148565148566148567148568148569148570148571148572148573148574148575148576148577148578148579148580148581148582148583148584148585148586148587148588148589148590148591148592148593148594148595148596148597148598148599148600148601148602148603148604148605148606148607148608148609148610148611148612148613148614148615148616148617148618148619148620148621148622148623148624148625148626148627148628148629148630148631148632148633148634148635148636148637148638148639148640148641148642148643148644148645148646148647148648148649148650148651148652148653148654148655148656148657148658148659148660148661148662148663148664148665148666148667148668148669148670148671148672148673148674148675148676148677148678148679148680148681148682148683148684148685148686148687148688148689148690148691148692148693148694148695148696148697148698148699148700148701148702148703148704148705148706148707148708148709148710148711148712148713148714148715148716148717148718148719148720148721148722148723148724148725148726148727148728148729148730148731148732148733148734148735148736148737148738148739148740148741148742148743148744148745148746148747148748148749148750148751148752148753148754148755148756148757148758148759148760148761148762148763148764148765148766148767148768148769148770148771148772148773148774148775148776148777148778148779148780148781148782148783148784148785148786148787148788148789148790148791148792148793148794148795148796148797148798148799148800148801148802148803148804148805148806148807148808148809148810148811148812148813148814148815148816148817148818148819148820148821148822148823148824148825148826148827148828148829148830148831148832148833148834148835148836148837148838148839148840148841148842148843148844148845148846148847148848148849148850148851148852148853148854148855148856148857148858148859148860148861148862148863148864148865148866148867148868148869148870148871148872148873148874148875148876148877148878148879148880148881148882148883148884148885148886148887148888148889148890148891148892148893148894148895148896148897148898148899148900148901148902148903148904148905148906148907148908148909148910148911148912148913148914148915148916148917148918148919148920148921148922148923148924148925148926148927148928148929148930148931148932148933148934148935148936148937148938148939148940148941148942148943148944148945148946148947148948148949148950148951148952148953148954148955148956148957148958148959148960148961148962148963148964148965148966148967148968148969148970148971148972148973148974148975148976148977148978148979148980148981148982148983148984148985148986148987148988148989148990148991148992148993148994148995148996148997148998148999149000149001149002149003149004149005149006149007149008149009149010149011149012149013149014149015149016149017149018149019149020149021149022149023149024149025149026149027149028149029149030149031149032149033149034149035149036149037149038149039149040149041149042149043149044149045149046149047149048149049149050149051149052149053149054149055149056149057149058149059149060149061149062149063149064149065149066149067149068149069149070149071149072149073149074149075149076149077149078149079149080149081149082149083149084149085149086149087149088149089149090149091149092149093149094149095149096149097149098149099149100149101149102149103149104149105149106149107149108149109149110149111149112149113149114149115149116149117149118149119149120149121149122149123149124149125149126149127149128149129149130149131149132149133149134149135149136149137149138149139149140149141149142149143149144149145149146149147149148149149149150149151149152149153149154149155149156149157149158149159149160149161149162149163149164149165149166149167149168149169149170149171149172149173149174149175149176149177149178149179149180149181149182149183149184149185149186149187149188149189149190149191149192149193149194149195149196149197149198149199149200149201149202149203149204149205149206149207149208149209149210149211149212149213149214149215149216149217149218149219149220149221149222149223149224149225149226149227149228149229149230149231149232149233149234149235149236149237149238149239149240149241149242149243149244149245149246149247149248149249149250149251149252149253149254149255149256149257149258149259149260149261149262149263149264149265149266149267149268149269149270149271149272149273149274149275149276149277149278149279149280149281149282149283149284149285149286149287149288149289149290149291149292149293149294149295149296149297149298149299149300149301149302149303149304149305149306149307149308149309149310149311149312149313149314149315149316149317149318149319149320149321149322149323149324149325149326149327149328149329149330149331149332149333149334149335149336149337149338149339149340149341149342149343149344149345149346149347149348149349149350149351149352149353149354149355149356149357149358149359149360149361149362149363149364149365149366149367149368149369149370149371149372149373149374149375149376149377149378149379149380149381149382149383149384149385149386149387149388149389149390149391149392149393149394149395149396149397149398149399149400149401149402149403149404149405149406149407149408149409149410149411149412149413149414149415149416149417149418149419149420149421149422149423149424149425149426149427149428149429149430149431149432149433149434149435149436149437149438149439149440149441149442149443149444149445149446149447149448149449149450149451149452149453149454149455149456149457149458149459149460149461149462149463149464149465149466149467149468149469149470149471149472149473149474149475149476149477149478149479149480149481149482149483149484149485149486149487149488149489149490149491149492149493149494149495149496149497149498149499149500149501149502149503149504149505149506149507149508149509149510149511149512149513149514149515149516149517149518149519149520149521149522149523149524149525149526149527149528149529149530149531149532149533149534149535149536149537149538149539149540149541149542149543149544149545149546149547149548149549149550149551149552149553149554149555149556149557149558149559149560149561149562149563149564149565149566149567149568149569149570149571149572149573149574149575149576149577149578149579149580149581149582149583149584149585149586149587149588149589149590149591149592149593149594149595149596149597149598149599149600149601149602149603149604149605149606149607149608149609149610149611149612149613149614149615149616149617149618149619149620149621149622149623149624149625149626149627149628149629149630149631149632149633149634149635149636149637149638149639149640149641149642149643149644149645149646149647149648149649149650149651149652149653149654149655149656149657149658149659149660149661149662149663149664149665149666149667149668149669149670149671149672149673149674149675149676149677149678149679149680149681149682149683149684149685149686149687149688149689149690149691149692149693149694149695149696149697149698149699149700149701149702149703149704149705149706149707149708149709149710149711149712149713149714149715149716149717149718149719149720149721149722149723149724149725149726149727149728149729149730149731149732149733149734149735149736149737149738149739149740149741149742149743149744149745149746149747149748149749149750149751149752149753149754149755149756149757149758149759149760149761149762149763149764149765149766149767149768149769149770149771149772149773149774149775149776149777149778149779149780149781149782149783149784149785149786149787149788149789149790149791149792149793149794149795149796149797149798149799149800149801149802149803149804149805149806149807149808149809149810149811149812149813149814149815149816149817149818149819149820149821149822149823149824149825149826149827149828149829149830149831149832149833149834149835149836149837149838149839149840149841149842149843149844149845149846149847149848149849149850149851149852149853149854149855149856149857149858149859149860149861149862149863149864149865149866149867149868149869149870149871149872149873149874149875149876149877149878149879149880149881149882149883149884149885149886149887149888149889149890149891149892149893149894149895149896149897149898149899149900149901149902149903149904149905149906149907149908149909149910149911149912149913149914149915149916149917149918149919149920149921149922149923149924149925149926149927149928149929149930149931149932149933149934149935149936149937149938149939149940149941149942149943149944149945149946149947149948149949149950149951149952149953149954149955149956149957149958149959149960149961149962149963149964149965149966149967149968149969149970149971149972149973149974149975149976149977149978149979149980149981149982149983149984149985149986149987149988149989149990149991149992149993149994149995149996149997149998149999150000150001150002150003150004150005150006150007150008150009150010150011150012150013150014150015150016150017150018150019150020150021150022150023150024150025150026150027150028150029150030150031150032150033150034150035150036150037150038150039150040150041150042150043150044150045150046150047150048150049150050150051150052150053150054150055150056150057150058150059150060150061150062150063150064150065150066150067150068150069150070150071150072150073150074150075150076150077150078150079150080150081150082150083150084150085150086150087150088150089150090150091150092150093150094150095150096150097150098150099150100150101150102150103150104150105150106150107150108150109150110150111150112150113150114150115150116150117150118150119150120150121150122150123150124150125150126150127150128150129150130150131150132150133150134150135150136150137150138150139150140150141150142150143150144150145150146150147150148150149150150150151150152150153150154150155150156150157150158150159150160150161150162150163150164150165150166150167150168150169150170150171150172150173150174150175150176150177150178150179150180150181150182150183150184150185150186150187150188150189150190150191150192150193150194150195150196150197150198150199150200150201150202150203150204150205150206150207150208150209150210150211150212150213150214150215150216150217150218150219150220150221150222150223150224150225150226150227150228150229150230150231150232150233150234150235150236150237150238150239150240150241150242150243150244150245150246150247150248150249150250150251150252150253150254150255150256150257150258150259150260150261150262150263150264150265150266150267150268150269150270150271150272150273150274150275150276150277150278150279150280150281150282150283150284150285150286150287150288150289150290150291150292150293150294150295150296150297150298150299150300150301150302150303150304150305150306150307150308150309150310150311150312150313150314150315150316150317150318150319150320150321150322150323150324150325150326150327150328150329150330150331150332150333150334150335150336150337150338150339150340150341150342150343150344150345150346150347150348150349150350150351150352150353150354150355150356150357150358150359150360150361150362150363150364150365150366150367150368150369150370150371150372150373150374150375150376150377150378150379150380150381150382150383150384150385150386150387150388150389150390150391150392150393150394150395150396150397150398150399150400150401150402150403150404150405150406150407150408150409150410150411150412150413150414150415150416150417150418150419150420150421150422150423150424150425150426150427150428150429150430150431150432150433150434150435150436150437150438150439150440150441150442150443150444150445150446150447150448150449150450150451150452150453150454150455150456150457150458150459150460150461150462150463150464150465150466150467150468150469150470150471150472150473150474150475150476150477150478150479150480150481150482150483150484150485150486150487150488150489150490150491150492150493150494150495150496150497150498150499150500150501150502150503150504150505150506150507150508150509150510150511150512150513150514150515150516150517150518150519150520150521150522150523150524150525150526150527150528150529150530150531150532150533150534150535150536150537150538150539150540150541150542150543150544150545150546150547150548150549150550150551150552150553150554150555150556150557150558150559150560150561150562150563150564150565150566150567150568150569150570150571150572150573150574150575150576150577150578150579150580150581150582150583150584150585150586150587150588150589150590150591150592150593150594150595150596150597150598150599150600150601150602150603150604150605150606150607150608150609150610150611150612150613150614150615150616150617150618150619150620150621150622150623150624150625150626150627150628150629150630150631150632150633150634150635150636150637150638150639150640150641150642150643150644150645150646150647150648150649150650150651150652150653150654150655150656150657150658150659150660150661150662150663150664150665150666150667150668150669150670150671150672150673150674150675150676150677150678150679150680150681150682150683150684150685150686150687150688150689150690150691150692150693150694150695150696150697150698150699150700150701150702150703150704150705150706150707150708150709150710150711150712150713150714150715150716150717150718150719150720150721150722150723150724150725150726150727150728150729150730150731150732150733150734150735150736150737150738150739150740150741150742150743150744150745150746150747150748150749150750150751150752150753150754150755150756150757150758150759150760150761150762150763150764150765150766150767150768150769150770150771150772150773150774150775150776150777150778150779150780150781150782150783150784150785150786150787150788150789150790150791150792150793150794150795150796150797150798150799150800150801150802150803150804150805150806150807150808150809150810150811150812150813150814150815150816150817150818150819150820150821150822150823150824150825150826150827150828150829150830150831150832150833150834150835150836150837150838150839150840150841150842150843150844150845150846150847150848150849150850150851150852150853150854150855150856150857150858150859150860150861150862150863150864150865150866150867150868150869150870150871150872150873150874150875150876150877150878150879150880150881150882150883150884150885150886150887150888150889150890150891150892150893150894150895150896150897150898150899150900150901150902150903150904150905150906150907150908150909150910150911150912150913150914150915150916150917150918150919150920150921150922150923150924150925150926150927150928150929150930150931150932150933150934150935150936150937150938150939150940150941150942150943150944150945150946150947150948150949150950150951150952150953150954150955150956150957150958150959150960150961150962150963150964150965150966150967150968150969150970150971150972150973150974150975150976150977150978150979150980150981150982150983150984150985150986150987150988150989150990150991150992150993150994150995150996150997150998150999151000151001151002151003151004151005151006151007151008151009151010151011151012151013151014151015151016151017151018151019151020151021151022151023151024151025151026151027151028151029151030151031151032151033151034151035151036151037151038151039151040151041151042151043151044151045151046151047151048151049151050151051151052151053151054151055151056151057151058151059151060151061151062151063151064151065151066151067151068151069151070151071151072151073151074151075151076151077151078151079151080151081151082151083151084151085151086151087151088151089151090151091151092151093151094151095151096151097151098151099151100151101151102151103151104151105151106151107151108151109151110151111151112151113151114151115151116151117151118151119151120151121151122151123151124151125151126151127151128151129151130151131151132151133151134151135151136151137151138151139151140151141151142151143151144151145151146151147151148151149151150151151151152151153151154151155151156151157151158151159151160151161151162151163151164151165151166151167151168151169151170151171151172151173151174151175151176151177151178151179151180151181151182151183151184151185151186151187151188151189151190151191151192151193151194151195151196151197151198151199151200151201151202151203151204151205151206151207151208151209151210151211151212151213151214151215151216151217151218151219151220151221151222151223151224151225151226151227151228151229151230151231151232151233151234151235151236151237151238151239151240151241151242151243151244151245151246151247151248151249151250151251151252151253151254151255151256151257151258151259151260151261151262151263151264151265151266151267151268151269151270151271151272151273151274151275151276151277151278151279151280151281151282151283151284151285151286151287151288151289151290151291151292151293151294151295151296151297151298151299151300151301151302151303151304151305151306151307151308151309151310151311151312151313151314151315151316151317151318151319151320151321151322151323151324151325151326151327151328151329151330151331151332151333151334151335151336151337151338151339151340151341151342151343151344151345151346151347151348151349151350151351151352151353151354151355151356151357151358151359151360151361151362151363151364151365151366151367151368151369151370151371151372151373151374151375151376151377151378151379151380151381151382151383151384151385151386151387151388151389151390151391151392151393151394151395151396151397151398151399151400151401151402151403151404151405151406151407151408151409151410151411151412151413151414151415151416151417151418151419151420151421151422151423151424151425151426151427151428151429151430151431151432151433151434151435151436151437151438151439151440151441151442151443151444151445151446151447151448151449151450151451151452151453151454151455151456151457151458151459151460151461151462151463151464151465151466151467151468151469151470151471151472151473151474151475151476151477151478151479151480151481151482151483151484151485151486151487151488151489151490151491151492151493151494151495151496151497151498151499151500151501151502151503151504151505151506151507151508151509151510151511151512151513151514151515151516151517151518151519151520151521151522151523151524151525151526151527151528151529151530151531151532151533151534151535151536151537151538151539151540151541151542151543151544151545151546151547151548151549151550151551151552151553151554151555151556151557151558151559151560151561151562151563151564151565151566151567151568151569151570151571151572151573151574151575151576151577151578151579151580151581151582151583151584151585151586151587151588151589151590151591151592151593151594151595151596151597151598151599151600151601151602151603151604151605151606151607151608151609151610151611151612151613151614151615151616151617151618151619151620151621151622151623151624151625151626151627151628151629151630151631151632151633151634151635151636151637151638151639151640151641151642151643151644151645151646151647151648151649151650151651151652151653151654151655151656151657151658151659151660151661151662151663151664151665151666151667151668151669151670151671151672151673151674151675151676151677151678151679151680151681151682151683151684151685151686151687151688151689151690151691151692151693151694151695151696151697151698151699151700151701151702151703151704151705151706151707151708151709151710151711151712151713151714151715151716151717151718151719151720151721151722151723151724151725151726151727151728151729151730151731151732151733151734151735151736151737151738151739151740151741151742151743151744151745151746151747151748151749151750151751151752151753151754151755151756151757151758151759151760151761151762151763151764151765151766151767151768151769151770151771151772151773151774151775151776151777151778151779151780151781151782151783151784151785151786151787151788151789151790151791151792151793151794151795151796151797151798151799151800151801151802151803151804151805151806151807151808151809151810151811151812151813151814151815151816151817151818151819151820151821151822151823151824151825151826151827151828151829151830151831151832151833151834151835151836151837151838151839151840151841151842151843151844151845151846151847151848151849151850151851151852151853151854151855151856151857151858151859151860151861151862151863151864151865151866151867151868151869151870151871151872151873151874151875151876151877151878151879151880151881151882151883151884151885151886151887151888151889151890151891151892151893151894151895151896151897151898151899151900151901151902151903151904151905151906151907151908151909151910151911151912151913151914151915151916151917151918151919151920151921151922151923151924151925151926151927151928151929151930151931151932151933151934151935151936151937151938151939151940151941151942151943151944151945151946151947151948151949151950151951151952151953151954151955151956151957151958151959151960151961151962151963151964151965151966151967151968151969151970151971151972151973151974151975151976151977151978151979151980151981151982151983151984151985151986151987151988151989151990151991151992151993151994151995151996151997151998151999152000152001152002152003152004152005152006152007152008152009152010152011152012152013152014152015152016152017152018152019152020152021152022152023152024152025152026152027152028152029152030152031152032152033152034152035152036152037152038152039152040152041152042152043152044152045152046152047152048152049152050152051152052152053152054152055152056152057152058152059152060152061152062152063152064152065152066152067152068152069152070152071152072152073152074152075152076152077152078152079152080152081152082152083152084152085152086152087152088152089152090152091152092152093152094152095152096152097152098152099152100152101152102152103152104152105152106152107152108152109152110152111152112152113152114152115152116152117152118152119152120152121152122152123152124152125152126152127152128152129152130152131152132152133152134152135152136152137152138152139152140152141152142152143152144152145152146152147152148152149152150152151152152152153152154152155152156152157152158152159152160152161152162152163152164152165152166152167152168152169152170152171152172152173152174152175152176152177152178152179152180152181152182152183152184152185152186152187152188152189152190152191152192152193152194152195152196152197152198152199152200152201152202152203152204152205152206152207152208152209152210152211152212152213152214152215152216152217152218152219152220152221152222152223152224152225152226152227152228152229152230152231152232152233152234152235152236152237152238152239152240152241152242152243152244152245152246152247152248152249152250152251152252152253152254152255152256152257152258152259152260152261152262152263152264152265152266152267152268152269152270152271152272152273152274152275152276152277152278152279152280152281152282152283152284152285152286152287152288152289152290152291152292152293152294152295152296152297152298152299152300152301152302152303152304152305152306152307152308152309152310152311152312152313152314152315152316152317152318152319152320152321152322152323152324152325152326152327152328152329152330152331152332152333152334152335152336152337152338152339152340152341152342152343152344152345152346152347152348152349152350152351152352152353152354152355152356152357152358152359152360152361152362152363152364152365152366152367152368152369152370152371152372152373152374152375152376152377152378152379152380152381152382152383152384152385152386152387152388152389152390152391152392152393152394152395152396152397152398152399152400152401152402152403152404152405152406152407152408152409152410152411152412152413152414152415152416152417152418152419152420152421152422152423152424152425152426152427152428152429152430152431152432152433152434152435152436152437152438152439152440152441152442152443152444152445152446152447152448152449152450152451152452152453152454152455152456152457152458152459152460152461152462152463152464152465152466152467152468152469152470152471152472152473152474152475152476152477152478152479152480152481152482152483152484152485152486152487152488152489152490152491152492152493152494152495152496152497152498152499152500152501152502152503152504152505152506152507152508152509152510152511152512152513152514152515152516152517152518152519152520152521152522152523152524152525152526152527152528152529152530152531152532152533152534152535152536152537152538152539152540152541152542152543152544152545152546152547152548152549152550152551152552152553152554152555152556152557152558152559152560152561152562152563152564152565152566152567152568152569152570152571152572152573152574152575152576152577152578152579152580152581152582152583152584152585152586152587152588152589152590152591152592152593152594152595152596152597152598152599152600152601152602152603152604152605152606152607152608152609152610152611152612152613152614152615152616152617152618152619152620152621152622152623152624152625152626152627152628152629152630152631152632152633152634152635152636152637152638152639152640152641152642152643152644152645152646152647152648152649152650152651152652152653152654152655152656152657152658152659152660152661152662152663152664152665152666152667152668152669152670152671152672152673152674152675152676152677152678152679152680152681152682152683152684152685152686152687152688152689152690152691152692152693152694152695152696152697152698152699152700152701152702152703152704152705152706152707152708152709152710152711152712152713152714152715152716152717152718152719152720152721152722152723152724152725152726152727152728152729152730152731152732152733152734152735152736152737152738152739152740152741152742152743152744152745152746152747152748152749152750152751152752152753152754152755152756152757152758152759152760152761152762152763152764152765152766152767152768152769152770152771152772152773152774152775152776152777152778152779152780152781152782152783152784152785152786152787152788152789152790152791152792152793152794152795152796152797152798152799152800152801152802152803152804152805152806152807152808152809152810152811152812152813152814152815152816152817152818152819152820152821152822152823152824152825152826152827152828152829152830152831152832152833152834152835152836152837152838152839152840152841152842152843152844152845152846152847152848152849152850152851152852152853152854152855152856152857152858152859152860152861152862152863152864152865152866152867152868152869152870152871152872152873152874152875152876152877152878152879152880152881152882152883152884152885152886152887152888152889152890152891152892152893152894152895152896152897152898152899152900152901152902152903152904152905152906152907152908152909152910152911152912152913152914152915152916152917152918152919152920152921152922152923152924152925152926152927152928152929152930152931152932152933152934152935152936152937152938152939152940152941152942152943152944152945152946152947152948152949152950152951152952152953152954152955152956152957152958152959152960152961152962152963152964152965152966152967152968152969152970152971152972152973152974152975152976152977152978152979152980152981152982152983152984152985152986152987152988152989152990152991152992152993152994152995152996152997152998152999153000153001153002153003153004153005153006153007153008153009153010153011153012153013153014153015153016153017153018153019153020153021153022153023153024153025153026153027153028153029153030153031153032153033153034153035153036153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084153085153086153087153088153089153090153091153092153093153094153095153096153097153098153099153100153101153102153103153104153105153106153107153108153109153110153111153112153113153114153115153116153117153118153119153120153121153122153123153124153125153126153127153128153129153130153131153132153133153134153135153136153137153138153139153140153141153142153143153144153145153146153147153148153149153150153151153152153153153154153155153156153157153158153159153160153161153162153163153164153165153166153167153168153169153170153171153172153173153174153175153176153177153178153179153180153181153182153183153184153185153186153187153188153189153190153191153192153193153194153195153196153197153198153199153200153201153202153203153204153205153206153207153208153209153210153211153212153213153214153215153216153217153218153219153220153221153222153223153224153225153226153227153228153229153230153231153232153233153234153235153236153237153238153239153240153241153242153243153244153245153246153247153248153249153250153251153252153253153254153255153256153257153258153259153260153261153262153263153264153265153266153267153268153269153270153271153272153273153274153275153276153277153278153279153280153281153282153283153284153285153286153287153288153289153290153291153292153293153294153295153296153297153298153299153300153301153302153303153304153305153306153307153308153309153310153311153312153313153314153315153316153317153318153319153320153321153322153323153324153325153326153327153328153329153330153331153332153333153334153335153336153337153338153339153340153341153342153343153344153345153346153347153348153349153350153351153352153353153354153355153356153357153358153359153360153361153362153363153364153365153366153367153368153369153370153371153372153373153374153375153376153377153378153379153380153381153382153383153384153385153386153387153388153389153390153391153392153393153394153395153396153397153398153399153400153401153402153403153404153405153406153407153408153409153410153411153412153413153414153415153416153417153418153419153420153421153422153423153424153425153426153427153428153429153430153431153432153433153434153435153436153437153438153439153440153441153442153443153444153445153446153447153448153449153450153451153452153453153454153455153456153457153458153459153460153461153462153463153464153465153466153467153468153469153470153471153472153473153474153475153476153477153478153479153480153481153482153483153484153485153486153487153488153489153490153491153492153493153494153495153496153497153498153499153500153501153502153503153504153505153506153507153508153509153510153511153512153513153514153515153516153517153518153519153520153521153522153523153524153525153526153527153528153529153530153531153532153533153534153535153536153537153538153539153540153541153542153543153544153545153546153547153548153549153550153551153552153553153554153555153556153557153558153559153560153561153562153563153564153565153566153567153568153569153570153571153572153573153574153575153576153577153578153579153580153581153582153583153584153585153586153587153588153589153590153591153592153593153594153595153596153597153598153599153600153601153602153603153604153605153606153607153608153609153610153611153612153613153614153615153616153617153618153619153620153621153622153623153624153625153626153627153628153629153630153631153632153633153634153635153636153637153638153639153640153641153642153643153644153645153646153647153648153649153650153651153652153653153654153655153656153657153658153659153660153661153662153663153664153665153666153667153668153669153670153671153672153673153674153675153676153677153678153679153680153681153682153683153684153685153686153687153688153689153690153691153692153693153694153695153696153697153698153699153700153701153702153703153704153705153706153707153708153709153710153711153712153713153714153715153716153717153718153719153720153721153722153723153724153725153726153727153728153729153730153731153732153733153734153735153736153737153738153739153740153741153742153743153744153745153746153747153748153749153750153751153752153753153754153755153756153757153758153759153760153761153762153763153764153765153766153767153768153769153770153771153772153773153774153775153776153777153778153779153780153781153782153783153784153785153786153787153788153789153790153791153792153793153794153795153796153797153798153799153800153801153802153803153804153805153806153807153808153809153810153811153812153813153814153815153816153817153818153819153820153821153822153823153824153825153826153827153828153829153830153831153832153833153834153835153836153837153838153839153840153841153842153843153844153845153846153847153848153849153850153851153852153853153854153855153856153857153858153859153860153861153862153863153864153865153866153867153868153869153870153871153872153873153874153875153876153877153878153879153880153881153882153883153884153885153886153887153888153889153890153891153892153893153894153895153896153897153898153899153900153901153902153903153904153905153906153907153908153909153910153911153912153913153914153915153916153917153918153919153920153921153922153923153924153925153926153927153928153929153930153931153932153933153934153935153936153937153938153939153940153941153942153943153944153945153946153947153948153949153950153951153952153953153954153955153956153957153958153959153960153961153962153963153964153965153966153967153968153969153970153971153972153973153974153975153976153977153978153979153980153981153982153983153984153985153986153987153988153989153990153991153992153993153994153995153996153997153998153999154000154001154002154003154004154005154006154007154008154009154010154011154012154013154014154015154016154017154018154019154020154021154022154023154024154025154026154027154028154029154030154031154032154033154034154035154036154037154038154039154040154041154042154043154044154045154046154047154048154049154050154051154052154053154054154055154056154057154058154059154060154061154062154063154064154065154066154067154068154069154070154071154072154073154074154075154076154077154078154079154080154081154082154083154084154085154086154087154088154089154090154091154092154093154094154095154096154097154098154099154100154101154102154103154104154105154106154107154108154109154110154111154112154113154114154115154116154117154118154119154120154121154122154123154124154125154126154127154128154129154130154131154132154133154134154135154136154137154138154139154140154141154142154143154144154145154146154147154148154149154150154151154152154153154154154155154156154157154158154159154160154161154162154163154164154165154166154167154168154169154170154171154172154173154174154175154176154177154178154179154180154181154182154183154184154185154186154187154188154189154190154191154192154193154194154195154196154197154198154199154200154201154202154203154204154205154206154207154208154209154210154211154212154213154214154215154216154217154218154219154220154221154222154223154224154225154226154227154228154229154230154231154232154233154234154235154236154237154238154239154240154241154242154243154244154245154246154247154248154249154250154251154252154253154254154255154256154257154258154259154260154261154262154263154264154265154266154267154268154269154270154271154272154273154274154275154276154277154278154279154280154281154282154283154284154285154286154287154288154289154290154291154292154293154294154295154296154297154298154299154300154301154302154303154304154305154306154307154308154309154310154311154312154313154314154315154316154317154318154319154320154321154322154323154324154325154326154327154328154329154330154331154332154333154334154335154336154337154338154339154340154341154342154343154344154345154346154347154348154349154350154351154352154353154354154355154356154357154358154359154360154361154362154363154364154365154366154367154368154369154370154371154372154373154374154375154376154377154378154379154380154381154382154383154384154385154386154387154388154389154390154391154392154393154394154395154396154397154398154399154400154401154402154403154404154405154406154407154408154409154410154411154412154413154414154415154416154417154418154419154420154421154422154423154424154425154426154427154428154429154430154431154432154433154434154435154436154437154438154439154440154441154442154443154444154445154446154447154448154449154450154451154452154453154454154455154456154457154458154459154460154461154462154463154464154465154466154467154468154469154470154471154472154473154474154475154476154477154478154479154480154481154482154483154484154485154486154487154488154489154490154491154492154493154494154495154496154497154498154499154500154501154502154503154504154505154506154507154508154509154510154511154512154513154514154515154516154517154518154519154520154521154522154523154524154525154526154527154528154529154530154531154532154533154534154535154536154537154538154539154540154541154542154543154544154545154546154547154548154549154550154551154552154553154554154555154556154557154558154559154560154561154562154563154564154565154566154567154568154569154570154571154572154573154574154575154576154577154578154579154580154581154582154583154584154585154586154587154588154589154590154591154592154593154594154595154596154597154598154599154600154601154602154603154604154605154606154607154608154609154610154611154612154613154614154615154616154617154618154619154620154621154622154623154624154625154626154627154628154629154630154631154632154633154634154635154636154637154638154639154640154641154642154643154644154645154646154647154648154649154650154651154652154653154654154655154656154657154658154659154660154661154662154663154664154665154666154667154668154669154670154671154672154673154674154675154676154677154678154679154680154681154682154683154684154685154686154687154688154689154690154691154692154693154694154695154696154697154698154699154700154701154702154703154704154705154706154707154708154709154710154711154712154713154714154715154716154717154718154719154720154721154722154723154724154725154726154727154728154729154730154731154732154733154734154735154736154737154738154739154740154741154742154743154744154745154746154747154748154749154750154751154752154753154754154755154756154757154758154759154760154761154762154763154764154765154766154767154768154769154770154771154772154773154774154775154776154777154778154779154780154781154782154783154784154785154786154787154788154789154790154791154792154793154794154795154796154797154798154799154800154801154802154803154804154805154806154807154808154809154810154811154812154813154814154815154816154817154818154819154820154821154822154823154824154825154826154827154828154829154830154831154832154833154834154835154836154837154838154839154840154841154842154843154844154845154846154847154848154849154850154851154852154853154854154855154856154857154858154859154860154861154862154863154864154865154866154867154868154869154870154871154872154873154874154875154876154877154878154879154880154881154882154883154884154885154886154887154888154889154890154891154892154893154894154895154896154897154898154899154900154901154902154903154904154905154906154907154908154909154910154911154912154913154914154915154916154917154918154919154920154921154922154923154924154925154926154927154928154929154930154931154932154933154934154935154936154937154938154939154940154941154942154943154944154945154946154947154948154949154950154951154952154953154954154955154956154957154958154959154960154961154962154963154964154965154966154967154968154969154970154971154972154973154974154975154976154977154978154979154980154981154982154983154984154985154986154987154988154989154990154991154992154993154994154995154996154997154998154999155000155001155002155003155004155005155006155007155008155009155010155011155012155013155014155015155016155017155018155019155020155021155022155023155024155025155026155027155028155029155030155031155032155033155034155035155036155037155038155039155040155041155042155043155044155045155046155047155048155049155050155051155052155053155054155055155056155057155058155059155060155061155062155063155064155065155066155067155068155069155070155071155072155073155074155075155076155077155078155079155080155081155082155083155084155085155086155087155088155089155090155091155092155093155094155095155096155097155098155099155100155101155102155103155104155105155106155107155108155109155110155111155112155113155114155115155116155117155118155119155120155121155122155123155124155125155126155127155128155129155130155131155132155133155134155135155136155137155138155139155140155141155142155143155144155145155146155147155148155149155150155151155152155153155154155155155156155157155158155159155160155161155162155163155164155165155166155167155168155169155170155171155172155173155174155175155176155177155178155179155180155181155182155183155184155185155186155187155188155189155190155191155192155193155194155195155196155197155198155199155200155201155202155203155204155205155206155207155208155209155210155211155212155213155214155215155216155217155218155219155220155221155222155223155224155225155226155227155228155229155230155231155232155233155234155235155236155237155238155239155240155241155242155243155244155245155246155247155248155249155250155251155252155253155254155255155256155257155258155259155260155261155262155263155264155265155266155267155268155269155270155271155272155273155274155275155276155277155278155279155280155281155282155283155284155285155286155287155288155289155290155291155292155293155294155295155296155297155298155299155300155301155302155303155304155305155306155307155308155309155310155311155312155313155314155315155316155317155318155319155320155321155322155323155324155325155326155327155328155329155330155331155332155333155334155335155336155337155338155339155340155341155342155343155344155345155346155347155348155349155350155351155352155353155354155355155356155357155358155359155360155361155362155363155364155365155366155367155368155369155370155371155372155373155374155375155376155377155378155379155380155381155382155383155384155385155386155387155388155389155390155391155392155393155394155395155396155397155398155399155400155401155402155403155404155405155406155407155408155409155410155411155412155413155414155415155416155417155418155419155420155421155422155423155424155425155426155427155428155429155430155431155432155433155434155435155436155437155438155439155440155441155442155443155444155445155446155447155448155449155450155451155452155453155454155455155456155457155458155459155460155461155462155463155464155465155466155467155468155469155470155471155472155473155474155475155476155477155478155479155480155481155482155483155484155485155486155487155488155489155490155491155492155493155494155495155496155497155498155499155500155501155502155503155504155505155506155507155508155509155510155511155512155513155514155515155516155517155518155519155520155521155522155523155524155525155526155527155528155529155530155531155532155533155534155535155536155537155538155539155540155541155542155543155544155545155546155547155548155549155550155551155552155553155554155555155556155557155558155559155560155561155562155563155564155565155566155567155568155569155570155571155572155573155574155575155576155577155578155579155580155581155582155583155584155585155586155587155588155589155590155591155592155593155594155595155596155597155598155599155600155601155602155603155604155605155606155607155608155609155610155611155612155613155614155615155616155617155618155619155620155621155622155623155624155625155626155627155628155629155630155631155632155633155634155635155636155637155638155639155640155641155642155643155644155645155646155647155648155649155650155651155652155653155654155655155656155657155658155659155660155661155662155663155664155665155666155667155668155669155670155671155672155673155674155675155676155677155678155679155680155681155682155683155684155685155686155687155688155689155690155691155692155693155694155695155696155697155698155699155700155701155702155703155704155705155706155707155708155709155710155711155712155713155714155715155716155717155718155719155720155721155722155723155724155725155726155727155728155729155730155731155732155733155734155735155736155737155738155739155740155741155742155743155744155745155746155747155748155749155750155751155752155753155754155755155756155757155758155759155760155761155762155763155764155765155766155767155768155769155770155771155772155773155774155775155776155777155778155779155780155781155782155783155784155785155786155787155788155789155790155791155792155793155794155795155796155797155798155799155800155801155802155803155804155805155806155807155808155809155810155811155812155813155814155815155816155817155818155819155820155821155822155823155824155825155826155827155828155829155830155831155832155833155834155835155836155837155838155839155840155841155842155843155844155845155846155847155848155849155850155851155852155853155854155855155856155857155858155859155860155861155862155863155864155865155866155867155868155869155870155871155872155873155874155875155876155877155878155879155880155881155882155883155884155885155886155887155888155889155890155891155892155893155894155895155896155897155898155899155900155901155902155903155904155905155906155907155908155909155910155911155912155913155914155915155916155917155918155919155920155921155922155923155924155925155926155927155928155929155930155931155932155933155934155935155936155937155938155939155940155941155942155943155944155945155946155947155948155949155950155951155952155953155954155955155956155957155958155959155960155961155962155963155964155965155966155967155968155969155970155971155972155973155974155975155976155977155978155979155980155981155982155983155984155985155986155987155988155989155990155991155992155993155994155995155996155997155998155999156000156001156002156003156004156005156006156007156008156009156010156011156012156013156014156015156016156017156018156019156020156021156022156023156024156025156026156027156028156029156030156031156032156033156034156035156036156037156038156039156040156041156042156043156044156045156046156047156048156049156050156051156052156053156054156055156056156057156058156059156060156061156062156063156064156065156066156067156068156069156070156071156072156073156074156075156076156077156078156079156080156081156082156083156084156085156086156087156088156089156090156091156092156093156094156095156096156097156098156099156100156101156102156103156104156105156106156107156108156109156110156111156112156113156114156115156116156117156118156119156120156121156122156123156124156125156126156127156128156129156130156131156132156133156134156135156136156137156138156139156140156141156142156143156144156145156146156147156148156149156150156151156152156153156154156155156156156157156158156159156160156161156162156163156164156165156166156167156168156169156170156171156172156173156174156175156176156177156178156179156180156181156182156183156184156185156186156187156188156189156190156191156192156193156194156195156196156197156198156199156200156201156202156203156204156205156206156207156208156209156210156211156212156213156214156215156216156217156218156219156220156221156222156223156224156225156226156227156228156229156230156231156232156233156234156235156236156237156238156239156240156241156242156243156244156245156246156247156248156249156250156251156252156253156254156255156256156257156258156259156260156261156262156263156264156265156266156267156268156269156270156271156272156273156274156275156276156277156278156279156280156281156282156283156284156285156286156287156288156289156290156291156292156293156294156295156296156297156298156299156300156301156302156303156304156305156306156307156308156309156310156311156312156313156314156315156316156317156318156319156320156321156322156323156324156325156326156327156328156329156330156331156332156333156334156335156336156337156338156339156340156341156342156343156344156345156346156347156348156349156350156351156352156353156354156355156356156357156358156359156360156361156362156363156364156365156366156367156368156369156370156371156372156373156374156375156376156377156378156379156380156381156382156383156384156385156386156387156388156389156390156391156392156393156394156395156396156397156398156399156400156401156402156403156404156405156406156407156408156409156410156411156412156413156414156415156416156417156418156419156420156421156422156423156424156425156426156427156428156429156430156431156432156433156434156435156436156437156438156439156440156441156442156443156444156445156446156447156448156449156450156451156452156453156454156455156456156457156458156459156460156461156462156463156464156465156466156467156468156469156470156471156472156473156474156475156476156477156478156479156480156481156482156483156484156485156486156487156488156489156490156491156492156493156494156495156496156497156498156499156500156501156502156503156504156505156506156507156508156509156510156511156512156513156514156515156516156517156518156519156520156521156522156523156524156525156526156527156528156529156530156531156532156533156534156535156536156537156538156539156540156541156542156543156544156545156546156547156548156549156550156551156552156553156554156555156556156557156558156559156560156561156562156563156564156565156566156567156568156569156570156571156572156573156574156575156576156577156578156579156580156581156582156583156584156585156586156587156588156589156590156591156592156593156594156595156596156597156598156599156600156601156602156603156604156605156606156607156608156609156610156611156612156613156614156615156616156617156618156619156620156621156622156623156624156625156626156627156628156629156630156631156632156633156634156635156636156637156638156639156640156641156642156643156644156645156646156647156648156649156650156651156652156653156654156655156656156657156658156659156660156661156662156663156664156665156666156667156668156669156670156671156672156673156674156675156676156677156678156679156680156681156682156683156684156685156686156687156688156689156690156691156692156693156694156695156696156697156698156699156700156701156702156703156704156705156706156707156708156709156710
  1. /* sp.c
  2. *
  3. * Copyright (C) 2006-2024 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 = (sp_digit)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. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11864. #endif
  11865. return err;
  11866. }
  11867. #else
  11868. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  11869. *
  11870. * r A single precision number that is the result of the operation.
  11871. * a A single precision number being exponentiated.
  11872. * e A single precision number that is the exponent.
  11873. * bits The number of bits in the exponent.
  11874. * m A single precision number that is the modulus.
  11875. * returns 0 on success.
  11876. * returns MEMORY_E on dynamic memory allocation failure.
  11877. * returns MP_VAL when base is even or exponent is 0.
  11878. */
  11879. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  11880. int bits, const sp_digit* m, int reduceA)
  11881. {
  11882. #ifdef WOLFSSL_SP_SMALL_STACK
  11883. sp_digit* td = NULL;
  11884. #else
  11885. sp_digit td[32 * 64];
  11886. #endif
  11887. sp_digit* t[32];
  11888. sp_digit* norm = NULL;
  11889. sp_digit mp = 1;
  11890. sp_digit n;
  11891. sp_digit mask;
  11892. int i;
  11893. int c;
  11894. byte y;
  11895. int err = MP_OKAY;
  11896. if (bits == 0) {
  11897. err = MP_VAL;
  11898. }
  11899. #ifdef WOLFSSL_SP_SMALL_STACK
  11900. if (err == MP_OKAY) {
  11901. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL,
  11902. DYNAMIC_TYPE_TMP_BUFFER);
  11903. if (td == NULL)
  11904. err = MEMORY_E;
  11905. }
  11906. #endif
  11907. if (err == MP_OKAY) {
  11908. norm = td;
  11909. for (i=0; i<32; i++) {
  11910. t[i] = td + i * 64;
  11911. }
  11912. sp_2048_mont_setup(m, &mp);
  11913. sp_2048_mont_norm_32(norm, m);
  11914. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  11915. if (reduceA != 0) {
  11916. err = sp_2048_mod_32(t[1] + 32, a, m);
  11917. if (err == MP_OKAY) {
  11918. err = sp_2048_mod_32(t[1], t[1], m);
  11919. }
  11920. }
  11921. else {
  11922. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  11923. err = sp_2048_mod_32(t[1], t[1], m);
  11924. }
  11925. }
  11926. if (err == MP_OKAY) {
  11927. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  11928. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  11929. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  11930. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  11931. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  11932. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  11933. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  11934. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  11935. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  11936. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  11937. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  11938. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  11939. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  11940. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  11941. sp_2048_mont_sqr_32(t[16], t[ 8], m, mp);
  11942. sp_2048_mont_mul_32(t[17], t[ 9], t[ 8], m, mp);
  11943. sp_2048_mont_sqr_32(t[18], t[ 9], m, mp);
  11944. sp_2048_mont_mul_32(t[19], t[10], t[ 9], m, mp);
  11945. sp_2048_mont_sqr_32(t[20], t[10], m, mp);
  11946. sp_2048_mont_mul_32(t[21], t[11], t[10], m, mp);
  11947. sp_2048_mont_sqr_32(t[22], t[11], m, mp);
  11948. sp_2048_mont_mul_32(t[23], t[12], t[11], m, mp);
  11949. sp_2048_mont_sqr_32(t[24], t[12], m, mp);
  11950. sp_2048_mont_mul_32(t[25], t[13], t[12], m, mp);
  11951. sp_2048_mont_sqr_32(t[26], t[13], m, mp);
  11952. sp_2048_mont_mul_32(t[27], t[14], t[13], m, mp);
  11953. sp_2048_mont_sqr_32(t[28], t[14], m, mp);
  11954. sp_2048_mont_mul_32(t[29], t[15], t[14], m, mp);
  11955. sp_2048_mont_sqr_32(t[30], t[15], m, mp);
  11956. sp_2048_mont_mul_32(t[31], t[16], t[15], m, mp);
  11957. i = (bits - 1) / 32;
  11958. n = e[i--];
  11959. c = bits & 31;
  11960. if (c == 0) {
  11961. c = 32;
  11962. }
  11963. c -= bits % 5;
  11964. if (c == 32) {
  11965. c = 27;
  11966. }
  11967. if (c < 0) {
  11968. /* Number of bits in top word is less than number needed. */
  11969. c = -c;
  11970. y = (byte)(n << c);
  11971. n = e[i--];
  11972. y |= (byte)(n >> (64 - c));
  11973. n <<= c;
  11974. c = 64 - c;
  11975. }
  11976. else if (c == 0) {
  11977. /* All bits in top word used. */
  11978. y = (byte)n;
  11979. }
  11980. else {
  11981. y = (byte)(n >> c);
  11982. n <<= 32 - c;
  11983. }
  11984. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  11985. for (; i>=0 || c>=5; ) {
  11986. if (c == 0) {
  11987. n = e[i--];
  11988. y = (byte)(n >> 27);
  11989. n <<= 5;
  11990. c = 27;
  11991. }
  11992. else if (c < 5) {
  11993. y = (byte)(n >> 27);
  11994. n = e[i--];
  11995. c = 5 - c;
  11996. y |= (byte)(n >> (32 - c));
  11997. n <<= c;
  11998. c = 32 - c;
  11999. }
  12000. else {
  12001. y = (byte)((n >> 27) & 0x1f);
  12002. n <<= 5;
  12003. c -= 5;
  12004. }
  12005. sp_2048_mont_sqr_32(r, r, m, mp);
  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_mul_32(r, r, t[y], m, mp);
  12011. }
  12012. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  12013. sp_2048_mont_reduce_32(r, m, mp);
  12014. mask = (sp_digit)0 - (sp_2048_cmp_32(r, m) >= 0);
  12015. sp_2048_cond_sub_32(r, r, m, mask);
  12016. }
  12017. #ifdef WOLFSSL_SP_SMALL_STACK
  12018. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  12019. #endif
  12020. return err;
  12021. }
  12022. #endif /* WOLFSSL_SP_SMALL */
  12023. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  12024. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  12025. /* r = 2^n mod m where n is the number of bits to reduce by.
  12026. * Given m must be 2048 bits, just need to subtract.
  12027. *
  12028. * r A single precision number.
  12029. * m A single precision number.
  12030. */
  12031. static void sp_2048_mont_norm_64(sp_digit* r, const sp_digit* m)
  12032. {
  12033. XMEMSET(r, 0, sizeof(sp_digit) * 64);
  12034. /* r = 2^n mod m */
  12035. sp_2048_sub_in_place_64(r, m);
  12036. }
  12037. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  12038. #ifdef WOLFSSL_SP_SMALL
  12039. /* Conditionally subtract b from a using the mask m.
  12040. * m is -1 to subtract and 0 when not copying.
  12041. *
  12042. * r A single precision number representing condition subtract result.
  12043. * a A single precision number to subtract from.
  12044. * b A single precision number to subtract.
  12045. * m Mask value to apply.
  12046. */
  12047. 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)
  12048. {
  12049. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  12050. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  12051. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  12052. register sp_digit m asm ("r3") = (sp_digit)m_p;
  12053. __asm__ __volatile__ (
  12054. "mov r6, #0\n\t"
  12055. "mov r12, #0\n\t"
  12056. "mov lr, #0\n\t"
  12057. "\n"
  12058. "L_sp_2048_cond_sub_64_words_%=: \n\t"
  12059. "subs r12, r6, r12\n\t"
  12060. "ldr r4, [%[a], lr]\n\t"
  12061. "ldr r5, [%[b], lr]\n\t"
  12062. "and r5, r5, %[m]\n\t"
  12063. "sbcs r4, r4, r5\n\t"
  12064. "sbc r12, r6, r6\n\t"
  12065. "str r4, [%[r], lr]\n\t"
  12066. "add lr, lr, #4\n\t"
  12067. "cmp lr, #0x100\n\t"
  12068. "blt L_sp_2048_cond_sub_64_words_%=\n\t"
  12069. "mov %[r], r12\n\t"
  12070. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  12071. :
  12072. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  12073. );
  12074. return (uint32_t)(size_t)r;
  12075. }
  12076. #else
  12077. /* Conditionally subtract b from a using the mask m.
  12078. * m is -1 to subtract and 0 when not copying.
  12079. *
  12080. * r A single precision number representing condition subtract result.
  12081. * a A single precision number to subtract from.
  12082. * b A single precision number to subtract.
  12083. * m Mask value to apply.
  12084. */
  12085. 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)
  12086. {
  12087. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  12088. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  12089. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  12090. register sp_digit m asm ("r3") = (sp_digit)m_p;
  12091. __asm__ __volatile__ (
  12092. "mov lr, #0\n\t"
  12093. "ldm %[a]!, {r4, r5}\n\t"
  12094. "ldm %[b]!, {r6, r7}\n\t"
  12095. "and r6, r6, %[m]\n\t"
  12096. "and r7, r7, %[m]\n\t"
  12097. "subs r4, r4, r6\n\t"
  12098. "sbcs r5, r5, r7\n\t"
  12099. "stm %[r]!, {r4, r5}\n\t"
  12100. "ldm %[a]!, {r4, r5}\n\t"
  12101. "ldm %[b]!, {r6, r7}\n\t"
  12102. "and r6, r6, %[m]\n\t"
  12103. "and r7, r7, %[m]\n\t"
  12104. "sbcs r4, r4, r6\n\t"
  12105. "sbcs r5, r5, r7\n\t"
  12106. "stm %[r]!, {r4, r5}\n\t"
  12107. "ldm %[a]!, {r4, r5}\n\t"
  12108. "ldm %[b]!, {r6, r7}\n\t"
  12109. "and r6, r6, %[m]\n\t"
  12110. "and r7, r7, %[m]\n\t"
  12111. "sbcs r4, r4, r6\n\t"
  12112. "sbcs r5, r5, r7\n\t"
  12113. "stm %[r]!, {r4, r5}\n\t"
  12114. "ldm %[a]!, {r4, r5}\n\t"
  12115. "ldm %[b]!, {r6, r7}\n\t"
  12116. "and r6, r6, %[m]\n\t"
  12117. "and r7, r7, %[m]\n\t"
  12118. "sbcs r4, r4, r6\n\t"
  12119. "sbcs r5, r5, r7\n\t"
  12120. "stm %[r]!, {r4, r5}\n\t"
  12121. "ldm %[a]!, {r4, r5}\n\t"
  12122. "ldm %[b]!, {r6, r7}\n\t"
  12123. "and r6, r6, %[m]\n\t"
  12124. "and r7, r7, %[m]\n\t"
  12125. "sbcs r4, r4, r6\n\t"
  12126. "sbcs r5, r5, r7\n\t"
  12127. "stm %[r]!, {r4, r5}\n\t"
  12128. "ldm %[a]!, {r4, r5}\n\t"
  12129. "ldm %[b]!, {r6, r7}\n\t"
  12130. "and r6, r6, %[m]\n\t"
  12131. "and r7, r7, %[m]\n\t"
  12132. "sbcs r4, r4, r6\n\t"
  12133. "sbcs r5, r5, r7\n\t"
  12134. "stm %[r]!, {r4, r5}\n\t"
  12135. "ldm %[a]!, {r4, r5}\n\t"
  12136. "ldm %[b]!, {r6, r7}\n\t"
  12137. "and r6, r6, %[m]\n\t"
  12138. "and r7, r7, %[m]\n\t"
  12139. "sbcs r4, r4, r6\n\t"
  12140. "sbcs r5, r5, r7\n\t"
  12141. "stm %[r]!, {r4, r5}\n\t"
  12142. "ldm %[a]!, {r4, r5}\n\t"
  12143. "ldm %[b]!, {r6, r7}\n\t"
  12144. "and r6, r6, %[m]\n\t"
  12145. "and r7, r7, %[m]\n\t"
  12146. "sbcs r4, r4, r6\n\t"
  12147. "sbcs r5, r5, r7\n\t"
  12148. "stm %[r]!, {r4, r5}\n\t"
  12149. "ldm %[a]!, {r4, r5}\n\t"
  12150. "ldm %[b]!, {r6, r7}\n\t"
  12151. "and r6, r6, %[m]\n\t"
  12152. "and r7, r7, %[m]\n\t"
  12153. "sbcs r4, r4, r6\n\t"
  12154. "sbcs r5, r5, r7\n\t"
  12155. "stm %[r]!, {r4, r5}\n\t"
  12156. "ldm %[a]!, {r4, r5}\n\t"
  12157. "ldm %[b]!, {r6, r7}\n\t"
  12158. "and r6, r6, %[m]\n\t"
  12159. "and r7, r7, %[m]\n\t"
  12160. "sbcs r4, r4, r6\n\t"
  12161. "sbcs r5, r5, r7\n\t"
  12162. "stm %[r]!, {r4, r5}\n\t"
  12163. "ldm %[a]!, {r4, r5}\n\t"
  12164. "ldm %[b]!, {r6, r7}\n\t"
  12165. "and r6, r6, %[m]\n\t"
  12166. "and r7, r7, %[m]\n\t"
  12167. "sbcs r4, r4, r6\n\t"
  12168. "sbcs r5, r5, r7\n\t"
  12169. "stm %[r]!, {r4, r5}\n\t"
  12170. "ldm %[a]!, {r4, r5}\n\t"
  12171. "ldm %[b]!, {r6, r7}\n\t"
  12172. "and r6, r6, %[m]\n\t"
  12173. "and r7, r7, %[m]\n\t"
  12174. "sbcs r4, r4, r6\n\t"
  12175. "sbcs r5, r5, r7\n\t"
  12176. "stm %[r]!, {r4, r5}\n\t"
  12177. "ldm %[a]!, {r4, r5}\n\t"
  12178. "ldm %[b]!, {r6, r7}\n\t"
  12179. "and r6, r6, %[m]\n\t"
  12180. "and r7, r7, %[m]\n\t"
  12181. "sbcs r4, r4, r6\n\t"
  12182. "sbcs r5, r5, r7\n\t"
  12183. "stm %[r]!, {r4, r5}\n\t"
  12184. "ldm %[a]!, {r4, r5}\n\t"
  12185. "ldm %[b]!, {r6, r7}\n\t"
  12186. "and r6, r6, %[m]\n\t"
  12187. "and r7, r7, %[m]\n\t"
  12188. "sbcs r4, r4, r6\n\t"
  12189. "sbcs r5, r5, r7\n\t"
  12190. "stm %[r]!, {r4, r5}\n\t"
  12191. "ldm %[a]!, {r4, r5}\n\t"
  12192. "ldm %[b]!, {r6, r7}\n\t"
  12193. "and r6, r6, %[m]\n\t"
  12194. "and r7, r7, %[m]\n\t"
  12195. "sbcs r4, r4, r6\n\t"
  12196. "sbcs r5, r5, r7\n\t"
  12197. "stm %[r]!, {r4, r5}\n\t"
  12198. "ldm %[a]!, {r4, r5}\n\t"
  12199. "ldm %[b]!, {r6, r7}\n\t"
  12200. "and r6, r6, %[m]\n\t"
  12201. "and r7, r7, %[m]\n\t"
  12202. "sbcs r4, r4, r6\n\t"
  12203. "sbcs r5, r5, r7\n\t"
  12204. "stm %[r]!, {r4, r5}\n\t"
  12205. "ldm %[a]!, {r4, r5}\n\t"
  12206. "ldm %[b]!, {r6, r7}\n\t"
  12207. "and r6, r6, %[m]\n\t"
  12208. "and r7, r7, %[m]\n\t"
  12209. "sbcs r4, r4, r6\n\t"
  12210. "sbcs r5, r5, r7\n\t"
  12211. "stm %[r]!, {r4, r5}\n\t"
  12212. "ldm %[a]!, {r4, r5}\n\t"
  12213. "ldm %[b]!, {r6, r7}\n\t"
  12214. "and r6, r6, %[m]\n\t"
  12215. "and r7, r7, %[m]\n\t"
  12216. "sbcs r4, r4, r6\n\t"
  12217. "sbcs r5, r5, r7\n\t"
  12218. "stm %[r]!, {r4, r5}\n\t"
  12219. "ldm %[a]!, {r4, r5}\n\t"
  12220. "ldm %[b]!, {r6, r7}\n\t"
  12221. "and r6, r6, %[m]\n\t"
  12222. "and r7, r7, %[m]\n\t"
  12223. "sbcs r4, r4, r6\n\t"
  12224. "sbcs r5, r5, r7\n\t"
  12225. "stm %[r]!, {r4, r5}\n\t"
  12226. "ldm %[a]!, {r4, r5}\n\t"
  12227. "ldm %[b]!, {r6, r7}\n\t"
  12228. "and r6, r6, %[m]\n\t"
  12229. "and r7, r7, %[m]\n\t"
  12230. "sbcs r4, r4, r6\n\t"
  12231. "sbcs r5, r5, r7\n\t"
  12232. "stm %[r]!, {r4, r5}\n\t"
  12233. "ldm %[a]!, {r4, r5}\n\t"
  12234. "ldm %[b]!, {r6, r7}\n\t"
  12235. "and r6, r6, %[m]\n\t"
  12236. "and r7, r7, %[m]\n\t"
  12237. "sbcs r4, r4, r6\n\t"
  12238. "sbcs r5, r5, r7\n\t"
  12239. "stm %[r]!, {r4, r5}\n\t"
  12240. "ldm %[a]!, {r4, r5}\n\t"
  12241. "ldm %[b]!, {r6, r7}\n\t"
  12242. "and r6, r6, %[m]\n\t"
  12243. "and r7, r7, %[m]\n\t"
  12244. "sbcs r4, r4, r6\n\t"
  12245. "sbcs r5, r5, r7\n\t"
  12246. "stm %[r]!, {r4, r5}\n\t"
  12247. "ldm %[a]!, {r4, r5}\n\t"
  12248. "ldm %[b]!, {r6, r7}\n\t"
  12249. "and r6, r6, %[m]\n\t"
  12250. "and r7, r7, %[m]\n\t"
  12251. "sbcs r4, r4, r6\n\t"
  12252. "sbcs r5, r5, r7\n\t"
  12253. "stm %[r]!, {r4, r5}\n\t"
  12254. "ldm %[a]!, {r4, r5}\n\t"
  12255. "ldm %[b]!, {r6, r7}\n\t"
  12256. "and r6, r6, %[m]\n\t"
  12257. "and r7, r7, %[m]\n\t"
  12258. "sbcs r4, r4, r6\n\t"
  12259. "sbcs r5, r5, r7\n\t"
  12260. "stm %[r]!, {r4, r5}\n\t"
  12261. "ldm %[a]!, {r4, r5}\n\t"
  12262. "ldm %[b]!, {r6, r7}\n\t"
  12263. "and r6, r6, %[m]\n\t"
  12264. "and r7, r7, %[m]\n\t"
  12265. "sbcs r4, r4, r6\n\t"
  12266. "sbcs r5, r5, r7\n\t"
  12267. "stm %[r]!, {r4, r5}\n\t"
  12268. "ldm %[a]!, {r4, r5}\n\t"
  12269. "ldm %[b]!, {r6, r7}\n\t"
  12270. "and r6, r6, %[m]\n\t"
  12271. "and r7, r7, %[m]\n\t"
  12272. "sbcs r4, r4, r6\n\t"
  12273. "sbcs r5, r5, r7\n\t"
  12274. "stm %[r]!, {r4, r5}\n\t"
  12275. "ldm %[a]!, {r4, r5}\n\t"
  12276. "ldm %[b]!, {r6, r7}\n\t"
  12277. "and r6, r6, %[m]\n\t"
  12278. "and r7, r7, %[m]\n\t"
  12279. "sbcs r4, r4, r6\n\t"
  12280. "sbcs r5, r5, r7\n\t"
  12281. "stm %[r]!, {r4, r5}\n\t"
  12282. "ldm %[a]!, {r4, r5}\n\t"
  12283. "ldm %[b]!, {r6, r7}\n\t"
  12284. "and r6, r6, %[m]\n\t"
  12285. "and r7, r7, %[m]\n\t"
  12286. "sbcs r4, r4, r6\n\t"
  12287. "sbcs r5, r5, r7\n\t"
  12288. "stm %[r]!, {r4, r5}\n\t"
  12289. "ldm %[a]!, {r4, r5}\n\t"
  12290. "ldm %[b]!, {r6, r7}\n\t"
  12291. "and r6, r6, %[m]\n\t"
  12292. "and r7, r7, %[m]\n\t"
  12293. "sbcs r4, r4, r6\n\t"
  12294. "sbcs r5, r5, r7\n\t"
  12295. "stm %[r]!, {r4, r5}\n\t"
  12296. "ldm %[a]!, {r4, r5}\n\t"
  12297. "ldm %[b]!, {r6, r7}\n\t"
  12298. "and r6, r6, %[m]\n\t"
  12299. "and r7, r7, %[m]\n\t"
  12300. "sbcs r4, r4, r6\n\t"
  12301. "sbcs r5, r5, r7\n\t"
  12302. "stm %[r]!, {r4, r5}\n\t"
  12303. "ldm %[a]!, {r4, r5}\n\t"
  12304. "ldm %[b]!, {r6, r7}\n\t"
  12305. "and r6, r6, %[m]\n\t"
  12306. "and r7, r7, %[m]\n\t"
  12307. "sbcs r4, r4, r6\n\t"
  12308. "sbcs r5, r5, r7\n\t"
  12309. "stm %[r]!, {r4, r5}\n\t"
  12310. "ldm %[a]!, {r4, r5}\n\t"
  12311. "ldm %[b]!, {r6, r7}\n\t"
  12312. "and r6, r6, %[m]\n\t"
  12313. "and r7, r7, %[m]\n\t"
  12314. "sbcs r4, r4, r6\n\t"
  12315. "sbcs r5, r5, r7\n\t"
  12316. "stm %[r]!, {r4, r5}\n\t"
  12317. "sbc %[r], lr, lr\n\t"
  12318. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  12319. :
  12320. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  12321. );
  12322. return (uint32_t)(size_t)r;
  12323. }
  12324. #endif /* WOLFSSL_SP_SMALL */
  12325. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  12326. /* Reduce the number back to 2048 bits using Montgomery reduction.
  12327. *
  12328. * a A single precision number to reduce in place.
  12329. * m The single precision number representing the modulus.
  12330. * mp The digit representing the negative inverse of m mod 2^n.
  12331. */
  12332. static SP_NOINLINE void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  12333. {
  12334. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  12335. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  12336. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  12337. __asm__ __volatile__ (
  12338. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  12339. "ldr r11, [%[m]]\n\t"
  12340. #endif
  12341. /* i = 0 */
  12342. "mov r9, #0\n\t"
  12343. "mov r3, #0\n\t"
  12344. "ldr r12, [%[a]]\n\t"
  12345. "ldr lr, [%[a], #4]\n\t"
  12346. "\n"
  12347. "L_sp_2048_mont_reduce_64_word_%=: \n\t"
  12348. /* mu = a[i] * mp */
  12349. "mul r8, %[mp], r12\n\t"
  12350. /* a[i+0] += m[0] * mu */
  12351. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  12352. "ldr r11, [%[m]]\n\t"
  12353. #endif
  12354. "lsr r7, r11, #16\n\t"
  12355. "lsr r6, r8, #16\n\t"
  12356. "mul r5, r6, r7\n\t"
  12357. "lsl r7, r11, #16\n\t"
  12358. "lsr r7, r7, #16\n\t"
  12359. "mul r6, r7, r6\n\t"
  12360. "lsr r7, r6, #16\n\t"
  12361. "lsl r6, r6, #16\n\t"
  12362. "adds r12, r12, r6\n\t"
  12363. "adc r5, r5, r7\n\t"
  12364. "lsl r6, r8, #16\n\t"
  12365. "lsl r7, r11, #16\n\t"
  12366. "lsr r6, r6, #16\n\t"
  12367. "lsr r7, r7, #16\n\t"
  12368. "mul r7, r6, r7\n\t"
  12369. "adds r12, r12, r7\n\t"
  12370. "adc r5, r5, #0\n\t"
  12371. "lsr r7, r11, #16\n\t"
  12372. "mul r6, r7, r6\n\t"
  12373. "lsr r7, r6, #16\n\t"
  12374. "lsl r6, r6, #16\n\t"
  12375. "adds r12, r12, r6\n\t"
  12376. "adc r5, r5, r7\n\t"
  12377. /* a[i+1] += m[1] * mu */
  12378. "ldr r7, [%[m], #4]\n\t"
  12379. "lsr r10, r7, #16\n\t"
  12380. "lsr r6, r8, #16\n\t"
  12381. "mul r4, r6, r10\n\t"
  12382. "lsl r10, r7, #16\n\t"
  12383. "lsr r10, r10, #16\n\t"
  12384. "mul r6, r10, r6\n\t"
  12385. "lsr r10, r6, #16\n\t"
  12386. "lsl r6, r6, #16\n\t"
  12387. "adds lr, lr, r6\n\t"
  12388. "adc r4, r4, r10\n\t"
  12389. "lsl r6, r8, #16\n\t"
  12390. "lsl r10, r7, #16\n\t"
  12391. "lsr r6, r6, #16\n\t"
  12392. "lsr r10, r10, #16\n\t"
  12393. "mul r10, r6, r10\n\t"
  12394. "adds lr, lr, r10\n\t"
  12395. "adc r4, r4, #0\n\t"
  12396. "lsr r10, r7, #16\n\t"
  12397. "mul r6, r10, r6\n\t"
  12398. "lsr r10, r6, #16\n\t"
  12399. "lsl r6, r6, #16\n\t"
  12400. "adds lr, lr, r6\n\t"
  12401. "adc r4, r4, r10\n\t"
  12402. "mov r12, lr\n\t"
  12403. "adds r12, r12, r5\n\t"
  12404. "adc r4, r4, #0\n\t"
  12405. /* a[i+2] += m[2] * mu */
  12406. "ldr r7, [%[m], #8]\n\t"
  12407. "ldr lr, [%[a], #8]\n\t"
  12408. "lsr r10, r7, #16\n\t"
  12409. "lsr r6, r8, #16\n\t"
  12410. "mul r5, r6, r10\n\t"
  12411. "lsl r10, r7, #16\n\t"
  12412. "lsr r10, r10, #16\n\t"
  12413. "mul r6, r10, r6\n\t"
  12414. "lsr r10, r6, #16\n\t"
  12415. "lsl r6, r6, #16\n\t"
  12416. "adds lr, lr, r6\n\t"
  12417. "adc r5, r5, r10\n\t"
  12418. "lsl r6, r8, #16\n\t"
  12419. "lsl r10, r7, #16\n\t"
  12420. "lsr r6, r6, #16\n\t"
  12421. "lsr r10, r10, #16\n\t"
  12422. "mul r10, r6, r10\n\t"
  12423. "adds lr, lr, r10\n\t"
  12424. "adc r5, r5, #0\n\t"
  12425. "lsr r10, r7, #16\n\t"
  12426. "mul r6, r10, r6\n\t"
  12427. "lsr r10, r6, #16\n\t"
  12428. "lsl r6, r6, #16\n\t"
  12429. "adds lr, lr, r6\n\t"
  12430. "adc r5, r5, r10\n\t"
  12431. "adds lr, lr, r4\n\t"
  12432. "adc r5, r5, #0\n\t"
  12433. /* a[i+3] += m[3] * mu */
  12434. "ldr r7, [%[m], #12]\n\t"
  12435. "ldr r10, [%[a], #12]\n\t"
  12436. "lsr r11, r7, #16\n\t"
  12437. "lsr r6, r8, #16\n\t"
  12438. "mul r4, r6, r11\n\t"
  12439. "lsl r11, r7, #16\n\t"
  12440. "lsr r11, r11, #16\n\t"
  12441. "mul r6, r11, r6\n\t"
  12442. "lsr r11, r6, #16\n\t"
  12443. "lsl r6, r6, #16\n\t"
  12444. "adds r10, r10, r6\n\t"
  12445. "adc r4, r4, r11\n\t"
  12446. "lsl r6, r8, #16\n\t"
  12447. "lsl r11, r7, #16\n\t"
  12448. "lsr r6, r6, #16\n\t"
  12449. "lsr r11, r11, #16\n\t"
  12450. "mul r11, r6, r11\n\t"
  12451. "adds r10, r10, r11\n\t"
  12452. "adc r4, r4, #0\n\t"
  12453. "lsr r11, r7, #16\n\t"
  12454. "mul r6, r11, r6\n\t"
  12455. "lsr r11, r6, #16\n\t"
  12456. "lsl r6, r6, #16\n\t"
  12457. "adds r10, r10, r6\n\t"
  12458. "adc r4, r4, r11\n\t"
  12459. "adds r10, r10, r5\n\t"
  12460. "str r10, [%[a], #12]\n\t"
  12461. "adc r4, r4, #0\n\t"
  12462. /* a[i+4] += m[4] * mu */
  12463. "ldr r7, [%[m], #16]\n\t"
  12464. "ldr r10, [%[a], #16]\n\t"
  12465. "lsr r11, r7, #16\n\t"
  12466. "lsr r6, r8, #16\n\t"
  12467. "mul r5, r6, r11\n\t"
  12468. "lsl r11, r7, #16\n\t"
  12469. "lsr r11, r11, #16\n\t"
  12470. "mul r6, r11, r6\n\t"
  12471. "lsr r11, r6, #16\n\t"
  12472. "lsl r6, r6, #16\n\t"
  12473. "adds r10, r10, r6\n\t"
  12474. "adc r5, r5, r11\n\t"
  12475. "lsl r6, r8, #16\n\t"
  12476. "lsl r11, r7, #16\n\t"
  12477. "lsr r6, r6, #16\n\t"
  12478. "lsr r11, r11, #16\n\t"
  12479. "mul r11, r6, r11\n\t"
  12480. "adds r10, r10, r11\n\t"
  12481. "adc r5, r5, #0\n\t"
  12482. "lsr r11, r7, #16\n\t"
  12483. "mul r6, r11, r6\n\t"
  12484. "lsr r11, r6, #16\n\t"
  12485. "lsl r6, r6, #16\n\t"
  12486. "adds r10, r10, r6\n\t"
  12487. "adc r5, r5, r11\n\t"
  12488. "adds r10, r10, r4\n\t"
  12489. "str r10, [%[a], #16]\n\t"
  12490. "adc r5, r5, #0\n\t"
  12491. /* a[i+5] += m[5] * mu */
  12492. "ldr r7, [%[m], #20]\n\t"
  12493. "ldr r10, [%[a], #20]\n\t"
  12494. "lsr r11, r7, #16\n\t"
  12495. "lsr r6, r8, #16\n\t"
  12496. "mul r4, r6, r11\n\t"
  12497. "lsl r11, r7, #16\n\t"
  12498. "lsr r11, r11, #16\n\t"
  12499. "mul r6, r11, r6\n\t"
  12500. "lsr r11, r6, #16\n\t"
  12501. "lsl r6, r6, #16\n\t"
  12502. "adds r10, r10, r6\n\t"
  12503. "adc r4, r4, r11\n\t"
  12504. "lsl r6, r8, #16\n\t"
  12505. "lsl r11, r7, #16\n\t"
  12506. "lsr r6, r6, #16\n\t"
  12507. "lsr r11, r11, #16\n\t"
  12508. "mul r11, r6, r11\n\t"
  12509. "adds r10, r10, r11\n\t"
  12510. "adc r4, r4, #0\n\t"
  12511. "lsr r11, r7, #16\n\t"
  12512. "mul r6, r11, r6\n\t"
  12513. "lsr r11, r6, #16\n\t"
  12514. "lsl r6, r6, #16\n\t"
  12515. "adds r10, r10, r6\n\t"
  12516. "adc r4, r4, r11\n\t"
  12517. "adds r10, r10, r5\n\t"
  12518. "str r10, [%[a], #20]\n\t"
  12519. "adc r4, r4, #0\n\t"
  12520. /* a[i+6] += m[6] * mu */
  12521. "ldr r7, [%[m], #24]\n\t"
  12522. "ldr r10, [%[a], #24]\n\t"
  12523. "lsr r11, r7, #16\n\t"
  12524. "lsr r6, r8, #16\n\t"
  12525. "mul r5, r6, r11\n\t"
  12526. "lsl r11, r7, #16\n\t"
  12527. "lsr r11, r11, #16\n\t"
  12528. "mul r6, r11, r6\n\t"
  12529. "lsr r11, r6, #16\n\t"
  12530. "lsl r6, r6, #16\n\t"
  12531. "adds r10, r10, r6\n\t"
  12532. "adc r5, r5, r11\n\t"
  12533. "lsl r6, r8, #16\n\t"
  12534. "lsl r11, r7, #16\n\t"
  12535. "lsr r6, r6, #16\n\t"
  12536. "lsr r11, r11, #16\n\t"
  12537. "mul r11, r6, r11\n\t"
  12538. "adds r10, r10, r11\n\t"
  12539. "adc r5, r5, #0\n\t"
  12540. "lsr r11, r7, #16\n\t"
  12541. "mul r6, r11, r6\n\t"
  12542. "lsr r11, r6, #16\n\t"
  12543. "lsl r6, r6, #16\n\t"
  12544. "adds r10, r10, r6\n\t"
  12545. "adc r5, r5, r11\n\t"
  12546. "adds r10, r10, r4\n\t"
  12547. "str r10, [%[a], #24]\n\t"
  12548. "adc r5, r5, #0\n\t"
  12549. /* a[i+7] += m[7] * mu */
  12550. "ldr r7, [%[m], #28]\n\t"
  12551. "ldr r10, [%[a], #28]\n\t"
  12552. "lsr r11, r7, #16\n\t"
  12553. "lsr r6, r8, #16\n\t"
  12554. "mul r4, r6, r11\n\t"
  12555. "lsl r11, r7, #16\n\t"
  12556. "lsr r11, r11, #16\n\t"
  12557. "mul r6, r11, r6\n\t"
  12558. "lsr r11, r6, #16\n\t"
  12559. "lsl r6, r6, #16\n\t"
  12560. "adds r10, r10, r6\n\t"
  12561. "adc r4, r4, r11\n\t"
  12562. "lsl r6, r8, #16\n\t"
  12563. "lsl r11, r7, #16\n\t"
  12564. "lsr r6, r6, #16\n\t"
  12565. "lsr r11, r11, #16\n\t"
  12566. "mul r11, r6, r11\n\t"
  12567. "adds r10, r10, r11\n\t"
  12568. "adc r4, r4, #0\n\t"
  12569. "lsr r11, r7, #16\n\t"
  12570. "mul r6, r11, r6\n\t"
  12571. "lsr r11, r6, #16\n\t"
  12572. "lsl r6, r6, #16\n\t"
  12573. "adds r10, r10, r6\n\t"
  12574. "adc r4, r4, r11\n\t"
  12575. "adds r10, r10, r5\n\t"
  12576. "str r10, [%[a], #28]\n\t"
  12577. "adc r4, r4, #0\n\t"
  12578. /* a[i+8] += m[8] * mu */
  12579. "ldr r7, [%[m], #32]\n\t"
  12580. "ldr r10, [%[a], #32]\n\t"
  12581. "lsr r11, r7, #16\n\t"
  12582. "lsr r6, r8, #16\n\t"
  12583. "mul r5, r6, r11\n\t"
  12584. "lsl r11, r7, #16\n\t"
  12585. "lsr r11, r11, #16\n\t"
  12586. "mul r6, r11, r6\n\t"
  12587. "lsr r11, r6, #16\n\t"
  12588. "lsl r6, r6, #16\n\t"
  12589. "adds r10, r10, r6\n\t"
  12590. "adc r5, r5, r11\n\t"
  12591. "lsl r6, r8, #16\n\t"
  12592. "lsl r11, r7, #16\n\t"
  12593. "lsr r6, r6, #16\n\t"
  12594. "lsr r11, r11, #16\n\t"
  12595. "mul r11, r6, r11\n\t"
  12596. "adds r10, r10, r11\n\t"
  12597. "adc r5, r5, #0\n\t"
  12598. "lsr r11, r7, #16\n\t"
  12599. "mul r6, r11, r6\n\t"
  12600. "lsr r11, r6, #16\n\t"
  12601. "lsl r6, r6, #16\n\t"
  12602. "adds r10, r10, r6\n\t"
  12603. "adc r5, r5, r11\n\t"
  12604. "adds r10, r10, r4\n\t"
  12605. "str r10, [%[a], #32]\n\t"
  12606. "adc r5, r5, #0\n\t"
  12607. /* a[i+9] += m[9] * mu */
  12608. "ldr r7, [%[m], #36]\n\t"
  12609. "ldr r10, [%[a], #36]\n\t"
  12610. "lsr r11, r7, #16\n\t"
  12611. "lsr r6, r8, #16\n\t"
  12612. "mul r4, r6, r11\n\t"
  12613. "lsl r11, r7, #16\n\t"
  12614. "lsr r11, r11, #16\n\t"
  12615. "mul r6, r11, r6\n\t"
  12616. "lsr r11, r6, #16\n\t"
  12617. "lsl r6, r6, #16\n\t"
  12618. "adds r10, r10, r6\n\t"
  12619. "adc r4, r4, r11\n\t"
  12620. "lsl r6, r8, #16\n\t"
  12621. "lsl r11, r7, #16\n\t"
  12622. "lsr r6, r6, #16\n\t"
  12623. "lsr r11, r11, #16\n\t"
  12624. "mul r11, r6, r11\n\t"
  12625. "adds r10, r10, r11\n\t"
  12626. "adc r4, r4, #0\n\t"
  12627. "lsr r11, r7, #16\n\t"
  12628. "mul r6, r11, r6\n\t"
  12629. "lsr r11, r6, #16\n\t"
  12630. "lsl r6, r6, #16\n\t"
  12631. "adds r10, r10, r6\n\t"
  12632. "adc r4, r4, r11\n\t"
  12633. "adds r10, r10, r5\n\t"
  12634. "str r10, [%[a], #36]\n\t"
  12635. "adc r4, r4, #0\n\t"
  12636. /* a[i+10] += m[10] * mu */
  12637. "ldr r7, [%[m], #40]\n\t"
  12638. "ldr r10, [%[a], #40]\n\t"
  12639. "lsr r11, r7, #16\n\t"
  12640. "lsr r6, r8, #16\n\t"
  12641. "mul r5, r6, r11\n\t"
  12642. "lsl r11, r7, #16\n\t"
  12643. "lsr r11, r11, #16\n\t"
  12644. "mul r6, r11, r6\n\t"
  12645. "lsr r11, r6, #16\n\t"
  12646. "lsl r6, r6, #16\n\t"
  12647. "adds r10, r10, r6\n\t"
  12648. "adc r5, r5, r11\n\t"
  12649. "lsl r6, r8, #16\n\t"
  12650. "lsl r11, r7, #16\n\t"
  12651. "lsr r6, r6, #16\n\t"
  12652. "lsr r11, r11, #16\n\t"
  12653. "mul r11, r6, r11\n\t"
  12654. "adds r10, r10, r11\n\t"
  12655. "adc r5, r5, #0\n\t"
  12656. "lsr r11, r7, #16\n\t"
  12657. "mul r6, r11, r6\n\t"
  12658. "lsr r11, r6, #16\n\t"
  12659. "lsl r6, r6, #16\n\t"
  12660. "adds r10, r10, r6\n\t"
  12661. "adc r5, r5, r11\n\t"
  12662. "adds r10, r10, r4\n\t"
  12663. "str r10, [%[a], #40]\n\t"
  12664. "adc r5, r5, #0\n\t"
  12665. /* a[i+11] += m[11] * mu */
  12666. "ldr r7, [%[m], #44]\n\t"
  12667. "ldr r10, [%[a], #44]\n\t"
  12668. "lsr r11, r7, #16\n\t"
  12669. "lsr r6, r8, #16\n\t"
  12670. "mul r4, r6, r11\n\t"
  12671. "lsl r11, r7, #16\n\t"
  12672. "lsr r11, r11, #16\n\t"
  12673. "mul r6, r11, r6\n\t"
  12674. "lsr r11, r6, #16\n\t"
  12675. "lsl r6, r6, #16\n\t"
  12676. "adds r10, r10, r6\n\t"
  12677. "adc r4, r4, r11\n\t"
  12678. "lsl r6, r8, #16\n\t"
  12679. "lsl r11, r7, #16\n\t"
  12680. "lsr r6, r6, #16\n\t"
  12681. "lsr r11, r11, #16\n\t"
  12682. "mul r11, r6, r11\n\t"
  12683. "adds r10, r10, r11\n\t"
  12684. "adc r4, r4, #0\n\t"
  12685. "lsr r11, r7, #16\n\t"
  12686. "mul r6, r11, r6\n\t"
  12687. "lsr r11, r6, #16\n\t"
  12688. "lsl r6, r6, #16\n\t"
  12689. "adds r10, r10, r6\n\t"
  12690. "adc r4, r4, r11\n\t"
  12691. "adds r10, r10, r5\n\t"
  12692. "str r10, [%[a], #44]\n\t"
  12693. "adc r4, r4, #0\n\t"
  12694. /* a[i+12] += m[12] * mu */
  12695. "ldr r7, [%[m], #48]\n\t"
  12696. "ldr r10, [%[a], #48]\n\t"
  12697. "lsr r11, r7, #16\n\t"
  12698. "lsr r6, r8, #16\n\t"
  12699. "mul r5, r6, r11\n\t"
  12700. "lsl r11, r7, #16\n\t"
  12701. "lsr r11, r11, #16\n\t"
  12702. "mul r6, r11, r6\n\t"
  12703. "lsr r11, r6, #16\n\t"
  12704. "lsl r6, r6, #16\n\t"
  12705. "adds r10, r10, r6\n\t"
  12706. "adc r5, r5, r11\n\t"
  12707. "lsl r6, r8, #16\n\t"
  12708. "lsl r11, r7, #16\n\t"
  12709. "lsr r6, r6, #16\n\t"
  12710. "lsr r11, r11, #16\n\t"
  12711. "mul r11, r6, r11\n\t"
  12712. "adds r10, r10, r11\n\t"
  12713. "adc r5, r5, #0\n\t"
  12714. "lsr r11, r7, #16\n\t"
  12715. "mul r6, r11, r6\n\t"
  12716. "lsr r11, r6, #16\n\t"
  12717. "lsl r6, r6, #16\n\t"
  12718. "adds r10, r10, r6\n\t"
  12719. "adc r5, r5, r11\n\t"
  12720. "adds r10, r10, r4\n\t"
  12721. "str r10, [%[a], #48]\n\t"
  12722. "adc r5, r5, #0\n\t"
  12723. /* a[i+13] += m[13] * mu */
  12724. "ldr r7, [%[m], #52]\n\t"
  12725. "ldr r10, [%[a], #52]\n\t"
  12726. "lsr r11, r7, #16\n\t"
  12727. "lsr r6, r8, #16\n\t"
  12728. "mul r4, r6, r11\n\t"
  12729. "lsl r11, r7, #16\n\t"
  12730. "lsr r11, r11, #16\n\t"
  12731. "mul r6, r11, r6\n\t"
  12732. "lsr r11, r6, #16\n\t"
  12733. "lsl r6, r6, #16\n\t"
  12734. "adds r10, r10, r6\n\t"
  12735. "adc r4, r4, r11\n\t"
  12736. "lsl r6, r8, #16\n\t"
  12737. "lsl r11, r7, #16\n\t"
  12738. "lsr r6, r6, #16\n\t"
  12739. "lsr r11, r11, #16\n\t"
  12740. "mul r11, r6, r11\n\t"
  12741. "adds r10, r10, r11\n\t"
  12742. "adc r4, r4, #0\n\t"
  12743. "lsr r11, r7, #16\n\t"
  12744. "mul r6, r11, r6\n\t"
  12745. "lsr r11, r6, #16\n\t"
  12746. "lsl r6, r6, #16\n\t"
  12747. "adds r10, r10, r6\n\t"
  12748. "adc r4, r4, r11\n\t"
  12749. "adds r10, r10, r5\n\t"
  12750. "str r10, [%[a], #52]\n\t"
  12751. "adc r4, r4, #0\n\t"
  12752. /* a[i+14] += m[14] * mu */
  12753. "ldr r7, [%[m], #56]\n\t"
  12754. "ldr r10, [%[a], #56]\n\t"
  12755. "lsr r11, r7, #16\n\t"
  12756. "lsr r6, r8, #16\n\t"
  12757. "mul r5, r6, r11\n\t"
  12758. "lsl r11, r7, #16\n\t"
  12759. "lsr r11, r11, #16\n\t"
  12760. "mul r6, r11, r6\n\t"
  12761. "lsr r11, r6, #16\n\t"
  12762. "lsl r6, r6, #16\n\t"
  12763. "adds r10, r10, r6\n\t"
  12764. "adc r5, r5, r11\n\t"
  12765. "lsl r6, r8, #16\n\t"
  12766. "lsl r11, r7, #16\n\t"
  12767. "lsr r6, r6, #16\n\t"
  12768. "lsr r11, r11, #16\n\t"
  12769. "mul r11, r6, r11\n\t"
  12770. "adds r10, r10, r11\n\t"
  12771. "adc r5, r5, #0\n\t"
  12772. "lsr r11, r7, #16\n\t"
  12773. "mul r6, r11, r6\n\t"
  12774. "lsr r11, r6, #16\n\t"
  12775. "lsl r6, r6, #16\n\t"
  12776. "adds r10, r10, r6\n\t"
  12777. "adc r5, r5, r11\n\t"
  12778. "adds r10, r10, r4\n\t"
  12779. "str r10, [%[a], #56]\n\t"
  12780. "adc r5, r5, #0\n\t"
  12781. /* a[i+15] += m[15] * mu */
  12782. "ldr r7, [%[m], #60]\n\t"
  12783. "ldr r10, [%[a], #60]\n\t"
  12784. "lsr r11, r7, #16\n\t"
  12785. "lsr r6, r8, #16\n\t"
  12786. "mul r4, r6, r11\n\t"
  12787. "lsl r11, r7, #16\n\t"
  12788. "lsr r11, r11, #16\n\t"
  12789. "mul r6, r11, r6\n\t"
  12790. "lsr r11, r6, #16\n\t"
  12791. "lsl r6, r6, #16\n\t"
  12792. "adds r10, r10, r6\n\t"
  12793. "adc r4, r4, r11\n\t"
  12794. "lsl r6, r8, #16\n\t"
  12795. "lsl r11, r7, #16\n\t"
  12796. "lsr r6, r6, #16\n\t"
  12797. "lsr r11, r11, #16\n\t"
  12798. "mul r11, r6, r11\n\t"
  12799. "adds r10, r10, r11\n\t"
  12800. "adc r4, r4, #0\n\t"
  12801. "lsr r11, r7, #16\n\t"
  12802. "mul r6, r11, r6\n\t"
  12803. "lsr r11, r6, #16\n\t"
  12804. "lsl r6, r6, #16\n\t"
  12805. "adds r10, r10, r6\n\t"
  12806. "adc r4, r4, r11\n\t"
  12807. "adds r10, r10, r5\n\t"
  12808. "str r10, [%[a], #60]\n\t"
  12809. "adc r4, r4, #0\n\t"
  12810. /* a[i+16] += m[16] * mu */
  12811. "ldr r7, [%[m], #64]\n\t"
  12812. "ldr r10, [%[a], #64]\n\t"
  12813. "lsr r11, r7, #16\n\t"
  12814. "lsr r6, r8, #16\n\t"
  12815. "mul r5, r6, r11\n\t"
  12816. "lsl r11, r7, #16\n\t"
  12817. "lsr r11, r11, #16\n\t"
  12818. "mul r6, r11, r6\n\t"
  12819. "lsr r11, r6, #16\n\t"
  12820. "lsl r6, r6, #16\n\t"
  12821. "adds r10, r10, r6\n\t"
  12822. "adc r5, r5, r11\n\t"
  12823. "lsl r6, r8, #16\n\t"
  12824. "lsl r11, r7, #16\n\t"
  12825. "lsr r6, r6, #16\n\t"
  12826. "lsr r11, r11, #16\n\t"
  12827. "mul r11, r6, r11\n\t"
  12828. "adds r10, r10, r11\n\t"
  12829. "adc r5, r5, #0\n\t"
  12830. "lsr r11, r7, #16\n\t"
  12831. "mul r6, r11, r6\n\t"
  12832. "lsr r11, r6, #16\n\t"
  12833. "lsl r6, r6, #16\n\t"
  12834. "adds r10, r10, r6\n\t"
  12835. "adc r5, r5, r11\n\t"
  12836. "adds r10, r10, r4\n\t"
  12837. "str r10, [%[a], #64]\n\t"
  12838. "adc r5, r5, #0\n\t"
  12839. /* a[i+17] += m[17] * mu */
  12840. "ldr r7, [%[m], #68]\n\t"
  12841. "ldr r10, [%[a], #68]\n\t"
  12842. "lsr r11, r7, #16\n\t"
  12843. "lsr r6, r8, #16\n\t"
  12844. "mul r4, r6, r11\n\t"
  12845. "lsl r11, r7, #16\n\t"
  12846. "lsr r11, r11, #16\n\t"
  12847. "mul r6, r11, r6\n\t"
  12848. "lsr r11, r6, #16\n\t"
  12849. "lsl r6, r6, #16\n\t"
  12850. "adds r10, r10, r6\n\t"
  12851. "adc r4, r4, r11\n\t"
  12852. "lsl r6, r8, #16\n\t"
  12853. "lsl r11, r7, #16\n\t"
  12854. "lsr r6, r6, #16\n\t"
  12855. "lsr r11, r11, #16\n\t"
  12856. "mul r11, r6, r11\n\t"
  12857. "adds r10, r10, r11\n\t"
  12858. "adc r4, r4, #0\n\t"
  12859. "lsr r11, r7, #16\n\t"
  12860. "mul r6, r11, r6\n\t"
  12861. "lsr r11, r6, #16\n\t"
  12862. "lsl r6, r6, #16\n\t"
  12863. "adds r10, r10, r6\n\t"
  12864. "adc r4, r4, r11\n\t"
  12865. "adds r10, r10, r5\n\t"
  12866. "str r10, [%[a], #68]\n\t"
  12867. "adc r4, r4, #0\n\t"
  12868. /* a[i+18] += m[18] * mu */
  12869. "ldr r7, [%[m], #72]\n\t"
  12870. "ldr r10, [%[a], #72]\n\t"
  12871. "lsr r11, r7, #16\n\t"
  12872. "lsr r6, r8, #16\n\t"
  12873. "mul r5, r6, r11\n\t"
  12874. "lsl r11, r7, #16\n\t"
  12875. "lsr r11, r11, #16\n\t"
  12876. "mul r6, r11, r6\n\t"
  12877. "lsr r11, r6, #16\n\t"
  12878. "lsl r6, r6, #16\n\t"
  12879. "adds r10, r10, r6\n\t"
  12880. "adc r5, r5, r11\n\t"
  12881. "lsl r6, r8, #16\n\t"
  12882. "lsl r11, r7, #16\n\t"
  12883. "lsr r6, r6, #16\n\t"
  12884. "lsr r11, r11, #16\n\t"
  12885. "mul r11, r6, r11\n\t"
  12886. "adds r10, r10, r11\n\t"
  12887. "adc r5, r5, #0\n\t"
  12888. "lsr r11, r7, #16\n\t"
  12889. "mul r6, r11, r6\n\t"
  12890. "lsr r11, r6, #16\n\t"
  12891. "lsl r6, r6, #16\n\t"
  12892. "adds r10, r10, r6\n\t"
  12893. "adc r5, r5, r11\n\t"
  12894. "adds r10, r10, r4\n\t"
  12895. "str r10, [%[a], #72]\n\t"
  12896. "adc r5, r5, #0\n\t"
  12897. /* a[i+19] += m[19] * mu */
  12898. "ldr r7, [%[m], #76]\n\t"
  12899. "ldr r10, [%[a], #76]\n\t"
  12900. "lsr r11, r7, #16\n\t"
  12901. "lsr r6, r8, #16\n\t"
  12902. "mul r4, r6, r11\n\t"
  12903. "lsl r11, r7, #16\n\t"
  12904. "lsr r11, r11, #16\n\t"
  12905. "mul r6, r11, r6\n\t"
  12906. "lsr r11, r6, #16\n\t"
  12907. "lsl r6, r6, #16\n\t"
  12908. "adds r10, r10, r6\n\t"
  12909. "adc r4, r4, r11\n\t"
  12910. "lsl r6, r8, #16\n\t"
  12911. "lsl r11, r7, #16\n\t"
  12912. "lsr r6, r6, #16\n\t"
  12913. "lsr r11, r11, #16\n\t"
  12914. "mul r11, r6, r11\n\t"
  12915. "adds r10, r10, r11\n\t"
  12916. "adc r4, r4, #0\n\t"
  12917. "lsr r11, r7, #16\n\t"
  12918. "mul r6, r11, r6\n\t"
  12919. "lsr r11, r6, #16\n\t"
  12920. "lsl r6, r6, #16\n\t"
  12921. "adds r10, r10, r6\n\t"
  12922. "adc r4, r4, r11\n\t"
  12923. "adds r10, r10, r5\n\t"
  12924. "str r10, [%[a], #76]\n\t"
  12925. "adc r4, r4, #0\n\t"
  12926. /* a[i+20] += m[20] * mu */
  12927. "ldr r7, [%[m], #80]\n\t"
  12928. "ldr r10, [%[a], #80]\n\t"
  12929. "lsr r11, r7, #16\n\t"
  12930. "lsr r6, r8, #16\n\t"
  12931. "mul r5, r6, r11\n\t"
  12932. "lsl r11, r7, #16\n\t"
  12933. "lsr r11, r11, #16\n\t"
  12934. "mul r6, r11, r6\n\t"
  12935. "lsr r11, r6, #16\n\t"
  12936. "lsl r6, r6, #16\n\t"
  12937. "adds r10, r10, r6\n\t"
  12938. "adc r5, r5, r11\n\t"
  12939. "lsl r6, r8, #16\n\t"
  12940. "lsl r11, r7, #16\n\t"
  12941. "lsr r6, r6, #16\n\t"
  12942. "lsr r11, r11, #16\n\t"
  12943. "mul r11, r6, r11\n\t"
  12944. "adds r10, r10, r11\n\t"
  12945. "adc r5, r5, #0\n\t"
  12946. "lsr r11, r7, #16\n\t"
  12947. "mul r6, r11, r6\n\t"
  12948. "lsr r11, r6, #16\n\t"
  12949. "lsl r6, r6, #16\n\t"
  12950. "adds r10, r10, r6\n\t"
  12951. "adc r5, r5, r11\n\t"
  12952. "adds r10, r10, r4\n\t"
  12953. "str r10, [%[a], #80]\n\t"
  12954. "adc r5, r5, #0\n\t"
  12955. /* a[i+21] += m[21] * mu */
  12956. "ldr r7, [%[m], #84]\n\t"
  12957. "ldr r10, [%[a], #84]\n\t"
  12958. "lsr r11, r7, #16\n\t"
  12959. "lsr r6, r8, #16\n\t"
  12960. "mul r4, r6, r11\n\t"
  12961. "lsl r11, r7, #16\n\t"
  12962. "lsr r11, r11, #16\n\t"
  12963. "mul r6, r11, r6\n\t"
  12964. "lsr r11, r6, #16\n\t"
  12965. "lsl r6, r6, #16\n\t"
  12966. "adds r10, r10, r6\n\t"
  12967. "adc r4, r4, r11\n\t"
  12968. "lsl r6, r8, #16\n\t"
  12969. "lsl r11, r7, #16\n\t"
  12970. "lsr r6, r6, #16\n\t"
  12971. "lsr r11, r11, #16\n\t"
  12972. "mul r11, r6, r11\n\t"
  12973. "adds r10, r10, r11\n\t"
  12974. "adc r4, r4, #0\n\t"
  12975. "lsr r11, r7, #16\n\t"
  12976. "mul r6, r11, r6\n\t"
  12977. "lsr r11, r6, #16\n\t"
  12978. "lsl r6, r6, #16\n\t"
  12979. "adds r10, r10, r6\n\t"
  12980. "adc r4, r4, r11\n\t"
  12981. "adds r10, r10, r5\n\t"
  12982. "str r10, [%[a], #84]\n\t"
  12983. "adc r4, r4, #0\n\t"
  12984. /* a[i+22] += m[22] * mu */
  12985. "ldr r7, [%[m], #88]\n\t"
  12986. "ldr r10, [%[a], #88]\n\t"
  12987. "lsr r11, r7, #16\n\t"
  12988. "lsr r6, r8, #16\n\t"
  12989. "mul r5, r6, r11\n\t"
  12990. "lsl r11, r7, #16\n\t"
  12991. "lsr r11, r11, #16\n\t"
  12992. "mul r6, r11, r6\n\t"
  12993. "lsr r11, r6, #16\n\t"
  12994. "lsl r6, r6, #16\n\t"
  12995. "adds r10, r10, r6\n\t"
  12996. "adc r5, r5, r11\n\t"
  12997. "lsl r6, r8, #16\n\t"
  12998. "lsl r11, r7, #16\n\t"
  12999. "lsr r6, r6, #16\n\t"
  13000. "lsr r11, r11, #16\n\t"
  13001. "mul r11, r6, r11\n\t"
  13002. "adds r10, r10, r11\n\t"
  13003. "adc r5, r5, #0\n\t"
  13004. "lsr r11, r7, #16\n\t"
  13005. "mul r6, r11, r6\n\t"
  13006. "lsr r11, r6, #16\n\t"
  13007. "lsl r6, r6, #16\n\t"
  13008. "adds r10, r10, r6\n\t"
  13009. "adc r5, r5, r11\n\t"
  13010. "adds r10, r10, r4\n\t"
  13011. "str r10, [%[a], #88]\n\t"
  13012. "adc r5, r5, #0\n\t"
  13013. /* a[i+23] += m[23] * mu */
  13014. "ldr r7, [%[m], #92]\n\t"
  13015. "ldr r10, [%[a], #92]\n\t"
  13016. "lsr r11, r7, #16\n\t"
  13017. "lsr r6, r8, #16\n\t"
  13018. "mul r4, r6, r11\n\t"
  13019. "lsl r11, r7, #16\n\t"
  13020. "lsr r11, r11, #16\n\t"
  13021. "mul r6, r11, r6\n\t"
  13022. "lsr r11, r6, #16\n\t"
  13023. "lsl r6, r6, #16\n\t"
  13024. "adds r10, r10, r6\n\t"
  13025. "adc r4, r4, r11\n\t"
  13026. "lsl r6, r8, #16\n\t"
  13027. "lsl r11, r7, #16\n\t"
  13028. "lsr r6, r6, #16\n\t"
  13029. "lsr r11, r11, #16\n\t"
  13030. "mul r11, r6, r11\n\t"
  13031. "adds r10, r10, r11\n\t"
  13032. "adc r4, r4, #0\n\t"
  13033. "lsr r11, r7, #16\n\t"
  13034. "mul r6, r11, r6\n\t"
  13035. "lsr r11, r6, #16\n\t"
  13036. "lsl r6, r6, #16\n\t"
  13037. "adds r10, r10, r6\n\t"
  13038. "adc r4, r4, r11\n\t"
  13039. "adds r10, r10, r5\n\t"
  13040. "str r10, [%[a], #92]\n\t"
  13041. "adc r4, r4, #0\n\t"
  13042. /* a[i+24] += m[24] * mu */
  13043. "ldr r7, [%[m], #96]\n\t"
  13044. "ldr r10, [%[a], #96]\n\t"
  13045. "lsr r11, r7, #16\n\t"
  13046. "lsr r6, r8, #16\n\t"
  13047. "mul r5, r6, r11\n\t"
  13048. "lsl r11, r7, #16\n\t"
  13049. "lsr r11, r11, #16\n\t"
  13050. "mul r6, r11, r6\n\t"
  13051. "lsr r11, r6, #16\n\t"
  13052. "lsl r6, r6, #16\n\t"
  13053. "adds r10, r10, r6\n\t"
  13054. "adc r5, r5, r11\n\t"
  13055. "lsl r6, r8, #16\n\t"
  13056. "lsl r11, r7, #16\n\t"
  13057. "lsr r6, r6, #16\n\t"
  13058. "lsr r11, r11, #16\n\t"
  13059. "mul r11, r6, r11\n\t"
  13060. "adds r10, r10, r11\n\t"
  13061. "adc r5, r5, #0\n\t"
  13062. "lsr r11, r7, #16\n\t"
  13063. "mul r6, r11, r6\n\t"
  13064. "lsr r11, r6, #16\n\t"
  13065. "lsl r6, r6, #16\n\t"
  13066. "adds r10, r10, r6\n\t"
  13067. "adc r5, r5, r11\n\t"
  13068. "adds r10, r10, r4\n\t"
  13069. "str r10, [%[a], #96]\n\t"
  13070. "adc r5, r5, #0\n\t"
  13071. /* a[i+25] += m[25] * mu */
  13072. "ldr r7, [%[m], #100]\n\t"
  13073. "ldr r10, [%[a], #100]\n\t"
  13074. "lsr r11, r7, #16\n\t"
  13075. "lsr r6, r8, #16\n\t"
  13076. "mul r4, r6, r11\n\t"
  13077. "lsl r11, r7, #16\n\t"
  13078. "lsr r11, r11, #16\n\t"
  13079. "mul r6, r11, r6\n\t"
  13080. "lsr r11, r6, #16\n\t"
  13081. "lsl r6, r6, #16\n\t"
  13082. "adds r10, r10, r6\n\t"
  13083. "adc r4, r4, r11\n\t"
  13084. "lsl r6, r8, #16\n\t"
  13085. "lsl r11, r7, #16\n\t"
  13086. "lsr r6, r6, #16\n\t"
  13087. "lsr r11, r11, #16\n\t"
  13088. "mul r11, r6, r11\n\t"
  13089. "adds r10, r10, r11\n\t"
  13090. "adc r4, r4, #0\n\t"
  13091. "lsr r11, r7, #16\n\t"
  13092. "mul r6, r11, r6\n\t"
  13093. "lsr r11, r6, #16\n\t"
  13094. "lsl r6, r6, #16\n\t"
  13095. "adds r10, r10, r6\n\t"
  13096. "adc r4, r4, r11\n\t"
  13097. "adds r10, r10, r5\n\t"
  13098. "str r10, [%[a], #100]\n\t"
  13099. "adc r4, r4, #0\n\t"
  13100. /* a[i+26] += m[26] * mu */
  13101. "ldr r7, [%[m], #104]\n\t"
  13102. "ldr r10, [%[a], #104]\n\t"
  13103. "lsr r11, r7, #16\n\t"
  13104. "lsr r6, r8, #16\n\t"
  13105. "mul r5, r6, r11\n\t"
  13106. "lsl r11, r7, #16\n\t"
  13107. "lsr r11, r11, #16\n\t"
  13108. "mul r6, r11, r6\n\t"
  13109. "lsr r11, r6, #16\n\t"
  13110. "lsl r6, r6, #16\n\t"
  13111. "adds r10, r10, r6\n\t"
  13112. "adc r5, r5, r11\n\t"
  13113. "lsl r6, r8, #16\n\t"
  13114. "lsl r11, r7, #16\n\t"
  13115. "lsr r6, r6, #16\n\t"
  13116. "lsr r11, r11, #16\n\t"
  13117. "mul r11, r6, r11\n\t"
  13118. "adds r10, r10, r11\n\t"
  13119. "adc r5, r5, #0\n\t"
  13120. "lsr r11, r7, #16\n\t"
  13121. "mul r6, r11, r6\n\t"
  13122. "lsr r11, r6, #16\n\t"
  13123. "lsl r6, r6, #16\n\t"
  13124. "adds r10, r10, r6\n\t"
  13125. "adc r5, r5, r11\n\t"
  13126. "adds r10, r10, r4\n\t"
  13127. "str r10, [%[a], #104]\n\t"
  13128. "adc r5, r5, #0\n\t"
  13129. /* a[i+27] += m[27] * mu */
  13130. "ldr r7, [%[m], #108]\n\t"
  13131. "ldr r10, [%[a], #108]\n\t"
  13132. "lsr r11, r7, #16\n\t"
  13133. "lsr r6, r8, #16\n\t"
  13134. "mul r4, r6, r11\n\t"
  13135. "lsl r11, r7, #16\n\t"
  13136. "lsr r11, r11, #16\n\t"
  13137. "mul r6, r11, r6\n\t"
  13138. "lsr r11, r6, #16\n\t"
  13139. "lsl r6, r6, #16\n\t"
  13140. "adds r10, r10, r6\n\t"
  13141. "adc r4, r4, r11\n\t"
  13142. "lsl r6, r8, #16\n\t"
  13143. "lsl r11, r7, #16\n\t"
  13144. "lsr r6, r6, #16\n\t"
  13145. "lsr r11, r11, #16\n\t"
  13146. "mul r11, r6, r11\n\t"
  13147. "adds r10, r10, r11\n\t"
  13148. "adc r4, r4, #0\n\t"
  13149. "lsr r11, r7, #16\n\t"
  13150. "mul r6, r11, r6\n\t"
  13151. "lsr r11, r6, #16\n\t"
  13152. "lsl r6, r6, #16\n\t"
  13153. "adds r10, r10, r6\n\t"
  13154. "adc r4, r4, r11\n\t"
  13155. "adds r10, r10, r5\n\t"
  13156. "str r10, [%[a], #108]\n\t"
  13157. "adc r4, r4, #0\n\t"
  13158. /* a[i+28] += m[28] * mu */
  13159. "ldr r7, [%[m], #112]\n\t"
  13160. "ldr r10, [%[a], #112]\n\t"
  13161. "lsr r11, r7, #16\n\t"
  13162. "lsr r6, r8, #16\n\t"
  13163. "mul r5, r6, r11\n\t"
  13164. "lsl r11, r7, #16\n\t"
  13165. "lsr r11, r11, #16\n\t"
  13166. "mul r6, r11, r6\n\t"
  13167. "lsr r11, r6, #16\n\t"
  13168. "lsl r6, r6, #16\n\t"
  13169. "adds r10, r10, r6\n\t"
  13170. "adc r5, r5, r11\n\t"
  13171. "lsl r6, r8, #16\n\t"
  13172. "lsl r11, r7, #16\n\t"
  13173. "lsr r6, r6, #16\n\t"
  13174. "lsr r11, r11, #16\n\t"
  13175. "mul r11, r6, r11\n\t"
  13176. "adds r10, r10, r11\n\t"
  13177. "adc r5, r5, #0\n\t"
  13178. "lsr r11, r7, #16\n\t"
  13179. "mul r6, r11, r6\n\t"
  13180. "lsr r11, r6, #16\n\t"
  13181. "lsl r6, r6, #16\n\t"
  13182. "adds r10, r10, r6\n\t"
  13183. "adc r5, r5, r11\n\t"
  13184. "adds r10, r10, r4\n\t"
  13185. "str r10, [%[a], #112]\n\t"
  13186. "adc r5, r5, #0\n\t"
  13187. /* a[i+29] += m[29] * mu */
  13188. "ldr r7, [%[m], #116]\n\t"
  13189. "ldr r10, [%[a], #116]\n\t"
  13190. "lsr r11, r7, #16\n\t"
  13191. "lsr r6, r8, #16\n\t"
  13192. "mul r4, r6, r11\n\t"
  13193. "lsl r11, r7, #16\n\t"
  13194. "lsr r11, r11, #16\n\t"
  13195. "mul r6, r11, r6\n\t"
  13196. "lsr r11, r6, #16\n\t"
  13197. "lsl r6, r6, #16\n\t"
  13198. "adds r10, r10, r6\n\t"
  13199. "adc r4, r4, r11\n\t"
  13200. "lsl r6, r8, #16\n\t"
  13201. "lsl r11, r7, #16\n\t"
  13202. "lsr r6, r6, #16\n\t"
  13203. "lsr r11, r11, #16\n\t"
  13204. "mul r11, r6, r11\n\t"
  13205. "adds r10, r10, r11\n\t"
  13206. "adc r4, r4, #0\n\t"
  13207. "lsr r11, r7, #16\n\t"
  13208. "mul r6, r11, r6\n\t"
  13209. "lsr r11, r6, #16\n\t"
  13210. "lsl r6, r6, #16\n\t"
  13211. "adds r10, r10, r6\n\t"
  13212. "adc r4, r4, r11\n\t"
  13213. "adds r10, r10, r5\n\t"
  13214. "str r10, [%[a], #116]\n\t"
  13215. "adc r4, r4, #0\n\t"
  13216. /* a[i+30] += m[30] * mu */
  13217. "ldr r7, [%[m], #120]\n\t"
  13218. "ldr r10, [%[a], #120]\n\t"
  13219. "lsr r11, r7, #16\n\t"
  13220. "lsr r6, r8, #16\n\t"
  13221. "mul r5, r6, r11\n\t"
  13222. "lsl r11, r7, #16\n\t"
  13223. "lsr r11, r11, #16\n\t"
  13224. "mul r6, r11, r6\n\t"
  13225. "lsr r11, r6, #16\n\t"
  13226. "lsl r6, r6, #16\n\t"
  13227. "adds r10, r10, r6\n\t"
  13228. "adc r5, r5, r11\n\t"
  13229. "lsl r6, r8, #16\n\t"
  13230. "lsl r11, r7, #16\n\t"
  13231. "lsr r6, r6, #16\n\t"
  13232. "lsr r11, r11, #16\n\t"
  13233. "mul r11, r6, r11\n\t"
  13234. "adds r10, r10, r11\n\t"
  13235. "adc r5, r5, #0\n\t"
  13236. "lsr r11, r7, #16\n\t"
  13237. "mul r6, r11, r6\n\t"
  13238. "lsr r11, r6, #16\n\t"
  13239. "lsl r6, r6, #16\n\t"
  13240. "adds r10, r10, r6\n\t"
  13241. "adc r5, r5, r11\n\t"
  13242. "adds r10, r10, r4\n\t"
  13243. "str r10, [%[a], #120]\n\t"
  13244. "adc r5, r5, #0\n\t"
  13245. /* a[i+31] += m[31] * mu */
  13246. "ldr r7, [%[m], #124]\n\t"
  13247. "ldr r10, [%[a], #124]\n\t"
  13248. "lsr r11, r7, #16\n\t"
  13249. "lsr r6, r8, #16\n\t"
  13250. "mul r4, r6, r11\n\t"
  13251. "lsl r11, r7, #16\n\t"
  13252. "lsr r11, r11, #16\n\t"
  13253. "mul r6, r11, r6\n\t"
  13254. "lsr r11, r6, #16\n\t"
  13255. "lsl r6, r6, #16\n\t"
  13256. "adds r10, r10, r6\n\t"
  13257. "adc r4, r4, r11\n\t"
  13258. "lsl r6, r8, #16\n\t"
  13259. "lsl r11, r7, #16\n\t"
  13260. "lsr r6, r6, #16\n\t"
  13261. "lsr r11, r11, #16\n\t"
  13262. "mul r11, r6, r11\n\t"
  13263. "adds r10, r10, r11\n\t"
  13264. "adc r4, r4, #0\n\t"
  13265. "lsr r11, r7, #16\n\t"
  13266. "mul r6, r11, r6\n\t"
  13267. "lsr r11, r6, #16\n\t"
  13268. "lsl r6, r6, #16\n\t"
  13269. "adds r10, r10, r6\n\t"
  13270. "adc r4, r4, r11\n\t"
  13271. "adds r10, r10, r5\n\t"
  13272. "str r10, [%[a], #124]\n\t"
  13273. "adc r4, r4, #0\n\t"
  13274. /* a[i+32] += m[32] * mu */
  13275. "ldr r7, [%[m], #128]\n\t"
  13276. "ldr r10, [%[a], #128]\n\t"
  13277. "lsr r11, r7, #16\n\t"
  13278. "lsr r6, r8, #16\n\t"
  13279. "mul r5, r6, r11\n\t"
  13280. "lsl r11, r7, #16\n\t"
  13281. "lsr r11, r11, #16\n\t"
  13282. "mul r6, r11, r6\n\t"
  13283. "lsr r11, r6, #16\n\t"
  13284. "lsl r6, r6, #16\n\t"
  13285. "adds r10, r10, r6\n\t"
  13286. "adc r5, r5, r11\n\t"
  13287. "lsl r6, r8, #16\n\t"
  13288. "lsl r11, r7, #16\n\t"
  13289. "lsr r6, r6, #16\n\t"
  13290. "lsr r11, r11, #16\n\t"
  13291. "mul r11, r6, r11\n\t"
  13292. "adds r10, r10, r11\n\t"
  13293. "adc r5, r5, #0\n\t"
  13294. "lsr r11, r7, #16\n\t"
  13295. "mul r6, r11, r6\n\t"
  13296. "lsr r11, r6, #16\n\t"
  13297. "lsl r6, r6, #16\n\t"
  13298. "adds r10, r10, r6\n\t"
  13299. "adc r5, r5, r11\n\t"
  13300. "adds r10, r10, r4\n\t"
  13301. "str r10, [%[a], #128]\n\t"
  13302. "adc r5, r5, #0\n\t"
  13303. /* a[i+33] += m[33] * mu */
  13304. "ldr r7, [%[m], #132]\n\t"
  13305. "ldr r10, [%[a], #132]\n\t"
  13306. "lsr r11, r7, #16\n\t"
  13307. "lsr r6, r8, #16\n\t"
  13308. "mul r4, r6, r11\n\t"
  13309. "lsl r11, r7, #16\n\t"
  13310. "lsr r11, r11, #16\n\t"
  13311. "mul r6, r11, r6\n\t"
  13312. "lsr r11, r6, #16\n\t"
  13313. "lsl r6, r6, #16\n\t"
  13314. "adds r10, r10, r6\n\t"
  13315. "adc r4, r4, r11\n\t"
  13316. "lsl r6, r8, #16\n\t"
  13317. "lsl r11, r7, #16\n\t"
  13318. "lsr r6, r6, #16\n\t"
  13319. "lsr r11, r11, #16\n\t"
  13320. "mul r11, r6, r11\n\t"
  13321. "adds r10, r10, r11\n\t"
  13322. "adc r4, r4, #0\n\t"
  13323. "lsr r11, r7, #16\n\t"
  13324. "mul r6, r11, r6\n\t"
  13325. "lsr r11, r6, #16\n\t"
  13326. "lsl r6, r6, #16\n\t"
  13327. "adds r10, r10, r6\n\t"
  13328. "adc r4, r4, r11\n\t"
  13329. "adds r10, r10, r5\n\t"
  13330. "str r10, [%[a], #132]\n\t"
  13331. "adc r4, r4, #0\n\t"
  13332. /* a[i+34] += m[34] * mu */
  13333. "ldr r7, [%[m], #136]\n\t"
  13334. "ldr r10, [%[a], #136]\n\t"
  13335. "lsr r11, r7, #16\n\t"
  13336. "lsr r6, r8, #16\n\t"
  13337. "mul r5, r6, r11\n\t"
  13338. "lsl r11, r7, #16\n\t"
  13339. "lsr r11, r11, #16\n\t"
  13340. "mul r6, r11, r6\n\t"
  13341. "lsr r11, r6, #16\n\t"
  13342. "lsl r6, r6, #16\n\t"
  13343. "adds r10, r10, r6\n\t"
  13344. "adc r5, r5, r11\n\t"
  13345. "lsl r6, r8, #16\n\t"
  13346. "lsl r11, r7, #16\n\t"
  13347. "lsr r6, r6, #16\n\t"
  13348. "lsr r11, r11, #16\n\t"
  13349. "mul r11, r6, r11\n\t"
  13350. "adds r10, r10, r11\n\t"
  13351. "adc r5, r5, #0\n\t"
  13352. "lsr r11, r7, #16\n\t"
  13353. "mul r6, r11, r6\n\t"
  13354. "lsr r11, r6, #16\n\t"
  13355. "lsl r6, r6, #16\n\t"
  13356. "adds r10, r10, r6\n\t"
  13357. "adc r5, r5, r11\n\t"
  13358. "adds r10, r10, r4\n\t"
  13359. "str r10, [%[a], #136]\n\t"
  13360. "adc r5, r5, #0\n\t"
  13361. /* a[i+35] += m[35] * mu */
  13362. "ldr r7, [%[m], #140]\n\t"
  13363. "ldr r10, [%[a], #140]\n\t"
  13364. "lsr r11, r7, #16\n\t"
  13365. "lsr r6, r8, #16\n\t"
  13366. "mul r4, r6, r11\n\t"
  13367. "lsl r11, r7, #16\n\t"
  13368. "lsr r11, r11, #16\n\t"
  13369. "mul r6, r11, r6\n\t"
  13370. "lsr r11, r6, #16\n\t"
  13371. "lsl r6, r6, #16\n\t"
  13372. "adds r10, r10, r6\n\t"
  13373. "adc r4, r4, r11\n\t"
  13374. "lsl r6, r8, #16\n\t"
  13375. "lsl r11, r7, #16\n\t"
  13376. "lsr r6, r6, #16\n\t"
  13377. "lsr r11, r11, #16\n\t"
  13378. "mul r11, r6, r11\n\t"
  13379. "adds r10, r10, r11\n\t"
  13380. "adc r4, r4, #0\n\t"
  13381. "lsr r11, r7, #16\n\t"
  13382. "mul r6, r11, r6\n\t"
  13383. "lsr r11, r6, #16\n\t"
  13384. "lsl r6, r6, #16\n\t"
  13385. "adds r10, r10, r6\n\t"
  13386. "adc r4, r4, r11\n\t"
  13387. "adds r10, r10, r5\n\t"
  13388. "str r10, [%[a], #140]\n\t"
  13389. "adc r4, r4, #0\n\t"
  13390. /* a[i+36] += m[36] * mu */
  13391. "ldr r7, [%[m], #144]\n\t"
  13392. "ldr r10, [%[a], #144]\n\t"
  13393. "lsr r11, r7, #16\n\t"
  13394. "lsr r6, r8, #16\n\t"
  13395. "mul r5, r6, r11\n\t"
  13396. "lsl r11, r7, #16\n\t"
  13397. "lsr r11, r11, #16\n\t"
  13398. "mul r6, r11, r6\n\t"
  13399. "lsr r11, r6, #16\n\t"
  13400. "lsl r6, r6, #16\n\t"
  13401. "adds r10, r10, r6\n\t"
  13402. "adc r5, r5, r11\n\t"
  13403. "lsl r6, r8, #16\n\t"
  13404. "lsl r11, r7, #16\n\t"
  13405. "lsr r6, r6, #16\n\t"
  13406. "lsr r11, r11, #16\n\t"
  13407. "mul r11, r6, r11\n\t"
  13408. "adds r10, r10, r11\n\t"
  13409. "adc r5, r5, #0\n\t"
  13410. "lsr r11, r7, #16\n\t"
  13411. "mul r6, r11, r6\n\t"
  13412. "lsr r11, r6, #16\n\t"
  13413. "lsl r6, r6, #16\n\t"
  13414. "adds r10, r10, r6\n\t"
  13415. "adc r5, r5, r11\n\t"
  13416. "adds r10, r10, r4\n\t"
  13417. "str r10, [%[a], #144]\n\t"
  13418. "adc r5, r5, #0\n\t"
  13419. /* a[i+37] += m[37] * mu */
  13420. "ldr r7, [%[m], #148]\n\t"
  13421. "ldr r10, [%[a], #148]\n\t"
  13422. "lsr r11, r7, #16\n\t"
  13423. "lsr r6, r8, #16\n\t"
  13424. "mul r4, r6, r11\n\t"
  13425. "lsl r11, r7, #16\n\t"
  13426. "lsr r11, r11, #16\n\t"
  13427. "mul r6, r11, r6\n\t"
  13428. "lsr r11, r6, #16\n\t"
  13429. "lsl r6, r6, #16\n\t"
  13430. "adds r10, r10, r6\n\t"
  13431. "adc r4, r4, r11\n\t"
  13432. "lsl r6, r8, #16\n\t"
  13433. "lsl r11, r7, #16\n\t"
  13434. "lsr r6, r6, #16\n\t"
  13435. "lsr r11, r11, #16\n\t"
  13436. "mul r11, r6, r11\n\t"
  13437. "adds r10, r10, r11\n\t"
  13438. "adc r4, r4, #0\n\t"
  13439. "lsr r11, r7, #16\n\t"
  13440. "mul r6, r11, r6\n\t"
  13441. "lsr r11, r6, #16\n\t"
  13442. "lsl r6, r6, #16\n\t"
  13443. "adds r10, r10, r6\n\t"
  13444. "adc r4, r4, r11\n\t"
  13445. "adds r10, r10, r5\n\t"
  13446. "str r10, [%[a], #148]\n\t"
  13447. "adc r4, r4, #0\n\t"
  13448. /* a[i+38] += m[38] * mu */
  13449. "ldr r7, [%[m], #152]\n\t"
  13450. "ldr r10, [%[a], #152]\n\t"
  13451. "lsr r11, r7, #16\n\t"
  13452. "lsr r6, r8, #16\n\t"
  13453. "mul r5, r6, r11\n\t"
  13454. "lsl r11, r7, #16\n\t"
  13455. "lsr r11, r11, #16\n\t"
  13456. "mul r6, r11, r6\n\t"
  13457. "lsr r11, r6, #16\n\t"
  13458. "lsl r6, r6, #16\n\t"
  13459. "adds r10, r10, r6\n\t"
  13460. "adc r5, r5, r11\n\t"
  13461. "lsl r6, r8, #16\n\t"
  13462. "lsl r11, r7, #16\n\t"
  13463. "lsr r6, r6, #16\n\t"
  13464. "lsr r11, r11, #16\n\t"
  13465. "mul r11, r6, r11\n\t"
  13466. "adds r10, r10, r11\n\t"
  13467. "adc r5, r5, #0\n\t"
  13468. "lsr r11, r7, #16\n\t"
  13469. "mul r6, r11, r6\n\t"
  13470. "lsr r11, r6, #16\n\t"
  13471. "lsl r6, r6, #16\n\t"
  13472. "adds r10, r10, r6\n\t"
  13473. "adc r5, r5, r11\n\t"
  13474. "adds r10, r10, r4\n\t"
  13475. "str r10, [%[a], #152]\n\t"
  13476. "adc r5, r5, #0\n\t"
  13477. /* a[i+39] += m[39] * mu */
  13478. "ldr r7, [%[m], #156]\n\t"
  13479. "ldr r10, [%[a], #156]\n\t"
  13480. "lsr r11, r7, #16\n\t"
  13481. "lsr r6, r8, #16\n\t"
  13482. "mul r4, r6, r11\n\t"
  13483. "lsl r11, r7, #16\n\t"
  13484. "lsr r11, r11, #16\n\t"
  13485. "mul r6, r11, r6\n\t"
  13486. "lsr r11, r6, #16\n\t"
  13487. "lsl r6, r6, #16\n\t"
  13488. "adds r10, r10, r6\n\t"
  13489. "adc r4, r4, r11\n\t"
  13490. "lsl r6, r8, #16\n\t"
  13491. "lsl r11, r7, #16\n\t"
  13492. "lsr r6, r6, #16\n\t"
  13493. "lsr r11, r11, #16\n\t"
  13494. "mul r11, r6, r11\n\t"
  13495. "adds r10, r10, r11\n\t"
  13496. "adc r4, r4, #0\n\t"
  13497. "lsr r11, r7, #16\n\t"
  13498. "mul r6, r11, r6\n\t"
  13499. "lsr r11, r6, #16\n\t"
  13500. "lsl r6, r6, #16\n\t"
  13501. "adds r10, r10, r6\n\t"
  13502. "adc r4, r4, r11\n\t"
  13503. "adds r10, r10, r5\n\t"
  13504. "str r10, [%[a], #156]\n\t"
  13505. "adc r4, r4, #0\n\t"
  13506. /* a[i+40] += m[40] * mu */
  13507. "ldr r7, [%[m], #160]\n\t"
  13508. "ldr r10, [%[a], #160]\n\t"
  13509. "lsr r11, r7, #16\n\t"
  13510. "lsr r6, r8, #16\n\t"
  13511. "mul r5, r6, r11\n\t"
  13512. "lsl r11, r7, #16\n\t"
  13513. "lsr r11, r11, #16\n\t"
  13514. "mul r6, r11, r6\n\t"
  13515. "lsr r11, r6, #16\n\t"
  13516. "lsl r6, r6, #16\n\t"
  13517. "adds r10, r10, r6\n\t"
  13518. "adc r5, r5, r11\n\t"
  13519. "lsl r6, r8, #16\n\t"
  13520. "lsl r11, r7, #16\n\t"
  13521. "lsr r6, r6, #16\n\t"
  13522. "lsr r11, r11, #16\n\t"
  13523. "mul r11, r6, r11\n\t"
  13524. "adds r10, r10, r11\n\t"
  13525. "adc r5, r5, #0\n\t"
  13526. "lsr r11, r7, #16\n\t"
  13527. "mul r6, r11, r6\n\t"
  13528. "lsr r11, r6, #16\n\t"
  13529. "lsl r6, r6, #16\n\t"
  13530. "adds r10, r10, r6\n\t"
  13531. "adc r5, r5, r11\n\t"
  13532. "adds r10, r10, r4\n\t"
  13533. "str r10, [%[a], #160]\n\t"
  13534. "adc r5, r5, #0\n\t"
  13535. /* a[i+41] += m[41] * mu */
  13536. "ldr r7, [%[m], #164]\n\t"
  13537. "ldr r10, [%[a], #164]\n\t"
  13538. "lsr r11, r7, #16\n\t"
  13539. "lsr r6, r8, #16\n\t"
  13540. "mul r4, r6, r11\n\t"
  13541. "lsl r11, r7, #16\n\t"
  13542. "lsr r11, r11, #16\n\t"
  13543. "mul r6, r11, r6\n\t"
  13544. "lsr r11, r6, #16\n\t"
  13545. "lsl r6, r6, #16\n\t"
  13546. "adds r10, r10, r6\n\t"
  13547. "adc r4, r4, r11\n\t"
  13548. "lsl r6, r8, #16\n\t"
  13549. "lsl r11, r7, #16\n\t"
  13550. "lsr r6, r6, #16\n\t"
  13551. "lsr r11, r11, #16\n\t"
  13552. "mul r11, r6, r11\n\t"
  13553. "adds r10, r10, r11\n\t"
  13554. "adc r4, r4, #0\n\t"
  13555. "lsr r11, r7, #16\n\t"
  13556. "mul r6, r11, r6\n\t"
  13557. "lsr r11, r6, #16\n\t"
  13558. "lsl r6, r6, #16\n\t"
  13559. "adds r10, r10, r6\n\t"
  13560. "adc r4, r4, r11\n\t"
  13561. "adds r10, r10, r5\n\t"
  13562. "str r10, [%[a], #164]\n\t"
  13563. "adc r4, r4, #0\n\t"
  13564. /* a[i+42] += m[42] * mu */
  13565. "ldr r7, [%[m], #168]\n\t"
  13566. "ldr r10, [%[a], #168]\n\t"
  13567. "lsr r11, r7, #16\n\t"
  13568. "lsr r6, r8, #16\n\t"
  13569. "mul r5, r6, r11\n\t"
  13570. "lsl r11, r7, #16\n\t"
  13571. "lsr r11, r11, #16\n\t"
  13572. "mul r6, r11, r6\n\t"
  13573. "lsr r11, r6, #16\n\t"
  13574. "lsl r6, r6, #16\n\t"
  13575. "adds r10, r10, r6\n\t"
  13576. "adc r5, r5, r11\n\t"
  13577. "lsl r6, r8, #16\n\t"
  13578. "lsl r11, r7, #16\n\t"
  13579. "lsr r6, r6, #16\n\t"
  13580. "lsr r11, r11, #16\n\t"
  13581. "mul r11, r6, r11\n\t"
  13582. "adds r10, r10, r11\n\t"
  13583. "adc r5, r5, #0\n\t"
  13584. "lsr r11, r7, #16\n\t"
  13585. "mul r6, r11, r6\n\t"
  13586. "lsr r11, r6, #16\n\t"
  13587. "lsl r6, r6, #16\n\t"
  13588. "adds r10, r10, r6\n\t"
  13589. "adc r5, r5, r11\n\t"
  13590. "adds r10, r10, r4\n\t"
  13591. "str r10, [%[a], #168]\n\t"
  13592. "adc r5, r5, #0\n\t"
  13593. /* a[i+43] += m[43] * mu */
  13594. "ldr r7, [%[m], #172]\n\t"
  13595. "ldr r10, [%[a], #172]\n\t"
  13596. "lsr r11, r7, #16\n\t"
  13597. "lsr r6, r8, #16\n\t"
  13598. "mul r4, r6, r11\n\t"
  13599. "lsl r11, r7, #16\n\t"
  13600. "lsr r11, r11, #16\n\t"
  13601. "mul r6, r11, r6\n\t"
  13602. "lsr r11, r6, #16\n\t"
  13603. "lsl r6, r6, #16\n\t"
  13604. "adds r10, r10, r6\n\t"
  13605. "adc r4, r4, r11\n\t"
  13606. "lsl r6, r8, #16\n\t"
  13607. "lsl r11, r7, #16\n\t"
  13608. "lsr r6, r6, #16\n\t"
  13609. "lsr r11, r11, #16\n\t"
  13610. "mul r11, r6, r11\n\t"
  13611. "adds r10, r10, r11\n\t"
  13612. "adc r4, r4, #0\n\t"
  13613. "lsr r11, r7, #16\n\t"
  13614. "mul r6, r11, r6\n\t"
  13615. "lsr r11, r6, #16\n\t"
  13616. "lsl r6, r6, #16\n\t"
  13617. "adds r10, r10, r6\n\t"
  13618. "adc r4, r4, r11\n\t"
  13619. "adds r10, r10, r5\n\t"
  13620. "str r10, [%[a], #172]\n\t"
  13621. "adc r4, r4, #0\n\t"
  13622. /* a[i+44] += m[44] * mu */
  13623. "ldr r7, [%[m], #176]\n\t"
  13624. "ldr r10, [%[a], #176]\n\t"
  13625. "lsr r11, r7, #16\n\t"
  13626. "lsr r6, r8, #16\n\t"
  13627. "mul r5, r6, r11\n\t"
  13628. "lsl r11, r7, #16\n\t"
  13629. "lsr r11, r11, #16\n\t"
  13630. "mul r6, r11, r6\n\t"
  13631. "lsr r11, r6, #16\n\t"
  13632. "lsl r6, r6, #16\n\t"
  13633. "adds r10, r10, r6\n\t"
  13634. "adc r5, r5, r11\n\t"
  13635. "lsl r6, r8, #16\n\t"
  13636. "lsl r11, r7, #16\n\t"
  13637. "lsr r6, r6, #16\n\t"
  13638. "lsr r11, r11, #16\n\t"
  13639. "mul r11, r6, r11\n\t"
  13640. "adds r10, r10, r11\n\t"
  13641. "adc r5, r5, #0\n\t"
  13642. "lsr r11, r7, #16\n\t"
  13643. "mul r6, r11, r6\n\t"
  13644. "lsr r11, r6, #16\n\t"
  13645. "lsl r6, r6, #16\n\t"
  13646. "adds r10, r10, r6\n\t"
  13647. "adc r5, r5, r11\n\t"
  13648. "adds r10, r10, r4\n\t"
  13649. "str r10, [%[a], #176]\n\t"
  13650. "adc r5, r5, #0\n\t"
  13651. /* a[i+45] += m[45] * mu */
  13652. "ldr r7, [%[m], #180]\n\t"
  13653. "ldr r10, [%[a], #180]\n\t"
  13654. "lsr r11, r7, #16\n\t"
  13655. "lsr r6, r8, #16\n\t"
  13656. "mul r4, r6, r11\n\t"
  13657. "lsl r11, r7, #16\n\t"
  13658. "lsr r11, r11, #16\n\t"
  13659. "mul r6, r11, r6\n\t"
  13660. "lsr r11, r6, #16\n\t"
  13661. "lsl r6, r6, #16\n\t"
  13662. "adds r10, r10, r6\n\t"
  13663. "adc r4, r4, r11\n\t"
  13664. "lsl r6, r8, #16\n\t"
  13665. "lsl r11, r7, #16\n\t"
  13666. "lsr r6, r6, #16\n\t"
  13667. "lsr r11, r11, #16\n\t"
  13668. "mul r11, r6, r11\n\t"
  13669. "adds r10, r10, r11\n\t"
  13670. "adc r4, r4, #0\n\t"
  13671. "lsr r11, r7, #16\n\t"
  13672. "mul r6, r11, r6\n\t"
  13673. "lsr r11, r6, #16\n\t"
  13674. "lsl r6, r6, #16\n\t"
  13675. "adds r10, r10, r6\n\t"
  13676. "adc r4, r4, r11\n\t"
  13677. "adds r10, r10, r5\n\t"
  13678. "str r10, [%[a], #180]\n\t"
  13679. "adc r4, r4, #0\n\t"
  13680. /* a[i+46] += m[46] * mu */
  13681. "ldr r7, [%[m], #184]\n\t"
  13682. "ldr r10, [%[a], #184]\n\t"
  13683. "lsr r11, r7, #16\n\t"
  13684. "lsr r6, r8, #16\n\t"
  13685. "mul r5, r6, r11\n\t"
  13686. "lsl r11, r7, #16\n\t"
  13687. "lsr r11, r11, #16\n\t"
  13688. "mul r6, r11, r6\n\t"
  13689. "lsr r11, r6, #16\n\t"
  13690. "lsl r6, r6, #16\n\t"
  13691. "adds r10, r10, r6\n\t"
  13692. "adc r5, r5, r11\n\t"
  13693. "lsl r6, r8, #16\n\t"
  13694. "lsl r11, r7, #16\n\t"
  13695. "lsr r6, r6, #16\n\t"
  13696. "lsr r11, r11, #16\n\t"
  13697. "mul r11, r6, r11\n\t"
  13698. "adds r10, r10, r11\n\t"
  13699. "adc r5, r5, #0\n\t"
  13700. "lsr r11, r7, #16\n\t"
  13701. "mul r6, r11, r6\n\t"
  13702. "lsr r11, r6, #16\n\t"
  13703. "lsl r6, r6, #16\n\t"
  13704. "adds r10, r10, r6\n\t"
  13705. "adc r5, r5, r11\n\t"
  13706. "adds r10, r10, r4\n\t"
  13707. "str r10, [%[a], #184]\n\t"
  13708. "adc r5, r5, #0\n\t"
  13709. /* a[i+47] += m[47] * mu */
  13710. "ldr r7, [%[m], #188]\n\t"
  13711. "ldr r10, [%[a], #188]\n\t"
  13712. "lsr r11, r7, #16\n\t"
  13713. "lsr r6, r8, #16\n\t"
  13714. "mul r4, r6, r11\n\t"
  13715. "lsl r11, r7, #16\n\t"
  13716. "lsr r11, r11, #16\n\t"
  13717. "mul r6, r11, r6\n\t"
  13718. "lsr r11, r6, #16\n\t"
  13719. "lsl r6, r6, #16\n\t"
  13720. "adds r10, r10, r6\n\t"
  13721. "adc r4, r4, r11\n\t"
  13722. "lsl r6, r8, #16\n\t"
  13723. "lsl r11, r7, #16\n\t"
  13724. "lsr r6, r6, #16\n\t"
  13725. "lsr r11, r11, #16\n\t"
  13726. "mul r11, r6, r11\n\t"
  13727. "adds r10, r10, r11\n\t"
  13728. "adc r4, r4, #0\n\t"
  13729. "lsr r11, r7, #16\n\t"
  13730. "mul r6, r11, r6\n\t"
  13731. "lsr r11, r6, #16\n\t"
  13732. "lsl r6, r6, #16\n\t"
  13733. "adds r10, r10, r6\n\t"
  13734. "adc r4, r4, r11\n\t"
  13735. "adds r10, r10, r5\n\t"
  13736. "str r10, [%[a], #188]\n\t"
  13737. "adc r4, r4, #0\n\t"
  13738. /* a[i+48] += m[48] * mu */
  13739. "ldr r7, [%[m], #192]\n\t"
  13740. "ldr r10, [%[a], #192]\n\t"
  13741. "lsr r11, r7, #16\n\t"
  13742. "lsr r6, r8, #16\n\t"
  13743. "mul r5, r6, r11\n\t"
  13744. "lsl r11, r7, #16\n\t"
  13745. "lsr r11, r11, #16\n\t"
  13746. "mul r6, r11, r6\n\t"
  13747. "lsr r11, r6, #16\n\t"
  13748. "lsl r6, r6, #16\n\t"
  13749. "adds r10, r10, r6\n\t"
  13750. "adc r5, r5, r11\n\t"
  13751. "lsl r6, r8, #16\n\t"
  13752. "lsl r11, r7, #16\n\t"
  13753. "lsr r6, r6, #16\n\t"
  13754. "lsr r11, r11, #16\n\t"
  13755. "mul r11, r6, r11\n\t"
  13756. "adds r10, r10, r11\n\t"
  13757. "adc r5, r5, #0\n\t"
  13758. "lsr r11, r7, #16\n\t"
  13759. "mul r6, r11, r6\n\t"
  13760. "lsr r11, r6, #16\n\t"
  13761. "lsl r6, r6, #16\n\t"
  13762. "adds r10, r10, r6\n\t"
  13763. "adc r5, r5, r11\n\t"
  13764. "adds r10, r10, r4\n\t"
  13765. "str r10, [%[a], #192]\n\t"
  13766. "adc r5, r5, #0\n\t"
  13767. /* a[i+49] += m[49] * mu */
  13768. "ldr r7, [%[m], #196]\n\t"
  13769. "ldr r10, [%[a], #196]\n\t"
  13770. "lsr r11, r7, #16\n\t"
  13771. "lsr r6, r8, #16\n\t"
  13772. "mul r4, r6, r11\n\t"
  13773. "lsl r11, r7, #16\n\t"
  13774. "lsr r11, r11, #16\n\t"
  13775. "mul r6, r11, r6\n\t"
  13776. "lsr r11, r6, #16\n\t"
  13777. "lsl r6, r6, #16\n\t"
  13778. "adds r10, r10, r6\n\t"
  13779. "adc r4, r4, r11\n\t"
  13780. "lsl r6, r8, #16\n\t"
  13781. "lsl r11, r7, #16\n\t"
  13782. "lsr r6, r6, #16\n\t"
  13783. "lsr r11, r11, #16\n\t"
  13784. "mul r11, r6, r11\n\t"
  13785. "adds r10, r10, r11\n\t"
  13786. "adc r4, r4, #0\n\t"
  13787. "lsr r11, r7, #16\n\t"
  13788. "mul r6, r11, r6\n\t"
  13789. "lsr r11, r6, #16\n\t"
  13790. "lsl r6, r6, #16\n\t"
  13791. "adds r10, r10, r6\n\t"
  13792. "adc r4, r4, r11\n\t"
  13793. "adds r10, r10, r5\n\t"
  13794. "str r10, [%[a], #196]\n\t"
  13795. "adc r4, r4, #0\n\t"
  13796. /* a[i+50] += m[50] * mu */
  13797. "ldr r7, [%[m], #200]\n\t"
  13798. "ldr r10, [%[a], #200]\n\t"
  13799. "lsr r11, r7, #16\n\t"
  13800. "lsr r6, r8, #16\n\t"
  13801. "mul r5, r6, r11\n\t"
  13802. "lsl r11, r7, #16\n\t"
  13803. "lsr r11, r11, #16\n\t"
  13804. "mul r6, r11, r6\n\t"
  13805. "lsr r11, r6, #16\n\t"
  13806. "lsl r6, r6, #16\n\t"
  13807. "adds r10, r10, r6\n\t"
  13808. "adc r5, r5, r11\n\t"
  13809. "lsl r6, r8, #16\n\t"
  13810. "lsl r11, r7, #16\n\t"
  13811. "lsr r6, r6, #16\n\t"
  13812. "lsr r11, r11, #16\n\t"
  13813. "mul r11, r6, r11\n\t"
  13814. "adds r10, r10, r11\n\t"
  13815. "adc r5, r5, #0\n\t"
  13816. "lsr r11, r7, #16\n\t"
  13817. "mul r6, r11, r6\n\t"
  13818. "lsr r11, r6, #16\n\t"
  13819. "lsl r6, r6, #16\n\t"
  13820. "adds r10, r10, r6\n\t"
  13821. "adc r5, r5, r11\n\t"
  13822. "adds r10, r10, r4\n\t"
  13823. "str r10, [%[a], #200]\n\t"
  13824. "adc r5, r5, #0\n\t"
  13825. /* a[i+51] += m[51] * mu */
  13826. "ldr r7, [%[m], #204]\n\t"
  13827. "ldr r10, [%[a], #204]\n\t"
  13828. "lsr r11, r7, #16\n\t"
  13829. "lsr r6, r8, #16\n\t"
  13830. "mul r4, r6, r11\n\t"
  13831. "lsl r11, r7, #16\n\t"
  13832. "lsr r11, r11, #16\n\t"
  13833. "mul r6, r11, r6\n\t"
  13834. "lsr r11, r6, #16\n\t"
  13835. "lsl r6, r6, #16\n\t"
  13836. "adds r10, r10, r6\n\t"
  13837. "adc r4, r4, r11\n\t"
  13838. "lsl r6, r8, #16\n\t"
  13839. "lsl r11, r7, #16\n\t"
  13840. "lsr r6, r6, #16\n\t"
  13841. "lsr r11, r11, #16\n\t"
  13842. "mul r11, r6, r11\n\t"
  13843. "adds r10, r10, r11\n\t"
  13844. "adc r4, r4, #0\n\t"
  13845. "lsr r11, r7, #16\n\t"
  13846. "mul r6, r11, r6\n\t"
  13847. "lsr r11, r6, #16\n\t"
  13848. "lsl r6, r6, #16\n\t"
  13849. "adds r10, r10, r6\n\t"
  13850. "adc r4, r4, r11\n\t"
  13851. "adds r10, r10, r5\n\t"
  13852. "str r10, [%[a], #204]\n\t"
  13853. "adc r4, r4, #0\n\t"
  13854. /* a[i+52] += m[52] * mu */
  13855. "ldr r7, [%[m], #208]\n\t"
  13856. "ldr r10, [%[a], #208]\n\t"
  13857. "lsr r11, r7, #16\n\t"
  13858. "lsr r6, r8, #16\n\t"
  13859. "mul r5, r6, r11\n\t"
  13860. "lsl r11, r7, #16\n\t"
  13861. "lsr r11, r11, #16\n\t"
  13862. "mul r6, r11, r6\n\t"
  13863. "lsr r11, r6, #16\n\t"
  13864. "lsl r6, r6, #16\n\t"
  13865. "adds r10, r10, r6\n\t"
  13866. "adc r5, r5, r11\n\t"
  13867. "lsl r6, r8, #16\n\t"
  13868. "lsl r11, r7, #16\n\t"
  13869. "lsr r6, r6, #16\n\t"
  13870. "lsr r11, r11, #16\n\t"
  13871. "mul r11, r6, r11\n\t"
  13872. "adds r10, r10, r11\n\t"
  13873. "adc r5, r5, #0\n\t"
  13874. "lsr r11, r7, #16\n\t"
  13875. "mul r6, r11, r6\n\t"
  13876. "lsr r11, r6, #16\n\t"
  13877. "lsl r6, r6, #16\n\t"
  13878. "adds r10, r10, r6\n\t"
  13879. "adc r5, r5, r11\n\t"
  13880. "adds r10, r10, r4\n\t"
  13881. "str r10, [%[a], #208]\n\t"
  13882. "adc r5, r5, #0\n\t"
  13883. /* a[i+53] += m[53] * mu */
  13884. "ldr r7, [%[m], #212]\n\t"
  13885. "ldr r10, [%[a], #212]\n\t"
  13886. "lsr r11, r7, #16\n\t"
  13887. "lsr r6, r8, #16\n\t"
  13888. "mul r4, r6, r11\n\t"
  13889. "lsl r11, r7, #16\n\t"
  13890. "lsr r11, r11, #16\n\t"
  13891. "mul r6, r11, r6\n\t"
  13892. "lsr r11, r6, #16\n\t"
  13893. "lsl r6, r6, #16\n\t"
  13894. "adds r10, r10, r6\n\t"
  13895. "adc r4, r4, r11\n\t"
  13896. "lsl r6, r8, #16\n\t"
  13897. "lsl r11, r7, #16\n\t"
  13898. "lsr r6, r6, #16\n\t"
  13899. "lsr r11, r11, #16\n\t"
  13900. "mul r11, r6, r11\n\t"
  13901. "adds r10, r10, r11\n\t"
  13902. "adc r4, r4, #0\n\t"
  13903. "lsr r11, r7, #16\n\t"
  13904. "mul r6, r11, r6\n\t"
  13905. "lsr r11, r6, #16\n\t"
  13906. "lsl r6, r6, #16\n\t"
  13907. "adds r10, r10, r6\n\t"
  13908. "adc r4, r4, r11\n\t"
  13909. "adds r10, r10, r5\n\t"
  13910. "str r10, [%[a], #212]\n\t"
  13911. "adc r4, r4, #0\n\t"
  13912. /* a[i+54] += m[54] * mu */
  13913. "ldr r7, [%[m], #216]\n\t"
  13914. "ldr r10, [%[a], #216]\n\t"
  13915. "lsr r11, r7, #16\n\t"
  13916. "lsr r6, r8, #16\n\t"
  13917. "mul r5, r6, r11\n\t"
  13918. "lsl r11, r7, #16\n\t"
  13919. "lsr r11, r11, #16\n\t"
  13920. "mul r6, r11, r6\n\t"
  13921. "lsr r11, r6, #16\n\t"
  13922. "lsl r6, r6, #16\n\t"
  13923. "adds r10, r10, r6\n\t"
  13924. "adc r5, r5, r11\n\t"
  13925. "lsl r6, r8, #16\n\t"
  13926. "lsl r11, r7, #16\n\t"
  13927. "lsr r6, r6, #16\n\t"
  13928. "lsr r11, r11, #16\n\t"
  13929. "mul r11, r6, r11\n\t"
  13930. "adds r10, r10, r11\n\t"
  13931. "adc r5, r5, #0\n\t"
  13932. "lsr r11, r7, #16\n\t"
  13933. "mul r6, r11, r6\n\t"
  13934. "lsr r11, r6, #16\n\t"
  13935. "lsl r6, r6, #16\n\t"
  13936. "adds r10, r10, r6\n\t"
  13937. "adc r5, r5, r11\n\t"
  13938. "adds r10, r10, r4\n\t"
  13939. "str r10, [%[a], #216]\n\t"
  13940. "adc r5, r5, #0\n\t"
  13941. /* a[i+55] += m[55] * mu */
  13942. "ldr r7, [%[m], #220]\n\t"
  13943. "ldr r10, [%[a], #220]\n\t"
  13944. "lsr r11, r7, #16\n\t"
  13945. "lsr r6, r8, #16\n\t"
  13946. "mul r4, r6, r11\n\t"
  13947. "lsl r11, r7, #16\n\t"
  13948. "lsr r11, r11, #16\n\t"
  13949. "mul r6, r11, r6\n\t"
  13950. "lsr r11, r6, #16\n\t"
  13951. "lsl r6, r6, #16\n\t"
  13952. "adds r10, r10, r6\n\t"
  13953. "adc r4, r4, r11\n\t"
  13954. "lsl r6, r8, #16\n\t"
  13955. "lsl r11, r7, #16\n\t"
  13956. "lsr r6, r6, #16\n\t"
  13957. "lsr r11, r11, #16\n\t"
  13958. "mul r11, r6, r11\n\t"
  13959. "adds r10, r10, r11\n\t"
  13960. "adc r4, r4, #0\n\t"
  13961. "lsr r11, r7, #16\n\t"
  13962. "mul r6, r11, r6\n\t"
  13963. "lsr r11, r6, #16\n\t"
  13964. "lsl r6, r6, #16\n\t"
  13965. "adds r10, r10, r6\n\t"
  13966. "adc r4, r4, r11\n\t"
  13967. "adds r10, r10, r5\n\t"
  13968. "str r10, [%[a], #220]\n\t"
  13969. "adc r4, r4, #0\n\t"
  13970. /* a[i+56] += m[56] * mu */
  13971. "ldr r7, [%[m], #224]\n\t"
  13972. "ldr r10, [%[a], #224]\n\t"
  13973. "lsr r11, r7, #16\n\t"
  13974. "lsr r6, r8, #16\n\t"
  13975. "mul r5, r6, r11\n\t"
  13976. "lsl r11, r7, #16\n\t"
  13977. "lsr r11, r11, #16\n\t"
  13978. "mul r6, r11, r6\n\t"
  13979. "lsr r11, r6, #16\n\t"
  13980. "lsl r6, r6, #16\n\t"
  13981. "adds r10, r10, r6\n\t"
  13982. "adc r5, r5, r11\n\t"
  13983. "lsl r6, r8, #16\n\t"
  13984. "lsl r11, r7, #16\n\t"
  13985. "lsr r6, r6, #16\n\t"
  13986. "lsr r11, r11, #16\n\t"
  13987. "mul r11, r6, r11\n\t"
  13988. "adds r10, r10, r11\n\t"
  13989. "adc r5, r5, #0\n\t"
  13990. "lsr r11, r7, #16\n\t"
  13991. "mul r6, r11, r6\n\t"
  13992. "lsr r11, r6, #16\n\t"
  13993. "lsl r6, r6, #16\n\t"
  13994. "adds r10, r10, r6\n\t"
  13995. "adc r5, r5, r11\n\t"
  13996. "adds r10, r10, r4\n\t"
  13997. "str r10, [%[a], #224]\n\t"
  13998. "adc r5, r5, #0\n\t"
  13999. /* a[i+57] += m[57] * mu */
  14000. "ldr r7, [%[m], #228]\n\t"
  14001. "ldr r10, [%[a], #228]\n\t"
  14002. "lsr r11, r7, #16\n\t"
  14003. "lsr r6, r8, #16\n\t"
  14004. "mul r4, r6, r11\n\t"
  14005. "lsl r11, r7, #16\n\t"
  14006. "lsr r11, r11, #16\n\t"
  14007. "mul r6, r11, r6\n\t"
  14008. "lsr r11, r6, #16\n\t"
  14009. "lsl r6, r6, #16\n\t"
  14010. "adds r10, r10, r6\n\t"
  14011. "adc r4, r4, r11\n\t"
  14012. "lsl r6, r8, #16\n\t"
  14013. "lsl r11, r7, #16\n\t"
  14014. "lsr r6, r6, #16\n\t"
  14015. "lsr r11, r11, #16\n\t"
  14016. "mul r11, r6, r11\n\t"
  14017. "adds r10, r10, r11\n\t"
  14018. "adc r4, r4, #0\n\t"
  14019. "lsr r11, r7, #16\n\t"
  14020. "mul r6, r11, r6\n\t"
  14021. "lsr r11, r6, #16\n\t"
  14022. "lsl r6, r6, #16\n\t"
  14023. "adds r10, r10, r6\n\t"
  14024. "adc r4, r4, r11\n\t"
  14025. "adds r10, r10, r5\n\t"
  14026. "str r10, [%[a], #228]\n\t"
  14027. "adc r4, r4, #0\n\t"
  14028. /* a[i+58] += m[58] * mu */
  14029. "ldr r7, [%[m], #232]\n\t"
  14030. "ldr r10, [%[a], #232]\n\t"
  14031. "lsr r11, r7, #16\n\t"
  14032. "lsr r6, r8, #16\n\t"
  14033. "mul r5, r6, r11\n\t"
  14034. "lsl r11, r7, #16\n\t"
  14035. "lsr r11, r11, #16\n\t"
  14036. "mul r6, r11, r6\n\t"
  14037. "lsr r11, r6, #16\n\t"
  14038. "lsl r6, r6, #16\n\t"
  14039. "adds r10, r10, r6\n\t"
  14040. "adc r5, r5, r11\n\t"
  14041. "lsl r6, r8, #16\n\t"
  14042. "lsl r11, r7, #16\n\t"
  14043. "lsr r6, r6, #16\n\t"
  14044. "lsr r11, r11, #16\n\t"
  14045. "mul r11, r6, r11\n\t"
  14046. "adds r10, r10, r11\n\t"
  14047. "adc r5, r5, #0\n\t"
  14048. "lsr r11, r7, #16\n\t"
  14049. "mul r6, r11, r6\n\t"
  14050. "lsr r11, r6, #16\n\t"
  14051. "lsl r6, r6, #16\n\t"
  14052. "adds r10, r10, r6\n\t"
  14053. "adc r5, r5, r11\n\t"
  14054. "adds r10, r10, r4\n\t"
  14055. "str r10, [%[a], #232]\n\t"
  14056. "adc r5, r5, #0\n\t"
  14057. /* a[i+59] += m[59] * mu */
  14058. "ldr r7, [%[m], #236]\n\t"
  14059. "ldr r10, [%[a], #236]\n\t"
  14060. "lsr r11, r7, #16\n\t"
  14061. "lsr r6, r8, #16\n\t"
  14062. "mul r4, r6, r11\n\t"
  14063. "lsl r11, r7, #16\n\t"
  14064. "lsr r11, r11, #16\n\t"
  14065. "mul r6, r11, r6\n\t"
  14066. "lsr r11, r6, #16\n\t"
  14067. "lsl r6, r6, #16\n\t"
  14068. "adds r10, r10, r6\n\t"
  14069. "adc r4, r4, r11\n\t"
  14070. "lsl r6, r8, #16\n\t"
  14071. "lsl r11, r7, #16\n\t"
  14072. "lsr r6, r6, #16\n\t"
  14073. "lsr r11, r11, #16\n\t"
  14074. "mul r11, r6, r11\n\t"
  14075. "adds r10, r10, r11\n\t"
  14076. "adc r4, r4, #0\n\t"
  14077. "lsr r11, r7, #16\n\t"
  14078. "mul r6, r11, r6\n\t"
  14079. "lsr r11, r6, #16\n\t"
  14080. "lsl r6, r6, #16\n\t"
  14081. "adds r10, r10, r6\n\t"
  14082. "adc r4, r4, r11\n\t"
  14083. "adds r10, r10, r5\n\t"
  14084. "str r10, [%[a], #236]\n\t"
  14085. "adc r4, r4, #0\n\t"
  14086. /* a[i+60] += m[60] * mu */
  14087. "ldr r7, [%[m], #240]\n\t"
  14088. "ldr r10, [%[a], #240]\n\t"
  14089. "lsr r11, r7, #16\n\t"
  14090. "lsr r6, r8, #16\n\t"
  14091. "mul r5, r6, r11\n\t"
  14092. "lsl r11, r7, #16\n\t"
  14093. "lsr r11, r11, #16\n\t"
  14094. "mul r6, r11, r6\n\t"
  14095. "lsr r11, r6, #16\n\t"
  14096. "lsl r6, r6, #16\n\t"
  14097. "adds r10, r10, r6\n\t"
  14098. "adc r5, r5, r11\n\t"
  14099. "lsl r6, r8, #16\n\t"
  14100. "lsl r11, r7, #16\n\t"
  14101. "lsr r6, r6, #16\n\t"
  14102. "lsr r11, r11, #16\n\t"
  14103. "mul r11, r6, r11\n\t"
  14104. "adds r10, r10, r11\n\t"
  14105. "adc r5, r5, #0\n\t"
  14106. "lsr r11, r7, #16\n\t"
  14107. "mul r6, r11, r6\n\t"
  14108. "lsr r11, r6, #16\n\t"
  14109. "lsl r6, r6, #16\n\t"
  14110. "adds r10, r10, r6\n\t"
  14111. "adc r5, r5, r11\n\t"
  14112. "adds r10, r10, r4\n\t"
  14113. "str r10, [%[a], #240]\n\t"
  14114. "adc r5, r5, #0\n\t"
  14115. /* a[i+61] += m[61] * mu */
  14116. "ldr r7, [%[m], #244]\n\t"
  14117. "ldr r10, [%[a], #244]\n\t"
  14118. "lsr r11, r7, #16\n\t"
  14119. "lsr r6, r8, #16\n\t"
  14120. "mul r4, r6, r11\n\t"
  14121. "lsl r11, r7, #16\n\t"
  14122. "lsr r11, r11, #16\n\t"
  14123. "mul r6, r11, r6\n\t"
  14124. "lsr r11, r6, #16\n\t"
  14125. "lsl r6, r6, #16\n\t"
  14126. "adds r10, r10, r6\n\t"
  14127. "adc r4, r4, r11\n\t"
  14128. "lsl r6, r8, #16\n\t"
  14129. "lsl r11, r7, #16\n\t"
  14130. "lsr r6, r6, #16\n\t"
  14131. "lsr r11, r11, #16\n\t"
  14132. "mul r11, r6, r11\n\t"
  14133. "adds r10, r10, r11\n\t"
  14134. "adc r4, r4, #0\n\t"
  14135. "lsr r11, r7, #16\n\t"
  14136. "mul r6, r11, r6\n\t"
  14137. "lsr r11, r6, #16\n\t"
  14138. "lsl r6, r6, #16\n\t"
  14139. "adds r10, r10, r6\n\t"
  14140. "adc r4, r4, r11\n\t"
  14141. "adds r10, r10, r5\n\t"
  14142. "str r10, [%[a], #244]\n\t"
  14143. "adc r4, r4, #0\n\t"
  14144. /* a[i+62] += m[62] * mu */
  14145. "ldr r7, [%[m], #248]\n\t"
  14146. "ldr r10, [%[a], #248]\n\t"
  14147. "lsr r11, r7, #16\n\t"
  14148. "lsr r6, r8, #16\n\t"
  14149. "mul r5, r6, r11\n\t"
  14150. "lsl r11, r7, #16\n\t"
  14151. "lsr r11, r11, #16\n\t"
  14152. "mul r6, r11, r6\n\t"
  14153. "lsr r11, r6, #16\n\t"
  14154. "lsl r6, r6, #16\n\t"
  14155. "adds r10, r10, r6\n\t"
  14156. "adc r5, r5, r11\n\t"
  14157. "lsl r6, r8, #16\n\t"
  14158. "lsl r11, r7, #16\n\t"
  14159. "lsr r6, r6, #16\n\t"
  14160. "lsr r11, r11, #16\n\t"
  14161. "mul r11, r6, r11\n\t"
  14162. "adds r10, r10, r11\n\t"
  14163. "adc r5, r5, #0\n\t"
  14164. "lsr r11, r7, #16\n\t"
  14165. "mul r6, r11, r6\n\t"
  14166. "lsr r11, r6, #16\n\t"
  14167. "lsl r6, r6, #16\n\t"
  14168. "adds r10, r10, r6\n\t"
  14169. "adc r5, r5, r11\n\t"
  14170. "adds r10, r10, r4\n\t"
  14171. "str r10, [%[a], #248]\n\t"
  14172. "adc r5, r5, #0\n\t"
  14173. /* a[i+63] += m[63] * mu */
  14174. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  14175. "ldr r11, [%[m], #252]\n\t"
  14176. #else
  14177. "ldr r7, [%[m], #252]\n\t"
  14178. #endif
  14179. "ldr r10, [%[a], #252]\n\t"
  14180. "lsl r6, r8, #16\n\t"
  14181. "lsl r7, r11, #16\n\t"
  14182. "lsr r6, r6, #16\n\t"
  14183. "lsr r7, r7, #16\n\t"
  14184. "mul r7, r6, r7\n\t"
  14185. "adds r5, r5, r7\n\t"
  14186. "adcs r4, r3, #0\n\t"
  14187. "mov r3, #0\n\t"
  14188. "adc r3, r3, r3\n\t"
  14189. "lsr r7, r11, #16\n\t"
  14190. "mul r6, r7, r6\n\t"
  14191. "lsr r7, r6, #16\n\t"
  14192. "lsl r6, r6, #16\n\t"
  14193. "adds r5, r5, r6\n\t"
  14194. "adcs r4, r4, r7\n\t"
  14195. "adc r3, r3, #0\n\t"
  14196. "mov r6, r8\n\t"
  14197. "lsr r7, r11, #16\n\t"
  14198. "lsr r6, r6, #16\n\t"
  14199. "mul r7, r6, r7\n\t"
  14200. "adds r4, r4, r7\n\t"
  14201. "lsl r7, r11, #16\n\t"
  14202. "adc r3, r3, #0\n\t"
  14203. "lsr r7, r7, #16\n\t"
  14204. "mul r6, r7, r6\n\t"
  14205. "lsr r7, r6, #16\n\t"
  14206. "lsl r6, r6, #16\n\t"
  14207. "adds r5, r5, r6\n\t"
  14208. "adcs r4, r4, r7\n\t"
  14209. "adc r3, r3, #0\n\t"
  14210. "adds r10, r10, r5\n\t"
  14211. "str r10, [%[a], #252]\n\t"
  14212. "ldr r10, [%[a], #256]\n\t"
  14213. "adcs r10, r10, r4\n\t"
  14214. "str r10, [%[a], #256]\n\t"
  14215. "adc r3, r3, #0\n\t"
  14216. /* i += 1 */
  14217. "add r9, r9, #4\n\t"
  14218. "add %[a], %[a], #4\n\t"
  14219. "cmp r9, #0x100\n\t"
  14220. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  14221. /* Loop Done */
  14222. "str r12, [%[a]]\n\t"
  14223. "str lr, [%[a], #4]\n\t"
  14224. "mov %[mp], r3\n\t"
  14225. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  14226. :
  14227. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  14228. );
  14229. sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp);
  14230. }
  14231. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  14232. /* Reduce the number back to 2048 bits using Montgomery reduction.
  14233. *
  14234. * a A single precision number to reduce in place.
  14235. * m The single precision number representing the modulus.
  14236. * mp The digit representing the negative inverse of m mod 2^n.
  14237. */
  14238. static SP_NOINLINE void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  14239. {
  14240. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  14241. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  14242. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  14243. __asm__ __volatile__ (
  14244. "ldr r11, [%[m]]\n\t"
  14245. /* i = 0 */
  14246. "mov r9, #0\n\t"
  14247. "mov r3, #0\n\t"
  14248. "ldr r12, [%[a]]\n\t"
  14249. "ldr lr, [%[a], #4]\n\t"
  14250. "\n"
  14251. "L_sp_2048_mont_reduce_64_word_%=: \n\t"
  14252. /* mu = a[i] * mp */
  14253. "mul r8, %[mp], r12\n\t"
  14254. /* a[i+0] += m[0] * mu */
  14255. "mov r5, #0\n\t"
  14256. "umlal r12, r5, r8, r11\n\t"
  14257. /* a[i+1] += m[1] * mu */
  14258. "ldr r7, [%[m], #4]\n\t"
  14259. "mov r4, #0\n\t"
  14260. "umlal lr, r4, r8, r7\n\t"
  14261. "mov r12, lr\n\t"
  14262. "adds r12, r12, r5\n\t"
  14263. "adc r4, r4, #0\n\t"
  14264. /* a[i+2] += m[2] * mu */
  14265. "ldr r7, [%[m], #8]\n\t"
  14266. "ldr lr, [%[a], #8]\n\t"
  14267. "mov r5, #0\n\t"
  14268. "umlal lr, r5, r8, r7\n\t"
  14269. "adds lr, lr, r4\n\t"
  14270. "adc r5, r5, #0\n\t"
  14271. /* a[i+3] += m[3] * mu */
  14272. "ldr r7, [%[m], #12]\n\t"
  14273. "ldr r10, [%[a], #12]\n\t"
  14274. "mov r4, #0\n\t"
  14275. "umlal r10, r4, r8, r7\n\t"
  14276. "adds r10, r10, r5\n\t"
  14277. "str r10, [%[a], #12]\n\t"
  14278. "adc r4, r4, #0\n\t"
  14279. /* a[i+4] += m[4] * mu */
  14280. "ldr r7, [%[m], #16]\n\t"
  14281. "ldr r10, [%[a], #16]\n\t"
  14282. "mov r5, #0\n\t"
  14283. "umlal r10, r5, r8, r7\n\t"
  14284. "adds r10, r10, r4\n\t"
  14285. "str r10, [%[a], #16]\n\t"
  14286. "adc r5, r5, #0\n\t"
  14287. /* a[i+5] += m[5] * mu */
  14288. "ldr r7, [%[m], #20]\n\t"
  14289. "ldr r10, [%[a], #20]\n\t"
  14290. "mov r4, #0\n\t"
  14291. "umlal r10, r4, r8, r7\n\t"
  14292. "adds r10, r10, r5\n\t"
  14293. "str r10, [%[a], #20]\n\t"
  14294. "adc r4, r4, #0\n\t"
  14295. /* a[i+6] += m[6] * mu */
  14296. "ldr r7, [%[m], #24]\n\t"
  14297. "ldr r10, [%[a], #24]\n\t"
  14298. "mov r5, #0\n\t"
  14299. "umlal r10, r5, r8, r7\n\t"
  14300. "adds r10, r10, r4\n\t"
  14301. "str r10, [%[a], #24]\n\t"
  14302. "adc r5, r5, #0\n\t"
  14303. /* a[i+7] += m[7] * mu */
  14304. "ldr r7, [%[m], #28]\n\t"
  14305. "ldr r10, [%[a], #28]\n\t"
  14306. "mov r4, #0\n\t"
  14307. "umlal r10, r4, r8, r7\n\t"
  14308. "adds r10, r10, r5\n\t"
  14309. "str r10, [%[a], #28]\n\t"
  14310. "adc r4, r4, #0\n\t"
  14311. /* a[i+8] += m[8] * mu */
  14312. "ldr r7, [%[m], #32]\n\t"
  14313. "ldr r10, [%[a], #32]\n\t"
  14314. "mov r5, #0\n\t"
  14315. "umlal r10, r5, r8, r7\n\t"
  14316. "adds r10, r10, r4\n\t"
  14317. "str r10, [%[a], #32]\n\t"
  14318. "adc r5, r5, #0\n\t"
  14319. /* a[i+9] += m[9] * mu */
  14320. "ldr r7, [%[m], #36]\n\t"
  14321. "ldr r10, [%[a], #36]\n\t"
  14322. "mov r4, #0\n\t"
  14323. "umlal r10, r4, r8, r7\n\t"
  14324. "adds r10, r10, r5\n\t"
  14325. "str r10, [%[a], #36]\n\t"
  14326. "adc r4, r4, #0\n\t"
  14327. /* a[i+10] += m[10] * mu */
  14328. "ldr r7, [%[m], #40]\n\t"
  14329. "ldr r10, [%[a], #40]\n\t"
  14330. "mov r5, #0\n\t"
  14331. "umlal r10, r5, r8, r7\n\t"
  14332. "adds r10, r10, r4\n\t"
  14333. "str r10, [%[a], #40]\n\t"
  14334. "adc r5, r5, #0\n\t"
  14335. /* a[i+11] += m[11] * mu */
  14336. "ldr r7, [%[m], #44]\n\t"
  14337. "ldr r10, [%[a], #44]\n\t"
  14338. "mov r4, #0\n\t"
  14339. "umlal r10, r4, r8, r7\n\t"
  14340. "adds r10, r10, r5\n\t"
  14341. "str r10, [%[a], #44]\n\t"
  14342. "adc r4, r4, #0\n\t"
  14343. /* a[i+12] += m[12] * mu */
  14344. "ldr r7, [%[m], #48]\n\t"
  14345. "ldr r10, [%[a], #48]\n\t"
  14346. "mov r5, #0\n\t"
  14347. "umlal r10, r5, r8, r7\n\t"
  14348. "adds r10, r10, r4\n\t"
  14349. "str r10, [%[a], #48]\n\t"
  14350. "adc r5, r5, #0\n\t"
  14351. /* a[i+13] += m[13] * mu */
  14352. "ldr r7, [%[m], #52]\n\t"
  14353. "ldr r10, [%[a], #52]\n\t"
  14354. "mov r4, #0\n\t"
  14355. "umlal r10, r4, r8, r7\n\t"
  14356. "adds r10, r10, r5\n\t"
  14357. "str r10, [%[a], #52]\n\t"
  14358. "adc r4, r4, #0\n\t"
  14359. /* a[i+14] += m[14] * mu */
  14360. "ldr r7, [%[m], #56]\n\t"
  14361. "ldr r10, [%[a], #56]\n\t"
  14362. "mov r5, #0\n\t"
  14363. "umlal r10, r5, r8, r7\n\t"
  14364. "adds r10, r10, r4\n\t"
  14365. "str r10, [%[a], #56]\n\t"
  14366. "adc r5, r5, #0\n\t"
  14367. /* a[i+15] += m[15] * mu */
  14368. "ldr r7, [%[m], #60]\n\t"
  14369. "ldr r10, [%[a], #60]\n\t"
  14370. "mov r4, #0\n\t"
  14371. "umlal r10, r4, r8, r7\n\t"
  14372. "adds r10, r10, r5\n\t"
  14373. "str r10, [%[a], #60]\n\t"
  14374. "adc r4, r4, #0\n\t"
  14375. /* a[i+16] += m[16] * mu */
  14376. "ldr r7, [%[m], #64]\n\t"
  14377. "ldr r10, [%[a], #64]\n\t"
  14378. "mov r5, #0\n\t"
  14379. "umlal r10, r5, r8, r7\n\t"
  14380. "adds r10, r10, r4\n\t"
  14381. "str r10, [%[a], #64]\n\t"
  14382. "adc r5, r5, #0\n\t"
  14383. /* a[i+17] += m[17] * mu */
  14384. "ldr r7, [%[m], #68]\n\t"
  14385. "ldr r10, [%[a], #68]\n\t"
  14386. "mov r4, #0\n\t"
  14387. "umlal r10, r4, r8, r7\n\t"
  14388. "adds r10, r10, r5\n\t"
  14389. "str r10, [%[a], #68]\n\t"
  14390. "adc r4, r4, #0\n\t"
  14391. /* a[i+18] += m[18] * mu */
  14392. "ldr r7, [%[m], #72]\n\t"
  14393. "ldr r10, [%[a], #72]\n\t"
  14394. "mov r5, #0\n\t"
  14395. "umlal r10, r5, r8, r7\n\t"
  14396. "adds r10, r10, r4\n\t"
  14397. "str r10, [%[a], #72]\n\t"
  14398. "adc r5, r5, #0\n\t"
  14399. /* a[i+19] += m[19] * mu */
  14400. "ldr r7, [%[m], #76]\n\t"
  14401. "ldr r10, [%[a], #76]\n\t"
  14402. "mov r4, #0\n\t"
  14403. "umlal r10, r4, r8, r7\n\t"
  14404. "adds r10, r10, r5\n\t"
  14405. "str r10, [%[a], #76]\n\t"
  14406. "adc r4, r4, #0\n\t"
  14407. /* a[i+20] += m[20] * mu */
  14408. "ldr r7, [%[m], #80]\n\t"
  14409. "ldr r10, [%[a], #80]\n\t"
  14410. "mov r5, #0\n\t"
  14411. "umlal r10, r5, r8, r7\n\t"
  14412. "adds r10, r10, r4\n\t"
  14413. "str r10, [%[a], #80]\n\t"
  14414. "adc r5, r5, #0\n\t"
  14415. /* a[i+21] += m[21] * mu */
  14416. "ldr r7, [%[m], #84]\n\t"
  14417. "ldr r10, [%[a], #84]\n\t"
  14418. "mov r4, #0\n\t"
  14419. "umlal r10, r4, r8, r7\n\t"
  14420. "adds r10, r10, r5\n\t"
  14421. "str r10, [%[a], #84]\n\t"
  14422. "adc r4, r4, #0\n\t"
  14423. /* a[i+22] += m[22] * mu */
  14424. "ldr r7, [%[m], #88]\n\t"
  14425. "ldr r10, [%[a], #88]\n\t"
  14426. "mov r5, #0\n\t"
  14427. "umlal r10, r5, r8, r7\n\t"
  14428. "adds r10, r10, r4\n\t"
  14429. "str r10, [%[a], #88]\n\t"
  14430. "adc r5, r5, #0\n\t"
  14431. /* a[i+23] += m[23] * mu */
  14432. "ldr r7, [%[m], #92]\n\t"
  14433. "ldr r10, [%[a], #92]\n\t"
  14434. "mov r4, #0\n\t"
  14435. "umlal r10, r4, r8, r7\n\t"
  14436. "adds r10, r10, r5\n\t"
  14437. "str r10, [%[a], #92]\n\t"
  14438. "adc r4, r4, #0\n\t"
  14439. /* a[i+24] += m[24] * mu */
  14440. "ldr r7, [%[m], #96]\n\t"
  14441. "ldr r10, [%[a], #96]\n\t"
  14442. "mov r5, #0\n\t"
  14443. "umlal r10, r5, r8, r7\n\t"
  14444. "adds r10, r10, r4\n\t"
  14445. "str r10, [%[a], #96]\n\t"
  14446. "adc r5, r5, #0\n\t"
  14447. /* a[i+25] += m[25] * mu */
  14448. "ldr r7, [%[m], #100]\n\t"
  14449. "ldr r10, [%[a], #100]\n\t"
  14450. "mov r4, #0\n\t"
  14451. "umlal r10, r4, r8, r7\n\t"
  14452. "adds r10, r10, r5\n\t"
  14453. "str r10, [%[a], #100]\n\t"
  14454. "adc r4, r4, #0\n\t"
  14455. /* a[i+26] += m[26] * mu */
  14456. "ldr r7, [%[m], #104]\n\t"
  14457. "ldr r10, [%[a], #104]\n\t"
  14458. "mov r5, #0\n\t"
  14459. "umlal r10, r5, r8, r7\n\t"
  14460. "adds r10, r10, r4\n\t"
  14461. "str r10, [%[a], #104]\n\t"
  14462. "adc r5, r5, #0\n\t"
  14463. /* a[i+27] += m[27] * mu */
  14464. "ldr r7, [%[m], #108]\n\t"
  14465. "ldr r10, [%[a], #108]\n\t"
  14466. "mov r4, #0\n\t"
  14467. "umlal r10, r4, r8, r7\n\t"
  14468. "adds r10, r10, r5\n\t"
  14469. "str r10, [%[a], #108]\n\t"
  14470. "adc r4, r4, #0\n\t"
  14471. /* a[i+28] += m[28] * mu */
  14472. "ldr r7, [%[m], #112]\n\t"
  14473. "ldr r10, [%[a], #112]\n\t"
  14474. "mov r5, #0\n\t"
  14475. "umlal r10, r5, r8, r7\n\t"
  14476. "adds r10, r10, r4\n\t"
  14477. "str r10, [%[a], #112]\n\t"
  14478. "adc r5, r5, #0\n\t"
  14479. /* a[i+29] += m[29] * mu */
  14480. "ldr r7, [%[m], #116]\n\t"
  14481. "ldr r10, [%[a], #116]\n\t"
  14482. "mov r4, #0\n\t"
  14483. "umlal r10, r4, r8, r7\n\t"
  14484. "adds r10, r10, r5\n\t"
  14485. "str r10, [%[a], #116]\n\t"
  14486. "adc r4, r4, #0\n\t"
  14487. /* a[i+30] += m[30] * mu */
  14488. "ldr r7, [%[m], #120]\n\t"
  14489. "ldr r10, [%[a], #120]\n\t"
  14490. "mov r5, #0\n\t"
  14491. "umlal r10, r5, r8, r7\n\t"
  14492. "adds r10, r10, r4\n\t"
  14493. "str r10, [%[a], #120]\n\t"
  14494. "adc r5, r5, #0\n\t"
  14495. /* a[i+31] += m[31] * mu */
  14496. "ldr r7, [%[m], #124]\n\t"
  14497. "ldr r10, [%[a], #124]\n\t"
  14498. "mov r4, #0\n\t"
  14499. "umlal r10, r4, r8, r7\n\t"
  14500. "adds r10, r10, r5\n\t"
  14501. "str r10, [%[a], #124]\n\t"
  14502. "adc r4, r4, #0\n\t"
  14503. /* a[i+32] += m[32] * mu */
  14504. "ldr r7, [%[m], #128]\n\t"
  14505. "ldr r10, [%[a], #128]\n\t"
  14506. "mov r5, #0\n\t"
  14507. "umlal r10, r5, r8, r7\n\t"
  14508. "adds r10, r10, r4\n\t"
  14509. "str r10, [%[a], #128]\n\t"
  14510. "adc r5, r5, #0\n\t"
  14511. /* a[i+33] += m[33] * mu */
  14512. "ldr r7, [%[m], #132]\n\t"
  14513. "ldr r10, [%[a], #132]\n\t"
  14514. "mov r4, #0\n\t"
  14515. "umlal r10, r4, r8, r7\n\t"
  14516. "adds r10, r10, r5\n\t"
  14517. "str r10, [%[a], #132]\n\t"
  14518. "adc r4, r4, #0\n\t"
  14519. /* a[i+34] += m[34] * mu */
  14520. "ldr r7, [%[m], #136]\n\t"
  14521. "ldr r10, [%[a], #136]\n\t"
  14522. "mov r5, #0\n\t"
  14523. "umlal r10, r5, r8, r7\n\t"
  14524. "adds r10, r10, r4\n\t"
  14525. "str r10, [%[a], #136]\n\t"
  14526. "adc r5, r5, #0\n\t"
  14527. /* a[i+35] += m[35] * mu */
  14528. "ldr r7, [%[m], #140]\n\t"
  14529. "ldr r10, [%[a], #140]\n\t"
  14530. "mov r4, #0\n\t"
  14531. "umlal r10, r4, r8, r7\n\t"
  14532. "adds r10, r10, r5\n\t"
  14533. "str r10, [%[a], #140]\n\t"
  14534. "adc r4, r4, #0\n\t"
  14535. /* a[i+36] += m[36] * mu */
  14536. "ldr r7, [%[m], #144]\n\t"
  14537. "ldr r10, [%[a], #144]\n\t"
  14538. "mov r5, #0\n\t"
  14539. "umlal r10, r5, r8, r7\n\t"
  14540. "adds r10, r10, r4\n\t"
  14541. "str r10, [%[a], #144]\n\t"
  14542. "adc r5, r5, #0\n\t"
  14543. /* a[i+37] += m[37] * mu */
  14544. "ldr r7, [%[m], #148]\n\t"
  14545. "ldr r10, [%[a], #148]\n\t"
  14546. "mov r4, #0\n\t"
  14547. "umlal r10, r4, r8, r7\n\t"
  14548. "adds r10, r10, r5\n\t"
  14549. "str r10, [%[a], #148]\n\t"
  14550. "adc r4, r4, #0\n\t"
  14551. /* a[i+38] += m[38] * mu */
  14552. "ldr r7, [%[m], #152]\n\t"
  14553. "ldr r10, [%[a], #152]\n\t"
  14554. "mov r5, #0\n\t"
  14555. "umlal r10, r5, r8, r7\n\t"
  14556. "adds r10, r10, r4\n\t"
  14557. "str r10, [%[a], #152]\n\t"
  14558. "adc r5, r5, #0\n\t"
  14559. /* a[i+39] += m[39] * mu */
  14560. "ldr r7, [%[m], #156]\n\t"
  14561. "ldr r10, [%[a], #156]\n\t"
  14562. "mov r4, #0\n\t"
  14563. "umlal r10, r4, r8, r7\n\t"
  14564. "adds r10, r10, r5\n\t"
  14565. "str r10, [%[a], #156]\n\t"
  14566. "adc r4, r4, #0\n\t"
  14567. /* a[i+40] += m[40] * mu */
  14568. "ldr r7, [%[m], #160]\n\t"
  14569. "ldr r10, [%[a], #160]\n\t"
  14570. "mov r5, #0\n\t"
  14571. "umlal r10, r5, r8, r7\n\t"
  14572. "adds r10, r10, r4\n\t"
  14573. "str r10, [%[a], #160]\n\t"
  14574. "adc r5, r5, #0\n\t"
  14575. /* a[i+41] += m[41] * mu */
  14576. "ldr r7, [%[m], #164]\n\t"
  14577. "ldr r10, [%[a], #164]\n\t"
  14578. "mov r4, #0\n\t"
  14579. "umlal r10, r4, r8, r7\n\t"
  14580. "adds r10, r10, r5\n\t"
  14581. "str r10, [%[a], #164]\n\t"
  14582. "adc r4, r4, #0\n\t"
  14583. /* a[i+42] += m[42] * mu */
  14584. "ldr r7, [%[m], #168]\n\t"
  14585. "ldr r10, [%[a], #168]\n\t"
  14586. "mov r5, #0\n\t"
  14587. "umlal r10, r5, r8, r7\n\t"
  14588. "adds r10, r10, r4\n\t"
  14589. "str r10, [%[a], #168]\n\t"
  14590. "adc r5, r5, #0\n\t"
  14591. /* a[i+43] += m[43] * mu */
  14592. "ldr r7, [%[m], #172]\n\t"
  14593. "ldr r10, [%[a], #172]\n\t"
  14594. "mov r4, #0\n\t"
  14595. "umlal r10, r4, r8, r7\n\t"
  14596. "adds r10, r10, r5\n\t"
  14597. "str r10, [%[a], #172]\n\t"
  14598. "adc r4, r4, #0\n\t"
  14599. /* a[i+44] += m[44] * mu */
  14600. "ldr r7, [%[m], #176]\n\t"
  14601. "ldr r10, [%[a], #176]\n\t"
  14602. "mov r5, #0\n\t"
  14603. "umlal r10, r5, r8, r7\n\t"
  14604. "adds r10, r10, r4\n\t"
  14605. "str r10, [%[a], #176]\n\t"
  14606. "adc r5, r5, #0\n\t"
  14607. /* a[i+45] += m[45] * mu */
  14608. "ldr r7, [%[m], #180]\n\t"
  14609. "ldr r10, [%[a], #180]\n\t"
  14610. "mov r4, #0\n\t"
  14611. "umlal r10, r4, r8, r7\n\t"
  14612. "adds r10, r10, r5\n\t"
  14613. "str r10, [%[a], #180]\n\t"
  14614. "adc r4, r4, #0\n\t"
  14615. /* a[i+46] += m[46] * mu */
  14616. "ldr r7, [%[m], #184]\n\t"
  14617. "ldr r10, [%[a], #184]\n\t"
  14618. "mov r5, #0\n\t"
  14619. "umlal r10, r5, r8, r7\n\t"
  14620. "adds r10, r10, r4\n\t"
  14621. "str r10, [%[a], #184]\n\t"
  14622. "adc r5, r5, #0\n\t"
  14623. /* a[i+47] += m[47] * mu */
  14624. "ldr r7, [%[m], #188]\n\t"
  14625. "ldr r10, [%[a], #188]\n\t"
  14626. "mov r4, #0\n\t"
  14627. "umlal r10, r4, r8, r7\n\t"
  14628. "adds r10, r10, r5\n\t"
  14629. "str r10, [%[a], #188]\n\t"
  14630. "adc r4, r4, #0\n\t"
  14631. /* a[i+48] += m[48] * mu */
  14632. "ldr r7, [%[m], #192]\n\t"
  14633. "ldr r10, [%[a], #192]\n\t"
  14634. "mov r5, #0\n\t"
  14635. "umlal r10, r5, r8, r7\n\t"
  14636. "adds r10, r10, r4\n\t"
  14637. "str r10, [%[a], #192]\n\t"
  14638. "adc r5, r5, #0\n\t"
  14639. /* a[i+49] += m[49] * mu */
  14640. "ldr r7, [%[m], #196]\n\t"
  14641. "ldr r10, [%[a], #196]\n\t"
  14642. "mov r4, #0\n\t"
  14643. "umlal r10, r4, r8, r7\n\t"
  14644. "adds r10, r10, r5\n\t"
  14645. "str r10, [%[a], #196]\n\t"
  14646. "adc r4, r4, #0\n\t"
  14647. /* a[i+50] += m[50] * mu */
  14648. "ldr r7, [%[m], #200]\n\t"
  14649. "ldr r10, [%[a], #200]\n\t"
  14650. "mov r5, #0\n\t"
  14651. "umlal r10, r5, r8, r7\n\t"
  14652. "adds r10, r10, r4\n\t"
  14653. "str r10, [%[a], #200]\n\t"
  14654. "adc r5, r5, #0\n\t"
  14655. /* a[i+51] += m[51] * mu */
  14656. "ldr r7, [%[m], #204]\n\t"
  14657. "ldr r10, [%[a], #204]\n\t"
  14658. "mov r4, #0\n\t"
  14659. "umlal r10, r4, r8, r7\n\t"
  14660. "adds r10, r10, r5\n\t"
  14661. "str r10, [%[a], #204]\n\t"
  14662. "adc r4, r4, #0\n\t"
  14663. /* a[i+52] += m[52] * mu */
  14664. "ldr r7, [%[m], #208]\n\t"
  14665. "ldr r10, [%[a], #208]\n\t"
  14666. "mov r5, #0\n\t"
  14667. "umlal r10, r5, r8, r7\n\t"
  14668. "adds r10, r10, r4\n\t"
  14669. "str r10, [%[a], #208]\n\t"
  14670. "adc r5, r5, #0\n\t"
  14671. /* a[i+53] += m[53] * mu */
  14672. "ldr r7, [%[m], #212]\n\t"
  14673. "ldr r10, [%[a], #212]\n\t"
  14674. "mov r4, #0\n\t"
  14675. "umlal r10, r4, r8, r7\n\t"
  14676. "adds r10, r10, r5\n\t"
  14677. "str r10, [%[a], #212]\n\t"
  14678. "adc r4, r4, #0\n\t"
  14679. /* a[i+54] += m[54] * mu */
  14680. "ldr r7, [%[m], #216]\n\t"
  14681. "ldr r10, [%[a], #216]\n\t"
  14682. "mov r5, #0\n\t"
  14683. "umlal r10, r5, r8, r7\n\t"
  14684. "adds r10, r10, r4\n\t"
  14685. "str r10, [%[a], #216]\n\t"
  14686. "adc r5, r5, #0\n\t"
  14687. /* a[i+55] += m[55] * mu */
  14688. "ldr r7, [%[m], #220]\n\t"
  14689. "ldr r10, [%[a], #220]\n\t"
  14690. "mov r4, #0\n\t"
  14691. "umlal r10, r4, r8, r7\n\t"
  14692. "adds r10, r10, r5\n\t"
  14693. "str r10, [%[a], #220]\n\t"
  14694. "adc r4, r4, #0\n\t"
  14695. /* a[i+56] += m[56] * mu */
  14696. "ldr r7, [%[m], #224]\n\t"
  14697. "ldr r10, [%[a], #224]\n\t"
  14698. "mov r5, #0\n\t"
  14699. "umlal r10, r5, r8, r7\n\t"
  14700. "adds r10, r10, r4\n\t"
  14701. "str r10, [%[a], #224]\n\t"
  14702. "adc r5, r5, #0\n\t"
  14703. /* a[i+57] += m[57] * mu */
  14704. "ldr r7, [%[m], #228]\n\t"
  14705. "ldr r10, [%[a], #228]\n\t"
  14706. "mov r4, #0\n\t"
  14707. "umlal r10, r4, r8, r7\n\t"
  14708. "adds r10, r10, r5\n\t"
  14709. "str r10, [%[a], #228]\n\t"
  14710. "adc r4, r4, #0\n\t"
  14711. /* a[i+58] += m[58] * mu */
  14712. "ldr r7, [%[m], #232]\n\t"
  14713. "ldr r10, [%[a], #232]\n\t"
  14714. "mov r5, #0\n\t"
  14715. "umlal r10, r5, r8, r7\n\t"
  14716. "adds r10, r10, r4\n\t"
  14717. "str r10, [%[a], #232]\n\t"
  14718. "adc r5, r5, #0\n\t"
  14719. /* a[i+59] += m[59] * mu */
  14720. "ldr r7, [%[m], #236]\n\t"
  14721. "ldr r10, [%[a], #236]\n\t"
  14722. "mov r4, #0\n\t"
  14723. "umlal r10, r4, r8, r7\n\t"
  14724. "adds r10, r10, r5\n\t"
  14725. "str r10, [%[a], #236]\n\t"
  14726. "adc r4, r4, #0\n\t"
  14727. /* a[i+60] += m[60] * mu */
  14728. "ldr r7, [%[m], #240]\n\t"
  14729. "ldr r10, [%[a], #240]\n\t"
  14730. "mov r5, #0\n\t"
  14731. "umlal r10, r5, r8, r7\n\t"
  14732. "adds r10, r10, r4\n\t"
  14733. "str r10, [%[a], #240]\n\t"
  14734. "adc r5, r5, #0\n\t"
  14735. /* a[i+61] += m[61] * mu */
  14736. "ldr r7, [%[m], #244]\n\t"
  14737. "ldr r10, [%[a], #244]\n\t"
  14738. "mov r4, #0\n\t"
  14739. "umlal r10, r4, r8, r7\n\t"
  14740. "adds r10, r10, r5\n\t"
  14741. "str r10, [%[a], #244]\n\t"
  14742. "adc r4, r4, #0\n\t"
  14743. /* a[i+62] += m[62] * mu */
  14744. "ldr r7, [%[m], #248]\n\t"
  14745. "ldr r10, [%[a], #248]\n\t"
  14746. "mov r5, #0\n\t"
  14747. "umlal r10, r5, r8, r7\n\t"
  14748. "adds r10, r10, r4\n\t"
  14749. "str r10, [%[a], #248]\n\t"
  14750. "adc r5, r5, #0\n\t"
  14751. /* a[i+63] += m[63] * mu */
  14752. "ldr r7, [%[m], #252]\n\t"
  14753. "ldr r10, [%[a], #252]\n\t"
  14754. "umull r6, r7, r8, r7\n\t"
  14755. "adds r5, r5, r6\n\t"
  14756. "adcs r4, r7, r3\n\t"
  14757. "mov r3, #0\n\t"
  14758. "adc r3, r3, r3\n\t"
  14759. "adds r10, r10, r5\n\t"
  14760. "str r10, [%[a], #252]\n\t"
  14761. "ldr r10, [%[a], #256]\n\t"
  14762. "adcs r10, r10, r4\n\t"
  14763. "str r10, [%[a], #256]\n\t"
  14764. "adc r3, r3, #0\n\t"
  14765. /* i += 1 */
  14766. "add r9, r9, #4\n\t"
  14767. "add %[a], %[a], #4\n\t"
  14768. "cmp r9, #0x100\n\t"
  14769. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  14770. /* Loop Done */
  14771. "str r12, [%[a]]\n\t"
  14772. "str lr, [%[a], #4]\n\t"
  14773. "mov %[mp], r3\n\t"
  14774. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  14775. :
  14776. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  14777. );
  14778. sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp);
  14779. }
  14780. #else
  14781. /* Reduce the number back to 2048 bits using Montgomery reduction.
  14782. *
  14783. * a A single precision number to reduce in place.
  14784. * m The single precision number representing the modulus.
  14785. * mp The digit representing the negative inverse of m mod 2^n.
  14786. */
  14787. static SP_NOINLINE void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  14788. {
  14789. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  14790. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  14791. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  14792. __asm__ __volatile__ (
  14793. /* i = 0 */
  14794. "mov r12, #0\n\t"
  14795. "mov lr, #0\n\t"
  14796. "ldr r4, [%[a]]\n\t"
  14797. "ldr r5, [%[a], #4]\n\t"
  14798. "ldr r6, [%[a], #8]\n\t"
  14799. "ldr r7, [%[a], #12]\n\t"
  14800. "ldr r8, [%[a], #16]\n\t"
  14801. "\n"
  14802. "L_sp_2048_mont_reduce_64_word_%=: \n\t"
  14803. /* mu = a[i] * mp */
  14804. "mul r11, %[mp], r4\n\t"
  14805. /* a[i+0] += m[0] * mu */
  14806. "ldr r10, [%[m]]\n\t"
  14807. "mov r3, #0\n\t"
  14808. "umaal r4, r3, r11, r10\n\t"
  14809. /* a[i+1] += m[1] * mu */
  14810. "ldr r10, [%[m], #4]\n\t"
  14811. "mov r4, r5\n\t"
  14812. "umaal r4, r3, r11, r10\n\t"
  14813. /* a[i+2] += m[2] * mu */
  14814. "ldr r10, [%[m], #8]\n\t"
  14815. "mov r5, r6\n\t"
  14816. "umaal r5, r3, r11, r10\n\t"
  14817. /* a[i+3] += m[3] * mu */
  14818. "ldr r10, [%[m], #12]\n\t"
  14819. "mov r6, r7\n\t"
  14820. "umaal r6, r3, r11, r10\n\t"
  14821. /* a[i+4] += m[4] * mu */
  14822. "ldr r10, [%[m], #16]\n\t"
  14823. "mov r7, r8\n\t"
  14824. "umaal r7, r3, r11, r10\n\t"
  14825. /* a[i+5] += m[5] * mu */
  14826. "ldr r10, [%[m], #20]\n\t"
  14827. "ldr r8, [%[a], #20]\n\t"
  14828. "umaal r8, r3, r11, r10\n\t"
  14829. /* a[i+6] += m[6] * mu */
  14830. "ldr r10, [%[m], #24]\n\t"
  14831. "ldr r9, [%[a], #24]\n\t"
  14832. "umaal r9, r3, r11, r10\n\t"
  14833. "str r9, [%[a], #24]\n\t"
  14834. /* a[i+7] += m[7] * mu */
  14835. "ldr r10, [%[m], #28]\n\t"
  14836. "ldr r9, [%[a], #28]\n\t"
  14837. "umaal r9, r3, r11, r10\n\t"
  14838. "str r9, [%[a], #28]\n\t"
  14839. /* a[i+8] += m[8] * mu */
  14840. "ldr r10, [%[m], #32]\n\t"
  14841. "ldr r9, [%[a], #32]\n\t"
  14842. "umaal r9, r3, r11, r10\n\t"
  14843. "str r9, [%[a], #32]\n\t"
  14844. /* a[i+9] += m[9] * mu */
  14845. "ldr r10, [%[m], #36]\n\t"
  14846. "ldr r9, [%[a], #36]\n\t"
  14847. "umaal r9, r3, r11, r10\n\t"
  14848. "str r9, [%[a], #36]\n\t"
  14849. /* a[i+10] += m[10] * mu */
  14850. "ldr r10, [%[m], #40]\n\t"
  14851. "ldr r9, [%[a], #40]\n\t"
  14852. "umaal r9, r3, r11, r10\n\t"
  14853. "str r9, [%[a], #40]\n\t"
  14854. /* a[i+11] += m[11] * mu */
  14855. "ldr r10, [%[m], #44]\n\t"
  14856. "ldr r9, [%[a], #44]\n\t"
  14857. "umaal r9, r3, r11, r10\n\t"
  14858. "str r9, [%[a], #44]\n\t"
  14859. /* a[i+12] += m[12] * mu */
  14860. "ldr r10, [%[m], #48]\n\t"
  14861. "ldr r9, [%[a], #48]\n\t"
  14862. "umaal r9, r3, r11, r10\n\t"
  14863. "str r9, [%[a], #48]\n\t"
  14864. /* a[i+13] += m[13] * mu */
  14865. "ldr r10, [%[m], #52]\n\t"
  14866. "ldr r9, [%[a], #52]\n\t"
  14867. "umaal r9, r3, r11, r10\n\t"
  14868. "str r9, [%[a], #52]\n\t"
  14869. /* a[i+14] += m[14] * mu */
  14870. "ldr r10, [%[m], #56]\n\t"
  14871. "ldr r9, [%[a], #56]\n\t"
  14872. "umaal r9, r3, r11, r10\n\t"
  14873. "str r9, [%[a], #56]\n\t"
  14874. /* a[i+15] += m[15] * mu */
  14875. "ldr r10, [%[m], #60]\n\t"
  14876. "ldr r9, [%[a], #60]\n\t"
  14877. "umaal r9, r3, r11, r10\n\t"
  14878. "str r9, [%[a], #60]\n\t"
  14879. /* a[i+16] += m[16] * mu */
  14880. "ldr r10, [%[m], #64]\n\t"
  14881. "ldr r9, [%[a], #64]\n\t"
  14882. "umaal r9, r3, r11, r10\n\t"
  14883. "str r9, [%[a], #64]\n\t"
  14884. /* a[i+17] += m[17] * mu */
  14885. "ldr r10, [%[m], #68]\n\t"
  14886. "ldr r9, [%[a], #68]\n\t"
  14887. "umaal r9, r3, r11, r10\n\t"
  14888. "str r9, [%[a], #68]\n\t"
  14889. /* a[i+18] += m[18] * mu */
  14890. "ldr r10, [%[m], #72]\n\t"
  14891. "ldr r9, [%[a], #72]\n\t"
  14892. "umaal r9, r3, r11, r10\n\t"
  14893. "str r9, [%[a], #72]\n\t"
  14894. /* a[i+19] += m[19] * mu */
  14895. "ldr r10, [%[m], #76]\n\t"
  14896. "ldr r9, [%[a], #76]\n\t"
  14897. "umaal r9, r3, r11, r10\n\t"
  14898. "str r9, [%[a], #76]\n\t"
  14899. /* a[i+20] += m[20] * mu */
  14900. "ldr r10, [%[m], #80]\n\t"
  14901. "ldr r9, [%[a], #80]\n\t"
  14902. "umaal r9, r3, r11, r10\n\t"
  14903. "str r9, [%[a], #80]\n\t"
  14904. /* a[i+21] += m[21] * mu */
  14905. "ldr r10, [%[m], #84]\n\t"
  14906. "ldr r9, [%[a], #84]\n\t"
  14907. "umaal r9, r3, r11, r10\n\t"
  14908. "str r9, [%[a], #84]\n\t"
  14909. /* a[i+22] += m[22] * mu */
  14910. "ldr r10, [%[m], #88]\n\t"
  14911. "ldr r9, [%[a], #88]\n\t"
  14912. "umaal r9, r3, r11, r10\n\t"
  14913. "str r9, [%[a], #88]\n\t"
  14914. /* a[i+23] += m[23] * mu */
  14915. "ldr r10, [%[m], #92]\n\t"
  14916. "ldr r9, [%[a], #92]\n\t"
  14917. "umaal r9, r3, r11, r10\n\t"
  14918. "str r9, [%[a], #92]\n\t"
  14919. /* a[i+24] += m[24] * mu */
  14920. "ldr r10, [%[m], #96]\n\t"
  14921. "ldr r9, [%[a], #96]\n\t"
  14922. "umaal r9, r3, r11, r10\n\t"
  14923. "str r9, [%[a], #96]\n\t"
  14924. /* a[i+25] += m[25] * mu */
  14925. "ldr r10, [%[m], #100]\n\t"
  14926. "ldr r9, [%[a], #100]\n\t"
  14927. "umaal r9, r3, r11, r10\n\t"
  14928. "str r9, [%[a], #100]\n\t"
  14929. /* a[i+26] += m[26] * mu */
  14930. "ldr r10, [%[m], #104]\n\t"
  14931. "ldr r9, [%[a], #104]\n\t"
  14932. "umaal r9, r3, r11, r10\n\t"
  14933. "str r9, [%[a], #104]\n\t"
  14934. /* a[i+27] += m[27] * mu */
  14935. "ldr r10, [%[m], #108]\n\t"
  14936. "ldr r9, [%[a], #108]\n\t"
  14937. "umaal r9, r3, r11, r10\n\t"
  14938. "str r9, [%[a], #108]\n\t"
  14939. /* a[i+28] += m[28] * mu */
  14940. "ldr r10, [%[m], #112]\n\t"
  14941. "ldr r9, [%[a], #112]\n\t"
  14942. "umaal r9, r3, r11, r10\n\t"
  14943. "str r9, [%[a], #112]\n\t"
  14944. /* a[i+29] += m[29] * mu */
  14945. "ldr r10, [%[m], #116]\n\t"
  14946. "ldr r9, [%[a], #116]\n\t"
  14947. "umaal r9, r3, r11, r10\n\t"
  14948. "str r9, [%[a], #116]\n\t"
  14949. /* a[i+30] += m[30] * mu */
  14950. "ldr r10, [%[m], #120]\n\t"
  14951. "ldr r9, [%[a], #120]\n\t"
  14952. "umaal r9, r3, r11, r10\n\t"
  14953. "str r9, [%[a], #120]\n\t"
  14954. /* a[i+31] += m[31] * mu */
  14955. "ldr r10, [%[m], #124]\n\t"
  14956. "ldr r9, [%[a], #124]\n\t"
  14957. "umaal r9, r3, r11, r10\n\t"
  14958. "str r9, [%[a], #124]\n\t"
  14959. /* a[i+32] += m[32] * mu */
  14960. "ldr r10, [%[m], #128]\n\t"
  14961. "ldr r9, [%[a], #128]\n\t"
  14962. "umaal r9, r3, r11, r10\n\t"
  14963. "str r9, [%[a], #128]\n\t"
  14964. /* a[i+33] += m[33] * mu */
  14965. "ldr r10, [%[m], #132]\n\t"
  14966. "ldr r9, [%[a], #132]\n\t"
  14967. "umaal r9, r3, r11, r10\n\t"
  14968. "str r9, [%[a], #132]\n\t"
  14969. /* a[i+34] += m[34] * mu */
  14970. "ldr r10, [%[m], #136]\n\t"
  14971. "ldr r9, [%[a], #136]\n\t"
  14972. "umaal r9, r3, r11, r10\n\t"
  14973. "str r9, [%[a], #136]\n\t"
  14974. /* a[i+35] += m[35] * mu */
  14975. "ldr r10, [%[m], #140]\n\t"
  14976. "ldr r9, [%[a], #140]\n\t"
  14977. "umaal r9, r3, r11, r10\n\t"
  14978. "str r9, [%[a], #140]\n\t"
  14979. /* a[i+36] += m[36] * mu */
  14980. "ldr r10, [%[m], #144]\n\t"
  14981. "ldr r9, [%[a], #144]\n\t"
  14982. "umaal r9, r3, r11, r10\n\t"
  14983. "str r9, [%[a], #144]\n\t"
  14984. /* a[i+37] += m[37] * mu */
  14985. "ldr r10, [%[m], #148]\n\t"
  14986. "ldr r9, [%[a], #148]\n\t"
  14987. "umaal r9, r3, r11, r10\n\t"
  14988. "str r9, [%[a], #148]\n\t"
  14989. /* a[i+38] += m[38] * mu */
  14990. "ldr r10, [%[m], #152]\n\t"
  14991. "ldr r9, [%[a], #152]\n\t"
  14992. "umaal r9, r3, r11, r10\n\t"
  14993. "str r9, [%[a], #152]\n\t"
  14994. /* a[i+39] += m[39] * mu */
  14995. "ldr r10, [%[m], #156]\n\t"
  14996. "ldr r9, [%[a], #156]\n\t"
  14997. "umaal r9, r3, r11, r10\n\t"
  14998. "str r9, [%[a], #156]\n\t"
  14999. /* a[i+40] += m[40] * mu */
  15000. "ldr r10, [%[m], #160]\n\t"
  15001. "ldr r9, [%[a], #160]\n\t"
  15002. "umaal r9, r3, r11, r10\n\t"
  15003. "str r9, [%[a], #160]\n\t"
  15004. /* a[i+41] += m[41] * mu */
  15005. "ldr r10, [%[m], #164]\n\t"
  15006. "ldr r9, [%[a], #164]\n\t"
  15007. "umaal r9, r3, r11, r10\n\t"
  15008. "str r9, [%[a], #164]\n\t"
  15009. /* a[i+42] += m[42] * mu */
  15010. "ldr r10, [%[m], #168]\n\t"
  15011. "ldr r9, [%[a], #168]\n\t"
  15012. "umaal r9, r3, r11, r10\n\t"
  15013. "str r9, [%[a], #168]\n\t"
  15014. /* a[i+43] += m[43] * mu */
  15015. "ldr r10, [%[m], #172]\n\t"
  15016. "ldr r9, [%[a], #172]\n\t"
  15017. "umaal r9, r3, r11, r10\n\t"
  15018. "str r9, [%[a], #172]\n\t"
  15019. /* a[i+44] += m[44] * mu */
  15020. "ldr r10, [%[m], #176]\n\t"
  15021. "ldr r9, [%[a], #176]\n\t"
  15022. "umaal r9, r3, r11, r10\n\t"
  15023. "str r9, [%[a], #176]\n\t"
  15024. /* a[i+45] += m[45] * mu */
  15025. "ldr r10, [%[m], #180]\n\t"
  15026. "ldr r9, [%[a], #180]\n\t"
  15027. "umaal r9, r3, r11, r10\n\t"
  15028. "str r9, [%[a], #180]\n\t"
  15029. /* a[i+46] += m[46] * mu */
  15030. "ldr r10, [%[m], #184]\n\t"
  15031. "ldr r9, [%[a], #184]\n\t"
  15032. "umaal r9, r3, r11, r10\n\t"
  15033. "str r9, [%[a], #184]\n\t"
  15034. /* a[i+47] += m[47] * mu */
  15035. "ldr r10, [%[m], #188]\n\t"
  15036. "ldr r9, [%[a], #188]\n\t"
  15037. "umaal r9, r3, r11, r10\n\t"
  15038. "str r9, [%[a], #188]\n\t"
  15039. /* a[i+48] += m[48] * mu */
  15040. "ldr r10, [%[m], #192]\n\t"
  15041. "ldr r9, [%[a], #192]\n\t"
  15042. "umaal r9, r3, r11, r10\n\t"
  15043. "str r9, [%[a], #192]\n\t"
  15044. /* a[i+49] += m[49] * mu */
  15045. "ldr r10, [%[m], #196]\n\t"
  15046. "ldr r9, [%[a], #196]\n\t"
  15047. "umaal r9, r3, r11, r10\n\t"
  15048. "str r9, [%[a], #196]\n\t"
  15049. /* a[i+50] += m[50] * mu */
  15050. "ldr r10, [%[m], #200]\n\t"
  15051. "ldr r9, [%[a], #200]\n\t"
  15052. "umaal r9, r3, r11, r10\n\t"
  15053. "str r9, [%[a], #200]\n\t"
  15054. /* a[i+51] += m[51] * mu */
  15055. "ldr r10, [%[m], #204]\n\t"
  15056. "ldr r9, [%[a], #204]\n\t"
  15057. "umaal r9, r3, r11, r10\n\t"
  15058. "str r9, [%[a], #204]\n\t"
  15059. /* a[i+52] += m[52] * mu */
  15060. "ldr r10, [%[m], #208]\n\t"
  15061. "ldr r9, [%[a], #208]\n\t"
  15062. "umaal r9, r3, r11, r10\n\t"
  15063. "str r9, [%[a], #208]\n\t"
  15064. /* a[i+53] += m[53] * mu */
  15065. "ldr r10, [%[m], #212]\n\t"
  15066. "ldr r9, [%[a], #212]\n\t"
  15067. "umaal r9, r3, r11, r10\n\t"
  15068. "str r9, [%[a], #212]\n\t"
  15069. /* a[i+54] += m[54] * mu */
  15070. "ldr r10, [%[m], #216]\n\t"
  15071. "ldr r9, [%[a], #216]\n\t"
  15072. "umaal r9, r3, r11, r10\n\t"
  15073. "str r9, [%[a], #216]\n\t"
  15074. /* a[i+55] += m[55] * mu */
  15075. "ldr r10, [%[m], #220]\n\t"
  15076. "ldr r9, [%[a], #220]\n\t"
  15077. "umaal r9, r3, r11, r10\n\t"
  15078. "str r9, [%[a], #220]\n\t"
  15079. /* a[i+56] += m[56] * mu */
  15080. "ldr r10, [%[m], #224]\n\t"
  15081. "ldr r9, [%[a], #224]\n\t"
  15082. "umaal r9, r3, r11, r10\n\t"
  15083. "str r9, [%[a], #224]\n\t"
  15084. /* a[i+57] += m[57] * mu */
  15085. "ldr r10, [%[m], #228]\n\t"
  15086. "ldr r9, [%[a], #228]\n\t"
  15087. "umaal r9, r3, r11, r10\n\t"
  15088. "str r9, [%[a], #228]\n\t"
  15089. /* a[i+58] += m[58] * mu */
  15090. "ldr r10, [%[m], #232]\n\t"
  15091. "ldr r9, [%[a], #232]\n\t"
  15092. "umaal r9, r3, r11, r10\n\t"
  15093. "str r9, [%[a], #232]\n\t"
  15094. /* a[i+59] += m[59] * mu */
  15095. "ldr r10, [%[m], #236]\n\t"
  15096. "ldr r9, [%[a], #236]\n\t"
  15097. "umaal r9, r3, r11, r10\n\t"
  15098. "str r9, [%[a], #236]\n\t"
  15099. /* a[i+60] += m[60] * mu */
  15100. "ldr r10, [%[m], #240]\n\t"
  15101. "ldr r9, [%[a], #240]\n\t"
  15102. "umaal r9, r3, r11, r10\n\t"
  15103. "str r9, [%[a], #240]\n\t"
  15104. /* a[i+61] += m[61] * mu */
  15105. "ldr r10, [%[m], #244]\n\t"
  15106. "ldr r9, [%[a], #244]\n\t"
  15107. "umaal r9, r3, r11, r10\n\t"
  15108. "str r9, [%[a], #244]\n\t"
  15109. /* a[i+62] += m[62] * mu */
  15110. "ldr r10, [%[m], #248]\n\t"
  15111. "ldr r9, [%[a], #248]\n\t"
  15112. "umaal r9, r3, r11, r10\n\t"
  15113. "str r9, [%[a], #248]\n\t"
  15114. /* a[i+63] += m[63] * mu */
  15115. "ldr r10, [%[m], #252]\n\t"
  15116. "ldr r9, [%[a], #252]\n\t"
  15117. "umaal r9, r3, r11, r10\n\t"
  15118. "ldr r11, [%[a], #256]\n\t"
  15119. "mov r10, #0\n\t"
  15120. "umaal r3, r11, r10, r10\n\t"
  15121. "str r9, [%[a], #252]\n\t"
  15122. "adds r3, r3, lr\n\t"
  15123. "adc lr, r11, #0\n\t"
  15124. "str r3, [%[a], #256]\n\t"
  15125. /* i += 1 */
  15126. "add r12, r12, #4\n\t"
  15127. "add %[a], %[a], #4\n\t"
  15128. "cmp r12, #0x100\n\t"
  15129. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  15130. /* Loop Done */
  15131. "str r4, [%[a]]\n\t"
  15132. "str r5, [%[a], #4]\n\t"
  15133. "str r6, [%[a], #8]\n\t"
  15134. "str r7, [%[a], #12]\n\t"
  15135. "str r8, [%[a], #16]\n\t"
  15136. "mov %[mp], lr\n\t"
  15137. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  15138. :
  15139. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  15140. );
  15141. sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp);
  15142. }
  15143. #endif
  15144. /* Multiply two Montgomery form numbers mod the modulus (prime).
  15145. * (r = a * b mod m)
  15146. *
  15147. * r Result of multiplication.
  15148. * a First number to multiply in Montgomery form.
  15149. * b Second number to multiply in Montgomery form.
  15150. * m Modulus (prime).
  15151. * mp Montgomery multiplier.
  15152. */
  15153. SP_NOINLINE static void sp_2048_mont_mul_64(sp_digit* r, const sp_digit* a,
  15154. const sp_digit* b, const sp_digit* m, sp_digit mp)
  15155. {
  15156. sp_2048_mul_64(r, a, b);
  15157. sp_2048_mont_reduce_64(r, m, mp);
  15158. }
  15159. /* Square the Montgomery form number. (r = a * a mod m)
  15160. *
  15161. * r Result of squaring.
  15162. * a Number to square in Montgomery form.
  15163. * m Modulus (prime).
  15164. * mp Montgomery multiplier.
  15165. */
  15166. SP_NOINLINE static void sp_2048_mont_sqr_64(sp_digit* r, const sp_digit* a,
  15167. const sp_digit* m, sp_digit mp)
  15168. {
  15169. sp_2048_sqr_64(r, a);
  15170. sp_2048_mont_reduce_64(r, m, mp);
  15171. }
  15172. #ifdef WOLFSSL_SP_SMALL
  15173. /* Sub b from a into r. (r = a - b)
  15174. *
  15175. * r A single precision integer.
  15176. * a A single precision integer.
  15177. * b A single precision integer.
  15178. */
  15179. static sp_digit sp_2048_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  15180. {
  15181. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  15182. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  15183. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  15184. __asm__ __volatile__ (
  15185. "mov r12, #0\n\t"
  15186. "add lr, %[a], #0x100\n\t"
  15187. "\n"
  15188. "L_sp_2048_sub_64_word_%=: \n\t"
  15189. "rsbs r12, r12, #0\n\t"
  15190. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15191. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15192. "sbcs r3, r3, r7\n\t"
  15193. "sbcs r4, r4, r8\n\t"
  15194. "sbcs r5, r5, r9\n\t"
  15195. "sbcs r6, r6, r10\n\t"
  15196. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15197. "sbc r12, r3, r3\n\t"
  15198. "cmp %[a], lr\n\t"
  15199. "bne L_sp_2048_sub_64_word_%=\n\t"
  15200. "mov %[r], r12\n\t"
  15201. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  15202. :
  15203. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  15204. );
  15205. return (uint32_t)(size_t)r;
  15206. }
  15207. #else
  15208. /* Sub b from a into r. (r = a - b)
  15209. *
  15210. * r A single precision integer.
  15211. * a A single precision integer.
  15212. * b A single precision integer.
  15213. */
  15214. static sp_digit sp_2048_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  15215. {
  15216. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  15217. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  15218. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  15219. __asm__ __volatile__ (
  15220. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15221. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15222. "subs r3, r3, r7\n\t"
  15223. "sbcs r4, r4, r8\n\t"
  15224. "sbcs r5, r5, r9\n\t"
  15225. "sbcs r6, r6, r10\n\t"
  15226. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15227. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15228. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15229. "sbcs r3, r3, r7\n\t"
  15230. "sbcs r4, r4, r8\n\t"
  15231. "sbcs r5, r5, r9\n\t"
  15232. "sbcs r6, r6, r10\n\t"
  15233. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15234. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15235. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15236. "sbcs r3, r3, r7\n\t"
  15237. "sbcs r4, r4, r8\n\t"
  15238. "sbcs r5, r5, r9\n\t"
  15239. "sbcs r6, r6, r10\n\t"
  15240. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15241. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15242. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15243. "sbcs r3, r3, r7\n\t"
  15244. "sbcs r4, r4, r8\n\t"
  15245. "sbcs r5, r5, r9\n\t"
  15246. "sbcs r6, r6, r10\n\t"
  15247. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15248. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15249. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15250. "sbcs r3, r3, r7\n\t"
  15251. "sbcs r4, r4, r8\n\t"
  15252. "sbcs r5, r5, r9\n\t"
  15253. "sbcs r6, r6, r10\n\t"
  15254. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15255. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15256. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15257. "sbcs r3, r3, r7\n\t"
  15258. "sbcs r4, r4, r8\n\t"
  15259. "sbcs r5, r5, r9\n\t"
  15260. "sbcs r6, r6, r10\n\t"
  15261. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15262. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15263. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15264. "sbcs r3, r3, r7\n\t"
  15265. "sbcs r4, r4, r8\n\t"
  15266. "sbcs r5, r5, r9\n\t"
  15267. "sbcs r6, r6, r10\n\t"
  15268. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15269. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15270. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15271. "sbcs r3, r3, r7\n\t"
  15272. "sbcs r4, r4, r8\n\t"
  15273. "sbcs r5, r5, r9\n\t"
  15274. "sbcs r6, r6, r10\n\t"
  15275. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15276. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15277. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15278. "sbcs r3, r3, r7\n\t"
  15279. "sbcs r4, r4, r8\n\t"
  15280. "sbcs r5, r5, r9\n\t"
  15281. "sbcs r6, r6, r10\n\t"
  15282. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15283. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15284. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15285. "sbcs r3, r3, r7\n\t"
  15286. "sbcs r4, r4, r8\n\t"
  15287. "sbcs r5, r5, r9\n\t"
  15288. "sbcs r6, r6, r10\n\t"
  15289. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15290. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15291. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15292. "sbcs r3, r3, r7\n\t"
  15293. "sbcs r4, r4, r8\n\t"
  15294. "sbcs r5, r5, r9\n\t"
  15295. "sbcs r6, r6, r10\n\t"
  15296. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15297. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15298. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15299. "sbcs r3, r3, r7\n\t"
  15300. "sbcs r4, r4, r8\n\t"
  15301. "sbcs r5, r5, r9\n\t"
  15302. "sbcs r6, r6, r10\n\t"
  15303. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15304. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15305. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15306. "sbcs r3, r3, r7\n\t"
  15307. "sbcs r4, r4, r8\n\t"
  15308. "sbcs r5, r5, r9\n\t"
  15309. "sbcs r6, r6, r10\n\t"
  15310. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15311. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15312. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15313. "sbcs r3, r3, r7\n\t"
  15314. "sbcs r4, r4, r8\n\t"
  15315. "sbcs r5, r5, r9\n\t"
  15316. "sbcs r6, r6, r10\n\t"
  15317. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15318. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15319. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15320. "sbcs r3, r3, r7\n\t"
  15321. "sbcs r4, r4, r8\n\t"
  15322. "sbcs r5, r5, r9\n\t"
  15323. "sbcs r6, r6, r10\n\t"
  15324. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15325. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  15326. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  15327. "sbcs r3, r3, r7\n\t"
  15328. "sbcs r4, r4, r8\n\t"
  15329. "sbcs r5, r5, r9\n\t"
  15330. "sbcs r6, r6, r10\n\t"
  15331. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  15332. "sbc %[r], r6, r6\n\t"
  15333. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  15334. :
  15335. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  15336. );
  15337. return (uint32_t)(size_t)r;
  15338. }
  15339. #endif /* WOLFSSL_SP_SMALL */
  15340. #ifdef WOLFSSL_SP_USE_UDIV
  15341. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  15342. *
  15343. * d1 The high order half of the number to divide.
  15344. * d0 The low order half of the number to divide.
  15345. * div The divisor.
  15346. * returns the result of the division.
  15347. *
  15348. * Note that this is an approximate div. It may give an answer 1 larger.
  15349. */
  15350. static sp_digit div_2048_word_64(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  15351. {
  15352. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  15353. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  15354. register sp_digit div asm ("r2") = (sp_digit)div_p;
  15355. __asm__ __volatile__ (
  15356. "lsr r6, %[div], #16\n\t"
  15357. "add lr, r6, #1\n\t"
  15358. "udiv r4, %[d1], lr\n\t"
  15359. "lsl r5, %[div], #16\n\t"
  15360. "lsl r4, r4, #16\n\t"
  15361. "umull r3, r12, %[div], r4\n\t"
  15362. "subs %[d0], %[d0], r3\n\t"
  15363. "sbc %[d1], %[d1], r12\n\t"
  15364. "subs r3, %[d1], lr\n\t"
  15365. "sbc r7, r7, r7\n\t"
  15366. "add r7, r7, #1\n\t"
  15367. "rsb r8, r7, #0\n\t"
  15368. "lsl r7, r7, #16\n\t"
  15369. "and r5, r5, r8\n\t"
  15370. "and r6, r6, r8\n\t"
  15371. "subs %[d0], %[d0], r5\n\t"
  15372. "add r4, r4, r7\n\t"
  15373. "sbc %[d1], %[d1], r6\n\t"
  15374. "lsl r12, %[d1], #16\n\t"
  15375. "lsr r3, %[d0], #16\n\t"
  15376. "orr r3, r3, r12\n\t"
  15377. "udiv r3, r3, lr\n\t"
  15378. "add r4, r4, r3\n\t"
  15379. "umull r3, r12, %[div], r3\n\t"
  15380. "subs %[d0], %[d0], r3\n\t"
  15381. "sbc %[d1], %[d1], r12\n\t"
  15382. "lsl r12, %[d1], #16\n\t"
  15383. "lsr r3, %[d0], #16\n\t"
  15384. "orr r3, r3, r12\n\t"
  15385. "udiv r3, r3, lr\n\t"
  15386. "add r4, r4, r3\n\t"
  15387. "mul r3, %[div], r3\n\t"
  15388. "sub %[d0], %[d0], r3\n\t"
  15389. "udiv r3, %[d0], %[div]\n\t"
  15390. "add %[d1], r4, r3\n\t"
  15391. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  15392. :
  15393. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  15394. );
  15395. return (uint32_t)(size_t)d1;
  15396. }
  15397. #else
  15398. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  15399. *
  15400. * d1 The high order half of the number to divide.
  15401. * d0 The low order half of the number to divide.
  15402. * div The divisor.
  15403. * returns the result of the division.
  15404. *
  15405. * Note that this is an approximate div. It may give an answer 1 larger.
  15406. */
  15407. static sp_digit div_2048_word_64(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  15408. {
  15409. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  15410. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  15411. register sp_digit div asm ("r2") = (sp_digit)div_p;
  15412. __asm__ __volatile__ (
  15413. "lsr lr, %[div], #1\n\t"
  15414. "add lr, lr, #1\n\t"
  15415. "mov r4, %[d0]\n\t"
  15416. "mov r5, %[d1]\n\t"
  15417. /* Do top 32 */
  15418. "subs r6, lr, r5\n\t"
  15419. "sbc r6, r6, r6\n\t"
  15420. "mov r3, #0\n\t"
  15421. "sub r3, r3, r6\n\t"
  15422. "and r6, r6, lr\n\t"
  15423. "subs r5, r5, r6\n\t"
  15424. /* Next 30 bits */
  15425. "mov r12, #29\n\t"
  15426. "\n"
  15427. "L_div_2048_word_64_bit_%=: \n\t"
  15428. "lsls r4, r4, #1\n\t"
  15429. "adc r5, r5, r5\n\t"
  15430. "subs r6, lr, r5\n\t"
  15431. "sbc r6, r6, r6\n\t"
  15432. "add r3, r3, r3\n\t"
  15433. "sub r3, r3, r6\n\t"
  15434. "and r6, r6, lr\n\t"
  15435. "subs r5, r5, r6\n\t"
  15436. "subs r12, r12, #1\n\t"
  15437. "bpl L_div_2048_word_64_bit_%=\n\t"
  15438. "add r3, r3, r3\n\t"
  15439. "add r3, r3, #1\n\t"
  15440. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  15441. "lsl r7, r3, #16\n\t"
  15442. "lsl r4, %[div], #16\n\t"
  15443. "lsr r7, r7, #16\n\t"
  15444. "lsr r4, r4, #16\n\t"
  15445. "mul r4, r7, r4\n\t"
  15446. "lsr r8, %[div], #16\n\t"
  15447. "mul r7, r8, r7\n\t"
  15448. "lsr r5, r7, #16\n\t"
  15449. "lsl r7, r7, #16\n\t"
  15450. "adds r4, r4, r7\n\t"
  15451. "adc r5, r5, #0\n\t"
  15452. "lsr r7, r3, #16\n\t"
  15453. "mul r8, r7, r8\n\t"
  15454. "add r5, r5, r8\n\t"
  15455. "lsl r8, %[div], #16\n\t"
  15456. "lsr r8, r8, #16\n\t"
  15457. "mul r7, r8, r7\n\t"
  15458. "lsr r8, r7, #16\n\t"
  15459. "lsl r7, r7, #16\n\t"
  15460. "adds r4, r4, r7\n\t"
  15461. "adc r5, r5, r8\n\t"
  15462. #else
  15463. "umull r4, r5, r3, %[div]\n\t"
  15464. #endif
  15465. "subs r7, %[d0], r4\n\t"
  15466. "sbc r8, %[d1], r5\n\t"
  15467. "add r3, r3, r8\n\t"
  15468. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  15469. "lsl r7, r3, #16\n\t"
  15470. "lsl r4, %[div], #16\n\t"
  15471. "lsr r7, r7, #16\n\t"
  15472. "lsr r4, r4, #16\n\t"
  15473. "mul r4, r7, r4\n\t"
  15474. "lsr r8, %[div], #16\n\t"
  15475. "mul r7, r8, r7\n\t"
  15476. "lsr r5, r7, #16\n\t"
  15477. "lsl r7, r7, #16\n\t"
  15478. "adds r4, r4, r7\n\t"
  15479. "adc r5, r5, #0\n\t"
  15480. "lsr r7, r3, #16\n\t"
  15481. "mul r8, r7, r8\n\t"
  15482. "add r5, r5, r8\n\t"
  15483. "lsl r8, %[div], #16\n\t"
  15484. "lsr r8, r8, #16\n\t"
  15485. "mul r7, r8, r7\n\t"
  15486. "lsr r8, r7, #16\n\t"
  15487. "lsl r7, r7, #16\n\t"
  15488. "adds r4, r4, r7\n\t"
  15489. "adc r5, r5, r8\n\t"
  15490. #else
  15491. "umull r4, r5, r3, %[div]\n\t"
  15492. #endif
  15493. "subs r7, %[d0], r4\n\t"
  15494. "sbc r8, %[d1], r5\n\t"
  15495. "add r3, r3, r8\n\t"
  15496. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  15497. "lsl r7, r3, #16\n\t"
  15498. "lsl r4, %[div], #16\n\t"
  15499. "lsr r7, r7, #16\n\t"
  15500. "lsr r4, r4, #16\n\t"
  15501. "mul r4, r7, r4\n\t"
  15502. "lsr r8, %[div], #16\n\t"
  15503. "mul r7, r8, r7\n\t"
  15504. "lsr r5, r7, #16\n\t"
  15505. "lsl r7, r7, #16\n\t"
  15506. "adds r4, r4, r7\n\t"
  15507. "adc r5, r5, #0\n\t"
  15508. "lsr r7, r3, #16\n\t"
  15509. "mul r8, r7, r8\n\t"
  15510. "add r5, r5, r8\n\t"
  15511. "lsl r8, %[div], #16\n\t"
  15512. "lsr r8, r8, #16\n\t"
  15513. "mul r7, r8, r7\n\t"
  15514. "lsr r8, r7, #16\n\t"
  15515. "lsl r7, r7, #16\n\t"
  15516. "adds r4, r4, r7\n\t"
  15517. "adc r5, r5, r8\n\t"
  15518. #else
  15519. "umull r4, r5, r3, %[div]\n\t"
  15520. #endif
  15521. "subs r7, %[d0], r4\n\t"
  15522. "sbc r8, %[d1], r5\n\t"
  15523. "add r3, r3, r8\n\t"
  15524. "subs r6, %[div], r7\n\t"
  15525. "sbc r6, r6, r6\n\t"
  15526. "sub %[d1], r3, r6\n\t"
  15527. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  15528. :
  15529. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  15530. );
  15531. return (uint32_t)(size_t)d1;
  15532. }
  15533. #endif
  15534. /* Divide d in a and put remainder into r (m*d + r = a)
  15535. * m is not calculated as it is not needed at this time.
  15536. *
  15537. * a Number to be divided.
  15538. * d Number to divide with.
  15539. * m Multiplier result.
  15540. * r Remainder from the division.
  15541. * returns MP_OKAY indicating success.
  15542. */
  15543. static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d,
  15544. sp_digit* m, sp_digit* r)
  15545. {
  15546. sp_digit t1[128], t2[65];
  15547. sp_digit div, r1;
  15548. int i;
  15549. (void)m;
  15550. div = d[63];
  15551. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  15552. for (i = 63; i > 0; i--) {
  15553. if (t1[i + 64] != d[i])
  15554. break;
  15555. }
  15556. if (t1[i + 64] >= d[i]) {
  15557. sp_2048_sub_in_place_64(&t1[64], d);
  15558. }
  15559. for (i = 63; i >= 0; i--) {
  15560. if (t1[64 + i] == div) {
  15561. r1 = SP_DIGIT_MAX;
  15562. }
  15563. else {
  15564. r1 = div_2048_word_64(t1[64 + i], t1[64 + i - 1], div);
  15565. }
  15566. sp_2048_mul_d_64(t2, d, r1);
  15567. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  15568. t1[64 + i] -= t2[64];
  15569. if (t1[64 + i] != 0) {
  15570. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  15571. if (t1[64 + i] != 0)
  15572. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  15573. }
  15574. }
  15575. for (i = 63; i > 0; i--) {
  15576. if (t1[i] != d[i])
  15577. break;
  15578. }
  15579. if (t1[i] >= d[i]) {
  15580. sp_2048_sub_64(r, t1, d);
  15581. }
  15582. else {
  15583. XMEMCPY(r, t1, sizeof(*t1) * 64);
  15584. }
  15585. return MP_OKAY;
  15586. }
  15587. /* Reduce a modulo m into r. (r = a mod m)
  15588. *
  15589. * r A single precision number that is the reduced result.
  15590. * a A single precision number that is to be reduced.
  15591. * m A single precision number that is the modulus to reduce with.
  15592. * returns MP_OKAY indicating success.
  15593. */
  15594. static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a,
  15595. const sp_digit* m)
  15596. {
  15597. return sp_2048_div_64_cond(a, m, NULL, r);
  15598. }
  15599. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  15600. #if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY)
  15601. /* AND m into each word of a and store in r.
  15602. *
  15603. * r A single precision integer.
  15604. * a A single precision integer.
  15605. * m Mask to AND against each digit.
  15606. */
  15607. static void sp_2048_mask_64(sp_digit* r, const sp_digit* a, sp_digit m)
  15608. {
  15609. #ifdef WOLFSSL_SP_SMALL
  15610. int i;
  15611. for (i=0; i<64; i++) {
  15612. r[i] = a[i] & m;
  15613. }
  15614. #else
  15615. int i;
  15616. for (i = 0; i < 64; i += 8) {
  15617. r[i+0] = a[i+0] & m;
  15618. r[i+1] = a[i+1] & m;
  15619. r[i+2] = a[i+2] & m;
  15620. r[i+3] = a[i+3] & m;
  15621. r[i+4] = a[i+4] & m;
  15622. r[i+5] = a[i+5] & m;
  15623. r[i+6] = a[i+6] & m;
  15624. r[i+7] = a[i+7] & m;
  15625. }
  15626. #endif
  15627. }
  15628. /* Compare a with b in constant time.
  15629. *
  15630. * a A single precision integer.
  15631. * b A single precision integer.
  15632. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  15633. * respectively.
  15634. */
  15635. static sp_int32 sp_2048_cmp_64(const sp_digit* a_p, const sp_digit* b_p)
  15636. {
  15637. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  15638. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  15639. __asm__ __volatile__ (
  15640. "mov r2, #-1\n\t"
  15641. "mov r6, #1\n\t"
  15642. "mov r5, #0\n\t"
  15643. "mov r3, #-1\n\t"
  15644. #ifdef WOLFSSL_SP_SMALL
  15645. "mov r4, #0xfc\n\t"
  15646. "\n"
  15647. "L_sp_2048_cmp_64_words_%=: \n\t"
  15648. "ldr r12, [%[a], r4]\n\t"
  15649. "ldr lr, [%[b], r4]\n\t"
  15650. "and r12, r12, r3\n\t"
  15651. "and lr, lr, r3\n\t"
  15652. "subs r12, r12, lr\n\t"
  15653. "it hi\n\t"
  15654. "movhi r2, r6\n\t"
  15655. "it lo\n\t"
  15656. "movlo r2, r3\n\t"
  15657. "it ne\n\t"
  15658. "movne r3, r5\n\t"
  15659. "subs r4, r4, #4\n\t"
  15660. "bcs L_sp_2048_cmp_64_words_%=\n\t"
  15661. "eor r2, r2, r3\n\t"
  15662. #else
  15663. "ldr r12, [%[a], #252]\n\t"
  15664. "ldr lr, [%[b], #252]\n\t"
  15665. "and r12, r12, r3\n\t"
  15666. "and lr, lr, r3\n\t"
  15667. "subs r12, r12, lr\n\t"
  15668. "it hi\n\t"
  15669. "movhi r2, r6\n\t"
  15670. "it lo\n\t"
  15671. "movlo r2, r3\n\t"
  15672. "it ne\n\t"
  15673. "movne r3, r5\n\t"
  15674. "ldr r12, [%[a], #248]\n\t"
  15675. "ldr lr, [%[b], #248]\n\t"
  15676. "and r12, r12, r3\n\t"
  15677. "and lr, lr, r3\n\t"
  15678. "subs r12, r12, lr\n\t"
  15679. "it hi\n\t"
  15680. "movhi r2, r6\n\t"
  15681. "it lo\n\t"
  15682. "movlo r2, r3\n\t"
  15683. "it ne\n\t"
  15684. "movne r3, r5\n\t"
  15685. "ldr r12, [%[a], #244]\n\t"
  15686. "ldr lr, [%[b], #244]\n\t"
  15687. "and r12, r12, r3\n\t"
  15688. "and lr, lr, r3\n\t"
  15689. "subs r12, r12, lr\n\t"
  15690. "it hi\n\t"
  15691. "movhi r2, r6\n\t"
  15692. "it lo\n\t"
  15693. "movlo r2, r3\n\t"
  15694. "it ne\n\t"
  15695. "movne r3, r5\n\t"
  15696. "ldr r12, [%[a], #240]\n\t"
  15697. "ldr lr, [%[b], #240]\n\t"
  15698. "and r12, r12, r3\n\t"
  15699. "and lr, lr, r3\n\t"
  15700. "subs r12, r12, lr\n\t"
  15701. "it hi\n\t"
  15702. "movhi r2, r6\n\t"
  15703. "it lo\n\t"
  15704. "movlo r2, r3\n\t"
  15705. "it ne\n\t"
  15706. "movne r3, r5\n\t"
  15707. "ldr r12, [%[a], #236]\n\t"
  15708. "ldr lr, [%[b], #236]\n\t"
  15709. "and r12, r12, r3\n\t"
  15710. "and lr, lr, r3\n\t"
  15711. "subs r12, r12, lr\n\t"
  15712. "it hi\n\t"
  15713. "movhi r2, r6\n\t"
  15714. "it lo\n\t"
  15715. "movlo r2, r3\n\t"
  15716. "it ne\n\t"
  15717. "movne r3, r5\n\t"
  15718. "ldr r12, [%[a], #232]\n\t"
  15719. "ldr lr, [%[b], #232]\n\t"
  15720. "and r12, r12, r3\n\t"
  15721. "and lr, lr, r3\n\t"
  15722. "subs r12, r12, lr\n\t"
  15723. "it hi\n\t"
  15724. "movhi r2, r6\n\t"
  15725. "it lo\n\t"
  15726. "movlo r2, r3\n\t"
  15727. "it ne\n\t"
  15728. "movne r3, r5\n\t"
  15729. "ldr r12, [%[a], #228]\n\t"
  15730. "ldr lr, [%[b], #228]\n\t"
  15731. "and r12, r12, r3\n\t"
  15732. "and lr, lr, r3\n\t"
  15733. "subs r12, r12, lr\n\t"
  15734. "it hi\n\t"
  15735. "movhi r2, r6\n\t"
  15736. "it lo\n\t"
  15737. "movlo r2, r3\n\t"
  15738. "it ne\n\t"
  15739. "movne r3, r5\n\t"
  15740. "ldr r12, [%[a], #224]\n\t"
  15741. "ldr lr, [%[b], #224]\n\t"
  15742. "and r12, r12, r3\n\t"
  15743. "and lr, lr, r3\n\t"
  15744. "subs r12, r12, lr\n\t"
  15745. "it hi\n\t"
  15746. "movhi r2, r6\n\t"
  15747. "it lo\n\t"
  15748. "movlo r2, r3\n\t"
  15749. "it ne\n\t"
  15750. "movne r3, r5\n\t"
  15751. "ldr r12, [%[a], #220]\n\t"
  15752. "ldr lr, [%[b], #220]\n\t"
  15753. "and r12, r12, r3\n\t"
  15754. "and lr, lr, r3\n\t"
  15755. "subs r12, r12, lr\n\t"
  15756. "it hi\n\t"
  15757. "movhi r2, r6\n\t"
  15758. "it lo\n\t"
  15759. "movlo r2, r3\n\t"
  15760. "it ne\n\t"
  15761. "movne r3, r5\n\t"
  15762. "ldr r12, [%[a], #216]\n\t"
  15763. "ldr lr, [%[b], #216]\n\t"
  15764. "and r12, r12, r3\n\t"
  15765. "and lr, lr, r3\n\t"
  15766. "subs r12, r12, lr\n\t"
  15767. "it hi\n\t"
  15768. "movhi r2, r6\n\t"
  15769. "it lo\n\t"
  15770. "movlo r2, r3\n\t"
  15771. "it ne\n\t"
  15772. "movne r3, r5\n\t"
  15773. "ldr r12, [%[a], #212]\n\t"
  15774. "ldr lr, [%[b], #212]\n\t"
  15775. "and r12, r12, r3\n\t"
  15776. "and lr, lr, r3\n\t"
  15777. "subs r12, r12, lr\n\t"
  15778. "it hi\n\t"
  15779. "movhi r2, r6\n\t"
  15780. "it lo\n\t"
  15781. "movlo r2, r3\n\t"
  15782. "it ne\n\t"
  15783. "movne r3, r5\n\t"
  15784. "ldr r12, [%[a], #208]\n\t"
  15785. "ldr lr, [%[b], #208]\n\t"
  15786. "and r12, r12, r3\n\t"
  15787. "and lr, lr, r3\n\t"
  15788. "subs r12, r12, lr\n\t"
  15789. "it hi\n\t"
  15790. "movhi r2, r6\n\t"
  15791. "it lo\n\t"
  15792. "movlo r2, r3\n\t"
  15793. "it ne\n\t"
  15794. "movne r3, r5\n\t"
  15795. "ldr r12, [%[a], #204]\n\t"
  15796. "ldr lr, [%[b], #204]\n\t"
  15797. "and r12, r12, r3\n\t"
  15798. "and lr, lr, r3\n\t"
  15799. "subs r12, r12, lr\n\t"
  15800. "it hi\n\t"
  15801. "movhi r2, r6\n\t"
  15802. "it lo\n\t"
  15803. "movlo r2, r3\n\t"
  15804. "it ne\n\t"
  15805. "movne r3, r5\n\t"
  15806. "ldr r12, [%[a], #200]\n\t"
  15807. "ldr lr, [%[b], #200]\n\t"
  15808. "and r12, r12, r3\n\t"
  15809. "and lr, lr, r3\n\t"
  15810. "subs r12, r12, lr\n\t"
  15811. "it hi\n\t"
  15812. "movhi r2, r6\n\t"
  15813. "it lo\n\t"
  15814. "movlo r2, r3\n\t"
  15815. "it ne\n\t"
  15816. "movne r3, r5\n\t"
  15817. "ldr r12, [%[a], #196]\n\t"
  15818. "ldr lr, [%[b], #196]\n\t"
  15819. "and r12, r12, r3\n\t"
  15820. "and lr, lr, r3\n\t"
  15821. "subs r12, r12, lr\n\t"
  15822. "it hi\n\t"
  15823. "movhi r2, r6\n\t"
  15824. "it lo\n\t"
  15825. "movlo r2, r3\n\t"
  15826. "it ne\n\t"
  15827. "movne r3, r5\n\t"
  15828. "ldr r12, [%[a], #192]\n\t"
  15829. "ldr lr, [%[b], #192]\n\t"
  15830. "and r12, r12, r3\n\t"
  15831. "and lr, lr, r3\n\t"
  15832. "subs r12, r12, lr\n\t"
  15833. "it hi\n\t"
  15834. "movhi r2, r6\n\t"
  15835. "it lo\n\t"
  15836. "movlo r2, r3\n\t"
  15837. "it ne\n\t"
  15838. "movne r3, r5\n\t"
  15839. "ldr r12, [%[a], #188]\n\t"
  15840. "ldr lr, [%[b], #188]\n\t"
  15841. "and r12, r12, r3\n\t"
  15842. "and lr, lr, r3\n\t"
  15843. "subs r12, r12, lr\n\t"
  15844. "it hi\n\t"
  15845. "movhi r2, r6\n\t"
  15846. "it lo\n\t"
  15847. "movlo r2, r3\n\t"
  15848. "it ne\n\t"
  15849. "movne r3, r5\n\t"
  15850. "ldr r12, [%[a], #184]\n\t"
  15851. "ldr lr, [%[b], #184]\n\t"
  15852. "and r12, r12, r3\n\t"
  15853. "and lr, lr, r3\n\t"
  15854. "subs r12, r12, lr\n\t"
  15855. "it hi\n\t"
  15856. "movhi r2, r6\n\t"
  15857. "it lo\n\t"
  15858. "movlo r2, r3\n\t"
  15859. "it ne\n\t"
  15860. "movne r3, r5\n\t"
  15861. "ldr r12, [%[a], #180]\n\t"
  15862. "ldr lr, [%[b], #180]\n\t"
  15863. "and r12, r12, r3\n\t"
  15864. "and lr, lr, r3\n\t"
  15865. "subs r12, r12, lr\n\t"
  15866. "it hi\n\t"
  15867. "movhi r2, r6\n\t"
  15868. "it lo\n\t"
  15869. "movlo r2, r3\n\t"
  15870. "it ne\n\t"
  15871. "movne r3, r5\n\t"
  15872. "ldr r12, [%[a], #176]\n\t"
  15873. "ldr lr, [%[b], #176]\n\t"
  15874. "and r12, r12, r3\n\t"
  15875. "and lr, lr, r3\n\t"
  15876. "subs r12, r12, lr\n\t"
  15877. "it hi\n\t"
  15878. "movhi r2, r6\n\t"
  15879. "it lo\n\t"
  15880. "movlo r2, r3\n\t"
  15881. "it ne\n\t"
  15882. "movne r3, r5\n\t"
  15883. "ldr r12, [%[a], #172]\n\t"
  15884. "ldr lr, [%[b], #172]\n\t"
  15885. "and r12, r12, r3\n\t"
  15886. "and lr, lr, r3\n\t"
  15887. "subs r12, r12, lr\n\t"
  15888. "it hi\n\t"
  15889. "movhi r2, r6\n\t"
  15890. "it lo\n\t"
  15891. "movlo r2, r3\n\t"
  15892. "it ne\n\t"
  15893. "movne r3, r5\n\t"
  15894. "ldr r12, [%[a], #168]\n\t"
  15895. "ldr lr, [%[b], #168]\n\t"
  15896. "and r12, r12, r3\n\t"
  15897. "and lr, lr, r3\n\t"
  15898. "subs r12, r12, lr\n\t"
  15899. "it hi\n\t"
  15900. "movhi r2, r6\n\t"
  15901. "it lo\n\t"
  15902. "movlo r2, r3\n\t"
  15903. "it ne\n\t"
  15904. "movne r3, r5\n\t"
  15905. "ldr r12, [%[a], #164]\n\t"
  15906. "ldr lr, [%[b], #164]\n\t"
  15907. "and r12, r12, r3\n\t"
  15908. "and lr, lr, r3\n\t"
  15909. "subs r12, r12, lr\n\t"
  15910. "it hi\n\t"
  15911. "movhi r2, r6\n\t"
  15912. "it lo\n\t"
  15913. "movlo r2, r3\n\t"
  15914. "it ne\n\t"
  15915. "movne r3, r5\n\t"
  15916. "ldr r12, [%[a], #160]\n\t"
  15917. "ldr lr, [%[b], #160]\n\t"
  15918. "and r12, r12, r3\n\t"
  15919. "and lr, lr, r3\n\t"
  15920. "subs r12, r12, lr\n\t"
  15921. "it hi\n\t"
  15922. "movhi r2, r6\n\t"
  15923. "it lo\n\t"
  15924. "movlo r2, r3\n\t"
  15925. "it ne\n\t"
  15926. "movne r3, r5\n\t"
  15927. "ldr r12, [%[a], #156]\n\t"
  15928. "ldr lr, [%[b], #156]\n\t"
  15929. "and r12, r12, r3\n\t"
  15930. "and lr, lr, r3\n\t"
  15931. "subs r12, r12, lr\n\t"
  15932. "it hi\n\t"
  15933. "movhi r2, r6\n\t"
  15934. "it lo\n\t"
  15935. "movlo r2, r3\n\t"
  15936. "it ne\n\t"
  15937. "movne r3, r5\n\t"
  15938. "ldr r12, [%[a], #152]\n\t"
  15939. "ldr lr, [%[b], #152]\n\t"
  15940. "and r12, r12, r3\n\t"
  15941. "and lr, lr, r3\n\t"
  15942. "subs r12, r12, lr\n\t"
  15943. "it hi\n\t"
  15944. "movhi r2, r6\n\t"
  15945. "it lo\n\t"
  15946. "movlo r2, r3\n\t"
  15947. "it ne\n\t"
  15948. "movne r3, r5\n\t"
  15949. "ldr r12, [%[a], #148]\n\t"
  15950. "ldr lr, [%[b], #148]\n\t"
  15951. "and r12, r12, r3\n\t"
  15952. "and lr, lr, r3\n\t"
  15953. "subs r12, r12, lr\n\t"
  15954. "it hi\n\t"
  15955. "movhi r2, r6\n\t"
  15956. "it lo\n\t"
  15957. "movlo r2, r3\n\t"
  15958. "it ne\n\t"
  15959. "movne r3, r5\n\t"
  15960. "ldr r12, [%[a], #144]\n\t"
  15961. "ldr lr, [%[b], #144]\n\t"
  15962. "and r12, r12, r3\n\t"
  15963. "and lr, lr, r3\n\t"
  15964. "subs r12, r12, lr\n\t"
  15965. "it hi\n\t"
  15966. "movhi r2, r6\n\t"
  15967. "it lo\n\t"
  15968. "movlo r2, r3\n\t"
  15969. "it ne\n\t"
  15970. "movne r3, r5\n\t"
  15971. "ldr r12, [%[a], #140]\n\t"
  15972. "ldr lr, [%[b], #140]\n\t"
  15973. "and r12, r12, r3\n\t"
  15974. "and lr, lr, r3\n\t"
  15975. "subs r12, r12, lr\n\t"
  15976. "it hi\n\t"
  15977. "movhi r2, r6\n\t"
  15978. "it lo\n\t"
  15979. "movlo r2, r3\n\t"
  15980. "it ne\n\t"
  15981. "movne r3, r5\n\t"
  15982. "ldr r12, [%[a], #136]\n\t"
  15983. "ldr lr, [%[b], #136]\n\t"
  15984. "and r12, r12, r3\n\t"
  15985. "and lr, lr, r3\n\t"
  15986. "subs r12, r12, lr\n\t"
  15987. "it hi\n\t"
  15988. "movhi r2, r6\n\t"
  15989. "it lo\n\t"
  15990. "movlo r2, r3\n\t"
  15991. "it ne\n\t"
  15992. "movne r3, r5\n\t"
  15993. "ldr r12, [%[a], #132]\n\t"
  15994. "ldr lr, [%[b], #132]\n\t"
  15995. "and r12, r12, r3\n\t"
  15996. "and lr, lr, r3\n\t"
  15997. "subs r12, r12, lr\n\t"
  15998. "it hi\n\t"
  15999. "movhi r2, r6\n\t"
  16000. "it lo\n\t"
  16001. "movlo r2, r3\n\t"
  16002. "it ne\n\t"
  16003. "movne r3, r5\n\t"
  16004. "ldr r12, [%[a], #128]\n\t"
  16005. "ldr lr, [%[b], #128]\n\t"
  16006. "and r12, r12, r3\n\t"
  16007. "and lr, lr, r3\n\t"
  16008. "subs r12, r12, lr\n\t"
  16009. "it hi\n\t"
  16010. "movhi r2, r6\n\t"
  16011. "it lo\n\t"
  16012. "movlo r2, r3\n\t"
  16013. "it ne\n\t"
  16014. "movne r3, r5\n\t"
  16015. "ldr r12, [%[a], #124]\n\t"
  16016. "ldr lr, [%[b], #124]\n\t"
  16017. "and r12, r12, r3\n\t"
  16018. "and lr, lr, r3\n\t"
  16019. "subs r12, r12, lr\n\t"
  16020. "it hi\n\t"
  16021. "movhi r2, r6\n\t"
  16022. "it lo\n\t"
  16023. "movlo r2, r3\n\t"
  16024. "it ne\n\t"
  16025. "movne r3, r5\n\t"
  16026. "ldr r12, [%[a], #120]\n\t"
  16027. "ldr lr, [%[b], #120]\n\t"
  16028. "and r12, r12, r3\n\t"
  16029. "and lr, lr, r3\n\t"
  16030. "subs r12, r12, lr\n\t"
  16031. "it hi\n\t"
  16032. "movhi r2, r6\n\t"
  16033. "it lo\n\t"
  16034. "movlo r2, r3\n\t"
  16035. "it ne\n\t"
  16036. "movne r3, r5\n\t"
  16037. "ldr r12, [%[a], #116]\n\t"
  16038. "ldr lr, [%[b], #116]\n\t"
  16039. "and r12, r12, r3\n\t"
  16040. "and lr, lr, r3\n\t"
  16041. "subs r12, r12, lr\n\t"
  16042. "it hi\n\t"
  16043. "movhi r2, r6\n\t"
  16044. "it lo\n\t"
  16045. "movlo r2, r3\n\t"
  16046. "it ne\n\t"
  16047. "movne r3, r5\n\t"
  16048. "ldr r12, [%[a], #112]\n\t"
  16049. "ldr lr, [%[b], #112]\n\t"
  16050. "and r12, r12, r3\n\t"
  16051. "and lr, lr, r3\n\t"
  16052. "subs r12, r12, lr\n\t"
  16053. "it hi\n\t"
  16054. "movhi r2, r6\n\t"
  16055. "it lo\n\t"
  16056. "movlo r2, r3\n\t"
  16057. "it ne\n\t"
  16058. "movne r3, r5\n\t"
  16059. "ldr r12, [%[a], #108]\n\t"
  16060. "ldr lr, [%[b], #108]\n\t"
  16061. "and r12, r12, r3\n\t"
  16062. "and lr, lr, r3\n\t"
  16063. "subs r12, r12, lr\n\t"
  16064. "it hi\n\t"
  16065. "movhi r2, r6\n\t"
  16066. "it lo\n\t"
  16067. "movlo r2, r3\n\t"
  16068. "it ne\n\t"
  16069. "movne r3, r5\n\t"
  16070. "ldr r12, [%[a], #104]\n\t"
  16071. "ldr lr, [%[b], #104]\n\t"
  16072. "and r12, r12, r3\n\t"
  16073. "and lr, lr, r3\n\t"
  16074. "subs r12, r12, lr\n\t"
  16075. "it hi\n\t"
  16076. "movhi r2, r6\n\t"
  16077. "it lo\n\t"
  16078. "movlo r2, r3\n\t"
  16079. "it ne\n\t"
  16080. "movne r3, r5\n\t"
  16081. "ldr r12, [%[a], #100]\n\t"
  16082. "ldr lr, [%[b], #100]\n\t"
  16083. "and r12, r12, r3\n\t"
  16084. "and lr, lr, r3\n\t"
  16085. "subs r12, r12, lr\n\t"
  16086. "it hi\n\t"
  16087. "movhi r2, r6\n\t"
  16088. "it lo\n\t"
  16089. "movlo r2, r3\n\t"
  16090. "it ne\n\t"
  16091. "movne r3, r5\n\t"
  16092. "ldr r12, [%[a], #96]\n\t"
  16093. "ldr lr, [%[b], #96]\n\t"
  16094. "and r12, r12, r3\n\t"
  16095. "and lr, lr, r3\n\t"
  16096. "subs r12, r12, lr\n\t"
  16097. "it hi\n\t"
  16098. "movhi r2, r6\n\t"
  16099. "it lo\n\t"
  16100. "movlo r2, r3\n\t"
  16101. "it ne\n\t"
  16102. "movne r3, r5\n\t"
  16103. "ldr r12, [%[a], #92]\n\t"
  16104. "ldr lr, [%[b], #92]\n\t"
  16105. "and r12, r12, r3\n\t"
  16106. "and lr, lr, r3\n\t"
  16107. "subs r12, r12, lr\n\t"
  16108. "it hi\n\t"
  16109. "movhi r2, r6\n\t"
  16110. "it lo\n\t"
  16111. "movlo r2, r3\n\t"
  16112. "it ne\n\t"
  16113. "movne r3, r5\n\t"
  16114. "ldr r12, [%[a], #88]\n\t"
  16115. "ldr lr, [%[b], #88]\n\t"
  16116. "and r12, r12, r3\n\t"
  16117. "and lr, lr, r3\n\t"
  16118. "subs r12, r12, lr\n\t"
  16119. "it hi\n\t"
  16120. "movhi r2, r6\n\t"
  16121. "it lo\n\t"
  16122. "movlo r2, r3\n\t"
  16123. "it ne\n\t"
  16124. "movne r3, r5\n\t"
  16125. "ldr r12, [%[a], #84]\n\t"
  16126. "ldr lr, [%[b], #84]\n\t"
  16127. "and r12, r12, r3\n\t"
  16128. "and lr, lr, r3\n\t"
  16129. "subs r12, r12, lr\n\t"
  16130. "it hi\n\t"
  16131. "movhi r2, r6\n\t"
  16132. "it lo\n\t"
  16133. "movlo r2, r3\n\t"
  16134. "it ne\n\t"
  16135. "movne r3, r5\n\t"
  16136. "ldr r12, [%[a], #80]\n\t"
  16137. "ldr lr, [%[b], #80]\n\t"
  16138. "and r12, r12, r3\n\t"
  16139. "and lr, lr, r3\n\t"
  16140. "subs r12, r12, lr\n\t"
  16141. "it hi\n\t"
  16142. "movhi r2, r6\n\t"
  16143. "it lo\n\t"
  16144. "movlo r2, r3\n\t"
  16145. "it ne\n\t"
  16146. "movne r3, r5\n\t"
  16147. "ldr r12, [%[a], #76]\n\t"
  16148. "ldr lr, [%[b], #76]\n\t"
  16149. "and r12, r12, r3\n\t"
  16150. "and lr, lr, r3\n\t"
  16151. "subs r12, r12, lr\n\t"
  16152. "it hi\n\t"
  16153. "movhi r2, r6\n\t"
  16154. "it lo\n\t"
  16155. "movlo r2, r3\n\t"
  16156. "it ne\n\t"
  16157. "movne r3, r5\n\t"
  16158. "ldr r12, [%[a], #72]\n\t"
  16159. "ldr lr, [%[b], #72]\n\t"
  16160. "and r12, r12, r3\n\t"
  16161. "and lr, lr, r3\n\t"
  16162. "subs r12, r12, lr\n\t"
  16163. "it hi\n\t"
  16164. "movhi r2, r6\n\t"
  16165. "it lo\n\t"
  16166. "movlo r2, r3\n\t"
  16167. "it ne\n\t"
  16168. "movne r3, r5\n\t"
  16169. "ldr r12, [%[a], #68]\n\t"
  16170. "ldr lr, [%[b], #68]\n\t"
  16171. "and r12, r12, r3\n\t"
  16172. "and lr, lr, r3\n\t"
  16173. "subs r12, r12, lr\n\t"
  16174. "it hi\n\t"
  16175. "movhi r2, r6\n\t"
  16176. "it lo\n\t"
  16177. "movlo r2, r3\n\t"
  16178. "it ne\n\t"
  16179. "movne r3, r5\n\t"
  16180. "ldr r12, [%[a], #64]\n\t"
  16181. "ldr lr, [%[b], #64]\n\t"
  16182. "and r12, r12, r3\n\t"
  16183. "and lr, lr, r3\n\t"
  16184. "subs r12, r12, lr\n\t"
  16185. "it hi\n\t"
  16186. "movhi r2, r6\n\t"
  16187. "it lo\n\t"
  16188. "movlo r2, r3\n\t"
  16189. "it ne\n\t"
  16190. "movne r3, r5\n\t"
  16191. "ldr r12, [%[a], #60]\n\t"
  16192. "ldr lr, [%[b], #60]\n\t"
  16193. "and r12, r12, r3\n\t"
  16194. "and lr, lr, r3\n\t"
  16195. "subs r12, r12, lr\n\t"
  16196. "it hi\n\t"
  16197. "movhi r2, r6\n\t"
  16198. "it lo\n\t"
  16199. "movlo r2, r3\n\t"
  16200. "it ne\n\t"
  16201. "movne r3, r5\n\t"
  16202. "ldr r12, [%[a], #56]\n\t"
  16203. "ldr lr, [%[b], #56]\n\t"
  16204. "and r12, r12, r3\n\t"
  16205. "and lr, lr, r3\n\t"
  16206. "subs r12, r12, lr\n\t"
  16207. "it hi\n\t"
  16208. "movhi r2, r6\n\t"
  16209. "it lo\n\t"
  16210. "movlo r2, r3\n\t"
  16211. "it ne\n\t"
  16212. "movne r3, r5\n\t"
  16213. "ldr r12, [%[a], #52]\n\t"
  16214. "ldr lr, [%[b], #52]\n\t"
  16215. "and r12, r12, r3\n\t"
  16216. "and lr, lr, r3\n\t"
  16217. "subs r12, r12, lr\n\t"
  16218. "it hi\n\t"
  16219. "movhi r2, r6\n\t"
  16220. "it lo\n\t"
  16221. "movlo r2, r3\n\t"
  16222. "it ne\n\t"
  16223. "movne r3, r5\n\t"
  16224. "ldr r12, [%[a], #48]\n\t"
  16225. "ldr lr, [%[b], #48]\n\t"
  16226. "and r12, r12, r3\n\t"
  16227. "and lr, lr, r3\n\t"
  16228. "subs r12, r12, lr\n\t"
  16229. "it hi\n\t"
  16230. "movhi r2, r6\n\t"
  16231. "it lo\n\t"
  16232. "movlo r2, r3\n\t"
  16233. "it ne\n\t"
  16234. "movne r3, r5\n\t"
  16235. "ldr r12, [%[a], #44]\n\t"
  16236. "ldr lr, [%[b], #44]\n\t"
  16237. "and r12, r12, r3\n\t"
  16238. "and lr, lr, r3\n\t"
  16239. "subs r12, r12, lr\n\t"
  16240. "it hi\n\t"
  16241. "movhi r2, r6\n\t"
  16242. "it lo\n\t"
  16243. "movlo r2, r3\n\t"
  16244. "it ne\n\t"
  16245. "movne r3, r5\n\t"
  16246. "ldr r12, [%[a], #40]\n\t"
  16247. "ldr lr, [%[b], #40]\n\t"
  16248. "and r12, r12, r3\n\t"
  16249. "and lr, lr, r3\n\t"
  16250. "subs r12, r12, lr\n\t"
  16251. "it hi\n\t"
  16252. "movhi r2, r6\n\t"
  16253. "it lo\n\t"
  16254. "movlo r2, r3\n\t"
  16255. "it ne\n\t"
  16256. "movne r3, r5\n\t"
  16257. "ldr r12, [%[a], #36]\n\t"
  16258. "ldr lr, [%[b], #36]\n\t"
  16259. "and r12, r12, r3\n\t"
  16260. "and lr, lr, r3\n\t"
  16261. "subs r12, r12, lr\n\t"
  16262. "it hi\n\t"
  16263. "movhi r2, r6\n\t"
  16264. "it lo\n\t"
  16265. "movlo r2, r3\n\t"
  16266. "it ne\n\t"
  16267. "movne r3, r5\n\t"
  16268. "ldr r12, [%[a], #32]\n\t"
  16269. "ldr lr, [%[b], #32]\n\t"
  16270. "and r12, r12, r3\n\t"
  16271. "and lr, lr, r3\n\t"
  16272. "subs r12, r12, lr\n\t"
  16273. "it hi\n\t"
  16274. "movhi r2, r6\n\t"
  16275. "it lo\n\t"
  16276. "movlo r2, r3\n\t"
  16277. "it ne\n\t"
  16278. "movne r3, r5\n\t"
  16279. "ldr r12, [%[a], #28]\n\t"
  16280. "ldr lr, [%[b], #28]\n\t"
  16281. "and r12, r12, r3\n\t"
  16282. "and lr, lr, r3\n\t"
  16283. "subs r12, r12, lr\n\t"
  16284. "it hi\n\t"
  16285. "movhi r2, r6\n\t"
  16286. "it lo\n\t"
  16287. "movlo r2, r3\n\t"
  16288. "it ne\n\t"
  16289. "movne r3, r5\n\t"
  16290. "ldr r12, [%[a], #24]\n\t"
  16291. "ldr lr, [%[b], #24]\n\t"
  16292. "and r12, r12, r3\n\t"
  16293. "and lr, lr, r3\n\t"
  16294. "subs r12, r12, lr\n\t"
  16295. "it hi\n\t"
  16296. "movhi r2, r6\n\t"
  16297. "it lo\n\t"
  16298. "movlo r2, r3\n\t"
  16299. "it ne\n\t"
  16300. "movne r3, r5\n\t"
  16301. "ldr r12, [%[a], #20]\n\t"
  16302. "ldr lr, [%[b], #20]\n\t"
  16303. "and r12, r12, r3\n\t"
  16304. "and lr, lr, r3\n\t"
  16305. "subs r12, r12, lr\n\t"
  16306. "it hi\n\t"
  16307. "movhi r2, r6\n\t"
  16308. "it lo\n\t"
  16309. "movlo r2, r3\n\t"
  16310. "it ne\n\t"
  16311. "movne r3, r5\n\t"
  16312. "ldr r12, [%[a], #16]\n\t"
  16313. "ldr lr, [%[b], #16]\n\t"
  16314. "and r12, r12, r3\n\t"
  16315. "and lr, lr, r3\n\t"
  16316. "subs r12, r12, lr\n\t"
  16317. "it hi\n\t"
  16318. "movhi r2, r6\n\t"
  16319. "it lo\n\t"
  16320. "movlo r2, r3\n\t"
  16321. "it ne\n\t"
  16322. "movne r3, r5\n\t"
  16323. "ldr r12, [%[a], #12]\n\t"
  16324. "ldr lr, [%[b], #12]\n\t"
  16325. "and r12, r12, r3\n\t"
  16326. "and lr, lr, r3\n\t"
  16327. "subs r12, r12, lr\n\t"
  16328. "it hi\n\t"
  16329. "movhi r2, r6\n\t"
  16330. "it lo\n\t"
  16331. "movlo r2, r3\n\t"
  16332. "it ne\n\t"
  16333. "movne r3, r5\n\t"
  16334. "ldr r12, [%[a], #8]\n\t"
  16335. "ldr lr, [%[b], #8]\n\t"
  16336. "and r12, r12, r3\n\t"
  16337. "and lr, lr, r3\n\t"
  16338. "subs r12, r12, lr\n\t"
  16339. "it hi\n\t"
  16340. "movhi r2, r6\n\t"
  16341. "it lo\n\t"
  16342. "movlo r2, r3\n\t"
  16343. "it ne\n\t"
  16344. "movne r3, r5\n\t"
  16345. "ldr r12, [%[a], #4]\n\t"
  16346. "ldr lr, [%[b], #4]\n\t"
  16347. "and r12, r12, r3\n\t"
  16348. "and lr, lr, r3\n\t"
  16349. "subs r12, r12, lr\n\t"
  16350. "it hi\n\t"
  16351. "movhi r2, r6\n\t"
  16352. "it lo\n\t"
  16353. "movlo r2, r3\n\t"
  16354. "it ne\n\t"
  16355. "movne r3, r5\n\t"
  16356. "ldr r12, [%[a]]\n\t"
  16357. "ldr lr, [%[b]]\n\t"
  16358. "and r12, r12, r3\n\t"
  16359. "and lr, lr, r3\n\t"
  16360. "subs r12, r12, lr\n\t"
  16361. "it hi\n\t"
  16362. "movhi r2, r6\n\t"
  16363. "it lo\n\t"
  16364. "movlo r2, r3\n\t"
  16365. "it ne\n\t"
  16366. "movne r3, r5\n\t"
  16367. "eor r2, r2, r3\n\t"
  16368. #endif /*WOLFSSL_SP_SMALL */
  16369. "mov %[a], r2\n\t"
  16370. : [a] "+r" (a), [b] "+r" (b)
  16371. :
  16372. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  16373. );
  16374. return (uint32_t)(size_t)a;
  16375. }
  16376. /* Divide d in a and put remainder into r (m*d + r = a)
  16377. * m is not calculated as it is not needed at this time.
  16378. *
  16379. * a Number to be divided.
  16380. * d Number to divide with.
  16381. * m Multiplier result.
  16382. * r Remainder from the division.
  16383. * returns MP_OKAY indicating success.
  16384. */
  16385. static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d,
  16386. sp_digit* m, sp_digit* r)
  16387. {
  16388. sp_digit t1[128], t2[65];
  16389. sp_digit div, r1;
  16390. int i;
  16391. (void)m;
  16392. div = d[63];
  16393. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  16394. r1 = sp_2048_cmp_64(&t1[64], d) >= 0;
  16395. sp_2048_cond_sub_64(&t1[64], &t1[64], d, (sp_digit)0 - r1);
  16396. for (i = 63; i >= 0; i--) {
  16397. volatile sp_digit mask = (sp_digit)0 - (t1[64 + i] == div);
  16398. sp_digit hi = t1[64 + i] + mask;
  16399. r1 = div_2048_word_64(hi, t1[64 + i - 1], div);
  16400. r1 |= mask;
  16401. sp_2048_mul_d_64(t2, d, r1);
  16402. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  16403. t1[64 + i] -= t2[64];
  16404. sp_2048_mask_64(t2, d, t1[64 + i]);
  16405. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  16406. sp_2048_mask_64(t2, d, t1[64 + i]);
  16407. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  16408. }
  16409. r1 = sp_2048_cmp_64(t1, d) >= 0;
  16410. sp_2048_cond_sub_64(r, t1, d, (sp_digit)0 - r1);
  16411. return MP_OKAY;
  16412. }
  16413. /* Reduce a modulo m into r. (r = a mod m)
  16414. *
  16415. * r A single precision number that is the reduced result.
  16416. * a A single precision number that is to be reduced.
  16417. * m A single precision number that is the modulus to reduce with.
  16418. * returns MP_OKAY indicating success.
  16419. */
  16420. static WC_INLINE int sp_2048_mod_64(sp_digit* r, const sp_digit* a,
  16421. const sp_digit* m)
  16422. {
  16423. return sp_2048_div_64(a, m, NULL, r);
  16424. }
  16425. #endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */
  16426. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  16427. defined(WOLFSSL_HAVE_SP_DH)
  16428. #ifdef WOLFSSL_SP_SMALL
  16429. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  16430. *
  16431. * r A single precision number that is the result of the operation.
  16432. * a A single precision number being exponentiated.
  16433. * e A single precision number that is the exponent.
  16434. * bits The number of bits in the exponent.
  16435. * m A single precision number that is the modulus.
  16436. * returns 0 on success.
  16437. * returns MEMORY_E on dynamic memory allocation failure.
  16438. * returns MP_VAL when base is even or exponent is 0.
  16439. */
  16440. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  16441. int bits, const sp_digit* m, int reduceA)
  16442. {
  16443. #ifdef WOLFSSL_SP_SMALL_STACK
  16444. sp_digit* td = NULL;
  16445. #else
  16446. sp_digit td[8 * 128];
  16447. #endif
  16448. sp_digit* t[8];
  16449. sp_digit* norm = NULL;
  16450. sp_digit mp = 1;
  16451. sp_digit n;
  16452. sp_digit mask;
  16453. int i;
  16454. int c;
  16455. byte y;
  16456. int err = MP_OKAY;
  16457. if (bits == 0) {
  16458. err = MP_VAL;
  16459. }
  16460. #ifdef WOLFSSL_SP_SMALL_STACK
  16461. if (err == MP_OKAY) {
  16462. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 128), NULL,
  16463. DYNAMIC_TYPE_TMP_BUFFER);
  16464. if (td == NULL)
  16465. err = MEMORY_E;
  16466. }
  16467. #endif
  16468. if (err == MP_OKAY) {
  16469. norm = td;
  16470. for (i=0; i<8; i++) {
  16471. t[i] = td + i * 128;
  16472. }
  16473. sp_2048_mont_setup(m, &mp);
  16474. sp_2048_mont_norm_64(norm, m);
  16475. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  16476. if (reduceA != 0) {
  16477. err = sp_2048_mod_64(t[1] + 64, a, m);
  16478. if (err == MP_OKAY) {
  16479. err = sp_2048_mod_64(t[1], t[1], m);
  16480. }
  16481. }
  16482. else {
  16483. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  16484. err = sp_2048_mod_64(t[1], t[1], m);
  16485. }
  16486. }
  16487. if (err == MP_OKAY) {
  16488. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  16489. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  16490. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  16491. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  16492. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  16493. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  16494. i = (bits - 1) / 32;
  16495. n = e[i--];
  16496. c = bits & 31;
  16497. if (c == 0) {
  16498. c = 32;
  16499. }
  16500. c -= bits % 3;
  16501. if (c == 32) {
  16502. c = 29;
  16503. }
  16504. if (c < 0) {
  16505. /* Number of bits in top word is less than number needed. */
  16506. c = -c;
  16507. y = (byte)(n << c);
  16508. n = e[i--];
  16509. y |= (byte)(n >> (64 - c));
  16510. n <<= c;
  16511. c = 64 - c;
  16512. }
  16513. else if (c == 0) {
  16514. /* All bits in top word used. */
  16515. y = (byte)n;
  16516. }
  16517. else {
  16518. y = (byte)(n >> c);
  16519. n <<= 32 - c;
  16520. }
  16521. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  16522. for (; i>=0 || c>=3; ) {
  16523. if (c == 0) {
  16524. n = e[i--];
  16525. y = (byte)(n >> 29);
  16526. n <<= 3;
  16527. c = 29;
  16528. }
  16529. else if (c < 3) {
  16530. y = (byte)(n >> 29);
  16531. n = e[i--];
  16532. c = 3 - c;
  16533. y |= (byte)(n >> (32 - c));
  16534. n <<= c;
  16535. c = 32 - c;
  16536. }
  16537. else {
  16538. y = (byte)((n >> 29) & 0x7);
  16539. n <<= 3;
  16540. c -= 3;
  16541. }
  16542. sp_2048_mont_sqr_64(r, r, m, mp);
  16543. sp_2048_mont_sqr_64(r, r, m, mp);
  16544. sp_2048_mont_sqr_64(r, r, m, mp);
  16545. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  16546. }
  16547. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  16548. sp_2048_mont_reduce_64(r, m, mp);
  16549. mask = (sp_digit)0 - (sp_2048_cmp_64(r, m) >= 0);
  16550. sp_2048_cond_sub_64(r, r, m, mask);
  16551. }
  16552. #ifdef WOLFSSL_SP_SMALL_STACK
  16553. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16554. #endif
  16555. return err;
  16556. }
  16557. #else
  16558. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  16559. *
  16560. * r A single precision number that is the result of the operation.
  16561. * a A single precision number being exponentiated.
  16562. * e A single precision number that is the exponent.
  16563. * bits The number of bits in the exponent.
  16564. * m A single precision number that is the modulus.
  16565. * returns 0 on success.
  16566. * returns MEMORY_E on dynamic memory allocation failure.
  16567. * returns MP_VAL when base is even or exponent is 0.
  16568. */
  16569. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  16570. int bits, const sp_digit* m, int reduceA)
  16571. {
  16572. #ifdef WOLFSSL_SP_SMALL_STACK
  16573. sp_digit* td = NULL;
  16574. #else
  16575. sp_digit td[16 * 128];
  16576. #endif
  16577. sp_digit* t[16];
  16578. sp_digit* norm = NULL;
  16579. sp_digit mp = 1;
  16580. sp_digit n;
  16581. sp_digit mask;
  16582. int i;
  16583. int c;
  16584. byte y;
  16585. int err = MP_OKAY;
  16586. if (bits == 0) {
  16587. err = MP_VAL;
  16588. }
  16589. #ifdef WOLFSSL_SP_SMALL_STACK
  16590. if (err == MP_OKAY) {
  16591. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL,
  16592. DYNAMIC_TYPE_TMP_BUFFER);
  16593. if (td == NULL)
  16594. err = MEMORY_E;
  16595. }
  16596. #endif
  16597. if (err == MP_OKAY) {
  16598. norm = td;
  16599. for (i=0; i<16; i++) {
  16600. t[i] = td + i * 128;
  16601. }
  16602. sp_2048_mont_setup(m, &mp);
  16603. sp_2048_mont_norm_64(norm, m);
  16604. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  16605. if (reduceA != 0) {
  16606. err = sp_2048_mod_64(t[1] + 64, a, m);
  16607. if (err == MP_OKAY) {
  16608. err = sp_2048_mod_64(t[1], t[1], m);
  16609. }
  16610. }
  16611. else {
  16612. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  16613. err = sp_2048_mod_64(t[1], t[1], m);
  16614. }
  16615. }
  16616. if (err == MP_OKAY) {
  16617. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  16618. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  16619. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  16620. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  16621. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  16622. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  16623. sp_2048_mont_sqr_64(t[ 8], t[ 4], m, mp);
  16624. sp_2048_mont_mul_64(t[ 9], t[ 5], t[ 4], m, mp);
  16625. sp_2048_mont_sqr_64(t[10], t[ 5], m, mp);
  16626. sp_2048_mont_mul_64(t[11], t[ 6], t[ 5], m, mp);
  16627. sp_2048_mont_sqr_64(t[12], t[ 6], m, mp);
  16628. sp_2048_mont_mul_64(t[13], t[ 7], t[ 6], m, mp);
  16629. sp_2048_mont_sqr_64(t[14], t[ 7], m, mp);
  16630. sp_2048_mont_mul_64(t[15], t[ 8], t[ 7], m, mp);
  16631. i = (bits - 1) / 32;
  16632. n = e[i--];
  16633. c = bits & 31;
  16634. if (c == 0) {
  16635. c = 32;
  16636. }
  16637. c -= bits % 4;
  16638. if (c == 32) {
  16639. c = 28;
  16640. }
  16641. if (c < 0) {
  16642. /* Number of bits in top word is less than number needed. */
  16643. c = -c;
  16644. y = (byte)(n << c);
  16645. n = e[i--];
  16646. y |= (byte)(n >> (64 - c));
  16647. n <<= c;
  16648. c = 64 - c;
  16649. }
  16650. else if (c == 0) {
  16651. /* All bits in top word used. */
  16652. y = (byte)n;
  16653. }
  16654. else {
  16655. y = (byte)(n >> c);
  16656. n <<= 32 - c;
  16657. }
  16658. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  16659. for (; i>=0 || c>=4; ) {
  16660. if (c == 0) {
  16661. n = e[i--];
  16662. y = (byte)(n >> 28);
  16663. n <<= 4;
  16664. c = 28;
  16665. }
  16666. else if (c < 4) {
  16667. y = (byte)(n >> 28);
  16668. n = e[i--];
  16669. c = 4 - c;
  16670. y |= (byte)(n >> (32 - c));
  16671. n <<= c;
  16672. c = 32 - c;
  16673. }
  16674. else {
  16675. y = (byte)((n >> 28) & 0xf);
  16676. n <<= 4;
  16677. c -= 4;
  16678. }
  16679. sp_2048_mont_sqr_64(r, r, m, mp);
  16680. sp_2048_mont_sqr_64(r, r, m, mp);
  16681. sp_2048_mont_sqr_64(r, r, m, mp);
  16682. sp_2048_mont_sqr_64(r, r, m, mp);
  16683. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  16684. }
  16685. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  16686. sp_2048_mont_reduce_64(r, m, mp);
  16687. mask = (sp_digit)0 - (sp_2048_cmp_64(r, m) >= 0);
  16688. sp_2048_cond_sub_64(r, r, m, mask);
  16689. }
  16690. #ifdef WOLFSSL_SP_SMALL_STACK
  16691. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16692. #endif
  16693. return err;
  16694. }
  16695. #endif /* WOLFSSL_SP_SMALL */
  16696. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  16697. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  16698. #ifdef WOLFSSL_HAVE_SP_RSA
  16699. /* RSA public key operation.
  16700. *
  16701. * in Array of bytes representing the number to exponentiate, base.
  16702. * inLen Number of bytes in base.
  16703. * em Public exponent.
  16704. * mm Modulus.
  16705. * out Buffer to hold big-endian bytes of exponentiation result.
  16706. * Must be at least 256 bytes long.
  16707. * outLen Number of bytes in result.
  16708. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  16709. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  16710. */
  16711. int sp_RsaPublic_2048(const byte* in, word32 inLen, const mp_int* em,
  16712. const mp_int* mm, byte* out, word32* outLen)
  16713. {
  16714. #ifdef WOLFSSL_SP_SMALL_STACK
  16715. sp_digit* a = NULL;
  16716. #else
  16717. sp_digit a[64 * 5];
  16718. #endif
  16719. sp_digit* m = NULL;
  16720. sp_digit* r = NULL;
  16721. sp_digit *ah = NULL;
  16722. sp_digit e[1] = {0};
  16723. int err = MP_OKAY;
  16724. if (*outLen < 256) {
  16725. err = MP_TO_E;
  16726. }
  16727. else if (mp_count_bits(em) > 32 || inLen > 256 ||
  16728. mp_count_bits(mm) != 2048) {
  16729. err = MP_READ_E;
  16730. }
  16731. else if (mp_iseven(mm)) {
  16732. err = MP_VAL;
  16733. }
  16734. #ifdef WOLFSSL_SP_SMALL_STACK
  16735. if (err == MP_OKAY) {
  16736. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 5, NULL,
  16737. DYNAMIC_TYPE_RSA);
  16738. if (a == NULL)
  16739. err = MEMORY_E;
  16740. }
  16741. #endif
  16742. if (err == MP_OKAY) {
  16743. ah = a + 64;
  16744. r = a + 64 * 2;
  16745. m = r + 64 * 2;
  16746. sp_2048_from_bin(ah, 64, in, inLen);
  16747. #if DIGIT_BIT >= 32
  16748. e[0] = em->dp[0];
  16749. #else
  16750. e[0] = em->dp[0];
  16751. if (em->used > 1) {
  16752. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  16753. }
  16754. #endif
  16755. if (e[0] == 0) {
  16756. err = MP_EXPTMOD_E;
  16757. }
  16758. }
  16759. if (err == MP_OKAY) {
  16760. sp_2048_from_mp(m, 64, mm);
  16761. if (e[0] == 0x10001) {
  16762. int i;
  16763. sp_digit mp;
  16764. sp_2048_mont_setup(m, &mp);
  16765. /* Convert to Montgomery form. */
  16766. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  16767. err = sp_2048_mod_64_cond(r, a, m);
  16768. /* Montgomery form: r = a.R mod m */
  16769. if (err == MP_OKAY) {
  16770. /* r = a ^ 0x10000 => r = a squared 16 times */
  16771. for (i = 15; i >= 0; i--) {
  16772. sp_2048_mont_sqr_64(r, r, m, mp);
  16773. }
  16774. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  16775. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  16776. */
  16777. sp_2048_mont_mul_64(r, r, ah, m, mp);
  16778. for (i = 63; i > 0; i--) {
  16779. if (r[i] != m[i]) {
  16780. break;
  16781. }
  16782. }
  16783. if (r[i] >= m[i]) {
  16784. sp_2048_sub_in_place_64(r, m);
  16785. }
  16786. }
  16787. }
  16788. else if (e[0] == 0x3) {
  16789. if (err == MP_OKAY) {
  16790. sp_2048_sqr_64(r, ah);
  16791. err = sp_2048_mod_64_cond(r, r, m);
  16792. }
  16793. if (err == MP_OKAY) {
  16794. sp_2048_mul_64(r, ah, r);
  16795. err = sp_2048_mod_64_cond(r, r, m);
  16796. }
  16797. }
  16798. else {
  16799. int i;
  16800. sp_digit mp;
  16801. sp_2048_mont_setup(m, &mp);
  16802. /* Convert to Montgomery form. */
  16803. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  16804. err = sp_2048_mod_64_cond(a, a, m);
  16805. if (err == MP_OKAY) {
  16806. for (i = 31; i >= 0; i--) {
  16807. if (e[0] >> i) {
  16808. break;
  16809. }
  16810. }
  16811. XMEMCPY(r, a, sizeof(sp_digit) * 64);
  16812. for (i--; i >= 0; i--) {
  16813. sp_2048_mont_sqr_64(r, r, m, mp);
  16814. if (((e[0] >> i) & 1) == 1) {
  16815. sp_2048_mont_mul_64(r, r, a, m, mp);
  16816. }
  16817. }
  16818. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64);
  16819. sp_2048_mont_reduce_64(r, m, mp);
  16820. for (i = 63; i > 0; i--) {
  16821. if (r[i] != m[i]) {
  16822. break;
  16823. }
  16824. }
  16825. if (r[i] >= m[i]) {
  16826. sp_2048_sub_in_place_64(r, m);
  16827. }
  16828. }
  16829. }
  16830. }
  16831. if (err == MP_OKAY) {
  16832. sp_2048_to_bin_64(r, out);
  16833. *outLen = 256;
  16834. }
  16835. #ifdef WOLFSSL_SP_SMALL_STACK
  16836. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  16837. #endif
  16838. return err;
  16839. }
  16840. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  16841. #ifdef WOLFSSL_SP_SMALL
  16842. /* Conditionally add a and b using the mask m.
  16843. * m is -1 to add and 0 when not.
  16844. *
  16845. * r A single precision number representing conditional add result.
  16846. * a A single precision number to add with.
  16847. * b A single precision number to add.
  16848. * m Mask value to apply.
  16849. */
  16850. 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)
  16851. {
  16852. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  16853. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  16854. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  16855. register sp_digit m asm ("r3") = (sp_digit)m_p;
  16856. __asm__ __volatile__ (
  16857. "mov lr, #0\n\t"
  16858. "mov r6, #0\n\t"
  16859. "mov r12, #0\n\t"
  16860. "\n"
  16861. "L_sp_2048_cond_add_32_words_%=: \n\t"
  16862. "adds lr, lr, #-1\n\t"
  16863. "ldr r4, [%[a], r12]\n\t"
  16864. "ldr r5, [%[b], r12]\n\t"
  16865. "and r5, r5, %[m]\n\t"
  16866. "adcs r4, r4, r5\n\t"
  16867. "adc lr, r6, r6\n\t"
  16868. "str r4, [%[r], r12]\n\t"
  16869. "add r12, r12, #4\n\t"
  16870. "cmp r12, #0x80\n\t"
  16871. "blt L_sp_2048_cond_add_32_words_%=\n\t"
  16872. "mov %[r], lr\n\t"
  16873. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  16874. :
  16875. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  16876. );
  16877. return (uint32_t)(size_t)r;
  16878. }
  16879. #else
  16880. /* Conditionally add a and b using the mask m.
  16881. * m is -1 to add and 0 when not.
  16882. *
  16883. * r A single precision number representing conditional add result.
  16884. * a A single precision number to add with.
  16885. * b A single precision number to add.
  16886. * m Mask value to apply.
  16887. */
  16888. 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)
  16889. {
  16890. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  16891. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  16892. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  16893. register sp_digit m asm ("r3") = (sp_digit)m_p;
  16894. __asm__ __volatile__ (
  16895. "mov r8, #0\n\t"
  16896. "ldm %[a]!, {r4, r5}\n\t"
  16897. "ldm %[b]!, {r6, r7}\n\t"
  16898. "and r6, r6, %[m]\n\t"
  16899. "and r7, r7, %[m]\n\t"
  16900. "adds r4, r4, r6\n\t"
  16901. "adcs r5, r5, r7\n\t"
  16902. "stm %[r]!, {r4, r5}\n\t"
  16903. "ldm %[a]!, {r4, r5}\n\t"
  16904. "ldm %[b]!, {r6, r7}\n\t"
  16905. "and r6, r6, %[m]\n\t"
  16906. "and r7, r7, %[m]\n\t"
  16907. "adcs r4, r4, r6\n\t"
  16908. "adcs r5, r5, r7\n\t"
  16909. "stm %[r]!, {r4, r5}\n\t"
  16910. "ldm %[a]!, {r4, r5}\n\t"
  16911. "ldm %[b]!, {r6, r7}\n\t"
  16912. "and r6, r6, %[m]\n\t"
  16913. "and r7, r7, %[m]\n\t"
  16914. "adcs r4, r4, r6\n\t"
  16915. "adcs r5, r5, r7\n\t"
  16916. "stm %[r]!, {r4, r5}\n\t"
  16917. "ldm %[a]!, {r4, r5}\n\t"
  16918. "ldm %[b]!, {r6, r7}\n\t"
  16919. "and r6, r6, %[m]\n\t"
  16920. "and r7, r7, %[m]\n\t"
  16921. "adcs r4, r4, r6\n\t"
  16922. "adcs r5, r5, r7\n\t"
  16923. "stm %[r]!, {r4, r5}\n\t"
  16924. "ldm %[a]!, {r4, r5}\n\t"
  16925. "ldm %[b]!, {r6, r7}\n\t"
  16926. "and r6, r6, %[m]\n\t"
  16927. "and r7, r7, %[m]\n\t"
  16928. "adcs r4, r4, r6\n\t"
  16929. "adcs r5, r5, r7\n\t"
  16930. "stm %[r]!, {r4, r5}\n\t"
  16931. "ldm %[a]!, {r4, r5}\n\t"
  16932. "ldm %[b]!, {r6, r7}\n\t"
  16933. "and r6, r6, %[m]\n\t"
  16934. "and r7, r7, %[m]\n\t"
  16935. "adcs r4, r4, r6\n\t"
  16936. "adcs r5, r5, r7\n\t"
  16937. "stm %[r]!, {r4, r5}\n\t"
  16938. "ldm %[a]!, {r4, r5}\n\t"
  16939. "ldm %[b]!, {r6, r7}\n\t"
  16940. "and r6, r6, %[m]\n\t"
  16941. "and r7, r7, %[m]\n\t"
  16942. "adcs r4, r4, r6\n\t"
  16943. "adcs r5, r5, r7\n\t"
  16944. "stm %[r]!, {r4, r5}\n\t"
  16945. "ldm %[a]!, {r4, r5}\n\t"
  16946. "ldm %[b]!, {r6, r7}\n\t"
  16947. "and r6, r6, %[m]\n\t"
  16948. "and r7, r7, %[m]\n\t"
  16949. "adcs r4, r4, r6\n\t"
  16950. "adcs r5, r5, r7\n\t"
  16951. "stm %[r]!, {r4, r5}\n\t"
  16952. "ldm %[a]!, {r4, r5}\n\t"
  16953. "ldm %[b]!, {r6, r7}\n\t"
  16954. "and r6, r6, %[m]\n\t"
  16955. "and r7, r7, %[m]\n\t"
  16956. "adcs r4, r4, r6\n\t"
  16957. "adcs r5, r5, r7\n\t"
  16958. "stm %[r]!, {r4, r5}\n\t"
  16959. "ldm %[a]!, {r4, r5}\n\t"
  16960. "ldm %[b]!, {r6, r7}\n\t"
  16961. "and r6, r6, %[m]\n\t"
  16962. "and r7, r7, %[m]\n\t"
  16963. "adcs r4, r4, r6\n\t"
  16964. "adcs r5, r5, r7\n\t"
  16965. "stm %[r]!, {r4, r5}\n\t"
  16966. "ldm %[a]!, {r4, r5}\n\t"
  16967. "ldm %[b]!, {r6, r7}\n\t"
  16968. "and r6, r6, %[m]\n\t"
  16969. "and r7, r7, %[m]\n\t"
  16970. "adcs r4, r4, r6\n\t"
  16971. "adcs r5, r5, r7\n\t"
  16972. "stm %[r]!, {r4, r5}\n\t"
  16973. "ldm %[a]!, {r4, r5}\n\t"
  16974. "ldm %[b]!, {r6, r7}\n\t"
  16975. "and r6, r6, %[m]\n\t"
  16976. "and r7, r7, %[m]\n\t"
  16977. "adcs r4, r4, r6\n\t"
  16978. "adcs r5, r5, r7\n\t"
  16979. "stm %[r]!, {r4, r5}\n\t"
  16980. "ldm %[a]!, {r4, r5}\n\t"
  16981. "ldm %[b]!, {r6, r7}\n\t"
  16982. "and r6, r6, %[m]\n\t"
  16983. "and r7, r7, %[m]\n\t"
  16984. "adcs r4, r4, r6\n\t"
  16985. "adcs r5, r5, r7\n\t"
  16986. "stm %[r]!, {r4, r5}\n\t"
  16987. "ldm %[a]!, {r4, r5}\n\t"
  16988. "ldm %[b]!, {r6, r7}\n\t"
  16989. "and r6, r6, %[m]\n\t"
  16990. "and r7, r7, %[m]\n\t"
  16991. "adcs r4, r4, r6\n\t"
  16992. "adcs r5, r5, r7\n\t"
  16993. "stm %[r]!, {r4, r5}\n\t"
  16994. "ldm %[a]!, {r4, r5}\n\t"
  16995. "ldm %[b]!, {r6, r7}\n\t"
  16996. "and r6, r6, %[m]\n\t"
  16997. "and r7, r7, %[m]\n\t"
  16998. "adcs r4, r4, r6\n\t"
  16999. "adcs r5, r5, r7\n\t"
  17000. "stm %[r]!, {r4, r5}\n\t"
  17001. "ldm %[a]!, {r4, r5}\n\t"
  17002. "ldm %[b]!, {r6, r7}\n\t"
  17003. "and r6, r6, %[m]\n\t"
  17004. "and r7, r7, %[m]\n\t"
  17005. "adcs r4, r4, r6\n\t"
  17006. "adcs r5, r5, r7\n\t"
  17007. "stm %[r]!, {r4, r5}\n\t"
  17008. "adc %[r], r8, r8\n\t"
  17009. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  17010. :
  17011. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  17012. );
  17013. return (uint32_t)(size_t)r;
  17014. }
  17015. #endif /* WOLFSSL_SP_SMALL */
  17016. /* RSA private key operation.
  17017. *
  17018. * in Array of bytes representing the number to exponentiate, base.
  17019. * inLen Number of bytes in base.
  17020. * dm Private exponent.
  17021. * pm First prime.
  17022. * qm Second prime.
  17023. * dpm First prime's CRT exponent.
  17024. * dqm Second prime's CRT exponent.
  17025. * qim Inverse of second prime mod p.
  17026. * mm Modulus.
  17027. * out Buffer to hold big-endian bytes of exponentiation result.
  17028. * Must be at least 256 bytes long.
  17029. * outLen Number of bytes in result.
  17030. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  17031. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  17032. */
  17033. int sp_RsaPrivate_2048(const byte* in, word32 inLen, const mp_int* dm,
  17034. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  17035. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  17036. {
  17037. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  17038. #ifdef WOLFSSL_SP_SMALL_STACK
  17039. sp_digit* d = NULL;
  17040. #else
  17041. sp_digit d[64 * 4];
  17042. #endif
  17043. sp_digit* a = NULL;
  17044. sp_digit* m = NULL;
  17045. sp_digit* r = NULL;
  17046. int err = MP_OKAY;
  17047. (void)pm;
  17048. (void)qm;
  17049. (void)dpm;
  17050. (void)dqm;
  17051. (void)qim;
  17052. if (*outLen < 256U) {
  17053. err = MP_TO_E;
  17054. }
  17055. if (err == MP_OKAY) {
  17056. if (mp_count_bits(dm) > 2048) {
  17057. err = MP_READ_E;
  17058. }
  17059. else if (inLen > 256) {
  17060. err = MP_READ_E;
  17061. }
  17062. else if (mp_count_bits(mm) != 2048) {
  17063. err = MP_READ_E;
  17064. }
  17065. else if (mp_iseven(mm)) {
  17066. err = MP_VAL;
  17067. }
  17068. }
  17069. #ifdef WOLFSSL_SP_SMALL_STACK
  17070. if (err == MP_OKAY) {
  17071. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL,
  17072. DYNAMIC_TYPE_RSA);
  17073. if (d == NULL)
  17074. err = MEMORY_E;
  17075. }
  17076. #endif
  17077. if (err == MP_OKAY) {
  17078. a = d + 64;
  17079. m = a + 128;
  17080. r = a;
  17081. sp_2048_from_bin(a, 64, in, inLen);
  17082. sp_2048_from_mp(d, 64, dm);
  17083. sp_2048_from_mp(m, 64, mm);
  17084. err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0);
  17085. }
  17086. if (err == MP_OKAY) {
  17087. sp_2048_to_bin_64(r, out);
  17088. *outLen = 256;
  17089. }
  17090. #ifdef WOLFSSL_SP_SMALL_STACK
  17091. if (d != NULL)
  17092. #endif
  17093. {
  17094. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  17095. if (a != NULL)
  17096. ForceZero(a, sizeof(sp_digit) * 64);
  17097. #ifdef WOLFSSL_SP_SMALL_STACK
  17098. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  17099. #endif
  17100. }
  17101. return err;
  17102. #else
  17103. #ifdef WOLFSSL_SP_SMALL_STACK
  17104. sp_digit* a = NULL;
  17105. #else
  17106. sp_digit a[32 * 11];
  17107. #endif
  17108. sp_digit* p = NULL;
  17109. sp_digit* q = NULL;
  17110. sp_digit* dp = NULL;
  17111. sp_digit* tmpa = NULL;
  17112. sp_digit* tmpb = NULL;
  17113. sp_digit* r = NULL;
  17114. sp_digit* qi = NULL;
  17115. sp_digit* dq = NULL;
  17116. sp_digit c;
  17117. int err = MP_OKAY;
  17118. (void)dm;
  17119. (void)mm;
  17120. if (*outLen < 256) {
  17121. err = MP_TO_E;
  17122. }
  17123. else if (inLen > 256 || mp_count_bits(mm) != 2048) {
  17124. err = MP_READ_E;
  17125. }
  17126. else if (mp_iseven(mm)) {
  17127. err = MP_VAL;
  17128. }
  17129. else if (mp_iseven(pm)) {
  17130. err = MP_VAL;
  17131. }
  17132. else if (mp_iseven(qm)) {
  17133. err = MP_VAL;
  17134. }
  17135. #ifdef WOLFSSL_SP_SMALL_STACK
  17136. if (err == MP_OKAY) {
  17137. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 11, NULL,
  17138. DYNAMIC_TYPE_RSA);
  17139. if (a == NULL)
  17140. err = MEMORY_E;
  17141. }
  17142. #endif
  17143. if (err == MP_OKAY) {
  17144. p = a + 64 * 2;
  17145. q = p + 32;
  17146. qi = dq = dp = q + 32;
  17147. tmpa = qi + 32;
  17148. tmpb = tmpa + 64;
  17149. r = a;
  17150. sp_2048_from_bin(a, 64, in, inLen);
  17151. sp_2048_from_mp(p, 32, pm);
  17152. sp_2048_from_mp(q, 32, qm);
  17153. sp_2048_from_mp(dp, 32, dpm);
  17154. err = sp_2048_mod_exp_32(tmpa, a, dp, 1024, p, 1);
  17155. }
  17156. if (err == MP_OKAY) {
  17157. sp_2048_from_mp(dq, 32, dqm);
  17158. err = sp_2048_mod_exp_32(tmpb, a, dq, 1024, q, 1);
  17159. }
  17160. if (err == MP_OKAY) {
  17161. c = sp_2048_sub_in_place_32(tmpa, tmpb);
  17162. c += sp_2048_cond_add_32(tmpa, tmpa, p, c);
  17163. sp_2048_cond_add_32(tmpa, tmpa, p, c);
  17164. sp_2048_from_mp(qi, 32, qim);
  17165. sp_2048_mul_32(tmpa, tmpa, qi);
  17166. err = sp_2048_mod_32(tmpa, tmpa, p);
  17167. }
  17168. if (err == MP_OKAY) {
  17169. sp_2048_mul_32(tmpa, q, tmpa);
  17170. XMEMSET(&tmpb[32], 0, sizeof(sp_digit) * 32);
  17171. sp_2048_add_64(r, tmpb, tmpa);
  17172. sp_2048_to_bin_64(r, out);
  17173. *outLen = 256;
  17174. }
  17175. #ifdef WOLFSSL_SP_SMALL_STACK
  17176. if (a != NULL)
  17177. #endif
  17178. {
  17179. ForceZero(a, sizeof(sp_digit) * 32 * 11);
  17180. #ifdef WOLFSSL_SP_SMALL_STACK
  17181. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  17182. #endif
  17183. }
  17184. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  17185. return err;
  17186. }
  17187. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  17188. #endif /* WOLFSSL_HAVE_SP_RSA */
  17189. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  17190. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  17191. /* Convert an array of sp_digit to an mp_int.
  17192. *
  17193. * a A single precision integer.
  17194. * r A multi-precision integer.
  17195. */
  17196. static int sp_2048_to_mp(const sp_digit* a, mp_int* r)
  17197. {
  17198. int err;
  17199. err = mp_grow(r, (2048 + DIGIT_BIT - 1) / DIGIT_BIT);
  17200. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  17201. #if DIGIT_BIT == 32
  17202. XMEMCPY(r->dp, a, sizeof(sp_digit) * 64);
  17203. r->used = 64;
  17204. mp_clamp(r);
  17205. #elif DIGIT_BIT < 32
  17206. int i;
  17207. int j = 0;
  17208. int s = 0;
  17209. r->dp[0] = 0;
  17210. for (i = 0; i < 64; i++) {
  17211. r->dp[j] |= (mp_digit)(a[i] << s);
  17212. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  17213. s = DIGIT_BIT - s;
  17214. r->dp[++j] = (mp_digit)(a[i] >> s);
  17215. while (s + DIGIT_BIT <= 32) {
  17216. s += DIGIT_BIT;
  17217. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  17218. if (s == SP_WORD_SIZE) {
  17219. r->dp[j] = 0;
  17220. }
  17221. else {
  17222. r->dp[j] = (mp_digit)(a[i] >> s);
  17223. }
  17224. }
  17225. s = 32 - s;
  17226. }
  17227. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  17228. mp_clamp(r);
  17229. #else
  17230. int i;
  17231. int j = 0;
  17232. int s = 0;
  17233. r->dp[0] = 0;
  17234. for (i = 0; i < 64; i++) {
  17235. r->dp[j] |= ((mp_digit)a[i]) << s;
  17236. if (s + 32 >= DIGIT_BIT) {
  17237. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  17238. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  17239. #endif
  17240. s = DIGIT_BIT - s;
  17241. r->dp[++j] = a[i] >> s;
  17242. s = 32 - s;
  17243. }
  17244. else {
  17245. s += 32;
  17246. }
  17247. }
  17248. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  17249. mp_clamp(r);
  17250. #endif
  17251. }
  17252. return err;
  17253. }
  17254. /* Perform the modular exponentiation for Diffie-Hellman.
  17255. *
  17256. * base Base. MP integer.
  17257. * exp Exponent. MP integer.
  17258. * mod Modulus. MP integer.
  17259. * res Result. MP integer.
  17260. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  17261. * and MEMORY_E if memory allocation fails.
  17262. */
  17263. int sp_ModExp_2048(const mp_int* base, const mp_int* exp, const mp_int* mod,
  17264. mp_int* res)
  17265. {
  17266. int err = MP_OKAY;
  17267. sp_digit b[128];
  17268. sp_digit e[64];
  17269. sp_digit m[64];
  17270. sp_digit* r = b;
  17271. int expBits = mp_count_bits(exp);
  17272. if (mp_count_bits(base) > 2048) {
  17273. err = MP_READ_E;
  17274. }
  17275. else if (expBits > 2048) {
  17276. err = MP_READ_E;
  17277. }
  17278. else if (mp_count_bits(mod) != 2048) {
  17279. err = MP_READ_E;
  17280. }
  17281. else if (mp_iseven(mod)) {
  17282. err = MP_VAL;
  17283. }
  17284. if (err == MP_OKAY) {
  17285. sp_2048_from_mp(b, 64, base);
  17286. sp_2048_from_mp(e, 64, exp);
  17287. sp_2048_from_mp(m, 64, mod);
  17288. err = sp_2048_mod_exp_64(r, b, e, expBits, m, 0);
  17289. }
  17290. if (err == MP_OKAY) {
  17291. err = sp_2048_to_mp(r, res);
  17292. }
  17293. XMEMSET(e, 0, sizeof(e));
  17294. return err;
  17295. }
  17296. #ifdef WOLFSSL_HAVE_SP_DH
  17297. #ifdef HAVE_FFDHE_2048
  17298. static void sp_2048_lshift_64(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  17299. {
  17300. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  17301. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  17302. register byte n asm ("r2") = (byte)n_p;
  17303. __asm__ __volatile__ (
  17304. "rsb r12, %[n], #31\n\t"
  17305. "ldr r5, [%[a], #252]\n\t"
  17306. "lsr r6, r5, #1\n\t"
  17307. "lsl r5, r5, %[n]\n\t"
  17308. "lsr r6, r6, r12\n\t"
  17309. "ldr r4, [%[a], #248]\n\t"
  17310. "str r6, [%[r], #256]\n\t"
  17311. "lsr r3, r4, #1\n\t"
  17312. "lsl r4, r4, %[n]\n\t"
  17313. "lsr r3, r3, r12\n\t"
  17314. "orr r5, r5, r3\n\t"
  17315. "ldr r6, [%[a], #244]\n\t"
  17316. "str r5, [%[r], #252]\n\t"
  17317. "lsr r3, r6, #1\n\t"
  17318. "lsl r6, r6, %[n]\n\t"
  17319. "lsr r3, r3, r12\n\t"
  17320. "orr r4, r4, r3\n\t"
  17321. "ldr r5, [%[a], #240]\n\t"
  17322. "str r4, [%[r], #248]\n\t"
  17323. "lsr r3, r5, #1\n\t"
  17324. "lsl r5, r5, %[n]\n\t"
  17325. "lsr r3, r3, r12\n\t"
  17326. "orr r6, r6, r3\n\t"
  17327. "ldr r4, [%[a], #236]\n\t"
  17328. "str r6, [%[r], #244]\n\t"
  17329. "lsr r3, r4, #1\n\t"
  17330. "lsl r4, r4, %[n]\n\t"
  17331. "lsr r3, r3, r12\n\t"
  17332. "orr r5, r5, r3\n\t"
  17333. "ldr r6, [%[a], #232]\n\t"
  17334. "str r5, [%[r], #240]\n\t"
  17335. "lsr r3, r6, #1\n\t"
  17336. "lsl r6, r6, %[n]\n\t"
  17337. "lsr r3, r3, r12\n\t"
  17338. "orr r4, r4, r3\n\t"
  17339. "ldr r5, [%[a], #228]\n\t"
  17340. "str r4, [%[r], #236]\n\t"
  17341. "lsr r3, r5, #1\n\t"
  17342. "lsl r5, r5, %[n]\n\t"
  17343. "lsr r3, r3, r12\n\t"
  17344. "orr r6, r6, r3\n\t"
  17345. "ldr r4, [%[a], #224]\n\t"
  17346. "str r6, [%[r], #232]\n\t"
  17347. "lsr r3, r4, #1\n\t"
  17348. "lsl r4, r4, %[n]\n\t"
  17349. "lsr r3, r3, r12\n\t"
  17350. "orr r5, r5, r3\n\t"
  17351. "ldr r6, [%[a], #220]\n\t"
  17352. "str r5, [%[r], #228]\n\t"
  17353. "lsr r3, r6, #1\n\t"
  17354. "lsl r6, r6, %[n]\n\t"
  17355. "lsr r3, r3, r12\n\t"
  17356. "orr r4, r4, r3\n\t"
  17357. "ldr r5, [%[a], #216]\n\t"
  17358. "str r4, [%[r], #224]\n\t"
  17359. "lsr r3, r5, #1\n\t"
  17360. "lsl r5, r5, %[n]\n\t"
  17361. "lsr r3, r3, r12\n\t"
  17362. "orr r6, r6, r3\n\t"
  17363. "ldr r4, [%[a], #212]\n\t"
  17364. "str r6, [%[r], #220]\n\t"
  17365. "lsr r3, r4, #1\n\t"
  17366. "lsl r4, r4, %[n]\n\t"
  17367. "lsr r3, r3, r12\n\t"
  17368. "orr r5, r5, r3\n\t"
  17369. "ldr r6, [%[a], #208]\n\t"
  17370. "str r5, [%[r], #216]\n\t"
  17371. "lsr r3, r6, #1\n\t"
  17372. "lsl r6, r6, %[n]\n\t"
  17373. "lsr r3, r3, r12\n\t"
  17374. "orr r4, r4, r3\n\t"
  17375. "ldr r5, [%[a], #204]\n\t"
  17376. "str r4, [%[r], #212]\n\t"
  17377. "lsr r3, r5, #1\n\t"
  17378. "lsl r5, r5, %[n]\n\t"
  17379. "lsr r3, r3, r12\n\t"
  17380. "orr r6, r6, r3\n\t"
  17381. "ldr r4, [%[a], #200]\n\t"
  17382. "str r6, [%[r], #208]\n\t"
  17383. "lsr r3, r4, #1\n\t"
  17384. "lsl r4, r4, %[n]\n\t"
  17385. "lsr r3, r3, r12\n\t"
  17386. "orr r5, r5, r3\n\t"
  17387. "ldr r6, [%[a], #196]\n\t"
  17388. "str r5, [%[r], #204]\n\t"
  17389. "lsr r3, r6, #1\n\t"
  17390. "lsl r6, r6, %[n]\n\t"
  17391. "lsr r3, r3, r12\n\t"
  17392. "orr r4, r4, r3\n\t"
  17393. "ldr r5, [%[a], #192]\n\t"
  17394. "str r4, [%[r], #200]\n\t"
  17395. "lsr r3, r5, #1\n\t"
  17396. "lsl r5, r5, %[n]\n\t"
  17397. "lsr r3, r3, r12\n\t"
  17398. "orr r6, r6, r3\n\t"
  17399. "ldr r4, [%[a], #188]\n\t"
  17400. "str r6, [%[r], #196]\n\t"
  17401. "lsr r3, r4, #1\n\t"
  17402. "lsl r4, r4, %[n]\n\t"
  17403. "lsr r3, r3, r12\n\t"
  17404. "orr r5, r5, r3\n\t"
  17405. "ldr r6, [%[a], #184]\n\t"
  17406. "str r5, [%[r], #192]\n\t"
  17407. "lsr r3, r6, #1\n\t"
  17408. "lsl r6, r6, %[n]\n\t"
  17409. "lsr r3, r3, r12\n\t"
  17410. "orr r4, r4, r3\n\t"
  17411. "ldr r5, [%[a], #180]\n\t"
  17412. "str r4, [%[r], #188]\n\t"
  17413. "lsr r3, r5, #1\n\t"
  17414. "lsl r5, r5, %[n]\n\t"
  17415. "lsr r3, r3, r12\n\t"
  17416. "orr r6, r6, r3\n\t"
  17417. "ldr r4, [%[a], #176]\n\t"
  17418. "str r6, [%[r], #184]\n\t"
  17419. "lsr r3, r4, #1\n\t"
  17420. "lsl r4, r4, %[n]\n\t"
  17421. "lsr r3, r3, r12\n\t"
  17422. "orr r5, r5, r3\n\t"
  17423. "ldr r6, [%[a], #172]\n\t"
  17424. "str r5, [%[r], #180]\n\t"
  17425. "lsr r3, r6, #1\n\t"
  17426. "lsl r6, r6, %[n]\n\t"
  17427. "lsr r3, r3, r12\n\t"
  17428. "orr r4, r4, r3\n\t"
  17429. "ldr r5, [%[a], #168]\n\t"
  17430. "str r4, [%[r], #176]\n\t"
  17431. "lsr r3, r5, #1\n\t"
  17432. "lsl r5, r5, %[n]\n\t"
  17433. "lsr r3, r3, r12\n\t"
  17434. "orr r6, r6, r3\n\t"
  17435. "ldr r4, [%[a], #164]\n\t"
  17436. "str r6, [%[r], #172]\n\t"
  17437. "lsr r3, r4, #1\n\t"
  17438. "lsl r4, r4, %[n]\n\t"
  17439. "lsr r3, r3, r12\n\t"
  17440. "orr r5, r5, r3\n\t"
  17441. "ldr r6, [%[a], #160]\n\t"
  17442. "str r5, [%[r], #168]\n\t"
  17443. "lsr r3, r6, #1\n\t"
  17444. "lsl r6, r6, %[n]\n\t"
  17445. "lsr r3, r3, r12\n\t"
  17446. "orr r4, r4, r3\n\t"
  17447. "ldr r5, [%[a], #156]\n\t"
  17448. "str r4, [%[r], #164]\n\t"
  17449. "lsr r3, r5, #1\n\t"
  17450. "lsl r5, r5, %[n]\n\t"
  17451. "lsr r3, r3, r12\n\t"
  17452. "orr r6, r6, r3\n\t"
  17453. "ldr r4, [%[a], #152]\n\t"
  17454. "str r6, [%[r], #160]\n\t"
  17455. "lsr r3, r4, #1\n\t"
  17456. "lsl r4, r4, %[n]\n\t"
  17457. "lsr r3, r3, r12\n\t"
  17458. "orr r5, r5, r3\n\t"
  17459. "ldr r6, [%[a], #148]\n\t"
  17460. "str r5, [%[r], #156]\n\t"
  17461. "lsr r3, r6, #1\n\t"
  17462. "lsl r6, r6, %[n]\n\t"
  17463. "lsr r3, r3, r12\n\t"
  17464. "orr r4, r4, r3\n\t"
  17465. "ldr r5, [%[a], #144]\n\t"
  17466. "str r4, [%[r], #152]\n\t"
  17467. "lsr r3, r5, #1\n\t"
  17468. "lsl r5, r5, %[n]\n\t"
  17469. "lsr r3, r3, r12\n\t"
  17470. "orr r6, r6, r3\n\t"
  17471. "ldr r4, [%[a], #140]\n\t"
  17472. "str r6, [%[r], #148]\n\t"
  17473. "lsr r3, r4, #1\n\t"
  17474. "lsl r4, r4, %[n]\n\t"
  17475. "lsr r3, r3, r12\n\t"
  17476. "orr r5, r5, r3\n\t"
  17477. "ldr r6, [%[a], #136]\n\t"
  17478. "str r5, [%[r], #144]\n\t"
  17479. "lsr r3, r6, #1\n\t"
  17480. "lsl r6, r6, %[n]\n\t"
  17481. "lsr r3, r3, r12\n\t"
  17482. "orr r4, r4, r3\n\t"
  17483. "ldr r5, [%[a], #132]\n\t"
  17484. "str r4, [%[r], #140]\n\t"
  17485. "lsr r3, r5, #1\n\t"
  17486. "lsl r5, r5, %[n]\n\t"
  17487. "lsr r3, r3, r12\n\t"
  17488. "orr r6, r6, r3\n\t"
  17489. "ldr r4, [%[a], #128]\n\t"
  17490. "str r6, [%[r], #136]\n\t"
  17491. "lsr r3, r4, #1\n\t"
  17492. "lsl r4, r4, %[n]\n\t"
  17493. "lsr r3, r3, r12\n\t"
  17494. "orr r5, r5, r3\n\t"
  17495. "ldr r6, [%[a], #124]\n\t"
  17496. "str r5, [%[r], #132]\n\t"
  17497. "lsr r3, r6, #1\n\t"
  17498. "lsl r6, r6, %[n]\n\t"
  17499. "lsr r3, r3, r12\n\t"
  17500. "orr r4, r4, r3\n\t"
  17501. "ldr r5, [%[a], #120]\n\t"
  17502. "str r4, [%[r], #128]\n\t"
  17503. "lsr r3, r5, #1\n\t"
  17504. "lsl r5, r5, %[n]\n\t"
  17505. "lsr r3, r3, r12\n\t"
  17506. "orr r6, r6, r3\n\t"
  17507. "ldr r4, [%[a], #116]\n\t"
  17508. "str r6, [%[r], #124]\n\t"
  17509. "lsr r3, r4, #1\n\t"
  17510. "lsl r4, r4, %[n]\n\t"
  17511. "lsr r3, r3, r12\n\t"
  17512. "orr r5, r5, r3\n\t"
  17513. "ldr r6, [%[a], #112]\n\t"
  17514. "str r5, [%[r], #120]\n\t"
  17515. "lsr r3, r6, #1\n\t"
  17516. "lsl r6, r6, %[n]\n\t"
  17517. "lsr r3, r3, r12\n\t"
  17518. "orr r4, r4, r3\n\t"
  17519. "ldr r5, [%[a], #108]\n\t"
  17520. "str r4, [%[r], #116]\n\t"
  17521. "lsr r3, r5, #1\n\t"
  17522. "lsl r5, r5, %[n]\n\t"
  17523. "lsr r3, r3, r12\n\t"
  17524. "orr r6, r6, r3\n\t"
  17525. "ldr r4, [%[a], #104]\n\t"
  17526. "str r6, [%[r], #112]\n\t"
  17527. "lsr r3, r4, #1\n\t"
  17528. "lsl r4, r4, %[n]\n\t"
  17529. "lsr r3, r3, r12\n\t"
  17530. "orr r5, r5, r3\n\t"
  17531. "ldr r6, [%[a], #100]\n\t"
  17532. "str r5, [%[r], #108]\n\t"
  17533. "lsr r3, r6, #1\n\t"
  17534. "lsl r6, r6, %[n]\n\t"
  17535. "lsr r3, r3, r12\n\t"
  17536. "orr r4, r4, r3\n\t"
  17537. "ldr r5, [%[a], #96]\n\t"
  17538. "str r4, [%[r], #104]\n\t"
  17539. "lsr r3, r5, #1\n\t"
  17540. "lsl r5, r5, %[n]\n\t"
  17541. "lsr r3, r3, r12\n\t"
  17542. "orr r6, r6, r3\n\t"
  17543. "ldr r4, [%[a], #92]\n\t"
  17544. "str r6, [%[r], #100]\n\t"
  17545. "lsr r3, r4, #1\n\t"
  17546. "lsl r4, r4, %[n]\n\t"
  17547. "lsr r3, r3, r12\n\t"
  17548. "orr r5, r5, r3\n\t"
  17549. "ldr r6, [%[a], #88]\n\t"
  17550. "str r5, [%[r], #96]\n\t"
  17551. "lsr r3, r6, #1\n\t"
  17552. "lsl r6, r6, %[n]\n\t"
  17553. "lsr r3, r3, r12\n\t"
  17554. "orr r4, r4, r3\n\t"
  17555. "ldr r5, [%[a], #84]\n\t"
  17556. "str r4, [%[r], #92]\n\t"
  17557. "lsr r3, r5, #1\n\t"
  17558. "lsl r5, r5, %[n]\n\t"
  17559. "lsr r3, r3, r12\n\t"
  17560. "orr r6, r6, r3\n\t"
  17561. "ldr r4, [%[a], #80]\n\t"
  17562. "str r6, [%[r], #88]\n\t"
  17563. "lsr r3, r4, #1\n\t"
  17564. "lsl r4, r4, %[n]\n\t"
  17565. "lsr r3, r3, r12\n\t"
  17566. "orr r5, r5, r3\n\t"
  17567. "ldr r6, [%[a], #76]\n\t"
  17568. "str r5, [%[r], #84]\n\t"
  17569. "lsr r3, r6, #1\n\t"
  17570. "lsl r6, r6, %[n]\n\t"
  17571. "lsr r3, r3, r12\n\t"
  17572. "orr r4, r4, r3\n\t"
  17573. "ldr r5, [%[a], #72]\n\t"
  17574. "str r4, [%[r], #80]\n\t"
  17575. "lsr r3, r5, #1\n\t"
  17576. "lsl r5, r5, %[n]\n\t"
  17577. "lsr r3, r3, r12\n\t"
  17578. "orr r6, r6, r3\n\t"
  17579. "ldr r4, [%[a], #68]\n\t"
  17580. "str r6, [%[r], #76]\n\t"
  17581. "lsr r3, r4, #1\n\t"
  17582. "lsl r4, r4, %[n]\n\t"
  17583. "lsr r3, r3, r12\n\t"
  17584. "orr r5, r5, r3\n\t"
  17585. "ldr r6, [%[a], #64]\n\t"
  17586. "str r5, [%[r], #72]\n\t"
  17587. "lsr r3, r6, #1\n\t"
  17588. "lsl r6, r6, %[n]\n\t"
  17589. "lsr r3, r3, r12\n\t"
  17590. "orr r4, r4, r3\n\t"
  17591. "ldr r5, [%[a], #60]\n\t"
  17592. "str r4, [%[r], #68]\n\t"
  17593. "lsr r3, r5, #1\n\t"
  17594. "lsl r5, r5, %[n]\n\t"
  17595. "lsr r3, r3, r12\n\t"
  17596. "orr r6, r6, r3\n\t"
  17597. "ldr r4, [%[a], #56]\n\t"
  17598. "str r6, [%[r], #64]\n\t"
  17599. "lsr r3, r4, #1\n\t"
  17600. "lsl r4, r4, %[n]\n\t"
  17601. "lsr r3, r3, r12\n\t"
  17602. "orr r5, r5, r3\n\t"
  17603. "ldr r6, [%[a], #52]\n\t"
  17604. "str r5, [%[r], #60]\n\t"
  17605. "lsr r3, r6, #1\n\t"
  17606. "lsl r6, r6, %[n]\n\t"
  17607. "lsr r3, r3, r12\n\t"
  17608. "orr r4, r4, r3\n\t"
  17609. "ldr r5, [%[a], #48]\n\t"
  17610. "str r4, [%[r], #56]\n\t"
  17611. "lsr r3, r5, #1\n\t"
  17612. "lsl r5, r5, %[n]\n\t"
  17613. "lsr r3, r3, r12\n\t"
  17614. "orr r6, r6, r3\n\t"
  17615. "ldr r4, [%[a], #44]\n\t"
  17616. "str r6, [%[r], #52]\n\t"
  17617. "lsr r3, r4, #1\n\t"
  17618. "lsl r4, r4, %[n]\n\t"
  17619. "lsr r3, r3, r12\n\t"
  17620. "orr r5, r5, r3\n\t"
  17621. "ldr r6, [%[a], #40]\n\t"
  17622. "str r5, [%[r], #48]\n\t"
  17623. "lsr r3, r6, #1\n\t"
  17624. "lsl r6, r6, %[n]\n\t"
  17625. "lsr r3, r3, r12\n\t"
  17626. "orr r4, r4, r3\n\t"
  17627. "ldr r5, [%[a], #36]\n\t"
  17628. "str r4, [%[r], #44]\n\t"
  17629. "lsr r3, r5, #1\n\t"
  17630. "lsl r5, r5, %[n]\n\t"
  17631. "lsr r3, r3, r12\n\t"
  17632. "orr r6, r6, r3\n\t"
  17633. "ldr r4, [%[a], #32]\n\t"
  17634. "str r6, [%[r], #40]\n\t"
  17635. "lsr r3, r4, #1\n\t"
  17636. "lsl r4, r4, %[n]\n\t"
  17637. "lsr r3, r3, r12\n\t"
  17638. "orr r5, r5, r3\n\t"
  17639. "ldr r6, [%[a], #28]\n\t"
  17640. "str r5, [%[r], #36]\n\t"
  17641. "lsr r3, r6, #1\n\t"
  17642. "lsl r6, r6, %[n]\n\t"
  17643. "lsr r3, r3, r12\n\t"
  17644. "orr r4, r4, r3\n\t"
  17645. "ldr r5, [%[a], #24]\n\t"
  17646. "str r4, [%[r], #32]\n\t"
  17647. "lsr r3, r5, #1\n\t"
  17648. "lsl r5, r5, %[n]\n\t"
  17649. "lsr r3, r3, r12\n\t"
  17650. "orr r6, r6, r3\n\t"
  17651. "ldr r4, [%[a], #20]\n\t"
  17652. "str r6, [%[r], #28]\n\t"
  17653. "lsr r3, r4, #1\n\t"
  17654. "lsl r4, r4, %[n]\n\t"
  17655. "lsr r3, r3, r12\n\t"
  17656. "orr r5, r5, r3\n\t"
  17657. "ldr r6, [%[a], #16]\n\t"
  17658. "str r5, [%[r], #24]\n\t"
  17659. "lsr r3, r6, #1\n\t"
  17660. "lsl r6, r6, %[n]\n\t"
  17661. "lsr r3, r3, r12\n\t"
  17662. "orr r4, r4, r3\n\t"
  17663. "ldr r5, [%[a], #12]\n\t"
  17664. "str r4, [%[r], #20]\n\t"
  17665. "lsr r3, r5, #1\n\t"
  17666. "lsl r5, r5, %[n]\n\t"
  17667. "lsr r3, r3, r12\n\t"
  17668. "orr r6, r6, r3\n\t"
  17669. "ldr r4, [%[a], #8]\n\t"
  17670. "str r6, [%[r], #16]\n\t"
  17671. "lsr r3, r4, #1\n\t"
  17672. "lsl r4, r4, %[n]\n\t"
  17673. "lsr r3, r3, r12\n\t"
  17674. "orr r5, r5, r3\n\t"
  17675. "ldr r6, [%[a], #4]\n\t"
  17676. "str r5, [%[r], #12]\n\t"
  17677. "lsr r3, r6, #1\n\t"
  17678. "lsl r6, r6, %[n]\n\t"
  17679. "lsr r3, r3, r12\n\t"
  17680. "orr r4, r4, r3\n\t"
  17681. "ldr r5, [%[a]]\n\t"
  17682. "str r4, [%[r], #8]\n\t"
  17683. "lsr r3, r5, #1\n\t"
  17684. "lsl r5, r5, %[n]\n\t"
  17685. "lsr r3, r3, r12\n\t"
  17686. "orr r6, r6, r3\n\t"
  17687. "str r5, [%[r]]\n\t"
  17688. "str r6, [%[r], #4]\n\t"
  17689. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  17690. :
  17691. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  17692. );
  17693. }
  17694. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  17695. *
  17696. * r A single precision number that is the result of the operation.
  17697. * e A single precision number that is the exponent.
  17698. * bits The number of bits in the exponent.
  17699. * m A single precision number that is the modulus.
  17700. * returns 0 on success.
  17701. * returns MEMORY_E on dynamic memory allocation failure.
  17702. * returns MP_VAL when base is even.
  17703. */
  17704. static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits,
  17705. const sp_digit* m)
  17706. {
  17707. #ifdef WOLFSSL_SP_SMALL_STACK
  17708. sp_digit* td = NULL;
  17709. #else
  17710. sp_digit td[193];
  17711. #endif
  17712. sp_digit* norm = NULL;
  17713. sp_digit* tmp = NULL;
  17714. sp_digit mp = 1;
  17715. sp_digit n;
  17716. sp_digit o;
  17717. sp_digit mask;
  17718. int i;
  17719. int c;
  17720. byte y;
  17721. int err = MP_OKAY;
  17722. if (bits == 0) {
  17723. err = MP_VAL;
  17724. }
  17725. #ifdef WOLFSSL_SP_SMALL_STACK
  17726. if (err == MP_OKAY) {
  17727. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL,
  17728. DYNAMIC_TYPE_TMP_BUFFER);
  17729. if (td == NULL)
  17730. err = MEMORY_E;
  17731. }
  17732. #endif
  17733. if (err == MP_OKAY) {
  17734. norm = td;
  17735. tmp = td + 128;
  17736. sp_2048_mont_setup(m, &mp);
  17737. sp_2048_mont_norm_64(norm, m);
  17738. i = (bits - 1) / 32;
  17739. n = e[i--];
  17740. c = bits & 31;
  17741. if (c == 0) {
  17742. c = 32;
  17743. }
  17744. c -= bits % 5;
  17745. if (c == 32) {
  17746. c = 27;
  17747. }
  17748. if (c < 0) {
  17749. /* Number of bits in top word is less than number needed. */
  17750. c = -c;
  17751. y = (byte)(n << c);
  17752. n = e[i--];
  17753. y |= (byte)(n >> (64 - c));
  17754. n <<= c;
  17755. c = 64 - c;
  17756. }
  17757. else if (c == 0) {
  17758. /* All bits in top word used. */
  17759. y = (byte)n;
  17760. }
  17761. else {
  17762. y = (byte)(n >> c);
  17763. n <<= 32 - c;
  17764. }
  17765. sp_2048_lshift_64(r, norm, y);
  17766. for (; i>=0 || c>=5; ) {
  17767. if (c == 0) {
  17768. n = e[i--];
  17769. y = (byte)(n >> 27);
  17770. n <<= 5;
  17771. c = 27;
  17772. }
  17773. else if (c < 5) {
  17774. y = (byte)(n >> 27);
  17775. n = e[i--];
  17776. c = 5 - c;
  17777. y |= (byte)(n >> (32 - c));
  17778. n <<= c;
  17779. c = 32 - c;
  17780. }
  17781. else {
  17782. y = (byte)((n >> 27) & 0x1f);
  17783. n <<= 5;
  17784. c -= 5;
  17785. }
  17786. sp_2048_mont_sqr_64(r, r, m, mp);
  17787. sp_2048_mont_sqr_64(r, r, m, mp);
  17788. sp_2048_mont_sqr_64(r, r, m, mp);
  17789. sp_2048_mont_sqr_64(r, r, m, mp);
  17790. sp_2048_mont_sqr_64(r, r, m, mp);
  17791. sp_2048_lshift_64(r, r, y);
  17792. sp_2048_mul_d_64(tmp, norm, r[64]);
  17793. r[64] = 0;
  17794. o = sp_2048_add_64(r, r, tmp);
  17795. sp_2048_cond_sub_64(r, r, m, (sp_digit)0 - o);
  17796. }
  17797. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  17798. sp_2048_mont_reduce_64(r, m, mp);
  17799. mask = (sp_digit)0 - (sp_2048_cmp_64(r, m) >= 0);
  17800. sp_2048_cond_sub_64(r, r, m, mask);
  17801. }
  17802. #ifdef WOLFSSL_SP_SMALL_STACK
  17803. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17804. #endif
  17805. return err;
  17806. }
  17807. #endif /* HAVE_FFDHE_2048 */
  17808. /* Perform the modular exponentiation for Diffie-Hellman.
  17809. *
  17810. * base Base.
  17811. * exp Array of bytes that is the exponent.
  17812. * expLen Length of data, in bytes, in exponent.
  17813. * mod Modulus.
  17814. * out Buffer to hold big-endian bytes of exponentiation result.
  17815. * Must be at least 256 bytes long.
  17816. * outLen Length, in bytes, of exponentiation result.
  17817. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  17818. * and MEMORY_E if memory allocation fails.
  17819. */
  17820. int sp_DhExp_2048(const mp_int* base, const byte* exp, word32 expLen,
  17821. const mp_int* mod, byte* out, word32* outLen)
  17822. {
  17823. int err = MP_OKAY;
  17824. sp_digit b[128];
  17825. sp_digit e[64];
  17826. sp_digit m[64];
  17827. sp_digit* r = b;
  17828. word32 i;
  17829. if (mp_count_bits(base) > 2048) {
  17830. err = MP_READ_E;
  17831. }
  17832. else if (expLen > 256) {
  17833. err = MP_READ_E;
  17834. }
  17835. else if (mp_count_bits(mod) != 2048) {
  17836. err = MP_READ_E;
  17837. }
  17838. else if (mp_iseven(mod)) {
  17839. err = MP_VAL;
  17840. }
  17841. if (err == MP_OKAY) {
  17842. sp_2048_from_mp(b, 64, base);
  17843. sp_2048_from_bin(e, 64, exp, expLen);
  17844. sp_2048_from_mp(m, 64, mod);
  17845. #ifdef HAVE_FFDHE_2048
  17846. if (base->used == 1 && base->dp[0] == 2 && m[63] == (sp_digit)-1)
  17847. err = sp_2048_mod_exp_2_64(r, e, expLen * 8, m);
  17848. else
  17849. #endif
  17850. err = sp_2048_mod_exp_64(r, b, e, expLen * 8, m, 0);
  17851. }
  17852. if (err == MP_OKAY) {
  17853. sp_2048_to_bin_64(r, out);
  17854. *outLen = 256;
  17855. for (i=0; i<256 && out[i] == 0; i++) {
  17856. /* Search for first non-zero. */
  17857. }
  17858. *outLen -= i;
  17859. XMEMMOVE(out, out + i, *outLen);
  17860. }
  17861. XMEMSET(e, 0, sizeof(e));
  17862. return err;
  17863. }
  17864. #endif /* WOLFSSL_HAVE_SP_DH */
  17865. /* Perform the modular exponentiation for Diffie-Hellman.
  17866. *
  17867. * base Base. MP integer.
  17868. * exp Exponent. MP integer.
  17869. * mod Modulus. MP integer.
  17870. * res Result. MP integer.
  17871. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  17872. * and MEMORY_E if memory allocation fails.
  17873. */
  17874. int sp_ModExp_1024(const mp_int* base, const mp_int* exp, const mp_int* mod,
  17875. mp_int* res)
  17876. {
  17877. int err = MP_OKAY;
  17878. sp_digit b[64];
  17879. sp_digit e[32];
  17880. sp_digit m[32];
  17881. sp_digit* r = b;
  17882. int expBits = mp_count_bits(exp);
  17883. if (mp_count_bits(base) > 1024) {
  17884. err = MP_READ_E;
  17885. }
  17886. else if (expBits > 1024) {
  17887. err = MP_READ_E;
  17888. }
  17889. else if (mp_count_bits(mod) != 1024) {
  17890. err = MP_READ_E;
  17891. }
  17892. else if (mp_iseven(mod)) {
  17893. err = MP_VAL;
  17894. }
  17895. if (err == MP_OKAY) {
  17896. sp_2048_from_mp(b, 32, base);
  17897. sp_2048_from_mp(e, 32, exp);
  17898. sp_2048_from_mp(m, 32, mod);
  17899. err = sp_2048_mod_exp_32(r, b, e, expBits, m, 0);
  17900. }
  17901. if (err == MP_OKAY) {
  17902. XMEMSET(r + 32, 0, sizeof(*r) * 32U);
  17903. err = sp_2048_to_mp(r, res);
  17904. res->used = mod->used;
  17905. mp_clamp(res);
  17906. }
  17907. XMEMSET(e, 0, sizeof(e));
  17908. return err;
  17909. }
  17910. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  17911. #endif /* !WOLFSSL_SP_NO_2048 */
  17912. #ifndef WOLFSSL_SP_NO_3072
  17913. /* Read big endian unsigned byte array into r.
  17914. *
  17915. * r A single precision integer.
  17916. * size Maximum number of bytes to convert
  17917. * a Byte array.
  17918. * n Number of bytes in array to read.
  17919. */
  17920. static void sp_3072_from_bin(sp_digit* r, int size, const byte* a, int n)
  17921. {
  17922. int i;
  17923. int j;
  17924. byte* d;
  17925. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  17926. r[j] = ((sp_digit)a[i - 0] << 0) |
  17927. ((sp_digit)a[i - 1] << 8) |
  17928. ((sp_digit)a[i - 2] << 16) |
  17929. ((sp_digit)a[i - 3] << 24);
  17930. j++;
  17931. }
  17932. if (i >= 0) {
  17933. r[j] = 0;
  17934. d = (byte*)r;
  17935. switch (i) {
  17936. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  17937. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  17938. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  17939. }
  17940. j++;
  17941. }
  17942. for (; j < size; j++) {
  17943. r[j] = 0;
  17944. }
  17945. }
  17946. /* Convert an mp_int to an array of sp_digit.
  17947. *
  17948. * r A single precision integer.
  17949. * size Maximum number of bytes to convert
  17950. * a A multi-precision integer.
  17951. */
  17952. static void sp_3072_from_mp(sp_digit* r, int size, const mp_int* a)
  17953. {
  17954. #if DIGIT_BIT == 32
  17955. int i;
  17956. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  17957. int o = 0;
  17958. for (i = 0; i < size; i++) {
  17959. sp_digit mask = (sp_digit)0 - (j >> 31);
  17960. r[i] = a->dp[o] & mask;
  17961. j++;
  17962. o += (int)(j >> 31);
  17963. }
  17964. #elif DIGIT_BIT > 32
  17965. unsigned int i;
  17966. int j = 0;
  17967. word32 s = 0;
  17968. r[0] = 0;
  17969. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  17970. r[j] |= ((sp_digit)a->dp[i] << s);
  17971. r[j] &= 0xffffffff;
  17972. s = 32U - s;
  17973. if (j + 1 >= size) {
  17974. break;
  17975. }
  17976. /* lint allow cast of mismatch word32 and mp_digit */
  17977. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  17978. while ((s + 32U) <= (word32)DIGIT_BIT) {
  17979. s += 32U;
  17980. r[j] &= 0xffffffff;
  17981. if (j + 1 >= size) {
  17982. break;
  17983. }
  17984. if (s < (word32)DIGIT_BIT) {
  17985. /* lint allow cast of mismatch word32 and mp_digit */
  17986. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  17987. }
  17988. else {
  17989. r[++j] = (sp_digit)0;
  17990. }
  17991. }
  17992. s = (word32)DIGIT_BIT - s;
  17993. }
  17994. for (j++; j < size; j++) {
  17995. r[j] = 0;
  17996. }
  17997. #else
  17998. unsigned int i;
  17999. int j = 0;
  18000. int s = 0;
  18001. r[0] = 0;
  18002. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  18003. r[j] |= ((sp_digit)a->dp[i]) << s;
  18004. if (s + DIGIT_BIT >= 32) {
  18005. r[j] &= 0xffffffff;
  18006. if (j + 1 >= size) {
  18007. break;
  18008. }
  18009. s = 32 - s;
  18010. if (s == DIGIT_BIT) {
  18011. r[++j] = 0;
  18012. s = 0;
  18013. }
  18014. else {
  18015. r[++j] = a->dp[i] >> s;
  18016. s = DIGIT_BIT - s;
  18017. }
  18018. }
  18019. else {
  18020. s += DIGIT_BIT;
  18021. }
  18022. }
  18023. for (j++; j < size; j++) {
  18024. r[j] = 0;
  18025. }
  18026. #endif
  18027. }
  18028. /* Write r as big endian to byte array.
  18029. * Fixed length number of bytes written: 384
  18030. *
  18031. * r A single precision integer.
  18032. * a Byte array.
  18033. */
  18034. static void sp_3072_to_bin_96(sp_digit* r, byte* a)
  18035. {
  18036. int i;
  18037. int j = 0;
  18038. for (i = 95; i >= 0; i--) {
  18039. a[j++] = r[i] >> 24;
  18040. a[j++] = r[i] >> 16;
  18041. a[j++] = r[i] >> 8;
  18042. a[j++] = r[i] >> 0;
  18043. }
  18044. }
  18045. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  18046. /* Normalize the values in each word to 32.
  18047. *
  18048. * a Array of sp_digit to normalize.
  18049. */
  18050. #define sp_3072_norm_96(a)
  18051. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || 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. #ifndef WOLFSSL_SP_SMALL
  18058. /* Multiply a and b into r. (r = a * b)
  18059. *
  18060. * r A single precision integer.
  18061. * a A single precision integer.
  18062. * b A single precision integer.
  18063. */
  18064. static void sp_3072_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  18065. {
  18066. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  18067. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  18068. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  18069. __asm__ __volatile__ (
  18070. "sub sp, sp, #48\n\t"
  18071. /* A[0] * B[0] */
  18072. "ldr r11, [%[a]]\n\t"
  18073. "ldr r12, [%[b]]\n\t"
  18074. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18075. "lsl r6, r11, #16\n\t"
  18076. "lsl r3, r12, #16\n\t"
  18077. "lsr r6, r6, #16\n\t"
  18078. "lsr r3, r3, #16\n\t"
  18079. "mul r3, r6, r3\n\t"
  18080. "lsr r7, r12, #16\n\t"
  18081. "mul r6, r7, r6\n\t"
  18082. "lsr r4, r6, #16\n\t"
  18083. "lsl r6, r6, #16\n\t"
  18084. "adds r3, r3, r6\n\t"
  18085. "adc r4, r4, #0\n\t"
  18086. "lsr r6, r11, #16\n\t"
  18087. "mul r7, r6, r7\n\t"
  18088. "add r4, r4, r7\n\t"
  18089. "lsl r7, r12, #16\n\t"
  18090. "lsr r7, r7, #16\n\t"
  18091. "mul r6, r7, r6\n\t"
  18092. "lsr r7, r6, #16\n\t"
  18093. "lsl r6, r6, #16\n\t"
  18094. "adds r3, r3, r6\n\t"
  18095. "adc r4, r4, r7\n\t"
  18096. "mov r5, #0\n\t"
  18097. #else
  18098. "umull r3, r4, r11, r12\n\t"
  18099. "mov r5, #0\n\t"
  18100. #endif
  18101. "str r3, [sp]\n\t"
  18102. /* A[0] * B[1] */
  18103. "ldr r9, [%[b], #4]\n\t"
  18104. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18105. "lsl r6, r11, #16\n\t"
  18106. "lsl r7, r9, #16\n\t"
  18107. "lsr r6, r6, #16\n\t"
  18108. "lsr r7, r7, #16\n\t"
  18109. "mul r7, r6, r7\n\t"
  18110. "adds r4, r4, r7\n\t"
  18111. "adcs r5, r5, #0\n\t"
  18112. "mov r3, #0\n\t"
  18113. "adc r3, r3, #0\n\t"
  18114. "lsr r7, r9, #16\n\t"
  18115. "mul r6, r7, r6\n\t"
  18116. "lsr r7, r6, #16\n\t"
  18117. "lsl r6, r6, #16\n\t"
  18118. "adds r4, r4, r6\n\t"
  18119. "adcs r5, r5, r7\n\t"
  18120. "adc r3, r3, #0\n\t"
  18121. "lsr r6, r11, #16\n\t"
  18122. "lsr r7, r9, #16\n\t"
  18123. "mul r7, r6, r7\n\t"
  18124. "adds r5, r5, r7\n\t"
  18125. "adc r3, r3, #0\n\t"
  18126. "lsl r7, r9, #16\n\t"
  18127. "lsr r7, r7, #16\n\t"
  18128. "mul r6, r7, r6\n\t"
  18129. "lsr r7, r6, #16\n\t"
  18130. "lsl r6, r6, #16\n\t"
  18131. "adds r4, r4, r6\n\t"
  18132. "adcs r5, r5, r7\n\t"
  18133. "adc r3, r3, #0\n\t"
  18134. #else
  18135. "umull r6, r7, r11, r9\n\t"
  18136. "adds r4, r4, r6\n\t"
  18137. "adcs r5, r5, r7\n\t"
  18138. "mov r3, #0\n\t"
  18139. "adc r3, r3, #0\n\t"
  18140. #endif
  18141. /* A[1] * B[0] */
  18142. "ldr r8, [%[a], #4]\n\t"
  18143. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18144. "lsl r6, r8, #16\n\t"
  18145. "lsl r7, r12, #16\n\t"
  18146. "lsr r6, r6, #16\n\t"
  18147. "lsr r7, r7, #16\n\t"
  18148. "mul r7, r6, r7\n\t"
  18149. "adds r4, r4, r7\n\t"
  18150. "adcs r5, r5, #0\n\t"
  18151. "adc r3, r3, #0\n\t"
  18152. "lsr r7, r12, #16\n\t"
  18153. "mul r6, r7, r6\n\t"
  18154. "lsr r7, r6, #16\n\t"
  18155. "lsl r6, r6, #16\n\t"
  18156. "adds r4, r4, r6\n\t"
  18157. "adcs r5, r5, r7\n\t"
  18158. "adc r3, r3, #0\n\t"
  18159. "lsr r6, r8, #16\n\t"
  18160. "lsr r7, r12, #16\n\t"
  18161. "mul r7, r6, r7\n\t"
  18162. "adds r5, r5, r7\n\t"
  18163. "adc r3, r3, #0\n\t"
  18164. "lsl r7, r12, #16\n\t"
  18165. "lsr r7, r7, #16\n\t"
  18166. "mul r6, r7, r6\n\t"
  18167. "lsr r7, r6, #16\n\t"
  18168. "lsl r6, r6, #16\n\t"
  18169. "adds r4, r4, r6\n\t"
  18170. "adcs r5, r5, r7\n\t"
  18171. "adc r3, r3, #0\n\t"
  18172. #else
  18173. "umull r6, r7, r8, r12\n\t"
  18174. "adds r4, r4, r6\n\t"
  18175. "adcs r5, r5, r7\n\t"
  18176. "adc r3, r3, #0\n\t"
  18177. #endif
  18178. "str r4, [sp, #4]\n\t"
  18179. /* A[2] * B[0] */
  18180. "ldr r8, [%[a], #8]\n\t"
  18181. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18182. "lsl r6, r8, #16\n\t"
  18183. "lsl r7, r12, #16\n\t"
  18184. "lsr r6, r6, #16\n\t"
  18185. "lsr r7, r7, #16\n\t"
  18186. "mul r7, r6, r7\n\t"
  18187. "adds r5, r5, r7\n\t"
  18188. "adcs r3, r3, #0\n\t"
  18189. "mov r4, #0\n\t"
  18190. "adc r4, r4, #0\n\t"
  18191. "lsr r7, r12, #16\n\t"
  18192. "mul r6, r7, r6\n\t"
  18193. "lsr r7, r6, #16\n\t"
  18194. "lsl r6, r6, #16\n\t"
  18195. "adds r5, r5, r6\n\t"
  18196. "adcs r3, r3, r7\n\t"
  18197. "adc r4, r4, #0\n\t"
  18198. "lsr r6, r8, #16\n\t"
  18199. "lsr r7, r12, #16\n\t"
  18200. "mul r7, r6, r7\n\t"
  18201. "adds r3, r3, r7\n\t"
  18202. "adc r4, r4, #0\n\t"
  18203. "lsl r7, r12, #16\n\t"
  18204. "lsr r7, r7, #16\n\t"
  18205. "mul r6, r7, r6\n\t"
  18206. "lsr r7, r6, #16\n\t"
  18207. "lsl r6, r6, #16\n\t"
  18208. "adds r5, r5, r6\n\t"
  18209. "adcs r3, r3, r7\n\t"
  18210. "adc r4, r4, #0\n\t"
  18211. #else
  18212. "umull r6, r7, r8, r12\n\t"
  18213. "adds r5, r5, r6\n\t"
  18214. "adcs r3, r3, r7\n\t"
  18215. "mov r4, #0\n\t"
  18216. "adc r4, r4, #0\n\t"
  18217. #endif
  18218. /* A[1] * B[1] */
  18219. "ldr r11, [%[a], #4]\n\t"
  18220. "ldr r12, [%[b], #4]\n\t"
  18221. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18222. "lsl r6, r11, #16\n\t"
  18223. "lsl r7, r12, #16\n\t"
  18224. "lsr r6, r6, #16\n\t"
  18225. "lsr r7, r7, #16\n\t"
  18226. "mul r7, r6, r7\n\t"
  18227. "adds r5, r5, r7\n\t"
  18228. "adcs r3, r3, #0\n\t"
  18229. "adc r4, r4, #0\n\t"
  18230. "lsr r7, r12, #16\n\t"
  18231. "mul r6, r7, r6\n\t"
  18232. "lsr r7, r6, #16\n\t"
  18233. "lsl r6, r6, #16\n\t"
  18234. "adds r5, r5, r6\n\t"
  18235. "adcs r3, r3, r7\n\t"
  18236. "adc r4, r4, #0\n\t"
  18237. "lsr r6, r11, #16\n\t"
  18238. "lsr r7, r12, #16\n\t"
  18239. "mul r7, r6, r7\n\t"
  18240. "adds r3, r3, r7\n\t"
  18241. "adc r4, r4, #0\n\t"
  18242. "lsl r7, r12, #16\n\t"
  18243. "lsr r7, r7, #16\n\t"
  18244. "mul r6, r7, r6\n\t"
  18245. "lsr r7, r6, #16\n\t"
  18246. "lsl r6, r6, #16\n\t"
  18247. "adds r5, r5, r6\n\t"
  18248. "adcs r3, r3, r7\n\t"
  18249. "adc r4, r4, #0\n\t"
  18250. #else
  18251. "umull r6, r7, r11, r12\n\t"
  18252. "adds r5, r5, r6\n\t"
  18253. "adcs r3, r3, r7\n\t"
  18254. "adc r4, r4, #0\n\t"
  18255. #endif
  18256. /* A[0] * B[2] */
  18257. "ldr r8, [%[a]]\n\t"
  18258. "ldr r9, [%[b], #8]\n\t"
  18259. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18260. "lsl r6, r8, #16\n\t"
  18261. "lsl r7, r9, #16\n\t"
  18262. "lsr r6, r6, #16\n\t"
  18263. "lsr r7, r7, #16\n\t"
  18264. "mul r7, r6, r7\n\t"
  18265. "adds r5, r5, r7\n\t"
  18266. "adcs r3, r3, #0\n\t"
  18267. "adc r4, r4, #0\n\t"
  18268. "lsr r7, r9, #16\n\t"
  18269. "mul r6, r7, r6\n\t"
  18270. "lsr r7, r6, #16\n\t"
  18271. "lsl r6, r6, #16\n\t"
  18272. "adds r5, r5, r6\n\t"
  18273. "adcs r3, r3, r7\n\t"
  18274. "adc r4, r4, #0\n\t"
  18275. "lsr r6, r8, #16\n\t"
  18276. "lsr r7, r9, #16\n\t"
  18277. "mul r7, r6, r7\n\t"
  18278. "adds r3, r3, r7\n\t"
  18279. "adc r4, r4, #0\n\t"
  18280. "lsl r7, r9, #16\n\t"
  18281. "lsr r7, r7, #16\n\t"
  18282. "mul r6, r7, r6\n\t"
  18283. "lsr r7, r6, #16\n\t"
  18284. "lsl r6, r6, #16\n\t"
  18285. "adds r5, r5, r6\n\t"
  18286. "adcs r3, r3, r7\n\t"
  18287. "adc r4, r4, #0\n\t"
  18288. #else
  18289. "umull r6, r7, r8, r9\n\t"
  18290. "adds r5, r5, r6\n\t"
  18291. "adcs r3, r3, r7\n\t"
  18292. "adc r4, r4, #0\n\t"
  18293. #endif
  18294. "str r5, [sp, #8]\n\t"
  18295. /* A[0] * B[3] */
  18296. "ldr r9, [%[b], #12]\n\t"
  18297. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18298. "lsl r6, r8, #16\n\t"
  18299. "lsl r7, r9, #16\n\t"
  18300. "lsr r6, r6, #16\n\t"
  18301. "lsr r7, r7, #16\n\t"
  18302. "mul r7, r6, r7\n\t"
  18303. "adds r3, r3, r7\n\t"
  18304. "adcs r4, r4, #0\n\t"
  18305. "mov r5, #0\n\t"
  18306. "adc r5, r5, #0\n\t"
  18307. "lsr r7, r9, #16\n\t"
  18308. "mul r6, r7, r6\n\t"
  18309. "lsr r7, r6, #16\n\t"
  18310. "lsl r6, r6, #16\n\t"
  18311. "adds r3, r3, r6\n\t"
  18312. "adcs r4, r4, r7\n\t"
  18313. "adc r5, r5, #0\n\t"
  18314. "lsr r6, r8, #16\n\t"
  18315. "lsr r7, r9, #16\n\t"
  18316. "mul r7, r6, r7\n\t"
  18317. "adds r4, r4, r7\n\t"
  18318. "adc r5, r5, #0\n\t"
  18319. "lsl r7, r9, #16\n\t"
  18320. "lsr r7, r7, #16\n\t"
  18321. "mul r6, r7, r6\n\t"
  18322. "lsr r7, r6, #16\n\t"
  18323. "lsl r6, r6, #16\n\t"
  18324. "adds r3, r3, r6\n\t"
  18325. "adcs r4, r4, r7\n\t"
  18326. "adc r5, r5, #0\n\t"
  18327. #else
  18328. "umull r6, r7, r8, r9\n\t"
  18329. "adds r3, r3, r6\n\t"
  18330. "adcs r4, r4, r7\n\t"
  18331. "mov r5, #0\n\t"
  18332. "adc r5, r5, #0\n\t"
  18333. #endif
  18334. /* A[1] * B[2] */
  18335. "ldr r9, [%[b], #8]\n\t"
  18336. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18337. "lsl r6, r11, #16\n\t"
  18338. "lsl r7, r9, #16\n\t"
  18339. "lsr r6, r6, #16\n\t"
  18340. "lsr r7, r7, #16\n\t"
  18341. "mul r7, r6, r7\n\t"
  18342. "adds r3, r3, r7\n\t"
  18343. "adcs r4, r4, #0\n\t"
  18344. "adc r5, r5, #0\n\t"
  18345. "lsr r7, r9, #16\n\t"
  18346. "mul r6, r7, r6\n\t"
  18347. "lsr r7, r6, #16\n\t"
  18348. "lsl r6, r6, #16\n\t"
  18349. "adds r3, r3, r6\n\t"
  18350. "adcs r4, r4, r7\n\t"
  18351. "adc r5, r5, #0\n\t"
  18352. "lsr r6, r11, #16\n\t"
  18353. "lsr r7, r9, #16\n\t"
  18354. "mul r7, r6, r7\n\t"
  18355. "adds r4, r4, r7\n\t"
  18356. "adc r5, r5, #0\n\t"
  18357. "lsl r7, r9, #16\n\t"
  18358. "lsr r7, r7, #16\n\t"
  18359. "mul r6, r7, r6\n\t"
  18360. "lsr r7, r6, #16\n\t"
  18361. "lsl r6, r6, #16\n\t"
  18362. "adds r3, r3, r6\n\t"
  18363. "adcs r4, r4, r7\n\t"
  18364. "adc r5, r5, #0\n\t"
  18365. #else
  18366. "umull r6, r7, r11, r9\n\t"
  18367. "adds r3, r3, r6\n\t"
  18368. "adcs r4, r4, r7\n\t"
  18369. "adc r5, r5, #0\n\t"
  18370. #endif
  18371. /* A[2] * B[1] */
  18372. "ldr r8, [%[a], #8]\n\t"
  18373. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18374. "lsl r6, r8, #16\n\t"
  18375. "lsl r7, r12, #16\n\t"
  18376. "lsr r6, r6, #16\n\t"
  18377. "lsr r7, r7, #16\n\t"
  18378. "mul r7, r6, r7\n\t"
  18379. "adds r3, r3, r7\n\t"
  18380. "adcs r4, r4, #0\n\t"
  18381. "adc r5, r5, #0\n\t"
  18382. "lsr r7, r12, #16\n\t"
  18383. "mul r6, r7, r6\n\t"
  18384. "lsr r7, r6, #16\n\t"
  18385. "lsl r6, r6, #16\n\t"
  18386. "adds r3, r3, r6\n\t"
  18387. "adcs r4, r4, r7\n\t"
  18388. "adc r5, r5, #0\n\t"
  18389. "lsr r6, r8, #16\n\t"
  18390. "lsr r7, r12, #16\n\t"
  18391. "mul r7, r6, r7\n\t"
  18392. "adds r4, r4, r7\n\t"
  18393. "adc r5, r5, #0\n\t"
  18394. "lsl r7, r12, #16\n\t"
  18395. "lsr r7, r7, #16\n\t"
  18396. "mul r6, r7, r6\n\t"
  18397. "lsr r7, r6, #16\n\t"
  18398. "lsl r6, r6, #16\n\t"
  18399. "adds r3, r3, r6\n\t"
  18400. "adcs r4, r4, r7\n\t"
  18401. "adc r5, r5, #0\n\t"
  18402. #else
  18403. "umull r6, r7, r8, r12\n\t"
  18404. "adds r3, r3, r6\n\t"
  18405. "adcs r4, r4, r7\n\t"
  18406. "adc r5, r5, #0\n\t"
  18407. #endif
  18408. /* A[3] * B[0] */
  18409. "ldr r8, [%[a], #12]\n\t"
  18410. "ldr r9, [%[b]]\n\t"
  18411. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18412. "lsl r6, r8, #16\n\t"
  18413. "lsl r7, r9, #16\n\t"
  18414. "lsr r6, r6, #16\n\t"
  18415. "lsr r7, r7, #16\n\t"
  18416. "mul r7, r6, r7\n\t"
  18417. "adds r3, r3, r7\n\t"
  18418. "adcs r4, r4, #0\n\t"
  18419. "adc r5, r5, #0\n\t"
  18420. "lsr r7, r9, #16\n\t"
  18421. "mul r6, r7, r6\n\t"
  18422. "lsr r7, r6, #16\n\t"
  18423. "lsl r6, r6, #16\n\t"
  18424. "adds r3, r3, r6\n\t"
  18425. "adcs r4, r4, r7\n\t"
  18426. "adc r5, r5, #0\n\t"
  18427. "lsr r6, r8, #16\n\t"
  18428. "lsr r7, r9, #16\n\t"
  18429. "mul r7, r6, r7\n\t"
  18430. "adds r4, r4, r7\n\t"
  18431. "adc r5, r5, #0\n\t"
  18432. "lsl r7, r9, #16\n\t"
  18433. "lsr r7, r7, #16\n\t"
  18434. "mul r6, r7, r6\n\t"
  18435. "lsr r7, r6, #16\n\t"
  18436. "lsl r6, r6, #16\n\t"
  18437. "adds r3, r3, r6\n\t"
  18438. "adcs r4, r4, r7\n\t"
  18439. "adc r5, r5, #0\n\t"
  18440. #else
  18441. "umull r6, r7, r8, r9\n\t"
  18442. "adds r3, r3, r6\n\t"
  18443. "adcs r4, r4, r7\n\t"
  18444. "adc r5, r5, #0\n\t"
  18445. #endif
  18446. "str r3, [sp, #12]\n\t"
  18447. /* A[4] * B[0] */
  18448. "ldr r8, [%[a], #16]\n\t"
  18449. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18450. "lsl r6, r8, #16\n\t"
  18451. "lsl r7, r9, #16\n\t"
  18452. "lsr r6, r6, #16\n\t"
  18453. "lsr r7, r7, #16\n\t"
  18454. "mul r7, r6, r7\n\t"
  18455. "adds r4, r4, r7\n\t"
  18456. "adcs r5, r5, #0\n\t"
  18457. "mov r3, #0\n\t"
  18458. "adc r3, r3, #0\n\t"
  18459. "lsr r7, r9, #16\n\t"
  18460. "mul r6, r7, r6\n\t"
  18461. "lsr r7, r6, #16\n\t"
  18462. "lsl r6, r6, #16\n\t"
  18463. "adds r4, r4, r6\n\t"
  18464. "adcs r5, r5, r7\n\t"
  18465. "adc r3, r3, #0\n\t"
  18466. "lsr r6, r8, #16\n\t"
  18467. "lsr r7, r9, #16\n\t"
  18468. "mul r7, r6, r7\n\t"
  18469. "adds r5, r5, r7\n\t"
  18470. "adc r3, r3, #0\n\t"
  18471. "lsl r7, r9, #16\n\t"
  18472. "lsr r7, r7, #16\n\t"
  18473. "mul r6, r7, r6\n\t"
  18474. "lsr r7, r6, #16\n\t"
  18475. "lsl r6, r6, #16\n\t"
  18476. "adds r4, r4, r6\n\t"
  18477. "adcs r5, r5, r7\n\t"
  18478. "adc r3, r3, #0\n\t"
  18479. #else
  18480. "umull r6, r7, r8, r9\n\t"
  18481. "adds r4, r4, r6\n\t"
  18482. "adcs r5, r5, r7\n\t"
  18483. "mov r3, #0\n\t"
  18484. "adc r3, r3, #0\n\t"
  18485. #endif
  18486. /* A[3] * B[1] */
  18487. "ldr r8, [%[a], #12]\n\t"
  18488. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18489. "lsl r6, r8, #16\n\t"
  18490. "lsl r7, r12, #16\n\t"
  18491. "lsr r6, r6, #16\n\t"
  18492. "lsr r7, r7, #16\n\t"
  18493. "mul r7, r6, r7\n\t"
  18494. "adds r4, r4, r7\n\t"
  18495. "adcs r5, r5, #0\n\t"
  18496. "adc r3, r3, #0\n\t"
  18497. "lsr r7, r12, #16\n\t"
  18498. "mul r6, r7, r6\n\t"
  18499. "lsr r7, r6, #16\n\t"
  18500. "lsl r6, r6, #16\n\t"
  18501. "adds r4, r4, r6\n\t"
  18502. "adcs r5, r5, r7\n\t"
  18503. "adc r3, r3, #0\n\t"
  18504. "lsr r6, r8, #16\n\t"
  18505. "lsr r7, r12, #16\n\t"
  18506. "mul r7, r6, r7\n\t"
  18507. "adds r5, r5, r7\n\t"
  18508. "adc r3, r3, #0\n\t"
  18509. "lsl r7, r12, #16\n\t"
  18510. "lsr r7, r7, #16\n\t"
  18511. "mul r6, r7, r6\n\t"
  18512. "lsr r7, r6, #16\n\t"
  18513. "lsl r6, r6, #16\n\t"
  18514. "adds r4, r4, r6\n\t"
  18515. "adcs r5, r5, r7\n\t"
  18516. "adc r3, r3, #0\n\t"
  18517. #else
  18518. "umull r6, r7, r8, r12\n\t"
  18519. "adds r4, r4, r6\n\t"
  18520. "adcs r5, r5, r7\n\t"
  18521. "adc r3, r3, #0\n\t"
  18522. #endif
  18523. /* A[2] * B[2] */
  18524. "ldr r11, [%[a], #8]\n\t"
  18525. "ldr r12, [%[b], #8]\n\t"
  18526. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18527. "lsl r6, r11, #16\n\t"
  18528. "lsl r7, r12, #16\n\t"
  18529. "lsr r6, r6, #16\n\t"
  18530. "lsr r7, r7, #16\n\t"
  18531. "mul r7, r6, r7\n\t"
  18532. "adds r4, r4, r7\n\t"
  18533. "adcs r5, r5, #0\n\t"
  18534. "adc r3, r3, #0\n\t"
  18535. "lsr r7, r12, #16\n\t"
  18536. "mul r6, r7, r6\n\t"
  18537. "lsr r7, r6, #16\n\t"
  18538. "lsl r6, r6, #16\n\t"
  18539. "adds r4, r4, r6\n\t"
  18540. "adcs r5, r5, r7\n\t"
  18541. "adc r3, r3, #0\n\t"
  18542. "lsr r6, r11, #16\n\t"
  18543. "lsr r7, r12, #16\n\t"
  18544. "mul r7, r6, r7\n\t"
  18545. "adds r5, r5, r7\n\t"
  18546. "adc r3, r3, #0\n\t"
  18547. "lsl r7, r12, #16\n\t"
  18548. "lsr r7, r7, #16\n\t"
  18549. "mul r6, r7, r6\n\t"
  18550. "lsr r7, r6, #16\n\t"
  18551. "lsl r6, r6, #16\n\t"
  18552. "adds r4, r4, r6\n\t"
  18553. "adcs r5, r5, r7\n\t"
  18554. "adc r3, r3, #0\n\t"
  18555. #else
  18556. "umull r6, r7, r11, r12\n\t"
  18557. "adds r4, r4, r6\n\t"
  18558. "adcs r5, r5, r7\n\t"
  18559. "adc r3, r3, #0\n\t"
  18560. #endif
  18561. /* A[1] * B[3] */
  18562. "ldr r8, [%[a], #4]\n\t"
  18563. "ldr r9, [%[b], #12]\n\t"
  18564. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18565. "lsl r6, r8, #16\n\t"
  18566. "lsl r7, r9, #16\n\t"
  18567. "lsr r6, r6, #16\n\t"
  18568. "lsr r7, r7, #16\n\t"
  18569. "mul r7, r6, r7\n\t"
  18570. "adds r4, r4, r7\n\t"
  18571. "adcs r5, r5, #0\n\t"
  18572. "adc r3, r3, #0\n\t"
  18573. "lsr r7, r9, #16\n\t"
  18574. "mul r6, r7, r6\n\t"
  18575. "lsr r7, r6, #16\n\t"
  18576. "lsl r6, r6, #16\n\t"
  18577. "adds r4, r4, r6\n\t"
  18578. "adcs r5, r5, r7\n\t"
  18579. "adc r3, r3, #0\n\t"
  18580. "lsr r6, r8, #16\n\t"
  18581. "lsr r7, r9, #16\n\t"
  18582. "mul r7, r6, r7\n\t"
  18583. "adds r5, r5, r7\n\t"
  18584. "adc r3, r3, #0\n\t"
  18585. "lsl r7, r9, #16\n\t"
  18586. "lsr r7, r7, #16\n\t"
  18587. "mul r6, r7, r6\n\t"
  18588. "lsr r7, r6, #16\n\t"
  18589. "lsl r6, r6, #16\n\t"
  18590. "adds r4, r4, r6\n\t"
  18591. "adcs r5, r5, r7\n\t"
  18592. "adc r3, r3, #0\n\t"
  18593. #else
  18594. "umull r6, r7, r8, r9\n\t"
  18595. "adds r4, r4, r6\n\t"
  18596. "adcs r5, r5, r7\n\t"
  18597. "adc r3, r3, #0\n\t"
  18598. #endif
  18599. /* A[0] * B[4] */
  18600. "ldr r8, [%[a]]\n\t"
  18601. "ldr r9, [%[b], #16]\n\t"
  18602. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18603. "lsl r6, r8, #16\n\t"
  18604. "lsl r7, r9, #16\n\t"
  18605. "lsr r6, r6, #16\n\t"
  18606. "lsr r7, r7, #16\n\t"
  18607. "mul r7, r6, r7\n\t"
  18608. "adds r4, r4, r7\n\t"
  18609. "adcs r5, r5, #0\n\t"
  18610. "adc r3, r3, #0\n\t"
  18611. "lsr r7, r9, #16\n\t"
  18612. "mul r6, r7, r6\n\t"
  18613. "lsr r7, r6, #16\n\t"
  18614. "lsl r6, r6, #16\n\t"
  18615. "adds r4, r4, r6\n\t"
  18616. "adcs r5, r5, r7\n\t"
  18617. "adc r3, r3, #0\n\t"
  18618. "lsr r6, r8, #16\n\t"
  18619. "lsr r7, r9, #16\n\t"
  18620. "mul r7, r6, r7\n\t"
  18621. "adds r5, r5, r7\n\t"
  18622. "adc r3, r3, #0\n\t"
  18623. "lsl r7, r9, #16\n\t"
  18624. "lsr r7, r7, #16\n\t"
  18625. "mul r6, r7, r6\n\t"
  18626. "lsr r7, r6, #16\n\t"
  18627. "lsl r6, r6, #16\n\t"
  18628. "adds r4, r4, r6\n\t"
  18629. "adcs r5, r5, r7\n\t"
  18630. "adc r3, r3, #0\n\t"
  18631. #else
  18632. "umull r6, r7, r8, r9\n\t"
  18633. "adds r4, r4, r6\n\t"
  18634. "adcs r5, r5, r7\n\t"
  18635. "adc r3, r3, #0\n\t"
  18636. #endif
  18637. "str r4, [sp, #16]\n\t"
  18638. /* A[0] * B[5] */
  18639. "ldr r9, [%[b], #20]\n\t"
  18640. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18641. "lsl r6, r8, #16\n\t"
  18642. "lsl r7, r9, #16\n\t"
  18643. "lsr r6, r6, #16\n\t"
  18644. "lsr r7, r7, #16\n\t"
  18645. "mul r7, r6, r7\n\t"
  18646. "adds r5, r5, r7\n\t"
  18647. "adcs r3, r3, #0\n\t"
  18648. "mov r4, #0\n\t"
  18649. "adc r4, r4, #0\n\t"
  18650. "lsr r7, r9, #16\n\t"
  18651. "mul r6, r7, r6\n\t"
  18652. "lsr r7, r6, #16\n\t"
  18653. "lsl r6, r6, #16\n\t"
  18654. "adds r5, r5, r6\n\t"
  18655. "adcs r3, r3, r7\n\t"
  18656. "adc r4, r4, #0\n\t"
  18657. "lsr r6, r8, #16\n\t"
  18658. "lsr r7, r9, #16\n\t"
  18659. "mul r7, r6, r7\n\t"
  18660. "adds r3, r3, r7\n\t"
  18661. "adc r4, r4, #0\n\t"
  18662. "lsl r7, r9, #16\n\t"
  18663. "lsr r7, r7, #16\n\t"
  18664. "mul r6, r7, r6\n\t"
  18665. "lsr r7, r6, #16\n\t"
  18666. "lsl r6, r6, #16\n\t"
  18667. "adds r5, r5, r6\n\t"
  18668. "adcs r3, r3, r7\n\t"
  18669. "adc r4, r4, #0\n\t"
  18670. #else
  18671. "umull r6, r7, r8, r9\n\t"
  18672. "adds r5, r5, r6\n\t"
  18673. "adcs r3, r3, r7\n\t"
  18674. "mov r4, #0\n\t"
  18675. "adc r4, r4, #0\n\t"
  18676. #endif
  18677. /* A[1] * B[4] */
  18678. "ldr r8, [%[a], #4]\n\t"
  18679. "ldr r9, [%[b], #16]\n\t"
  18680. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18681. "lsl r6, r8, #16\n\t"
  18682. "lsl r7, r9, #16\n\t"
  18683. "lsr r6, r6, #16\n\t"
  18684. "lsr r7, r7, #16\n\t"
  18685. "mul r7, r6, r7\n\t"
  18686. "adds r5, r5, r7\n\t"
  18687. "adcs r3, r3, #0\n\t"
  18688. "adc r4, r4, #0\n\t"
  18689. "lsr r7, r9, #16\n\t"
  18690. "mul r6, r7, r6\n\t"
  18691. "lsr r7, r6, #16\n\t"
  18692. "lsl r6, r6, #16\n\t"
  18693. "adds r5, r5, r6\n\t"
  18694. "adcs r3, r3, r7\n\t"
  18695. "adc r4, r4, #0\n\t"
  18696. "lsr r6, r8, #16\n\t"
  18697. "lsr r7, r9, #16\n\t"
  18698. "mul r7, r6, r7\n\t"
  18699. "adds r3, r3, r7\n\t"
  18700. "adc r4, r4, #0\n\t"
  18701. "lsl r7, r9, #16\n\t"
  18702. "lsr r7, r7, #16\n\t"
  18703. "mul r6, r7, r6\n\t"
  18704. "lsr r7, r6, #16\n\t"
  18705. "lsl r6, r6, #16\n\t"
  18706. "adds r5, r5, r6\n\t"
  18707. "adcs r3, r3, r7\n\t"
  18708. "adc r4, r4, #0\n\t"
  18709. #else
  18710. "umull r6, r7, r8, r9\n\t"
  18711. "adds r5, r5, r6\n\t"
  18712. "adcs r3, r3, r7\n\t"
  18713. "adc r4, r4, #0\n\t"
  18714. #endif
  18715. /* A[2] * B[3] */
  18716. "ldr r9, [%[b], #12]\n\t"
  18717. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18718. "lsl r6, r11, #16\n\t"
  18719. "lsl r7, r9, #16\n\t"
  18720. "lsr r6, r6, #16\n\t"
  18721. "lsr r7, r7, #16\n\t"
  18722. "mul r7, r6, r7\n\t"
  18723. "adds r5, r5, r7\n\t"
  18724. "adcs r3, r3, #0\n\t"
  18725. "adc r4, r4, #0\n\t"
  18726. "lsr r7, r9, #16\n\t"
  18727. "mul r6, r7, r6\n\t"
  18728. "lsr r7, r6, #16\n\t"
  18729. "lsl r6, r6, #16\n\t"
  18730. "adds r5, r5, r6\n\t"
  18731. "adcs r3, r3, r7\n\t"
  18732. "adc r4, r4, #0\n\t"
  18733. "lsr r6, r11, #16\n\t"
  18734. "lsr r7, r9, #16\n\t"
  18735. "mul r7, r6, r7\n\t"
  18736. "adds r3, r3, r7\n\t"
  18737. "adc r4, r4, #0\n\t"
  18738. "lsl r7, r9, #16\n\t"
  18739. "lsr r7, r7, #16\n\t"
  18740. "mul r6, r7, r6\n\t"
  18741. "lsr r7, r6, #16\n\t"
  18742. "lsl r6, r6, #16\n\t"
  18743. "adds r5, r5, r6\n\t"
  18744. "adcs r3, r3, r7\n\t"
  18745. "adc r4, r4, #0\n\t"
  18746. #else
  18747. "umull r6, r7, r11, r9\n\t"
  18748. "adds r5, r5, r6\n\t"
  18749. "adcs r3, r3, r7\n\t"
  18750. "adc r4, r4, #0\n\t"
  18751. #endif
  18752. /* A[3] * B[2] */
  18753. "ldr r8, [%[a], #12]\n\t"
  18754. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18755. "lsl r6, r8, #16\n\t"
  18756. "lsl r7, r12, #16\n\t"
  18757. "lsr r6, r6, #16\n\t"
  18758. "lsr r7, r7, #16\n\t"
  18759. "mul r7, r6, r7\n\t"
  18760. "adds r5, r5, r7\n\t"
  18761. "adcs r3, r3, #0\n\t"
  18762. "adc r4, r4, #0\n\t"
  18763. "lsr r7, r12, #16\n\t"
  18764. "mul r6, r7, r6\n\t"
  18765. "lsr r7, r6, #16\n\t"
  18766. "lsl r6, r6, #16\n\t"
  18767. "adds r5, r5, r6\n\t"
  18768. "adcs r3, r3, r7\n\t"
  18769. "adc r4, r4, #0\n\t"
  18770. "lsr r6, r8, #16\n\t"
  18771. "lsr r7, r12, #16\n\t"
  18772. "mul r7, r6, r7\n\t"
  18773. "adds r3, r3, r7\n\t"
  18774. "adc r4, r4, #0\n\t"
  18775. "lsl r7, r12, #16\n\t"
  18776. "lsr r7, r7, #16\n\t"
  18777. "mul r6, r7, r6\n\t"
  18778. "lsr r7, r6, #16\n\t"
  18779. "lsl r6, r6, #16\n\t"
  18780. "adds r5, r5, r6\n\t"
  18781. "adcs r3, r3, r7\n\t"
  18782. "adc r4, r4, #0\n\t"
  18783. #else
  18784. "umull r6, r7, r8, r12\n\t"
  18785. "adds r5, r5, r6\n\t"
  18786. "adcs r3, r3, r7\n\t"
  18787. "adc r4, r4, #0\n\t"
  18788. #endif
  18789. /* A[4] * B[1] */
  18790. "ldr r8, [%[a], #16]\n\t"
  18791. "ldr r9, [%[b], #4]\n\t"
  18792. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18793. "lsl r6, r8, #16\n\t"
  18794. "lsl r7, r9, #16\n\t"
  18795. "lsr r6, r6, #16\n\t"
  18796. "lsr r7, r7, #16\n\t"
  18797. "mul r7, r6, r7\n\t"
  18798. "adds r5, r5, r7\n\t"
  18799. "adcs r3, r3, #0\n\t"
  18800. "adc r4, r4, #0\n\t"
  18801. "lsr r7, r9, #16\n\t"
  18802. "mul r6, r7, r6\n\t"
  18803. "lsr r7, r6, #16\n\t"
  18804. "lsl r6, r6, #16\n\t"
  18805. "adds r5, r5, r6\n\t"
  18806. "adcs r3, r3, r7\n\t"
  18807. "adc r4, r4, #0\n\t"
  18808. "lsr r6, r8, #16\n\t"
  18809. "lsr r7, r9, #16\n\t"
  18810. "mul r7, r6, r7\n\t"
  18811. "adds r3, r3, r7\n\t"
  18812. "adc r4, r4, #0\n\t"
  18813. "lsl r7, r9, #16\n\t"
  18814. "lsr r7, r7, #16\n\t"
  18815. "mul r6, r7, r6\n\t"
  18816. "lsr r7, r6, #16\n\t"
  18817. "lsl r6, r6, #16\n\t"
  18818. "adds r5, r5, r6\n\t"
  18819. "adcs r3, r3, r7\n\t"
  18820. "adc r4, r4, #0\n\t"
  18821. #else
  18822. "umull r6, r7, r8, r9\n\t"
  18823. "adds r5, r5, r6\n\t"
  18824. "adcs r3, r3, r7\n\t"
  18825. "adc r4, r4, #0\n\t"
  18826. #endif
  18827. /* A[5] * B[0] */
  18828. "ldr r8, [%[a], #20]\n\t"
  18829. "ldr r9, [%[b]]\n\t"
  18830. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18831. "lsl r6, r8, #16\n\t"
  18832. "lsl r7, r9, #16\n\t"
  18833. "lsr r6, r6, #16\n\t"
  18834. "lsr r7, r7, #16\n\t"
  18835. "mul r7, r6, r7\n\t"
  18836. "adds r5, r5, r7\n\t"
  18837. "adcs r3, r3, #0\n\t"
  18838. "adc r4, r4, #0\n\t"
  18839. "lsr r7, r9, #16\n\t"
  18840. "mul r6, r7, r6\n\t"
  18841. "lsr r7, r6, #16\n\t"
  18842. "lsl r6, r6, #16\n\t"
  18843. "adds r5, r5, r6\n\t"
  18844. "adcs r3, r3, r7\n\t"
  18845. "adc r4, r4, #0\n\t"
  18846. "lsr r6, r8, #16\n\t"
  18847. "lsr r7, r9, #16\n\t"
  18848. "mul r7, r6, r7\n\t"
  18849. "adds r3, r3, r7\n\t"
  18850. "adc r4, r4, #0\n\t"
  18851. "lsl r7, r9, #16\n\t"
  18852. "lsr r7, r7, #16\n\t"
  18853. "mul r6, r7, r6\n\t"
  18854. "lsr r7, r6, #16\n\t"
  18855. "lsl r6, r6, #16\n\t"
  18856. "adds r5, r5, r6\n\t"
  18857. "adcs r3, r3, r7\n\t"
  18858. "adc r4, r4, #0\n\t"
  18859. #else
  18860. "umull r6, r7, r8, r9\n\t"
  18861. "adds r5, r5, r6\n\t"
  18862. "adcs r3, r3, r7\n\t"
  18863. "adc r4, r4, #0\n\t"
  18864. #endif
  18865. "str r5, [sp, #20]\n\t"
  18866. /* A[6] * B[0] */
  18867. "ldr r8, [%[a], #24]\n\t"
  18868. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18869. "lsl r6, r8, #16\n\t"
  18870. "lsl r7, r9, #16\n\t"
  18871. "lsr r6, r6, #16\n\t"
  18872. "lsr r7, r7, #16\n\t"
  18873. "mul r7, r6, r7\n\t"
  18874. "adds r3, r3, r7\n\t"
  18875. "adcs r4, r4, #0\n\t"
  18876. "mov r5, #0\n\t"
  18877. "adc r5, r5, #0\n\t"
  18878. "lsr r7, r9, #16\n\t"
  18879. "mul r6, r7, r6\n\t"
  18880. "lsr r7, r6, #16\n\t"
  18881. "lsl r6, r6, #16\n\t"
  18882. "adds r3, r3, r6\n\t"
  18883. "adcs r4, r4, r7\n\t"
  18884. "adc r5, r5, #0\n\t"
  18885. "lsr r6, r8, #16\n\t"
  18886. "lsr r7, r9, #16\n\t"
  18887. "mul r7, r6, r7\n\t"
  18888. "adds r4, r4, r7\n\t"
  18889. "adc r5, r5, #0\n\t"
  18890. "lsl r7, r9, #16\n\t"
  18891. "lsr r7, r7, #16\n\t"
  18892. "mul r6, r7, r6\n\t"
  18893. "lsr r7, r6, #16\n\t"
  18894. "lsl r6, r6, #16\n\t"
  18895. "adds r3, r3, r6\n\t"
  18896. "adcs r4, r4, r7\n\t"
  18897. "adc r5, r5, #0\n\t"
  18898. #else
  18899. "umull r6, r7, r8, r9\n\t"
  18900. "adds r3, r3, r6\n\t"
  18901. "adcs r4, r4, r7\n\t"
  18902. "mov r5, #0\n\t"
  18903. "adc r5, r5, #0\n\t"
  18904. #endif
  18905. /* A[5] * B[1] */
  18906. "ldr r8, [%[a], #20]\n\t"
  18907. "ldr r9, [%[b], #4]\n\t"
  18908. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18909. "lsl r6, r8, #16\n\t"
  18910. "lsl r7, r9, #16\n\t"
  18911. "lsr r6, r6, #16\n\t"
  18912. "lsr r7, r7, #16\n\t"
  18913. "mul r7, r6, r7\n\t"
  18914. "adds r3, r3, r7\n\t"
  18915. "adcs r4, r4, #0\n\t"
  18916. "adc r5, r5, #0\n\t"
  18917. "lsr r7, r9, #16\n\t"
  18918. "mul r6, r7, r6\n\t"
  18919. "lsr r7, r6, #16\n\t"
  18920. "lsl r6, r6, #16\n\t"
  18921. "adds r3, r3, r6\n\t"
  18922. "adcs r4, r4, r7\n\t"
  18923. "adc r5, r5, #0\n\t"
  18924. "lsr r6, r8, #16\n\t"
  18925. "lsr r7, r9, #16\n\t"
  18926. "mul r7, r6, r7\n\t"
  18927. "adds r4, r4, r7\n\t"
  18928. "adc r5, r5, #0\n\t"
  18929. "lsl r7, r9, #16\n\t"
  18930. "lsr r7, r7, #16\n\t"
  18931. "mul r6, r7, r6\n\t"
  18932. "lsr r7, r6, #16\n\t"
  18933. "lsl r6, r6, #16\n\t"
  18934. "adds r3, r3, r6\n\t"
  18935. "adcs r4, r4, r7\n\t"
  18936. "adc r5, r5, #0\n\t"
  18937. #else
  18938. "umull r6, r7, r8, r9\n\t"
  18939. "adds r3, r3, r6\n\t"
  18940. "adcs r4, r4, r7\n\t"
  18941. "adc r5, r5, #0\n\t"
  18942. #endif
  18943. /* A[4] * B[2] */
  18944. "ldr r8, [%[a], #16]\n\t"
  18945. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18946. "lsl r6, r8, #16\n\t"
  18947. "lsl r7, r12, #16\n\t"
  18948. "lsr r6, r6, #16\n\t"
  18949. "lsr r7, r7, #16\n\t"
  18950. "mul r7, r6, r7\n\t"
  18951. "adds r3, r3, r7\n\t"
  18952. "adcs r4, r4, #0\n\t"
  18953. "adc r5, r5, #0\n\t"
  18954. "lsr r7, r12, #16\n\t"
  18955. "mul r6, r7, r6\n\t"
  18956. "lsr r7, r6, #16\n\t"
  18957. "lsl r6, r6, #16\n\t"
  18958. "adds r3, r3, r6\n\t"
  18959. "adcs r4, r4, r7\n\t"
  18960. "adc r5, r5, #0\n\t"
  18961. "lsr r6, r8, #16\n\t"
  18962. "lsr r7, r12, #16\n\t"
  18963. "mul r7, r6, r7\n\t"
  18964. "adds r4, r4, r7\n\t"
  18965. "adc r5, r5, #0\n\t"
  18966. "lsl r7, r12, #16\n\t"
  18967. "lsr r7, r7, #16\n\t"
  18968. "mul r6, r7, r6\n\t"
  18969. "lsr r7, r6, #16\n\t"
  18970. "lsl r6, r6, #16\n\t"
  18971. "adds r3, r3, r6\n\t"
  18972. "adcs r4, r4, r7\n\t"
  18973. "adc r5, r5, #0\n\t"
  18974. #else
  18975. "umull r6, r7, r8, r12\n\t"
  18976. "adds r3, r3, r6\n\t"
  18977. "adcs r4, r4, r7\n\t"
  18978. "adc r5, r5, #0\n\t"
  18979. #endif
  18980. /* A[3] * B[3] */
  18981. "ldr r11, [%[a], #12]\n\t"
  18982. "ldr r12, [%[b], #12]\n\t"
  18983. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  18984. "lsl r6, r11, #16\n\t"
  18985. "lsl r7, r12, #16\n\t"
  18986. "lsr r6, r6, #16\n\t"
  18987. "lsr r7, r7, #16\n\t"
  18988. "mul r7, r6, r7\n\t"
  18989. "adds r3, r3, r7\n\t"
  18990. "adcs r4, r4, #0\n\t"
  18991. "adc r5, r5, #0\n\t"
  18992. "lsr r7, r12, #16\n\t"
  18993. "mul r6, r7, r6\n\t"
  18994. "lsr r7, r6, #16\n\t"
  18995. "lsl r6, r6, #16\n\t"
  18996. "adds r3, r3, r6\n\t"
  18997. "adcs r4, r4, r7\n\t"
  18998. "adc r5, r5, #0\n\t"
  18999. "lsr r6, r11, #16\n\t"
  19000. "lsr r7, r12, #16\n\t"
  19001. "mul r7, r6, r7\n\t"
  19002. "adds r4, r4, r7\n\t"
  19003. "adc r5, r5, #0\n\t"
  19004. "lsl r7, r12, #16\n\t"
  19005. "lsr r7, r7, #16\n\t"
  19006. "mul r6, r7, r6\n\t"
  19007. "lsr r7, r6, #16\n\t"
  19008. "lsl r6, r6, #16\n\t"
  19009. "adds r3, r3, r6\n\t"
  19010. "adcs r4, r4, r7\n\t"
  19011. "adc r5, r5, #0\n\t"
  19012. #else
  19013. "umull r6, r7, r11, r12\n\t"
  19014. "adds r3, r3, r6\n\t"
  19015. "adcs r4, r4, r7\n\t"
  19016. "adc r5, r5, #0\n\t"
  19017. #endif
  19018. /* A[2] * B[4] */
  19019. "ldr r8, [%[a], #8]\n\t"
  19020. "ldr r9, [%[b], #16]\n\t"
  19021. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19022. "lsl r6, r8, #16\n\t"
  19023. "lsl r7, r9, #16\n\t"
  19024. "lsr r6, r6, #16\n\t"
  19025. "lsr r7, r7, #16\n\t"
  19026. "mul r7, r6, r7\n\t"
  19027. "adds r3, r3, r7\n\t"
  19028. "adcs r4, r4, #0\n\t"
  19029. "adc r5, r5, #0\n\t"
  19030. "lsr r7, r9, #16\n\t"
  19031. "mul r6, r7, r6\n\t"
  19032. "lsr r7, r6, #16\n\t"
  19033. "lsl r6, r6, #16\n\t"
  19034. "adds r3, r3, r6\n\t"
  19035. "adcs r4, r4, r7\n\t"
  19036. "adc r5, r5, #0\n\t"
  19037. "lsr r6, r8, #16\n\t"
  19038. "lsr r7, r9, #16\n\t"
  19039. "mul r7, r6, r7\n\t"
  19040. "adds r4, r4, r7\n\t"
  19041. "adc r5, r5, #0\n\t"
  19042. "lsl r7, r9, #16\n\t"
  19043. "lsr r7, r7, #16\n\t"
  19044. "mul r6, r7, r6\n\t"
  19045. "lsr r7, r6, #16\n\t"
  19046. "lsl r6, r6, #16\n\t"
  19047. "adds r3, r3, r6\n\t"
  19048. "adcs r4, r4, r7\n\t"
  19049. "adc r5, r5, #0\n\t"
  19050. #else
  19051. "umull r6, r7, r8, r9\n\t"
  19052. "adds r3, r3, r6\n\t"
  19053. "adcs r4, r4, r7\n\t"
  19054. "adc r5, r5, #0\n\t"
  19055. #endif
  19056. /* A[1] * B[5] */
  19057. "ldr r8, [%[a], #4]\n\t"
  19058. "ldr r9, [%[b], #20]\n\t"
  19059. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19060. "lsl r6, r8, #16\n\t"
  19061. "lsl r7, r9, #16\n\t"
  19062. "lsr r6, r6, #16\n\t"
  19063. "lsr r7, r7, #16\n\t"
  19064. "mul r7, r6, r7\n\t"
  19065. "adds r3, r3, r7\n\t"
  19066. "adcs r4, r4, #0\n\t"
  19067. "adc r5, r5, #0\n\t"
  19068. "lsr r7, r9, #16\n\t"
  19069. "mul r6, r7, r6\n\t"
  19070. "lsr r7, r6, #16\n\t"
  19071. "lsl r6, r6, #16\n\t"
  19072. "adds r3, r3, r6\n\t"
  19073. "adcs r4, r4, r7\n\t"
  19074. "adc r5, r5, #0\n\t"
  19075. "lsr r6, r8, #16\n\t"
  19076. "lsr r7, r9, #16\n\t"
  19077. "mul r7, r6, r7\n\t"
  19078. "adds r4, r4, r7\n\t"
  19079. "adc r5, r5, #0\n\t"
  19080. "lsl r7, r9, #16\n\t"
  19081. "lsr r7, r7, #16\n\t"
  19082. "mul r6, r7, r6\n\t"
  19083. "lsr r7, r6, #16\n\t"
  19084. "lsl r6, r6, #16\n\t"
  19085. "adds r3, r3, r6\n\t"
  19086. "adcs r4, r4, r7\n\t"
  19087. "adc r5, r5, #0\n\t"
  19088. #else
  19089. "umull r6, r7, r8, r9\n\t"
  19090. "adds r3, r3, r6\n\t"
  19091. "adcs r4, r4, r7\n\t"
  19092. "adc r5, r5, #0\n\t"
  19093. #endif
  19094. /* A[0] * B[6] */
  19095. "ldr r8, [%[a]]\n\t"
  19096. "ldr r9, [%[b], #24]\n\t"
  19097. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19098. "lsl r6, r8, #16\n\t"
  19099. "lsl r7, r9, #16\n\t"
  19100. "lsr r6, r6, #16\n\t"
  19101. "lsr r7, r7, #16\n\t"
  19102. "mul r7, r6, r7\n\t"
  19103. "adds r3, r3, r7\n\t"
  19104. "adcs r4, r4, #0\n\t"
  19105. "adc r5, r5, #0\n\t"
  19106. "lsr r7, r9, #16\n\t"
  19107. "mul r6, r7, r6\n\t"
  19108. "lsr r7, r6, #16\n\t"
  19109. "lsl r6, r6, #16\n\t"
  19110. "adds r3, r3, r6\n\t"
  19111. "adcs r4, r4, r7\n\t"
  19112. "adc r5, r5, #0\n\t"
  19113. "lsr r6, r8, #16\n\t"
  19114. "lsr r7, r9, #16\n\t"
  19115. "mul r7, r6, r7\n\t"
  19116. "adds r4, r4, r7\n\t"
  19117. "adc r5, r5, #0\n\t"
  19118. "lsl r7, r9, #16\n\t"
  19119. "lsr r7, r7, #16\n\t"
  19120. "mul r6, r7, r6\n\t"
  19121. "lsr r7, r6, #16\n\t"
  19122. "lsl r6, r6, #16\n\t"
  19123. "adds r3, r3, r6\n\t"
  19124. "adcs r4, r4, r7\n\t"
  19125. "adc r5, r5, #0\n\t"
  19126. #else
  19127. "umull r6, r7, r8, r9\n\t"
  19128. "adds r3, r3, r6\n\t"
  19129. "adcs r4, r4, r7\n\t"
  19130. "adc r5, r5, #0\n\t"
  19131. #endif
  19132. "str r3, [sp, #24]\n\t"
  19133. /* A[0] * B[7] */
  19134. "ldr r9, [%[b], #28]\n\t"
  19135. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19136. "lsl r6, r8, #16\n\t"
  19137. "lsl r7, r9, #16\n\t"
  19138. "lsr r6, r6, #16\n\t"
  19139. "lsr r7, r7, #16\n\t"
  19140. "mul r7, r6, r7\n\t"
  19141. "adds r4, r4, r7\n\t"
  19142. "adcs r5, r5, #0\n\t"
  19143. "mov r3, #0\n\t"
  19144. "adc r3, r3, #0\n\t"
  19145. "lsr r7, r9, #16\n\t"
  19146. "mul r6, r7, r6\n\t"
  19147. "lsr r7, r6, #16\n\t"
  19148. "lsl r6, r6, #16\n\t"
  19149. "adds r4, r4, r6\n\t"
  19150. "adcs r5, r5, r7\n\t"
  19151. "adc r3, r3, #0\n\t"
  19152. "lsr r6, r8, #16\n\t"
  19153. "lsr r7, r9, #16\n\t"
  19154. "mul r7, r6, r7\n\t"
  19155. "adds r5, r5, r7\n\t"
  19156. "adc r3, r3, #0\n\t"
  19157. "lsl r7, r9, #16\n\t"
  19158. "lsr r7, r7, #16\n\t"
  19159. "mul r6, r7, r6\n\t"
  19160. "lsr r7, r6, #16\n\t"
  19161. "lsl r6, r6, #16\n\t"
  19162. "adds r4, r4, r6\n\t"
  19163. "adcs r5, r5, r7\n\t"
  19164. "adc r3, r3, #0\n\t"
  19165. #else
  19166. "umull r6, r7, r8, r9\n\t"
  19167. "adds r4, r4, r6\n\t"
  19168. "adcs r5, r5, r7\n\t"
  19169. "mov r3, #0\n\t"
  19170. "adc r3, r3, #0\n\t"
  19171. #endif
  19172. /* A[1] * B[6] */
  19173. "ldr r8, [%[a], #4]\n\t"
  19174. "ldr r9, [%[b], #24]\n\t"
  19175. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19176. "lsl r6, r8, #16\n\t"
  19177. "lsl r7, r9, #16\n\t"
  19178. "lsr r6, r6, #16\n\t"
  19179. "lsr r7, r7, #16\n\t"
  19180. "mul r7, r6, r7\n\t"
  19181. "adds r4, r4, r7\n\t"
  19182. "adcs r5, r5, #0\n\t"
  19183. "adc r3, r3, #0\n\t"
  19184. "lsr r7, r9, #16\n\t"
  19185. "mul r6, r7, r6\n\t"
  19186. "lsr r7, r6, #16\n\t"
  19187. "lsl r6, r6, #16\n\t"
  19188. "adds r4, r4, r6\n\t"
  19189. "adcs r5, r5, r7\n\t"
  19190. "adc r3, r3, #0\n\t"
  19191. "lsr r6, r8, #16\n\t"
  19192. "lsr r7, r9, #16\n\t"
  19193. "mul r7, r6, r7\n\t"
  19194. "adds r5, r5, r7\n\t"
  19195. "adc r3, r3, #0\n\t"
  19196. "lsl r7, r9, #16\n\t"
  19197. "lsr r7, r7, #16\n\t"
  19198. "mul r6, r7, r6\n\t"
  19199. "lsr r7, r6, #16\n\t"
  19200. "lsl r6, r6, #16\n\t"
  19201. "adds r4, r4, r6\n\t"
  19202. "adcs r5, r5, r7\n\t"
  19203. "adc r3, r3, #0\n\t"
  19204. #else
  19205. "umull r6, r7, r8, r9\n\t"
  19206. "adds r4, r4, r6\n\t"
  19207. "adcs r5, r5, r7\n\t"
  19208. "adc r3, r3, #0\n\t"
  19209. #endif
  19210. /* A[2] * B[5] */
  19211. "ldr r8, [%[a], #8]\n\t"
  19212. "ldr r9, [%[b], #20]\n\t"
  19213. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19214. "lsl r6, r8, #16\n\t"
  19215. "lsl r7, r9, #16\n\t"
  19216. "lsr r6, r6, #16\n\t"
  19217. "lsr r7, r7, #16\n\t"
  19218. "mul r7, r6, r7\n\t"
  19219. "adds r4, r4, r7\n\t"
  19220. "adcs r5, r5, #0\n\t"
  19221. "adc r3, r3, #0\n\t"
  19222. "lsr r7, r9, #16\n\t"
  19223. "mul r6, r7, r6\n\t"
  19224. "lsr r7, r6, #16\n\t"
  19225. "lsl r6, r6, #16\n\t"
  19226. "adds r4, r4, r6\n\t"
  19227. "adcs r5, r5, r7\n\t"
  19228. "adc r3, r3, #0\n\t"
  19229. "lsr r6, r8, #16\n\t"
  19230. "lsr r7, r9, #16\n\t"
  19231. "mul r7, r6, r7\n\t"
  19232. "adds r5, r5, r7\n\t"
  19233. "adc r3, r3, #0\n\t"
  19234. "lsl r7, r9, #16\n\t"
  19235. "lsr r7, r7, #16\n\t"
  19236. "mul r6, r7, r6\n\t"
  19237. "lsr r7, r6, #16\n\t"
  19238. "lsl r6, r6, #16\n\t"
  19239. "adds r4, r4, r6\n\t"
  19240. "adcs r5, r5, r7\n\t"
  19241. "adc r3, r3, #0\n\t"
  19242. #else
  19243. "umull r6, r7, r8, r9\n\t"
  19244. "adds r4, r4, r6\n\t"
  19245. "adcs r5, r5, r7\n\t"
  19246. "adc r3, r3, #0\n\t"
  19247. #endif
  19248. /* A[3] * B[4] */
  19249. "ldr r9, [%[b], #16]\n\t"
  19250. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19251. "lsl r6, r11, #16\n\t"
  19252. "lsl r7, r9, #16\n\t"
  19253. "lsr r6, r6, #16\n\t"
  19254. "lsr r7, r7, #16\n\t"
  19255. "mul r7, r6, r7\n\t"
  19256. "adds r4, r4, r7\n\t"
  19257. "adcs r5, r5, #0\n\t"
  19258. "adc r3, r3, #0\n\t"
  19259. "lsr r7, r9, #16\n\t"
  19260. "mul r6, r7, r6\n\t"
  19261. "lsr r7, r6, #16\n\t"
  19262. "lsl r6, r6, #16\n\t"
  19263. "adds r4, r4, r6\n\t"
  19264. "adcs r5, r5, r7\n\t"
  19265. "adc r3, r3, #0\n\t"
  19266. "lsr r6, r11, #16\n\t"
  19267. "lsr r7, r9, #16\n\t"
  19268. "mul r7, r6, r7\n\t"
  19269. "adds r5, r5, r7\n\t"
  19270. "adc r3, r3, #0\n\t"
  19271. "lsl r7, r9, #16\n\t"
  19272. "lsr r7, r7, #16\n\t"
  19273. "mul r6, r7, r6\n\t"
  19274. "lsr r7, r6, #16\n\t"
  19275. "lsl r6, r6, #16\n\t"
  19276. "adds r4, r4, r6\n\t"
  19277. "adcs r5, r5, r7\n\t"
  19278. "adc r3, r3, #0\n\t"
  19279. #else
  19280. "umull r6, r7, r11, r9\n\t"
  19281. "adds r4, r4, r6\n\t"
  19282. "adcs r5, r5, r7\n\t"
  19283. "adc r3, r3, #0\n\t"
  19284. #endif
  19285. /* A[4] * B[3] */
  19286. "ldr r8, [%[a], #16]\n\t"
  19287. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19288. "lsl r6, r8, #16\n\t"
  19289. "lsl r7, r12, #16\n\t"
  19290. "lsr r6, r6, #16\n\t"
  19291. "lsr r7, r7, #16\n\t"
  19292. "mul r7, r6, r7\n\t"
  19293. "adds r4, r4, r7\n\t"
  19294. "adcs r5, r5, #0\n\t"
  19295. "adc r3, r3, #0\n\t"
  19296. "lsr r7, r12, #16\n\t"
  19297. "mul r6, r7, r6\n\t"
  19298. "lsr r7, r6, #16\n\t"
  19299. "lsl r6, r6, #16\n\t"
  19300. "adds r4, r4, r6\n\t"
  19301. "adcs r5, r5, r7\n\t"
  19302. "adc r3, r3, #0\n\t"
  19303. "lsr r6, r8, #16\n\t"
  19304. "lsr r7, r12, #16\n\t"
  19305. "mul r7, r6, r7\n\t"
  19306. "adds r5, r5, r7\n\t"
  19307. "adc r3, r3, #0\n\t"
  19308. "lsl r7, r12, #16\n\t"
  19309. "lsr r7, r7, #16\n\t"
  19310. "mul r6, r7, r6\n\t"
  19311. "lsr r7, r6, #16\n\t"
  19312. "lsl r6, r6, #16\n\t"
  19313. "adds r4, r4, r6\n\t"
  19314. "adcs r5, r5, r7\n\t"
  19315. "adc r3, r3, #0\n\t"
  19316. #else
  19317. "umull r6, r7, r8, r12\n\t"
  19318. "adds r4, r4, r6\n\t"
  19319. "adcs r5, r5, r7\n\t"
  19320. "adc r3, r3, #0\n\t"
  19321. #endif
  19322. /* A[5] * B[2] */
  19323. "ldr r8, [%[a], #20]\n\t"
  19324. "ldr r9, [%[b], #8]\n\t"
  19325. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19326. "lsl r6, r8, #16\n\t"
  19327. "lsl r7, r9, #16\n\t"
  19328. "lsr r6, r6, #16\n\t"
  19329. "lsr r7, r7, #16\n\t"
  19330. "mul r7, r6, r7\n\t"
  19331. "adds r4, r4, r7\n\t"
  19332. "adcs r5, r5, #0\n\t"
  19333. "adc r3, r3, #0\n\t"
  19334. "lsr r7, r9, #16\n\t"
  19335. "mul r6, r7, r6\n\t"
  19336. "lsr r7, r6, #16\n\t"
  19337. "lsl r6, r6, #16\n\t"
  19338. "adds r4, r4, r6\n\t"
  19339. "adcs r5, r5, r7\n\t"
  19340. "adc r3, r3, #0\n\t"
  19341. "lsr r6, r8, #16\n\t"
  19342. "lsr r7, r9, #16\n\t"
  19343. "mul r7, r6, r7\n\t"
  19344. "adds r5, r5, r7\n\t"
  19345. "adc r3, r3, #0\n\t"
  19346. "lsl r7, r9, #16\n\t"
  19347. "lsr r7, r7, #16\n\t"
  19348. "mul r6, r7, r6\n\t"
  19349. "lsr r7, r6, #16\n\t"
  19350. "lsl r6, r6, #16\n\t"
  19351. "adds r4, r4, r6\n\t"
  19352. "adcs r5, r5, r7\n\t"
  19353. "adc r3, r3, #0\n\t"
  19354. #else
  19355. "umull r6, r7, r8, r9\n\t"
  19356. "adds r4, r4, r6\n\t"
  19357. "adcs r5, r5, r7\n\t"
  19358. "adc r3, r3, #0\n\t"
  19359. #endif
  19360. /* A[6] * B[1] */
  19361. "ldr r8, [%[a], #24]\n\t"
  19362. "ldr r9, [%[b], #4]\n\t"
  19363. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19364. "lsl r6, r8, #16\n\t"
  19365. "lsl r7, r9, #16\n\t"
  19366. "lsr r6, r6, #16\n\t"
  19367. "lsr r7, r7, #16\n\t"
  19368. "mul r7, r6, r7\n\t"
  19369. "adds r4, r4, r7\n\t"
  19370. "adcs r5, r5, #0\n\t"
  19371. "adc r3, r3, #0\n\t"
  19372. "lsr r7, r9, #16\n\t"
  19373. "mul r6, r7, r6\n\t"
  19374. "lsr r7, r6, #16\n\t"
  19375. "lsl r6, r6, #16\n\t"
  19376. "adds r4, r4, r6\n\t"
  19377. "adcs r5, r5, r7\n\t"
  19378. "adc r3, r3, #0\n\t"
  19379. "lsr r6, r8, #16\n\t"
  19380. "lsr r7, r9, #16\n\t"
  19381. "mul r7, r6, r7\n\t"
  19382. "adds r5, r5, r7\n\t"
  19383. "adc r3, r3, #0\n\t"
  19384. "lsl r7, r9, #16\n\t"
  19385. "lsr r7, r7, #16\n\t"
  19386. "mul r6, r7, r6\n\t"
  19387. "lsr r7, r6, #16\n\t"
  19388. "lsl r6, r6, #16\n\t"
  19389. "adds r4, r4, r6\n\t"
  19390. "adcs r5, r5, r7\n\t"
  19391. "adc r3, r3, #0\n\t"
  19392. #else
  19393. "umull r6, r7, r8, r9\n\t"
  19394. "adds r4, r4, r6\n\t"
  19395. "adcs r5, r5, r7\n\t"
  19396. "adc r3, r3, #0\n\t"
  19397. #endif
  19398. /* A[7] * B[0] */
  19399. "ldr r8, [%[a], #28]\n\t"
  19400. "ldr r9, [%[b]]\n\t"
  19401. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19402. "lsl r6, r8, #16\n\t"
  19403. "lsl r7, r9, #16\n\t"
  19404. "lsr r6, r6, #16\n\t"
  19405. "lsr r7, r7, #16\n\t"
  19406. "mul r7, r6, r7\n\t"
  19407. "adds r4, r4, r7\n\t"
  19408. "adcs r5, r5, #0\n\t"
  19409. "adc r3, r3, #0\n\t"
  19410. "lsr r7, r9, #16\n\t"
  19411. "mul r6, r7, r6\n\t"
  19412. "lsr r7, r6, #16\n\t"
  19413. "lsl r6, r6, #16\n\t"
  19414. "adds r4, r4, r6\n\t"
  19415. "adcs r5, r5, r7\n\t"
  19416. "adc r3, r3, #0\n\t"
  19417. "lsr r6, r8, #16\n\t"
  19418. "lsr r7, r9, #16\n\t"
  19419. "mul r7, r6, r7\n\t"
  19420. "adds r5, r5, r7\n\t"
  19421. "adc r3, r3, #0\n\t"
  19422. "lsl r7, r9, #16\n\t"
  19423. "lsr r7, r7, #16\n\t"
  19424. "mul r6, r7, r6\n\t"
  19425. "lsr r7, r6, #16\n\t"
  19426. "lsl r6, r6, #16\n\t"
  19427. "adds r4, r4, r6\n\t"
  19428. "adcs r5, r5, r7\n\t"
  19429. "adc r3, r3, #0\n\t"
  19430. #else
  19431. "umull r6, r7, r8, r9\n\t"
  19432. "adds r4, r4, r6\n\t"
  19433. "adcs r5, r5, r7\n\t"
  19434. "adc r3, r3, #0\n\t"
  19435. #endif
  19436. "str r4, [sp, #28]\n\t"
  19437. /* A[8] * B[0] */
  19438. "ldr r8, [%[a], #32]\n\t"
  19439. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19440. "lsl r6, r8, #16\n\t"
  19441. "lsl r7, r9, #16\n\t"
  19442. "lsr r6, r6, #16\n\t"
  19443. "lsr r7, r7, #16\n\t"
  19444. "mul r7, r6, r7\n\t"
  19445. "adds r5, r5, r7\n\t"
  19446. "adcs r3, r3, #0\n\t"
  19447. "mov r4, #0\n\t"
  19448. "adc r4, r4, #0\n\t"
  19449. "lsr r7, r9, #16\n\t"
  19450. "mul r6, r7, r6\n\t"
  19451. "lsr r7, r6, #16\n\t"
  19452. "lsl r6, r6, #16\n\t"
  19453. "adds r5, r5, r6\n\t"
  19454. "adcs r3, r3, r7\n\t"
  19455. "adc r4, r4, #0\n\t"
  19456. "lsr r6, r8, #16\n\t"
  19457. "lsr r7, r9, #16\n\t"
  19458. "mul r7, r6, r7\n\t"
  19459. "adds r3, r3, r7\n\t"
  19460. "adc r4, r4, #0\n\t"
  19461. "lsl r7, r9, #16\n\t"
  19462. "lsr r7, r7, #16\n\t"
  19463. "mul r6, r7, r6\n\t"
  19464. "lsr r7, r6, #16\n\t"
  19465. "lsl r6, r6, #16\n\t"
  19466. "adds r5, r5, r6\n\t"
  19467. "adcs r3, r3, r7\n\t"
  19468. "adc r4, r4, #0\n\t"
  19469. #else
  19470. "umull r6, r7, r8, r9\n\t"
  19471. "adds r5, r5, r6\n\t"
  19472. "adcs r3, r3, r7\n\t"
  19473. "mov r4, #0\n\t"
  19474. "adc r4, r4, #0\n\t"
  19475. #endif
  19476. /* A[7] * B[1] */
  19477. "ldr r8, [%[a], #28]\n\t"
  19478. "ldr r9, [%[b], #4]\n\t"
  19479. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19480. "lsl r6, r8, #16\n\t"
  19481. "lsl r7, r9, #16\n\t"
  19482. "lsr r6, r6, #16\n\t"
  19483. "lsr r7, r7, #16\n\t"
  19484. "mul r7, r6, r7\n\t"
  19485. "adds r5, r5, r7\n\t"
  19486. "adcs r3, r3, #0\n\t"
  19487. "adc r4, r4, #0\n\t"
  19488. "lsr r7, r9, #16\n\t"
  19489. "mul r6, r7, r6\n\t"
  19490. "lsr r7, r6, #16\n\t"
  19491. "lsl r6, r6, #16\n\t"
  19492. "adds r5, r5, r6\n\t"
  19493. "adcs r3, r3, r7\n\t"
  19494. "adc r4, r4, #0\n\t"
  19495. "lsr r6, r8, #16\n\t"
  19496. "lsr r7, r9, #16\n\t"
  19497. "mul r7, r6, r7\n\t"
  19498. "adds r3, r3, r7\n\t"
  19499. "adc r4, r4, #0\n\t"
  19500. "lsl r7, r9, #16\n\t"
  19501. "lsr r7, r7, #16\n\t"
  19502. "mul r6, r7, r6\n\t"
  19503. "lsr r7, r6, #16\n\t"
  19504. "lsl r6, r6, #16\n\t"
  19505. "adds r5, r5, r6\n\t"
  19506. "adcs r3, r3, r7\n\t"
  19507. "adc r4, r4, #0\n\t"
  19508. #else
  19509. "umull r6, r7, r8, r9\n\t"
  19510. "adds r5, r5, r6\n\t"
  19511. "adcs r3, r3, r7\n\t"
  19512. "adc r4, r4, #0\n\t"
  19513. #endif
  19514. /* A[6] * B[2] */
  19515. "ldr r8, [%[a], #24]\n\t"
  19516. "ldr r9, [%[b], #8]\n\t"
  19517. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19518. "lsl r6, r8, #16\n\t"
  19519. "lsl r7, r9, #16\n\t"
  19520. "lsr r6, r6, #16\n\t"
  19521. "lsr r7, r7, #16\n\t"
  19522. "mul r7, r6, r7\n\t"
  19523. "adds r5, r5, r7\n\t"
  19524. "adcs r3, r3, #0\n\t"
  19525. "adc r4, r4, #0\n\t"
  19526. "lsr r7, r9, #16\n\t"
  19527. "mul r6, r7, r6\n\t"
  19528. "lsr r7, r6, #16\n\t"
  19529. "lsl r6, r6, #16\n\t"
  19530. "adds r5, r5, r6\n\t"
  19531. "adcs r3, r3, r7\n\t"
  19532. "adc r4, r4, #0\n\t"
  19533. "lsr r6, r8, #16\n\t"
  19534. "lsr r7, r9, #16\n\t"
  19535. "mul r7, r6, r7\n\t"
  19536. "adds r3, r3, r7\n\t"
  19537. "adc r4, r4, #0\n\t"
  19538. "lsl r7, r9, #16\n\t"
  19539. "lsr r7, r7, #16\n\t"
  19540. "mul r6, r7, r6\n\t"
  19541. "lsr r7, r6, #16\n\t"
  19542. "lsl r6, r6, #16\n\t"
  19543. "adds r5, r5, r6\n\t"
  19544. "adcs r3, r3, r7\n\t"
  19545. "adc r4, r4, #0\n\t"
  19546. #else
  19547. "umull r6, r7, r8, r9\n\t"
  19548. "adds r5, r5, r6\n\t"
  19549. "adcs r3, r3, r7\n\t"
  19550. "adc r4, r4, #0\n\t"
  19551. #endif
  19552. /* A[5] * B[3] */
  19553. "ldr r8, [%[a], #20]\n\t"
  19554. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19555. "lsl r6, r8, #16\n\t"
  19556. "lsl r7, r12, #16\n\t"
  19557. "lsr r6, r6, #16\n\t"
  19558. "lsr r7, r7, #16\n\t"
  19559. "mul r7, r6, r7\n\t"
  19560. "adds r5, r5, r7\n\t"
  19561. "adcs r3, r3, #0\n\t"
  19562. "adc r4, r4, #0\n\t"
  19563. "lsr r7, r12, #16\n\t"
  19564. "mul r6, r7, r6\n\t"
  19565. "lsr r7, r6, #16\n\t"
  19566. "lsl r6, r6, #16\n\t"
  19567. "adds r5, r5, r6\n\t"
  19568. "adcs r3, r3, r7\n\t"
  19569. "adc r4, r4, #0\n\t"
  19570. "lsr r6, r8, #16\n\t"
  19571. "lsr r7, r12, #16\n\t"
  19572. "mul r7, r6, r7\n\t"
  19573. "adds r3, r3, r7\n\t"
  19574. "adc r4, r4, #0\n\t"
  19575. "lsl r7, r12, #16\n\t"
  19576. "lsr r7, r7, #16\n\t"
  19577. "mul r6, r7, r6\n\t"
  19578. "lsr r7, r6, #16\n\t"
  19579. "lsl r6, r6, #16\n\t"
  19580. "adds r5, r5, r6\n\t"
  19581. "adcs r3, r3, r7\n\t"
  19582. "adc r4, r4, #0\n\t"
  19583. #else
  19584. "umull r6, r7, r8, r12\n\t"
  19585. "adds r5, r5, r6\n\t"
  19586. "adcs r3, r3, r7\n\t"
  19587. "adc r4, r4, #0\n\t"
  19588. #endif
  19589. /* A[4] * B[4] */
  19590. "ldr r11, [%[a], #16]\n\t"
  19591. "ldr r12, [%[b], #16]\n\t"
  19592. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19593. "lsl r6, r11, #16\n\t"
  19594. "lsl r7, r12, #16\n\t"
  19595. "lsr r6, r6, #16\n\t"
  19596. "lsr r7, r7, #16\n\t"
  19597. "mul r7, r6, r7\n\t"
  19598. "adds r5, r5, r7\n\t"
  19599. "adcs r3, r3, #0\n\t"
  19600. "adc r4, r4, #0\n\t"
  19601. "lsr r7, r12, #16\n\t"
  19602. "mul r6, r7, r6\n\t"
  19603. "lsr r7, r6, #16\n\t"
  19604. "lsl r6, r6, #16\n\t"
  19605. "adds r5, r5, r6\n\t"
  19606. "adcs r3, r3, r7\n\t"
  19607. "adc r4, r4, #0\n\t"
  19608. "lsr r6, r11, #16\n\t"
  19609. "lsr r7, r12, #16\n\t"
  19610. "mul r7, r6, r7\n\t"
  19611. "adds r3, r3, r7\n\t"
  19612. "adc r4, r4, #0\n\t"
  19613. "lsl r7, r12, #16\n\t"
  19614. "lsr r7, r7, #16\n\t"
  19615. "mul r6, r7, r6\n\t"
  19616. "lsr r7, r6, #16\n\t"
  19617. "lsl r6, r6, #16\n\t"
  19618. "adds r5, r5, r6\n\t"
  19619. "adcs r3, r3, r7\n\t"
  19620. "adc r4, r4, #0\n\t"
  19621. #else
  19622. "umull r6, r7, r11, r12\n\t"
  19623. "adds r5, r5, r6\n\t"
  19624. "adcs r3, r3, r7\n\t"
  19625. "adc r4, r4, #0\n\t"
  19626. #endif
  19627. /* A[3] * B[5] */
  19628. "ldr r8, [%[a], #12]\n\t"
  19629. "ldr r9, [%[b], #20]\n\t"
  19630. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19631. "lsl r6, r8, #16\n\t"
  19632. "lsl r7, r9, #16\n\t"
  19633. "lsr r6, r6, #16\n\t"
  19634. "lsr r7, r7, #16\n\t"
  19635. "mul r7, r6, r7\n\t"
  19636. "adds r5, r5, r7\n\t"
  19637. "adcs r3, r3, #0\n\t"
  19638. "adc r4, r4, #0\n\t"
  19639. "lsr r7, r9, #16\n\t"
  19640. "mul r6, r7, r6\n\t"
  19641. "lsr r7, r6, #16\n\t"
  19642. "lsl r6, r6, #16\n\t"
  19643. "adds r5, r5, r6\n\t"
  19644. "adcs r3, r3, r7\n\t"
  19645. "adc r4, r4, #0\n\t"
  19646. "lsr r6, r8, #16\n\t"
  19647. "lsr r7, r9, #16\n\t"
  19648. "mul r7, r6, r7\n\t"
  19649. "adds r3, r3, r7\n\t"
  19650. "adc r4, r4, #0\n\t"
  19651. "lsl r7, r9, #16\n\t"
  19652. "lsr r7, r7, #16\n\t"
  19653. "mul r6, r7, r6\n\t"
  19654. "lsr r7, r6, #16\n\t"
  19655. "lsl r6, r6, #16\n\t"
  19656. "adds r5, r5, r6\n\t"
  19657. "adcs r3, r3, r7\n\t"
  19658. "adc r4, r4, #0\n\t"
  19659. #else
  19660. "umull r6, r7, r8, r9\n\t"
  19661. "adds r5, r5, r6\n\t"
  19662. "adcs r3, r3, r7\n\t"
  19663. "adc r4, r4, #0\n\t"
  19664. #endif
  19665. /* A[2] * B[6] */
  19666. "ldr r8, [%[a], #8]\n\t"
  19667. "ldr r9, [%[b], #24]\n\t"
  19668. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19669. "lsl r6, r8, #16\n\t"
  19670. "lsl r7, r9, #16\n\t"
  19671. "lsr r6, r6, #16\n\t"
  19672. "lsr r7, r7, #16\n\t"
  19673. "mul r7, r6, r7\n\t"
  19674. "adds r5, r5, r7\n\t"
  19675. "adcs r3, r3, #0\n\t"
  19676. "adc r4, r4, #0\n\t"
  19677. "lsr r7, r9, #16\n\t"
  19678. "mul r6, r7, r6\n\t"
  19679. "lsr r7, r6, #16\n\t"
  19680. "lsl r6, r6, #16\n\t"
  19681. "adds r5, r5, r6\n\t"
  19682. "adcs r3, r3, r7\n\t"
  19683. "adc r4, r4, #0\n\t"
  19684. "lsr r6, r8, #16\n\t"
  19685. "lsr r7, r9, #16\n\t"
  19686. "mul r7, r6, r7\n\t"
  19687. "adds r3, r3, r7\n\t"
  19688. "adc r4, r4, #0\n\t"
  19689. "lsl r7, r9, #16\n\t"
  19690. "lsr r7, r7, #16\n\t"
  19691. "mul r6, r7, r6\n\t"
  19692. "lsr r7, r6, #16\n\t"
  19693. "lsl r6, r6, #16\n\t"
  19694. "adds r5, r5, r6\n\t"
  19695. "adcs r3, r3, r7\n\t"
  19696. "adc r4, r4, #0\n\t"
  19697. #else
  19698. "umull r6, r7, r8, r9\n\t"
  19699. "adds r5, r5, r6\n\t"
  19700. "adcs r3, r3, r7\n\t"
  19701. "adc r4, r4, #0\n\t"
  19702. #endif
  19703. /* A[1] * B[7] */
  19704. "ldr r8, [%[a], #4]\n\t"
  19705. "ldr r9, [%[b], #28]\n\t"
  19706. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19707. "lsl r6, r8, #16\n\t"
  19708. "lsl r7, r9, #16\n\t"
  19709. "lsr r6, r6, #16\n\t"
  19710. "lsr r7, r7, #16\n\t"
  19711. "mul r7, r6, r7\n\t"
  19712. "adds r5, r5, r7\n\t"
  19713. "adcs r3, r3, #0\n\t"
  19714. "adc r4, r4, #0\n\t"
  19715. "lsr r7, r9, #16\n\t"
  19716. "mul r6, r7, r6\n\t"
  19717. "lsr r7, r6, #16\n\t"
  19718. "lsl r6, r6, #16\n\t"
  19719. "adds r5, r5, r6\n\t"
  19720. "adcs r3, r3, r7\n\t"
  19721. "adc r4, r4, #0\n\t"
  19722. "lsr r6, r8, #16\n\t"
  19723. "lsr r7, r9, #16\n\t"
  19724. "mul r7, r6, r7\n\t"
  19725. "adds r3, r3, r7\n\t"
  19726. "adc r4, r4, #0\n\t"
  19727. "lsl r7, r9, #16\n\t"
  19728. "lsr r7, r7, #16\n\t"
  19729. "mul r6, r7, r6\n\t"
  19730. "lsr r7, r6, #16\n\t"
  19731. "lsl r6, r6, #16\n\t"
  19732. "adds r5, r5, r6\n\t"
  19733. "adcs r3, r3, r7\n\t"
  19734. "adc r4, r4, #0\n\t"
  19735. #else
  19736. "umull r6, r7, r8, r9\n\t"
  19737. "adds r5, r5, r6\n\t"
  19738. "adcs r3, r3, r7\n\t"
  19739. "adc r4, r4, #0\n\t"
  19740. #endif
  19741. /* A[0] * B[8] */
  19742. "ldr r8, [%[a]]\n\t"
  19743. "ldr r9, [%[b], #32]\n\t"
  19744. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19745. "lsl r6, r8, #16\n\t"
  19746. "lsl r7, r9, #16\n\t"
  19747. "lsr r6, r6, #16\n\t"
  19748. "lsr r7, r7, #16\n\t"
  19749. "mul r7, r6, r7\n\t"
  19750. "adds r5, r5, r7\n\t"
  19751. "adcs r3, r3, #0\n\t"
  19752. "adc r4, r4, #0\n\t"
  19753. "lsr r7, r9, #16\n\t"
  19754. "mul r6, r7, r6\n\t"
  19755. "lsr r7, r6, #16\n\t"
  19756. "lsl r6, r6, #16\n\t"
  19757. "adds r5, r5, r6\n\t"
  19758. "adcs r3, r3, r7\n\t"
  19759. "adc r4, r4, #0\n\t"
  19760. "lsr r6, r8, #16\n\t"
  19761. "lsr r7, r9, #16\n\t"
  19762. "mul r7, r6, r7\n\t"
  19763. "adds r3, r3, r7\n\t"
  19764. "adc r4, r4, #0\n\t"
  19765. "lsl r7, r9, #16\n\t"
  19766. "lsr r7, r7, #16\n\t"
  19767. "mul r6, r7, r6\n\t"
  19768. "lsr r7, r6, #16\n\t"
  19769. "lsl r6, r6, #16\n\t"
  19770. "adds r5, r5, r6\n\t"
  19771. "adcs r3, r3, r7\n\t"
  19772. "adc r4, r4, #0\n\t"
  19773. #else
  19774. "umull r6, r7, r8, r9\n\t"
  19775. "adds r5, r5, r6\n\t"
  19776. "adcs r3, r3, r7\n\t"
  19777. "adc r4, r4, #0\n\t"
  19778. #endif
  19779. "str r5, [sp, #32]\n\t"
  19780. /* A[0] * B[9] */
  19781. "ldr r9, [%[b], #36]\n\t"
  19782. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19783. "lsl r6, r8, #16\n\t"
  19784. "lsl r7, r9, #16\n\t"
  19785. "lsr r6, r6, #16\n\t"
  19786. "lsr r7, r7, #16\n\t"
  19787. "mul r7, r6, r7\n\t"
  19788. "adds r3, r3, r7\n\t"
  19789. "adcs r4, r4, #0\n\t"
  19790. "mov r5, #0\n\t"
  19791. "adc r5, r5, #0\n\t"
  19792. "lsr r7, r9, #16\n\t"
  19793. "mul r6, r7, r6\n\t"
  19794. "lsr r7, r6, #16\n\t"
  19795. "lsl r6, r6, #16\n\t"
  19796. "adds r3, r3, r6\n\t"
  19797. "adcs r4, r4, r7\n\t"
  19798. "adc r5, r5, #0\n\t"
  19799. "lsr r6, r8, #16\n\t"
  19800. "lsr r7, r9, #16\n\t"
  19801. "mul r7, r6, r7\n\t"
  19802. "adds r4, r4, r7\n\t"
  19803. "adc r5, r5, #0\n\t"
  19804. "lsl r7, r9, #16\n\t"
  19805. "lsr r7, r7, #16\n\t"
  19806. "mul r6, r7, r6\n\t"
  19807. "lsr r7, r6, #16\n\t"
  19808. "lsl r6, r6, #16\n\t"
  19809. "adds r3, r3, r6\n\t"
  19810. "adcs r4, r4, r7\n\t"
  19811. "adc r5, r5, #0\n\t"
  19812. #else
  19813. "umull r6, r7, r8, r9\n\t"
  19814. "adds r3, r3, r6\n\t"
  19815. "adcs r4, r4, r7\n\t"
  19816. "mov r5, #0\n\t"
  19817. "adc r5, r5, #0\n\t"
  19818. #endif
  19819. /* A[1] * B[8] */
  19820. "ldr r8, [%[a], #4]\n\t"
  19821. "ldr r9, [%[b], #32]\n\t"
  19822. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19823. "lsl r6, r8, #16\n\t"
  19824. "lsl r7, r9, #16\n\t"
  19825. "lsr r6, r6, #16\n\t"
  19826. "lsr r7, r7, #16\n\t"
  19827. "mul r7, r6, r7\n\t"
  19828. "adds r3, r3, r7\n\t"
  19829. "adcs r4, r4, #0\n\t"
  19830. "adc r5, r5, #0\n\t"
  19831. "lsr r7, r9, #16\n\t"
  19832. "mul r6, r7, r6\n\t"
  19833. "lsr r7, r6, #16\n\t"
  19834. "lsl r6, r6, #16\n\t"
  19835. "adds r3, r3, r6\n\t"
  19836. "adcs r4, r4, r7\n\t"
  19837. "adc r5, r5, #0\n\t"
  19838. "lsr r6, r8, #16\n\t"
  19839. "lsr r7, r9, #16\n\t"
  19840. "mul r7, r6, r7\n\t"
  19841. "adds r4, r4, r7\n\t"
  19842. "adc r5, r5, #0\n\t"
  19843. "lsl r7, r9, #16\n\t"
  19844. "lsr r7, r7, #16\n\t"
  19845. "mul r6, r7, r6\n\t"
  19846. "lsr r7, r6, #16\n\t"
  19847. "lsl r6, r6, #16\n\t"
  19848. "adds r3, r3, r6\n\t"
  19849. "adcs r4, r4, r7\n\t"
  19850. "adc r5, r5, #0\n\t"
  19851. #else
  19852. "umull r6, r7, r8, r9\n\t"
  19853. "adds r3, r3, r6\n\t"
  19854. "adcs r4, r4, r7\n\t"
  19855. "adc r5, r5, #0\n\t"
  19856. #endif
  19857. /* A[2] * B[7] */
  19858. "ldr r8, [%[a], #8]\n\t"
  19859. "ldr r9, [%[b], #28]\n\t"
  19860. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19861. "lsl r6, r8, #16\n\t"
  19862. "lsl r7, r9, #16\n\t"
  19863. "lsr r6, r6, #16\n\t"
  19864. "lsr r7, r7, #16\n\t"
  19865. "mul r7, r6, r7\n\t"
  19866. "adds r3, r3, r7\n\t"
  19867. "adcs r4, r4, #0\n\t"
  19868. "adc r5, r5, #0\n\t"
  19869. "lsr r7, r9, #16\n\t"
  19870. "mul r6, r7, r6\n\t"
  19871. "lsr r7, r6, #16\n\t"
  19872. "lsl r6, r6, #16\n\t"
  19873. "adds r3, r3, r6\n\t"
  19874. "adcs r4, r4, r7\n\t"
  19875. "adc r5, r5, #0\n\t"
  19876. "lsr r6, r8, #16\n\t"
  19877. "lsr r7, r9, #16\n\t"
  19878. "mul r7, r6, r7\n\t"
  19879. "adds r4, r4, r7\n\t"
  19880. "adc r5, r5, #0\n\t"
  19881. "lsl r7, r9, #16\n\t"
  19882. "lsr r7, r7, #16\n\t"
  19883. "mul r6, r7, r6\n\t"
  19884. "lsr r7, r6, #16\n\t"
  19885. "lsl r6, r6, #16\n\t"
  19886. "adds r3, r3, r6\n\t"
  19887. "adcs r4, r4, r7\n\t"
  19888. "adc r5, r5, #0\n\t"
  19889. #else
  19890. "umull r6, r7, r8, r9\n\t"
  19891. "adds r3, r3, r6\n\t"
  19892. "adcs r4, r4, r7\n\t"
  19893. "adc r5, r5, #0\n\t"
  19894. #endif
  19895. /* A[3] * B[6] */
  19896. "ldr r8, [%[a], #12]\n\t"
  19897. "ldr r9, [%[b], #24]\n\t"
  19898. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19899. "lsl r6, r8, #16\n\t"
  19900. "lsl r7, r9, #16\n\t"
  19901. "lsr r6, r6, #16\n\t"
  19902. "lsr r7, r7, #16\n\t"
  19903. "mul r7, r6, r7\n\t"
  19904. "adds r3, r3, r7\n\t"
  19905. "adcs r4, r4, #0\n\t"
  19906. "adc r5, r5, #0\n\t"
  19907. "lsr r7, r9, #16\n\t"
  19908. "mul r6, r7, r6\n\t"
  19909. "lsr r7, r6, #16\n\t"
  19910. "lsl r6, r6, #16\n\t"
  19911. "adds r3, r3, r6\n\t"
  19912. "adcs r4, r4, r7\n\t"
  19913. "adc r5, r5, #0\n\t"
  19914. "lsr r6, r8, #16\n\t"
  19915. "lsr r7, r9, #16\n\t"
  19916. "mul r7, r6, r7\n\t"
  19917. "adds r4, r4, r7\n\t"
  19918. "adc r5, r5, #0\n\t"
  19919. "lsl r7, r9, #16\n\t"
  19920. "lsr r7, r7, #16\n\t"
  19921. "mul r6, r7, r6\n\t"
  19922. "lsr r7, r6, #16\n\t"
  19923. "lsl r6, r6, #16\n\t"
  19924. "adds r3, r3, r6\n\t"
  19925. "adcs r4, r4, r7\n\t"
  19926. "adc r5, r5, #0\n\t"
  19927. #else
  19928. "umull r6, r7, r8, r9\n\t"
  19929. "adds r3, r3, r6\n\t"
  19930. "adcs r4, r4, r7\n\t"
  19931. "adc r5, r5, #0\n\t"
  19932. #endif
  19933. /* A[4] * B[5] */
  19934. "ldr r9, [%[b], #20]\n\t"
  19935. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19936. "lsl r6, r11, #16\n\t"
  19937. "lsl r7, r9, #16\n\t"
  19938. "lsr r6, r6, #16\n\t"
  19939. "lsr r7, r7, #16\n\t"
  19940. "mul r7, r6, r7\n\t"
  19941. "adds r3, r3, r7\n\t"
  19942. "adcs r4, r4, #0\n\t"
  19943. "adc r5, r5, #0\n\t"
  19944. "lsr r7, r9, #16\n\t"
  19945. "mul r6, r7, r6\n\t"
  19946. "lsr r7, r6, #16\n\t"
  19947. "lsl r6, r6, #16\n\t"
  19948. "adds r3, r3, r6\n\t"
  19949. "adcs r4, r4, r7\n\t"
  19950. "adc r5, r5, #0\n\t"
  19951. "lsr r6, r11, #16\n\t"
  19952. "lsr r7, r9, #16\n\t"
  19953. "mul r7, r6, r7\n\t"
  19954. "adds r4, r4, r7\n\t"
  19955. "adc r5, r5, #0\n\t"
  19956. "lsl r7, r9, #16\n\t"
  19957. "lsr r7, r7, #16\n\t"
  19958. "mul r6, r7, r6\n\t"
  19959. "lsr r7, r6, #16\n\t"
  19960. "lsl r6, r6, #16\n\t"
  19961. "adds r3, r3, r6\n\t"
  19962. "adcs r4, r4, r7\n\t"
  19963. "adc r5, r5, #0\n\t"
  19964. #else
  19965. "umull r6, r7, r11, r9\n\t"
  19966. "adds r3, r3, r6\n\t"
  19967. "adcs r4, r4, r7\n\t"
  19968. "adc r5, r5, #0\n\t"
  19969. #endif
  19970. /* A[5] * B[4] */
  19971. "ldr r8, [%[a], #20]\n\t"
  19972. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  19973. "lsl r6, r8, #16\n\t"
  19974. "lsl r7, r12, #16\n\t"
  19975. "lsr r6, r6, #16\n\t"
  19976. "lsr r7, r7, #16\n\t"
  19977. "mul r7, r6, r7\n\t"
  19978. "adds r3, r3, r7\n\t"
  19979. "adcs r4, r4, #0\n\t"
  19980. "adc r5, r5, #0\n\t"
  19981. "lsr r7, r12, #16\n\t"
  19982. "mul r6, r7, r6\n\t"
  19983. "lsr r7, r6, #16\n\t"
  19984. "lsl r6, r6, #16\n\t"
  19985. "adds r3, r3, r6\n\t"
  19986. "adcs r4, r4, r7\n\t"
  19987. "adc r5, r5, #0\n\t"
  19988. "lsr r6, r8, #16\n\t"
  19989. "lsr r7, r12, #16\n\t"
  19990. "mul r7, r6, r7\n\t"
  19991. "adds r4, r4, r7\n\t"
  19992. "adc r5, r5, #0\n\t"
  19993. "lsl r7, r12, #16\n\t"
  19994. "lsr r7, r7, #16\n\t"
  19995. "mul r6, r7, r6\n\t"
  19996. "lsr r7, r6, #16\n\t"
  19997. "lsl r6, r6, #16\n\t"
  19998. "adds r3, r3, r6\n\t"
  19999. "adcs r4, r4, r7\n\t"
  20000. "adc r5, r5, #0\n\t"
  20001. #else
  20002. "umull r6, r7, r8, r12\n\t"
  20003. "adds r3, r3, r6\n\t"
  20004. "adcs r4, r4, r7\n\t"
  20005. "adc r5, r5, #0\n\t"
  20006. #endif
  20007. /* A[6] * B[3] */
  20008. "ldr r8, [%[a], #24]\n\t"
  20009. "ldr r9, [%[b], #12]\n\t"
  20010. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20011. "lsl r6, r8, #16\n\t"
  20012. "lsl r7, r9, #16\n\t"
  20013. "lsr r6, r6, #16\n\t"
  20014. "lsr r7, r7, #16\n\t"
  20015. "mul r7, r6, r7\n\t"
  20016. "adds r3, r3, r7\n\t"
  20017. "adcs r4, r4, #0\n\t"
  20018. "adc r5, r5, #0\n\t"
  20019. "lsr r7, r9, #16\n\t"
  20020. "mul r6, r7, r6\n\t"
  20021. "lsr r7, r6, #16\n\t"
  20022. "lsl r6, r6, #16\n\t"
  20023. "adds r3, r3, r6\n\t"
  20024. "adcs r4, r4, r7\n\t"
  20025. "adc r5, r5, #0\n\t"
  20026. "lsr r6, r8, #16\n\t"
  20027. "lsr r7, r9, #16\n\t"
  20028. "mul r7, r6, r7\n\t"
  20029. "adds r4, r4, r7\n\t"
  20030. "adc r5, r5, #0\n\t"
  20031. "lsl r7, r9, #16\n\t"
  20032. "lsr r7, r7, #16\n\t"
  20033. "mul r6, r7, r6\n\t"
  20034. "lsr r7, r6, #16\n\t"
  20035. "lsl r6, r6, #16\n\t"
  20036. "adds r3, r3, r6\n\t"
  20037. "adcs r4, r4, r7\n\t"
  20038. "adc r5, r5, #0\n\t"
  20039. #else
  20040. "umull r6, r7, r8, r9\n\t"
  20041. "adds r3, r3, r6\n\t"
  20042. "adcs r4, r4, r7\n\t"
  20043. "adc r5, r5, #0\n\t"
  20044. #endif
  20045. /* A[7] * B[2] */
  20046. "ldr r8, [%[a], #28]\n\t"
  20047. "ldr r9, [%[b], #8]\n\t"
  20048. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20049. "lsl r6, r8, #16\n\t"
  20050. "lsl r7, r9, #16\n\t"
  20051. "lsr r6, r6, #16\n\t"
  20052. "lsr r7, r7, #16\n\t"
  20053. "mul r7, r6, r7\n\t"
  20054. "adds r3, r3, r7\n\t"
  20055. "adcs r4, r4, #0\n\t"
  20056. "adc r5, r5, #0\n\t"
  20057. "lsr r7, r9, #16\n\t"
  20058. "mul r6, r7, r6\n\t"
  20059. "lsr r7, r6, #16\n\t"
  20060. "lsl r6, r6, #16\n\t"
  20061. "adds r3, r3, r6\n\t"
  20062. "adcs r4, r4, r7\n\t"
  20063. "adc r5, r5, #0\n\t"
  20064. "lsr r6, r8, #16\n\t"
  20065. "lsr r7, r9, #16\n\t"
  20066. "mul r7, r6, r7\n\t"
  20067. "adds r4, r4, r7\n\t"
  20068. "adc r5, r5, #0\n\t"
  20069. "lsl r7, r9, #16\n\t"
  20070. "lsr r7, r7, #16\n\t"
  20071. "mul r6, r7, r6\n\t"
  20072. "lsr r7, r6, #16\n\t"
  20073. "lsl r6, r6, #16\n\t"
  20074. "adds r3, r3, r6\n\t"
  20075. "adcs r4, r4, r7\n\t"
  20076. "adc r5, r5, #0\n\t"
  20077. #else
  20078. "umull r6, r7, r8, r9\n\t"
  20079. "adds r3, r3, r6\n\t"
  20080. "adcs r4, r4, r7\n\t"
  20081. "adc r5, r5, #0\n\t"
  20082. #endif
  20083. /* A[8] * B[1] */
  20084. "ldr r8, [%[a], #32]\n\t"
  20085. "ldr r9, [%[b], #4]\n\t"
  20086. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20087. "lsl r6, r8, #16\n\t"
  20088. "lsl r7, r9, #16\n\t"
  20089. "lsr r6, r6, #16\n\t"
  20090. "lsr r7, r7, #16\n\t"
  20091. "mul r7, r6, r7\n\t"
  20092. "adds r3, r3, r7\n\t"
  20093. "adcs r4, r4, #0\n\t"
  20094. "adc r5, r5, #0\n\t"
  20095. "lsr r7, r9, #16\n\t"
  20096. "mul r6, r7, r6\n\t"
  20097. "lsr r7, r6, #16\n\t"
  20098. "lsl r6, r6, #16\n\t"
  20099. "adds r3, r3, r6\n\t"
  20100. "adcs r4, r4, r7\n\t"
  20101. "adc r5, r5, #0\n\t"
  20102. "lsr r6, r8, #16\n\t"
  20103. "lsr r7, r9, #16\n\t"
  20104. "mul r7, r6, r7\n\t"
  20105. "adds r4, r4, r7\n\t"
  20106. "adc r5, r5, #0\n\t"
  20107. "lsl r7, r9, #16\n\t"
  20108. "lsr r7, r7, #16\n\t"
  20109. "mul r6, r7, r6\n\t"
  20110. "lsr r7, r6, #16\n\t"
  20111. "lsl r6, r6, #16\n\t"
  20112. "adds r3, r3, r6\n\t"
  20113. "adcs r4, r4, r7\n\t"
  20114. "adc r5, r5, #0\n\t"
  20115. #else
  20116. "umull r6, r7, r8, r9\n\t"
  20117. "adds r3, r3, r6\n\t"
  20118. "adcs r4, r4, r7\n\t"
  20119. "adc r5, r5, #0\n\t"
  20120. #endif
  20121. /* A[9] * B[0] */
  20122. "ldr r8, [%[a], #36]\n\t"
  20123. "ldr r9, [%[b]]\n\t"
  20124. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20125. "lsl r6, r8, #16\n\t"
  20126. "lsl r7, r9, #16\n\t"
  20127. "lsr r6, r6, #16\n\t"
  20128. "lsr r7, r7, #16\n\t"
  20129. "mul r7, r6, r7\n\t"
  20130. "adds r3, r3, r7\n\t"
  20131. "adcs r4, r4, #0\n\t"
  20132. "adc r5, r5, #0\n\t"
  20133. "lsr r7, r9, #16\n\t"
  20134. "mul r6, r7, r6\n\t"
  20135. "lsr r7, r6, #16\n\t"
  20136. "lsl r6, r6, #16\n\t"
  20137. "adds r3, r3, r6\n\t"
  20138. "adcs r4, r4, r7\n\t"
  20139. "adc r5, r5, #0\n\t"
  20140. "lsr r6, r8, #16\n\t"
  20141. "lsr r7, r9, #16\n\t"
  20142. "mul r7, r6, r7\n\t"
  20143. "adds r4, r4, r7\n\t"
  20144. "adc r5, r5, #0\n\t"
  20145. "lsl r7, r9, #16\n\t"
  20146. "lsr r7, r7, #16\n\t"
  20147. "mul r6, r7, r6\n\t"
  20148. "lsr r7, r6, #16\n\t"
  20149. "lsl r6, r6, #16\n\t"
  20150. "adds r3, r3, r6\n\t"
  20151. "adcs r4, r4, r7\n\t"
  20152. "adc r5, r5, #0\n\t"
  20153. #else
  20154. "umull r6, r7, r8, r9\n\t"
  20155. "adds r3, r3, r6\n\t"
  20156. "adcs r4, r4, r7\n\t"
  20157. "adc r5, r5, #0\n\t"
  20158. #endif
  20159. "str r3, [sp, #36]\n\t"
  20160. /* A[10] * B[0] */
  20161. "ldr r8, [%[a], #40]\n\t"
  20162. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20163. "lsl r6, r8, #16\n\t"
  20164. "lsl r7, r9, #16\n\t"
  20165. "lsr r6, r6, #16\n\t"
  20166. "lsr r7, r7, #16\n\t"
  20167. "mul r7, r6, r7\n\t"
  20168. "adds r4, r4, r7\n\t"
  20169. "adcs r5, r5, #0\n\t"
  20170. "mov r3, #0\n\t"
  20171. "adc r3, r3, #0\n\t"
  20172. "lsr r7, r9, #16\n\t"
  20173. "mul r6, r7, r6\n\t"
  20174. "lsr r7, r6, #16\n\t"
  20175. "lsl r6, r6, #16\n\t"
  20176. "adds r4, r4, r6\n\t"
  20177. "adcs r5, r5, r7\n\t"
  20178. "adc r3, r3, #0\n\t"
  20179. "lsr r6, r8, #16\n\t"
  20180. "lsr r7, r9, #16\n\t"
  20181. "mul r7, r6, r7\n\t"
  20182. "adds r5, r5, r7\n\t"
  20183. "adc r3, r3, #0\n\t"
  20184. "lsl r7, r9, #16\n\t"
  20185. "lsr r7, r7, #16\n\t"
  20186. "mul r6, r7, r6\n\t"
  20187. "lsr r7, r6, #16\n\t"
  20188. "lsl r6, r6, #16\n\t"
  20189. "adds r4, r4, r6\n\t"
  20190. "adcs r5, r5, r7\n\t"
  20191. "adc r3, r3, #0\n\t"
  20192. #else
  20193. "umull r6, r7, r8, r9\n\t"
  20194. "adds r4, r4, r6\n\t"
  20195. "adcs r5, r5, r7\n\t"
  20196. "mov r3, #0\n\t"
  20197. "adc r3, r3, #0\n\t"
  20198. #endif
  20199. /* A[9] * B[1] */
  20200. "ldr r8, [%[a], #36]\n\t"
  20201. "ldr r9, [%[b], #4]\n\t"
  20202. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20203. "lsl r6, r8, #16\n\t"
  20204. "lsl r7, r9, #16\n\t"
  20205. "lsr r6, r6, #16\n\t"
  20206. "lsr r7, r7, #16\n\t"
  20207. "mul r7, r6, r7\n\t"
  20208. "adds r4, r4, r7\n\t"
  20209. "adcs r5, r5, #0\n\t"
  20210. "adc r3, r3, #0\n\t"
  20211. "lsr r7, r9, #16\n\t"
  20212. "mul r6, r7, r6\n\t"
  20213. "lsr r7, r6, #16\n\t"
  20214. "lsl r6, r6, #16\n\t"
  20215. "adds r4, r4, r6\n\t"
  20216. "adcs r5, r5, r7\n\t"
  20217. "adc r3, r3, #0\n\t"
  20218. "lsr r6, r8, #16\n\t"
  20219. "lsr r7, r9, #16\n\t"
  20220. "mul r7, r6, r7\n\t"
  20221. "adds r5, r5, r7\n\t"
  20222. "adc r3, r3, #0\n\t"
  20223. "lsl r7, r9, #16\n\t"
  20224. "lsr r7, r7, #16\n\t"
  20225. "mul r6, r7, r6\n\t"
  20226. "lsr r7, r6, #16\n\t"
  20227. "lsl r6, r6, #16\n\t"
  20228. "adds r4, r4, r6\n\t"
  20229. "adcs r5, r5, r7\n\t"
  20230. "adc r3, r3, #0\n\t"
  20231. #else
  20232. "umull r6, r7, r8, r9\n\t"
  20233. "adds r4, r4, r6\n\t"
  20234. "adcs r5, r5, r7\n\t"
  20235. "adc r3, r3, #0\n\t"
  20236. #endif
  20237. /* A[8] * B[2] */
  20238. "ldr r8, [%[a], #32]\n\t"
  20239. "ldr r9, [%[b], #8]\n\t"
  20240. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20241. "lsl r6, r8, #16\n\t"
  20242. "lsl r7, r9, #16\n\t"
  20243. "lsr r6, r6, #16\n\t"
  20244. "lsr r7, r7, #16\n\t"
  20245. "mul r7, r6, r7\n\t"
  20246. "adds r4, r4, r7\n\t"
  20247. "adcs r5, r5, #0\n\t"
  20248. "adc r3, r3, #0\n\t"
  20249. "lsr r7, r9, #16\n\t"
  20250. "mul r6, r7, r6\n\t"
  20251. "lsr r7, r6, #16\n\t"
  20252. "lsl r6, r6, #16\n\t"
  20253. "adds r4, r4, r6\n\t"
  20254. "adcs r5, r5, r7\n\t"
  20255. "adc r3, r3, #0\n\t"
  20256. "lsr r6, r8, #16\n\t"
  20257. "lsr r7, r9, #16\n\t"
  20258. "mul r7, r6, r7\n\t"
  20259. "adds r5, r5, r7\n\t"
  20260. "adc r3, r3, #0\n\t"
  20261. "lsl r7, r9, #16\n\t"
  20262. "lsr r7, r7, #16\n\t"
  20263. "mul r6, r7, r6\n\t"
  20264. "lsr r7, r6, #16\n\t"
  20265. "lsl r6, r6, #16\n\t"
  20266. "adds r4, r4, r6\n\t"
  20267. "adcs r5, r5, r7\n\t"
  20268. "adc r3, r3, #0\n\t"
  20269. #else
  20270. "umull r6, r7, r8, r9\n\t"
  20271. "adds r4, r4, r6\n\t"
  20272. "adcs r5, r5, r7\n\t"
  20273. "adc r3, r3, #0\n\t"
  20274. #endif
  20275. /* A[7] * B[3] */
  20276. "ldr r8, [%[a], #28]\n\t"
  20277. "ldr r9, [%[b], #12]\n\t"
  20278. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20279. "lsl r6, r8, #16\n\t"
  20280. "lsl r7, r9, #16\n\t"
  20281. "lsr r6, r6, #16\n\t"
  20282. "lsr r7, r7, #16\n\t"
  20283. "mul r7, r6, r7\n\t"
  20284. "adds r4, r4, r7\n\t"
  20285. "adcs r5, r5, #0\n\t"
  20286. "adc r3, r3, #0\n\t"
  20287. "lsr r7, r9, #16\n\t"
  20288. "mul r6, r7, r6\n\t"
  20289. "lsr r7, r6, #16\n\t"
  20290. "lsl r6, r6, #16\n\t"
  20291. "adds r4, r4, r6\n\t"
  20292. "adcs r5, r5, r7\n\t"
  20293. "adc r3, r3, #0\n\t"
  20294. "lsr r6, r8, #16\n\t"
  20295. "lsr r7, r9, #16\n\t"
  20296. "mul r7, r6, r7\n\t"
  20297. "adds r5, r5, r7\n\t"
  20298. "adc r3, r3, #0\n\t"
  20299. "lsl r7, r9, #16\n\t"
  20300. "lsr r7, r7, #16\n\t"
  20301. "mul r6, r7, r6\n\t"
  20302. "lsr r7, r6, #16\n\t"
  20303. "lsl r6, r6, #16\n\t"
  20304. "adds r4, r4, r6\n\t"
  20305. "adcs r5, r5, r7\n\t"
  20306. "adc r3, r3, #0\n\t"
  20307. #else
  20308. "umull r6, r7, r8, r9\n\t"
  20309. "adds r4, r4, r6\n\t"
  20310. "adcs r5, r5, r7\n\t"
  20311. "adc r3, r3, #0\n\t"
  20312. #endif
  20313. /* A[6] * B[4] */
  20314. "ldr r8, [%[a], #24]\n\t"
  20315. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20316. "lsl r6, r8, #16\n\t"
  20317. "lsl r7, r12, #16\n\t"
  20318. "lsr r6, r6, #16\n\t"
  20319. "lsr r7, r7, #16\n\t"
  20320. "mul r7, r6, r7\n\t"
  20321. "adds r4, r4, r7\n\t"
  20322. "adcs r5, r5, #0\n\t"
  20323. "adc r3, r3, #0\n\t"
  20324. "lsr r7, r12, #16\n\t"
  20325. "mul r6, r7, r6\n\t"
  20326. "lsr r7, r6, #16\n\t"
  20327. "lsl r6, r6, #16\n\t"
  20328. "adds r4, r4, r6\n\t"
  20329. "adcs r5, r5, r7\n\t"
  20330. "adc r3, r3, #0\n\t"
  20331. "lsr r6, r8, #16\n\t"
  20332. "lsr r7, r12, #16\n\t"
  20333. "mul r7, r6, r7\n\t"
  20334. "adds r5, r5, r7\n\t"
  20335. "adc r3, r3, #0\n\t"
  20336. "lsl r7, r12, #16\n\t"
  20337. "lsr r7, r7, #16\n\t"
  20338. "mul r6, r7, r6\n\t"
  20339. "lsr r7, r6, #16\n\t"
  20340. "lsl r6, r6, #16\n\t"
  20341. "adds r4, r4, r6\n\t"
  20342. "adcs r5, r5, r7\n\t"
  20343. "adc r3, r3, #0\n\t"
  20344. #else
  20345. "umull r6, r7, r8, r12\n\t"
  20346. "adds r4, r4, r6\n\t"
  20347. "adcs r5, r5, r7\n\t"
  20348. "adc r3, r3, #0\n\t"
  20349. #endif
  20350. /* A[5] * B[5] */
  20351. "ldr r11, [%[a], #20]\n\t"
  20352. "ldr r12, [%[b], #20]\n\t"
  20353. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20354. "lsl r6, r11, #16\n\t"
  20355. "lsl r7, r12, #16\n\t"
  20356. "lsr r6, r6, #16\n\t"
  20357. "lsr r7, r7, #16\n\t"
  20358. "mul r7, r6, r7\n\t"
  20359. "adds r4, r4, r7\n\t"
  20360. "adcs r5, r5, #0\n\t"
  20361. "adc r3, r3, #0\n\t"
  20362. "lsr r7, r12, #16\n\t"
  20363. "mul r6, r7, r6\n\t"
  20364. "lsr r7, r6, #16\n\t"
  20365. "lsl r6, r6, #16\n\t"
  20366. "adds r4, r4, r6\n\t"
  20367. "adcs r5, r5, r7\n\t"
  20368. "adc r3, r3, #0\n\t"
  20369. "lsr r6, r11, #16\n\t"
  20370. "lsr r7, r12, #16\n\t"
  20371. "mul r7, r6, r7\n\t"
  20372. "adds r5, r5, r7\n\t"
  20373. "adc r3, r3, #0\n\t"
  20374. "lsl r7, r12, #16\n\t"
  20375. "lsr r7, r7, #16\n\t"
  20376. "mul r6, r7, r6\n\t"
  20377. "lsr r7, r6, #16\n\t"
  20378. "lsl r6, r6, #16\n\t"
  20379. "adds r4, r4, r6\n\t"
  20380. "adcs r5, r5, r7\n\t"
  20381. "adc r3, r3, #0\n\t"
  20382. #else
  20383. "umull r6, r7, r11, r12\n\t"
  20384. "adds r4, r4, r6\n\t"
  20385. "adcs r5, r5, r7\n\t"
  20386. "adc r3, r3, #0\n\t"
  20387. #endif
  20388. /* A[4] * B[6] */
  20389. "ldr r8, [%[a], #16]\n\t"
  20390. "ldr r9, [%[b], #24]\n\t"
  20391. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20392. "lsl r6, r8, #16\n\t"
  20393. "lsl r7, r9, #16\n\t"
  20394. "lsr r6, r6, #16\n\t"
  20395. "lsr r7, r7, #16\n\t"
  20396. "mul r7, r6, r7\n\t"
  20397. "adds r4, r4, r7\n\t"
  20398. "adcs r5, r5, #0\n\t"
  20399. "adc r3, r3, #0\n\t"
  20400. "lsr r7, r9, #16\n\t"
  20401. "mul r6, r7, r6\n\t"
  20402. "lsr r7, r6, #16\n\t"
  20403. "lsl r6, r6, #16\n\t"
  20404. "adds r4, r4, r6\n\t"
  20405. "adcs r5, r5, r7\n\t"
  20406. "adc r3, r3, #0\n\t"
  20407. "lsr r6, r8, #16\n\t"
  20408. "lsr r7, r9, #16\n\t"
  20409. "mul r7, r6, r7\n\t"
  20410. "adds r5, r5, r7\n\t"
  20411. "adc r3, r3, #0\n\t"
  20412. "lsl r7, r9, #16\n\t"
  20413. "lsr r7, r7, #16\n\t"
  20414. "mul r6, r7, r6\n\t"
  20415. "lsr r7, r6, #16\n\t"
  20416. "lsl r6, r6, #16\n\t"
  20417. "adds r4, r4, r6\n\t"
  20418. "adcs r5, r5, r7\n\t"
  20419. "adc r3, r3, #0\n\t"
  20420. #else
  20421. "umull r6, r7, r8, r9\n\t"
  20422. "adds r4, r4, r6\n\t"
  20423. "adcs r5, r5, r7\n\t"
  20424. "adc r3, r3, #0\n\t"
  20425. #endif
  20426. /* A[3] * B[7] */
  20427. "ldr r8, [%[a], #12]\n\t"
  20428. "ldr r9, [%[b], #28]\n\t"
  20429. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20430. "lsl r6, r8, #16\n\t"
  20431. "lsl r7, r9, #16\n\t"
  20432. "lsr r6, r6, #16\n\t"
  20433. "lsr r7, r7, #16\n\t"
  20434. "mul r7, r6, r7\n\t"
  20435. "adds r4, r4, r7\n\t"
  20436. "adcs r5, r5, #0\n\t"
  20437. "adc r3, r3, #0\n\t"
  20438. "lsr r7, r9, #16\n\t"
  20439. "mul r6, r7, r6\n\t"
  20440. "lsr r7, r6, #16\n\t"
  20441. "lsl r6, r6, #16\n\t"
  20442. "adds r4, r4, r6\n\t"
  20443. "adcs r5, r5, r7\n\t"
  20444. "adc r3, r3, #0\n\t"
  20445. "lsr r6, r8, #16\n\t"
  20446. "lsr r7, r9, #16\n\t"
  20447. "mul r7, r6, r7\n\t"
  20448. "adds r5, r5, r7\n\t"
  20449. "adc r3, r3, #0\n\t"
  20450. "lsl r7, r9, #16\n\t"
  20451. "lsr r7, r7, #16\n\t"
  20452. "mul r6, r7, r6\n\t"
  20453. "lsr r7, r6, #16\n\t"
  20454. "lsl r6, r6, #16\n\t"
  20455. "adds r4, r4, r6\n\t"
  20456. "adcs r5, r5, r7\n\t"
  20457. "adc r3, r3, #0\n\t"
  20458. #else
  20459. "umull r6, r7, r8, r9\n\t"
  20460. "adds r4, r4, r6\n\t"
  20461. "adcs r5, r5, r7\n\t"
  20462. "adc r3, r3, #0\n\t"
  20463. #endif
  20464. /* A[2] * B[8] */
  20465. "ldr r8, [%[a], #8]\n\t"
  20466. "ldr r9, [%[b], #32]\n\t"
  20467. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20468. "lsl r6, r8, #16\n\t"
  20469. "lsl r7, r9, #16\n\t"
  20470. "lsr r6, r6, #16\n\t"
  20471. "lsr r7, r7, #16\n\t"
  20472. "mul r7, r6, r7\n\t"
  20473. "adds r4, r4, r7\n\t"
  20474. "adcs r5, r5, #0\n\t"
  20475. "adc r3, r3, #0\n\t"
  20476. "lsr r7, r9, #16\n\t"
  20477. "mul r6, r7, r6\n\t"
  20478. "lsr r7, r6, #16\n\t"
  20479. "lsl r6, r6, #16\n\t"
  20480. "adds r4, r4, r6\n\t"
  20481. "adcs r5, r5, r7\n\t"
  20482. "adc r3, r3, #0\n\t"
  20483. "lsr r6, r8, #16\n\t"
  20484. "lsr r7, r9, #16\n\t"
  20485. "mul r7, r6, r7\n\t"
  20486. "adds r5, r5, r7\n\t"
  20487. "adc r3, r3, #0\n\t"
  20488. "lsl r7, r9, #16\n\t"
  20489. "lsr r7, r7, #16\n\t"
  20490. "mul r6, r7, r6\n\t"
  20491. "lsr r7, r6, #16\n\t"
  20492. "lsl r6, r6, #16\n\t"
  20493. "adds r4, r4, r6\n\t"
  20494. "adcs r5, r5, r7\n\t"
  20495. "adc r3, r3, #0\n\t"
  20496. #else
  20497. "umull r6, r7, r8, r9\n\t"
  20498. "adds r4, r4, r6\n\t"
  20499. "adcs r5, r5, r7\n\t"
  20500. "adc r3, r3, #0\n\t"
  20501. #endif
  20502. /* A[1] * B[9] */
  20503. "ldr r8, [%[a], #4]\n\t"
  20504. "ldr r9, [%[b], #36]\n\t"
  20505. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20506. "lsl r6, r8, #16\n\t"
  20507. "lsl r7, r9, #16\n\t"
  20508. "lsr r6, r6, #16\n\t"
  20509. "lsr r7, r7, #16\n\t"
  20510. "mul r7, r6, r7\n\t"
  20511. "adds r4, r4, r7\n\t"
  20512. "adcs r5, r5, #0\n\t"
  20513. "adc r3, r3, #0\n\t"
  20514. "lsr r7, r9, #16\n\t"
  20515. "mul r6, r7, r6\n\t"
  20516. "lsr r7, r6, #16\n\t"
  20517. "lsl r6, r6, #16\n\t"
  20518. "adds r4, r4, r6\n\t"
  20519. "adcs r5, r5, r7\n\t"
  20520. "adc r3, r3, #0\n\t"
  20521. "lsr r6, r8, #16\n\t"
  20522. "lsr r7, r9, #16\n\t"
  20523. "mul r7, r6, r7\n\t"
  20524. "adds r5, r5, r7\n\t"
  20525. "adc r3, r3, #0\n\t"
  20526. "lsl r7, r9, #16\n\t"
  20527. "lsr r7, r7, #16\n\t"
  20528. "mul r6, r7, r6\n\t"
  20529. "lsr r7, r6, #16\n\t"
  20530. "lsl r6, r6, #16\n\t"
  20531. "adds r4, r4, r6\n\t"
  20532. "adcs r5, r5, r7\n\t"
  20533. "adc r3, r3, #0\n\t"
  20534. #else
  20535. "umull r6, r7, r8, r9\n\t"
  20536. "adds r4, r4, r6\n\t"
  20537. "adcs r5, r5, r7\n\t"
  20538. "adc r3, r3, #0\n\t"
  20539. #endif
  20540. /* A[0] * B[10] */
  20541. "ldr r8, [%[a]]\n\t"
  20542. "ldr r9, [%[b], #40]\n\t"
  20543. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20544. "lsl r6, r8, #16\n\t"
  20545. "lsl r7, r9, #16\n\t"
  20546. "lsr r6, r6, #16\n\t"
  20547. "lsr r7, r7, #16\n\t"
  20548. "mul r7, r6, r7\n\t"
  20549. "adds r4, r4, r7\n\t"
  20550. "adcs r5, r5, #0\n\t"
  20551. "adc r3, r3, #0\n\t"
  20552. "lsr r7, r9, #16\n\t"
  20553. "mul r6, r7, r6\n\t"
  20554. "lsr r7, r6, #16\n\t"
  20555. "lsl r6, r6, #16\n\t"
  20556. "adds r4, r4, r6\n\t"
  20557. "adcs r5, r5, r7\n\t"
  20558. "adc r3, r3, #0\n\t"
  20559. "lsr r6, r8, #16\n\t"
  20560. "lsr r7, r9, #16\n\t"
  20561. "mul r7, r6, r7\n\t"
  20562. "adds r5, r5, r7\n\t"
  20563. "adc r3, r3, #0\n\t"
  20564. "lsl r7, r9, #16\n\t"
  20565. "lsr r7, r7, #16\n\t"
  20566. "mul r6, r7, r6\n\t"
  20567. "lsr r7, r6, #16\n\t"
  20568. "lsl r6, r6, #16\n\t"
  20569. "adds r4, r4, r6\n\t"
  20570. "adcs r5, r5, r7\n\t"
  20571. "adc r3, r3, #0\n\t"
  20572. #else
  20573. "umull r6, r7, r8, r9\n\t"
  20574. "adds r4, r4, r6\n\t"
  20575. "adcs r5, r5, r7\n\t"
  20576. "adc r3, r3, #0\n\t"
  20577. #endif
  20578. "str r4, [sp, #40]\n\t"
  20579. /* A[0] * B[11] */
  20580. "ldr r9, [%[b], #44]\n\t"
  20581. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20582. "lsl r6, r8, #16\n\t"
  20583. "lsl r7, r9, #16\n\t"
  20584. "lsr r6, r6, #16\n\t"
  20585. "lsr r7, r7, #16\n\t"
  20586. "mul r7, r6, r7\n\t"
  20587. "adds r5, r5, r7\n\t"
  20588. "adcs r3, r3, #0\n\t"
  20589. "mov r4, #0\n\t"
  20590. "adc r4, r4, #0\n\t"
  20591. "lsr r7, r9, #16\n\t"
  20592. "mul r6, r7, r6\n\t"
  20593. "lsr r7, r6, #16\n\t"
  20594. "lsl r6, r6, #16\n\t"
  20595. "adds r5, r5, r6\n\t"
  20596. "adcs r3, r3, r7\n\t"
  20597. "adc r4, r4, #0\n\t"
  20598. "lsr r6, r8, #16\n\t"
  20599. "lsr r7, r9, #16\n\t"
  20600. "mul r7, r6, r7\n\t"
  20601. "adds r3, r3, r7\n\t"
  20602. "adc r4, r4, #0\n\t"
  20603. "lsl r7, r9, #16\n\t"
  20604. "lsr r7, r7, #16\n\t"
  20605. "mul r6, r7, r6\n\t"
  20606. "lsr r7, r6, #16\n\t"
  20607. "lsl r6, r6, #16\n\t"
  20608. "adds r5, r5, r6\n\t"
  20609. "adcs r3, r3, r7\n\t"
  20610. "adc r4, r4, #0\n\t"
  20611. #else
  20612. "umull r6, r7, r8, r9\n\t"
  20613. "adds r5, r5, r6\n\t"
  20614. "adcs r3, r3, r7\n\t"
  20615. "mov r4, #0\n\t"
  20616. "adc r4, r4, #0\n\t"
  20617. #endif
  20618. /* A[1] * B[10] */
  20619. "ldr r8, [%[a], #4]\n\t"
  20620. "ldr r9, [%[b], #40]\n\t"
  20621. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20622. "lsl r6, r8, #16\n\t"
  20623. "lsl r7, r9, #16\n\t"
  20624. "lsr r6, r6, #16\n\t"
  20625. "lsr r7, r7, #16\n\t"
  20626. "mul r7, r6, r7\n\t"
  20627. "adds r5, r5, r7\n\t"
  20628. "adcs r3, r3, #0\n\t"
  20629. "adc r4, r4, #0\n\t"
  20630. "lsr r7, r9, #16\n\t"
  20631. "mul r6, r7, r6\n\t"
  20632. "lsr r7, r6, #16\n\t"
  20633. "lsl r6, r6, #16\n\t"
  20634. "adds r5, r5, r6\n\t"
  20635. "adcs r3, r3, r7\n\t"
  20636. "adc r4, r4, #0\n\t"
  20637. "lsr r6, r8, #16\n\t"
  20638. "lsr r7, r9, #16\n\t"
  20639. "mul r7, r6, r7\n\t"
  20640. "adds r3, r3, r7\n\t"
  20641. "adc r4, r4, #0\n\t"
  20642. "lsl r7, r9, #16\n\t"
  20643. "lsr r7, r7, #16\n\t"
  20644. "mul r6, r7, r6\n\t"
  20645. "lsr r7, r6, #16\n\t"
  20646. "lsl r6, r6, #16\n\t"
  20647. "adds r5, r5, r6\n\t"
  20648. "adcs r3, r3, r7\n\t"
  20649. "adc r4, r4, #0\n\t"
  20650. #else
  20651. "umull r6, r7, r8, r9\n\t"
  20652. "adds r5, r5, r6\n\t"
  20653. "adcs r3, r3, r7\n\t"
  20654. "adc r4, r4, #0\n\t"
  20655. #endif
  20656. /* A[2] * B[9] */
  20657. "ldr r8, [%[a], #8]\n\t"
  20658. "ldr r9, [%[b], #36]\n\t"
  20659. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20660. "lsl r6, r8, #16\n\t"
  20661. "lsl r7, r9, #16\n\t"
  20662. "lsr r6, r6, #16\n\t"
  20663. "lsr r7, r7, #16\n\t"
  20664. "mul r7, r6, r7\n\t"
  20665. "adds r5, r5, r7\n\t"
  20666. "adcs r3, r3, #0\n\t"
  20667. "adc r4, r4, #0\n\t"
  20668. "lsr r7, r9, #16\n\t"
  20669. "mul r6, r7, r6\n\t"
  20670. "lsr r7, r6, #16\n\t"
  20671. "lsl r6, r6, #16\n\t"
  20672. "adds r5, r5, r6\n\t"
  20673. "adcs r3, r3, r7\n\t"
  20674. "adc r4, r4, #0\n\t"
  20675. "lsr r6, r8, #16\n\t"
  20676. "lsr r7, r9, #16\n\t"
  20677. "mul r7, r6, r7\n\t"
  20678. "adds r3, r3, r7\n\t"
  20679. "adc r4, r4, #0\n\t"
  20680. "lsl r7, r9, #16\n\t"
  20681. "lsr r7, r7, #16\n\t"
  20682. "mul r6, r7, r6\n\t"
  20683. "lsr r7, r6, #16\n\t"
  20684. "lsl r6, r6, #16\n\t"
  20685. "adds r5, r5, r6\n\t"
  20686. "adcs r3, r3, r7\n\t"
  20687. "adc r4, r4, #0\n\t"
  20688. #else
  20689. "umull r6, r7, r8, r9\n\t"
  20690. "adds r5, r5, r6\n\t"
  20691. "adcs r3, r3, r7\n\t"
  20692. "adc r4, r4, #0\n\t"
  20693. #endif
  20694. /* A[3] * B[8] */
  20695. "ldr r8, [%[a], #12]\n\t"
  20696. "ldr r9, [%[b], #32]\n\t"
  20697. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20698. "lsl r6, r8, #16\n\t"
  20699. "lsl r7, r9, #16\n\t"
  20700. "lsr r6, r6, #16\n\t"
  20701. "lsr r7, r7, #16\n\t"
  20702. "mul r7, r6, r7\n\t"
  20703. "adds r5, r5, r7\n\t"
  20704. "adcs r3, r3, #0\n\t"
  20705. "adc r4, r4, #0\n\t"
  20706. "lsr r7, r9, #16\n\t"
  20707. "mul r6, r7, r6\n\t"
  20708. "lsr r7, r6, #16\n\t"
  20709. "lsl r6, r6, #16\n\t"
  20710. "adds r5, r5, r6\n\t"
  20711. "adcs r3, r3, r7\n\t"
  20712. "adc r4, r4, #0\n\t"
  20713. "lsr r6, r8, #16\n\t"
  20714. "lsr r7, r9, #16\n\t"
  20715. "mul r7, r6, r7\n\t"
  20716. "adds r3, r3, r7\n\t"
  20717. "adc r4, r4, #0\n\t"
  20718. "lsl r7, r9, #16\n\t"
  20719. "lsr r7, r7, #16\n\t"
  20720. "mul r6, r7, r6\n\t"
  20721. "lsr r7, r6, #16\n\t"
  20722. "lsl r6, r6, #16\n\t"
  20723. "adds r5, r5, r6\n\t"
  20724. "adcs r3, r3, r7\n\t"
  20725. "adc r4, r4, #0\n\t"
  20726. #else
  20727. "umull r6, r7, r8, r9\n\t"
  20728. "adds r5, r5, r6\n\t"
  20729. "adcs r3, r3, r7\n\t"
  20730. "adc r4, r4, #0\n\t"
  20731. #endif
  20732. /* A[4] * B[7] */
  20733. "ldr r8, [%[a], #16]\n\t"
  20734. "ldr r9, [%[b], #28]\n\t"
  20735. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20736. "lsl r6, r8, #16\n\t"
  20737. "lsl r7, r9, #16\n\t"
  20738. "lsr r6, r6, #16\n\t"
  20739. "lsr r7, r7, #16\n\t"
  20740. "mul r7, r6, r7\n\t"
  20741. "adds r5, r5, r7\n\t"
  20742. "adcs r3, r3, #0\n\t"
  20743. "adc r4, r4, #0\n\t"
  20744. "lsr r7, r9, #16\n\t"
  20745. "mul r6, r7, r6\n\t"
  20746. "lsr r7, r6, #16\n\t"
  20747. "lsl r6, r6, #16\n\t"
  20748. "adds r5, r5, r6\n\t"
  20749. "adcs r3, r3, r7\n\t"
  20750. "adc r4, r4, #0\n\t"
  20751. "lsr r6, r8, #16\n\t"
  20752. "lsr r7, r9, #16\n\t"
  20753. "mul r7, r6, r7\n\t"
  20754. "adds r3, r3, r7\n\t"
  20755. "adc r4, r4, #0\n\t"
  20756. "lsl r7, r9, #16\n\t"
  20757. "lsr r7, r7, #16\n\t"
  20758. "mul r6, r7, r6\n\t"
  20759. "lsr r7, r6, #16\n\t"
  20760. "lsl r6, r6, #16\n\t"
  20761. "adds r5, r5, r6\n\t"
  20762. "adcs r3, r3, r7\n\t"
  20763. "adc r4, r4, #0\n\t"
  20764. #else
  20765. "umull r6, r7, r8, r9\n\t"
  20766. "adds r5, r5, r6\n\t"
  20767. "adcs r3, r3, r7\n\t"
  20768. "adc r4, r4, #0\n\t"
  20769. #endif
  20770. /* A[5] * B[6] */
  20771. "ldr r9, [%[b], #24]\n\t"
  20772. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20773. "lsl r6, r11, #16\n\t"
  20774. "lsl r7, r9, #16\n\t"
  20775. "lsr r6, r6, #16\n\t"
  20776. "lsr r7, r7, #16\n\t"
  20777. "mul r7, r6, r7\n\t"
  20778. "adds r5, r5, r7\n\t"
  20779. "adcs r3, r3, #0\n\t"
  20780. "adc r4, r4, #0\n\t"
  20781. "lsr r7, r9, #16\n\t"
  20782. "mul r6, r7, r6\n\t"
  20783. "lsr r7, r6, #16\n\t"
  20784. "lsl r6, r6, #16\n\t"
  20785. "adds r5, r5, r6\n\t"
  20786. "adcs r3, r3, r7\n\t"
  20787. "adc r4, r4, #0\n\t"
  20788. "lsr r6, r11, #16\n\t"
  20789. "lsr r7, r9, #16\n\t"
  20790. "mul r7, r6, r7\n\t"
  20791. "adds r3, r3, r7\n\t"
  20792. "adc r4, r4, #0\n\t"
  20793. "lsl r7, r9, #16\n\t"
  20794. "lsr r7, r7, #16\n\t"
  20795. "mul r6, r7, r6\n\t"
  20796. "lsr r7, r6, #16\n\t"
  20797. "lsl r6, r6, #16\n\t"
  20798. "adds r5, r5, r6\n\t"
  20799. "adcs r3, r3, r7\n\t"
  20800. "adc r4, r4, #0\n\t"
  20801. #else
  20802. "umull r6, r7, r11, r9\n\t"
  20803. "adds r5, r5, r6\n\t"
  20804. "adcs r3, r3, r7\n\t"
  20805. "adc r4, r4, #0\n\t"
  20806. #endif
  20807. /* A[6] * B[5] */
  20808. "ldr r8, [%[a], #24]\n\t"
  20809. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20810. "lsl r6, r8, #16\n\t"
  20811. "lsl r7, r12, #16\n\t"
  20812. "lsr r6, r6, #16\n\t"
  20813. "lsr r7, r7, #16\n\t"
  20814. "mul r7, r6, r7\n\t"
  20815. "adds r5, r5, r7\n\t"
  20816. "adcs r3, r3, #0\n\t"
  20817. "adc r4, r4, #0\n\t"
  20818. "lsr r7, r12, #16\n\t"
  20819. "mul r6, r7, r6\n\t"
  20820. "lsr r7, r6, #16\n\t"
  20821. "lsl r6, r6, #16\n\t"
  20822. "adds r5, r5, r6\n\t"
  20823. "adcs r3, r3, r7\n\t"
  20824. "adc r4, r4, #0\n\t"
  20825. "lsr r6, r8, #16\n\t"
  20826. "lsr r7, r12, #16\n\t"
  20827. "mul r7, r6, r7\n\t"
  20828. "adds r3, r3, r7\n\t"
  20829. "adc r4, r4, #0\n\t"
  20830. "lsl r7, r12, #16\n\t"
  20831. "lsr r7, r7, #16\n\t"
  20832. "mul r6, r7, r6\n\t"
  20833. "lsr r7, r6, #16\n\t"
  20834. "lsl r6, r6, #16\n\t"
  20835. "adds r5, r5, r6\n\t"
  20836. "adcs r3, r3, r7\n\t"
  20837. "adc r4, r4, #0\n\t"
  20838. #else
  20839. "umull r6, r7, r8, r12\n\t"
  20840. "adds r5, r5, r6\n\t"
  20841. "adcs r3, r3, r7\n\t"
  20842. "adc r4, r4, #0\n\t"
  20843. #endif
  20844. /* A[7] * B[4] */
  20845. "ldr r8, [%[a], #28]\n\t"
  20846. "ldr r9, [%[b], #16]\n\t"
  20847. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20848. "lsl r6, r8, #16\n\t"
  20849. "lsl r7, r9, #16\n\t"
  20850. "lsr r6, r6, #16\n\t"
  20851. "lsr r7, r7, #16\n\t"
  20852. "mul r7, r6, r7\n\t"
  20853. "adds r5, r5, r7\n\t"
  20854. "adcs r3, r3, #0\n\t"
  20855. "adc r4, r4, #0\n\t"
  20856. "lsr r7, r9, #16\n\t"
  20857. "mul r6, r7, r6\n\t"
  20858. "lsr r7, r6, #16\n\t"
  20859. "lsl r6, r6, #16\n\t"
  20860. "adds r5, r5, r6\n\t"
  20861. "adcs r3, r3, r7\n\t"
  20862. "adc r4, r4, #0\n\t"
  20863. "lsr r6, r8, #16\n\t"
  20864. "lsr r7, r9, #16\n\t"
  20865. "mul r7, r6, r7\n\t"
  20866. "adds r3, r3, r7\n\t"
  20867. "adc r4, r4, #0\n\t"
  20868. "lsl r7, r9, #16\n\t"
  20869. "lsr r7, r7, #16\n\t"
  20870. "mul r6, r7, r6\n\t"
  20871. "lsr r7, r6, #16\n\t"
  20872. "lsl r6, r6, #16\n\t"
  20873. "adds r5, r5, r6\n\t"
  20874. "adcs r3, r3, r7\n\t"
  20875. "adc r4, r4, #0\n\t"
  20876. #else
  20877. "umull r6, r7, r8, r9\n\t"
  20878. "adds r5, r5, r6\n\t"
  20879. "adcs r3, r3, r7\n\t"
  20880. "adc r4, r4, #0\n\t"
  20881. #endif
  20882. /* A[8] * B[3] */
  20883. "ldr r8, [%[a], #32]\n\t"
  20884. "ldr r9, [%[b], #12]\n\t"
  20885. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20886. "lsl r6, r8, #16\n\t"
  20887. "lsl r7, r9, #16\n\t"
  20888. "lsr r6, r6, #16\n\t"
  20889. "lsr r7, r7, #16\n\t"
  20890. "mul r7, r6, r7\n\t"
  20891. "adds r5, r5, r7\n\t"
  20892. "adcs r3, r3, #0\n\t"
  20893. "adc r4, r4, #0\n\t"
  20894. "lsr r7, r9, #16\n\t"
  20895. "mul r6, r7, r6\n\t"
  20896. "lsr r7, r6, #16\n\t"
  20897. "lsl r6, r6, #16\n\t"
  20898. "adds r5, r5, r6\n\t"
  20899. "adcs r3, r3, r7\n\t"
  20900. "adc r4, r4, #0\n\t"
  20901. "lsr r6, r8, #16\n\t"
  20902. "lsr r7, r9, #16\n\t"
  20903. "mul r7, r6, r7\n\t"
  20904. "adds r3, r3, r7\n\t"
  20905. "adc r4, r4, #0\n\t"
  20906. "lsl r7, r9, #16\n\t"
  20907. "lsr r7, r7, #16\n\t"
  20908. "mul r6, r7, r6\n\t"
  20909. "lsr r7, r6, #16\n\t"
  20910. "lsl r6, r6, #16\n\t"
  20911. "adds r5, r5, r6\n\t"
  20912. "adcs r3, r3, r7\n\t"
  20913. "adc r4, r4, #0\n\t"
  20914. #else
  20915. "umull r6, r7, r8, r9\n\t"
  20916. "adds r5, r5, r6\n\t"
  20917. "adcs r3, r3, r7\n\t"
  20918. "adc r4, r4, #0\n\t"
  20919. #endif
  20920. /* A[9] * B[2] */
  20921. "ldr r8, [%[a], #36]\n\t"
  20922. "ldr r9, [%[b], #8]\n\t"
  20923. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20924. "lsl r6, r8, #16\n\t"
  20925. "lsl r7, r9, #16\n\t"
  20926. "lsr r6, r6, #16\n\t"
  20927. "lsr r7, r7, #16\n\t"
  20928. "mul r7, r6, r7\n\t"
  20929. "adds r5, r5, r7\n\t"
  20930. "adcs r3, r3, #0\n\t"
  20931. "adc r4, r4, #0\n\t"
  20932. "lsr r7, r9, #16\n\t"
  20933. "mul r6, r7, r6\n\t"
  20934. "lsr r7, r6, #16\n\t"
  20935. "lsl r6, r6, #16\n\t"
  20936. "adds r5, r5, r6\n\t"
  20937. "adcs r3, r3, r7\n\t"
  20938. "adc r4, r4, #0\n\t"
  20939. "lsr r6, r8, #16\n\t"
  20940. "lsr r7, r9, #16\n\t"
  20941. "mul r7, r6, r7\n\t"
  20942. "adds r3, r3, r7\n\t"
  20943. "adc r4, r4, #0\n\t"
  20944. "lsl r7, r9, #16\n\t"
  20945. "lsr r7, r7, #16\n\t"
  20946. "mul r6, r7, r6\n\t"
  20947. "lsr r7, r6, #16\n\t"
  20948. "lsl r6, r6, #16\n\t"
  20949. "adds r5, r5, r6\n\t"
  20950. "adcs r3, r3, r7\n\t"
  20951. "adc r4, r4, #0\n\t"
  20952. #else
  20953. "umull r6, r7, r8, r9\n\t"
  20954. "adds r5, r5, r6\n\t"
  20955. "adcs r3, r3, r7\n\t"
  20956. "adc r4, r4, #0\n\t"
  20957. #endif
  20958. /* A[10] * B[1] */
  20959. "ldr r8, [%[a], #40]\n\t"
  20960. "ldr r9, [%[b], #4]\n\t"
  20961. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  20962. "lsl r6, r8, #16\n\t"
  20963. "lsl r7, r9, #16\n\t"
  20964. "lsr r6, r6, #16\n\t"
  20965. "lsr r7, r7, #16\n\t"
  20966. "mul r7, r6, r7\n\t"
  20967. "adds r5, r5, r7\n\t"
  20968. "adcs r3, r3, #0\n\t"
  20969. "adc r4, r4, #0\n\t"
  20970. "lsr r7, r9, #16\n\t"
  20971. "mul r6, r7, r6\n\t"
  20972. "lsr r7, r6, #16\n\t"
  20973. "lsl r6, r6, #16\n\t"
  20974. "adds r5, r5, r6\n\t"
  20975. "adcs r3, r3, r7\n\t"
  20976. "adc r4, r4, #0\n\t"
  20977. "lsr r6, r8, #16\n\t"
  20978. "lsr r7, r9, #16\n\t"
  20979. "mul r7, r6, r7\n\t"
  20980. "adds r3, r3, r7\n\t"
  20981. "adc r4, r4, #0\n\t"
  20982. "lsl r7, r9, #16\n\t"
  20983. "lsr r7, r7, #16\n\t"
  20984. "mul r6, r7, r6\n\t"
  20985. "lsr r7, r6, #16\n\t"
  20986. "lsl r6, r6, #16\n\t"
  20987. "adds r5, r5, r6\n\t"
  20988. "adcs r3, r3, r7\n\t"
  20989. "adc r4, r4, #0\n\t"
  20990. #else
  20991. "umull r6, r7, r8, r9\n\t"
  20992. "adds r5, r5, r6\n\t"
  20993. "adcs r3, r3, r7\n\t"
  20994. "adc r4, r4, #0\n\t"
  20995. #endif
  20996. /* A[11] * B[0] */
  20997. "ldr r8, [%[a], #44]\n\t"
  20998. "ldr r9, [%[b]]\n\t"
  20999. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21000. "lsl r6, r8, #16\n\t"
  21001. "lsl r7, r9, #16\n\t"
  21002. "lsr r6, r6, #16\n\t"
  21003. "lsr r7, r7, #16\n\t"
  21004. "mul r7, r6, r7\n\t"
  21005. "adds r5, r5, r7\n\t"
  21006. "adcs r3, r3, #0\n\t"
  21007. "adc r4, r4, #0\n\t"
  21008. "lsr r7, r9, #16\n\t"
  21009. "mul r6, r7, r6\n\t"
  21010. "lsr r7, r6, #16\n\t"
  21011. "lsl r6, r6, #16\n\t"
  21012. "adds r5, r5, r6\n\t"
  21013. "adcs r3, r3, r7\n\t"
  21014. "adc r4, r4, #0\n\t"
  21015. "lsr r6, r8, #16\n\t"
  21016. "lsr r7, r9, #16\n\t"
  21017. "mul r7, r6, r7\n\t"
  21018. "adds r3, r3, r7\n\t"
  21019. "adc r4, r4, #0\n\t"
  21020. "lsl r7, r9, #16\n\t"
  21021. "lsr r7, r7, #16\n\t"
  21022. "mul r6, r7, r6\n\t"
  21023. "lsr r7, r6, #16\n\t"
  21024. "lsl r6, r6, #16\n\t"
  21025. "adds r5, r5, r6\n\t"
  21026. "adcs r3, r3, r7\n\t"
  21027. "adc r4, r4, #0\n\t"
  21028. #else
  21029. "umull r6, r7, r8, r9\n\t"
  21030. "adds r5, r5, r6\n\t"
  21031. "adcs r3, r3, r7\n\t"
  21032. "adc r4, r4, #0\n\t"
  21033. #endif
  21034. "str r5, [sp, #44]\n\t"
  21035. /* A[11] * B[1] */
  21036. "ldr r9, [%[b], #4]\n\t"
  21037. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21038. "lsl r6, r8, #16\n\t"
  21039. "lsl r7, r9, #16\n\t"
  21040. "lsr r6, r6, #16\n\t"
  21041. "lsr r7, r7, #16\n\t"
  21042. "mul r7, r6, r7\n\t"
  21043. "adds r3, r3, r7\n\t"
  21044. "adcs r4, r4, #0\n\t"
  21045. "mov r5, #0\n\t"
  21046. "adc r5, r5, #0\n\t"
  21047. "lsr r7, r9, #16\n\t"
  21048. "mul r6, r7, r6\n\t"
  21049. "lsr r7, r6, #16\n\t"
  21050. "lsl r6, r6, #16\n\t"
  21051. "adds r3, r3, r6\n\t"
  21052. "adcs r4, r4, r7\n\t"
  21053. "adc r5, r5, #0\n\t"
  21054. "lsr r6, r8, #16\n\t"
  21055. "lsr r7, r9, #16\n\t"
  21056. "mul r7, r6, r7\n\t"
  21057. "adds r4, r4, r7\n\t"
  21058. "adc r5, r5, #0\n\t"
  21059. "lsl r7, r9, #16\n\t"
  21060. "lsr r7, r7, #16\n\t"
  21061. "mul r6, r7, r6\n\t"
  21062. "lsr r7, r6, #16\n\t"
  21063. "lsl r6, r6, #16\n\t"
  21064. "adds r3, r3, r6\n\t"
  21065. "adcs r4, r4, r7\n\t"
  21066. "adc r5, r5, #0\n\t"
  21067. #else
  21068. "umull r6, r7, r8, r9\n\t"
  21069. "adds r3, r3, r6\n\t"
  21070. "adcs r4, r4, r7\n\t"
  21071. "mov r5, #0\n\t"
  21072. "adc r5, r5, #0\n\t"
  21073. #endif
  21074. /* A[10] * B[2] */
  21075. "ldr r8, [%[a], #40]\n\t"
  21076. "ldr r9, [%[b], #8]\n\t"
  21077. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21078. "lsl r6, r8, #16\n\t"
  21079. "lsl r7, r9, #16\n\t"
  21080. "lsr r6, r6, #16\n\t"
  21081. "lsr r7, r7, #16\n\t"
  21082. "mul r7, r6, r7\n\t"
  21083. "adds r3, r3, r7\n\t"
  21084. "adcs r4, r4, #0\n\t"
  21085. "adc r5, r5, #0\n\t"
  21086. "lsr r7, r9, #16\n\t"
  21087. "mul r6, r7, r6\n\t"
  21088. "lsr r7, r6, #16\n\t"
  21089. "lsl r6, r6, #16\n\t"
  21090. "adds r3, r3, r6\n\t"
  21091. "adcs r4, r4, r7\n\t"
  21092. "adc r5, r5, #0\n\t"
  21093. "lsr r6, r8, #16\n\t"
  21094. "lsr r7, r9, #16\n\t"
  21095. "mul r7, r6, r7\n\t"
  21096. "adds r4, r4, r7\n\t"
  21097. "adc r5, r5, #0\n\t"
  21098. "lsl r7, r9, #16\n\t"
  21099. "lsr r7, r7, #16\n\t"
  21100. "mul r6, r7, r6\n\t"
  21101. "lsr r7, r6, #16\n\t"
  21102. "lsl r6, r6, #16\n\t"
  21103. "adds r3, r3, r6\n\t"
  21104. "adcs r4, r4, r7\n\t"
  21105. "adc r5, r5, #0\n\t"
  21106. #else
  21107. "umull r6, r7, r8, r9\n\t"
  21108. "adds r3, r3, r6\n\t"
  21109. "adcs r4, r4, r7\n\t"
  21110. "adc r5, r5, #0\n\t"
  21111. #endif
  21112. /* A[9] * B[3] */
  21113. "ldr r8, [%[a], #36]\n\t"
  21114. "ldr r9, [%[b], #12]\n\t"
  21115. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21116. "lsl r6, r8, #16\n\t"
  21117. "lsl r7, r9, #16\n\t"
  21118. "lsr r6, r6, #16\n\t"
  21119. "lsr r7, r7, #16\n\t"
  21120. "mul r7, r6, r7\n\t"
  21121. "adds r3, r3, r7\n\t"
  21122. "adcs r4, r4, #0\n\t"
  21123. "adc r5, r5, #0\n\t"
  21124. "lsr r7, r9, #16\n\t"
  21125. "mul r6, r7, r6\n\t"
  21126. "lsr r7, r6, #16\n\t"
  21127. "lsl r6, r6, #16\n\t"
  21128. "adds r3, r3, r6\n\t"
  21129. "adcs r4, r4, r7\n\t"
  21130. "adc r5, r5, #0\n\t"
  21131. "lsr r6, r8, #16\n\t"
  21132. "lsr r7, r9, #16\n\t"
  21133. "mul r7, r6, r7\n\t"
  21134. "adds r4, r4, r7\n\t"
  21135. "adc r5, r5, #0\n\t"
  21136. "lsl r7, r9, #16\n\t"
  21137. "lsr r7, r7, #16\n\t"
  21138. "mul r6, r7, r6\n\t"
  21139. "lsr r7, r6, #16\n\t"
  21140. "lsl r6, r6, #16\n\t"
  21141. "adds r3, r3, r6\n\t"
  21142. "adcs r4, r4, r7\n\t"
  21143. "adc r5, r5, #0\n\t"
  21144. #else
  21145. "umull r6, r7, r8, r9\n\t"
  21146. "adds r3, r3, r6\n\t"
  21147. "adcs r4, r4, r7\n\t"
  21148. "adc r5, r5, #0\n\t"
  21149. #endif
  21150. /* A[8] * B[4] */
  21151. "ldr r8, [%[a], #32]\n\t"
  21152. "ldr r9, [%[b], #16]\n\t"
  21153. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21154. "lsl r6, r8, #16\n\t"
  21155. "lsl r7, r9, #16\n\t"
  21156. "lsr r6, r6, #16\n\t"
  21157. "lsr r7, r7, #16\n\t"
  21158. "mul r7, r6, r7\n\t"
  21159. "adds r3, r3, r7\n\t"
  21160. "adcs r4, r4, #0\n\t"
  21161. "adc r5, r5, #0\n\t"
  21162. "lsr r7, r9, #16\n\t"
  21163. "mul r6, r7, r6\n\t"
  21164. "lsr r7, r6, #16\n\t"
  21165. "lsl r6, r6, #16\n\t"
  21166. "adds r3, r3, r6\n\t"
  21167. "adcs r4, r4, r7\n\t"
  21168. "adc r5, r5, #0\n\t"
  21169. "lsr r6, r8, #16\n\t"
  21170. "lsr r7, r9, #16\n\t"
  21171. "mul r7, r6, r7\n\t"
  21172. "adds r4, r4, r7\n\t"
  21173. "adc r5, r5, #0\n\t"
  21174. "lsl r7, r9, #16\n\t"
  21175. "lsr r7, r7, #16\n\t"
  21176. "mul r6, r7, r6\n\t"
  21177. "lsr r7, r6, #16\n\t"
  21178. "lsl r6, r6, #16\n\t"
  21179. "adds r3, r3, r6\n\t"
  21180. "adcs r4, r4, r7\n\t"
  21181. "adc r5, r5, #0\n\t"
  21182. #else
  21183. "umull r6, r7, r8, r9\n\t"
  21184. "adds r3, r3, r6\n\t"
  21185. "adcs r4, r4, r7\n\t"
  21186. "adc r5, r5, #0\n\t"
  21187. #endif
  21188. /* A[7] * B[5] */
  21189. "ldr r8, [%[a], #28]\n\t"
  21190. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21191. "lsl r6, r8, #16\n\t"
  21192. "lsl r7, r12, #16\n\t"
  21193. "lsr r6, r6, #16\n\t"
  21194. "lsr r7, r7, #16\n\t"
  21195. "mul r7, r6, r7\n\t"
  21196. "adds r3, r3, r7\n\t"
  21197. "adcs r4, r4, #0\n\t"
  21198. "adc r5, r5, #0\n\t"
  21199. "lsr r7, r12, #16\n\t"
  21200. "mul r6, r7, r6\n\t"
  21201. "lsr r7, r6, #16\n\t"
  21202. "lsl r6, r6, #16\n\t"
  21203. "adds r3, r3, r6\n\t"
  21204. "adcs r4, r4, r7\n\t"
  21205. "adc r5, r5, #0\n\t"
  21206. "lsr r6, r8, #16\n\t"
  21207. "lsr r7, r12, #16\n\t"
  21208. "mul r7, r6, r7\n\t"
  21209. "adds r4, r4, r7\n\t"
  21210. "adc r5, r5, #0\n\t"
  21211. "lsl r7, r12, #16\n\t"
  21212. "lsr r7, r7, #16\n\t"
  21213. "mul r6, r7, r6\n\t"
  21214. "lsr r7, r6, #16\n\t"
  21215. "lsl r6, r6, #16\n\t"
  21216. "adds r3, r3, r6\n\t"
  21217. "adcs r4, r4, r7\n\t"
  21218. "adc r5, r5, #0\n\t"
  21219. #else
  21220. "umull r6, r7, r8, r12\n\t"
  21221. "adds r3, r3, r6\n\t"
  21222. "adcs r4, r4, r7\n\t"
  21223. "adc r5, r5, #0\n\t"
  21224. #endif
  21225. /* A[6] * B[6] */
  21226. "ldr r11, [%[a], #24]\n\t"
  21227. "ldr r12, [%[b], #24]\n\t"
  21228. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21229. "lsl r6, r11, #16\n\t"
  21230. "lsl r7, r12, #16\n\t"
  21231. "lsr r6, r6, #16\n\t"
  21232. "lsr r7, r7, #16\n\t"
  21233. "mul r7, r6, r7\n\t"
  21234. "adds r3, r3, r7\n\t"
  21235. "adcs r4, r4, #0\n\t"
  21236. "adc r5, r5, #0\n\t"
  21237. "lsr r7, r12, #16\n\t"
  21238. "mul r6, r7, r6\n\t"
  21239. "lsr r7, r6, #16\n\t"
  21240. "lsl r6, r6, #16\n\t"
  21241. "adds r3, r3, r6\n\t"
  21242. "adcs r4, r4, r7\n\t"
  21243. "adc r5, r5, #0\n\t"
  21244. "lsr r6, r11, #16\n\t"
  21245. "lsr r7, r12, #16\n\t"
  21246. "mul r7, r6, r7\n\t"
  21247. "adds r4, r4, r7\n\t"
  21248. "adc r5, r5, #0\n\t"
  21249. "lsl r7, r12, #16\n\t"
  21250. "lsr r7, r7, #16\n\t"
  21251. "mul r6, r7, r6\n\t"
  21252. "lsr r7, r6, #16\n\t"
  21253. "lsl r6, r6, #16\n\t"
  21254. "adds r3, r3, r6\n\t"
  21255. "adcs r4, r4, r7\n\t"
  21256. "adc r5, r5, #0\n\t"
  21257. #else
  21258. "umull r6, r7, r11, r12\n\t"
  21259. "adds r3, r3, r6\n\t"
  21260. "adcs r4, r4, r7\n\t"
  21261. "adc r5, r5, #0\n\t"
  21262. #endif
  21263. /* A[5] * B[7] */
  21264. "ldr r8, [%[a], #20]\n\t"
  21265. "ldr r9, [%[b], #28]\n\t"
  21266. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21267. "lsl r6, r8, #16\n\t"
  21268. "lsl r7, r9, #16\n\t"
  21269. "lsr r6, r6, #16\n\t"
  21270. "lsr r7, r7, #16\n\t"
  21271. "mul r7, r6, r7\n\t"
  21272. "adds r3, r3, r7\n\t"
  21273. "adcs r4, r4, #0\n\t"
  21274. "adc r5, r5, #0\n\t"
  21275. "lsr r7, r9, #16\n\t"
  21276. "mul r6, r7, r6\n\t"
  21277. "lsr r7, r6, #16\n\t"
  21278. "lsl r6, r6, #16\n\t"
  21279. "adds r3, r3, r6\n\t"
  21280. "adcs r4, r4, r7\n\t"
  21281. "adc r5, r5, #0\n\t"
  21282. "lsr r6, r8, #16\n\t"
  21283. "lsr r7, r9, #16\n\t"
  21284. "mul r7, r6, r7\n\t"
  21285. "adds r4, r4, r7\n\t"
  21286. "adc r5, r5, #0\n\t"
  21287. "lsl r7, r9, #16\n\t"
  21288. "lsr r7, r7, #16\n\t"
  21289. "mul r6, r7, r6\n\t"
  21290. "lsr r7, r6, #16\n\t"
  21291. "lsl r6, r6, #16\n\t"
  21292. "adds r3, r3, r6\n\t"
  21293. "adcs r4, r4, r7\n\t"
  21294. "adc r5, r5, #0\n\t"
  21295. #else
  21296. "umull r6, r7, r8, r9\n\t"
  21297. "adds r3, r3, r6\n\t"
  21298. "adcs r4, r4, r7\n\t"
  21299. "adc r5, r5, #0\n\t"
  21300. #endif
  21301. /* A[4] * B[8] */
  21302. "ldr r8, [%[a], #16]\n\t"
  21303. "ldr r9, [%[b], #32]\n\t"
  21304. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21305. "lsl r6, r8, #16\n\t"
  21306. "lsl r7, r9, #16\n\t"
  21307. "lsr r6, r6, #16\n\t"
  21308. "lsr r7, r7, #16\n\t"
  21309. "mul r7, r6, r7\n\t"
  21310. "adds r3, r3, r7\n\t"
  21311. "adcs r4, r4, #0\n\t"
  21312. "adc r5, r5, #0\n\t"
  21313. "lsr r7, r9, #16\n\t"
  21314. "mul r6, r7, r6\n\t"
  21315. "lsr r7, r6, #16\n\t"
  21316. "lsl r6, r6, #16\n\t"
  21317. "adds r3, r3, r6\n\t"
  21318. "adcs r4, r4, r7\n\t"
  21319. "adc r5, r5, #0\n\t"
  21320. "lsr r6, r8, #16\n\t"
  21321. "lsr r7, r9, #16\n\t"
  21322. "mul r7, r6, r7\n\t"
  21323. "adds r4, r4, r7\n\t"
  21324. "adc r5, r5, #0\n\t"
  21325. "lsl r7, r9, #16\n\t"
  21326. "lsr r7, r7, #16\n\t"
  21327. "mul r6, r7, r6\n\t"
  21328. "lsr r7, r6, #16\n\t"
  21329. "lsl r6, r6, #16\n\t"
  21330. "adds r3, r3, r6\n\t"
  21331. "adcs r4, r4, r7\n\t"
  21332. "adc r5, r5, #0\n\t"
  21333. #else
  21334. "umull r6, r7, r8, r9\n\t"
  21335. "adds r3, r3, r6\n\t"
  21336. "adcs r4, r4, r7\n\t"
  21337. "adc r5, r5, #0\n\t"
  21338. #endif
  21339. /* A[3] * B[9] */
  21340. "ldr r8, [%[a], #12]\n\t"
  21341. "ldr r9, [%[b], #36]\n\t"
  21342. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21343. "lsl r6, r8, #16\n\t"
  21344. "lsl r7, r9, #16\n\t"
  21345. "lsr r6, r6, #16\n\t"
  21346. "lsr r7, r7, #16\n\t"
  21347. "mul r7, r6, r7\n\t"
  21348. "adds r3, r3, r7\n\t"
  21349. "adcs r4, r4, #0\n\t"
  21350. "adc r5, r5, #0\n\t"
  21351. "lsr r7, r9, #16\n\t"
  21352. "mul r6, r7, r6\n\t"
  21353. "lsr r7, r6, #16\n\t"
  21354. "lsl r6, r6, #16\n\t"
  21355. "adds r3, r3, r6\n\t"
  21356. "adcs r4, r4, r7\n\t"
  21357. "adc r5, r5, #0\n\t"
  21358. "lsr r6, r8, #16\n\t"
  21359. "lsr r7, r9, #16\n\t"
  21360. "mul r7, r6, r7\n\t"
  21361. "adds r4, r4, r7\n\t"
  21362. "adc r5, r5, #0\n\t"
  21363. "lsl r7, r9, #16\n\t"
  21364. "lsr r7, r7, #16\n\t"
  21365. "mul r6, r7, r6\n\t"
  21366. "lsr r7, r6, #16\n\t"
  21367. "lsl r6, r6, #16\n\t"
  21368. "adds r3, r3, r6\n\t"
  21369. "adcs r4, r4, r7\n\t"
  21370. "adc r5, r5, #0\n\t"
  21371. #else
  21372. "umull r6, r7, r8, r9\n\t"
  21373. "adds r3, r3, r6\n\t"
  21374. "adcs r4, r4, r7\n\t"
  21375. "adc r5, r5, #0\n\t"
  21376. #endif
  21377. /* A[2] * B[10] */
  21378. "ldr r8, [%[a], #8]\n\t"
  21379. "ldr r9, [%[b], #40]\n\t"
  21380. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21381. "lsl r6, r8, #16\n\t"
  21382. "lsl r7, r9, #16\n\t"
  21383. "lsr r6, r6, #16\n\t"
  21384. "lsr r7, r7, #16\n\t"
  21385. "mul r7, r6, r7\n\t"
  21386. "adds r3, r3, r7\n\t"
  21387. "adcs r4, r4, #0\n\t"
  21388. "adc r5, r5, #0\n\t"
  21389. "lsr r7, r9, #16\n\t"
  21390. "mul r6, r7, r6\n\t"
  21391. "lsr r7, r6, #16\n\t"
  21392. "lsl r6, r6, #16\n\t"
  21393. "adds r3, r3, r6\n\t"
  21394. "adcs r4, r4, r7\n\t"
  21395. "adc r5, r5, #0\n\t"
  21396. "lsr r6, r8, #16\n\t"
  21397. "lsr r7, r9, #16\n\t"
  21398. "mul r7, r6, r7\n\t"
  21399. "adds r4, r4, r7\n\t"
  21400. "adc r5, r5, #0\n\t"
  21401. "lsl r7, r9, #16\n\t"
  21402. "lsr r7, r7, #16\n\t"
  21403. "mul r6, r7, r6\n\t"
  21404. "lsr r7, r6, #16\n\t"
  21405. "lsl r6, r6, #16\n\t"
  21406. "adds r3, r3, r6\n\t"
  21407. "adcs r4, r4, r7\n\t"
  21408. "adc r5, r5, #0\n\t"
  21409. #else
  21410. "umull r6, r7, r8, r9\n\t"
  21411. "adds r3, r3, r6\n\t"
  21412. "adcs r4, r4, r7\n\t"
  21413. "adc r5, r5, #0\n\t"
  21414. #endif
  21415. /* A[1] * B[11] */
  21416. "ldr r8, [%[a], #4]\n\t"
  21417. "ldr r9, [%[b], #44]\n\t"
  21418. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21419. "lsl r6, r8, #16\n\t"
  21420. "lsl r7, r9, #16\n\t"
  21421. "lsr r6, r6, #16\n\t"
  21422. "lsr r7, r7, #16\n\t"
  21423. "mul r7, r6, r7\n\t"
  21424. "adds r3, r3, r7\n\t"
  21425. "adcs r4, r4, #0\n\t"
  21426. "adc r5, r5, #0\n\t"
  21427. "lsr r7, r9, #16\n\t"
  21428. "mul r6, r7, r6\n\t"
  21429. "lsr r7, r6, #16\n\t"
  21430. "lsl r6, r6, #16\n\t"
  21431. "adds r3, r3, r6\n\t"
  21432. "adcs r4, r4, r7\n\t"
  21433. "adc r5, r5, #0\n\t"
  21434. "lsr r6, r8, #16\n\t"
  21435. "lsr r7, r9, #16\n\t"
  21436. "mul r7, r6, r7\n\t"
  21437. "adds r4, r4, r7\n\t"
  21438. "adc r5, r5, #0\n\t"
  21439. "lsl r7, r9, #16\n\t"
  21440. "lsr r7, r7, #16\n\t"
  21441. "mul r6, r7, r6\n\t"
  21442. "lsr r7, r6, #16\n\t"
  21443. "lsl r6, r6, #16\n\t"
  21444. "adds r3, r3, r6\n\t"
  21445. "adcs r4, r4, r7\n\t"
  21446. "adc r5, r5, #0\n\t"
  21447. #else
  21448. "umull r6, r7, r8, r9\n\t"
  21449. "adds r3, r3, r6\n\t"
  21450. "adcs r4, r4, r7\n\t"
  21451. "adc r5, r5, #0\n\t"
  21452. #endif
  21453. "str r3, [%[r], #48]\n\t"
  21454. /* A[2] * B[11] */
  21455. "ldr r8, [%[a], #8]\n\t"
  21456. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21457. "lsl r6, r8, #16\n\t"
  21458. "lsl r7, r9, #16\n\t"
  21459. "lsr r6, r6, #16\n\t"
  21460. "lsr r7, r7, #16\n\t"
  21461. "mul r7, r6, r7\n\t"
  21462. "adds r4, r4, r7\n\t"
  21463. "adcs r5, r5, #0\n\t"
  21464. "mov r3, #0\n\t"
  21465. "adc r3, r3, #0\n\t"
  21466. "lsr r7, r9, #16\n\t"
  21467. "mul r6, r7, r6\n\t"
  21468. "lsr r7, r6, #16\n\t"
  21469. "lsl r6, r6, #16\n\t"
  21470. "adds r4, r4, r6\n\t"
  21471. "adcs r5, r5, r7\n\t"
  21472. "adc r3, r3, #0\n\t"
  21473. "lsr r6, r8, #16\n\t"
  21474. "lsr r7, r9, #16\n\t"
  21475. "mul r7, r6, r7\n\t"
  21476. "adds r5, r5, r7\n\t"
  21477. "adc r3, r3, #0\n\t"
  21478. "lsl r7, r9, #16\n\t"
  21479. "lsr r7, r7, #16\n\t"
  21480. "mul r6, r7, r6\n\t"
  21481. "lsr r7, r6, #16\n\t"
  21482. "lsl r6, r6, #16\n\t"
  21483. "adds r4, r4, r6\n\t"
  21484. "adcs r5, r5, r7\n\t"
  21485. "adc r3, r3, #0\n\t"
  21486. #else
  21487. "umull r6, r7, r8, r9\n\t"
  21488. "adds r4, r4, r6\n\t"
  21489. "adcs r5, r5, r7\n\t"
  21490. "mov r3, #0\n\t"
  21491. "adc r3, r3, #0\n\t"
  21492. #endif
  21493. /* A[3] * B[10] */
  21494. "ldr r8, [%[a], #12]\n\t"
  21495. "ldr r9, [%[b], #40]\n\t"
  21496. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21497. "lsl r6, r8, #16\n\t"
  21498. "lsl r7, r9, #16\n\t"
  21499. "lsr r6, r6, #16\n\t"
  21500. "lsr r7, r7, #16\n\t"
  21501. "mul r7, r6, r7\n\t"
  21502. "adds r4, r4, r7\n\t"
  21503. "adcs r5, r5, #0\n\t"
  21504. "adc r3, r3, #0\n\t"
  21505. "lsr r7, r9, #16\n\t"
  21506. "mul r6, r7, r6\n\t"
  21507. "lsr r7, r6, #16\n\t"
  21508. "lsl r6, r6, #16\n\t"
  21509. "adds r4, r4, r6\n\t"
  21510. "adcs r5, r5, r7\n\t"
  21511. "adc r3, r3, #0\n\t"
  21512. "lsr r6, r8, #16\n\t"
  21513. "lsr r7, r9, #16\n\t"
  21514. "mul r7, r6, r7\n\t"
  21515. "adds r5, r5, r7\n\t"
  21516. "adc r3, r3, #0\n\t"
  21517. "lsl r7, r9, #16\n\t"
  21518. "lsr r7, r7, #16\n\t"
  21519. "mul r6, r7, r6\n\t"
  21520. "lsr r7, r6, #16\n\t"
  21521. "lsl r6, r6, #16\n\t"
  21522. "adds r4, r4, r6\n\t"
  21523. "adcs r5, r5, r7\n\t"
  21524. "adc r3, r3, #0\n\t"
  21525. #else
  21526. "umull r6, r7, r8, r9\n\t"
  21527. "adds r4, r4, r6\n\t"
  21528. "adcs r5, r5, r7\n\t"
  21529. "adc r3, r3, #0\n\t"
  21530. #endif
  21531. /* A[4] * B[9] */
  21532. "ldr r8, [%[a], #16]\n\t"
  21533. "ldr r9, [%[b], #36]\n\t"
  21534. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21535. "lsl r6, r8, #16\n\t"
  21536. "lsl r7, r9, #16\n\t"
  21537. "lsr r6, r6, #16\n\t"
  21538. "lsr r7, r7, #16\n\t"
  21539. "mul r7, r6, r7\n\t"
  21540. "adds r4, r4, r7\n\t"
  21541. "adcs r5, r5, #0\n\t"
  21542. "adc r3, r3, #0\n\t"
  21543. "lsr r7, r9, #16\n\t"
  21544. "mul r6, r7, r6\n\t"
  21545. "lsr r7, r6, #16\n\t"
  21546. "lsl r6, r6, #16\n\t"
  21547. "adds r4, r4, r6\n\t"
  21548. "adcs r5, r5, r7\n\t"
  21549. "adc r3, r3, #0\n\t"
  21550. "lsr r6, r8, #16\n\t"
  21551. "lsr r7, r9, #16\n\t"
  21552. "mul r7, r6, r7\n\t"
  21553. "adds r5, r5, r7\n\t"
  21554. "adc r3, r3, #0\n\t"
  21555. "lsl r7, r9, #16\n\t"
  21556. "lsr r7, r7, #16\n\t"
  21557. "mul r6, r7, r6\n\t"
  21558. "lsr r7, r6, #16\n\t"
  21559. "lsl r6, r6, #16\n\t"
  21560. "adds r4, r4, r6\n\t"
  21561. "adcs r5, r5, r7\n\t"
  21562. "adc r3, r3, #0\n\t"
  21563. #else
  21564. "umull r6, r7, r8, r9\n\t"
  21565. "adds r4, r4, r6\n\t"
  21566. "adcs r5, r5, r7\n\t"
  21567. "adc r3, r3, #0\n\t"
  21568. #endif
  21569. /* A[5] * B[8] */
  21570. "ldr r8, [%[a], #20]\n\t"
  21571. "ldr r9, [%[b], #32]\n\t"
  21572. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21573. "lsl r6, r8, #16\n\t"
  21574. "lsl r7, r9, #16\n\t"
  21575. "lsr r6, r6, #16\n\t"
  21576. "lsr r7, r7, #16\n\t"
  21577. "mul r7, r6, r7\n\t"
  21578. "adds r4, r4, r7\n\t"
  21579. "adcs r5, r5, #0\n\t"
  21580. "adc r3, r3, #0\n\t"
  21581. "lsr r7, r9, #16\n\t"
  21582. "mul r6, r7, r6\n\t"
  21583. "lsr r7, r6, #16\n\t"
  21584. "lsl r6, r6, #16\n\t"
  21585. "adds r4, r4, r6\n\t"
  21586. "adcs r5, r5, r7\n\t"
  21587. "adc r3, r3, #0\n\t"
  21588. "lsr r6, r8, #16\n\t"
  21589. "lsr r7, r9, #16\n\t"
  21590. "mul r7, r6, r7\n\t"
  21591. "adds r5, r5, r7\n\t"
  21592. "adc r3, r3, #0\n\t"
  21593. "lsl r7, r9, #16\n\t"
  21594. "lsr r7, r7, #16\n\t"
  21595. "mul r6, r7, r6\n\t"
  21596. "lsr r7, r6, #16\n\t"
  21597. "lsl r6, r6, #16\n\t"
  21598. "adds r4, r4, r6\n\t"
  21599. "adcs r5, r5, r7\n\t"
  21600. "adc r3, r3, #0\n\t"
  21601. #else
  21602. "umull r6, r7, r8, r9\n\t"
  21603. "adds r4, r4, r6\n\t"
  21604. "adcs r5, r5, r7\n\t"
  21605. "adc r3, r3, #0\n\t"
  21606. #endif
  21607. /* A[6] * B[7] */
  21608. "ldr r9, [%[b], #28]\n\t"
  21609. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21610. "lsl r6, r11, #16\n\t"
  21611. "lsl r7, r9, #16\n\t"
  21612. "lsr r6, r6, #16\n\t"
  21613. "lsr r7, r7, #16\n\t"
  21614. "mul r7, r6, r7\n\t"
  21615. "adds r4, r4, r7\n\t"
  21616. "adcs r5, r5, #0\n\t"
  21617. "adc r3, r3, #0\n\t"
  21618. "lsr r7, r9, #16\n\t"
  21619. "mul r6, r7, r6\n\t"
  21620. "lsr r7, r6, #16\n\t"
  21621. "lsl r6, r6, #16\n\t"
  21622. "adds r4, r4, r6\n\t"
  21623. "adcs r5, r5, r7\n\t"
  21624. "adc r3, r3, #0\n\t"
  21625. "lsr r6, r11, #16\n\t"
  21626. "lsr r7, r9, #16\n\t"
  21627. "mul r7, r6, r7\n\t"
  21628. "adds r5, r5, r7\n\t"
  21629. "adc r3, r3, #0\n\t"
  21630. "lsl r7, r9, #16\n\t"
  21631. "lsr r7, r7, #16\n\t"
  21632. "mul r6, r7, r6\n\t"
  21633. "lsr r7, r6, #16\n\t"
  21634. "lsl r6, r6, #16\n\t"
  21635. "adds r4, r4, r6\n\t"
  21636. "adcs r5, r5, r7\n\t"
  21637. "adc r3, r3, #0\n\t"
  21638. #else
  21639. "umull r6, r7, r11, r9\n\t"
  21640. "adds r4, r4, r6\n\t"
  21641. "adcs r5, r5, r7\n\t"
  21642. "adc r3, r3, #0\n\t"
  21643. #endif
  21644. /* A[7] * B[6] */
  21645. "ldr r8, [%[a], #28]\n\t"
  21646. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21647. "lsl r6, r8, #16\n\t"
  21648. "lsl r7, r12, #16\n\t"
  21649. "lsr r6, r6, #16\n\t"
  21650. "lsr r7, r7, #16\n\t"
  21651. "mul r7, r6, r7\n\t"
  21652. "adds r4, r4, r7\n\t"
  21653. "adcs r5, r5, #0\n\t"
  21654. "adc r3, r3, #0\n\t"
  21655. "lsr r7, r12, #16\n\t"
  21656. "mul r6, r7, r6\n\t"
  21657. "lsr r7, r6, #16\n\t"
  21658. "lsl r6, r6, #16\n\t"
  21659. "adds r4, r4, r6\n\t"
  21660. "adcs r5, r5, r7\n\t"
  21661. "adc r3, r3, #0\n\t"
  21662. "lsr r6, r8, #16\n\t"
  21663. "lsr r7, r12, #16\n\t"
  21664. "mul r7, r6, r7\n\t"
  21665. "adds r5, r5, r7\n\t"
  21666. "adc r3, r3, #0\n\t"
  21667. "lsl r7, r12, #16\n\t"
  21668. "lsr r7, r7, #16\n\t"
  21669. "mul r6, r7, r6\n\t"
  21670. "lsr r7, r6, #16\n\t"
  21671. "lsl r6, r6, #16\n\t"
  21672. "adds r4, r4, r6\n\t"
  21673. "adcs r5, r5, r7\n\t"
  21674. "adc r3, r3, #0\n\t"
  21675. #else
  21676. "umull r6, r7, r8, r12\n\t"
  21677. "adds r4, r4, r6\n\t"
  21678. "adcs r5, r5, r7\n\t"
  21679. "adc r3, r3, #0\n\t"
  21680. #endif
  21681. /* A[8] * B[5] */
  21682. "ldr r8, [%[a], #32]\n\t"
  21683. "ldr r9, [%[b], #20]\n\t"
  21684. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21685. "lsl r6, r8, #16\n\t"
  21686. "lsl r7, r9, #16\n\t"
  21687. "lsr r6, r6, #16\n\t"
  21688. "lsr r7, r7, #16\n\t"
  21689. "mul r7, r6, r7\n\t"
  21690. "adds r4, r4, r7\n\t"
  21691. "adcs r5, r5, #0\n\t"
  21692. "adc r3, r3, #0\n\t"
  21693. "lsr r7, r9, #16\n\t"
  21694. "mul r6, r7, r6\n\t"
  21695. "lsr r7, r6, #16\n\t"
  21696. "lsl r6, r6, #16\n\t"
  21697. "adds r4, r4, r6\n\t"
  21698. "adcs r5, r5, r7\n\t"
  21699. "adc r3, r3, #0\n\t"
  21700. "lsr r6, r8, #16\n\t"
  21701. "lsr r7, r9, #16\n\t"
  21702. "mul r7, r6, r7\n\t"
  21703. "adds r5, r5, r7\n\t"
  21704. "adc r3, r3, #0\n\t"
  21705. "lsl r7, r9, #16\n\t"
  21706. "lsr r7, r7, #16\n\t"
  21707. "mul r6, r7, r6\n\t"
  21708. "lsr r7, r6, #16\n\t"
  21709. "lsl r6, r6, #16\n\t"
  21710. "adds r4, r4, r6\n\t"
  21711. "adcs r5, r5, r7\n\t"
  21712. "adc r3, r3, #0\n\t"
  21713. #else
  21714. "umull r6, r7, r8, r9\n\t"
  21715. "adds r4, r4, r6\n\t"
  21716. "adcs r5, r5, r7\n\t"
  21717. "adc r3, r3, #0\n\t"
  21718. #endif
  21719. /* A[9] * B[4] */
  21720. "ldr r8, [%[a], #36]\n\t"
  21721. "ldr r9, [%[b], #16]\n\t"
  21722. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21723. "lsl r6, r8, #16\n\t"
  21724. "lsl r7, r9, #16\n\t"
  21725. "lsr r6, r6, #16\n\t"
  21726. "lsr r7, r7, #16\n\t"
  21727. "mul r7, r6, r7\n\t"
  21728. "adds r4, r4, r7\n\t"
  21729. "adcs r5, r5, #0\n\t"
  21730. "adc r3, r3, #0\n\t"
  21731. "lsr r7, r9, #16\n\t"
  21732. "mul r6, r7, r6\n\t"
  21733. "lsr r7, r6, #16\n\t"
  21734. "lsl r6, r6, #16\n\t"
  21735. "adds r4, r4, r6\n\t"
  21736. "adcs r5, r5, r7\n\t"
  21737. "adc r3, r3, #0\n\t"
  21738. "lsr r6, r8, #16\n\t"
  21739. "lsr r7, r9, #16\n\t"
  21740. "mul r7, r6, r7\n\t"
  21741. "adds r5, r5, r7\n\t"
  21742. "adc r3, r3, #0\n\t"
  21743. "lsl r7, r9, #16\n\t"
  21744. "lsr r7, r7, #16\n\t"
  21745. "mul r6, r7, r6\n\t"
  21746. "lsr r7, r6, #16\n\t"
  21747. "lsl r6, r6, #16\n\t"
  21748. "adds r4, r4, r6\n\t"
  21749. "adcs r5, r5, r7\n\t"
  21750. "adc r3, r3, #0\n\t"
  21751. #else
  21752. "umull r6, r7, r8, r9\n\t"
  21753. "adds r4, r4, r6\n\t"
  21754. "adcs r5, r5, r7\n\t"
  21755. "adc r3, r3, #0\n\t"
  21756. #endif
  21757. /* A[10] * B[3] */
  21758. "ldr r8, [%[a], #40]\n\t"
  21759. "ldr r9, [%[b], #12]\n\t"
  21760. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21761. "lsl r6, r8, #16\n\t"
  21762. "lsl r7, r9, #16\n\t"
  21763. "lsr r6, r6, #16\n\t"
  21764. "lsr r7, r7, #16\n\t"
  21765. "mul r7, r6, r7\n\t"
  21766. "adds r4, r4, r7\n\t"
  21767. "adcs r5, r5, #0\n\t"
  21768. "adc r3, r3, #0\n\t"
  21769. "lsr r7, r9, #16\n\t"
  21770. "mul r6, r7, r6\n\t"
  21771. "lsr r7, r6, #16\n\t"
  21772. "lsl r6, r6, #16\n\t"
  21773. "adds r4, r4, r6\n\t"
  21774. "adcs r5, r5, r7\n\t"
  21775. "adc r3, r3, #0\n\t"
  21776. "lsr r6, r8, #16\n\t"
  21777. "lsr r7, r9, #16\n\t"
  21778. "mul r7, r6, r7\n\t"
  21779. "adds r5, r5, r7\n\t"
  21780. "adc r3, r3, #0\n\t"
  21781. "lsl r7, r9, #16\n\t"
  21782. "lsr r7, r7, #16\n\t"
  21783. "mul r6, r7, r6\n\t"
  21784. "lsr r7, r6, #16\n\t"
  21785. "lsl r6, r6, #16\n\t"
  21786. "adds r4, r4, r6\n\t"
  21787. "adcs r5, r5, r7\n\t"
  21788. "adc r3, r3, #0\n\t"
  21789. #else
  21790. "umull r6, r7, r8, r9\n\t"
  21791. "adds r4, r4, r6\n\t"
  21792. "adcs r5, r5, r7\n\t"
  21793. "adc r3, r3, #0\n\t"
  21794. #endif
  21795. /* A[11] * B[2] */
  21796. "ldr r8, [%[a], #44]\n\t"
  21797. "ldr r9, [%[b], #8]\n\t"
  21798. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21799. "lsl r6, r8, #16\n\t"
  21800. "lsl r7, r9, #16\n\t"
  21801. "lsr r6, r6, #16\n\t"
  21802. "lsr r7, r7, #16\n\t"
  21803. "mul r7, r6, r7\n\t"
  21804. "adds r4, r4, r7\n\t"
  21805. "adcs r5, r5, #0\n\t"
  21806. "adc r3, r3, #0\n\t"
  21807. "lsr r7, r9, #16\n\t"
  21808. "mul r6, r7, r6\n\t"
  21809. "lsr r7, r6, #16\n\t"
  21810. "lsl r6, r6, #16\n\t"
  21811. "adds r4, r4, r6\n\t"
  21812. "adcs r5, r5, r7\n\t"
  21813. "adc r3, r3, #0\n\t"
  21814. "lsr r6, r8, #16\n\t"
  21815. "lsr r7, r9, #16\n\t"
  21816. "mul r7, r6, r7\n\t"
  21817. "adds r5, r5, r7\n\t"
  21818. "adc r3, r3, #0\n\t"
  21819. "lsl r7, r9, #16\n\t"
  21820. "lsr r7, r7, #16\n\t"
  21821. "mul r6, r7, r6\n\t"
  21822. "lsr r7, r6, #16\n\t"
  21823. "lsl r6, r6, #16\n\t"
  21824. "adds r4, r4, r6\n\t"
  21825. "adcs r5, r5, r7\n\t"
  21826. "adc r3, r3, #0\n\t"
  21827. #else
  21828. "umull r6, r7, r8, r9\n\t"
  21829. "adds r4, r4, r6\n\t"
  21830. "adcs r5, r5, r7\n\t"
  21831. "adc r3, r3, #0\n\t"
  21832. #endif
  21833. "str r4, [%[r], #52]\n\t"
  21834. /* A[11] * B[3] */
  21835. "ldr r9, [%[b], #12]\n\t"
  21836. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21837. "lsl r6, r8, #16\n\t"
  21838. "lsl r7, r9, #16\n\t"
  21839. "lsr r6, r6, #16\n\t"
  21840. "lsr r7, r7, #16\n\t"
  21841. "mul r7, r6, r7\n\t"
  21842. "adds r5, r5, r7\n\t"
  21843. "adcs r3, r3, #0\n\t"
  21844. "mov r4, #0\n\t"
  21845. "adc r4, r4, #0\n\t"
  21846. "lsr r7, r9, #16\n\t"
  21847. "mul r6, r7, r6\n\t"
  21848. "lsr r7, r6, #16\n\t"
  21849. "lsl r6, r6, #16\n\t"
  21850. "adds r5, r5, r6\n\t"
  21851. "adcs r3, r3, r7\n\t"
  21852. "adc r4, r4, #0\n\t"
  21853. "lsr r6, r8, #16\n\t"
  21854. "lsr r7, r9, #16\n\t"
  21855. "mul r7, r6, r7\n\t"
  21856. "adds r3, r3, r7\n\t"
  21857. "adc r4, r4, #0\n\t"
  21858. "lsl r7, r9, #16\n\t"
  21859. "lsr r7, r7, #16\n\t"
  21860. "mul r6, r7, r6\n\t"
  21861. "lsr r7, r6, #16\n\t"
  21862. "lsl r6, r6, #16\n\t"
  21863. "adds r5, r5, r6\n\t"
  21864. "adcs r3, r3, r7\n\t"
  21865. "adc r4, r4, #0\n\t"
  21866. #else
  21867. "umull r6, r7, r8, r9\n\t"
  21868. "adds r5, r5, r6\n\t"
  21869. "adcs r3, r3, r7\n\t"
  21870. "mov r4, #0\n\t"
  21871. "adc r4, r4, #0\n\t"
  21872. #endif
  21873. /* A[10] * B[4] */
  21874. "ldr r8, [%[a], #40]\n\t"
  21875. "ldr r9, [%[b], #16]\n\t"
  21876. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21877. "lsl r6, r8, #16\n\t"
  21878. "lsl r7, r9, #16\n\t"
  21879. "lsr r6, r6, #16\n\t"
  21880. "lsr r7, r7, #16\n\t"
  21881. "mul r7, r6, r7\n\t"
  21882. "adds r5, r5, r7\n\t"
  21883. "adcs r3, r3, #0\n\t"
  21884. "adc r4, r4, #0\n\t"
  21885. "lsr r7, r9, #16\n\t"
  21886. "mul r6, r7, r6\n\t"
  21887. "lsr r7, r6, #16\n\t"
  21888. "lsl r6, r6, #16\n\t"
  21889. "adds r5, r5, r6\n\t"
  21890. "adcs r3, r3, r7\n\t"
  21891. "adc r4, r4, #0\n\t"
  21892. "lsr r6, r8, #16\n\t"
  21893. "lsr r7, r9, #16\n\t"
  21894. "mul r7, r6, r7\n\t"
  21895. "adds r3, r3, r7\n\t"
  21896. "adc r4, r4, #0\n\t"
  21897. "lsl r7, r9, #16\n\t"
  21898. "lsr r7, r7, #16\n\t"
  21899. "mul r6, r7, r6\n\t"
  21900. "lsr r7, r6, #16\n\t"
  21901. "lsl r6, r6, #16\n\t"
  21902. "adds r5, r5, r6\n\t"
  21903. "adcs r3, r3, r7\n\t"
  21904. "adc r4, r4, #0\n\t"
  21905. #else
  21906. "umull r6, r7, r8, r9\n\t"
  21907. "adds r5, r5, r6\n\t"
  21908. "adcs r3, r3, r7\n\t"
  21909. "adc r4, r4, #0\n\t"
  21910. #endif
  21911. /* A[9] * B[5] */
  21912. "ldr r8, [%[a], #36]\n\t"
  21913. "ldr r9, [%[b], #20]\n\t"
  21914. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21915. "lsl r6, r8, #16\n\t"
  21916. "lsl r7, r9, #16\n\t"
  21917. "lsr r6, r6, #16\n\t"
  21918. "lsr r7, r7, #16\n\t"
  21919. "mul r7, r6, r7\n\t"
  21920. "adds r5, r5, r7\n\t"
  21921. "adcs r3, r3, #0\n\t"
  21922. "adc r4, r4, #0\n\t"
  21923. "lsr r7, r9, #16\n\t"
  21924. "mul r6, r7, r6\n\t"
  21925. "lsr r7, r6, #16\n\t"
  21926. "lsl r6, r6, #16\n\t"
  21927. "adds r5, r5, r6\n\t"
  21928. "adcs r3, r3, r7\n\t"
  21929. "adc r4, r4, #0\n\t"
  21930. "lsr r6, r8, #16\n\t"
  21931. "lsr r7, r9, #16\n\t"
  21932. "mul r7, r6, r7\n\t"
  21933. "adds r3, r3, r7\n\t"
  21934. "adc r4, r4, #0\n\t"
  21935. "lsl r7, r9, #16\n\t"
  21936. "lsr r7, r7, #16\n\t"
  21937. "mul r6, r7, r6\n\t"
  21938. "lsr r7, r6, #16\n\t"
  21939. "lsl r6, r6, #16\n\t"
  21940. "adds r5, r5, r6\n\t"
  21941. "adcs r3, r3, r7\n\t"
  21942. "adc r4, r4, #0\n\t"
  21943. #else
  21944. "umull r6, r7, r8, r9\n\t"
  21945. "adds r5, r5, r6\n\t"
  21946. "adcs r3, r3, r7\n\t"
  21947. "adc r4, r4, #0\n\t"
  21948. #endif
  21949. /* A[8] * B[6] */
  21950. "ldr r8, [%[a], #32]\n\t"
  21951. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21952. "lsl r6, r8, #16\n\t"
  21953. "lsl r7, r12, #16\n\t"
  21954. "lsr r6, r6, #16\n\t"
  21955. "lsr r7, r7, #16\n\t"
  21956. "mul r7, r6, r7\n\t"
  21957. "adds r5, r5, r7\n\t"
  21958. "adcs r3, r3, #0\n\t"
  21959. "adc r4, r4, #0\n\t"
  21960. "lsr r7, r12, #16\n\t"
  21961. "mul r6, r7, r6\n\t"
  21962. "lsr r7, r6, #16\n\t"
  21963. "lsl r6, r6, #16\n\t"
  21964. "adds r5, r5, r6\n\t"
  21965. "adcs r3, r3, r7\n\t"
  21966. "adc r4, r4, #0\n\t"
  21967. "lsr r6, r8, #16\n\t"
  21968. "lsr r7, r12, #16\n\t"
  21969. "mul r7, r6, r7\n\t"
  21970. "adds r3, r3, r7\n\t"
  21971. "adc r4, r4, #0\n\t"
  21972. "lsl r7, r12, #16\n\t"
  21973. "lsr r7, r7, #16\n\t"
  21974. "mul r6, r7, r6\n\t"
  21975. "lsr r7, r6, #16\n\t"
  21976. "lsl r6, r6, #16\n\t"
  21977. "adds r5, r5, r6\n\t"
  21978. "adcs r3, r3, r7\n\t"
  21979. "adc r4, r4, #0\n\t"
  21980. #else
  21981. "umull r6, r7, r8, r12\n\t"
  21982. "adds r5, r5, r6\n\t"
  21983. "adcs r3, r3, r7\n\t"
  21984. "adc r4, r4, #0\n\t"
  21985. #endif
  21986. /* A[7] * B[7] */
  21987. "ldr r11, [%[a], #28]\n\t"
  21988. "ldr r12, [%[b], #28]\n\t"
  21989. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  21990. "lsl r6, r11, #16\n\t"
  21991. "lsl r7, r12, #16\n\t"
  21992. "lsr r6, r6, #16\n\t"
  21993. "lsr r7, r7, #16\n\t"
  21994. "mul r7, r6, r7\n\t"
  21995. "adds r5, r5, r7\n\t"
  21996. "adcs r3, r3, #0\n\t"
  21997. "adc r4, r4, #0\n\t"
  21998. "lsr r7, r12, #16\n\t"
  21999. "mul r6, r7, r6\n\t"
  22000. "lsr r7, r6, #16\n\t"
  22001. "lsl r6, r6, #16\n\t"
  22002. "adds r5, r5, r6\n\t"
  22003. "adcs r3, r3, r7\n\t"
  22004. "adc r4, r4, #0\n\t"
  22005. "lsr r6, r11, #16\n\t"
  22006. "lsr r7, r12, #16\n\t"
  22007. "mul r7, r6, r7\n\t"
  22008. "adds r3, r3, r7\n\t"
  22009. "adc r4, r4, #0\n\t"
  22010. "lsl r7, r12, #16\n\t"
  22011. "lsr r7, r7, #16\n\t"
  22012. "mul r6, r7, r6\n\t"
  22013. "lsr r7, r6, #16\n\t"
  22014. "lsl r6, r6, #16\n\t"
  22015. "adds r5, r5, r6\n\t"
  22016. "adcs r3, r3, r7\n\t"
  22017. "adc r4, r4, #0\n\t"
  22018. #else
  22019. "umull r6, r7, r11, r12\n\t"
  22020. "adds r5, r5, r6\n\t"
  22021. "adcs r3, r3, r7\n\t"
  22022. "adc r4, r4, #0\n\t"
  22023. #endif
  22024. /* A[6] * B[8] */
  22025. "ldr r8, [%[a], #24]\n\t"
  22026. "ldr r9, [%[b], #32]\n\t"
  22027. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22028. "lsl r6, r8, #16\n\t"
  22029. "lsl r7, r9, #16\n\t"
  22030. "lsr r6, r6, #16\n\t"
  22031. "lsr r7, r7, #16\n\t"
  22032. "mul r7, r6, r7\n\t"
  22033. "adds r5, r5, r7\n\t"
  22034. "adcs r3, r3, #0\n\t"
  22035. "adc r4, r4, #0\n\t"
  22036. "lsr r7, r9, #16\n\t"
  22037. "mul r6, r7, r6\n\t"
  22038. "lsr r7, r6, #16\n\t"
  22039. "lsl r6, r6, #16\n\t"
  22040. "adds r5, r5, r6\n\t"
  22041. "adcs r3, r3, r7\n\t"
  22042. "adc r4, r4, #0\n\t"
  22043. "lsr r6, r8, #16\n\t"
  22044. "lsr r7, r9, #16\n\t"
  22045. "mul r7, r6, r7\n\t"
  22046. "adds r3, r3, r7\n\t"
  22047. "adc r4, r4, #0\n\t"
  22048. "lsl r7, r9, #16\n\t"
  22049. "lsr r7, r7, #16\n\t"
  22050. "mul r6, r7, r6\n\t"
  22051. "lsr r7, r6, #16\n\t"
  22052. "lsl r6, r6, #16\n\t"
  22053. "adds r5, r5, r6\n\t"
  22054. "adcs r3, r3, r7\n\t"
  22055. "adc r4, r4, #0\n\t"
  22056. #else
  22057. "umull r6, r7, r8, r9\n\t"
  22058. "adds r5, r5, r6\n\t"
  22059. "adcs r3, r3, r7\n\t"
  22060. "adc r4, r4, #0\n\t"
  22061. #endif
  22062. /* A[5] * B[9] */
  22063. "ldr r8, [%[a], #20]\n\t"
  22064. "ldr r9, [%[b], #36]\n\t"
  22065. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22066. "lsl r6, r8, #16\n\t"
  22067. "lsl r7, r9, #16\n\t"
  22068. "lsr r6, r6, #16\n\t"
  22069. "lsr r7, r7, #16\n\t"
  22070. "mul r7, r6, r7\n\t"
  22071. "adds r5, r5, r7\n\t"
  22072. "adcs r3, r3, #0\n\t"
  22073. "adc r4, r4, #0\n\t"
  22074. "lsr r7, r9, #16\n\t"
  22075. "mul r6, r7, r6\n\t"
  22076. "lsr r7, r6, #16\n\t"
  22077. "lsl r6, r6, #16\n\t"
  22078. "adds r5, r5, r6\n\t"
  22079. "adcs r3, r3, r7\n\t"
  22080. "adc r4, r4, #0\n\t"
  22081. "lsr r6, r8, #16\n\t"
  22082. "lsr r7, r9, #16\n\t"
  22083. "mul r7, r6, r7\n\t"
  22084. "adds r3, r3, r7\n\t"
  22085. "adc r4, r4, #0\n\t"
  22086. "lsl r7, r9, #16\n\t"
  22087. "lsr r7, r7, #16\n\t"
  22088. "mul r6, r7, r6\n\t"
  22089. "lsr r7, r6, #16\n\t"
  22090. "lsl r6, r6, #16\n\t"
  22091. "adds r5, r5, r6\n\t"
  22092. "adcs r3, r3, r7\n\t"
  22093. "adc r4, r4, #0\n\t"
  22094. #else
  22095. "umull r6, r7, r8, r9\n\t"
  22096. "adds r5, r5, r6\n\t"
  22097. "adcs r3, r3, r7\n\t"
  22098. "adc r4, r4, #0\n\t"
  22099. #endif
  22100. /* A[4] * B[10] */
  22101. "ldr r8, [%[a], #16]\n\t"
  22102. "ldr r9, [%[b], #40]\n\t"
  22103. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22104. "lsl r6, r8, #16\n\t"
  22105. "lsl r7, r9, #16\n\t"
  22106. "lsr r6, r6, #16\n\t"
  22107. "lsr r7, r7, #16\n\t"
  22108. "mul r7, r6, r7\n\t"
  22109. "adds r5, r5, r7\n\t"
  22110. "adcs r3, r3, #0\n\t"
  22111. "adc r4, r4, #0\n\t"
  22112. "lsr r7, r9, #16\n\t"
  22113. "mul r6, r7, r6\n\t"
  22114. "lsr r7, r6, #16\n\t"
  22115. "lsl r6, r6, #16\n\t"
  22116. "adds r5, r5, r6\n\t"
  22117. "adcs r3, r3, r7\n\t"
  22118. "adc r4, r4, #0\n\t"
  22119. "lsr r6, r8, #16\n\t"
  22120. "lsr r7, r9, #16\n\t"
  22121. "mul r7, r6, r7\n\t"
  22122. "adds r3, r3, r7\n\t"
  22123. "adc r4, r4, #0\n\t"
  22124. "lsl r7, r9, #16\n\t"
  22125. "lsr r7, r7, #16\n\t"
  22126. "mul r6, r7, r6\n\t"
  22127. "lsr r7, r6, #16\n\t"
  22128. "lsl r6, r6, #16\n\t"
  22129. "adds r5, r5, r6\n\t"
  22130. "adcs r3, r3, r7\n\t"
  22131. "adc r4, r4, #0\n\t"
  22132. #else
  22133. "umull r6, r7, r8, r9\n\t"
  22134. "adds r5, r5, r6\n\t"
  22135. "adcs r3, r3, r7\n\t"
  22136. "adc r4, r4, #0\n\t"
  22137. #endif
  22138. /* A[3] * B[11] */
  22139. "ldr r8, [%[a], #12]\n\t"
  22140. "ldr r9, [%[b], #44]\n\t"
  22141. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22142. "lsl r6, r8, #16\n\t"
  22143. "lsl r7, r9, #16\n\t"
  22144. "lsr r6, r6, #16\n\t"
  22145. "lsr r7, r7, #16\n\t"
  22146. "mul r7, r6, r7\n\t"
  22147. "adds r5, r5, r7\n\t"
  22148. "adcs r3, r3, #0\n\t"
  22149. "adc r4, r4, #0\n\t"
  22150. "lsr r7, r9, #16\n\t"
  22151. "mul r6, r7, r6\n\t"
  22152. "lsr r7, r6, #16\n\t"
  22153. "lsl r6, r6, #16\n\t"
  22154. "adds r5, r5, r6\n\t"
  22155. "adcs r3, r3, r7\n\t"
  22156. "adc r4, r4, #0\n\t"
  22157. "lsr r6, r8, #16\n\t"
  22158. "lsr r7, r9, #16\n\t"
  22159. "mul r7, r6, r7\n\t"
  22160. "adds r3, r3, r7\n\t"
  22161. "adc r4, r4, #0\n\t"
  22162. "lsl r7, r9, #16\n\t"
  22163. "lsr r7, r7, #16\n\t"
  22164. "mul r6, r7, r6\n\t"
  22165. "lsr r7, r6, #16\n\t"
  22166. "lsl r6, r6, #16\n\t"
  22167. "adds r5, r5, r6\n\t"
  22168. "adcs r3, r3, r7\n\t"
  22169. "adc r4, r4, #0\n\t"
  22170. #else
  22171. "umull r6, r7, r8, r9\n\t"
  22172. "adds r5, r5, r6\n\t"
  22173. "adcs r3, r3, r7\n\t"
  22174. "adc r4, r4, #0\n\t"
  22175. #endif
  22176. "str r5, [%[r], #56]\n\t"
  22177. /* A[4] * B[11] */
  22178. "ldr r8, [%[a], #16]\n\t"
  22179. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22180. "lsl r6, r8, #16\n\t"
  22181. "lsl r7, r9, #16\n\t"
  22182. "lsr r6, r6, #16\n\t"
  22183. "lsr r7, r7, #16\n\t"
  22184. "mul r7, r6, r7\n\t"
  22185. "adds r3, r3, r7\n\t"
  22186. "adcs r4, r4, #0\n\t"
  22187. "mov r5, #0\n\t"
  22188. "adc r5, r5, #0\n\t"
  22189. "lsr r7, r9, #16\n\t"
  22190. "mul r6, r7, r6\n\t"
  22191. "lsr r7, r6, #16\n\t"
  22192. "lsl r6, r6, #16\n\t"
  22193. "adds r3, r3, r6\n\t"
  22194. "adcs r4, r4, r7\n\t"
  22195. "adc r5, r5, #0\n\t"
  22196. "lsr r6, r8, #16\n\t"
  22197. "lsr r7, r9, #16\n\t"
  22198. "mul r7, r6, r7\n\t"
  22199. "adds r4, r4, r7\n\t"
  22200. "adc r5, r5, #0\n\t"
  22201. "lsl r7, r9, #16\n\t"
  22202. "lsr r7, r7, #16\n\t"
  22203. "mul r6, r7, r6\n\t"
  22204. "lsr r7, r6, #16\n\t"
  22205. "lsl r6, r6, #16\n\t"
  22206. "adds r3, r3, r6\n\t"
  22207. "adcs r4, r4, r7\n\t"
  22208. "adc r5, r5, #0\n\t"
  22209. #else
  22210. "umull r6, r7, r8, r9\n\t"
  22211. "adds r3, r3, r6\n\t"
  22212. "adcs r4, r4, r7\n\t"
  22213. "mov r5, #0\n\t"
  22214. "adc r5, r5, #0\n\t"
  22215. #endif
  22216. /* A[5] * B[10] */
  22217. "ldr r8, [%[a], #20]\n\t"
  22218. "ldr r9, [%[b], #40]\n\t"
  22219. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22220. "lsl r6, r8, #16\n\t"
  22221. "lsl r7, r9, #16\n\t"
  22222. "lsr r6, r6, #16\n\t"
  22223. "lsr r7, r7, #16\n\t"
  22224. "mul r7, r6, r7\n\t"
  22225. "adds r3, r3, r7\n\t"
  22226. "adcs r4, r4, #0\n\t"
  22227. "adc r5, r5, #0\n\t"
  22228. "lsr r7, r9, #16\n\t"
  22229. "mul r6, r7, r6\n\t"
  22230. "lsr r7, r6, #16\n\t"
  22231. "lsl r6, r6, #16\n\t"
  22232. "adds r3, r3, r6\n\t"
  22233. "adcs r4, r4, r7\n\t"
  22234. "adc r5, r5, #0\n\t"
  22235. "lsr r6, r8, #16\n\t"
  22236. "lsr r7, r9, #16\n\t"
  22237. "mul r7, r6, r7\n\t"
  22238. "adds r4, r4, r7\n\t"
  22239. "adc r5, r5, #0\n\t"
  22240. "lsl r7, r9, #16\n\t"
  22241. "lsr r7, r7, #16\n\t"
  22242. "mul r6, r7, r6\n\t"
  22243. "lsr r7, r6, #16\n\t"
  22244. "lsl r6, r6, #16\n\t"
  22245. "adds r3, r3, r6\n\t"
  22246. "adcs r4, r4, r7\n\t"
  22247. "adc r5, r5, #0\n\t"
  22248. #else
  22249. "umull r6, r7, r8, r9\n\t"
  22250. "adds r3, r3, r6\n\t"
  22251. "adcs r4, r4, r7\n\t"
  22252. "adc r5, r5, #0\n\t"
  22253. #endif
  22254. /* A[6] * B[9] */
  22255. "ldr r8, [%[a], #24]\n\t"
  22256. "ldr r9, [%[b], #36]\n\t"
  22257. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22258. "lsl r6, r8, #16\n\t"
  22259. "lsl r7, r9, #16\n\t"
  22260. "lsr r6, r6, #16\n\t"
  22261. "lsr r7, r7, #16\n\t"
  22262. "mul r7, r6, r7\n\t"
  22263. "adds r3, r3, r7\n\t"
  22264. "adcs r4, r4, #0\n\t"
  22265. "adc r5, r5, #0\n\t"
  22266. "lsr r7, r9, #16\n\t"
  22267. "mul r6, r7, r6\n\t"
  22268. "lsr r7, r6, #16\n\t"
  22269. "lsl r6, r6, #16\n\t"
  22270. "adds r3, r3, r6\n\t"
  22271. "adcs r4, r4, r7\n\t"
  22272. "adc r5, r5, #0\n\t"
  22273. "lsr r6, r8, #16\n\t"
  22274. "lsr r7, r9, #16\n\t"
  22275. "mul r7, r6, r7\n\t"
  22276. "adds r4, r4, r7\n\t"
  22277. "adc r5, r5, #0\n\t"
  22278. "lsl r7, r9, #16\n\t"
  22279. "lsr r7, r7, #16\n\t"
  22280. "mul r6, r7, r6\n\t"
  22281. "lsr r7, r6, #16\n\t"
  22282. "lsl r6, r6, #16\n\t"
  22283. "adds r3, r3, r6\n\t"
  22284. "adcs r4, r4, r7\n\t"
  22285. "adc r5, r5, #0\n\t"
  22286. #else
  22287. "umull r6, r7, r8, r9\n\t"
  22288. "adds r3, r3, r6\n\t"
  22289. "adcs r4, r4, r7\n\t"
  22290. "adc r5, r5, #0\n\t"
  22291. #endif
  22292. /* A[7] * B[8] */
  22293. "ldr r9, [%[b], #32]\n\t"
  22294. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22295. "lsl r6, r11, #16\n\t"
  22296. "lsl r7, r9, #16\n\t"
  22297. "lsr r6, r6, #16\n\t"
  22298. "lsr r7, r7, #16\n\t"
  22299. "mul r7, r6, r7\n\t"
  22300. "adds r3, r3, r7\n\t"
  22301. "adcs r4, r4, #0\n\t"
  22302. "adc r5, r5, #0\n\t"
  22303. "lsr r7, r9, #16\n\t"
  22304. "mul r6, r7, r6\n\t"
  22305. "lsr r7, r6, #16\n\t"
  22306. "lsl r6, r6, #16\n\t"
  22307. "adds r3, r3, r6\n\t"
  22308. "adcs r4, r4, r7\n\t"
  22309. "adc r5, r5, #0\n\t"
  22310. "lsr r6, r11, #16\n\t"
  22311. "lsr r7, r9, #16\n\t"
  22312. "mul r7, r6, r7\n\t"
  22313. "adds r4, r4, r7\n\t"
  22314. "adc r5, r5, #0\n\t"
  22315. "lsl r7, r9, #16\n\t"
  22316. "lsr r7, r7, #16\n\t"
  22317. "mul r6, r7, r6\n\t"
  22318. "lsr r7, r6, #16\n\t"
  22319. "lsl r6, r6, #16\n\t"
  22320. "adds r3, r3, r6\n\t"
  22321. "adcs r4, r4, r7\n\t"
  22322. "adc r5, r5, #0\n\t"
  22323. #else
  22324. "umull r6, r7, r11, r9\n\t"
  22325. "adds r3, r3, r6\n\t"
  22326. "adcs r4, r4, r7\n\t"
  22327. "adc r5, r5, #0\n\t"
  22328. #endif
  22329. /* A[8] * B[7] */
  22330. "ldr r8, [%[a], #32]\n\t"
  22331. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22332. "lsl r6, r8, #16\n\t"
  22333. "lsl r7, r12, #16\n\t"
  22334. "lsr r6, r6, #16\n\t"
  22335. "lsr r7, r7, #16\n\t"
  22336. "mul r7, r6, r7\n\t"
  22337. "adds r3, r3, r7\n\t"
  22338. "adcs r4, r4, #0\n\t"
  22339. "adc r5, r5, #0\n\t"
  22340. "lsr r7, r12, #16\n\t"
  22341. "mul r6, r7, r6\n\t"
  22342. "lsr r7, r6, #16\n\t"
  22343. "lsl r6, r6, #16\n\t"
  22344. "adds r3, r3, r6\n\t"
  22345. "adcs r4, r4, r7\n\t"
  22346. "adc r5, r5, #0\n\t"
  22347. "lsr r6, r8, #16\n\t"
  22348. "lsr r7, r12, #16\n\t"
  22349. "mul r7, r6, r7\n\t"
  22350. "adds r4, r4, r7\n\t"
  22351. "adc r5, r5, #0\n\t"
  22352. "lsl r7, r12, #16\n\t"
  22353. "lsr r7, r7, #16\n\t"
  22354. "mul r6, r7, r6\n\t"
  22355. "lsr r7, r6, #16\n\t"
  22356. "lsl r6, r6, #16\n\t"
  22357. "adds r3, r3, r6\n\t"
  22358. "adcs r4, r4, r7\n\t"
  22359. "adc r5, r5, #0\n\t"
  22360. #else
  22361. "umull r6, r7, r8, r12\n\t"
  22362. "adds r3, r3, r6\n\t"
  22363. "adcs r4, r4, r7\n\t"
  22364. "adc r5, r5, #0\n\t"
  22365. #endif
  22366. /* A[9] * B[6] */
  22367. "ldr r8, [%[a], #36]\n\t"
  22368. "ldr r9, [%[b], #24]\n\t"
  22369. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22370. "lsl r6, r8, #16\n\t"
  22371. "lsl r7, r9, #16\n\t"
  22372. "lsr r6, r6, #16\n\t"
  22373. "lsr r7, r7, #16\n\t"
  22374. "mul r7, r6, r7\n\t"
  22375. "adds r3, r3, r7\n\t"
  22376. "adcs r4, r4, #0\n\t"
  22377. "adc r5, r5, #0\n\t"
  22378. "lsr r7, r9, #16\n\t"
  22379. "mul r6, r7, r6\n\t"
  22380. "lsr r7, r6, #16\n\t"
  22381. "lsl r6, r6, #16\n\t"
  22382. "adds r3, r3, r6\n\t"
  22383. "adcs r4, r4, r7\n\t"
  22384. "adc r5, r5, #0\n\t"
  22385. "lsr r6, r8, #16\n\t"
  22386. "lsr r7, r9, #16\n\t"
  22387. "mul r7, r6, r7\n\t"
  22388. "adds r4, r4, r7\n\t"
  22389. "adc r5, r5, #0\n\t"
  22390. "lsl r7, r9, #16\n\t"
  22391. "lsr r7, r7, #16\n\t"
  22392. "mul r6, r7, r6\n\t"
  22393. "lsr r7, r6, #16\n\t"
  22394. "lsl r6, r6, #16\n\t"
  22395. "adds r3, r3, r6\n\t"
  22396. "adcs r4, r4, r7\n\t"
  22397. "adc r5, r5, #0\n\t"
  22398. #else
  22399. "umull r6, r7, r8, r9\n\t"
  22400. "adds r3, r3, r6\n\t"
  22401. "adcs r4, r4, r7\n\t"
  22402. "adc r5, r5, #0\n\t"
  22403. #endif
  22404. /* A[10] * B[5] */
  22405. "ldr r8, [%[a], #40]\n\t"
  22406. "ldr r9, [%[b], #20]\n\t"
  22407. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22408. "lsl r6, r8, #16\n\t"
  22409. "lsl r7, r9, #16\n\t"
  22410. "lsr r6, r6, #16\n\t"
  22411. "lsr r7, r7, #16\n\t"
  22412. "mul r7, r6, r7\n\t"
  22413. "adds r3, r3, r7\n\t"
  22414. "adcs r4, r4, #0\n\t"
  22415. "adc r5, r5, #0\n\t"
  22416. "lsr r7, r9, #16\n\t"
  22417. "mul r6, r7, r6\n\t"
  22418. "lsr r7, r6, #16\n\t"
  22419. "lsl r6, r6, #16\n\t"
  22420. "adds r3, r3, r6\n\t"
  22421. "adcs r4, r4, r7\n\t"
  22422. "adc r5, r5, #0\n\t"
  22423. "lsr r6, r8, #16\n\t"
  22424. "lsr r7, r9, #16\n\t"
  22425. "mul r7, r6, r7\n\t"
  22426. "adds r4, r4, r7\n\t"
  22427. "adc r5, r5, #0\n\t"
  22428. "lsl r7, r9, #16\n\t"
  22429. "lsr r7, r7, #16\n\t"
  22430. "mul r6, r7, r6\n\t"
  22431. "lsr r7, r6, #16\n\t"
  22432. "lsl r6, r6, #16\n\t"
  22433. "adds r3, r3, r6\n\t"
  22434. "adcs r4, r4, r7\n\t"
  22435. "adc r5, r5, #0\n\t"
  22436. #else
  22437. "umull r6, r7, r8, r9\n\t"
  22438. "adds r3, r3, r6\n\t"
  22439. "adcs r4, r4, r7\n\t"
  22440. "adc r5, r5, #0\n\t"
  22441. #endif
  22442. /* A[11] * B[4] */
  22443. "ldr r8, [%[a], #44]\n\t"
  22444. "ldr r9, [%[b], #16]\n\t"
  22445. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22446. "lsl r6, r8, #16\n\t"
  22447. "lsl r7, r9, #16\n\t"
  22448. "lsr r6, r6, #16\n\t"
  22449. "lsr r7, r7, #16\n\t"
  22450. "mul r7, r6, r7\n\t"
  22451. "adds r3, r3, r7\n\t"
  22452. "adcs r4, r4, #0\n\t"
  22453. "adc r5, r5, #0\n\t"
  22454. "lsr r7, r9, #16\n\t"
  22455. "mul r6, r7, r6\n\t"
  22456. "lsr r7, r6, #16\n\t"
  22457. "lsl r6, r6, #16\n\t"
  22458. "adds r3, r3, r6\n\t"
  22459. "adcs r4, r4, r7\n\t"
  22460. "adc r5, r5, #0\n\t"
  22461. "lsr r6, r8, #16\n\t"
  22462. "lsr r7, r9, #16\n\t"
  22463. "mul r7, r6, r7\n\t"
  22464. "adds r4, r4, r7\n\t"
  22465. "adc r5, r5, #0\n\t"
  22466. "lsl r7, r9, #16\n\t"
  22467. "lsr r7, r7, #16\n\t"
  22468. "mul r6, r7, r6\n\t"
  22469. "lsr r7, r6, #16\n\t"
  22470. "lsl r6, r6, #16\n\t"
  22471. "adds r3, r3, r6\n\t"
  22472. "adcs r4, r4, r7\n\t"
  22473. "adc r5, r5, #0\n\t"
  22474. #else
  22475. "umull r6, r7, r8, r9\n\t"
  22476. "adds r3, r3, r6\n\t"
  22477. "adcs r4, r4, r7\n\t"
  22478. "adc r5, r5, #0\n\t"
  22479. #endif
  22480. "str r3, [%[r], #60]\n\t"
  22481. /* A[11] * B[5] */
  22482. "ldr r9, [%[b], #20]\n\t"
  22483. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22484. "lsl r6, r8, #16\n\t"
  22485. "lsl r7, r9, #16\n\t"
  22486. "lsr r6, r6, #16\n\t"
  22487. "lsr r7, r7, #16\n\t"
  22488. "mul r7, r6, r7\n\t"
  22489. "adds r4, r4, r7\n\t"
  22490. "adcs r5, r5, #0\n\t"
  22491. "mov r3, #0\n\t"
  22492. "adc r3, r3, #0\n\t"
  22493. "lsr r7, r9, #16\n\t"
  22494. "mul r6, r7, r6\n\t"
  22495. "lsr r7, r6, #16\n\t"
  22496. "lsl r6, r6, #16\n\t"
  22497. "adds r4, r4, r6\n\t"
  22498. "adcs r5, r5, r7\n\t"
  22499. "adc r3, r3, #0\n\t"
  22500. "lsr r6, r8, #16\n\t"
  22501. "lsr r7, r9, #16\n\t"
  22502. "mul r7, r6, r7\n\t"
  22503. "adds r5, r5, r7\n\t"
  22504. "adc r3, r3, #0\n\t"
  22505. "lsl r7, r9, #16\n\t"
  22506. "lsr r7, r7, #16\n\t"
  22507. "mul r6, r7, r6\n\t"
  22508. "lsr r7, r6, #16\n\t"
  22509. "lsl r6, r6, #16\n\t"
  22510. "adds r4, r4, r6\n\t"
  22511. "adcs r5, r5, r7\n\t"
  22512. "adc r3, r3, #0\n\t"
  22513. #else
  22514. "umull r6, r7, r8, r9\n\t"
  22515. "adds r4, r4, r6\n\t"
  22516. "adcs r5, r5, r7\n\t"
  22517. "mov r3, #0\n\t"
  22518. "adc r3, r3, #0\n\t"
  22519. #endif
  22520. /* A[10] * B[6] */
  22521. "ldr r8, [%[a], #40]\n\t"
  22522. "ldr r9, [%[b], #24]\n\t"
  22523. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22524. "lsl r6, r8, #16\n\t"
  22525. "lsl r7, r9, #16\n\t"
  22526. "lsr r6, r6, #16\n\t"
  22527. "lsr r7, r7, #16\n\t"
  22528. "mul r7, r6, r7\n\t"
  22529. "adds r4, r4, r7\n\t"
  22530. "adcs r5, r5, #0\n\t"
  22531. "adc r3, r3, #0\n\t"
  22532. "lsr r7, r9, #16\n\t"
  22533. "mul r6, r7, r6\n\t"
  22534. "lsr r7, r6, #16\n\t"
  22535. "lsl r6, r6, #16\n\t"
  22536. "adds r4, r4, r6\n\t"
  22537. "adcs r5, r5, r7\n\t"
  22538. "adc r3, r3, #0\n\t"
  22539. "lsr r6, r8, #16\n\t"
  22540. "lsr r7, r9, #16\n\t"
  22541. "mul r7, r6, r7\n\t"
  22542. "adds r5, r5, r7\n\t"
  22543. "adc r3, r3, #0\n\t"
  22544. "lsl r7, r9, #16\n\t"
  22545. "lsr r7, r7, #16\n\t"
  22546. "mul r6, r7, r6\n\t"
  22547. "lsr r7, r6, #16\n\t"
  22548. "lsl r6, r6, #16\n\t"
  22549. "adds r4, r4, r6\n\t"
  22550. "adcs r5, r5, r7\n\t"
  22551. "adc r3, r3, #0\n\t"
  22552. #else
  22553. "umull r6, r7, r8, r9\n\t"
  22554. "adds r4, r4, r6\n\t"
  22555. "adcs r5, r5, r7\n\t"
  22556. "adc r3, r3, #0\n\t"
  22557. #endif
  22558. /* A[9] * B[7] */
  22559. "ldr r8, [%[a], #36]\n\t"
  22560. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22561. "lsl r6, r8, #16\n\t"
  22562. "lsl r7, r12, #16\n\t"
  22563. "lsr r6, r6, #16\n\t"
  22564. "lsr r7, r7, #16\n\t"
  22565. "mul r7, r6, r7\n\t"
  22566. "adds r4, r4, r7\n\t"
  22567. "adcs r5, r5, #0\n\t"
  22568. "adc r3, r3, #0\n\t"
  22569. "lsr r7, r12, #16\n\t"
  22570. "mul r6, r7, r6\n\t"
  22571. "lsr r7, r6, #16\n\t"
  22572. "lsl r6, r6, #16\n\t"
  22573. "adds r4, r4, r6\n\t"
  22574. "adcs r5, r5, r7\n\t"
  22575. "adc r3, r3, #0\n\t"
  22576. "lsr r6, r8, #16\n\t"
  22577. "lsr r7, r12, #16\n\t"
  22578. "mul r7, r6, r7\n\t"
  22579. "adds r5, r5, r7\n\t"
  22580. "adc r3, r3, #0\n\t"
  22581. "lsl r7, r12, #16\n\t"
  22582. "lsr r7, r7, #16\n\t"
  22583. "mul r6, r7, r6\n\t"
  22584. "lsr r7, r6, #16\n\t"
  22585. "lsl r6, r6, #16\n\t"
  22586. "adds r4, r4, r6\n\t"
  22587. "adcs r5, r5, r7\n\t"
  22588. "adc r3, r3, #0\n\t"
  22589. #else
  22590. "umull r6, r7, r8, r12\n\t"
  22591. "adds r4, r4, r6\n\t"
  22592. "adcs r5, r5, r7\n\t"
  22593. "adc r3, r3, #0\n\t"
  22594. #endif
  22595. /* A[8] * B[8] */
  22596. "ldr r11, [%[a], #32]\n\t"
  22597. "ldr r12, [%[b], #32]\n\t"
  22598. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22599. "lsl r6, r11, #16\n\t"
  22600. "lsl r7, r12, #16\n\t"
  22601. "lsr r6, r6, #16\n\t"
  22602. "lsr r7, r7, #16\n\t"
  22603. "mul r7, r6, r7\n\t"
  22604. "adds r4, r4, r7\n\t"
  22605. "adcs r5, r5, #0\n\t"
  22606. "adc r3, r3, #0\n\t"
  22607. "lsr r7, r12, #16\n\t"
  22608. "mul r6, r7, r6\n\t"
  22609. "lsr r7, r6, #16\n\t"
  22610. "lsl r6, r6, #16\n\t"
  22611. "adds r4, r4, r6\n\t"
  22612. "adcs r5, r5, r7\n\t"
  22613. "adc r3, r3, #0\n\t"
  22614. "lsr r6, r11, #16\n\t"
  22615. "lsr r7, r12, #16\n\t"
  22616. "mul r7, r6, r7\n\t"
  22617. "adds r5, r5, r7\n\t"
  22618. "adc r3, r3, #0\n\t"
  22619. "lsl r7, r12, #16\n\t"
  22620. "lsr r7, r7, #16\n\t"
  22621. "mul r6, r7, r6\n\t"
  22622. "lsr r7, r6, #16\n\t"
  22623. "lsl r6, r6, #16\n\t"
  22624. "adds r4, r4, r6\n\t"
  22625. "adcs r5, r5, r7\n\t"
  22626. "adc r3, r3, #0\n\t"
  22627. #else
  22628. "umull r6, r7, r11, r12\n\t"
  22629. "adds r4, r4, r6\n\t"
  22630. "adcs r5, r5, r7\n\t"
  22631. "adc r3, r3, #0\n\t"
  22632. #endif
  22633. /* A[7] * B[9] */
  22634. "ldr r8, [%[a], #28]\n\t"
  22635. "ldr r9, [%[b], #36]\n\t"
  22636. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22637. "lsl r6, r8, #16\n\t"
  22638. "lsl r7, r9, #16\n\t"
  22639. "lsr r6, r6, #16\n\t"
  22640. "lsr r7, r7, #16\n\t"
  22641. "mul r7, r6, r7\n\t"
  22642. "adds r4, r4, r7\n\t"
  22643. "adcs r5, r5, #0\n\t"
  22644. "adc r3, r3, #0\n\t"
  22645. "lsr r7, r9, #16\n\t"
  22646. "mul r6, r7, r6\n\t"
  22647. "lsr r7, r6, #16\n\t"
  22648. "lsl r6, r6, #16\n\t"
  22649. "adds r4, r4, r6\n\t"
  22650. "adcs r5, r5, r7\n\t"
  22651. "adc r3, r3, #0\n\t"
  22652. "lsr r6, r8, #16\n\t"
  22653. "lsr r7, r9, #16\n\t"
  22654. "mul r7, r6, r7\n\t"
  22655. "adds r5, r5, r7\n\t"
  22656. "adc r3, r3, #0\n\t"
  22657. "lsl r7, r9, #16\n\t"
  22658. "lsr r7, r7, #16\n\t"
  22659. "mul r6, r7, r6\n\t"
  22660. "lsr r7, r6, #16\n\t"
  22661. "lsl r6, r6, #16\n\t"
  22662. "adds r4, r4, r6\n\t"
  22663. "adcs r5, r5, r7\n\t"
  22664. "adc r3, r3, #0\n\t"
  22665. #else
  22666. "umull r6, r7, r8, r9\n\t"
  22667. "adds r4, r4, r6\n\t"
  22668. "adcs r5, r5, r7\n\t"
  22669. "adc r3, r3, #0\n\t"
  22670. #endif
  22671. /* A[6] * B[10] */
  22672. "ldr r8, [%[a], #24]\n\t"
  22673. "ldr r9, [%[b], #40]\n\t"
  22674. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22675. "lsl r6, r8, #16\n\t"
  22676. "lsl r7, r9, #16\n\t"
  22677. "lsr r6, r6, #16\n\t"
  22678. "lsr r7, r7, #16\n\t"
  22679. "mul r7, r6, r7\n\t"
  22680. "adds r4, r4, r7\n\t"
  22681. "adcs r5, r5, #0\n\t"
  22682. "adc r3, r3, #0\n\t"
  22683. "lsr r7, r9, #16\n\t"
  22684. "mul r6, r7, r6\n\t"
  22685. "lsr r7, r6, #16\n\t"
  22686. "lsl r6, r6, #16\n\t"
  22687. "adds r4, r4, r6\n\t"
  22688. "adcs r5, r5, r7\n\t"
  22689. "adc r3, r3, #0\n\t"
  22690. "lsr r6, r8, #16\n\t"
  22691. "lsr r7, r9, #16\n\t"
  22692. "mul r7, r6, r7\n\t"
  22693. "adds r5, r5, r7\n\t"
  22694. "adc r3, r3, #0\n\t"
  22695. "lsl r7, r9, #16\n\t"
  22696. "lsr r7, r7, #16\n\t"
  22697. "mul r6, r7, r6\n\t"
  22698. "lsr r7, r6, #16\n\t"
  22699. "lsl r6, r6, #16\n\t"
  22700. "adds r4, r4, r6\n\t"
  22701. "adcs r5, r5, r7\n\t"
  22702. "adc r3, r3, #0\n\t"
  22703. #else
  22704. "umull r6, r7, r8, r9\n\t"
  22705. "adds r4, r4, r6\n\t"
  22706. "adcs r5, r5, r7\n\t"
  22707. "adc r3, r3, #0\n\t"
  22708. #endif
  22709. /* A[5] * B[11] */
  22710. "ldr r8, [%[a], #20]\n\t"
  22711. "ldr r9, [%[b], #44]\n\t"
  22712. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22713. "lsl r6, r8, #16\n\t"
  22714. "lsl r7, r9, #16\n\t"
  22715. "lsr r6, r6, #16\n\t"
  22716. "lsr r7, r7, #16\n\t"
  22717. "mul r7, r6, r7\n\t"
  22718. "adds r4, r4, r7\n\t"
  22719. "adcs r5, r5, #0\n\t"
  22720. "adc r3, r3, #0\n\t"
  22721. "lsr r7, r9, #16\n\t"
  22722. "mul r6, r7, r6\n\t"
  22723. "lsr r7, r6, #16\n\t"
  22724. "lsl r6, r6, #16\n\t"
  22725. "adds r4, r4, r6\n\t"
  22726. "adcs r5, r5, r7\n\t"
  22727. "adc r3, r3, #0\n\t"
  22728. "lsr r6, r8, #16\n\t"
  22729. "lsr r7, r9, #16\n\t"
  22730. "mul r7, r6, r7\n\t"
  22731. "adds r5, r5, r7\n\t"
  22732. "adc r3, r3, #0\n\t"
  22733. "lsl r7, r9, #16\n\t"
  22734. "lsr r7, r7, #16\n\t"
  22735. "mul r6, r7, r6\n\t"
  22736. "lsr r7, r6, #16\n\t"
  22737. "lsl r6, r6, #16\n\t"
  22738. "adds r4, r4, r6\n\t"
  22739. "adcs r5, r5, r7\n\t"
  22740. "adc r3, r3, #0\n\t"
  22741. #else
  22742. "umull r6, r7, r8, r9\n\t"
  22743. "adds r4, r4, r6\n\t"
  22744. "adcs r5, r5, r7\n\t"
  22745. "adc r3, r3, #0\n\t"
  22746. #endif
  22747. "str r4, [%[r], #64]\n\t"
  22748. /* A[6] * B[11] */
  22749. "ldr r8, [%[a], #24]\n\t"
  22750. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22751. "lsl r6, r8, #16\n\t"
  22752. "lsl r7, r9, #16\n\t"
  22753. "lsr r6, r6, #16\n\t"
  22754. "lsr r7, r7, #16\n\t"
  22755. "mul r7, r6, r7\n\t"
  22756. "adds r5, r5, r7\n\t"
  22757. "adcs r3, r3, #0\n\t"
  22758. "mov r4, #0\n\t"
  22759. "adc r4, r4, #0\n\t"
  22760. "lsr r7, r9, #16\n\t"
  22761. "mul r6, r7, r6\n\t"
  22762. "lsr r7, r6, #16\n\t"
  22763. "lsl r6, r6, #16\n\t"
  22764. "adds r5, r5, r6\n\t"
  22765. "adcs r3, r3, r7\n\t"
  22766. "adc r4, r4, #0\n\t"
  22767. "lsr r6, r8, #16\n\t"
  22768. "lsr r7, r9, #16\n\t"
  22769. "mul r7, r6, r7\n\t"
  22770. "adds r3, r3, r7\n\t"
  22771. "adc r4, r4, #0\n\t"
  22772. "lsl r7, r9, #16\n\t"
  22773. "lsr r7, r7, #16\n\t"
  22774. "mul r6, r7, r6\n\t"
  22775. "lsr r7, r6, #16\n\t"
  22776. "lsl r6, r6, #16\n\t"
  22777. "adds r5, r5, r6\n\t"
  22778. "adcs r3, r3, r7\n\t"
  22779. "adc r4, r4, #0\n\t"
  22780. #else
  22781. "umull r6, r7, r8, r9\n\t"
  22782. "adds r5, r5, r6\n\t"
  22783. "adcs r3, r3, r7\n\t"
  22784. "mov r4, #0\n\t"
  22785. "adc r4, r4, #0\n\t"
  22786. #endif
  22787. /* A[7] * B[10] */
  22788. "ldr r8, [%[a], #28]\n\t"
  22789. "ldr r9, [%[b], #40]\n\t"
  22790. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22791. "lsl r6, r8, #16\n\t"
  22792. "lsl r7, r9, #16\n\t"
  22793. "lsr r6, r6, #16\n\t"
  22794. "lsr r7, r7, #16\n\t"
  22795. "mul r7, r6, r7\n\t"
  22796. "adds r5, r5, r7\n\t"
  22797. "adcs r3, r3, #0\n\t"
  22798. "adc r4, r4, #0\n\t"
  22799. "lsr r7, r9, #16\n\t"
  22800. "mul r6, r7, r6\n\t"
  22801. "lsr r7, r6, #16\n\t"
  22802. "lsl r6, r6, #16\n\t"
  22803. "adds r5, r5, r6\n\t"
  22804. "adcs r3, r3, r7\n\t"
  22805. "adc r4, r4, #0\n\t"
  22806. "lsr r6, r8, #16\n\t"
  22807. "lsr r7, r9, #16\n\t"
  22808. "mul r7, r6, r7\n\t"
  22809. "adds r3, r3, r7\n\t"
  22810. "adc r4, r4, #0\n\t"
  22811. "lsl r7, r9, #16\n\t"
  22812. "lsr r7, r7, #16\n\t"
  22813. "mul r6, r7, r6\n\t"
  22814. "lsr r7, r6, #16\n\t"
  22815. "lsl r6, r6, #16\n\t"
  22816. "adds r5, r5, r6\n\t"
  22817. "adcs r3, r3, r7\n\t"
  22818. "adc r4, r4, #0\n\t"
  22819. #else
  22820. "umull r6, r7, r8, r9\n\t"
  22821. "adds r5, r5, r6\n\t"
  22822. "adcs r3, r3, r7\n\t"
  22823. "adc r4, r4, #0\n\t"
  22824. #endif
  22825. /* A[8] * B[9] */
  22826. "ldr r9, [%[b], #36]\n\t"
  22827. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22828. "lsl r6, r11, #16\n\t"
  22829. "lsl r7, r9, #16\n\t"
  22830. "lsr r6, r6, #16\n\t"
  22831. "lsr r7, r7, #16\n\t"
  22832. "mul r7, r6, r7\n\t"
  22833. "adds r5, r5, r7\n\t"
  22834. "adcs r3, r3, #0\n\t"
  22835. "adc r4, r4, #0\n\t"
  22836. "lsr r7, r9, #16\n\t"
  22837. "mul r6, r7, r6\n\t"
  22838. "lsr r7, r6, #16\n\t"
  22839. "lsl r6, r6, #16\n\t"
  22840. "adds r5, r5, r6\n\t"
  22841. "adcs r3, r3, r7\n\t"
  22842. "adc r4, r4, #0\n\t"
  22843. "lsr r6, r11, #16\n\t"
  22844. "lsr r7, r9, #16\n\t"
  22845. "mul r7, r6, r7\n\t"
  22846. "adds r3, r3, r7\n\t"
  22847. "adc r4, r4, #0\n\t"
  22848. "lsl r7, r9, #16\n\t"
  22849. "lsr r7, r7, #16\n\t"
  22850. "mul r6, r7, r6\n\t"
  22851. "lsr r7, r6, #16\n\t"
  22852. "lsl r6, r6, #16\n\t"
  22853. "adds r5, r5, r6\n\t"
  22854. "adcs r3, r3, r7\n\t"
  22855. "adc r4, r4, #0\n\t"
  22856. #else
  22857. "umull r6, r7, r11, r9\n\t"
  22858. "adds r5, r5, r6\n\t"
  22859. "adcs r3, r3, r7\n\t"
  22860. "adc r4, r4, #0\n\t"
  22861. #endif
  22862. /* A[9] * B[8] */
  22863. "ldr r8, [%[a], #36]\n\t"
  22864. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22865. "lsl r6, r8, #16\n\t"
  22866. "lsl r7, r12, #16\n\t"
  22867. "lsr r6, r6, #16\n\t"
  22868. "lsr r7, r7, #16\n\t"
  22869. "mul r7, r6, r7\n\t"
  22870. "adds r5, r5, r7\n\t"
  22871. "adcs r3, r3, #0\n\t"
  22872. "adc r4, r4, #0\n\t"
  22873. "lsr r7, r12, #16\n\t"
  22874. "mul r6, r7, r6\n\t"
  22875. "lsr r7, r6, #16\n\t"
  22876. "lsl r6, r6, #16\n\t"
  22877. "adds r5, r5, r6\n\t"
  22878. "adcs r3, r3, r7\n\t"
  22879. "adc r4, r4, #0\n\t"
  22880. "lsr r6, r8, #16\n\t"
  22881. "lsr r7, r12, #16\n\t"
  22882. "mul r7, r6, r7\n\t"
  22883. "adds r3, r3, r7\n\t"
  22884. "adc r4, r4, #0\n\t"
  22885. "lsl r7, r12, #16\n\t"
  22886. "lsr r7, r7, #16\n\t"
  22887. "mul r6, r7, r6\n\t"
  22888. "lsr r7, r6, #16\n\t"
  22889. "lsl r6, r6, #16\n\t"
  22890. "adds r5, r5, r6\n\t"
  22891. "adcs r3, r3, r7\n\t"
  22892. "adc r4, r4, #0\n\t"
  22893. #else
  22894. "umull r6, r7, r8, r12\n\t"
  22895. "adds r5, r5, r6\n\t"
  22896. "adcs r3, r3, r7\n\t"
  22897. "adc r4, r4, #0\n\t"
  22898. #endif
  22899. /* A[10] * B[7] */
  22900. "ldr r8, [%[a], #40]\n\t"
  22901. "ldr r9, [%[b], #28]\n\t"
  22902. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22903. "lsl r6, r8, #16\n\t"
  22904. "lsl r7, r9, #16\n\t"
  22905. "lsr r6, r6, #16\n\t"
  22906. "lsr r7, r7, #16\n\t"
  22907. "mul r7, r6, r7\n\t"
  22908. "adds r5, r5, r7\n\t"
  22909. "adcs r3, r3, #0\n\t"
  22910. "adc r4, r4, #0\n\t"
  22911. "lsr r7, r9, #16\n\t"
  22912. "mul r6, r7, r6\n\t"
  22913. "lsr r7, r6, #16\n\t"
  22914. "lsl r6, r6, #16\n\t"
  22915. "adds r5, r5, r6\n\t"
  22916. "adcs r3, r3, r7\n\t"
  22917. "adc r4, r4, #0\n\t"
  22918. "lsr r6, r8, #16\n\t"
  22919. "lsr r7, r9, #16\n\t"
  22920. "mul r7, r6, r7\n\t"
  22921. "adds r3, r3, r7\n\t"
  22922. "adc r4, r4, #0\n\t"
  22923. "lsl r7, r9, #16\n\t"
  22924. "lsr r7, r7, #16\n\t"
  22925. "mul r6, r7, r6\n\t"
  22926. "lsr r7, r6, #16\n\t"
  22927. "lsl r6, r6, #16\n\t"
  22928. "adds r5, r5, r6\n\t"
  22929. "adcs r3, r3, r7\n\t"
  22930. "adc r4, r4, #0\n\t"
  22931. #else
  22932. "umull r6, r7, r8, r9\n\t"
  22933. "adds r5, r5, r6\n\t"
  22934. "adcs r3, r3, r7\n\t"
  22935. "adc r4, r4, #0\n\t"
  22936. #endif
  22937. /* A[11] * B[6] */
  22938. "ldr r8, [%[a], #44]\n\t"
  22939. "ldr r9, [%[b], #24]\n\t"
  22940. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22941. "lsl r6, r8, #16\n\t"
  22942. "lsl r7, r9, #16\n\t"
  22943. "lsr r6, r6, #16\n\t"
  22944. "lsr r7, r7, #16\n\t"
  22945. "mul r7, r6, r7\n\t"
  22946. "adds r5, r5, r7\n\t"
  22947. "adcs r3, r3, #0\n\t"
  22948. "adc r4, r4, #0\n\t"
  22949. "lsr r7, r9, #16\n\t"
  22950. "mul r6, r7, r6\n\t"
  22951. "lsr r7, r6, #16\n\t"
  22952. "lsl r6, r6, #16\n\t"
  22953. "adds r5, r5, r6\n\t"
  22954. "adcs r3, r3, r7\n\t"
  22955. "adc r4, r4, #0\n\t"
  22956. "lsr r6, r8, #16\n\t"
  22957. "lsr r7, r9, #16\n\t"
  22958. "mul r7, r6, r7\n\t"
  22959. "adds r3, r3, r7\n\t"
  22960. "adc r4, r4, #0\n\t"
  22961. "lsl r7, r9, #16\n\t"
  22962. "lsr r7, r7, #16\n\t"
  22963. "mul r6, r7, r6\n\t"
  22964. "lsr r7, r6, #16\n\t"
  22965. "lsl r6, r6, #16\n\t"
  22966. "adds r5, r5, r6\n\t"
  22967. "adcs r3, r3, r7\n\t"
  22968. "adc r4, r4, #0\n\t"
  22969. #else
  22970. "umull r6, r7, r8, r9\n\t"
  22971. "adds r5, r5, r6\n\t"
  22972. "adcs r3, r3, r7\n\t"
  22973. "adc r4, r4, #0\n\t"
  22974. #endif
  22975. "str r5, [%[r], #68]\n\t"
  22976. /* A[11] * B[7] */
  22977. "ldr r9, [%[b], #28]\n\t"
  22978. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  22979. "lsl r6, r8, #16\n\t"
  22980. "lsl r7, r9, #16\n\t"
  22981. "lsr r6, r6, #16\n\t"
  22982. "lsr r7, r7, #16\n\t"
  22983. "mul r7, r6, r7\n\t"
  22984. "adds r3, r3, r7\n\t"
  22985. "adcs r4, r4, #0\n\t"
  22986. "mov r5, #0\n\t"
  22987. "adc r5, r5, #0\n\t"
  22988. "lsr r7, r9, #16\n\t"
  22989. "mul r6, r7, r6\n\t"
  22990. "lsr r7, r6, #16\n\t"
  22991. "lsl r6, r6, #16\n\t"
  22992. "adds r3, r3, r6\n\t"
  22993. "adcs r4, r4, r7\n\t"
  22994. "adc r5, r5, #0\n\t"
  22995. "lsr r6, r8, #16\n\t"
  22996. "lsr r7, r9, #16\n\t"
  22997. "mul r7, r6, r7\n\t"
  22998. "adds r4, r4, r7\n\t"
  22999. "adc r5, r5, #0\n\t"
  23000. "lsl r7, r9, #16\n\t"
  23001. "lsr r7, r7, #16\n\t"
  23002. "mul r6, r7, r6\n\t"
  23003. "lsr r7, r6, #16\n\t"
  23004. "lsl r6, r6, #16\n\t"
  23005. "adds r3, r3, r6\n\t"
  23006. "adcs r4, r4, r7\n\t"
  23007. "adc r5, r5, #0\n\t"
  23008. #else
  23009. "umull r6, r7, r8, r9\n\t"
  23010. "adds r3, r3, r6\n\t"
  23011. "adcs r4, r4, r7\n\t"
  23012. "mov r5, #0\n\t"
  23013. "adc r5, r5, #0\n\t"
  23014. #endif
  23015. /* A[10] * B[8] */
  23016. "ldr r8, [%[a], #40]\n\t"
  23017. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23018. "lsl r6, r8, #16\n\t"
  23019. "lsl r7, r12, #16\n\t"
  23020. "lsr r6, r6, #16\n\t"
  23021. "lsr r7, r7, #16\n\t"
  23022. "mul r7, r6, r7\n\t"
  23023. "adds r3, r3, r7\n\t"
  23024. "adcs r4, r4, #0\n\t"
  23025. "adc r5, r5, #0\n\t"
  23026. "lsr r7, r12, #16\n\t"
  23027. "mul r6, r7, r6\n\t"
  23028. "lsr r7, r6, #16\n\t"
  23029. "lsl r6, r6, #16\n\t"
  23030. "adds r3, r3, r6\n\t"
  23031. "adcs r4, r4, r7\n\t"
  23032. "adc r5, r5, #0\n\t"
  23033. "lsr r6, r8, #16\n\t"
  23034. "lsr r7, r12, #16\n\t"
  23035. "mul r7, r6, r7\n\t"
  23036. "adds r4, r4, r7\n\t"
  23037. "adc r5, r5, #0\n\t"
  23038. "lsl r7, r12, #16\n\t"
  23039. "lsr r7, r7, #16\n\t"
  23040. "mul r6, r7, r6\n\t"
  23041. "lsr r7, r6, #16\n\t"
  23042. "lsl r6, r6, #16\n\t"
  23043. "adds r3, r3, r6\n\t"
  23044. "adcs r4, r4, r7\n\t"
  23045. "adc r5, r5, #0\n\t"
  23046. #else
  23047. "umull r6, r7, r8, r12\n\t"
  23048. "adds r3, r3, r6\n\t"
  23049. "adcs r4, r4, r7\n\t"
  23050. "adc r5, r5, #0\n\t"
  23051. #endif
  23052. /* A[9] * B[9] */
  23053. "ldr r11, [%[a], #36]\n\t"
  23054. "ldr r12, [%[b], #36]\n\t"
  23055. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23056. "lsl r6, r11, #16\n\t"
  23057. "lsl r7, r12, #16\n\t"
  23058. "lsr r6, r6, #16\n\t"
  23059. "lsr r7, r7, #16\n\t"
  23060. "mul r7, r6, r7\n\t"
  23061. "adds r3, r3, r7\n\t"
  23062. "adcs r4, r4, #0\n\t"
  23063. "adc r5, r5, #0\n\t"
  23064. "lsr r7, r12, #16\n\t"
  23065. "mul r6, r7, r6\n\t"
  23066. "lsr r7, r6, #16\n\t"
  23067. "lsl r6, r6, #16\n\t"
  23068. "adds r3, r3, r6\n\t"
  23069. "adcs r4, r4, r7\n\t"
  23070. "adc r5, r5, #0\n\t"
  23071. "lsr r6, r11, #16\n\t"
  23072. "lsr r7, r12, #16\n\t"
  23073. "mul r7, r6, r7\n\t"
  23074. "adds r4, r4, r7\n\t"
  23075. "adc r5, r5, #0\n\t"
  23076. "lsl r7, r12, #16\n\t"
  23077. "lsr r7, r7, #16\n\t"
  23078. "mul r6, r7, r6\n\t"
  23079. "lsr r7, r6, #16\n\t"
  23080. "lsl r6, r6, #16\n\t"
  23081. "adds r3, r3, r6\n\t"
  23082. "adcs r4, r4, r7\n\t"
  23083. "adc r5, r5, #0\n\t"
  23084. #else
  23085. "umull r6, r7, r11, r12\n\t"
  23086. "adds r3, r3, r6\n\t"
  23087. "adcs r4, r4, r7\n\t"
  23088. "adc r5, r5, #0\n\t"
  23089. #endif
  23090. /* A[8] * B[10] */
  23091. "ldr r8, [%[a], #32]\n\t"
  23092. "ldr r9, [%[b], #40]\n\t"
  23093. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23094. "lsl r6, r8, #16\n\t"
  23095. "lsl r7, r9, #16\n\t"
  23096. "lsr r6, r6, #16\n\t"
  23097. "lsr r7, r7, #16\n\t"
  23098. "mul r7, r6, r7\n\t"
  23099. "adds r3, r3, r7\n\t"
  23100. "adcs r4, r4, #0\n\t"
  23101. "adc r5, r5, #0\n\t"
  23102. "lsr r7, r9, #16\n\t"
  23103. "mul r6, r7, r6\n\t"
  23104. "lsr r7, r6, #16\n\t"
  23105. "lsl r6, r6, #16\n\t"
  23106. "adds r3, r3, r6\n\t"
  23107. "adcs r4, r4, r7\n\t"
  23108. "adc r5, r5, #0\n\t"
  23109. "lsr r6, r8, #16\n\t"
  23110. "lsr r7, r9, #16\n\t"
  23111. "mul r7, r6, r7\n\t"
  23112. "adds r4, r4, r7\n\t"
  23113. "adc r5, r5, #0\n\t"
  23114. "lsl r7, r9, #16\n\t"
  23115. "lsr r7, r7, #16\n\t"
  23116. "mul r6, r7, r6\n\t"
  23117. "lsr r7, r6, #16\n\t"
  23118. "lsl r6, r6, #16\n\t"
  23119. "adds r3, r3, r6\n\t"
  23120. "adcs r4, r4, r7\n\t"
  23121. "adc r5, r5, #0\n\t"
  23122. #else
  23123. "umull r6, r7, r8, r9\n\t"
  23124. "adds r3, r3, r6\n\t"
  23125. "adcs r4, r4, r7\n\t"
  23126. "adc r5, r5, #0\n\t"
  23127. #endif
  23128. /* A[7] * B[11] */
  23129. "ldr r8, [%[a], #28]\n\t"
  23130. "ldr r9, [%[b], #44]\n\t"
  23131. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23132. "lsl r6, r8, #16\n\t"
  23133. "lsl r7, r9, #16\n\t"
  23134. "lsr r6, r6, #16\n\t"
  23135. "lsr r7, r7, #16\n\t"
  23136. "mul r7, r6, r7\n\t"
  23137. "adds r3, r3, r7\n\t"
  23138. "adcs r4, r4, #0\n\t"
  23139. "adc r5, r5, #0\n\t"
  23140. "lsr r7, r9, #16\n\t"
  23141. "mul r6, r7, r6\n\t"
  23142. "lsr r7, r6, #16\n\t"
  23143. "lsl r6, r6, #16\n\t"
  23144. "adds r3, r3, r6\n\t"
  23145. "adcs r4, r4, r7\n\t"
  23146. "adc r5, r5, #0\n\t"
  23147. "lsr r6, r8, #16\n\t"
  23148. "lsr r7, r9, #16\n\t"
  23149. "mul r7, r6, r7\n\t"
  23150. "adds r4, r4, r7\n\t"
  23151. "adc r5, r5, #0\n\t"
  23152. "lsl r7, r9, #16\n\t"
  23153. "lsr r7, r7, #16\n\t"
  23154. "mul r6, r7, r6\n\t"
  23155. "lsr r7, r6, #16\n\t"
  23156. "lsl r6, r6, #16\n\t"
  23157. "adds r3, r3, r6\n\t"
  23158. "adcs r4, r4, r7\n\t"
  23159. "adc r5, r5, #0\n\t"
  23160. #else
  23161. "umull r6, r7, r8, r9\n\t"
  23162. "adds r3, r3, r6\n\t"
  23163. "adcs r4, r4, r7\n\t"
  23164. "adc r5, r5, #0\n\t"
  23165. #endif
  23166. "str r3, [%[r], #72]\n\t"
  23167. /* A[8] * B[11] */
  23168. "ldr r8, [%[a], #32]\n\t"
  23169. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23170. "lsl r6, r8, #16\n\t"
  23171. "lsl r7, r9, #16\n\t"
  23172. "lsr r6, r6, #16\n\t"
  23173. "lsr r7, r7, #16\n\t"
  23174. "mul r7, r6, r7\n\t"
  23175. "adds r4, r4, r7\n\t"
  23176. "adcs r5, r5, #0\n\t"
  23177. "mov r3, #0\n\t"
  23178. "adc r3, r3, #0\n\t"
  23179. "lsr r7, r9, #16\n\t"
  23180. "mul r6, r7, r6\n\t"
  23181. "lsr r7, r6, #16\n\t"
  23182. "lsl r6, r6, #16\n\t"
  23183. "adds r4, r4, r6\n\t"
  23184. "adcs r5, r5, r7\n\t"
  23185. "adc r3, r3, #0\n\t"
  23186. "lsr r6, r8, #16\n\t"
  23187. "lsr r7, r9, #16\n\t"
  23188. "mul r7, r6, r7\n\t"
  23189. "adds r5, r5, r7\n\t"
  23190. "adc r3, r3, #0\n\t"
  23191. "lsl r7, r9, #16\n\t"
  23192. "lsr r7, r7, #16\n\t"
  23193. "mul r6, r7, r6\n\t"
  23194. "lsr r7, r6, #16\n\t"
  23195. "lsl r6, r6, #16\n\t"
  23196. "adds r4, r4, r6\n\t"
  23197. "adcs r5, r5, r7\n\t"
  23198. "adc r3, r3, #0\n\t"
  23199. #else
  23200. "umull r6, r7, r8, r9\n\t"
  23201. "adds r4, r4, r6\n\t"
  23202. "adcs r5, r5, r7\n\t"
  23203. "mov r3, #0\n\t"
  23204. "adc r3, r3, #0\n\t"
  23205. #endif
  23206. /* A[9] * B[10] */
  23207. "ldr r9, [%[b], #40]\n\t"
  23208. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23209. "lsl r6, r11, #16\n\t"
  23210. "lsl r7, r9, #16\n\t"
  23211. "lsr r6, r6, #16\n\t"
  23212. "lsr r7, r7, #16\n\t"
  23213. "mul r7, r6, r7\n\t"
  23214. "adds r4, r4, r7\n\t"
  23215. "adcs r5, r5, #0\n\t"
  23216. "adc r3, r3, #0\n\t"
  23217. "lsr r7, r9, #16\n\t"
  23218. "mul r6, r7, r6\n\t"
  23219. "lsr r7, r6, #16\n\t"
  23220. "lsl r6, r6, #16\n\t"
  23221. "adds r4, r4, r6\n\t"
  23222. "adcs r5, r5, r7\n\t"
  23223. "adc r3, r3, #0\n\t"
  23224. "lsr r6, r11, #16\n\t"
  23225. "lsr r7, r9, #16\n\t"
  23226. "mul r7, r6, r7\n\t"
  23227. "adds r5, r5, r7\n\t"
  23228. "adc r3, r3, #0\n\t"
  23229. "lsl r7, r9, #16\n\t"
  23230. "lsr r7, r7, #16\n\t"
  23231. "mul r6, r7, r6\n\t"
  23232. "lsr r7, r6, #16\n\t"
  23233. "lsl r6, r6, #16\n\t"
  23234. "adds r4, r4, r6\n\t"
  23235. "adcs r5, r5, r7\n\t"
  23236. "adc r3, r3, #0\n\t"
  23237. #else
  23238. "umull r6, r7, r11, r9\n\t"
  23239. "adds r4, r4, r6\n\t"
  23240. "adcs r5, r5, r7\n\t"
  23241. "adc r3, r3, #0\n\t"
  23242. #endif
  23243. /* A[10] * B[9] */
  23244. "ldr r8, [%[a], #40]\n\t"
  23245. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23246. "lsl r6, r8, #16\n\t"
  23247. "lsl r7, r12, #16\n\t"
  23248. "lsr r6, r6, #16\n\t"
  23249. "lsr r7, r7, #16\n\t"
  23250. "mul r7, r6, r7\n\t"
  23251. "adds r4, r4, r7\n\t"
  23252. "adcs r5, r5, #0\n\t"
  23253. "adc r3, r3, #0\n\t"
  23254. "lsr r7, r12, #16\n\t"
  23255. "mul r6, r7, r6\n\t"
  23256. "lsr r7, r6, #16\n\t"
  23257. "lsl r6, r6, #16\n\t"
  23258. "adds r4, r4, r6\n\t"
  23259. "adcs r5, r5, r7\n\t"
  23260. "adc r3, r3, #0\n\t"
  23261. "lsr r6, r8, #16\n\t"
  23262. "lsr r7, r12, #16\n\t"
  23263. "mul r7, r6, r7\n\t"
  23264. "adds r5, r5, r7\n\t"
  23265. "adc r3, r3, #0\n\t"
  23266. "lsl r7, r12, #16\n\t"
  23267. "lsr r7, r7, #16\n\t"
  23268. "mul r6, r7, r6\n\t"
  23269. "lsr r7, r6, #16\n\t"
  23270. "lsl r6, r6, #16\n\t"
  23271. "adds r4, r4, r6\n\t"
  23272. "adcs r5, r5, r7\n\t"
  23273. "adc r3, r3, #0\n\t"
  23274. #else
  23275. "umull r6, r7, r8, r12\n\t"
  23276. "adds r4, r4, r6\n\t"
  23277. "adcs r5, r5, r7\n\t"
  23278. "adc r3, r3, #0\n\t"
  23279. #endif
  23280. /* A[11] * B[8] */
  23281. "ldr r8, [%[a], #44]\n\t"
  23282. "ldr r9, [%[b], #32]\n\t"
  23283. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23284. "lsl r6, r8, #16\n\t"
  23285. "lsl r7, r9, #16\n\t"
  23286. "lsr r6, r6, #16\n\t"
  23287. "lsr r7, r7, #16\n\t"
  23288. "mul r7, r6, r7\n\t"
  23289. "adds r4, r4, r7\n\t"
  23290. "adcs r5, r5, #0\n\t"
  23291. "adc r3, r3, #0\n\t"
  23292. "lsr r7, r9, #16\n\t"
  23293. "mul r6, r7, r6\n\t"
  23294. "lsr r7, r6, #16\n\t"
  23295. "lsl r6, r6, #16\n\t"
  23296. "adds r4, r4, r6\n\t"
  23297. "adcs r5, r5, r7\n\t"
  23298. "adc r3, r3, #0\n\t"
  23299. "lsr r6, r8, #16\n\t"
  23300. "lsr r7, r9, #16\n\t"
  23301. "mul r7, r6, r7\n\t"
  23302. "adds r5, r5, r7\n\t"
  23303. "adc r3, r3, #0\n\t"
  23304. "lsl r7, r9, #16\n\t"
  23305. "lsr r7, r7, #16\n\t"
  23306. "mul r6, r7, r6\n\t"
  23307. "lsr r7, r6, #16\n\t"
  23308. "lsl r6, r6, #16\n\t"
  23309. "adds r4, r4, r6\n\t"
  23310. "adcs r5, r5, r7\n\t"
  23311. "adc r3, r3, #0\n\t"
  23312. #else
  23313. "umull r6, r7, r8, r9\n\t"
  23314. "adds r4, r4, r6\n\t"
  23315. "adcs r5, r5, r7\n\t"
  23316. "adc r3, r3, #0\n\t"
  23317. #endif
  23318. "str r4, [%[r], #76]\n\t"
  23319. /* A[11] * B[9] */
  23320. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23321. "lsl r6, r8, #16\n\t"
  23322. "lsl r7, r12, #16\n\t"
  23323. "lsr r6, r6, #16\n\t"
  23324. "lsr r7, r7, #16\n\t"
  23325. "mul r7, r6, r7\n\t"
  23326. "adds r5, r5, r7\n\t"
  23327. "adcs r3, r3, #0\n\t"
  23328. "mov r4, #0\n\t"
  23329. "adc r4, r4, #0\n\t"
  23330. "lsr r7, r12, #16\n\t"
  23331. "mul r6, r7, r6\n\t"
  23332. "lsr r7, r6, #16\n\t"
  23333. "lsl r6, r6, #16\n\t"
  23334. "adds r5, r5, r6\n\t"
  23335. "adcs r3, r3, r7\n\t"
  23336. "adc r4, r4, #0\n\t"
  23337. "lsr r6, r8, #16\n\t"
  23338. "lsr r7, r12, #16\n\t"
  23339. "mul r7, r6, r7\n\t"
  23340. "adds r3, r3, r7\n\t"
  23341. "adc r4, r4, #0\n\t"
  23342. "lsl r7, r12, #16\n\t"
  23343. "lsr r7, r7, #16\n\t"
  23344. "mul r6, r7, r6\n\t"
  23345. "lsr r7, r6, #16\n\t"
  23346. "lsl r6, r6, #16\n\t"
  23347. "adds r5, r5, r6\n\t"
  23348. "adcs r3, r3, r7\n\t"
  23349. "adc r4, r4, #0\n\t"
  23350. #else
  23351. "umull r6, r7, r8, r12\n\t"
  23352. "adds r5, r5, r6\n\t"
  23353. "adcs r3, r3, r7\n\t"
  23354. "mov r4, #0\n\t"
  23355. "adc r4, r4, #0\n\t"
  23356. #endif
  23357. /* A[10] * B[10] */
  23358. "ldr r11, [%[a], #40]\n\t"
  23359. "ldr r12, [%[b], #40]\n\t"
  23360. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23361. "lsl r6, r11, #16\n\t"
  23362. "lsl r7, r12, #16\n\t"
  23363. "lsr r6, r6, #16\n\t"
  23364. "lsr r7, r7, #16\n\t"
  23365. "mul r7, r6, r7\n\t"
  23366. "adds r5, r5, r7\n\t"
  23367. "adcs r3, r3, #0\n\t"
  23368. "adc r4, r4, #0\n\t"
  23369. "lsr r7, r12, #16\n\t"
  23370. "mul r6, r7, r6\n\t"
  23371. "lsr r7, r6, #16\n\t"
  23372. "lsl r6, r6, #16\n\t"
  23373. "adds r5, r5, r6\n\t"
  23374. "adcs r3, r3, r7\n\t"
  23375. "adc r4, r4, #0\n\t"
  23376. "lsr r6, r11, #16\n\t"
  23377. "lsr r7, r12, #16\n\t"
  23378. "mul r7, r6, r7\n\t"
  23379. "adds r3, r3, r7\n\t"
  23380. "adc r4, r4, #0\n\t"
  23381. "lsl r7, r12, #16\n\t"
  23382. "lsr r7, r7, #16\n\t"
  23383. "mul r6, r7, r6\n\t"
  23384. "lsr r7, r6, #16\n\t"
  23385. "lsl r6, r6, #16\n\t"
  23386. "adds r5, r5, r6\n\t"
  23387. "adcs r3, r3, r7\n\t"
  23388. "adc r4, r4, #0\n\t"
  23389. #else
  23390. "umull r6, r7, r11, r12\n\t"
  23391. "adds r5, r5, r6\n\t"
  23392. "adcs r3, r3, r7\n\t"
  23393. "adc r4, r4, #0\n\t"
  23394. #endif
  23395. /* A[9] * B[11] */
  23396. "ldr r8, [%[a], #36]\n\t"
  23397. "ldr r9, [%[b], #44]\n\t"
  23398. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23399. "lsl r6, r8, #16\n\t"
  23400. "lsl r7, r9, #16\n\t"
  23401. "lsr r6, r6, #16\n\t"
  23402. "lsr r7, r7, #16\n\t"
  23403. "mul r7, r6, r7\n\t"
  23404. "adds r5, r5, r7\n\t"
  23405. "adcs r3, r3, #0\n\t"
  23406. "adc r4, r4, #0\n\t"
  23407. "lsr r7, r9, #16\n\t"
  23408. "mul r6, r7, r6\n\t"
  23409. "lsr r7, r6, #16\n\t"
  23410. "lsl r6, r6, #16\n\t"
  23411. "adds r5, r5, r6\n\t"
  23412. "adcs r3, r3, r7\n\t"
  23413. "adc r4, r4, #0\n\t"
  23414. "lsr r6, r8, #16\n\t"
  23415. "lsr r7, r9, #16\n\t"
  23416. "mul r7, r6, r7\n\t"
  23417. "adds r3, r3, r7\n\t"
  23418. "adc r4, r4, #0\n\t"
  23419. "lsl r7, r9, #16\n\t"
  23420. "lsr r7, r7, #16\n\t"
  23421. "mul r6, r7, r6\n\t"
  23422. "lsr r7, r6, #16\n\t"
  23423. "lsl r6, r6, #16\n\t"
  23424. "adds r5, r5, r6\n\t"
  23425. "adcs r3, r3, r7\n\t"
  23426. "adc r4, r4, #0\n\t"
  23427. #else
  23428. "umull r6, r7, r8, r9\n\t"
  23429. "adds r5, r5, r6\n\t"
  23430. "adcs r3, r3, r7\n\t"
  23431. "adc r4, r4, #0\n\t"
  23432. #endif
  23433. "str r5, [%[r], #80]\n\t"
  23434. /* A[10] * B[11] */
  23435. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23436. "lsl r6, r11, #16\n\t"
  23437. "lsl r7, r9, #16\n\t"
  23438. "lsr r6, r6, #16\n\t"
  23439. "lsr r7, r7, #16\n\t"
  23440. "mul r7, r6, r7\n\t"
  23441. "adds r3, r3, r7\n\t"
  23442. "adcs r4, r4, #0\n\t"
  23443. "mov r5, #0\n\t"
  23444. "adc r5, r5, #0\n\t"
  23445. "lsr r7, r9, #16\n\t"
  23446. "mul r6, r7, r6\n\t"
  23447. "lsr r7, r6, #16\n\t"
  23448. "lsl r6, r6, #16\n\t"
  23449. "adds r3, r3, r6\n\t"
  23450. "adcs r4, r4, r7\n\t"
  23451. "adc r5, r5, #0\n\t"
  23452. "lsr r6, r11, #16\n\t"
  23453. "lsr r7, r9, #16\n\t"
  23454. "mul r7, r6, r7\n\t"
  23455. "adds r4, r4, r7\n\t"
  23456. "adc r5, r5, #0\n\t"
  23457. "lsl r7, r9, #16\n\t"
  23458. "lsr r7, r7, #16\n\t"
  23459. "mul r6, r7, r6\n\t"
  23460. "lsr r7, r6, #16\n\t"
  23461. "lsl r6, r6, #16\n\t"
  23462. "adds r3, r3, r6\n\t"
  23463. "adcs r4, r4, r7\n\t"
  23464. "adc r5, r5, #0\n\t"
  23465. #else
  23466. "umull r6, r7, r11, r9\n\t"
  23467. "adds r3, r3, r6\n\t"
  23468. "adcs r4, r4, r7\n\t"
  23469. "mov r5, #0\n\t"
  23470. "adc r5, r5, #0\n\t"
  23471. #endif
  23472. /* A[11] * B[10] */
  23473. "ldr r8, [%[a], #44]\n\t"
  23474. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23475. "lsl r6, r8, #16\n\t"
  23476. "lsl r7, r12, #16\n\t"
  23477. "lsr r6, r6, #16\n\t"
  23478. "lsr r7, r7, #16\n\t"
  23479. "mul r7, r6, r7\n\t"
  23480. "adds r3, r3, r7\n\t"
  23481. "adcs r4, r4, #0\n\t"
  23482. "adc r5, r5, #0\n\t"
  23483. "lsr r7, r12, #16\n\t"
  23484. "mul r6, r7, r6\n\t"
  23485. "lsr r7, r6, #16\n\t"
  23486. "lsl r6, r6, #16\n\t"
  23487. "adds r3, r3, r6\n\t"
  23488. "adcs r4, r4, r7\n\t"
  23489. "adc r5, r5, #0\n\t"
  23490. "lsr r6, r8, #16\n\t"
  23491. "lsr r7, r12, #16\n\t"
  23492. "mul r7, r6, r7\n\t"
  23493. "adds r4, r4, r7\n\t"
  23494. "adc r5, r5, #0\n\t"
  23495. "lsl r7, r12, #16\n\t"
  23496. "lsr r7, r7, #16\n\t"
  23497. "mul r6, r7, r6\n\t"
  23498. "lsr r7, r6, #16\n\t"
  23499. "lsl r6, r6, #16\n\t"
  23500. "adds r3, r3, r6\n\t"
  23501. "adcs r4, r4, r7\n\t"
  23502. "adc r5, r5, #0\n\t"
  23503. #else
  23504. "umull r6, r7, r8, r12\n\t"
  23505. "adds r3, r3, r6\n\t"
  23506. "adcs r4, r4, r7\n\t"
  23507. "adc r5, r5, #0\n\t"
  23508. #endif
  23509. "str r3, [%[r], #84]\n\t"
  23510. /* A[11] * B[11] */
  23511. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  23512. "lsl r6, r8, #16\n\t"
  23513. "lsl r7, r9, #16\n\t"
  23514. "lsr r6, r6, #16\n\t"
  23515. "lsr r7, r7, #16\n\t"
  23516. "mul r7, r6, r7\n\t"
  23517. "adds r4, r4, r7\n\t"
  23518. "adc r5, r5, #0\n\t"
  23519. "lsr r7, r9, #16\n\t"
  23520. "mul r6, r7, r6\n\t"
  23521. "lsr r7, r6, #16\n\t"
  23522. "lsl r6, r6, #16\n\t"
  23523. "adds r4, r4, r6\n\t"
  23524. "adc r5, r5, r7\n\t"
  23525. "lsr r6, r8, #16\n\t"
  23526. "lsr r7, r9, #16\n\t"
  23527. "mul r7, r6, r7\n\t"
  23528. "add r5, r5, r7\n\t"
  23529. "lsl r7, r9, #16\n\t"
  23530. "lsr r7, r7, #16\n\t"
  23531. "mul r6, r7, r6\n\t"
  23532. "lsr r7, r6, #16\n\t"
  23533. "lsl r6, r6, #16\n\t"
  23534. "adds r4, r4, r6\n\t"
  23535. "adc r5, r5, r7\n\t"
  23536. #else
  23537. "umlal r4, r5, r8, r9\n\t"
  23538. #endif
  23539. "str r4, [%[r], #88]\n\t"
  23540. "str r5, [%[r], #92]\n\t"
  23541. "ldm sp!, {r3, r4, r5, r6}\n\t"
  23542. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23543. "ldm sp!, {r3, r4, r5, r6}\n\t"
  23544. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23545. "ldm sp!, {r3, r4, r5, r6}\n\t"
  23546. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23547. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23548. :
  23549. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  23550. );
  23551. }
  23552. /* Add b to a into r. (r = a + b)
  23553. *
  23554. * r A single precision integer.
  23555. * a A single precision integer.
  23556. * b A single precision integer.
  23557. */
  23558. static sp_digit sp_3072_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  23559. {
  23560. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  23561. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  23562. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  23563. __asm__ __volatile__ (
  23564. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23565. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23566. "adds r3, r3, r7\n\t"
  23567. "adcs r4, r4, r8\n\t"
  23568. "adcs r5, r5, r9\n\t"
  23569. "adcs r6, r6, r10\n\t"
  23570. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23571. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23572. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23573. "adcs r3, r3, r7\n\t"
  23574. "adcs r4, r4, r8\n\t"
  23575. "adcs r5, r5, r9\n\t"
  23576. "adcs r6, r6, r10\n\t"
  23577. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23578. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23579. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23580. "adcs r3, r3, r7\n\t"
  23581. "adcs r4, r4, r8\n\t"
  23582. "adcs r5, r5, r9\n\t"
  23583. "adcs r6, r6, r10\n\t"
  23584. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23585. "mov %[r], #0\n\t"
  23586. "adc %[r], %[r], #0\n\t"
  23587. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23588. :
  23589. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  23590. );
  23591. return (uint32_t)(size_t)r;
  23592. }
  23593. /* Sub b from a into a. (a -= b)
  23594. *
  23595. * a A single precision integer and result.
  23596. * b A single precision integer.
  23597. */
  23598. static sp_digit sp_3072_sub_in_place_24(sp_digit* a_p, const sp_digit* b_p)
  23599. {
  23600. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  23601. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  23602. __asm__ __volatile__ (
  23603. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23604. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23605. "subs r2, r2, r6\n\t"
  23606. "sbcs r3, r3, r7\n\t"
  23607. "sbcs r4, r4, r8\n\t"
  23608. "sbcs r5, r5, r9\n\t"
  23609. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23610. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23611. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23612. "sbcs r2, r2, r6\n\t"
  23613. "sbcs r3, r3, r7\n\t"
  23614. "sbcs r4, r4, r8\n\t"
  23615. "sbcs r5, r5, r9\n\t"
  23616. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23617. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23618. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23619. "sbcs r2, r2, r6\n\t"
  23620. "sbcs r3, r3, r7\n\t"
  23621. "sbcs r4, r4, r8\n\t"
  23622. "sbcs r5, r5, r9\n\t"
  23623. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23624. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23625. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23626. "sbcs r2, r2, r6\n\t"
  23627. "sbcs r3, r3, r7\n\t"
  23628. "sbcs r4, r4, r8\n\t"
  23629. "sbcs r5, r5, r9\n\t"
  23630. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23631. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23632. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23633. "sbcs r2, r2, r6\n\t"
  23634. "sbcs r3, r3, r7\n\t"
  23635. "sbcs r4, r4, r8\n\t"
  23636. "sbcs r5, r5, r9\n\t"
  23637. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23638. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23639. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23640. "sbcs r2, r2, r6\n\t"
  23641. "sbcs r3, r3, r7\n\t"
  23642. "sbcs r4, r4, r8\n\t"
  23643. "sbcs r5, r5, r9\n\t"
  23644. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23645. "sbc %[a], r9, r9\n\t"
  23646. : [a] "+r" (a), [b] "+r" (b)
  23647. :
  23648. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  23649. );
  23650. return (uint32_t)(size_t)a;
  23651. }
  23652. /* Add b to a into r. (r = a + b)
  23653. *
  23654. * r A single precision integer.
  23655. * a A single precision integer.
  23656. * b A single precision integer.
  23657. */
  23658. static sp_digit sp_3072_add_24(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  23659. {
  23660. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  23661. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  23662. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  23663. __asm__ __volatile__ (
  23664. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23665. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23666. "adds r3, r3, r7\n\t"
  23667. "adcs r4, r4, r8\n\t"
  23668. "adcs r5, r5, r9\n\t"
  23669. "adcs r6, r6, r10\n\t"
  23670. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23671. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23672. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23673. "adcs r3, r3, r7\n\t"
  23674. "adcs r4, r4, r8\n\t"
  23675. "adcs r5, r5, r9\n\t"
  23676. "adcs r6, r6, r10\n\t"
  23677. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23678. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23679. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23680. "adcs r3, r3, r7\n\t"
  23681. "adcs r4, r4, r8\n\t"
  23682. "adcs r5, r5, r9\n\t"
  23683. "adcs r6, r6, r10\n\t"
  23684. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23685. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23686. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23687. "adcs r3, r3, r7\n\t"
  23688. "adcs r4, r4, r8\n\t"
  23689. "adcs r5, r5, r9\n\t"
  23690. "adcs r6, r6, r10\n\t"
  23691. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23692. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23693. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23694. "adcs r3, r3, r7\n\t"
  23695. "adcs r4, r4, r8\n\t"
  23696. "adcs r5, r5, r9\n\t"
  23697. "adcs r6, r6, r10\n\t"
  23698. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23699. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23700. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23701. "adcs r3, r3, r7\n\t"
  23702. "adcs r4, r4, r8\n\t"
  23703. "adcs r5, r5, r9\n\t"
  23704. "adcs r6, r6, r10\n\t"
  23705. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23706. "mov %[r], #0\n\t"
  23707. "adc %[r], %[r], #0\n\t"
  23708. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23709. :
  23710. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  23711. );
  23712. return (uint32_t)(size_t)r;
  23713. }
  23714. /* AND m into each word of a and store in r.
  23715. *
  23716. * r A single precision integer.
  23717. * a A single precision integer.
  23718. * m Mask to AND against each digit.
  23719. */
  23720. static void sp_3072_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  23721. {
  23722. #ifdef WOLFSSL_SP_SMALL
  23723. int i;
  23724. for (i=0; i<12; i++) {
  23725. r[i] = a[i] & m;
  23726. }
  23727. #else
  23728. r[0] = a[0] & m;
  23729. r[1] = a[1] & m;
  23730. r[2] = a[2] & m;
  23731. r[3] = a[3] & m;
  23732. r[4] = a[4] & m;
  23733. r[5] = a[5] & m;
  23734. r[6] = a[6] & m;
  23735. r[7] = a[7] & m;
  23736. r[8] = a[8] & m;
  23737. r[9] = a[9] & m;
  23738. r[10] = a[10] & m;
  23739. r[11] = a[11] & m;
  23740. #endif
  23741. }
  23742. /* Multiply a and b into r. (r = a * b)
  23743. *
  23744. * r A single precision integer.
  23745. * a A single precision integer.
  23746. * b A single precision integer.
  23747. */
  23748. SP_NOINLINE static void sp_3072_mul_24(sp_digit* r, const sp_digit* a,
  23749. const sp_digit* b)
  23750. {
  23751. sp_digit* z0 = r;
  23752. sp_digit z1[24];
  23753. sp_digit a1[12];
  23754. sp_digit b1[12];
  23755. sp_digit* z2 = r + 24;
  23756. sp_digit u;
  23757. sp_digit ca;
  23758. sp_digit cb;
  23759. ca = sp_3072_add_12(a1, a, &a[12]);
  23760. cb = sp_3072_add_12(b1, b, &b[12]);
  23761. u = ca & cb;
  23762. sp_3072_mul_12(z2, &a[12], &b[12]);
  23763. sp_3072_mul_12(z0, a, b);
  23764. sp_3072_mul_12(z1, a1, b1);
  23765. u += sp_3072_sub_in_place_24(z1, z0);
  23766. u += sp_3072_sub_in_place_24(z1, z2);
  23767. sp_3072_mask_12(a1, a1, 0 - cb);
  23768. u += sp_3072_add_12(z1 + 12, z1 + 12, a1);
  23769. sp_3072_mask_12(b1, b1, 0 - ca);
  23770. u += sp_3072_add_12(z1 + 12, z1 + 12, b1);
  23771. u += sp_3072_add_24(r + 12, r + 12, z1);
  23772. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (12 - 1));
  23773. a1[0] = u;
  23774. (void)sp_3072_add_12(r + 36, r + 36, a1);
  23775. }
  23776. /* Sub b from a into a. (a -= b)
  23777. *
  23778. * a A single precision integer and result.
  23779. * b A single precision integer.
  23780. */
  23781. static sp_digit sp_3072_sub_in_place_48(sp_digit* a_p, const sp_digit* b_p)
  23782. {
  23783. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  23784. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  23785. __asm__ __volatile__ (
  23786. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23787. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23788. "subs r2, r2, r6\n\t"
  23789. "sbcs r3, r3, r7\n\t"
  23790. "sbcs r4, r4, r8\n\t"
  23791. "sbcs r5, r5, r9\n\t"
  23792. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23793. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23794. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23795. "sbcs r2, r2, r6\n\t"
  23796. "sbcs r3, r3, r7\n\t"
  23797. "sbcs r4, r4, r8\n\t"
  23798. "sbcs r5, r5, r9\n\t"
  23799. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23800. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23801. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23802. "sbcs r2, r2, r6\n\t"
  23803. "sbcs r3, r3, r7\n\t"
  23804. "sbcs r4, r4, r8\n\t"
  23805. "sbcs r5, r5, r9\n\t"
  23806. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23807. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23808. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23809. "sbcs r2, r2, r6\n\t"
  23810. "sbcs r3, r3, r7\n\t"
  23811. "sbcs r4, r4, r8\n\t"
  23812. "sbcs r5, r5, r9\n\t"
  23813. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23814. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23815. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23816. "sbcs r2, r2, r6\n\t"
  23817. "sbcs r3, r3, r7\n\t"
  23818. "sbcs r4, r4, r8\n\t"
  23819. "sbcs r5, r5, r9\n\t"
  23820. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23821. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23822. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23823. "sbcs r2, r2, r6\n\t"
  23824. "sbcs r3, r3, r7\n\t"
  23825. "sbcs r4, r4, r8\n\t"
  23826. "sbcs r5, r5, r9\n\t"
  23827. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23828. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23829. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23830. "sbcs r2, r2, r6\n\t"
  23831. "sbcs r3, r3, r7\n\t"
  23832. "sbcs r4, r4, r8\n\t"
  23833. "sbcs r5, r5, r9\n\t"
  23834. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23835. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23836. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23837. "sbcs r2, r2, r6\n\t"
  23838. "sbcs r3, r3, r7\n\t"
  23839. "sbcs r4, r4, r8\n\t"
  23840. "sbcs r5, r5, r9\n\t"
  23841. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23842. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23843. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23844. "sbcs r2, r2, r6\n\t"
  23845. "sbcs r3, r3, r7\n\t"
  23846. "sbcs r4, r4, r8\n\t"
  23847. "sbcs r5, r5, r9\n\t"
  23848. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23849. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23850. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23851. "sbcs r2, r2, r6\n\t"
  23852. "sbcs r3, r3, r7\n\t"
  23853. "sbcs r4, r4, r8\n\t"
  23854. "sbcs r5, r5, r9\n\t"
  23855. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23856. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23857. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23858. "sbcs r2, r2, r6\n\t"
  23859. "sbcs r3, r3, r7\n\t"
  23860. "sbcs r4, r4, r8\n\t"
  23861. "sbcs r5, r5, r9\n\t"
  23862. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23863. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23864. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23865. "sbcs r2, r2, r6\n\t"
  23866. "sbcs r3, r3, r7\n\t"
  23867. "sbcs r4, r4, r8\n\t"
  23868. "sbcs r5, r5, r9\n\t"
  23869. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23870. "sbc %[a], r9, r9\n\t"
  23871. : [a] "+r" (a), [b] "+r" (b)
  23872. :
  23873. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  23874. );
  23875. return (uint32_t)(size_t)a;
  23876. }
  23877. /* Add b to a into r. (r = a + b)
  23878. *
  23879. * r A single precision integer.
  23880. * a A single precision integer.
  23881. * b A single precision integer.
  23882. */
  23883. static sp_digit sp_3072_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  23884. {
  23885. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  23886. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  23887. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  23888. __asm__ __volatile__ (
  23889. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23890. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23891. "adds r3, r3, r7\n\t"
  23892. "adcs r4, r4, r8\n\t"
  23893. "adcs r5, r5, r9\n\t"
  23894. "adcs r6, r6, r10\n\t"
  23895. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23896. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23897. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23898. "adcs r3, r3, r7\n\t"
  23899. "adcs r4, r4, r8\n\t"
  23900. "adcs r5, r5, r9\n\t"
  23901. "adcs r6, r6, r10\n\t"
  23902. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23903. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23904. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23905. "adcs r3, r3, r7\n\t"
  23906. "adcs r4, r4, r8\n\t"
  23907. "adcs r5, r5, r9\n\t"
  23908. "adcs r6, r6, r10\n\t"
  23909. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23910. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23911. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23912. "adcs r3, r3, r7\n\t"
  23913. "adcs r4, r4, r8\n\t"
  23914. "adcs r5, r5, r9\n\t"
  23915. "adcs r6, r6, r10\n\t"
  23916. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23917. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23918. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23919. "adcs r3, r3, r7\n\t"
  23920. "adcs r4, r4, r8\n\t"
  23921. "adcs r5, r5, r9\n\t"
  23922. "adcs r6, r6, r10\n\t"
  23923. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23924. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23925. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23926. "adcs r3, r3, r7\n\t"
  23927. "adcs r4, r4, r8\n\t"
  23928. "adcs r5, r5, r9\n\t"
  23929. "adcs r6, r6, r10\n\t"
  23930. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23931. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23932. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23933. "adcs r3, r3, r7\n\t"
  23934. "adcs r4, r4, r8\n\t"
  23935. "adcs r5, r5, r9\n\t"
  23936. "adcs r6, r6, r10\n\t"
  23937. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23938. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23939. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23940. "adcs r3, r3, r7\n\t"
  23941. "adcs r4, r4, r8\n\t"
  23942. "adcs r5, r5, r9\n\t"
  23943. "adcs r6, r6, r10\n\t"
  23944. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23945. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23946. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23947. "adcs r3, r3, r7\n\t"
  23948. "adcs r4, r4, r8\n\t"
  23949. "adcs r5, r5, r9\n\t"
  23950. "adcs r6, r6, r10\n\t"
  23951. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23952. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23953. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23954. "adcs r3, r3, r7\n\t"
  23955. "adcs r4, r4, r8\n\t"
  23956. "adcs r5, r5, r9\n\t"
  23957. "adcs r6, r6, r10\n\t"
  23958. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23959. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23960. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23961. "adcs r3, r3, r7\n\t"
  23962. "adcs r4, r4, r8\n\t"
  23963. "adcs r5, r5, r9\n\t"
  23964. "adcs r6, r6, r10\n\t"
  23965. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23966. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23967. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23968. "adcs r3, r3, r7\n\t"
  23969. "adcs r4, r4, r8\n\t"
  23970. "adcs r5, r5, r9\n\t"
  23971. "adcs r6, r6, r10\n\t"
  23972. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23973. "mov %[r], #0\n\t"
  23974. "adc %[r], %[r], #0\n\t"
  23975. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23976. :
  23977. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  23978. );
  23979. return (uint32_t)(size_t)r;
  23980. }
  23981. /* AND m into each word of a and store in r.
  23982. *
  23983. * r A single precision integer.
  23984. * a A single precision integer.
  23985. * m Mask to AND against each digit.
  23986. */
  23987. static void sp_3072_mask_24(sp_digit* r, const sp_digit* a, sp_digit m)
  23988. {
  23989. #ifdef WOLFSSL_SP_SMALL
  23990. int i;
  23991. for (i=0; i<24; i++) {
  23992. r[i] = a[i] & m;
  23993. }
  23994. #else
  23995. int i;
  23996. for (i = 0; i < 24; i += 8) {
  23997. r[i+0] = a[i+0] & m;
  23998. r[i+1] = a[i+1] & m;
  23999. r[i+2] = a[i+2] & m;
  24000. r[i+3] = a[i+3] & m;
  24001. r[i+4] = a[i+4] & m;
  24002. r[i+5] = a[i+5] & m;
  24003. r[i+6] = a[i+6] & m;
  24004. r[i+7] = a[i+7] & m;
  24005. }
  24006. #endif
  24007. }
  24008. /* Multiply a and b into r. (r = a * b)
  24009. *
  24010. * r A single precision integer.
  24011. * a A single precision integer.
  24012. * b A single precision integer.
  24013. */
  24014. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  24015. const sp_digit* b)
  24016. {
  24017. sp_digit* z0 = r;
  24018. sp_digit z1[48];
  24019. sp_digit a1[24];
  24020. sp_digit b1[24];
  24021. sp_digit* z2 = r + 48;
  24022. sp_digit u;
  24023. sp_digit ca;
  24024. sp_digit cb;
  24025. ca = sp_3072_add_24(a1, a, &a[24]);
  24026. cb = sp_3072_add_24(b1, b, &b[24]);
  24027. u = ca & cb;
  24028. sp_3072_mul_24(z2, &a[24], &b[24]);
  24029. sp_3072_mul_24(z0, a, b);
  24030. sp_3072_mul_24(z1, a1, b1);
  24031. u += sp_3072_sub_in_place_48(z1, z0);
  24032. u += sp_3072_sub_in_place_48(z1, z2);
  24033. sp_3072_mask_24(a1, a1, 0 - cb);
  24034. u += sp_3072_add_24(z1 + 24, z1 + 24, a1);
  24035. sp_3072_mask_24(b1, b1, 0 - ca);
  24036. u += sp_3072_add_24(z1 + 24, z1 + 24, b1);
  24037. u += sp_3072_add_48(r + 24, r + 24, z1);
  24038. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (24 - 1));
  24039. a1[0] = u;
  24040. (void)sp_3072_add_24(r + 72, r + 72, a1);
  24041. }
  24042. /* Sub b from a into a. (a -= b)
  24043. *
  24044. * a A single precision integer and result.
  24045. * b A single precision integer.
  24046. */
  24047. static sp_digit sp_3072_sub_in_place_96(sp_digit* a_p, const sp_digit* b_p)
  24048. {
  24049. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  24050. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  24051. __asm__ __volatile__ (
  24052. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24053. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24054. "subs r2, r2, r6\n\t"
  24055. "sbcs r3, r3, r7\n\t"
  24056. "sbcs r4, r4, r8\n\t"
  24057. "sbcs r5, r5, r9\n\t"
  24058. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24059. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24060. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24061. "sbcs r2, r2, r6\n\t"
  24062. "sbcs r3, r3, r7\n\t"
  24063. "sbcs r4, r4, r8\n\t"
  24064. "sbcs r5, r5, r9\n\t"
  24065. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24066. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24067. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24068. "sbcs r2, r2, r6\n\t"
  24069. "sbcs r3, r3, r7\n\t"
  24070. "sbcs r4, r4, r8\n\t"
  24071. "sbcs r5, r5, r9\n\t"
  24072. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24073. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24074. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24075. "sbcs r2, r2, r6\n\t"
  24076. "sbcs r3, r3, r7\n\t"
  24077. "sbcs r4, r4, r8\n\t"
  24078. "sbcs r5, r5, r9\n\t"
  24079. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24080. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24081. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24082. "sbcs r2, r2, r6\n\t"
  24083. "sbcs r3, r3, r7\n\t"
  24084. "sbcs r4, r4, r8\n\t"
  24085. "sbcs r5, r5, r9\n\t"
  24086. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24087. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24088. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24089. "sbcs r2, r2, r6\n\t"
  24090. "sbcs r3, r3, r7\n\t"
  24091. "sbcs r4, r4, r8\n\t"
  24092. "sbcs r5, r5, r9\n\t"
  24093. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24094. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24095. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24096. "sbcs r2, r2, r6\n\t"
  24097. "sbcs r3, r3, r7\n\t"
  24098. "sbcs r4, r4, r8\n\t"
  24099. "sbcs r5, r5, r9\n\t"
  24100. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24101. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24102. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24103. "sbcs r2, r2, r6\n\t"
  24104. "sbcs r3, r3, r7\n\t"
  24105. "sbcs r4, r4, r8\n\t"
  24106. "sbcs r5, r5, r9\n\t"
  24107. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24108. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24109. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24110. "sbcs r2, r2, r6\n\t"
  24111. "sbcs r3, r3, r7\n\t"
  24112. "sbcs r4, r4, r8\n\t"
  24113. "sbcs r5, r5, r9\n\t"
  24114. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24115. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24116. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24117. "sbcs r2, r2, r6\n\t"
  24118. "sbcs r3, r3, r7\n\t"
  24119. "sbcs r4, r4, r8\n\t"
  24120. "sbcs r5, r5, r9\n\t"
  24121. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24122. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24123. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24124. "sbcs r2, r2, r6\n\t"
  24125. "sbcs r3, r3, r7\n\t"
  24126. "sbcs r4, r4, r8\n\t"
  24127. "sbcs r5, r5, r9\n\t"
  24128. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24129. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24130. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24131. "sbcs r2, r2, r6\n\t"
  24132. "sbcs r3, r3, r7\n\t"
  24133. "sbcs r4, r4, r8\n\t"
  24134. "sbcs r5, r5, r9\n\t"
  24135. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24136. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24137. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24138. "sbcs r2, r2, r6\n\t"
  24139. "sbcs r3, r3, r7\n\t"
  24140. "sbcs r4, r4, r8\n\t"
  24141. "sbcs r5, r5, r9\n\t"
  24142. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24143. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24144. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24145. "sbcs r2, r2, r6\n\t"
  24146. "sbcs r3, r3, r7\n\t"
  24147. "sbcs r4, r4, r8\n\t"
  24148. "sbcs r5, r5, r9\n\t"
  24149. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24150. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24151. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24152. "sbcs r2, r2, r6\n\t"
  24153. "sbcs r3, r3, r7\n\t"
  24154. "sbcs r4, r4, r8\n\t"
  24155. "sbcs r5, r5, r9\n\t"
  24156. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24157. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24158. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24159. "sbcs r2, r2, r6\n\t"
  24160. "sbcs r3, r3, r7\n\t"
  24161. "sbcs r4, r4, r8\n\t"
  24162. "sbcs r5, r5, r9\n\t"
  24163. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24164. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24165. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24166. "sbcs r2, r2, r6\n\t"
  24167. "sbcs r3, r3, r7\n\t"
  24168. "sbcs r4, r4, r8\n\t"
  24169. "sbcs r5, r5, r9\n\t"
  24170. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24171. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24172. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24173. "sbcs r2, r2, r6\n\t"
  24174. "sbcs r3, r3, r7\n\t"
  24175. "sbcs r4, r4, r8\n\t"
  24176. "sbcs r5, r5, r9\n\t"
  24177. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24178. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24179. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24180. "sbcs r2, r2, r6\n\t"
  24181. "sbcs r3, r3, r7\n\t"
  24182. "sbcs r4, r4, r8\n\t"
  24183. "sbcs r5, r5, r9\n\t"
  24184. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24185. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24186. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24187. "sbcs r2, r2, r6\n\t"
  24188. "sbcs r3, r3, r7\n\t"
  24189. "sbcs r4, r4, r8\n\t"
  24190. "sbcs r5, r5, r9\n\t"
  24191. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24192. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24193. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24194. "sbcs r2, r2, r6\n\t"
  24195. "sbcs r3, r3, r7\n\t"
  24196. "sbcs r4, r4, r8\n\t"
  24197. "sbcs r5, r5, r9\n\t"
  24198. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24199. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24200. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24201. "sbcs r2, r2, r6\n\t"
  24202. "sbcs r3, r3, r7\n\t"
  24203. "sbcs r4, r4, r8\n\t"
  24204. "sbcs r5, r5, r9\n\t"
  24205. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24206. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24207. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24208. "sbcs r2, r2, r6\n\t"
  24209. "sbcs r3, r3, r7\n\t"
  24210. "sbcs r4, r4, r8\n\t"
  24211. "sbcs r5, r5, r9\n\t"
  24212. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24213. "ldm %[a], {r2, r3, r4, r5}\n\t"
  24214. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  24215. "sbcs r2, r2, r6\n\t"
  24216. "sbcs r3, r3, r7\n\t"
  24217. "sbcs r4, r4, r8\n\t"
  24218. "sbcs r5, r5, r9\n\t"
  24219. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  24220. "sbc %[a], r9, r9\n\t"
  24221. : [a] "+r" (a), [b] "+r" (b)
  24222. :
  24223. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  24224. );
  24225. return (uint32_t)(size_t)a;
  24226. }
  24227. /* Add b to a into r. (r = a + b)
  24228. *
  24229. * r A single precision integer.
  24230. * a A single precision integer.
  24231. * b A single precision integer.
  24232. */
  24233. static sp_digit sp_3072_add_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  24234. {
  24235. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  24236. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  24237. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  24238. __asm__ __volatile__ (
  24239. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24240. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24241. "adds r3, r3, r7\n\t"
  24242. "adcs r4, r4, r8\n\t"
  24243. "adcs r5, r5, r9\n\t"
  24244. "adcs r6, r6, r10\n\t"
  24245. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24246. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24247. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24248. "adcs r3, r3, r7\n\t"
  24249. "adcs r4, r4, r8\n\t"
  24250. "adcs r5, r5, r9\n\t"
  24251. "adcs r6, r6, r10\n\t"
  24252. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24253. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24254. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24255. "adcs r3, r3, r7\n\t"
  24256. "adcs r4, r4, r8\n\t"
  24257. "adcs r5, r5, r9\n\t"
  24258. "adcs r6, r6, r10\n\t"
  24259. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24260. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24261. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24262. "adcs r3, r3, r7\n\t"
  24263. "adcs r4, r4, r8\n\t"
  24264. "adcs r5, r5, r9\n\t"
  24265. "adcs r6, r6, r10\n\t"
  24266. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24267. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24268. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24269. "adcs r3, r3, r7\n\t"
  24270. "adcs r4, r4, r8\n\t"
  24271. "adcs r5, r5, r9\n\t"
  24272. "adcs r6, r6, r10\n\t"
  24273. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24274. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24275. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24276. "adcs r3, r3, r7\n\t"
  24277. "adcs r4, r4, r8\n\t"
  24278. "adcs r5, r5, r9\n\t"
  24279. "adcs r6, r6, r10\n\t"
  24280. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24281. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24282. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24283. "adcs r3, r3, r7\n\t"
  24284. "adcs r4, r4, r8\n\t"
  24285. "adcs r5, r5, r9\n\t"
  24286. "adcs r6, r6, r10\n\t"
  24287. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24288. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24289. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24290. "adcs r3, r3, r7\n\t"
  24291. "adcs r4, r4, r8\n\t"
  24292. "adcs r5, r5, r9\n\t"
  24293. "adcs r6, r6, r10\n\t"
  24294. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24295. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24296. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24297. "adcs r3, r3, r7\n\t"
  24298. "adcs r4, r4, r8\n\t"
  24299. "adcs r5, r5, r9\n\t"
  24300. "adcs r6, r6, r10\n\t"
  24301. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24302. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24303. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24304. "adcs r3, r3, r7\n\t"
  24305. "adcs r4, r4, r8\n\t"
  24306. "adcs r5, r5, r9\n\t"
  24307. "adcs r6, r6, r10\n\t"
  24308. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24309. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24310. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24311. "adcs r3, r3, r7\n\t"
  24312. "adcs r4, r4, r8\n\t"
  24313. "adcs r5, r5, r9\n\t"
  24314. "adcs r6, r6, r10\n\t"
  24315. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24316. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24317. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24318. "adcs r3, r3, r7\n\t"
  24319. "adcs r4, r4, r8\n\t"
  24320. "adcs r5, r5, r9\n\t"
  24321. "adcs r6, r6, r10\n\t"
  24322. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24323. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24324. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24325. "adcs r3, r3, r7\n\t"
  24326. "adcs r4, r4, r8\n\t"
  24327. "adcs r5, r5, r9\n\t"
  24328. "adcs r6, r6, r10\n\t"
  24329. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24330. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24331. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24332. "adcs r3, r3, r7\n\t"
  24333. "adcs r4, r4, r8\n\t"
  24334. "adcs r5, r5, r9\n\t"
  24335. "adcs r6, r6, r10\n\t"
  24336. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24337. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24338. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24339. "adcs r3, r3, r7\n\t"
  24340. "adcs r4, r4, r8\n\t"
  24341. "adcs r5, r5, r9\n\t"
  24342. "adcs r6, r6, r10\n\t"
  24343. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24344. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24345. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24346. "adcs r3, r3, r7\n\t"
  24347. "adcs r4, r4, r8\n\t"
  24348. "adcs r5, r5, r9\n\t"
  24349. "adcs r6, r6, r10\n\t"
  24350. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24351. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24352. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24353. "adcs r3, r3, r7\n\t"
  24354. "adcs r4, r4, r8\n\t"
  24355. "adcs r5, r5, r9\n\t"
  24356. "adcs r6, r6, r10\n\t"
  24357. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24358. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24359. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24360. "adcs r3, r3, r7\n\t"
  24361. "adcs r4, r4, r8\n\t"
  24362. "adcs r5, r5, r9\n\t"
  24363. "adcs r6, r6, r10\n\t"
  24364. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24365. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24366. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24367. "adcs r3, r3, r7\n\t"
  24368. "adcs r4, r4, r8\n\t"
  24369. "adcs r5, r5, r9\n\t"
  24370. "adcs r6, r6, r10\n\t"
  24371. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24372. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24373. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24374. "adcs r3, r3, r7\n\t"
  24375. "adcs r4, r4, r8\n\t"
  24376. "adcs r5, r5, r9\n\t"
  24377. "adcs r6, r6, r10\n\t"
  24378. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24379. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24380. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24381. "adcs r3, r3, r7\n\t"
  24382. "adcs r4, r4, r8\n\t"
  24383. "adcs r5, r5, r9\n\t"
  24384. "adcs r6, r6, r10\n\t"
  24385. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24386. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24387. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24388. "adcs r3, r3, r7\n\t"
  24389. "adcs r4, r4, r8\n\t"
  24390. "adcs r5, r5, r9\n\t"
  24391. "adcs r6, r6, r10\n\t"
  24392. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24393. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24394. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24395. "adcs r3, r3, r7\n\t"
  24396. "adcs r4, r4, r8\n\t"
  24397. "adcs r5, r5, r9\n\t"
  24398. "adcs r6, r6, r10\n\t"
  24399. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24400. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  24401. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  24402. "adcs r3, r3, r7\n\t"
  24403. "adcs r4, r4, r8\n\t"
  24404. "adcs r5, r5, r9\n\t"
  24405. "adcs r6, r6, r10\n\t"
  24406. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  24407. "mov %[r], #0\n\t"
  24408. "adc %[r], %[r], #0\n\t"
  24409. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  24410. :
  24411. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  24412. );
  24413. return (uint32_t)(size_t)r;
  24414. }
  24415. /* AND m into each word of a and store in r.
  24416. *
  24417. * r A single precision integer.
  24418. * a A single precision integer.
  24419. * m Mask to AND against each digit.
  24420. */
  24421. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  24422. {
  24423. #ifdef WOLFSSL_SP_SMALL
  24424. int i;
  24425. for (i=0; i<48; i++) {
  24426. r[i] = a[i] & m;
  24427. }
  24428. #else
  24429. int i;
  24430. for (i = 0; i < 48; i += 8) {
  24431. r[i+0] = a[i+0] & m;
  24432. r[i+1] = a[i+1] & m;
  24433. r[i+2] = a[i+2] & m;
  24434. r[i+3] = a[i+3] & m;
  24435. r[i+4] = a[i+4] & m;
  24436. r[i+5] = a[i+5] & m;
  24437. r[i+6] = a[i+6] & m;
  24438. r[i+7] = a[i+7] & m;
  24439. }
  24440. #endif
  24441. }
  24442. /* Multiply a and b into r. (r = a * b)
  24443. *
  24444. * r A single precision integer.
  24445. * a A single precision integer.
  24446. * b A single precision integer.
  24447. */
  24448. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  24449. const sp_digit* b)
  24450. {
  24451. sp_digit* z0 = r;
  24452. sp_digit z1[96];
  24453. sp_digit a1[48];
  24454. sp_digit b1[48];
  24455. sp_digit* z2 = r + 96;
  24456. sp_digit u;
  24457. sp_digit ca;
  24458. sp_digit cb;
  24459. ca = sp_3072_add_48(a1, a, &a[48]);
  24460. cb = sp_3072_add_48(b1, b, &b[48]);
  24461. u = ca & cb;
  24462. sp_3072_mul_48(z2, &a[48], &b[48]);
  24463. sp_3072_mul_48(z0, a, b);
  24464. sp_3072_mul_48(z1, a1, b1);
  24465. u += sp_3072_sub_in_place_96(z1, z0);
  24466. u += sp_3072_sub_in_place_96(z1, z2);
  24467. sp_3072_mask_48(a1, a1, 0 - cb);
  24468. u += sp_3072_add_48(z1 + 48, z1 + 48, a1);
  24469. sp_3072_mask_48(b1, b1, 0 - ca);
  24470. u += sp_3072_add_48(z1 + 48, z1 + 48, b1);
  24471. u += sp_3072_add_96(r + 48, r + 48, z1);
  24472. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (48 - 1));
  24473. a1[0] = u;
  24474. (void)sp_3072_add_48(r + 144, r + 144, a1);
  24475. }
  24476. /* Square a and put result in r. (r = a * a)
  24477. *
  24478. * r A single precision integer.
  24479. * a A single precision integer.
  24480. */
  24481. static void sp_3072_sqr_12(sp_digit* r_p, const sp_digit* a_p)
  24482. {
  24483. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  24484. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  24485. __asm__ __volatile__ (
  24486. "sub sp, sp, #48\n\t"
  24487. /* A[0] * A[0] */
  24488. "ldr r10, [%[a]]\n\t"
  24489. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24490. "lsr r9, r10, #16\n\t"
  24491. "lsl r2, r10, #16\n\t"
  24492. "lsr r2, r2, #16\n\t"
  24493. "mul r8, r2, r2\n\t"
  24494. "mul r3, r9, r9\n\t"
  24495. "mul r2, r9, r2\n\t"
  24496. "lsr r9, r2, #15\n\t"
  24497. "lsl r2, r2, #17\n\t"
  24498. "adds r8, r8, r2\n\t"
  24499. "adc r3, r3, r9\n\t"
  24500. #else
  24501. "umull r8, r3, r10, r10\n\t"
  24502. #endif
  24503. "mov r4, #0\n\t"
  24504. "str r8, [sp]\n\t"
  24505. /* A[0] * A[1] */
  24506. "ldr r10, [%[a], #4]\n\t"
  24507. "ldr r12, [%[a]]\n\t"
  24508. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24509. "lsl r8, r10, #16\n\t"
  24510. "lsl r9, r12, #16\n\t"
  24511. "lsr r8, r8, #16\n\t"
  24512. "lsr r9, r9, #16\n\t"
  24513. "mul r9, r8, r9\n\t"
  24514. "adds r3, r3, r9\n\t"
  24515. "adcs r4, r4, #0\n\t"
  24516. "mov r2, #0\n\t"
  24517. "adc r2, r2, #0\n\t"
  24518. "adds r3, r3, r9\n\t"
  24519. "adcs r4, r4, #0\n\t"
  24520. "adc r2, r2, #0\n\t"
  24521. "lsr r9, r12, #16\n\t"
  24522. "mul r8, r9, r8\n\t"
  24523. "lsr r9, r8, #16\n\t"
  24524. "lsl r8, r8, #16\n\t"
  24525. "adds r3, r3, r8\n\t"
  24526. "adcs r4, r4, r9\n\t"
  24527. "adc r2, r2, #0\n\t"
  24528. "adds r3, r3, r8\n\t"
  24529. "adcs r4, r4, r9\n\t"
  24530. "adc r2, r2, #0\n\t"
  24531. "lsr r8, r10, #16\n\t"
  24532. "lsr r9, r12, #16\n\t"
  24533. "mul r9, r8, r9\n\t"
  24534. "adds r4, r4, r9\n\t"
  24535. "adc r2, r2, #0\n\t"
  24536. "adds r4, r4, r9\n\t"
  24537. "adc r2, r2, #0\n\t"
  24538. "lsl r9, r12, #16\n\t"
  24539. "lsr r9, r9, #16\n\t"
  24540. "mul r8, r9, r8\n\t"
  24541. "lsr r9, r8, #16\n\t"
  24542. "lsl r8, r8, #16\n\t"
  24543. "adds r3, r3, r8\n\t"
  24544. "adcs r4, r4, r9\n\t"
  24545. "adc r2, r2, #0\n\t"
  24546. "adds r3, r3, r8\n\t"
  24547. "adcs r4, r4, r9\n\t"
  24548. "adc r2, r2, #0\n\t"
  24549. #else
  24550. "umull r8, r9, r10, r12\n\t"
  24551. "adds r3, r3, r8\n\t"
  24552. "adcs r4, r4, r9\n\t"
  24553. "mov r2, #0\n\t"
  24554. "adc r2, r2, #0\n\t"
  24555. "adds r3, r3, r8\n\t"
  24556. "adcs r4, r4, r9\n\t"
  24557. "mov r2, #0\n\t"
  24558. "adc r2, r2, #0\n\t"
  24559. #endif
  24560. "str r3, [sp, #4]\n\t"
  24561. /* A[0] * A[2] */
  24562. "ldr r10, [%[a], #8]\n\t"
  24563. "ldr r12, [%[a]]\n\t"
  24564. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24565. "lsl r8, r10, #16\n\t"
  24566. "lsl r9, r12, #16\n\t"
  24567. "lsr r8, r8, #16\n\t"
  24568. "lsr r9, r9, #16\n\t"
  24569. "mul r9, r8, r9\n\t"
  24570. "adds r4, r4, r9\n\t"
  24571. "adcs r2, r2, #0\n\t"
  24572. "mov r3, #0\n\t"
  24573. "adc r3, r3, #0\n\t"
  24574. "adds r4, r4, r9\n\t"
  24575. "adcs r2, r2, #0\n\t"
  24576. "adc r3, r3, #0\n\t"
  24577. "lsr r9, r12, #16\n\t"
  24578. "mul r8, r9, r8\n\t"
  24579. "lsr r9, r8, #16\n\t"
  24580. "lsl r8, r8, #16\n\t"
  24581. "adds r4, r4, r8\n\t"
  24582. "adcs r2, r2, r9\n\t"
  24583. "adc r3, r3, #0\n\t"
  24584. "adds r4, r4, r8\n\t"
  24585. "adcs r2, r2, r9\n\t"
  24586. "adc r3, r3, #0\n\t"
  24587. "lsr r8, r10, #16\n\t"
  24588. "lsr r9, r12, #16\n\t"
  24589. "mul r9, r8, r9\n\t"
  24590. "adds r2, r2, r9\n\t"
  24591. "adc r3, r3, #0\n\t"
  24592. "adds r2, r2, r9\n\t"
  24593. "adc r3, r3, #0\n\t"
  24594. "lsl r9, r12, #16\n\t"
  24595. "lsr r9, r9, #16\n\t"
  24596. "mul r8, r9, r8\n\t"
  24597. "lsr r9, r8, #16\n\t"
  24598. "lsl r8, r8, #16\n\t"
  24599. "adds r4, r4, r8\n\t"
  24600. "adcs r2, r2, r9\n\t"
  24601. "adc r3, r3, #0\n\t"
  24602. "adds r4, r4, r8\n\t"
  24603. "adcs r2, r2, r9\n\t"
  24604. "adc r3, r3, #0\n\t"
  24605. #else
  24606. "umull r8, r9, r10, r12\n\t"
  24607. "adds r4, r4, r8\n\t"
  24608. "adcs r2, r2, r9\n\t"
  24609. "mov r3, #0\n\t"
  24610. "adc r3, r3, #0\n\t"
  24611. "adds r4, r4, r8\n\t"
  24612. "adcs r2, r2, r9\n\t"
  24613. "mov r3, #0\n\t"
  24614. "adc r3, r3, #0\n\t"
  24615. #endif
  24616. /* A[1] * A[1] */
  24617. "ldr r10, [%[a], #4]\n\t"
  24618. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24619. "lsl r8, r10, #16\n\t"
  24620. "lsr r9, r10, #16\n\t"
  24621. "lsr r8, r8, #16\n\t"
  24622. "mov r12, r8\n\t"
  24623. "mul r8, r12, r8\n\t"
  24624. "mov r12, r9\n\t"
  24625. "mul r9, r12, r9\n\t"
  24626. "adds r4, r4, r8\n\t"
  24627. "adcs r2, r2, r9\n\t"
  24628. "adc r3, r3, #0\n\t"
  24629. "lsr r9, r10, #16\n\t"
  24630. "lsl r8, r10, #16\n\t"
  24631. "lsr r8, r8, #16\n\t"
  24632. "mul r8, r9, r8\n\t"
  24633. "lsr r9, r8, #15\n\t"
  24634. "lsl r8, r8, #17\n\t"
  24635. "adds r4, r4, r8\n\t"
  24636. "adcs r2, r2, r9\n\t"
  24637. "adc r3, r3, #0\n\t"
  24638. #else
  24639. "umull r8, r9, r10, r10\n\t"
  24640. "adds r4, r4, r8\n\t"
  24641. "adcs r2, r2, r9\n\t"
  24642. "adc r3, r3, #0\n\t"
  24643. #endif
  24644. "str r4, [sp, #8]\n\t"
  24645. /* A[0] * A[3] */
  24646. "ldr r10, [%[a], #12]\n\t"
  24647. "ldr r12, [%[a]]\n\t"
  24648. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24649. "lsl r8, r10, #16\n\t"
  24650. "lsl r9, r12, #16\n\t"
  24651. "lsr r8, r8, #16\n\t"
  24652. "lsr r9, r9, #16\n\t"
  24653. "mul r9, r8, r9\n\t"
  24654. "adds r2, r2, r9\n\t"
  24655. "adcs r3, r3, #0\n\t"
  24656. "mov r4, #0\n\t"
  24657. "adc r4, r4, #0\n\t"
  24658. "adds r2, r2, r9\n\t"
  24659. "adcs r3, r3, #0\n\t"
  24660. "adc r4, r4, #0\n\t"
  24661. "lsr r9, r12, #16\n\t"
  24662. "mul r8, r9, r8\n\t"
  24663. "lsr r9, r8, #16\n\t"
  24664. "lsl r8, r8, #16\n\t"
  24665. "adds r2, r2, r8\n\t"
  24666. "adcs r3, r3, r9\n\t"
  24667. "adc r4, r4, #0\n\t"
  24668. "adds r2, r2, r8\n\t"
  24669. "adcs r3, r3, r9\n\t"
  24670. "adc r4, r4, #0\n\t"
  24671. "lsr r8, r10, #16\n\t"
  24672. "lsr r9, r12, #16\n\t"
  24673. "mul r9, r8, r9\n\t"
  24674. "adds r3, r3, r9\n\t"
  24675. "adc r4, r4, #0\n\t"
  24676. "adds r3, r3, r9\n\t"
  24677. "adc r4, r4, #0\n\t"
  24678. "lsl r9, r12, #16\n\t"
  24679. "lsr r9, r9, #16\n\t"
  24680. "mul r8, r9, r8\n\t"
  24681. "lsr r9, r8, #16\n\t"
  24682. "lsl r8, r8, #16\n\t"
  24683. "adds r2, r2, r8\n\t"
  24684. "adcs r3, r3, r9\n\t"
  24685. "adc r4, r4, #0\n\t"
  24686. "adds r2, r2, r8\n\t"
  24687. "adcs r3, r3, r9\n\t"
  24688. "adc r4, r4, #0\n\t"
  24689. #else
  24690. "umull r8, r9, r10, r12\n\t"
  24691. "adds r2, r2, r8\n\t"
  24692. "adcs r3, r3, r9\n\t"
  24693. "mov r4, #0\n\t"
  24694. "adc r4, r4, #0\n\t"
  24695. "adds r2, r2, r8\n\t"
  24696. "adcs r3, r3, r9\n\t"
  24697. "mov r4, #0\n\t"
  24698. "adc r4, r4, #0\n\t"
  24699. #endif
  24700. /* A[1] * A[2] */
  24701. "ldr r10, [%[a], #8]\n\t"
  24702. "ldr r12, [%[a], #4]\n\t"
  24703. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24704. "lsl r8, r10, #16\n\t"
  24705. "lsl r9, r12, #16\n\t"
  24706. "lsr r8, r8, #16\n\t"
  24707. "lsr r9, r9, #16\n\t"
  24708. "mul r9, r8, r9\n\t"
  24709. "adds r2, r2, r9\n\t"
  24710. "adcs r3, r3, #0\n\t"
  24711. "adc r4, r4, #0\n\t"
  24712. "adds r2, r2, r9\n\t"
  24713. "adcs r3, r3, #0\n\t"
  24714. "adc r4, r4, #0\n\t"
  24715. "lsr r9, r12, #16\n\t"
  24716. "mul r8, r9, r8\n\t"
  24717. "lsr r9, r8, #16\n\t"
  24718. "lsl r8, r8, #16\n\t"
  24719. "adds r2, r2, r8\n\t"
  24720. "adcs r3, r3, r9\n\t"
  24721. "adc r4, r4, #0\n\t"
  24722. "adds r2, r2, r8\n\t"
  24723. "adcs r3, r3, r9\n\t"
  24724. "adc r4, r4, #0\n\t"
  24725. "lsr r8, r10, #16\n\t"
  24726. "lsr r9, r12, #16\n\t"
  24727. "mul r9, r8, r9\n\t"
  24728. "adds r3, r3, r9\n\t"
  24729. "adc r4, r4, #0\n\t"
  24730. "adds r3, r3, r9\n\t"
  24731. "adc r4, r4, #0\n\t"
  24732. "lsl r9, r12, #16\n\t"
  24733. "lsr r9, r9, #16\n\t"
  24734. "mul r8, r9, r8\n\t"
  24735. "lsr r9, r8, #16\n\t"
  24736. "lsl r8, r8, #16\n\t"
  24737. "adds r2, r2, r8\n\t"
  24738. "adcs r3, r3, r9\n\t"
  24739. "adc r4, r4, #0\n\t"
  24740. "adds r2, r2, r8\n\t"
  24741. "adcs r3, r3, r9\n\t"
  24742. "adc r4, r4, #0\n\t"
  24743. #else
  24744. "umull r8, r9, r10, r12\n\t"
  24745. "adds r2, r2, r8\n\t"
  24746. "adcs r3, r3, r9\n\t"
  24747. "adc r4, r4, #0\n\t"
  24748. "adds r2, r2, r8\n\t"
  24749. "adcs r3, r3, r9\n\t"
  24750. "adc r4, r4, #0\n\t"
  24751. #endif
  24752. "str r2, [sp, #12]\n\t"
  24753. /* A[0] * A[4] */
  24754. "ldr r10, [%[a], #16]\n\t"
  24755. "ldr r12, [%[a]]\n\t"
  24756. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24757. "lsl r8, r10, #16\n\t"
  24758. "lsl r9, r12, #16\n\t"
  24759. "lsr r8, r8, #16\n\t"
  24760. "lsr r9, r9, #16\n\t"
  24761. "mul r9, r8, r9\n\t"
  24762. "adds r3, r3, r9\n\t"
  24763. "adcs r4, r4, #0\n\t"
  24764. "mov r2, #0\n\t"
  24765. "adc r2, r2, #0\n\t"
  24766. "adds r3, r3, r9\n\t"
  24767. "adcs r4, r4, #0\n\t"
  24768. "adc r2, r2, #0\n\t"
  24769. "lsr r9, r12, #16\n\t"
  24770. "mul r8, r9, r8\n\t"
  24771. "lsr r9, r8, #16\n\t"
  24772. "lsl r8, r8, #16\n\t"
  24773. "adds r3, r3, r8\n\t"
  24774. "adcs r4, r4, r9\n\t"
  24775. "adc r2, r2, #0\n\t"
  24776. "adds r3, r3, r8\n\t"
  24777. "adcs r4, r4, r9\n\t"
  24778. "adc r2, r2, #0\n\t"
  24779. "lsr r8, r10, #16\n\t"
  24780. "lsr r9, r12, #16\n\t"
  24781. "mul r9, r8, r9\n\t"
  24782. "adds r4, r4, r9\n\t"
  24783. "adc r2, r2, #0\n\t"
  24784. "adds r4, r4, r9\n\t"
  24785. "adc r2, r2, #0\n\t"
  24786. "lsl r9, r12, #16\n\t"
  24787. "lsr r9, r9, #16\n\t"
  24788. "mul r8, r9, r8\n\t"
  24789. "lsr r9, r8, #16\n\t"
  24790. "lsl r8, r8, #16\n\t"
  24791. "adds r3, r3, r8\n\t"
  24792. "adcs r4, r4, r9\n\t"
  24793. "adc r2, r2, #0\n\t"
  24794. "adds r3, r3, r8\n\t"
  24795. "adcs r4, r4, r9\n\t"
  24796. "adc r2, r2, #0\n\t"
  24797. #else
  24798. "umull r8, r9, r10, r12\n\t"
  24799. "adds r3, r3, r8\n\t"
  24800. "adcs r4, r4, r9\n\t"
  24801. "mov r2, #0\n\t"
  24802. "adc r2, r2, #0\n\t"
  24803. "adds r3, r3, r8\n\t"
  24804. "adcs r4, r4, r9\n\t"
  24805. "mov r2, #0\n\t"
  24806. "adc r2, r2, #0\n\t"
  24807. #endif
  24808. /* A[1] * A[3] */
  24809. "ldr r10, [%[a], #12]\n\t"
  24810. "ldr r12, [%[a], #4]\n\t"
  24811. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24812. "lsl r8, r10, #16\n\t"
  24813. "lsl r9, r12, #16\n\t"
  24814. "lsr r8, r8, #16\n\t"
  24815. "lsr r9, r9, #16\n\t"
  24816. "mul r9, r8, r9\n\t"
  24817. "adds r3, r3, r9\n\t"
  24818. "adcs r4, r4, #0\n\t"
  24819. "adc r2, r2, #0\n\t"
  24820. "adds r3, r3, r9\n\t"
  24821. "adcs r4, r4, #0\n\t"
  24822. "adc r2, r2, #0\n\t"
  24823. "lsr r9, r12, #16\n\t"
  24824. "mul r8, r9, r8\n\t"
  24825. "lsr r9, r8, #16\n\t"
  24826. "lsl r8, r8, #16\n\t"
  24827. "adds r3, r3, r8\n\t"
  24828. "adcs r4, r4, r9\n\t"
  24829. "adc r2, r2, #0\n\t"
  24830. "adds r3, r3, r8\n\t"
  24831. "adcs r4, r4, r9\n\t"
  24832. "adc r2, r2, #0\n\t"
  24833. "lsr r8, r10, #16\n\t"
  24834. "lsr r9, r12, #16\n\t"
  24835. "mul r9, r8, r9\n\t"
  24836. "adds r4, r4, r9\n\t"
  24837. "adc r2, r2, #0\n\t"
  24838. "adds r4, r4, r9\n\t"
  24839. "adc r2, r2, #0\n\t"
  24840. "lsl r9, r12, #16\n\t"
  24841. "lsr r9, r9, #16\n\t"
  24842. "mul r8, r9, r8\n\t"
  24843. "lsr r9, r8, #16\n\t"
  24844. "lsl r8, r8, #16\n\t"
  24845. "adds r3, r3, r8\n\t"
  24846. "adcs r4, r4, r9\n\t"
  24847. "adc r2, r2, #0\n\t"
  24848. "adds r3, r3, r8\n\t"
  24849. "adcs r4, r4, r9\n\t"
  24850. "adc r2, r2, #0\n\t"
  24851. #else
  24852. "umull r8, r9, r10, r12\n\t"
  24853. "adds r3, r3, r8\n\t"
  24854. "adcs r4, r4, r9\n\t"
  24855. "adc r2, r2, #0\n\t"
  24856. "adds r3, r3, r8\n\t"
  24857. "adcs r4, r4, r9\n\t"
  24858. "adc r2, r2, #0\n\t"
  24859. #endif
  24860. /* A[2] * A[2] */
  24861. "ldr r10, [%[a], #8]\n\t"
  24862. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24863. "lsl r8, r10, #16\n\t"
  24864. "lsr r9, r10, #16\n\t"
  24865. "lsr r8, r8, #16\n\t"
  24866. "mov r12, r8\n\t"
  24867. "mul r8, r12, r8\n\t"
  24868. "mov r12, r9\n\t"
  24869. "mul r9, r12, r9\n\t"
  24870. "adds r3, r3, r8\n\t"
  24871. "adcs r4, r4, r9\n\t"
  24872. "adc r2, r2, #0\n\t"
  24873. "lsr r9, r10, #16\n\t"
  24874. "lsl r8, r10, #16\n\t"
  24875. "lsr r8, r8, #16\n\t"
  24876. "mul r8, r9, r8\n\t"
  24877. "lsr r9, r8, #15\n\t"
  24878. "lsl r8, r8, #17\n\t"
  24879. "adds r3, r3, r8\n\t"
  24880. "adcs r4, r4, r9\n\t"
  24881. "adc r2, r2, #0\n\t"
  24882. #else
  24883. "umull r8, r9, r10, r10\n\t"
  24884. "adds r3, r3, r8\n\t"
  24885. "adcs r4, r4, r9\n\t"
  24886. "adc r2, r2, #0\n\t"
  24887. #endif
  24888. "str r3, [sp, #16]\n\t"
  24889. /* A[0] * A[5] */
  24890. "ldr r10, [%[a], #20]\n\t"
  24891. "ldr r12, [%[a]]\n\t"
  24892. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24893. "lsl r8, r10, #16\n\t"
  24894. "lsl r5, r12, #16\n\t"
  24895. "lsr r8, r8, #16\n\t"
  24896. "lsr r5, r5, #16\n\t"
  24897. "mul r5, r8, r5\n\t"
  24898. "lsr r9, r12, #16\n\t"
  24899. "mul r8, r9, r8\n\t"
  24900. "lsr r6, r8, #16\n\t"
  24901. "lsl r8, r8, #16\n\t"
  24902. "adds r5, r5, r8\n\t"
  24903. "adc r6, r6, #0\n\t"
  24904. "lsr r8, r10, #16\n\t"
  24905. "mul r9, r8, r9\n\t"
  24906. "add r6, r6, r9\n\t"
  24907. "lsl r9, r12, #16\n\t"
  24908. "lsr r9, r9, #16\n\t"
  24909. "mul r8, r9, r8\n\t"
  24910. "lsr r9, r8, #16\n\t"
  24911. "lsl r8, r8, #16\n\t"
  24912. "adds r5, r5, r8\n\t"
  24913. "adc r6, r6, r9\n\t"
  24914. #else
  24915. "umull r5, r6, r10, r12\n\t"
  24916. #endif
  24917. "mov r3, #0\n\t"
  24918. "mov r7, #0\n\t"
  24919. /* A[1] * A[4] */
  24920. "ldr r10, [%[a], #16]\n\t"
  24921. "ldr r12, [%[a], #4]\n\t"
  24922. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24923. "lsl r8, r10, #16\n\t"
  24924. "lsl r9, r12, #16\n\t"
  24925. "lsr r8, r8, #16\n\t"
  24926. "lsr r9, r9, #16\n\t"
  24927. "mul r9, r8, r9\n\t"
  24928. "adds r5, r5, r9\n\t"
  24929. "adcs r6, r6, #0\n\t"
  24930. "adc r7, r7, #0\n\t"
  24931. "lsr r9, r12, #16\n\t"
  24932. "mul r8, r9, r8\n\t"
  24933. "lsr r9, r8, #16\n\t"
  24934. "lsl r8, r8, #16\n\t"
  24935. "adds r5, r5, r8\n\t"
  24936. "adcs r6, r6, r9\n\t"
  24937. "adc r7, r7, #0\n\t"
  24938. "lsr r8, r10, #16\n\t"
  24939. "lsr r9, r12, #16\n\t"
  24940. "mul r9, r8, r9\n\t"
  24941. "adds r6, r6, r9\n\t"
  24942. "adc r7, r7, #0\n\t"
  24943. "lsl r9, r12, #16\n\t"
  24944. "lsr r9, r9, #16\n\t"
  24945. "mul r8, r9, r8\n\t"
  24946. "lsr r9, r8, #16\n\t"
  24947. "lsl r8, r8, #16\n\t"
  24948. "adds r5, r5, r8\n\t"
  24949. "adcs r6, r6, r9\n\t"
  24950. "adc r7, r7, #0\n\t"
  24951. #else
  24952. "umull r8, r9, r10, r12\n\t"
  24953. "adds r5, r5, r8\n\t"
  24954. "adcs r6, r6, r9\n\t"
  24955. "adc r7, r7, #0\n\t"
  24956. #endif
  24957. /* A[2] * A[3] */
  24958. "ldr r10, [%[a], #12]\n\t"
  24959. "ldr r12, [%[a], #8]\n\t"
  24960. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  24961. "lsl r8, r10, #16\n\t"
  24962. "lsl r9, r12, #16\n\t"
  24963. "lsr r8, r8, #16\n\t"
  24964. "lsr r9, r9, #16\n\t"
  24965. "mul r9, r8, r9\n\t"
  24966. "adds r5, r5, r9\n\t"
  24967. "adcs r6, r6, #0\n\t"
  24968. "adc r7, r7, #0\n\t"
  24969. "lsr r9, r12, #16\n\t"
  24970. "mul r8, r9, r8\n\t"
  24971. "lsr r9, r8, #16\n\t"
  24972. "lsl r8, r8, #16\n\t"
  24973. "adds r5, r5, r8\n\t"
  24974. "adcs r6, r6, r9\n\t"
  24975. "adc r7, r7, #0\n\t"
  24976. "lsr r8, r10, #16\n\t"
  24977. "lsr r9, r12, #16\n\t"
  24978. "mul r9, r8, r9\n\t"
  24979. "adds r6, r6, r9\n\t"
  24980. "adc r7, r7, #0\n\t"
  24981. "lsl r9, r12, #16\n\t"
  24982. "lsr r9, r9, #16\n\t"
  24983. "mul r8, r9, r8\n\t"
  24984. "lsr r9, r8, #16\n\t"
  24985. "lsl r8, r8, #16\n\t"
  24986. "adds r5, r5, r8\n\t"
  24987. "adcs r6, r6, r9\n\t"
  24988. "adc r7, r7, #0\n\t"
  24989. #else
  24990. "umull r8, r9, r10, r12\n\t"
  24991. "adds r5, r5, r8\n\t"
  24992. "adcs r6, r6, r9\n\t"
  24993. "adc r7, r7, #0\n\t"
  24994. #endif
  24995. "adds r5, r5, r5\n\t"
  24996. "adcs r6, r6, r6\n\t"
  24997. "adc r7, r7, r7\n\t"
  24998. "adds r4, r4, r5\n\t"
  24999. "adcs r2, r2, r6\n\t"
  25000. "adc r3, r3, r7\n\t"
  25001. "str r4, [sp, #20]\n\t"
  25002. /* A[0] * A[6] */
  25003. "ldr r10, [%[a], #24]\n\t"
  25004. "ldr r12, [%[a]]\n\t"
  25005. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25006. "lsl r8, r10, #16\n\t"
  25007. "lsl r5, r12, #16\n\t"
  25008. "lsr r8, r8, #16\n\t"
  25009. "lsr r5, r5, #16\n\t"
  25010. "mul r5, r8, r5\n\t"
  25011. "lsr r9, r12, #16\n\t"
  25012. "mul r8, r9, r8\n\t"
  25013. "lsr r6, r8, #16\n\t"
  25014. "lsl r8, r8, #16\n\t"
  25015. "adds r5, r5, r8\n\t"
  25016. "adc r6, r6, #0\n\t"
  25017. "lsr r8, r10, #16\n\t"
  25018. "mul r9, r8, r9\n\t"
  25019. "add r6, r6, r9\n\t"
  25020. "lsl r9, r12, #16\n\t"
  25021. "lsr r9, r9, #16\n\t"
  25022. "mul r8, r9, r8\n\t"
  25023. "lsr r9, r8, #16\n\t"
  25024. "lsl r8, r8, #16\n\t"
  25025. "adds r5, r5, r8\n\t"
  25026. "adc r6, r6, r9\n\t"
  25027. #else
  25028. "umull r5, r6, r10, r12\n\t"
  25029. #endif
  25030. "mov r4, #0\n\t"
  25031. "mov r7, #0\n\t"
  25032. /* A[1] * A[5] */
  25033. "ldr r10, [%[a], #20]\n\t"
  25034. "ldr r12, [%[a], #4]\n\t"
  25035. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25036. "lsl r8, r10, #16\n\t"
  25037. "lsl r9, r12, #16\n\t"
  25038. "lsr r8, r8, #16\n\t"
  25039. "lsr r9, r9, #16\n\t"
  25040. "mul r9, r8, r9\n\t"
  25041. "adds r5, r5, r9\n\t"
  25042. "adcs r6, r6, #0\n\t"
  25043. "adc r7, r7, #0\n\t"
  25044. "lsr r9, r12, #16\n\t"
  25045. "mul r8, r9, r8\n\t"
  25046. "lsr r9, r8, #16\n\t"
  25047. "lsl r8, r8, #16\n\t"
  25048. "adds r5, r5, r8\n\t"
  25049. "adcs r6, r6, r9\n\t"
  25050. "adc r7, r7, #0\n\t"
  25051. "lsr r8, r10, #16\n\t"
  25052. "lsr r9, r12, #16\n\t"
  25053. "mul r9, r8, r9\n\t"
  25054. "adds r6, r6, r9\n\t"
  25055. "adc r7, r7, #0\n\t"
  25056. "lsl r9, r12, #16\n\t"
  25057. "lsr r9, r9, #16\n\t"
  25058. "mul r8, r9, r8\n\t"
  25059. "lsr r9, r8, #16\n\t"
  25060. "lsl r8, r8, #16\n\t"
  25061. "adds r5, r5, r8\n\t"
  25062. "adcs r6, r6, r9\n\t"
  25063. "adc r7, r7, #0\n\t"
  25064. #else
  25065. "umull r8, r9, r10, r12\n\t"
  25066. "adds r5, r5, r8\n\t"
  25067. "adcs r6, r6, r9\n\t"
  25068. "adc r7, r7, #0\n\t"
  25069. #endif
  25070. /* A[2] * A[4] */
  25071. "ldr r10, [%[a], #16]\n\t"
  25072. "ldr r12, [%[a], #8]\n\t"
  25073. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25074. "lsl r8, r10, #16\n\t"
  25075. "lsl r9, r12, #16\n\t"
  25076. "lsr r8, r8, #16\n\t"
  25077. "lsr r9, r9, #16\n\t"
  25078. "mul r9, r8, r9\n\t"
  25079. "adds r5, r5, r9\n\t"
  25080. "adcs r6, r6, #0\n\t"
  25081. "adc r7, r7, #0\n\t"
  25082. "lsr r9, r12, #16\n\t"
  25083. "mul r8, r9, r8\n\t"
  25084. "lsr r9, r8, #16\n\t"
  25085. "lsl r8, r8, #16\n\t"
  25086. "adds r5, r5, r8\n\t"
  25087. "adcs r6, r6, r9\n\t"
  25088. "adc r7, r7, #0\n\t"
  25089. "lsr r8, r10, #16\n\t"
  25090. "lsr r9, r12, #16\n\t"
  25091. "mul r9, r8, r9\n\t"
  25092. "adds r6, r6, r9\n\t"
  25093. "adc r7, r7, #0\n\t"
  25094. "lsl r9, r12, #16\n\t"
  25095. "lsr r9, r9, #16\n\t"
  25096. "mul r8, r9, r8\n\t"
  25097. "lsr r9, r8, #16\n\t"
  25098. "lsl r8, r8, #16\n\t"
  25099. "adds r5, r5, r8\n\t"
  25100. "adcs r6, r6, r9\n\t"
  25101. "adc r7, r7, #0\n\t"
  25102. #else
  25103. "umull r8, r9, r10, r12\n\t"
  25104. "adds r5, r5, r8\n\t"
  25105. "adcs r6, r6, r9\n\t"
  25106. "adc r7, r7, #0\n\t"
  25107. #endif
  25108. /* A[3] * A[3] */
  25109. "ldr r10, [%[a], #12]\n\t"
  25110. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25111. "lsl r8, r10, #16\n\t"
  25112. "lsr r9, r10, #16\n\t"
  25113. "lsr r8, r8, #16\n\t"
  25114. "mov r12, r8\n\t"
  25115. "mul r8, r12, r8\n\t"
  25116. "mov r12, r9\n\t"
  25117. "mul r9, r12, r9\n\t"
  25118. "adds r2, r2, r8\n\t"
  25119. "adcs r3, r3, r9\n\t"
  25120. "adc r4, r4, #0\n\t"
  25121. "lsr r9, r10, #16\n\t"
  25122. "lsl r8, r10, #16\n\t"
  25123. "lsr r8, r8, #16\n\t"
  25124. "mul r8, r9, r8\n\t"
  25125. "lsr r9, r8, #15\n\t"
  25126. "lsl r8, r8, #17\n\t"
  25127. "adds r2, r2, r8\n\t"
  25128. "adcs r3, r3, r9\n\t"
  25129. "adc r4, r4, #0\n\t"
  25130. "adds r5, r5, r5\n\t"
  25131. "adcs r6, r6, r6\n\t"
  25132. "adc r7, r7, r7\n\t"
  25133. #else
  25134. "umull r8, r9, r10, r10\n\t"
  25135. "adds r5, r5, r5\n\t"
  25136. "adcs r6, r6, r6\n\t"
  25137. "adc r7, r7, r7\n\t"
  25138. "adds r2, r2, r8\n\t"
  25139. "adcs r3, r3, r9\n\t"
  25140. "adc r4, r4, #0\n\t"
  25141. #endif
  25142. "adds r2, r2, r5\n\t"
  25143. "adcs r3, r3, r6\n\t"
  25144. "adc r4, r4, r7\n\t"
  25145. "str r2, [sp, #24]\n\t"
  25146. /* A[0] * A[7] */
  25147. "ldr r10, [%[a], #28]\n\t"
  25148. "ldr r12, [%[a]]\n\t"
  25149. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25150. "lsl r8, r10, #16\n\t"
  25151. "lsl r5, r12, #16\n\t"
  25152. "lsr r8, r8, #16\n\t"
  25153. "lsr r5, r5, #16\n\t"
  25154. "mul r5, r8, r5\n\t"
  25155. "lsr r9, r12, #16\n\t"
  25156. "mul r8, r9, r8\n\t"
  25157. "lsr r6, r8, #16\n\t"
  25158. "lsl r8, r8, #16\n\t"
  25159. "adds r5, r5, r8\n\t"
  25160. "adc r6, r6, #0\n\t"
  25161. "lsr r8, r10, #16\n\t"
  25162. "mul r9, r8, r9\n\t"
  25163. "add r6, r6, r9\n\t"
  25164. "lsl r9, r12, #16\n\t"
  25165. "lsr r9, r9, #16\n\t"
  25166. "mul r8, r9, r8\n\t"
  25167. "lsr r9, r8, #16\n\t"
  25168. "lsl r8, r8, #16\n\t"
  25169. "adds r5, r5, r8\n\t"
  25170. "adc r6, r6, r9\n\t"
  25171. #else
  25172. "umull r5, r6, r10, r12\n\t"
  25173. #endif
  25174. "mov r2, #0\n\t"
  25175. "mov r7, #0\n\t"
  25176. /* A[1] * A[6] */
  25177. "ldr r10, [%[a], #24]\n\t"
  25178. "ldr r12, [%[a], #4]\n\t"
  25179. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25180. "lsl r8, r10, #16\n\t"
  25181. "lsl r9, r12, #16\n\t"
  25182. "lsr r8, r8, #16\n\t"
  25183. "lsr r9, r9, #16\n\t"
  25184. "mul r9, r8, r9\n\t"
  25185. "adds r5, r5, r9\n\t"
  25186. "adcs r6, r6, #0\n\t"
  25187. "adc r7, r7, #0\n\t"
  25188. "lsr r9, r12, #16\n\t"
  25189. "mul r8, r9, r8\n\t"
  25190. "lsr r9, r8, #16\n\t"
  25191. "lsl r8, r8, #16\n\t"
  25192. "adds r5, r5, r8\n\t"
  25193. "adcs r6, r6, r9\n\t"
  25194. "adc r7, r7, #0\n\t"
  25195. "lsr r8, r10, #16\n\t"
  25196. "lsr r9, r12, #16\n\t"
  25197. "mul r9, r8, r9\n\t"
  25198. "adds r6, r6, r9\n\t"
  25199. "adc r7, r7, #0\n\t"
  25200. "lsl r9, r12, #16\n\t"
  25201. "lsr r9, r9, #16\n\t"
  25202. "mul r8, r9, r8\n\t"
  25203. "lsr r9, r8, #16\n\t"
  25204. "lsl r8, r8, #16\n\t"
  25205. "adds r5, r5, r8\n\t"
  25206. "adcs r6, r6, r9\n\t"
  25207. "adc r7, r7, #0\n\t"
  25208. #else
  25209. "umull r8, r9, r10, r12\n\t"
  25210. "adds r5, r5, r8\n\t"
  25211. "adcs r6, r6, r9\n\t"
  25212. "adc r7, r7, #0\n\t"
  25213. #endif
  25214. /* A[2] * A[5] */
  25215. "ldr r10, [%[a], #20]\n\t"
  25216. "ldr r12, [%[a], #8]\n\t"
  25217. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25218. "lsl r8, r10, #16\n\t"
  25219. "lsl r9, r12, #16\n\t"
  25220. "lsr r8, r8, #16\n\t"
  25221. "lsr r9, r9, #16\n\t"
  25222. "mul r9, r8, r9\n\t"
  25223. "adds r5, r5, r9\n\t"
  25224. "adcs r6, r6, #0\n\t"
  25225. "adc r7, r7, #0\n\t"
  25226. "lsr r9, r12, #16\n\t"
  25227. "mul r8, r9, r8\n\t"
  25228. "lsr r9, r8, #16\n\t"
  25229. "lsl r8, r8, #16\n\t"
  25230. "adds r5, r5, r8\n\t"
  25231. "adcs r6, r6, r9\n\t"
  25232. "adc r7, r7, #0\n\t"
  25233. "lsr r8, r10, #16\n\t"
  25234. "lsr r9, r12, #16\n\t"
  25235. "mul r9, r8, r9\n\t"
  25236. "adds r6, r6, r9\n\t"
  25237. "adc r7, r7, #0\n\t"
  25238. "lsl r9, r12, #16\n\t"
  25239. "lsr r9, r9, #16\n\t"
  25240. "mul r8, r9, r8\n\t"
  25241. "lsr r9, r8, #16\n\t"
  25242. "lsl r8, r8, #16\n\t"
  25243. "adds r5, r5, r8\n\t"
  25244. "adcs r6, r6, r9\n\t"
  25245. "adc r7, r7, #0\n\t"
  25246. #else
  25247. "umull r8, r9, r10, r12\n\t"
  25248. "adds r5, r5, r8\n\t"
  25249. "adcs r6, r6, r9\n\t"
  25250. "adc r7, r7, #0\n\t"
  25251. #endif
  25252. /* A[3] * A[4] */
  25253. "ldr r10, [%[a], #16]\n\t"
  25254. "ldr r12, [%[a], #12]\n\t"
  25255. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25256. "lsl r8, r10, #16\n\t"
  25257. "lsl r9, r12, #16\n\t"
  25258. "lsr r8, r8, #16\n\t"
  25259. "lsr r9, r9, #16\n\t"
  25260. "mul r9, r8, r9\n\t"
  25261. "adds r5, r5, r9\n\t"
  25262. "adcs r6, r6, #0\n\t"
  25263. "adc r7, r7, #0\n\t"
  25264. "lsr r9, r12, #16\n\t"
  25265. "mul r8, r9, r8\n\t"
  25266. "lsr r9, r8, #16\n\t"
  25267. "lsl r8, r8, #16\n\t"
  25268. "adds r5, r5, r8\n\t"
  25269. "adcs r6, r6, r9\n\t"
  25270. "adc r7, r7, #0\n\t"
  25271. "lsr r8, r10, #16\n\t"
  25272. "lsr r9, r12, #16\n\t"
  25273. "mul r9, r8, r9\n\t"
  25274. "adds r6, r6, r9\n\t"
  25275. "adc r7, r7, #0\n\t"
  25276. "lsl r9, r12, #16\n\t"
  25277. "lsr r9, r9, #16\n\t"
  25278. "mul r8, r9, r8\n\t"
  25279. "lsr r9, r8, #16\n\t"
  25280. "lsl r8, r8, #16\n\t"
  25281. "adds r5, r5, r8\n\t"
  25282. "adcs r6, r6, r9\n\t"
  25283. "adc r7, r7, #0\n\t"
  25284. #else
  25285. "umull r8, r9, r10, r12\n\t"
  25286. "adds r5, r5, r8\n\t"
  25287. "adcs r6, r6, r9\n\t"
  25288. "adc r7, r7, #0\n\t"
  25289. #endif
  25290. "adds r5, r5, r5\n\t"
  25291. "adcs r6, r6, r6\n\t"
  25292. "adc r7, r7, r7\n\t"
  25293. "adds r3, r3, r5\n\t"
  25294. "adcs r4, r4, r6\n\t"
  25295. "adc r2, r2, r7\n\t"
  25296. "str r3, [sp, #28]\n\t"
  25297. /* A[0] * A[8] */
  25298. "ldr r10, [%[a], #32]\n\t"
  25299. "ldr r12, [%[a]]\n\t"
  25300. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25301. "lsl r8, r10, #16\n\t"
  25302. "lsl r5, r12, #16\n\t"
  25303. "lsr r8, r8, #16\n\t"
  25304. "lsr r5, r5, #16\n\t"
  25305. "mul r5, r8, r5\n\t"
  25306. "lsr r9, r12, #16\n\t"
  25307. "mul r8, r9, r8\n\t"
  25308. "lsr r6, r8, #16\n\t"
  25309. "lsl r8, r8, #16\n\t"
  25310. "adds r5, r5, r8\n\t"
  25311. "adc r6, r6, #0\n\t"
  25312. "lsr r8, r10, #16\n\t"
  25313. "mul r9, r8, r9\n\t"
  25314. "add r6, r6, r9\n\t"
  25315. "lsl r9, r12, #16\n\t"
  25316. "lsr r9, r9, #16\n\t"
  25317. "mul r8, r9, r8\n\t"
  25318. "lsr r9, r8, #16\n\t"
  25319. "lsl r8, r8, #16\n\t"
  25320. "adds r5, r5, r8\n\t"
  25321. "adc r6, r6, r9\n\t"
  25322. #else
  25323. "umull r5, r6, r10, r12\n\t"
  25324. #endif
  25325. "mov r3, #0\n\t"
  25326. "mov r7, #0\n\t"
  25327. /* A[1] * A[7] */
  25328. "ldr r10, [%[a], #28]\n\t"
  25329. "ldr r12, [%[a], #4]\n\t"
  25330. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25331. "lsl r8, r10, #16\n\t"
  25332. "lsl r9, r12, #16\n\t"
  25333. "lsr r8, r8, #16\n\t"
  25334. "lsr r9, r9, #16\n\t"
  25335. "mul r9, r8, r9\n\t"
  25336. "adds r5, r5, r9\n\t"
  25337. "adcs r6, r6, #0\n\t"
  25338. "adc r7, r7, #0\n\t"
  25339. "lsr r9, r12, #16\n\t"
  25340. "mul r8, r9, r8\n\t"
  25341. "lsr r9, r8, #16\n\t"
  25342. "lsl r8, r8, #16\n\t"
  25343. "adds r5, r5, r8\n\t"
  25344. "adcs r6, r6, r9\n\t"
  25345. "adc r7, r7, #0\n\t"
  25346. "lsr r8, r10, #16\n\t"
  25347. "lsr r9, r12, #16\n\t"
  25348. "mul r9, r8, r9\n\t"
  25349. "adds r6, r6, r9\n\t"
  25350. "adc r7, r7, #0\n\t"
  25351. "lsl r9, r12, #16\n\t"
  25352. "lsr r9, r9, #16\n\t"
  25353. "mul r8, r9, r8\n\t"
  25354. "lsr r9, r8, #16\n\t"
  25355. "lsl r8, r8, #16\n\t"
  25356. "adds r5, r5, r8\n\t"
  25357. "adcs r6, r6, r9\n\t"
  25358. "adc r7, r7, #0\n\t"
  25359. #else
  25360. "umull r8, r9, r10, r12\n\t"
  25361. "adds r5, r5, r8\n\t"
  25362. "adcs r6, r6, r9\n\t"
  25363. "adc r7, r7, #0\n\t"
  25364. #endif
  25365. /* A[2] * A[6] */
  25366. "ldr r10, [%[a], #24]\n\t"
  25367. "ldr r12, [%[a], #8]\n\t"
  25368. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25369. "lsl r8, r10, #16\n\t"
  25370. "lsl r9, r12, #16\n\t"
  25371. "lsr r8, r8, #16\n\t"
  25372. "lsr r9, r9, #16\n\t"
  25373. "mul r9, r8, r9\n\t"
  25374. "adds r5, r5, r9\n\t"
  25375. "adcs r6, r6, #0\n\t"
  25376. "adc r7, r7, #0\n\t"
  25377. "lsr r9, r12, #16\n\t"
  25378. "mul r8, r9, r8\n\t"
  25379. "lsr r9, r8, #16\n\t"
  25380. "lsl r8, r8, #16\n\t"
  25381. "adds r5, r5, r8\n\t"
  25382. "adcs r6, r6, r9\n\t"
  25383. "adc r7, r7, #0\n\t"
  25384. "lsr r8, r10, #16\n\t"
  25385. "lsr r9, r12, #16\n\t"
  25386. "mul r9, r8, r9\n\t"
  25387. "adds r6, r6, r9\n\t"
  25388. "adc r7, r7, #0\n\t"
  25389. "lsl r9, r12, #16\n\t"
  25390. "lsr r9, r9, #16\n\t"
  25391. "mul r8, r9, r8\n\t"
  25392. "lsr r9, r8, #16\n\t"
  25393. "lsl r8, r8, #16\n\t"
  25394. "adds r5, r5, r8\n\t"
  25395. "adcs r6, r6, r9\n\t"
  25396. "adc r7, r7, #0\n\t"
  25397. #else
  25398. "umull r8, r9, r10, r12\n\t"
  25399. "adds r5, r5, r8\n\t"
  25400. "adcs r6, r6, r9\n\t"
  25401. "adc r7, r7, #0\n\t"
  25402. #endif
  25403. /* A[3] * A[5] */
  25404. "ldr r10, [%[a], #20]\n\t"
  25405. "ldr r12, [%[a], #12]\n\t"
  25406. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25407. "lsl r8, r10, #16\n\t"
  25408. "lsl r9, r12, #16\n\t"
  25409. "lsr r8, r8, #16\n\t"
  25410. "lsr r9, r9, #16\n\t"
  25411. "mul r9, r8, r9\n\t"
  25412. "adds r5, r5, r9\n\t"
  25413. "adcs r6, r6, #0\n\t"
  25414. "adc r7, r7, #0\n\t"
  25415. "lsr r9, r12, #16\n\t"
  25416. "mul r8, r9, r8\n\t"
  25417. "lsr r9, r8, #16\n\t"
  25418. "lsl r8, r8, #16\n\t"
  25419. "adds r5, r5, r8\n\t"
  25420. "adcs r6, r6, r9\n\t"
  25421. "adc r7, r7, #0\n\t"
  25422. "lsr r8, r10, #16\n\t"
  25423. "lsr r9, r12, #16\n\t"
  25424. "mul r9, r8, r9\n\t"
  25425. "adds r6, r6, r9\n\t"
  25426. "adc r7, r7, #0\n\t"
  25427. "lsl r9, r12, #16\n\t"
  25428. "lsr r9, r9, #16\n\t"
  25429. "mul r8, r9, r8\n\t"
  25430. "lsr r9, r8, #16\n\t"
  25431. "lsl r8, r8, #16\n\t"
  25432. "adds r5, r5, r8\n\t"
  25433. "adcs r6, r6, r9\n\t"
  25434. "adc r7, r7, #0\n\t"
  25435. #else
  25436. "umull r8, r9, r10, r12\n\t"
  25437. "adds r5, r5, r8\n\t"
  25438. "adcs r6, r6, r9\n\t"
  25439. "adc r7, r7, #0\n\t"
  25440. #endif
  25441. /* A[4] * A[4] */
  25442. "ldr r10, [%[a], #16]\n\t"
  25443. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25444. "lsl r8, r10, #16\n\t"
  25445. "lsr r9, r10, #16\n\t"
  25446. "lsr r8, r8, #16\n\t"
  25447. "mov r12, r8\n\t"
  25448. "mul r8, r12, r8\n\t"
  25449. "mov r12, r9\n\t"
  25450. "mul r9, r12, r9\n\t"
  25451. "adds r4, r4, r8\n\t"
  25452. "adcs r2, r2, r9\n\t"
  25453. "adc r3, r3, #0\n\t"
  25454. "lsr r9, r10, #16\n\t"
  25455. "lsl r8, r10, #16\n\t"
  25456. "lsr r8, r8, #16\n\t"
  25457. "mul r8, r9, r8\n\t"
  25458. "lsr r9, r8, #15\n\t"
  25459. "lsl r8, r8, #17\n\t"
  25460. "adds r4, r4, r8\n\t"
  25461. "adcs r2, r2, r9\n\t"
  25462. "adc r3, r3, #0\n\t"
  25463. "adds r5, r5, r5\n\t"
  25464. "adcs r6, r6, r6\n\t"
  25465. "adc r7, r7, r7\n\t"
  25466. #else
  25467. "umull r8, r9, r10, r10\n\t"
  25468. "adds r5, r5, r5\n\t"
  25469. "adcs r6, r6, r6\n\t"
  25470. "adc r7, r7, r7\n\t"
  25471. "adds r4, r4, r8\n\t"
  25472. "adcs r2, r2, r9\n\t"
  25473. "adc r3, r3, #0\n\t"
  25474. #endif
  25475. "adds r4, r4, r5\n\t"
  25476. "adcs r2, r2, r6\n\t"
  25477. "adc r3, r3, r7\n\t"
  25478. "str r4, [sp, #32]\n\t"
  25479. /* A[0] * A[9] */
  25480. "ldr r10, [%[a], #36]\n\t"
  25481. "ldr r12, [%[a]]\n\t"
  25482. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25483. "lsl r8, r10, #16\n\t"
  25484. "lsl r5, r12, #16\n\t"
  25485. "lsr r8, r8, #16\n\t"
  25486. "lsr r5, r5, #16\n\t"
  25487. "mul r5, r8, r5\n\t"
  25488. "lsr r9, r12, #16\n\t"
  25489. "mul r8, r9, r8\n\t"
  25490. "lsr r6, r8, #16\n\t"
  25491. "lsl r8, r8, #16\n\t"
  25492. "adds r5, r5, r8\n\t"
  25493. "adc r6, r6, #0\n\t"
  25494. "lsr r8, r10, #16\n\t"
  25495. "mul r9, r8, r9\n\t"
  25496. "add r6, r6, r9\n\t"
  25497. "lsl r9, r12, #16\n\t"
  25498. "lsr r9, r9, #16\n\t"
  25499. "mul r8, r9, r8\n\t"
  25500. "lsr r9, r8, #16\n\t"
  25501. "lsl r8, r8, #16\n\t"
  25502. "adds r5, r5, r8\n\t"
  25503. "adc r6, r6, r9\n\t"
  25504. #else
  25505. "umull r5, r6, r10, r12\n\t"
  25506. #endif
  25507. "mov r4, #0\n\t"
  25508. "mov r7, #0\n\t"
  25509. /* A[1] * A[8] */
  25510. "ldr r10, [%[a], #32]\n\t"
  25511. "ldr r12, [%[a], #4]\n\t"
  25512. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25513. "lsl r8, r10, #16\n\t"
  25514. "lsl r9, r12, #16\n\t"
  25515. "lsr r8, r8, #16\n\t"
  25516. "lsr r9, r9, #16\n\t"
  25517. "mul r9, r8, r9\n\t"
  25518. "adds r5, r5, r9\n\t"
  25519. "adcs r6, r6, #0\n\t"
  25520. "adc r7, r7, #0\n\t"
  25521. "lsr r9, r12, #16\n\t"
  25522. "mul r8, r9, r8\n\t"
  25523. "lsr r9, r8, #16\n\t"
  25524. "lsl r8, r8, #16\n\t"
  25525. "adds r5, r5, r8\n\t"
  25526. "adcs r6, r6, r9\n\t"
  25527. "adc r7, r7, #0\n\t"
  25528. "lsr r8, r10, #16\n\t"
  25529. "lsr r9, r12, #16\n\t"
  25530. "mul r9, r8, r9\n\t"
  25531. "adds r6, r6, r9\n\t"
  25532. "adc r7, r7, #0\n\t"
  25533. "lsl r9, r12, #16\n\t"
  25534. "lsr r9, r9, #16\n\t"
  25535. "mul r8, r9, r8\n\t"
  25536. "lsr r9, r8, #16\n\t"
  25537. "lsl r8, r8, #16\n\t"
  25538. "adds r5, r5, r8\n\t"
  25539. "adcs r6, r6, r9\n\t"
  25540. "adc r7, r7, #0\n\t"
  25541. #else
  25542. "umull r8, r9, r10, r12\n\t"
  25543. "adds r5, r5, r8\n\t"
  25544. "adcs r6, r6, r9\n\t"
  25545. "adc r7, r7, #0\n\t"
  25546. #endif
  25547. /* A[2] * A[7] */
  25548. "ldr r10, [%[a], #28]\n\t"
  25549. "ldr r12, [%[a], #8]\n\t"
  25550. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25551. "lsl r8, r10, #16\n\t"
  25552. "lsl r9, r12, #16\n\t"
  25553. "lsr r8, r8, #16\n\t"
  25554. "lsr r9, r9, #16\n\t"
  25555. "mul r9, r8, r9\n\t"
  25556. "adds r5, r5, r9\n\t"
  25557. "adcs r6, r6, #0\n\t"
  25558. "adc r7, r7, #0\n\t"
  25559. "lsr r9, r12, #16\n\t"
  25560. "mul r8, r9, r8\n\t"
  25561. "lsr r9, r8, #16\n\t"
  25562. "lsl r8, r8, #16\n\t"
  25563. "adds r5, r5, r8\n\t"
  25564. "adcs r6, r6, r9\n\t"
  25565. "adc r7, r7, #0\n\t"
  25566. "lsr r8, r10, #16\n\t"
  25567. "lsr r9, r12, #16\n\t"
  25568. "mul r9, r8, r9\n\t"
  25569. "adds r6, r6, r9\n\t"
  25570. "adc r7, r7, #0\n\t"
  25571. "lsl r9, r12, #16\n\t"
  25572. "lsr r9, r9, #16\n\t"
  25573. "mul r8, r9, r8\n\t"
  25574. "lsr r9, r8, #16\n\t"
  25575. "lsl r8, r8, #16\n\t"
  25576. "adds r5, r5, r8\n\t"
  25577. "adcs r6, r6, r9\n\t"
  25578. "adc r7, r7, #0\n\t"
  25579. #else
  25580. "umull r8, r9, r10, r12\n\t"
  25581. "adds r5, r5, r8\n\t"
  25582. "adcs r6, r6, r9\n\t"
  25583. "adc r7, r7, #0\n\t"
  25584. #endif
  25585. /* A[3] * A[6] */
  25586. "ldr r10, [%[a], #24]\n\t"
  25587. "ldr r12, [%[a], #12]\n\t"
  25588. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25589. "lsl r8, r10, #16\n\t"
  25590. "lsl r9, r12, #16\n\t"
  25591. "lsr r8, r8, #16\n\t"
  25592. "lsr r9, r9, #16\n\t"
  25593. "mul r9, r8, r9\n\t"
  25594. "adds r5, r5, r9\n\t"
  25595. "adcs r6, r6, #0\n\t"
  25596. "adc r7, r7, #0\n\t"
  25597. "lsr r9, r12, #16\n\t"
  25598. "mul r8, r9, r8\n\t"
  25599. "lsr r9, r8, #16\n\t"
  25600. "lsl r8, r8, #16\n\t"
  25601. "adds r5, r5, r8\n\t"
  25602. "adcs r6, r6, r9\n\t"
  25603. "adc r7, r7, #0\n\t"
  25604. "lsr r8, r10, #16\n\t"
  25605. "lsr r9, r12, #16\n\t"
  25606. "mul r9, r8, r9\n\t"
  25607. "adds r6, r6, r9\n\t"
  25608. "adc r7, r7, #0\n\t"
  25609. "lsl r9, r12, #16\n\t"
  25610. "lsr r9, r9, #16\n\t"
  25611. "mul r8, r9, r8\n\t"
  25612. "lsr r9, r8, #16\n\t"
  25613. "lsl r8, r8, #16\n\t"
  25614. "adds r5, r5, r8\n\t"
  25615. "adcs r6, r6, r9\n\t"
  25616. "adc r7, r7, #0\n\t"
  25617. #else
  25618. "umull r8, r9, r10, r12\n\t"
  25619. "adds r5, r5, r8\n\t"
  25620. "adcs r6, r6, r9\n\t"
  25621. "adc r7, r7, #0\n\t"
  25622. #endif
  25623. /* A[4] * A[5] */
  25624. "ldr r10, [%[a], #20]\n\t"
  25625. "ldr r12, [%[a], #16]\n\t"
  25626. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25627. "lsl r8, r10, #16\n\t"
  25628. "lsl r9, r12, #16\n\t"
  25629. "lsr r8, r8, #16\n\t"
  25630. "lsr r9, r9, #16\n\t"
  25631. "mul r9, r8, r9\n\t"
  25632. "adds r5, r5, r9\n\t"
  25633. "adcs r6, r6, #0\n\t"
  25634. "adc r7, r7, #0\n\t"
  25635. "lsr r9, r12, #16\n\t"
  25636. "mul r8, r9, r8\n\t"
  25637. "lsr r9, r8, #16\n\t"
  25638. "lsl r8, r8, #16\n\t"
  25639. "adds r5, r5, r8\n\t"
  25640. "adcs r6, r6, r9\n\t"
  25641. "adc r7, r7, #0\n\t"
  25642. "lsr r8, r10, #16\n\t"
  25643. "lsr r9, r12, #16\n\t"
  25644. "mul r9, r8, r9\n\t"
  25645. "adds r6, r6, r9\n\t"
  25646. "adc r7, r7, #0\n\t"
  25647. "lsl r9, r12, #16\n\t"
  25648. "lsr r9, r9, #16\n\t"
  25649. "mul r8, r9, r8\n\t"
  25650. "lsr r9, r8, #16\n\t"
  25651. "lsl r8, r8, #16\n\t"
  25652. "adds r5, r5, r8\n\t"
  25653. "adcs r6, r6, r9\n\t"
  25654. "adc r7, r7, #0\n\t"
  25655. #else
  25656. "umull r8, r9, r10, r12\n\t"
  25657. "adds r5, r5, r8\n\t"
  25658. "adcs r6, r6, r9\n\t"
  25659. "adc r7, r7, #0\n\t"
  25660. #endif
  25661. "adds r5, r5, r5\n\t"
  25662. "adcs r6, r6, r6\n\t"
  25663. "adc r7, r7, r7\n\t"
  25664. "adds r2, r2, r5\n\t"
  25665. "adcs r3, r3, r6\n\t"
  25666. "adc r4, r4, r7\n\t"
  25667. "str r2, [sp, #36]\n\t"
  25668. /* A[0] * A[10] */
  25669. "ldr r10, [%[a], #40]\n\t"
  25670. "ldr r12, [%[a]]\n\t"
  25671. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25672. "lsl r8, r10, #16\n\t"
  25673. "lsl r5, r12, #16\n\t"
  25674. "lsr r8, r8, #16\n\t"
  25675. "lsr r5, r5, #16\n\t"
  25676. "mul r5, r8, r5\n\t"
  25677. "lsr r9, r12, #16\n\t"
  25678. "mul r8, r9, r8\n\t"
  25679. "lsr r6, r8, #16\n\t"
  25680. "lsl r8, r8, #16\n\t"
  25681. "adds r5, r5, r8\n\t"
  25682. "adc r6, r6, #0\n\t"
  25683. "lsr r8, r10, #16\n\t"
  25684. "mul r9, r8, r9\n\t"
  25685. "add r6, r6, r9\n\t"
  25686. "lsl r9, r12, #16\n\t"
  25687. "lsr r9, r9, #16\n\t"
  25688. "mul r8, r9, r8\n\t"
  25689. "lsr r9, r8, #16\n\t"
  25690. "lsl r8, r8, #16\n\t"
  25691. "adds r5, r5, r8\n\t"
  25692. "adc r6, r6, r9\n\t"
  25693. #else
  25694. "umull r5, r6, r10, r12\n\t"
  25695. #endif
  25696. "mov r2, #0\n\t"
  25697. "mov r7, #0\n\t"
  25698. /* A[1] * A[9] */
  25699. "ldr r10, [%[a], #36]\n\t"
  25700. "ldr r12, [%[a], #4]\n\t"
  25701. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25702. "lsl r8, r10, #16\n\t"
  25703. "lsl r9, r12, #16\n\t"
  25704. "lsr r8, r8, #16\n\t"
  25705. "lsr r9, r9, #16\n\t"
  25706. "mul r9, r8, r9\n\t"
  25707. "adds r5, r5, r9\n\t"
  25708. "adcs r6, r6, #0\n\t"
  25709. "adc r7, r7, #0\n\t"
  25710. "lsr r9, r12, #16\n\t"
  25711. "mul r8, r9, r8\n\t"
  25712. "lsr r9, r8, #16\n\t"
  25713. "lsl r8, r8, #16\n\t"
  25714. "adds r5, r5, r8\n\t"
  25715. "adcs r6, r6, r9\n\t"
  25716. "adc r7, r7, #0\n\t"
  25717. "lsr r8, r10, #16\n\t"
  25718. "lsr r9, r12, #16\n\t"
  25719. "mul r9, r8, r9\n\t"
  25720. "adds r6, r6, r9\n\t"
  25721. "adc r7, r7, #0\n\t"
  25722. "lsl r9, r12, #16\n\t"
  25723. "lsr r9, r9, #16\n\t"
  25724. "mul r8, r9, r8\n\t"
  25725. "lsr r9, r8, #16\n\t"
  25726. "lsl r8, r8, #16\n\t"
  25727. "adds r5, r5, r8\n\t"
  25728. "adcs r6, r6, r9\n\t"
  25729. "adc r7, r7, #0\n\t"
  25730. #else
  25731. "umull r8, r9, r10, r12\n\t"
  25732. "adds r5, r5, r8\n\t"
  25733. "adcs r6, r6, r9\n\t"
  25734. "adc r7, r7, #0\n\t"
  25735. #endif
  25736. /* A[2] * A[8] */
  25737. "ldr r10, [%[a], #32]\n\t"
  25738. "ldr r12, [%[a], #8]\n\t"
  25739. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25740. "lsl r8, r10, #16\n\t"
  25741. "lsl r9, r12, #16\n\t"
  25742. "lsr r8, r8, #16\n\t"
  25743. "lsr r9, r9, #16\n\t"
  25744. "mul r9, r8, r9\n\t"
  25745. "adds r5, r5, r9\n\t"
  25746. "adcs r6, r6, #0\n\t"
  25747. "adc r7, r7, #0\n\t"
  25748. "lsr r9, r12, #16\n\t"
  25749. "mul r8, r9, r8\n\t"
  25750. "lsr r9, r8, #16\n\t"
  25751. "lsl r8, r8, #16\n\t"
  25752. "adds r5, r5, r8\n\t"
  25753. "adcs r6, r6, r9\n\t"
  25754. "adc r7, r7, #0\n\t"
  25755. "lsr r8, r10, #16\n\t"
  25756. "lsr r9, r12, #16\n\t"
  25757. "mul r9, r8, r9\n\t"
  25758. "adds r6, r6, r9\n\t"
  25759. "adc r7, r7, #0\n\t"
  25760. "lsl r9, r12, #16\n\t"
  25761. "lsr r9, r9, #16\n\t"
  25762. "mul r8, r9, r8\n\t"
  25763. "lsr r9, r8, #16\n\t"
  25764. "lsl r8, r8, #16\n\t"
  25765. "adds r5, r5, r8\n\t"
  25766. "adcs r6, r6, r9\n\t"
  25767. "adc r7, r7, #0\n\t"
  25768. #else
  25769. "umull r8, r9, r10, r12\n\t"
  25770. "adds r5, r5, r8\n\t"
  25771. "adcs r6, r6, r9\n\t"
  25772. "adc r7, r7, #0\n\t"
  25773. #endif
  25774. /* A[3] * A[7] */
  25775. "ldr r10, [%[a], #28]\n\t"
  25776. "ldr r12, [%[a], #12]\n\t"
  25777. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25778. "lsl r8, r10, #16\n\t"
  25779. "lsl r9, r12, #16\n\t"
  25780. "lsr r8, r8, #16\n\t"
  25781. "lsr r9, r9, #16\n\t"
  25782. "mul r9, r8, r9\n\t"
  25783. "adds r5, r5, r9\n\t"
  25784. "adcs r6, r6, #0\n\t"
  25785. "adc r7, r7, #0\n\t"
  25786. "lsr r9, r12, #16\n\t"
  25787. "mul r8, r9, r8\n\t"
  25788. "lsr r9, r8, #16\n\t"
  25789. "lsl r8, r8, #16\n\t"
  25790. "adds r5, r5, r8\n\t"
  25791. "adcs r6, r6, r9\n\t"
  25792. "adc r7, r7, #0\n\t"
  25793. "lsr r8, r10, #16\n\t"
  25794. "lsr r9, r12, #16\n\t"
  25795. "mul r9, r8, r9\n\t"
  25796. "adds r6, r6, r9\n\t"
  25797. "adc r7, r7, #0\n\t"
  25798. "lsl r9, r12, #16\n\t"
  25799. "lsr r9, r9, #16\n\t"
  25800. "mul r8, r9, r8\n\t"
  25801. "lsr r9, r8, #16\n\t"
  25802. "lsl r8, r8, #16\n\t"
  25803. "adds r5, r5, r8\n\t"
  25804. "adcs r6, r6, r9\n\t"
  25805. "adc r7, r7, #0\n\t"
  25806. #else
  25807. "umull r8, r9, r10, r12\n\t"
  25808. "adds r5, r5, r8\n\t"
  25809. "adcs r6, r6, r9\n\t"
  25810. "adc r7, r7, #0\n\t"
  25811. #endif
  25812. /* A[4] * A[6] */
  25813. "ldr r10, [%[a], #24]\n\t"
  25814. "ldr r12, [%[a], #16]\n\t"
  25815. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25816. "lsl r8, r10, #16\n\t"
  25817. "lsl r9, r12, #16\n\t"
  25818. "lsr r8, r8, #16\n\t"
  25819. "lsr r9, r9, #16\n\t"
  25820. "mul r9, r8, r9\n\t"
  25821. "adds r5, r5, r9\n\t"
  25822. "adcs r6, r6, #0\n\t"
  25823. "adc r7, r7, #0\n\t"
  25824. "lsr r9, r12, #16\n\t"
  25825. "mul r8, r9, r8\n\t"
  25826. "lsr r9, r8, #16\n\t"
  25827. "lsl r8, r8, #16\n\t"
  25828. "adds r5, r5, r8\n\t"
  25829. "adcs r6, r6, r9\n\t"
  25830. "adc r7, r7, #0\n\t"
  25831. "lsr r8, r10, #16\n\t"
  25832. "lsr r9, r12, #16\n\t"
  25833. "mul r9, r8, r9\n\t"
  25834. "adds r6, r6, r9\n\t"
  25835. "adc r7, r7, #0\n\t"
  25836. "lsl r9, r12, #16\n\t"
  25837. "lsr r9, r9, #16\n\t"
  25838. "mul r8, r9, r8\n\t"
  25839. "lsr r9, r8, #16\n\t"
  25840. "lsl r8, r8, #16\n\t"
  25841. "adds r5, r5, r8\n\t"
  25842. "adcs r6, r6, r9\n\t"
  25843. "adc r7, r7, #0\n\t"
  25844. #else
  25845. "umull r8, r9, r10, r12\n\t"
  25846. "adds r5, r5, r8\n\t"
  25847. "adcs r6, r6, r9\n\t"
  25848. "adc r7, r7, #0\n\t"
  25849. #endif
  25850. /* A[5] * A[5] */
  25851. "ldr r10, [%[a], #20]\n\t"
  25852. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25853. "lsl r8, r10, #16\n\t"
  25854. "lsr r9, r10, #16\n\t"
  25855. "lsr r8, r8, #16\n\t"
  25856. "mov r12, r8\n\t"
  25857. "mul r8, r12, r8\n\t"
  25858. "mov r12, r9\n\t"
  25859. "mul r9, r12, r9\n\t"
  25860. "adds r3, r3, r8\n\t"
  25861. "adcs r4, r4, r9\n\t"
  25862. "adc r2, r2, #0\n\t"
  25863. "lsr r9, r10, #16\n\t"
  25864. "lsl r8, r10, #16\n\t"
  25865. "lsr r8, r8, #16\n\t"
  25866. "mul r8, r9, r8\n\t"
  25867. "lsr r9, r8, #15\n\t"
  25868. "lsl r8, r8, #17\n\t"
  25869. "adds r3, r3, r8\n\t"
  25870. "adcs r4, r4, r9\n\t"
  25871. "adc r2, r2, #0\n\t"
  25872. "adds r5, r5, r5\n\t"
  25873. "adcs r6, r6, r6\n\t"
  25874. "adc r7, r7, r7\n\t"
  25875. #else
  25876. "umull r8, r9, r10, r10\n\t"
  25877. "adds r5, r5, r5\n\t"
  25878. "adcs r6, r6, r6\n\t"
  25879. "adc r7, r7, r7\n\t"
  25880. "adds r3, r3, r8\n\t"
  25881. "adcs r4, r4, r9\n\t"
  25882. "adc r2, r2, #0\n\t"
  25883. #endif
  25884. "adds r3, r3, r5\n\t"
  25885. "adcs r4, r4, r6\n\t"
  25886. "adc r2, r2, r7\n\t"
  25887. "str r3, [sp, #40]\n\t"
  25888. /* A[0] * A[11] */
  25889. "ldr r10, [%[a], #44]\n\t"
  25890. "ldr r12, [%[a]]\n\t"
  25891. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25892. "lsl r8, r10, #16\n\t"
  25893. "lsl r5, r12, #16\n\t"
  25894. "lsr r8, r8, #16\n\t"
  25895. "lsr r5, r5, #16\n\t"
  25896. "mul r5, r8, r5\n\t"
  25897. "lsr r9, r12, #16\n\t"
  25898. "mul r8, r9, r8\n\t"
  25899. "lsr r6, r8, #16\n\t"
  25900. "lsl r8, r8, #16\n\t"
  25901. "adds r5, r5, r8\n\t"
  25902. "adc r6, r6, #0\n\t"
  25903. "lsr r8, r10, #16\n\t"
  25904. "mul r9, r8, r9\n\t"
  25905. "add r6, r6, r9\n\t"
  25906. "lsl r9, r12, #16\n\t"
  25907. "lsr r9, r9, #16\n\t"
  25908. "mul r8, r9, r8\n\t"
  25909. "lsr r9, r8, #16\n\t"
  25910. "lsl r8, r8, #16\n\t"
  25911. "adds r5, r5, r8\n\t"
  25912. "adc r6, r6, r9\n\t"
  25913. #else
  25914. "umull r5, r6, r10, r12\n\t"
  25915. #endif
  25916. "mov r3, #0\n\t"
  25917. "mov r7, #0\n\t"
  25918. /* A[1] * A[10] */
  25919. "ldr r10, [%[a], #40]\n\t"
  25920. "ldr r12, [%[a], #4]\n\t"
  25921. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25922. "lsl r8, r10, #16\n\t"
  25923. "lsl r9, r12, #16\n\t"
  25924. "lsr r8, r8, #16\n\t"
  25925. "lsr r9, r9, #16\n\t"
  25926. "mul r9, r8, r9\n\t"
  25927. "adds r5, r5, r9\n\t"
  25928. "adcs r6, r6, #0\n\t"
  25929. "adc r7, r7, #0\n\t"
  25930. "lsr r9, r12, #16\n\t"
  25931. "mul r8, r9, r8\n\t"
  25932. "lsr r9, r8, #16\n\t"
  25933. "lsl r8, r8, #16\n\t"
  25934. "adds r5, r5, r8\n\t"
  25935. "adcs r6, r6, r9\n\t"
  25936. "adc r7, r7, #0\n\t"
  25937. "lsr r8, r10, #16\n\t"
  25938. "lsr r9, r12, #16\n\t"
  25939. "mul r9, r8, r9\n\t"
  25940. "adds r6, r6, r9\n\t"
  25941. "adc r7, r7, #0\n\t"
  25942. "lsl r9, r12, #16\n\t"
  25943. "lsr r9, r9, #16\n\t"
  25944. "mul r8, r9, r8\n\t"
  25945. "lsr r9, r8, #16\n\t"
  25946. "lsl r8, r8, #16\n\t"
  25947. "adds r5, r5, r8\n\t"
  25948. "adcs r6, r6, r9\n\t"
  25949. "adc r7, r7, #0\n\t"
  25950. #else
  25951. "umull r8, r9, r10, r12\n\t"
  25952. "adds r5, r5, r8\n\t"
  25953. "adcs r6, r6, r9\n\t"
  25954. "adc r7, r7, #0\n\t"
  25955. #endif
  25956. /* A[2] * A[9] */
  25957. "ldr r10, [%[a], #36]\n\t"
  25958. "ldr r12, [%[a], #8]\n\t"
  25959. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25960. "lsl r8, r10, #16\n\t"
  25961. "lsl r9, r12, #16\n\t"
  25962. "lsr r8, r8, #16\n\t"
  25963. "lsr r9, r9, #16\n\t"
  25964. "mul r9, r8, r9\n\t"
  25965. "adds r5, r5, r9\n\t"
  25966. "adcs r6, r6, #0\n\t"
  25967. "adc r7, r7, #0\n\t"
  25968. "lsr r9, r12, #16\n\t"
  25969. "mul r8, r9, r8\n\t"
  25970. "lsr r9, r8, #16\n\t"
  25971. "lsl r8, r8, #16\n\t"
  25972. "adds r5, r5, r8\n\t"
  25973. "adcs r6, r6, r9\n\t"
  25974. "adc r7, r7, #0\n\t"
  25975. "lsr r8, r10, #16\n\t"
  25976. "lsr r9, r12, #16\n\t"
  25977. "mul r9, r8, r9\n\t"
  25978. "adds r6, r6, r9\n\t"
  25979. "adc r7, r7, #0\n\t"
  25980. "lsl r9, r12, #16\n\t"
  25981. "lsr r9, r9, #16\n\t"
  25982. "mul r8, r9, r8\n\t"
  25983. "lsr r9, r8, #16\n\t"
  25984. "lsl r8, r8, #16\n\t"
  25985. "adds r5, r5, r8\n\t"
  25986. "adcs r6, r6, r9\n\t"
  25987. "adc r7, r7, #0\n\t"
  25988. #else
  25989. "umull r8, r9, r10, r12\n\t"
  25990. "adds r5, r5, r8\n\t"
  25991. "adcs r6, r6, r9\n\t"
  25992. "adc r7, r7, #0\n\t"
  25993. #endif
  25994. /* A[3] * A[8] */
  25995. "ldr r10, [%[a], #32]\n\t"
  25996. "ldr r12, [%[a], #12]\n\t"
  25997. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  25998. "lsl r8, r10, #16\n\t"
  25999. "lsl r9, r12, #16\n\t"
  26000. "lsr r8, r8, #16\n\t"
  26001. "lsr r9, r9, #16\n\t"
  26002. "mul r9, r8, r9\n\t"
  26003. "adds r5, r5, r9\n\t"
  26004. "adcs r6, r6, #0\n\t"
  26005. "adc r7, r7, #0\n\t"
  26006. "lsr r9, r12, #16\n\t"
  26007. "mul r8, r9, r8\n\t"
  26008. "lsr r9, r8, #16\n\t"
  26009. "lsl r8, r8, #16\n\t"
  26010. "adds r5, r5, r8\n\t"
  26011. "adcs r6, r6, r9\n\t"
  26012. "adc r7, r7, #0\n\t"
  26013. "lsr r8, r10, #16\n\t"
  26014. "lsr r9, r12, #16\n\t"
  26015. "mul r9, r8, r9\n\t"
  26016. "adds r6, r6, r9\n\t"
  26017. "adc r7, r7, #0\n\t"
  26018. "lsl r9, r12, #16\n\t"
  26019. "lsr r9, r9, #16\n\t"
  26020. "mul r8, r9, r8\n\t"
  26021. "lsr r9, r8, #16\n\t"
  26022. "lsl r8, r8, #16\n\t"
  26023. "adds r5, r5, r8\n\t"
  26024. "adcs r6, r6, r9\n\t"
  26025. "adc r7, r7, #0\n\t"
  26026. #else
  26027. "umull r8, r9, r10, r12\n\t"
  26028. "adds r5, r5, r8\n\t"
  26029. "adcs r6, r6, r9\n\t"
  26030. "adc r7, r7, #0\n\t"
  26031. #endif
  26032. /* A[4] * A[7] */
  26033. "ldr r10, [%[a], #28]\n\t"
  26034. "ldr r12, [%[a], #16]\n\t"
  26035. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26036. "lsl r8, r10, #16\n\t"
  26037. "lsl r9, r12, #16\n\t"
  26038. "lsr r8, r8, #16\n\t"
  26039. "lsr r9, r9, #16\n\t"
  26040. "mul r9, r8, r9\n\t"
  26041. "adds r5, r5, r9\n\t"
  26042. "adcs r6, r6, #0\n\t"
  26043. "adc r7, r7, #0\n\t"
  26044. "lsr r9, r12, #16\n\t"
  26045. "mul r8, r9, r8\n\t"
  26046. "lsr r9, r8, #16\n\t"
  26047. "lsl r8, r8, #16\n\t"
  26048. "adds r5, r5, r8\n\t"
  26049. "adcs r6, r6, r9\n\t"
  26050. "adc r7, r7, #0\n\t"
  26051. "lsr r8, r10, #16\n\t"
  26052. "lsr r9, r12, #16\n\t"
  26053. "mul r9, r8, r9\n\t"
  26054. "adds r6, r6, r9\n\t"
  26055. "adc r7, r7, #0\n\t"
  26056. "lsl r9, r12, #16\n\t"
  26057. "lsr r9, r9, #16\n\t"
  26058. "mul r8, r9, r8\n\t"
  26059. "lsr r9, r8, #16\n\t"
  26060. "lsl r8, r8, #16\n\t"
  26061. "adds r5, r5, r8\n\t"
  26062. "adcs r6, r6, r9\n\t"
  26063. "adc r7, r7, #0\n\t"
  26064. #else
  26065. "umull r8, r9, r10, r12\n\t"
  26066. "adds r5, r5, r8\n\t"
  26067. "adcs r6, r6, r9\n\t"
  26068. "adc r7, r7, #0\n\t"
  26069. #endif
  26070. /* A[5] * A[6] */
  26071. "ldr r10, [%[a], #24]\n\t"
  26072. "ldr r12, [%[a], #20]\n\t"
  26073. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26074. "lsl r8, r10, #16\n\t"
  26075. "lsl r9, r12, #16\n\t"
  26076. "lsr r8, r8, #16\n\t"
  26077. "lsr r9, r9, #16\n\t"
  26078. "mul r9, r8, r9\n\t"
  26079. "adds r5, r5, r9\n\t"
  26080. "adcs r6, r6, #0\n\t"
  26081. "adc r7, r7, #0\n\t"
  26082. "lsr r9, r12, #16\n\t"
  26083. "mul r8, r9, r8\n\t"
  26084. "lsr r9, r8, #16\n\t"
  26085. "lsl r8, r8, #16\n\t"
  26086. "adds r5, r5, r8\n\t"
  26087. "adcs r6, r6, r9\n\t"
  26088. "adc r7, r7, #0\n\t"
  26089. "lsr r8, r10, #16\n\t"
  26090. "lsr r9, r12, #16\n\t"
  26091. "mul r9, r8, r9\n\t"
  26092. "adds r6, r6, r9\n\t"
  26093. "adc r7, r7, #0\n\t"
  26094. "lsl r9, r12, #16\n\t"
  26095. "lsr r9, r9, #16\n\t"
  26096. "mul r8, r9, r8\n\t"
  26097. "lsr r9, r8, #16\n\t"
  26098. "lsl r8, r8, #16\n\t"
  26099. "adds r5, r5, r8\n\t"
  26100. "adcs r6, r6, r9\n\t"
  26101. "adc r7, r7, #0\n\t"
  26102. #else
  26103. "umull r8, r9, r10, r12\n\t"
  26104. "adds r5, r5, r8\n\t"
  26105. "adcs r6, r6, r9\n\t"
  26106. "adc r7, r7, #0\n\t"
  26107. #endif
  26108. "adds r5, r5, r5\n\t"
  26109. "adcs r6, r6, r6\n\t"
  26110. "adc r7, r7, r7\n\t"
  26111. "adds r4, r4, r5\n\t"
  26112. "adcs r2, r2, r6\n\t"
  26113. "adc r3, r3, r7\n\t"
  26114. "str r4, [sp, #44]\n\t"
  26115. /* A[1] * A[11] */
  26116. "ldr r10, [%[a], #44]\n\t"
  26117. "ldr r12, [%[a], #4]\n\t"
  26118. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26119. "lsl r8, r10, #16\n\t"
  26120. "lsl r5, r12, #16\n\t"
  26121. "lsr r8, r8, #16\n\t"
  26122. "lsr r5, r5, #16\n\t"
  26123. "mul r5, r8, r5\n\t"
  26124. "lsr r9, r12, #16\n\t"
  26125. "mul r8, r9, r8\n\t"
  26126. "lsr r6, r8, #16\n\t"
  26127. "lsl r8, r8, #16\n\t"
  26128. "adds r5, r5, r8\n\t"
  26129. "adc r6, r6, #0\n\t"
  26130. "lsr r8, r10, #16\n\t"
  26131. "mul r9, r8, r9\n\t"
  26132. "add r6, r6, r9\n\t"
  26133. "lsl r9, r12, #16\n\t"
  26134. "lsr r9, r9, #16\n\t"
  26135. "mul r8, r9, r8\n\t"
  26136. "lsr r9, r8, #16\n\t"
  26137. "lsl r8, r8, #16\n\t"
  26138. "adds r5, r5, r8\n\t"
  26139. "adc r6, r6, r9\n\t"
  26140. #else
  26141. "umull r5, r6, r10, r12\n\t"
  26142. #endif
  26143. "mov r4, #0\n\t"
  26144. "mov r7, #0\n\t"
  26145. /* A[2] * A[10] */
  26146. "ldr r10, [%[a], #40]\n\t"
  26147. "ldr r12, [%[a], #8]\n\t"
  26148. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26149. "lsl r8, r10, #16\n\t"
  26150. "lsl r9, r12, #16\n\t"
  26151. "lsr r8, r8, #16\n\t"
  26152. "lsr r9, r9, #16\n\t"
  26153. "mul r9, r8, r9\n\t"
  26154. "adds r5, r5, r9\n\t"
  26155. "adcs r6, r6, #0\n\t"
  26156. "adc r7, r7, #0\n\t"
  26157. "lsr r9, r12, #16\n\t"
  26158. "mul r8, r9, r8\n\t"
  26159. "lsr r9, r8, #16\n\t"
  26160. "lsl r8, r8, #16\n\t"
  26161. "adds r5, r5, r8\n\t"
  26162. "adcs r6, r6, r9\n\t"
  26163. "adc r7, r7, #0\n\t"
  26164. "lsr r8, r10, #16\n\t"
  26165. "lsr r9, r12, #16\n\t"
  26166. "mul r9, r8, r9\n\t"
  26167. "adds r6, r6, r9\n\t"
  26168. "adc r7, r7, #0\n\t"
  26169. "lsl r9, r12, #16\n\t"
  26170. "lsr r9, r9, #16\n\t"
  26171. "mul r8, r9, r8\n\t"
  26172. "lsr r9, r8, #16\n\t"
  26173. "lsl r8, r8, #16\n\t"
  26174. "adds r5, r5, r8\n\t"
  26175. "adcs r6, r6, r9\n\t"
  26176. "adc r7, r7, #0\n\t"
  26177. #else
  26178. "umull r8, r9, r10, r12\n\t"
  26179. "adds r5, r5, r8\n\t"
  26180. "adcs r6, r6, r9\n\t"
  26181. "adc r7, r7, #0\n\t"
  26182. #endif
  26183. /* A[3] * A[9] */
  26184. "ldr r10, [%[a], #36]\n\t"
  26185. "ldr r12, [%[a], #12]\n\t"
  26186. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26187. "lsl r8, r10, #16\n\t"
  26188. "lsl r9, r12, #16\n\t"
  26189. "lsr r8, r8, #16\n\t"
  26190. "lsr r9, r9, #16\n\t"
  26191. "mul r9, r8, r9\n\t"
  26192. "adds r5, r5, r9\n\t"
  26193. "adcs r6, r6, #0\n\t"
  26194. "adc r7, r7, #0\n\t"
  26195. "lsr r9, r12, #16\n\t"
  26196. "mul r8, r9, r8\n\t"
  26197. "lsr r9, r8, #16\n\t"
  26198. "lsl r8, r8, #16\n\t"
  26199. "adds r5, r5, r8\n\t"
  26200. "adcs r6, r6, r9\n\t"
  26201. "adc r7, r7, #0\n\t"
  26202. "lsr r8, r10, #16\n\t"
  26203. "lsr r9, r12, #16\n\t"
  26204. "mul r9, r8, r9\n\t"
  26205. "adds r6, r6, r9\n\t"
  26206. "adc r7, r7, #0\n\t"
  26207. "lsl r9, r12, #16\n\t"
  26208. "lsr r9, r9, #16\n\t"
  26209. "mul r8, r9, r8\n\t"
  26210. "lsr r9, r8, #16\n\t"
  26211. "lsl r8, r8, #16\n\t"
  26212. "adds r5, r5, r8\n\t"
  26213. "adcs r6, r6, r9\n\t"
  26214. "adc r7, r7, #0\n\t"
  26215. #else
  26216. "umull r8, r9, r10, r12\n\t"
  26217. "adds r5, r5, r8\n\t"
  26218. "adcs r6, r6, r9\n\t"
  26219. "adc r7, r7, #0\n\t"
  26220. #endif
  26221. /* A[4] * A[8] */
  26222. "ldr r10, [%[a], #32]\n\t"
  26223. "ldr r12, [%[a], #16]\n\t"
  26224. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26225. "lsl r8, r10, #16\n\t"
  26226. "lsl r9, r12, #16\n\t"
  26227. "lsr r8, r8, #16\n\t"
  26228. "lsr r9, r9, #16\n\t"
  26229. "mul r9, r8, r9\n\t"
  26230. "adds r5, r5, r9\n\t"
  26231. "adcs r6, r6, #0\n\t"
  26232. "adc r7, r7, #0\n\t"
  26233. "lsr r9, r12, #16\n\t"
  26234. "mul r8, r9, r8\n\t"
  26235. "lsr r9, r8, #16\n\t"
  26236. "lsl r8, r8, #16\n\t"
  26237. "adds r5, r5, r8\n\t"
  26238. "adcs r6, r6, r9\n\t"
  26239. "adc r7, r7, #0\n\t"
  26240. "lsr r8, r10, #16\n\t"
  26241. "lsr r9, r12, #16\n\t"
  26242. "mul r9, r8, r9\n\t"
  26243. "adds r6, r6, r9\n\t"
  26244. "adc r7, r7, #0\n\t"
  26245. "lsl r9, r12, #16\n\t"
  26246. "lsr r9, r9, #16\n\t"
  26247. "mul r8, r9, r8\n\t"
  26248. "lsr r9, r8, #16\n\t"
  26249. "lsl r8, r8, #16\n\t"
  26250. "adds r5, r5, r8\n\t"
  26251. "adcs r6, r6, r9\n\t"
  26252. "adc r7, r7, #0\n\t"
  26253. #else
  26254. "umull r8, r9, r10, r12\n\t"
  26255. "adds r5, r5, r8\n\t"
  26256. "adcs r6, r6, r9\n\t"
  26257. "adc r7, r7, #0\n\t"
  26258. #endif
  26259. /* A[5] * A[7] */
  26260. "ldr r10, [%[a], #28]\n\t"
  26261. "ldr r12, [%[a], #20]\n\t"
  26262. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26263. "lsl r8, r10, #16\n\t"
  26264. "lsl r9, r12, #16\n\t"
  26265. "lsr r8, r8, #16\n\t"
  26266. "lsr r9, r9, #16\n\t"
  26267. "mul r9, r8, r9\n\t"
  26268. "adds r5, r5, r9\n\t"
  26269. "adcs r6, r6, #0\n\t"
  26270. "adc r7, r7, #0\n\t"
  26271. "lsr r9, r12, #16\n\t"
  26272. "mul r8, r9, r8\n\t"
  26273. "lsr r9, r8, #16\n\t"
  26274. "lsl r8, r8, #16\n\t"
  26275. "adds r5, r5, r8\n\t"
  26276. "adcs r6, r6, r9\n\t"
  26277. "adc r7, r7, #0\n\t"
  26278. "lsr r8, r10, #16\n\t"
  26279. "lsr r9, r12, #16\n\t"
  26280. "mul r9, r8, r9\n\t"
  26281. "adds r6, r6, r9\n\t"
  26282. "adc r7, r7, #0\n\t"
  26283. "lsl r9, r12, #16\n\t"
  26284. "lsr r9, r9, #16\n\t"
  26285. "mul r8, r9, r8\n\t"
  26286. "lsr r9, r8, #16\n\t"
  26287. "lsl r8, r8, #16\n\t"
  26288. "adds r5, r5, r8\n\t"
  26289. "adcs r6, r6, r9\n\t"
  26290. "adc r7, r7, #0\n\t"
  26291. #else
  26292. "umull r8, r9, r10, r12\n\t"
  26293. "adds r5, r5, r8\n\t"
  26294. "adcs r6, r6, r9\n\t"
  26295. "adc r7, r7, #0\n\t"
  26296. #endif
  26297. /* A[6] * A[6] */
  26298. "ldr r10, [%[a], #24]\n\t"
  26299. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26300. "lsl r8, r10, #16\n\t"
  26301. "lsr r9, r10, #16\n\t"
  26302. "lsr r8, r8, #16\n\t"
  26303. "mov r12, r8\n\t"
  26304. "mul r8, r12, r8\n\t"
  26305. "mov r12, r9\n\t"
  26306. "mul r9, r12, r9\n\t"
  26307. "adds r2, r2, r8\n\t"
  26308. "adcs r3, r3, r9\n\t"
  26309. "adc r4, r4, #0\n\t"
  26310. "lsr r9, r10, #16\n\t"
  26311. "lsl r8, r10, #16\n\t"
  26312. "lsr r8, r8, #16\n\t"
  26313. "mul r8, r9, r8\n\t"
  26314. "lsr r9, r8, #15\n\t"
  26315. "lsl r8, r8, #17\n\t"
  26316. "adds r2, r2, r8\n\t"
  26317. "adcs r3, r3, r9\n\t"
  26318. "adc r4, r4, #0\n\t"
  26319. "adds r5, r5, r5\n\t"
  26320. "adcs r6, r6, r6\n\t"
  26321. "adc r7, r7, r7\n\t"
  26322. #else
  26323. "umull r8, r9, r10, r10\n\t"
  26324. "adds r5, r5, r5\n\t"
  26325. "adcs r6, r6, r6\n\t"
  26326. "adc r7, r7, r7\n\t"
  26327. "adds r2, r2, r8\n\t"
  26328. "adcs r3, r3, r9\n\t"
  26329. "adc r4, r4, #0\n\t"
  26330. #endif
  26331. "adds r2, r2, r5\n\t"
  26332. "adcs r3, r3, r6\n\t"
  26333. "adc r4, r4, r7\n\t"
  26334. "str r2, [%[r], #48]\n\t"
  26335. /* A[2] * A[11] */
  26336. "ldr r10, [%[a], #44]\n\t"
  26337. "ldr r12, [%[a], #8]\n\t"
  26338. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26339. "lsl r8, r10, #16\n\t"
  26340. "lsl r5, r12, #16\n\t"
  26341. "lsr r8, r8, #16\n\t"
  26342. "lsr r5, r5, #16\n\t"
  26343. "mul r5, r8, r5\n\t"
  26344. "lsr r9, r12, #16\n\t"
  26345. "mul r8, r9, r8\n\t"
  26346. "lsr r6, r8, #16\n\t"
  26347. "lsl r8, r8, #16\n\t"
  26348. "adds r5, r5, r8\n\t"
  26349. "adc r6, r6, #0\n\t"
  26350. "lsr r8, r10, #16\n\t"
  26351. "mul r9, r8, r9\n\t"
  26352. "add r6, r6, r9\n\t"
  26353. "lsl r9, r12, #16\n\t"
  26354. "lsr r9, r9, #16\n\t"
  26355. "mul r8, r9, r8\n\t"
  26356. "lsr r9, r8, #16\n\t"
  26357. "lsl r8, r8, #16\n\t"
  26358. "adds r5, r5, r8\n\t"
  26359. "adc r6, r6, r9\n\t"
  26360. #else
  26361. "umull r5, r6, r10, r12\n\t"
  26362. #endif
  26363. "mov r2, #0\n\t"
  26364. "mov r7, #0\n\t"
  26365. /* A[3] * A[10] */
  26366. "ldr r10, [%[a], #40]\n\t"
  26367. "ldr r12, [%[a], #12]\n\t"
  26368. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26369. "lsl r8, r10, #16\n\t"
  26370. "lsl r9, r12, #16\n\t"
  26371. "lsr r8, r8, #16\n\t"
  26372. "lsr r9, r9, #16\n\t"
  26373. "mul r9, r8, r9\n\t"
  26374. "adds r5, r5, r9\n\t"
  26375. "adcs r6, r6, #0\n\t"
  26376. "adc r7, r7, #0\n\t"
  26377. "lsr r9, r12, #16\n\t"
  26378. "mul r8, r9, r8\n\t"
  26379. "lsr r9, r8, #16\n\t"
  26380. "lsl r8, r8, #16\n\t"
  26381. "adds r5, r5, r8\n\t"
  26382. "adcs r6, r6, r9\n\t"
  26383. "adc r7, r7, #0\n\t"
  26384. "lsr r8, r10, #16\n\t"
  26385. "lsr r9, r12, #16\n\t"
  26386. "mul r9, r8, r9\n\t"
  26387. "adds r6, r6, r9\n\t"
  26388. "adc r7, r7, #0\n\t"
  26389. "lsl r9, r12, #16\n\t"
  26390. "lsr r9, r9, #16\n\t"
  26391. "mul r8, r9, r8\n\t"
  26392. "lsr r9, r8, #16\n\t"
  26393. "lsl r8, r8, #16\n\t"
  26394. "adds r5, r5, r8\n\t"
  26395. "adcs r6, r6, r9\n\t"
  26396. "adc r7, r7, #0\n\t"
  26397. #else
  26398. "umull r8, r9, r10, r12\n\t"
  26399. "adds r5, r5, r8\n\t"
  26400. "adcs r6, r6, r9\n\t"
  26401. "adc r7, r7, #0\n\t"
  26402. #endif
  26403. /* A[4] * A[9] */
  26404. "ldr r10, [%[a], #36]\n\t"
  26405. "ldr r12, [%[a], #16]\n\t"
  26406. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26407. "lsl r8, r10, #16\n\t"
  26408. "lsl r9, r12, #16\n\t"
  26409. "lsr r8, r8, #16\n\t"
  26410. "lsr r9, r9, #16\n\t"
  26411. "mul r9, r8, r9\n\t"
  26412. "adds r5, r5, r9\n\t"
  26413. "adcs r6, r6, #0\n\t"
  26414. "adc r7, r7, #0\n\t"
  26415. "lsr r9, r12, #16\n\t"
  26416. "mul r8, r9, r8\n\t"
  26417. "lsr r9, r8, #16\n\t"
  26418. "lsl r8, r8, #16\n\t"
  26419. "adds r5, r5, r8\n\t"
  26420. "adcs r6, r6, r9\n\t"
  26421. "adc r7, r7, #0\n\t"
  26422. "lsr r8, r10, #16\n\t"
  26423. "lsr r9, r12, #16\n\t"
  26424. "mul r9, r8, r9\n\t"
  26425. "adds r6, r6, r9\n\t"
  26426. "adc r7, r7, #0\n\t"
  26427. "lsl r9, r12, #16\n\t"
  26428. "lsr r9, r9, #16\n\t"
  26429. "mul r8, r9, r8\n\t"
  26430. "lsr r9, r8, #16\n\t"
  26431. "lsl r8, r8, #16\n\t"
  26432. "adds r5, r5, r8\n\t"
  26433. "adcs r6, r6, r9\n\t"
  26434. "adc r7, r7, #0\n\t"
  26435. #else
  26436. "umull r8, r9, r10, r12\n\t"
  26437. "adds r5, r5, r8\n\t"
  26438. "adcs r6, r6, r9\n\t"
  26439. "adc r7, r7, #0\n\t"
  26440. #endif
  26441. /* A[5] * A[8] */
  26442. "ldr r10, [%[a], #32]\n\t"
  26443. "ldr r12, [%[a], #20]\n\t"
  26444. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26445. "lsl r8, r10, #16\n\t"
  26446. "lsl r9, r12, #16\n\t"
  26447. "lsr r8, r8, #16\n\t"
  26448. "lsr r9, r9, #16\n\t"
  26449. "mul r9, r8, r9\n\t"
  26450. "adds r5, r5, r9\n\t"
  26451. "adcs r6, r6, #0\n\t"
  26452. "adc r7, r7, #0\n\t"
  26453. "lsr r9, r12, #16\n\t"
  26454. "mul r8, r9, r8\n\t"
  26455. "lsr r9, r8, #16\n\t"
  26456. "lsl r8, r8, #16\n\t"
  26457. "adds r5, r5, r8\n\t"
  26458. "adcs r6, r6, r9\n\t"
  26459. "adc r7, r7, #0\n\t"
  26460. "lsr r8, r10, #16\n\t"
  26461. "lsr r9, r12, #16\n\t"
  26462. "mul r9, r8, r9\n\t"
  26463. "adds r6, r6, r9\n\t"
  26464. "adc r7, r7, #0\n\t"
  26465. "lsl r9, r12, #16\n\t"
  26466. "lsr r9, r9, #16\n\t"
  26467. "mul r8, r9, r8\n\t"
  26468. "lsr r9, r8, #16\n\t"
  26469. "lsl r8, r8, #16\n\t"
  26470. "adds r5, r5, r8\n\t"
  26471. "adcs r6, r6, r9\n\t"
  26472. "adc r7, r7, #0\n\t"
  26473. #else
  26474. "umull r8, r9, r10, r12\n\t"
  26475. "adds r5, r5, r8\n\t"
  26476. "adcs r6, r6, r9\n\t"
  26477. "adc r7, r7, #0\n\t"
  26478. #endif
  26479. /* A[6] * A[7] */
  26480. "ldr r10, [%[a], #28]\n\t"
  26481. "ldr r12, [%[a], #24]\n\t"
  26482. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26483. "lsl r8, r10, #16\n\t"
  26484. "lsl r9, r12, #16\n\t"
  26485. "lsr r8, r8, #16\n\t"
  26486. "lsr r9, r9, #16\n\t"
  26487. "mul r9, r8, r9\n\t"
  26488. "adds r5, r5, r9\n\t"
  26489. "adcs r6, r6, #0\n\t"
  26490. "adc r7, r7, #0\n\t"
  26491. "lsr r9, r12, #16\n\t"
  26492. "mul r8, r9, r8\n\t"
  26493. "lsr r9, r8, #16\n\t"
  26494. "lsl r8, r8, #16\n\t"
  26495. "adds r5, r5, r8\n\t"
  26496. "adcs r6, r6, r9\n\t"
  26497. "adc r7, r7, #0\n\t"
  26498. "lsr r8, r10, #16\n\t"
  26499. "lsr r9, r12, #16\n\t"
  26500. "mul r9, r8, r9\n\t"
  26501. "adds r6, r6, r9\n\t"
  26502. "adc r7, r7, #0\n\t"
  26503. "lsl r9, r12, #16\n\t"
  26504. "lsr r9, r9, #16\n\t"
  26505. "mul r8, r9, r8\n\t"
  26506. "lsr r9, r8, #16\n\t"
  26507. "lsl r8, r8, #16\n\t"
  26508. "adds r5, r5, r8\n\t"
  26509. "adcs r6, r6, r9\n\t"
  26510. "adc r7, r7, #0\n\t"
  26511. #else
  26512. "umull r8, r9, r10, r12\n\t"
  26513. "adds r5, r5, r8\n\t"
  26514. "adcs r6, r6, r9\n\t"
  26515. "adc r7, r7, #0\n\t"
  26516. #endif
  26517. "adds r5, r5, r5\n\t"
  26518. "adcs r6, r6, r6\n\t"
  26519. "adc r7, r7, r7\n\t"
  26520. "adds r3, r3, r5\n\t"
  26521. "adcs r4, r4, r6\n\t"
  26522. "adc r2, r2, r7\n\t"
  26523. "str r3, [%[r], #52]\n\t"
  26524. /* A[3] * A[11] */
  26525. "ldr r10, [%[a], #44]\n\t"
  26526. "ldr r12, [%[a], #12]\n\t"
  26527. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26528. "lsl r8, r10, #16\n\t"
  26529. "lsl r5, r12, #16\n\t"
  26530. "lsr r8, r8, #16\n\t"
  26531. "lsr r5, r5, #16\n\t"
  26532. "mul r5, r8, r5\n\t"
  26533. "lsr r9, r12, #16\n\t"
  26534. "mul r8, r9, r8\n\t"
  26535. "lsr r6, r8, #16\n\t"
  26536. "lsl r8, r8, #16\n\t"
  26537. "adds r5, r5, r8\n\t"
  26538. "adc r6, r6, #0\n\t"
  26539. "lsr r8, r10, #16\n\t"
  26540. "mul r9, r8, r9\n\t"
  26541. "add r6, r6, r9\n\t"
  26542. "lsl r9, r12, #16\n\t"
  26543. "lsr r9, r9, #16\n\t"
  26544. "mul r8, r9, r8\n\t"
  26545. "lsr r9, r8, #16\n\t"
  26546. "lsl r8, r8, #16\n\t"
  26547. "adds r5, r5, r8\n\t"
  26548. "adc r6, r6, r9\n\t"
  26549. #else
  26550. "umull r5, r6, r10, r12\n\t"
  26551. #endif
  26552. "mov r3, #0\n\t"
  26553. "mov r7, #0\n\t"
  26554. /* A[4] * A[10] */
  26555. "ldr r10, [%[a], #40]\n\t"
  26556. "ldr r12, [%[a], #16]\n\t"
  26557. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26558. "lsl r8, r10, #16\n\t"
  26559. "lsl r9, r12, #16\n\t"
  26560. "lsr r8, r8, #16\n\t"
  26561. "lsr r9, r9, #16\n\t"
  26562. "mul r9, r8, r9\n\t"
  26563. "adds r5, r5, r9\n\t"
  26564. "adcs r6, r6, #0\n\t"
  26565. "adc r7, r7, #0\n\t"
  26566. "lsr r9, r12, #16\n\t"
  26567. "mul r8, r9, r8\n\t"
  26568. "lsr r9, r8, #16\n\t"
  26569. "lsl r8, r8, #16\n\t"
  26570. "adds r5, r5, r8\n\t"
  26571. "adcs r6, r6, r9\n\t"
  26572. "adc r7, r7, #0\n\t"
  26573. "lsr r8, r10, #16\n\t"
  26574. "lsr r9, r12, #16\n\t"
  26575. "mul r9, r8, r9\n\t"
  26576. "adds r6, r6, r9\n\t"
  26577. "adc r7, r7, #0\n\t"
  26578. "lsl r9, r12, #16\n\t"
  26579. "lsr r9, r9, #16\n\t"
  26580. "mul r8, r9, r8\n\t"
  26581. "lsr r9, r8, #16\n\t"
  26582. "lsl r8, r8, #16\n\t"
  26583. "adds r5, r5, r8\n\t"
  26584. "adcs r6, r6, r9\n\t"
  26585. "adc r7, r7, #0\n\t"
  26586. #else
  26587. "umull r8, r9, r10, r12\n\t"
  26588. "adds r5, r5, r8\n\t"
  26589. "adcs r6, r6, r9\n\t"
  26590. "adc r7, r7, #0\n\t"
  26591. #endif
  26592. /* A[5] * A[9] */
  26593. "ldr r10, [%[a], #36]\n\t"
  26594. "ldr r12, [%[a], #20]\n\t"
  26595. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26596. "lsl r8, r10, #16\n\t"
  26597. "lsl r9, r12, #16\n\t"
  26598. "lsr r8, r8, #16\n\t"
  26599. "lsr r9, r9, #16\n\t"
  26600. "mul r9, r8, r9\n\t"
  26601. "adds r5, r5, r9\n\t"
  26602. "adcs r6, r6, #0\n\t"
  26603. "adc r7, r7, #0\n\t"
  26604. "lsr r9, r12, #16\n\t"
  26605. "mul r8, r9, r8\n\t"
  26606. "lsr r9, r8, #16\n\t"
  26607. "lsl r8, r8, #16\n\t"
  26608. "adds r5, r5, r8\n\t"
  26609. "adcs r6, r6, r9\n\t"
  26610. "adc r7, r7, #0\n\t"
  26611. "lsr r8, r10, #16\n\t"
  26612. "lsr r9, r12, #16\n\t"
  26613. "mul r9, r8, r9\n\t"
  26614. "adds r6, r6, r9\n\t"
  26615. "adc r7, r7, #0\n\t"
  26616. "lsl r9, r12, #16\n\t"
  26617. "lsr r9, r9, #16\n\t"
  26618. "mul r8, r9, r8\n\t"
  26619. "lsr r9, r8, #16\n\t"
  26620. "lsl r8, r8, #16\n\t"
  26621. "adds r5, r5, r8\n\t"
  26622. "adcs r6, r6, r9\n\t"
  26623. "adc r7, r7, #0\n\t"
  26624. #else
  26625. "umull r8, r9, r10, r12\n\t"
  26626. "adds r5, r5, r8\n\t"
  26627. "adcs r6, r6, r9\n\t"
  26628. "adc r7, r7, #0\n\t"
  26629. #endif
  26630. /* A[6] * A[8] */
  26631. "ldr r10, [%[a], #32]\n\t"
  26632. "ldr r12, [%[a], #24]\n\t"
  26633. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26634. "lsl r8, r10, #16\n\t"
  26635. "lsl r9, r12, #16\n\t"
  26636. "lsr r8, r8, #16\n\t"
  26637. "lsr r9, r9, #16\n\t"
  26638. "mul r9, r8, r9\n\t"
  26639. "adds r5, r5, r9\n\t"
  26640. "adcs r6, r6, #0\n\t"
  26641. "adc r7, r7, #0\n\t"
  26642. "lsr r9, r12, #16\n\t"
  26643. "mul r8, r9, r8\n\t"
  26644. "lsr r9, r8, #16\n\t"
  26645. "lsl r8, r8, #16\n\t"
  26646. "adds r5, r5, r8\n\t"
  26647. "adcs r6, r6, r9\n\t"
  26648. "adc r7, r7, #0\n\t"
  26649. "lsr r8, r10, #16\n\t"
  26650. "lsr r9, r12, #16\n\t"
  26651. "mul r9, r8, r9\n\t"
  26652. "adds r6, r6, r9\n\t"
  26653. "adc r7, r7, #0\n\t"
  26654. "lsl r9, r12, #16\n\t"
  26655. "lsr r9, r9, #16\n\t"
  26656. "mul r8, r9, r8\n\t"
  26657. "lsr r9, r8, #16\n\t"
  26658. "lsl r8, r8, #16\n\t"
  26659. "adds r5, r5, r8\n\t"
  26660. "adcs r6, r6, r9\n\t"
  26661. "adc r7, r7, #0\n\t"
  26662. #else
  26663. "umull r8, r9, r10, r12\n\t"
  26664. "adds r5, r5, r8\n\t"
  26665. "adcs r6, r6, r9\n\t"
  26666. "adc r7, r7, #0\n\t"
  26667. #endif
  26668. /* A[7] * A[7] */
  26669. "ldr r10, [%[a], #28]\n\t"
  26670. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26671. "lsl r8, r10, #16\n\t"
  26672. "lsr r9, r10, #16\n\t"
  26673. "lsr r8, r8, #16\n\t"
  26674. "mov r12, r8\n\t"
  26675. "mul r8, r12, r8\n\t"
  26676. "mov r12, r9\n\t"
  26677. "mul r9, r12, r9\n\t"
  26678. "adds r4, r4, r8\n\t"
  26679. "adcs r2, r2, r9\n\t"
  26680. "adc r3, r3, #0\n\t"
  26681. "lsr r9, r10, #16\n\t"
  26682. "lsl r8, r10, #16\n\t"
  26683. "lsr r8, r8, #16\n\t"
  26684. "mul r8, r9, r8\n\t"
  26685. "lsr r9, r8, #15\n\t"
  26686. "lsl r8, r8, #17\n\t"
  26687. "adds r4, r4, r8\n\t"
  26688. "adcs r2, r2, r9\n\t"
  26689. "adc r3, r3, #0\n\t"
  26690. "adds r5, r5, r5\n\t"
  26691. "adcs r6, r6, r6\n\t"
  26692. "adc r7, r7, r7\n\t"
  26693. #else
  26694. "umull r8, r9, r10, r10\n\t"
  26695. "adds r5, r5, r5\n\t"
  26696. "adcs r6, r6, r6\n\t"
  26697. "adc r7, r7, r7\n\t"
  26698. "adds r4, r4, r8\n\t"
  26699. "adcs r2, r2, r9\n\t"
  26700. "adc r3, r3, #0\n\t"
  26701. #endif
  26702. "adds r4, r4, r5\n\t"
  26703. "adcs r2, r2, r6\n\t"
  26704. "adc r3, r3, r7\n\t"
  26705. "str r4, [%[r], #56]\n\t"
  26706. /* A[4] * A[11] */
  26707. "ldr r10, [%[a], #44]\n\t"
  26708. "ldr r12, [%[a], #16]\n\t"
  26709. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26710. "lsl r8, r10, #16\n\t"
  26711. "lsl r5, r12, #16\n\t"
  26712. "lsr r8, r8, #16\n\t"
  26713. "lsr r5, r5, #16\n\t"
  26714. "mul r5, r8, r5\n\t"
  26715. "lsr r9, r12, #16\n\t"
  26716. "mul r8, r9, r8\n\t"
  26717. "lsr r6, r8, #16\n\t"
  26718. "lsl r8, r8, #16\n\t"
  26719. "adds r5, r5, r8\n\t"
  26720. "adc r6, r6, #0\n\t"
  26721. "lsr r8, r10, #16\n\t"
  26722. "mul r9, r8, r9\n\t"
  26723. "add r6, r6, r9\n\t"
  26724. "lsl r9, r12, #16\n\t"
  26725. "lsr r9, r9, #16\n\t"
  26726. "mul r8, r9, r8\n\t"
  26727. "lsr r9, r8, #16\n\t"
  26728. "lsl r8, r8, #16\n\t"
  26729. "adds r5, r5, r8\n\t"
  26730. "adc r6, r6, r9\n\t"
  26731. #else
  26732. "umull r5, r6, r10, r12\n\t"
  26733. #endif
  26734. "mov r4, #0\n\t"
  26735. "mov r7, #0\n\t"
  26736. /* A[5] * A[10] */
  26737. "ldr r10, [%[a], #40]\n\t"
  26738. "ldr r12, [%[a], #20]\n\t"
  26739. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26740. "lsl r8, r10, #16\n\t"
  26741. "lsl r9, r12, #16\n\t"
  26742. "lsr r8, r8, #16\n\t"
  26743. "lsr r9, r9, #16\n\t"
  26744. "mul r9, r8, r9\n\t"
  26745. "adds r5, r5, r9\n\t"
  26746. "adcs r6, r6, #0\n\t"
  26747. "adc r7, r7, #0\n\t"
  26748. "lsr r9, r12, #16\n\t"
  26749. "mul r8, r9, r8\n\t"
  26750. "lsr r9, r8, #16\n\t"
  26751. "lsl r8, r8, #16\n\t"
  26752. "adds r5, r5, r8\n\t"
  26753. "adcs r6, r6, r9\n\t"
  26754. "adc r7, r7, #0\n\t"
  26755. "lsr r8, r10, #16\n\t"
  26756. "lsr r9, r12, #16\n\t"
  26757. "mul r9, r8, r9\n\t"
  26758. "adds r6, r6, r9\n\t"
  26759. "adc r7, r7, #0\n\t"
  26760. "lsl r9, r12, #16\n\t"
  26761. "lsr r9, r9, #16\n\t"
  26762. "mul r8, r9, r8\n\t"
  26763. "lsr r9, r8, #16\n\t"
  26764. "lsl r8, r8, #16\n\t"
  26765. "adds r5, r5, r8\n\t"
  26766. "adcs r6, r6, r9\n\t"
  26767. "adc r7, r7, #0\n\t"
  26768. #else
  26769. "umull r8, r9, r10, r12\n\t"
  26770. "adds r5, r5, r8\n\t"
  26771. "adcs r6, r6, r9\n\t"
  26772. "adc r7, r7, #0\n\t"
  26773. #endif
  26774. /* A[6] * A[9] */
  26775. "ldr r10, [%[a], #36]\n\t"
  26776. "ldr r12, [%[a], #24]\n\t"
  26777. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26778. "lsl r8, r10, #16\n\t"
  26779. "lsl r9, r12, #16\n\t"
  26780. "lsr r8, r8, #16\n\t"
  26781. "lsr r9, r9, #16\n\t"
  26782. "mul r9, r8, r9\n\t"
  26783. "adds r5, r5, r9\n\t"
  26784. "adcs r6, r6, #0\n\t"
  26785. "adc r7, r7, #0\n\t"
  26786. "lsr r9, r12, #16\n\t"
  26787. "mul r8, r9, r8\n\t"
  26788. "lsr r9, r8, #16\n\t"
  26789. "lsl r8, r8, #16\n\t"
  26790. "adds r5, r5, r8\n\t"
  26791. "adcs r6, r6, r9\n\t"
  26792. "adc r7, r7, #0\n\t"
  26793. "lsr r8, r10, #16\n\t"
  26794. "lsr r9, r12, #16\n\t"
  26795. "mul r9, r8, r9\n\t"
  26796. "adds r6, r6, r9\n\t"
  26797. "adc r7, r7, #0\n\t"
  26798. "lsl r9, r12, #16\n\t"
  26799. "lsr r9, r9, #16\n\t"
  26800. "mul r8, r9, r8\n\t"
  26801. "lsr r9, r8, #16\n\t"
  26802. "lsl r8, r8, #16\n\t"
  26803. "adds r5, r5, r8\n\t"
  26804. "adcs r6, r6, r9\n\t"
  26805. "adc r7, r7, #0\n\t"
  26806. #else
  26807. "umull r8, r9, r10, r12\n\t"
  26808. "adds r5, r5, r8\n\t"
  26809. "adcs r6, r6, r9\n\t"
  26810. "adc r7, r7, #0\n\t"
  26811. #endif
  26812. /* A[7] * A[8] */
  26813. "ldr r10, [%[a], #32]\n\t"
  26814. "ldr r12, [%[a], #28]\n\t"
  26815. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26816. "lsl r8, r10, #16\n\t"
  26817. "lsl r9, r12, #16\n\t"
  26818. "lsr r8, r8, #16\n\t"
  26819. "lsr r9, r9, #16\n\t"
  26820. "mul r9, r8, r9\n\t"
  26821. "adds r5, r5, r9\n\t"
  26822. "adcs r6, r6, #0\n\t"
  26823. "adc r7, r7, #0\n\t"
  26824. "lsr r9, r12, #16\n\t"
  26825. "mul r8, r9, r8\n\t"
  26826. "lsr r9, r8, #16\n\t"
  26827. "lsl r8, r8, #16\n\t"
  26828. "adds r5, r5, r8\n\t"
  26829. "adcs r6, r6, r9\n\t"
  26830. "adc r7, r7, #0\n\t"
  26831. "lsr r8, r10, #16\n\t"
  26832. "lsr r9, r12, #16\n\t"
  26833. "mul r9, r8, r9\n\t"
  26834. "adds r6, r6, r9\n\t"
  26835. "adc r7, r7, #0\n\t"
  26836. "lsl r9, r12, #16\n\t"
  26837. "lsr r9, r9, #16\n\t"
  26838. "mul r8, r9, r8\n\t"
  26839. "lsr r9, r8, #16\n\t"
  26840. "lsl r8, r8, #16\n\t"
  26841. "adds r5, r5, r8\n\t"
  26842. "adcs r6, r6, r9\n\t"
  26843. "adc r7, r7, #0\n\t"
  26844. #else
  26845. "umull r8, r9, r10, r12\n\t"
  26846. "adds r5, r5, r8\n\t"
  26847. "adcs r6, r6, r9\n\t"
  26848. "adc r7, r7, #0\n\t"
  26849. #endif
  26850. "adds r5, r5, r5\n\t"
  26851. "adcs r6, r6, r6\n\t"
  26852. "adc r7, r7, r7\n\t"
  26853. "adds r2, r2, r5\n\t"
  26854. "adcs r3, r3, r6\n\t"
  26855. "adc r4, r4, r7\n\t"
  26856. "str r2, [%[r], #60]\n\t"
  26857. /* A[5] * A[11] */
  26858. "ldr r10, [%[a], #44]\n\t"
  26859. "ldr r12, [%[a], #20]\n\t"
  26860. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26861. "lsl r8, r10, #16\n\t"
  26862. "lsl r5, r12, #16\n\t"
  26863. "lsr r8, r8, #16\n\t"
  26864. "lsr r5, r5, #16\n\t"
  26865. "mul r5, r8, r5\n\t"
  26866. "lsr r9, r12, #16\n\t"
  26867. "mul r8, r9, r8\n\t"
  26868. "lsr r6, r8, #16\n\t"
  26869. "lsl r8, r8, #16\n\t"
  26870. "adds r5, r5, r8\n\t"
  26871. "adc r6, r6, #0\n\t"
  26872. "lsr r8, r10, #16\n\t"
  26873. "mul r9, r8, r9\n\t"
  26874. "add r6, r6, r9\n\t"
  26875. "lsl r9, r12, #16\n\t"
  26876. "lsr r9, r9, #16\n\t"
  26877. "mul r8, r9, r8\n\t"
  26878. "lsr r9, r8, #16\n\t"
  26879. "lsl r8, r8, #16\n\t"
  26880. "adds r5, r5, r8\n\t"
  26881. "adc r6, r6, r9\n\t"
  26882. #else
  26883. "umull r5, r6, r10, r12\n\t"
  26884. #endif
  26885. "mov r2, #0\n\t"
  26886. "mov r7, #0\n\t"
  26887. /* A[6] * A[10] */
  26888. "ldr r10, [%[a], #40]\n\t"
  26889. "ldr r12, [%[a], #24]\n\t"
  26890. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26891. "lsl r8, r10, #16\n\t"
  26892. "lsl r9, r12, #16\n\t"
  26893. "lsr r8, r8, #16\n\t"
  26894. "lsr r9, r9, #16\n\t"
  26895. "mul r9, r8, r9\n\t"
  26896. "adds r5, r5, r9\n\t"
  26897. "adcs r6, r6, #0\n\t"
  26898. "adc r7, r7, #0\n\t"
  26899. "lsr r9, r12, #16\n\t"
  26900. "mul r8, r9, r8\n\t"
  26901. "lsr r9, r8, #16\n\t"
  26902. "lsl r8, r8, #16\n\t"
  26903. "adds r5, r5, r8\n\t"
  26904. "adcs r6, r6, r9\n\t"
  26905. "adc r7, r7, #0\n\t"
  26906. "lsr r8, r10, #16\n\t"
  26907. "lsr r9, r12, #16\n\t"
  26908. "mul r9, r8, r9\n\t"
  26909. "adds r6, r6, r9\n\t"
  26910. "adc r7, r7, #0\n\t"
  26911. "lsl r9, r12, #16\n\t"
  26912. "lsr r9, r9, #16\n\t"
  26913. "mul r8, r9, r8\n\t"
  26914. "lsr r9, r8, #16\n\t"
  26915. "lsl r8, r8, #16\n\t"
  26916. "adds r5, r5, r8\n\t"
  26917. "adcs r6, r6, r9\n\t"
  26918. "adc r7, r7, #0\n\t"
  26919. #else
  26920. "umull r8, r9, r10, r12\n\t"
  26921. "adds r5, r5, r8\n\t"
  26922. "adcs r6, r6, r9\n\t"
  26923. "adc r7, r7, #0\n\t"
  26924. #endif
  26925. /* A[7] * A[9] */
  26926. "ldr r10, [%[a], #36]\n\t"
  26927. "ldr r12, [%[a], #28]\n\t"
  26928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26929. "lsl r8, r10, #16\n\t"
  26930. "lsl r9, r12, #16\n\t"
  26931. "lsr r8, r8, #16\n\t"
  26932. "lsr r9, r9, #16\n\t"
  26933. "mul r9, r8, r9\n\t"
  26934. "adds r5, r5, r9\n\t"
  26935. "adcs r6, r6, #0\n\t"
  26936. "adc r7, r7, #0\n\t"
  26937. "lsr r9, r12, #16\n\t"
  26938. "mul r8, r9, r8\n\t"
  26939. "lsr r9, r8, #16\n\t"
  26940. "lsl r8, r8, #16\n\t"
  26941. "adds r5, r5, r8\n\t"
  26942. "adcs r6, r6, r9\n\t"
  26943. "adc r7, r7, #0\n\t"
  26944. "lsr r8, r10, #16\n\t"
  26945. "lsr r9, r12, #16\n\t"
  26946. "mul r9, r8, r9\n\t"
  26947. "adds r6, r6, r9\n\t"
  26948. "adc r7, r7, #0\n\t"
  26949. "lsl r9, r12, #16\n\t"
  26950. "lsr r9, r9, #16\n\t"
  26951. "mul r8, r9, r8\n\t"
  26952. "lsr r9, r8, #16\n\t"
  26953. "lsl r8, r8, #16\n\t"
  26954. "adds r5, r5, r8\n\t"
  26955. "adcs r6, r6, r9\n\t"
  26956. "adc r7, r7, #0\n\t"
  26957. #else
  26958. "umull r8, r9, r10, r12\n\t"
  26959. "adds r5, r5, r8\n\t"
  26960. "adcs r6, r6, r9\n\t"
  26961. "adc r7, r7, #0\n\t"
  26962. #endif
  26963. /* A[8] * A[8] */
  26964. "ldr r10, [%[a], #32]\n\t"
  26965. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  26966. "lsl r8, r10, #16\n\t"
  26967. "lsr r9, r10, #16\n\t"
  26968. "lsr r8, r8, #16\n\t"
  26969. "mov r12, r8\n\t"
  26970. "mul r8, r12, r8\n\t"
  26971. "mov r12, r9\n\t"
  26972. "mul r9, r12, r9\n\t"
  26973. "adds r3, r3, r8\n\t"
  26974. "adcs r4, r4, r9\n\t"
  26975. "adc r2, r2, #0\n\t"
  26976. "lsr r9, r10, #16\n\t"
  26977. "lsl r8, r10, #16\n\t"
  26978. "lsr r8, r8, #16\n\t"
  26979. "mul r8, r9, r8\n\t"
  26980. "lsr r9, r8, #15\n\t"
  26981. "lsl r8, r8, #17\n\t"
  26982. "adds r3, r3, r8\n\t"
  26983. "adcs r4, r4, r9\n\t"
  26984. "adc r2, r2, #0\n\t"
  26985. "adds r5, r5, r5\n\t"
  26986. "adcs r6, r6, r6\n\t"
  26987. "adc r7, r7, r7\n\t"
  26988. #else
  26989. "umull r8, r9, r10, r10\n\t"
  26990. "adds r5, r5, r5\n\t"
  26991. "adcs r6, r6, r6\n\t"
  26992. "adc r7, r7, r7\n\t"
  26993. "adds r3, r3, r8\n\t"
  26994. "adcs r4, r4, r9\n\t"
  26995. "adc r2, r2, #0\n\t"
  26996. #endif
  26997. "adds r3, r3, r5\n\t"
  26998. "adcs r4, r4, r6\n\t"
  26999. "adc r2, r2, r7\n\t"
  27000. "str r3, [%[r], #64]\n\t"
  27001. /* A[6] * A[11] */
  27002. "ldr r10, [%[a], #44]\n\t"
  27003. "ldr r12, [%[a], #24]\n\t"
  27004. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27005. "lsl r8, r10, #16\n\t"
  27006. "lsl r5, r12, #16\n\t"
  27007. "lsr r8, r8, #16\n\t"
  27008. "lsr r5, r5, #16\n\t"
  27009. "mul r5, r8, r5\n\t"
  27010. "lsr r9, r12, #16\n\t"
  27011. "mul r8, r9, r8\n\t"
  27012. "lsr r6, r8, #16\n\t"
  27013. "lsl r8, r8, #16\n\t"
  27014. "adds r5, r5, r8\n\t"
  27015. "adc r6, r6, #0\n\t"
  27016. "lsr r8, r10, #16\n\t"
  27017. "mul r9, r8, r9\n\t"
  27018. "add r6, r6, r9\n\t"
  27019. "lsl r9, r12, #16\n\t"
  27020. "lsr r9, r9, #16\n\t"
  27021. "mul r8, r9, r8\n\t"
  27022. "lsr r9, r8, #16\n\t"
  27023. "lsl r8, r8, #16\n\t"
  27024. "adds r5, r5, r8\n\t"
  27025. "adc r6, r6, r9\n\t"
  27026. #else
  27027. "umull r5, r6, r10, r12\n\t"
  27028. #endif
  27029. "mov r3, #0\n\t"
  27030. "mov r7, #0\n\t"
  27031. /* A[7] * A[10] */
  27032. "ldr r10, [%[a], #40]\n\t"
  27033. "ldr r12, [%[a], #28]\n\t"
  27034. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27035. "lsl r8, r10, #16\n\t"
  27036. "lsl r9, r12, #16\n\t"
  27037. "lsr r8, r8, #16\n\t"
  27038. "lsr r9, r9, #16\n\t"
  27039. "mul r9, r8, r9\n\t"
  27040. "adds r5, r5, r9\n\t"
  27041. "adcs r6, r6, #0\n\t"
  27042. "adc r7, r7, #0\n\t"
  27043. "lsr r9, r12, #16\n\t"
  27044. "mul r8, r9, r8\n\t"
  27045. "lsr r9, r8, #16\n\t"
  27046. "lsl r8, r8, #16\n\t"
  27047. "adds r5, r5, r8\n\t"
  27048. "adcs r6, r6, r9\n\t"
  27049. "adc r7, r7, #0\n\t"
  27050. "lsr r8, r10, #16\n\t"
  27051. "lsr r9, r12, #16\n\t"
  27052. "mul r9, r8, r9\n\t"
  27053. "adds r6, r6, r9\n\t"
  27054. "adc r7, r7, #0\n\t"
  27055. "lsl r9, r12, #16\n\t"
  27056. "lsr r9, r9, #16\n\t"
  27057. "mul r8, r9, r8\n\t"
  27058. "lsr r9, r8, #16\n\t"
  27059. "lsl r8, r8, #16\n\t"
  27060. "adds r5, r5, r8\n\t"
  27061. "adcs r6, r6, r9\n\t"
  27062. "adc r7, r7, #0\n\t"
  27063. #else
  27064. "umull r8, r9, r10, r12\n\t"
  27065. "adds r5, r5, r8\n\t"
  27066. "adcs r6, r6, r9\n\t"
  27067. "adc r7, r7, #0\n\t"
  27068. #endif
  27069. /* A[8] * A[9] */
  27070. "ldr r10, [%[a], #36]\n\t"
  27071. "ldr r12, [%[a], #32]\n\t"
  27072. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27073. "lsl r8, r10, #16\n\t"
  27074. "lsl r9, r12, #16\n\t"
  27075. "lsr r8, r8, #16\n\t"
  27076. "lsr r9, r9, #16\n\t"
  27077. "mul r9, r8, r9\n\t"
  27078. "adds r5, r5, r9\n\t"
  27079. "adcs r6, r6, #0\n\t"
  27080. "adc r7, r7, #0\n\t"
  27081. "lsr r9, r12, #16\n\t"
  27082. "mul r8, r9, r8\n\t"
  27083. "lsr r9, r8, #16\n\t"
  27084. "lsl r8, r8, #16\n\t"
  27085. "adds r5, r5, r8\n\t"
  27086. "adcs r6, r6, r9\n\t"
  27087. "adc r7, r7, #0\n\t"
  27088. "lsr r8, r10, #16\n\t"
  27089. "lsr r9, r12, #16\n\t"
  27090. "mul r9, r8, r9\n\t"
  27091. "adds r6, r6, r9\n\t"
  27092. "adc r7, r7, #0\n\t"
  27093. "lsl r9, r12, #16\n\t"
  27094. "lsr r9, r9, #16\n\t"
  27095. "mul r8, r9, r8\n\t"
  27096. "lsr r9, r8, #16\n\t"
  27097. "lsl r8, r8, #16\n\t"
  27098. "adds r5, r5, r8\n\t"
  27099. "adcs r6, r6, r9\n\t"
  27100. "adc r7, r7, #0\n\t"
  27101. #else
  27102. "umull r8, r9, r10, r12\n\t"
  27103. "adds r5, r5, r8\n\t"
  27104. "adcs r6, r6, r9\n\t"
  27105. "adc r7, r7, #0\n\t"
  27106. #endif
  27107. "adds r5, r5, r5\n\t"
  27108. "adcs r6, r6, r6\n\t"
  27109. "adc r7, r7, r7\n\t"
  27110. "adds r4, r4, r5\n\t"
  27111. "adcs r2, r2, r6\n\t"
  27112. "adc r3, r3, r7\n\t"
  27113. "str r4, [%[r], #68]\n\t"
  27114. /* A[7] * A[11] */
  27115. "ldr r10, [%[a], #44]\n\t"
  27116. "ldr r12, [%[a], #28]\n\t"
  27117. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27118. "lsl r8, r10, #16\n\t"
  27119. "lsl r9, r12, #16\n\t"
  27120. "lsr r8, r8, #16\n\t"
  27121. "lsr r9, r9, #16\n\t"
  27122. "mul r9, r8, r9\n\t"
  27123. "adds r2, r2, r9\n\t"
  27124. "adcs r3, r3, #0\n\t"
  27125. "mov r4, #0\n\t"
  27126. "adc r4, r4, #0\n\t"
  27127. "adds r2, r2, r9\n\t"
  27128. "adcs r3, r3, #0\n\t"
  27129. "adc r4, r4, #0\n\t"
  27130. "lsr r9, r12, #16\n\t"
  27131. "mul r8, r9, r8\n\t"
  27132. "lsr r9, r8, #16\n\t"
  27133. "lsl r8, r8, #16\n\t"
  27134. "adds r2, r2, r8\n\t"
  27135. "adcs r3, r3, r9\n\t"
  27136. "adc r4, r4, #0\n\t"
  27137. "adds r2, r2, r8\n\t"
  27138. "adcs r3, r3, r9\n\t"
  27139. "adc r4, r4, #0\n\t"
  27140. "lsr r8, r10, #16\n\t"
  27141. "lsr r9, r12, #16\n\t"
  27142. "mul r9, r8, r9\n\t"
  27143. "adds r3, r3, r9\n\t"
  27144. "adc r4, r4, #0\n\t"
  27145. "adds r3, r3, r9\n\t"
  27146. "adc r4, r4, #0\n\t"
  27147. "lsl r9, r12, #16\n\t"
  27148. "lsr r9, r9, #16\n\t"
  27149. "mul r8, r9, r8\n\t"
  27150. "lsr r9, r8, #16\n\t"
  27151. "lsl r8, r8, #16\n\t"
  27152. "adds r2, r2, r8\n\t"
  27153. "adcs r3, r3, r9\n\t"
  27154. "adc r4, r4, #0\n\t"
  27155. "adds r2, r2, r8\n\t"
  27156. "adcs r3, r3, r9\n\t"
  27157. "adc r4, r4, #0\n\t"
  27158. #else
  27159. "umull r8, r9, r10, r12\n\t"
  27160. "adds r2, r2, r8\n\t"
  27161. "adcs r3, r3, r9\n\t"
  27162. "mov r4, #0\n\t"
  27163. "adc r4, r4, #0\n\t"
  27164. "adds r2, r2, r8\n\t"
  27165. "adcs r3, r3, r9\n\t"
  27166. "mov r4, #0\n\t"
  27167. "adc r4, r4, #0\n\t"
  27168. #endif
  27169. /* A[8] * A[10] */
  27170. "ldr r10, [%[a], #40]\n\t"
  27171. "ldr r12, [%[a], #32]\n\t"
  27172. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27173. "lsl r8, r10, #16\n\t"
  27174. "lsl r9, r12, #16\n\t"
  27175. "lsr r8, r8, #16\n\t"
  27176. "lsr r9, r9, #16\n\t"
  27177. "mul r9, r8, r9\n\t"
  27178. "adds r2, r2, r9\n\t"
  27179. "adcs r3, r3, #0\n\t"
  27180. "adc r4, r4, #0\n\t"
  27181. "adds r2, r2, r9\n\t"
  27182. "adcs r3, r3, #0\n\t"
  27183. "adc r4, r4, #0\n\t"
  27184. "lsr r9, r12, #16\n\t"
  27185. "mul r8, r9, r8\n\t"
  27186. "lsr r9, r8, #16\n\t"
  27187. "lsl r8, r8, #16\n\t"
  27188. "adds r2, r2, r8\n\t"
  27189. "adcs r3, r3, r9\n\t"
  27190. "adc r4, r4, #0\n\t"
  27191. "adds r2, r2, r8\n\t"
  27192. "adcs r3, r3, r9\n\t"
  27193. "adc r4, r4, #0\n\t"
  27194. "lsr r8, r10, #16\n\t"
  27195. "lsr r9, r12, #16\n\t"
  27196. "mul r9, r8, r9\n\t"
  27197. "adds r3, r3, r9\n\t"
  27198. "adc r4, r4, #0\n\t"
  27199. "adds r3, r3, r9\n\t"
  27200. "adc r4, r4, #0\n\t"
  27201. "lsl r9, r12, #16\n\t"
  27202. "lsr r9, r9, #16\n\t"
  27203. "mul r8, r9, r8\n\t"
  27204. "lsr r9, r8, #16\n\t"
  27205. "lsl r8, r8, #16\n\t"
  27206. "adds r2, r2, r8\n\t"
  27207. "adcs r3, r3, r9\n\t"
  27208. "adc r4, r4, #0\n\t"
  27209. "adds r2, r2, r8\n\t"
  27210. "adcs r3, r3, r9\n\t"
  27211. "adc r4, r4, #0\n\t"
  27212. #else
  27213. "umull r8, r9, r10, r12\n\t"
  27214. "adds r2, r2, r8\n\t"
  27215. "adcs r3, r3, r9\n\t"
  27216. "adc r4, r4, #0\n\t"
  27217. "adds r2, r2, r8\n\t"
  27218. "adcs r3, r3, r9\n\t"
  27219. "adc r4, r4, #0\n\t"
  27220. #endif
  27221. /* A[9] * A[9] */
  27222. "ldr r10, [%[a], #36]\n\t"
  27223. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27224. "lsl r8, r10, #16\n\t"
  27225. "lsr r9, r10, #16\n\t"
  27226. "lsr r8, r8, #16\n\t"
  27227. "mov r12, r8\n\t"
  27228. "mul r8, r12, r8\n\t"
  27229. "mov r12, r9\n\t"
  27230. "mul r9, r12, r9\n\t"
  27231. "adds r2, r2, r8\n\t"
  27232. "adcs r3, r3, r9\n\t"
  27233. "adc r4, r4, #0\n\t"
  27234. "lsr r9, r10, #16\n\t"
  27235. "lsl r8, r10, #16\n\t"
  27236. "lsr r8, r8, #16\n\t"
  27237. "mul r8, r9, r8\n\t"
  27238. "lsr r9, r8, #15\n\t"
  27239. "lsl r8, r8, #17\n\t"
  27240. "adds r2, r2, r8\n\t"
  27241. "adcs r3, r3, r9\n\t"
  27242. "adc r4, r4, #0\n\t"
  27243. #else
  27244. "umull r8, r9, r10, r10\n\t"
  27245. "adds r2, r2, r8\n\t"
  27246. "adcs r3, r3, r9\n\t"
  27247. "adc r4, r4, #0\n\t"
  27248. #endif
  27249. "str r2, [%[r], #72]\n\t"
  27250. /* A[8] * A[11] */
  27251. "ldr r10, [%[a], #44]\n\t"
  27252. "ldr r12, [%[a], #32]\n\t"
  27253. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27254. "lsl r8, r10, #16\n\t"
  27255. "lsl r9, r12, #16\n\t"
  27256. "lsr r8, r8, #16\n\t"
  27257. "lsr r9, r9, #16\n\t"
  27258. "mul r9, r8, r9\n\t"
  27259. "adds r3, r3, r9\n\t"
  27260. "adcs r4, r4, #0\n\t"
  27261. "mov r2, #0\n\t"
  27262. "adc r2, r2, #0\n\t"
  27263. "adds r3, r3, r9\n\t"
  27264. "adcs r4, r4, #0\n\t"
  27265. "adc r2, r2, #0\n\t"
  27266. "lsr r9, r12, #16\n\t"
  27267. "mul r8, r9, r8\n\t"
  27268. "lsr r9, r8, #16\n\t"
  27269. "lsl r8, r8, #16\n\t"
  27270. "adds r3, r3, r8\n\t"
  27271. "adcs r4, r4, r9\n\t"
  27272. "adc r2, r2, #0\n\t"
  27273. "adds r3, r3, r8\n\t"
  27274. "adcs r4, r4, r9\n\t"
  27275. "adc r2, r2, #0\n\t"
  27276. "lsr r8, r10, #16\n\t"
  27277. "lsr r9, r12, #16\n\t"
  27278. "mul r9, r8, r9\n\t"
  27279. "adds r4, r4, r9\n\t"
  27280. "adc r2, r2, #0\n\t"
  27281. "adds r4, r4, r9\n\t"
  27282. "adc r2, r2, #0\n\t"
  27283. "lsl r9, r12, #16\n\t"
  27284. "lsr r9, r9, #16\n\t"
  27285. "mul r8, r9, r8\n\t"
  27286. "lsr r9, r8, #16\n\t"
  27287. "lsl r8, r8, #16\n\t"
  27288. "adds r3, r3, r8\n\t"
  27289. "adcs r4, r4, r9\n\t"
  27290. "adc r2, r2, #0\n\t"
  27291. "adds r3, r3, r8\n\t"
  27292. "adcs r4, r4, r9\n\t"
  27293. "adc r2, r2, #0\n\t"
  27294. #else
  27295. "umull r8, r9, r10, r12\n\t"
  27296. "adds r3, r3, r8\n\t"
  27297. "adcs r4, r4, r9\n\t"
  27298. "mov r2, #0\n\t"
  27299. "adc r2, r2, #0\n\t"
  27300. "adds r3, r3, r8\n\t"
  27301. "adcs r4, r4, r9\n\t"
  27302. "mov r2, #0\n\t"
  27303. "adc r2, r2, #0\n\t"
  27304. #endif
  27305. /* A[9] * A[10] */
  27306. "ldr r10, [%[a], #40]\n\t"
  27307. "ldr r12, [%[a], #36]\n\t"
  27308. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27309. "lsl r8, r10, #16\n\t"
  27310. "lsl r9, r12, #16\n\t"
  27311. "lsr r8, r8, #16\n\t"
  27312. "lsr r9, r9, #16\n\t"
  27313. "mul r9, r8, r9\n\t"
  27314. "adds r3, r3, r9\n\t"
  27315. "adcs r4, r4, #0\n\t"
  27316. "adc r2, r2, #0\n\t"
  27317. "adds r3, r3, r9\n\t"
  27318. "adcs r4, r4, #0\n\t"
  27319. "adc r2, r2, #0\n\t"
  27320. "lsr r9, r12, #16\n\t"
  27321. "mul r8, r9, r8\n\t"
  27322. "lsr r9, r8, #16\n\t"
  27323. "lsl r8, r8, #16\n\t"
  27324. "adds r3, r3, r8\n\t"
  27325. "adcs r4, r4, r9\n\t"
  27326. "adc r2, r2, #0\n\t"
  27327. "adds r3, r3, r8\n\t"
  27328. "adcs r4, r4, r9\n\t"
  27329. "adc r2, r2, #0\n\t"
  27330. "lsr r8, r10, #16\n\t"
  27331. "lsr r9, r12, #16\n\t"
  27332. "mul r9, r8, r9\n\t"
  27333. "adds r4, r4, r9\n\t"
  27334. "adc r2, r2, #0\n\t"
  27335. "adds r4, r4, r9\n\t"
  27336. "adc r2, r2, #0\n\t"
  27337. "lsl r9, r12, #16\n\t"
  27338. "lsr r9, r9, #16\n\t"
  27339. "mul r8, r9, r8\n\t"
  27340. "lsr r9, r8, #16\n\t"
  27341. "lsl r8, r8, #16\n\t"
  27342. "adds r3, r3, r8\n\t"
  27343. "adcs r4, r4, r9\n\t"
  27344. "adc r2, r2, #0\n\t"
  27345. "adds r3, r3, r8\n\t"
  27346. "adcs r4, r4, r9\n\t"
  27347. "adc r2, r2, #0\n\t"
  27348. #else
  27349. "umull r8, r9, r10, r12\n\t"
  27350. "adds r3, r3, r8\n\t"
  27351. "adcs r4, r4, r9\n\t"
  27352. "adc r2, r2, #0\n\t"
  27353. "adds r3, r3, r8\n\t"
  27354. "adcs r4, r4, r9\n\t"
  27355. "adc r2, r2, #0\n\t"
  27356. #endif
  27357. "str r3, [%[r], #76]\n\t"
  27358. /* A[9] * A[11] */
  27359. "ldr r10, [%[a], #44]\n\t"
  27360. "ldr r12, [%[a], #36]\n\t"
  27361. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27362. "lsl r8, r10, #16\n\t"
  27363. "lsl r9, r12, #16\n\t"
  27364. "lsr r8, r8, #16\n\t"
  27365. "lsr r9, r9, #16\n\t"
  27366. "mul r9, r8, r9\n\t"
  27367. "adds r4, r4, r9\n\t"
  27368. "adcs r2, r2, #0\n\t"
  27369. "mov r3, #0\n\t"
  27370. "adc r3, r3, #0\n\t"
  27371. "adds r4, r4, r9\n\t"
  27372. "adcs r2, r2, #0\n\t"
  27373. "adc r3, r3, #0\n\t"
  27374. "lsr r9, r12, #16\n\t"
  27375. "mul r8, r9, r8\n\t"
  27376. "lsr r9, r8, #16\n\t"
  27377. "lsl r8, r8, #16\n\t"
  27378. "adds r4, r4, r8\n\t"
  27379. "adcs r2, r2, r9\n\t"
  27380. "adc r3, r3, #0\n\t"
  27381. "adds r4, r4, r8\n\t"
  27382. "adcs r2, r2, r9\n\t"
  27383. "adc r3, r3, #0\n\t"
  27384. "lsr r8, r10, #16\n\t"
  27385. "lsr r9, r12, #16\n\t"
  27386. "mul r9, r8, r9\n\t"
  27387. "adds r2, r2, r9\n\t"
  27388. "adc r3, r3, #0\n\t"
  27389. "adds r2, r2, r9\n\t"
  27390. "adc r3, r3, #0\n\t"
  27391. "lsl r9, r12, #16\n\t"
  27392. "lsr r9, r9, #16\n\t"
  27393. "mul r8, r9, r8\n\t"
  27394. "lsr r9, r8, #16\n\t"
  27395. "lsl r8, r8, #16\n\t"
  27396. "adds r4, r4, r8\n\t"
  27397. "adcs r2, r2, r9\n\t"
  27398. "adc r3, r3, #0\n\t"
  27399. "adds r4, r4, r8\n\t"
  27400. "adcs r2, r2, r9\n\t"
  27401. "adc r3, r3, #0\n\t"
  27402. #else
  27403. "umull r8, r9, r10, r12\n\t"
  27404. "adds r4, r4, r8\n\t"
  27405. "adcs r2, r2, r9\n\t"
  27406. "mov r3, #0\n\t"
  27407. "adc r3, r3, #0\n\t"
  27408. "adds r4, r4, r8\n\t"
  27409. "adcs r2, r2, r9\n\t"
  27410. "mov r3, #0\n\t"
  27411. "adc r3, r3, #0\n\t"
  27412. #endif
  27413. /* A[10] * A[10] */
  27414. "ldr r10, [%[a], #40]\n\t"
  27415. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27416. "lsl r8, r10, #16\n\t"
  27417. "lsr r9, r10, #16\n\t"
  27418. "lsr r8, r8, #16\n\t"
  27419. "mov r12, r8\n\t"
  27420. "mul r8, r12, r8\n\t"
  27421. "mov r12, r9\n\t"
  27422. "mul r9, r12, r9\n\t"
  27423. "adds r4, r4, r8\n\t"
  27424. "adcs r2, r2, r9\n\t"
  27425. "adc r3, r3, #0\n\t"
  27426. "lsr r9, r10, #16\n\t"
  27427. "lsl r8, r10, #16\n\t"
  27428. "lsr r8, r8, #16\n\t"
  27429. "mul r8, r9, r8\n\t"
  27430. "lsr r9, r8, #15\n\t"
  27431. "lsl r8, r8, #17\n\t"
  27432. "adds r4, r4, r8\n\t"
  27433. "adcs r2, r2, r9\n\t"
  27434. "adc r3, r3, #0\n\t"
  27435. #else
  27436. "umull r8, r9, r10, r10\n\t"
  27437. "adds r4, r4, r8\n\t"
  27438. "adcs r2, r2, r9\n\t"
  27439. "adc r3, r3, #0\n\t"
  27440. #endif
  27441. "str r4, [%[r], #80]\n\t"
  27442. /* A[10] * A[11] */
  27443. "ldr r10, [%[a], #44]\n\t"
  27444. "ldr r12, [%[a], #40]\n\t"
  27445. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27446. "lsl r8, r10, #16\n\t"
  27447. "lsl r9, r12, #16\n\t"
  27448. "lsr r8, r8, #16\n\t"
  27449. "lsr r9, r9, #16\n\t"
  27450. "mul r9, r8, r9\n\t"
  27451. "adds r2, r2, r9\n\t"
  27452. "adcs r3, r3, #0\n\t"
  27453. "mov r4, #0\n\t"
  27454. "adc r4, r4, #0\n\t"
  27455. "adds r2, r2, r9\n\t"
  27456. "adcs r3, r3, #0\n\t"
  27457. "adc r4, r4, #0\n\t"
  27458. "lsr r9, r12, #16\n\t"
  27459. "mul r8, r9, r8\n\t"
  27460. "lsr r9, r8, #16\n\t"
  27461. "lsl r8, r8, #16\n\t"
  27462. "adds r2, r2, r8\n\t"
  27463. "adcs r3, r3, r9\n\t"
  27464. "adc r4, r4, #0\n\t"
  27465. "adds r2, r2, r8\n\t"
  27466. "adcs r3, r3, r9\n\t"
  27467. "adc r4, r4, #0\n\t"
  27468. "lsr r8, r10, #16\n\t"
  27469. "lsr r9, r12, #16\n\t"
  27470. "mul r9, r8, r9\n\t"
  27471. "adds r3, r3, r9\n\t"
  27472. "adc r4, r4, #0\n\t"
  27473. "adds r3, r3, r9\n\t"
  27474. "adc r4, r4, #0\n\t"
  27475. "lsl r9, r12, #16\n\t"
  27476. "lsr r9, r9, #16\n\t"
  27477. "mul r8, r9, r8\n\t"
  27478. "lsr r9, r8, #16\n\t"
  27479. "lsl r8, r8, #16\n\t"
  27480. "adds r2, r2, r8\n\t"
  27481. "adcs r3, r3, r9\n\t"
  27482. "adc r4, r4, #0\n\t"
  27483. "adds r2, r2, r8\n\t"
  27484. "adcs r3, r3, r9\n\t"
  27485. "adc r4, r4, #0\n\t"
  27486. #else
  27487. "umull r8, r9, r10, r12\n\t"
  27488. "adds r2, r2, r8\n\t"
  27489. "adcs r3, r3, r9\n\t"
  27490. "mov r4, #0\n\t"
  27491. "adc r4, r4, #0\n\t"
  27492. "adds r2, r2, r8\n\t"
  27493. "adcs r3, r3, r9\n\t"
  27494. "mov r4, #0\n\t"
  27495. "adc r4, r4, #0\n\t"
  27496. #endif
  27497. "str r2, [%[r], #84]\n\t"
  27498. /* A[11] * A[11] */
  27499. "ldr r10, [%[a], #44]\n\t"
  27500. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27501. "lsl r8, r10, #16\n\t"
  27502. "lsr r9, r10, #16\n\t"
  27503. "lsr r8, r8, #16\n\t"
  27504. "mov r12, r8\n\t"
  27505. "mul r8, r12, r8\n\t"
  27506. "mov r12, r9\n\t"
  27507. "mul r9, r12, r9\n\t"
  27508. "adds r3, r3, r8\n\t"
  27509. "adc r4, r4, r9\n\t"
  27510. "lsr r9, r10, #16\n\t"
  27511. "lsl r8, r10, #16\n\t"
  27512. "lsr r8, r8, #16\n\t"
  27513. "mul r8, r9, r8\n\t"
  27514. "lsr r9, r8, #15\n\t"
  27515. "lsl r8, r8, #17\n\t"
  27516. "adds r3, r3, r8\n\t"
  27517. "adc r4, r4, r9\n\t"
  27518. #else
  27519. "umull r8, r9, r10, r10\n\t"
  27520. "adds r3, r3, r8\n\t"
  27521. "adc r4, r4, r9\n\t"
  27522. #endif
  27523. "str r3, [%[r], #88]\n\t"
  27524. "str r4, [%[r], #92]\n\t"
  27525. "ldm sp!, {r2, r3, r4, r8}\n\t"
  27526. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  27527. "ldm sp!, {r2, r3, r4, r8}\n\t"
  27528. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  27529. "ldm sp!, {r2, r3, r4, r8}\n\t"
  27530. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  27531. : [r] "+r" (r), [a] "+r" (a)
  27532. :
  27533. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  27534. );
  27535. }
  27536. /* Sub b from a into r. (r = a - b)
  27537. *
  27538. * r A single precision integer.
  27539. * a A single precision integer.
  27540. * b A single precision integer.
  27541. */
  27542. static sp_digit sp_3072_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27543. {
  27544. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  27545. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  27546. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  27547. __asm__ __volatile__ (
  27548. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27549. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27550. "subs r3, r3, r7\n\t"
  27551. "sbcs r4, r4, r8\n\t"
  27552. "sbcs r5, r5, r9\n\t"
  27553. "sbcs r6, r6, r10\n\t"
  27554. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27555. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27556. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27557. "sbcs r3, r3, r7\n\t"
  27558. "sbcs r4, r4, r8\n\t"
  27559. "sbcs r5, r5, r9\n\t"
  27560. "sbcs r6, r6, r10\n\t"
  27561. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27562. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27563. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27564. "sbcs r3, r3, r7\n\t"
  27565. "sbcs r4, r4, r8\n\t"
  27566. "sbcs r5, r5, r9\n\t"
  27567. "sbcs r6, r6, r10\n\t"
  27568. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27569. "sbc %[r], r6, r6\n\t"
  27570. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27571. :
  27572. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  27573. );
  27574. return (uint32_t)(size_t)r;
  27575. }
  27576. /* Square a and put result in r. (r = a * a)
  27577. *
  27578. * r A single precision integer.
  27579. * a A single precision integer.
  27580. */
  27581. SP_NOINLINE static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
  27582. {
  27583. sp_digit* z0 = r;
  27584. sp_digit* z2 = r + 24;
  27585. sp_digit z1[24];
  27586. sp_digit* a1 = z1;
  27587. sp_digit zero[12];
  27588. sp_digit u;
  27589. sp_digit mask;
  27590. sp_digit* p1;
  27591. sp_digit* p2;
  27592. XMEMSET(zero, 0, sizeof(sp_digit) * 12);
  27593. mask = sp_3072_sub_12(a1, a, &a[12]);
  27594. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  27595. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  27596. (void)sp_3072_sub_12(a1, p1, p2);
  27597. sp_3072_sqr_12(z2, &a[12]);
  27598. sp_3072_sqr_12(z0, a);
  27599. sp_3072_sqr_12(z1, a1);
  27600. u = 0;
  27601. u -= sp_3072_sub_in_place_24(z1, z2);
  27602. u -= sp_3072_sub_in_place_24(z1, z0);
  27603. u += sp_3072_sub_in_place_24(r + 12, z1);
  27604. zero[0] = u;
  27605. (void)sp_3072_add_12(r + 36, r + 36, zero);
  27606. }
  27607. /* Sub b from a into r. (r = a - b)
  27608. *
  27609. * r A single precision integer.
  27610. * a A single precision integer.
  27611. * b A single precision integer.
  27612. */
  27613. static sp_digit sp_3072_sub_24(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27614. {
  27615. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  27616. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  27617. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  27618. __asm__ __volatile__ (
  27619. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27620. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27621. "subs r3, r3, r7\n\t"
  27622. "sbcs r4, r4, r8\n\t"
  27623. "sbcs r5, r5, r9\n\t"
  27624. "sbcs r6, r6, r10\n\t"
  27625. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27626. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27627. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27628. "sbcs r3, r3, r7\n\t"
  27629. "sbcs r4, r4, r8\n\t"
  27630. "sbcs r5, r5, r9\n\t"
  27631. "sbcs r6, r6, r10\n\t"
  27632. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27633. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27634. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27635. "sbcs r3, r3, r7\n\t"
  27636. "sbcs r4, r4, r8\n\t"
  27637. "sbcs r5, r5, r9\n\t"
  27638. "sbcs r6, r6, r10\n\t"
  27639. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27640. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27641. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27642. "sbcs r3, r3, r7\n\t"
  27643. "sbcs r4, r4, r8\n\t"
  27644. "sbcs r5, r5, r9\n\t"
  27645. "sbcs r6, r6, r10\n\t"
  27646. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27647. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27648. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27649. "sbcs r3, r3, r7\n\t"
  27650. "sbcs r4, r4, r8\n\t"
  27651. "sbcs r5, r5, r9\n\t"
  27652. "sbcs r6, r6, r10\n\t"
  27653. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27654. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27655. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27656. "sbcs r3, r3, r7\n\t"
  27657. "sbcs r4, r4, r8\n\t"
  27658. "sbcs r5, r5, r9\n\t"
  27659. "sbcs r6, r6, r10\n\t"
  27660. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27661. "sbc %[r], r6, r6\n\t"
  27662. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27663. :
  27664. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  27665. );
  27666. return (uint32_t)(size_t)r;
  27667. }
  27668. /* Square a and put result in r. (r = a * a)
  27669. *
  27670. * r A single precision integer.
  27671. * a A single precision integer.
  27672. */
  27673. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  27674. {
  27675. sp_digit* z0 = r;
  27676. sp_digit* z2 = r + 48;
  27677. sp_digit z1[48];
  27678. sp_digit* a1 = z1;
  27679. sp_digit zero[24];
  27680. sp_digit u;
  27681. sp_digit mask;
  27682. sp_digit* p1;
  27683. sp_digit* p2;
  27684. XMEMSET(zero, 0, sizeof(sp_digit) * 24);
  27685. mask = sp_3072_sub_24(a1, a, &a[24]);
  27686. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  27687. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  27688. (void)sp_3072_sub_24(a1, p1, p2);
  27689. sp_3072_sqr_24(z2, &a[24]);
  27690. sp_3072_sqr_24(z0, a);
  27691. sp_3072_sqr_24(z1, a1);
  27692. u = 0;
  27693. u -= sp_3072_sub_in_place_48(z1, z2);
  27694. u -= sp_3072_sub_in_place_48(z1, z0);
  27695. u += sp_3072_sub_in_place_48(r + 24, z1);
  27696. zero[0] = u;
  27697. (void)sp_3072_add_24(r + 72, r + 72, zero);
  27698. }
  27699. /* Sub b from a into r. (r = a - b)
  27700. *
  27701. * r A single precision integer.
  27702. * a A single precision integer.
  27703. * b A single precision integer.
  27704. */
  27705. static sp_digit sp_3072_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27706. {
  27707. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  27708. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  27709. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  27710. __asm__ __volatile__ (
  27711. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27712. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27713. "subs r3, r3, r7\n\t"
  27714. "sbcs r4, r4, r8\n\t"
  27715. "sbcs r5, r5, r9\n\t"
  27716. "sbcs r6, r6, r10\n\t"
  27717. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27718. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27719. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27720. "sbcs r3, r3, r7\n\t"
  27721. "sbcs r4, r4, r8\n\t"
  27722. "sbcs r5, r5, r9\n\t"
  27723. "sbcs r6, r6, r10\n\t"
  27724. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27725. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27726. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27727. "sbcs r3, r3, r7\n\t"
  27728. "sbcs r4, r4, r8\n\t"
  27729. "sbcs r5, r5, r9\n\t"
  27730. "sbcs r6, r6, r10\n\t"
  27731. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27732. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27733. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27734. "sbcs r3, r3, r7\n\t"
  27735. "sbcs r4, r4, r8\n\t"
  27736. "sbcs r5, r5, r9\n\t"
  27737. "sbcs r6, r6, r10\n\t"
  27738. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27739. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27740. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27741. "sbcs r3, r3, r7\n\t"
  27742. "sbcs r4, r4, r8\n\t"
  27743. "sbcs r5, r5, r9\n\t"
  27744. "sbcs r6, r6, r10\n\t"
  27745. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27746. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27747. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27748. "sbcs r3, r3, r7\n\t"
  27749. "sbcs r4, r4, r8\n\t"
  27750. "sbcs r5, r5, r9\n\t"
  27751. "sbcs r6, r6, r10\n\t"
  27752. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27753. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27754. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27755. "sbcs r3, r3, r7\n\t"
  27756. "sbcs r4, r4, r8\n\t"
  27757. "sbcs r5, r5, r9\n\t"
  27758. "sbcs r6, r6, r10\n\t"
  27759. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27760. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27761. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27762. "sbcs r3, r3, r7\n\t"
  27763. "sbcs r4, r4, r8\n\t"
  27764. "sbcs r5, r5, r9\n\t"
  27765. "sbcs r6, r6, r10\n\t"
  27766. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27767. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27768. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27769. "sbcs r3, r3, r7\n\t"
  27770. "sbcs r4, r4, r8\n\t"
  27771. "sbcs r5, r5, r9\n\t"
  27772. "sbcs r6, r6, r10\n\t"
  27773. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27774. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27775. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27776. "sbcs r3, r3, r7\n\t"
  27777. "sbcs r4, r4, r8\n\t"
  27778. "sbcs r5, r5, r9\n\t"
  27779. "sbcs r6, r6, r10\n\t"
  27780. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27781. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27782. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27783. "sbcs r3, r3, r7\n\t"
  27784. "sbcs r4, r4, r8\n\t"
  27785. "sbcs r5, r5, r9\n\t"
  27786. "sbcs r6, r6, r10\n\t"
  27787. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27788. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27789. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27790. "sbcs r3, r3, r7\n\t"
  27791. "sbcs r4, r4, r8\n\t"
  27792. "sbcs r5, r5, r9\n\t"
  27793. "sbcs r6, r6, r10\n\t"
  27794. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27795. "sbc %[r], r6, r6\n\t"
  27796. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27797. :
  27798. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  27799. );
  27800. return (uint32_t)(size_t)r;
  27801. }
  27802. /* Square a and put result in r. (r = a * a)
  27803. *
  27804. * r A single precision integer.
  27805. * a A single precision integer.
  27806. */
  27807. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  27808. {
  27809. sp_digit* z0 = r;
  27810. sp_digit* z2 = r + 96;
  27811. sp_digit z1[96];
  27812. sp_digit* a1 = z1;
  27813. sp_digit zero[48];
  27814. sp_digit u;
  27815. sp_digit mask;
  27816. sp_digit* p1;
  27817. sp_digit* p2;
  27818. XMEMSET(zero, 0, sizeof(sp_digit) * 48);
  27819. mask = sp_3072_sub_48(a1, a, &a[48]);
  27820. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  27821. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  27822. (void)sp_3072_sub_48(a1, p1, p2);
  27823. sp_3072_sqr_48(z2, &a[48]);
  27824. sp_3072_sqr_48(z0, a);
  27825. sp_3072_sqr_48(z1, a1);
  27826. u = 0;
  27827. u -= sp_3072_sub_in_place_96(z1, z2);
  27828. u -= sp_3072_sub_in_place_96(z1, z0);
  27829. u += sp_3072_sub_in_place_96(r + 48, z1);
  27830. zero[0] = u;
  27831. (void)sp_3072_add_48(r + 144, r + 144, zero);
  27832. }
  27833. #endif /* !WOLFSSL_SP_SMALL */
  27834. #ifdef WOLFSSL_SP_SMALL
  27835. /* Add b to a into r. (r = a + b)
  27836. *
  27837. * r A single precision integer.
  27838. * a A single precision integer.
  27839. * b A single precision integer.
  27840. */
  27841. static sp_digit sp_3072_add_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27842. {
  27843. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  27844. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  27845. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  27846. __asm__ __volatile__ (
  27847. "mov r3, #0\n\t"
  27848. "add r12, %[a], #0x180\n\t"
  27849. "\n"
  27850. "L_sp_3072_add_96_word_%=: \n\t"
  27851. "adds r3, r3, #-1\n\t"
  27852. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  27853. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  27854. "adcs r4, r4, r8\n\t"
  27855. "adcs r5, r5, r9\n\t"
  27856. "adcs r6, r6, r10\n\t"
  27857. "adcs r7, r7, r11\n\t"
  27858. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  27859. "mov r4, #0\n\t"
  27860. "adc r3, r4, #0\n\t"
  27861. "cmp %[a], r12\n\t"
  27862. "bne L_sp_3072_add_96_word_%=\n\t"
  27863. "mov %[r], r3\n\t"
  27864. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27865. :
  27866. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  27867. );
  27868. return (uint32_t)(size_t)r;
  27869. }
  27870. #endif /* WOLFSSL_SP_SMALL */
  27871. #ifdef WOLFSSL_SP_SMALL
  27872. /* Sub b from a into a. (a -= b)
  27873. *
  27874. * a A single precision integer.
  27875. * b A single precision integer.
  27876. */
  27877. static sp_digit sp_3072_sub_in_place_96(sp_digit* a_p, const sp_digit* b_p)
  27878. {
  27879. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  27880. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  27881. __asm__ __volatile__ (
  27882. "mov r12, #0\n\t"
  27883. "add lr, %[a], #0x180\n\t"
  27884. "\n"
  27885. "L_sp_3072_sub_in_pkace_96_word_%=: \n\t"
  27886. "rsbs r12, r12, #0\n\t"
  27887. "ldm %[a], {r2, r3, r4, r5}\n\t"
  27888. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  27889. "sbcs r2, r2, r6\n\t"
  27890. "sbcs r3, r3, r7\n\t"
  27891. "sbcs r4, r4, r8\n\t"
  27892. "sbcs r5, r5, r9\n\t"
  27893. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  27894. "sbc r12, r12, r12\n\t"
  27895. "cmp %[a], lr\n\t"
  27896. "bne L_sp_3072_sub_in_pkace_96_word_%=\n\t"
  27897. "mov %[a], r12\n\t"
  27898. : [a] "+r" (a), [b] "+r" (b)
  27899. :
  27900. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  27901. );
  27902. return (uint32_t)(size_t)a;
  27903. }
  27904. #endif /* WOLFSSL_SP_SMALL */
  27905. #ifdef WOLFSSL_SP_SMALL
  27906. /* Multiply a and b into r. (r = a * b)
  27907. *
  27908. * r A single precision integer.
  27909. * a A single precision integer.
  27910. * b A single precision integer.
  27911. */
  27912. static void sp_3072_mul_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27913. {
  27914. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  27915. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  27916. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  27917. __asm__ __volatile__ (
  27918. "sub sp, sp, #0x300\n\t"
  27919. "ldr lr, [%[a]]\n\t"
  27920. "ldr r11, [%[b]]\n\t"
  27921. "umull r8, r6, lr, r11\n\t"
  27922. "str r8, [sp]\n\t"
  27923. "mov r7, #0\n\t"
  27924. "mov r8, #0\n\t"
  27925. "mov r5, #4\n\t"
  27926. "\n"
  27927. "L_sp_3072_mul_96_outer_%=: \n\t"
  27928. "subs r3, r5, #0x17c\n\t"
  27929. "it cc\n\t"
  27930. "movcc r3, #0\n\t"
  27931. "sub r4, r5, r3\n\t"
  27932. "\n"
  27933. "L_sp_3072_mul_96_inner_%=: \n\t"
  27934. "ldr lr, [%[a], r3]\n\t"
  27935. "ldr r11, [%[b], r4]\n\t"
  27936. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27937. "lsl r9, lr, #16\n\t"
  27938. "lsl r10, r11, #16\n\t"
  27939. "lsr r9, r9, #16\n\t"
  27940. "lsr r10, r10, #16\n\t"
  27941. "mul r10, r9, r10\n\t"
  27942. "adds r6, r6, r10\n\t"
  27943. "adcs r7, r7, #0\n\t"
  27944. "adc r8, r8, #0\n\t"
  27945. "lsr r10, r11, #16\n\t"
  27946. "mul r9, r10, r9\n\t"
  27947. "lsr r10, r9, #16\n\t"
  27948. "lsl r9, r9, #16\n\t"
  27949. "adds r6, r6, r9\n\t"
  27950. "adcs r7, r7, r10\n\t"
  27951. "adc r8, r8, #0\n\t"
  27952. "lsr r9, lr, #16\n\t"
  27953. "lsr r10, r11, #16\n\t"
  27954. "mul r10, r9, r10\n\t"
  27955. "adds r7, r7, r10\n\t"
  27956. "adc r8, r8, #0\n\t"
  27957. "lsl r10, r11, #16\n\t"
  27958. "lsr r10, r10, #16\n\t"
  27959. "mul r9, r10, r9\n\t"
  27960. "lsr r10, r9, #16\n\t"
  27961. "lsl r9, r9, #16\n\t"
  27962. "adds r6, r6, r9\n\t"
  27963. "adcs r7, r7, r10\n\t"
  27964. "adc r8, r8, #0\n\t"
  27965. #else
  27966. "umull r9, r10, lr, r11\n\t"
  27967. "adds r6, r6, r9\n\t"
  27968. "adcs r7, r7, r10\n\t"
  27969. "adc r8, r8, #0\n\t"
  27970. #endif
  27971. "ldr lr, [%[a], r4]\n\t"
  27972. "ldr r11, [%[b], r3]\n\t"
  27973. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  27974. "lsl r9, lr, #16\n\t"
  27975. "lsl r10, r11, #16\n\t"
  27976. "lsr r9, r9, #16\n\t"
  27977. "lsr r10, r10, #16\n\t"
  27978. "mul r10, r9, r10\n\t"
  27979. "adds r6, r6, r10\n\t"
  27980. "adcs r7, r7, #0\n\t"
  27981. "adc r8, r8, #0\n\t"
  27982. "lsr r10, r11, #16\n\t"
  27983. "mul r9, r10, r9\n\t"
  27984. "lsr r10, r9, #16\n\t"
  27985. "lsl r9, r9, #16\n\t"
  27986. "adds r6, r6, r9\n\t"
  27987. "adcs r7, r7, r10\n\t"
  27988. "adc r8, r8, #0\n\t"
  27989. "lsr r9, lr, #16\n\t"
  27990. "lsr r10, r11, #16\n\t"
  27991. "mul r10, r9, r10\n\t"
  27992. "adds r7, r7, r10\n\t"
  27993. "adc r8, r8, #0\n\t"
  27994. "lsl r10, r11, #16\n\t"
  27995. "lsr r10, r10, #16\n\t"
  27996. "mul r9, r10, r9\n\t"
  27997. "lsr r10, r9, #16\n\t"
  27998. "lsl r9, r9, #16\n\t"
  27999. "adds r6, r6, r9\n\t"
  28000. "adcs r7, r7, r10\n\t"
  28001. "adc r8, r8, #0\n\t"
  28002. #else
  28003. "umull r9, r10, lr, r11\n\t"
  28004. "adds r6, r6, r9\n\t"
  28005. "adcs r7, r7, r10\n\t"
  28006. "adc r8, r8, #0\n\t"
  28007. #endif
  28008. "add r3, r3, #4\n\t"
  28009. "sub r4, r4, #4\n\t"
  28010. "cmp r3, r4\n\t"
  28011. "bgt L_sp_3072_mul_96_inner_done_%=\n\t"
  28012. "blt L_sp_3072_mul_96_inner_%=\n\t"
  28013. "ldr lr, [%[a], r3]\n\t"
  28014. "ldr r11, [%[b], r3]\n\t"
  28015. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28016. "lsl r9, lr, #16\n\t"
  28017. "lsl r10, r11, #16\n\t"
  28018. "lsr r9, r9, #16\n\t"
  28019. "lsr r10, r10, #16\n\t"
  28020. "mul r10, r9, r10\n\t"
  28021. "adds r6, r6, r10\n\t"
  28022. "adcs r7, r7, #0\n\t"
  28023. "adc r8, r8, #0\n\t"
  28024. "lsr r10, r11, #16\n\t"
  28025. "mul r9, r10, r9\n\t"
  28026. "lsr r10, r9, #16\n\t"
  28027. "lsl r9, r9, #16\n\t"
  28028. "adds r6, r6, r9\n\t"
  28029. "adcs r7, r7, r10\n\t"
  28030. "adc r8, r8, #0\n\t"
  28031. "lsr r9, lr, #16\n\t"
  28032. "lsr r10, r11, #16\n\t"
  28033. "mul r10, r9, r10\n\t"
  28034. "adds r7, r7, r10\n\t"
  28035. "adc r8, r8, #0\n\t"
  28036. "lsl r10, r11, #16\n\t"
  28037. "lsr r10, r10, #16\n\t"
  28038. "mul r9, r10, r9\n\t"
  28039. "lsr r10, r9, #16\n\t"
  28040. "lsl r9, r9, #16\n\t"
  28041. "adds r6, r6, r9\n\t"
  28042. "adcs r7, r7, r10\n\t"
  28043. "adc r8, r8, #0\n\t"
  28044. #else
  28045. "umull r9, r10, lr, r11\n\t"
  28046. "adds r6, r6, r9\n\t"
  28047. "adcs r7, r7, r10\n\t"
  28048. "adc r8, r8, #0\n\t"
  28049. #endif
  28050. "\n"
  28051. "L_sp_3072_mul_96_inner_done_%=: \n\t"
  28052. "str r6, [sp, r5]\n\t"
  28053. "mov r6, r7\n\t"
  28054. "mov r7, r8\n\t"
  28055. "mov r8, #0\n\t"
  28056. "add r5, r5, #4\n\t"
  28057. "cmp r5, #0x2f4\n\t"
  28058. "ble L_sp_3072_mul_96_outer_%=\n\t"
  28059. "ldr lr, [%[a], #380]\n\t"
  28060. "ldr r11, [%[b], #380]\n\t"
  28061. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28062. "lsl r9, lr, #16\n\t"
  28063. "lsl r10, r11, #16\n\t"
  28064. "lsr r9, r9, #16\n\t"
  28065. "lsr r10, r10, #16\n\t"
  28066. "mul r10, r9, r10\n\t"
  28067. "adds r6, r6, r10\n\t"
  28068. "adc r7, r7, #0\n\t"
  28069. "lsr r10, r11, #16\n\t"
  28070. "mul r9, r10, r9\n\t"
  28071. "lsr r10, r9, #16\n\t"
  28072. "lsl r9, r9, #16\n\t"
  28073. "adds r6, r6, r9\n\t"
  28074. "adc r7, r7, r10\n\t"
  28075. "lsr r9, lr, #16\n\t"
  28076. "lsr r10, r11, #16\n\t"
  28077. "mul r10, r9, r10\n\t"
  28078. "add r7, r7, r10\n\t"
  28079. "lsl r10, r11, #16\n\t"
  28080. "lsr r10, r10, #16\n\t"
  28081. "mul r9, r10, r9\n\t"
  28082. "lsr r10, r9, #16\n\t"
  28083. "lsl r9, r9, #16\n\t"
  28084. "adds r6, r6, r9\n\t"
  28085. "adc r7, r7, r10\n\t"
  28086. #else
  28087. "umlal r6, r7, lr, r11\n\t"
  28088. #endif
  28089. "str r6, [sp, r5]\n\t"
  28090. "add r5, r5, #4\n\t"
  28091. "str r7, [sp, r5]\n\t"
  28092. "\n"
  28093. "L_sp_3072_mul_96_store_%=: \n\t"
  28094. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28095. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28096. "subs r5, r5, #32\n\t"
  28097. "bgt L_sp_3072_mul_96_store_%=\n\t"
  28098. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  28099. :
  28100. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  28101. );
  28102. }
  28103. /* Square a and put result in r. (r = a * a)
  28104. *
  28105. * r A single precision integer.
  28106. * a A single precision integer.
  28107. */
  28108. static void sp_3072_sqr_96(sp_digit* r_p, const sp_digit* a_p)
  28109. {
  28110. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28111. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28112. __asm__ __volatile__ (
  28113. "sub sp, sp, #0x300\n\t"
  28114. "ldr lr, [%[a]]\n\t"
  28115. "umull r8, r6, lr, lr\n\t"
  28116. "str r8, [sp]\n\t"
  28117. "mov r7, #0\n\t"
  28118. "mov r8, #0\n\t"
  28119. "mov r5, #4\n\t"
  28120. "\n"
  28121. "L_sp_3072_sqr_96_outer_%=: \n\t"
  28122. "subs r3, r5, #0x17c\n\t"
  28123. "it cc\n\t"
  28124. "movcc r3, #0\n\t"
  28125. "sub r4, r5, r3\n\t"
  28126. "\n"
  28127. "L_sp_3072_sqr_96_inner_%=: \n\t"
  28128. "ldr lr, [%[a], r3]\n\t"
  28129. "ldr r11, [%[a], r4]\n\t"
  28130. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28131. "lsl r9, lr, #16\n\t"
  28132. "lsl r10, r11, #16\n\t"
  28133. "lsr r9, r9, #16\n\t"
  28134. "lsr r10, r10, #16\n\t"
  28135. "mul r10, r9, r10\n\t"
  28136. "adds r6, r6, r10\n\t"
  28137. "adcs r7, r7, #0\n\t"
  28138. "adc r8, r8, #0\n\t"
  28139. "adds r6, r6, r10\n\t"
  28140. "adcs r7, r7, #0\n\t"
  28141. "adc r8, r8, #0\n\t"
  28142. "lsr r10, r11, #16\n\t"
  28143. "mul r9, r10, r9\n\t"
  28144. "lsr r10, r9, #16\n\t"
  28145. "lsl r9, r9, #16\n\t"
  28146. "adds r6, r6, r9\n\t"
  28147. "adcs r7, r7, r10\n\t"
  28148. "adc r8, r8, #0\n\t"
  28149. "adds r6, r6, r9\n\t"
  28150. "adcs r7, r7, r10\n\t"
  28151. "adc r8, r8, #0\n\t"
  28152. "lsr r9, lr, #16\n\t"
  28153. "lsr r10, r11, #16\n\t"
  28154. "mul r10, r9, r10\n\t"
  28155. "adds r7, r7, r10\n\t"
  28156. "adc r8, r8, #0\n\t"
  28157. "adds r7, r7, r10\n\t"
  28158. "adc r8, r8, #0\n\t"
  28159. "lsl r10, r11, #16\n\t"
  28160. "lsr r10, r10, #16\n\t"
  28161. "mul r9, r10, r9\n\t"
  28162. "lsr r10, r9, #16\n\t"
  28163. "lsl r9, r9, #16\n\t"
  28164. "adds r6, r6, r9\n\t"
  28165. "adcs r7, r7, r10\n\t"
  28166. "adc r8, r8, #0\n\t"
  28167. "adds r6, r6, r9\n\t"
  28168. "adcs r7, r7, r10\n\t"
  28169. "adc r8, r8, #0\n\t"
  28170. #else
  28171. "umull r9, r10, lr, r11\n\t"
  28172. "adds r6, r6, r9\n\t"
  28173. "adcs r7, r7, r10\n\t"
  28174. "adc r8, r8, #0\n\t"
  28175. "adds r6, r6, r9\n\t"
  28176. "adcs r7, r7, r10\n\t"
  28177. "adc r8, r8, #0\n\t"
  28178. #endif
  28179. "add r3, r3, #4\n\t"
  28180. "sub r4, r4, #4\n\t"
  28181. "cmp r3, r4\n\t"
  28182. "bgt L_sp_3072_sqr_96_inner_done_%=\n\t"
  28183. "blt L_sp_3072_sqr_96_inner_%=\n\t"
  28184. "ldr lr, [%[a], r3]\n\t"
  28185. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28186. "lsl r9, lr, #16\n\t"
  28187. "lsr r10, lr, #16\n\t"
  28188. "lsr r9, r9, #16\n\t"
  28189. "mov r11, r9\n\t"
  28190. "mul r9, r11, r9\n\t"
  28191. "mov r11, r10\n\t"
  28192. "mul r10, r11, r10\n\t"
  28193. "adds r6, r6, r9\n\t"
  28194. "adcs r7, r7, r10\n\t"
  28195. "adc r8, r8, #0\n\t"
  28196. "lsr r10, lr, #16\n\t"
  28197. "lsl r9, lr, #16\n\t"
  28198. "lsr r9, r9, #16\n\t"
  28199. "mul r9, r10, r9\n\t"
  28200. "lsr r10, r9, #15\n\t"
  28201. "lsl r9, r9, #17\n\t"
  28202. "adds r6, r6, r9\n\t"
  28203. "adcs r7, r7, r10\n\t"
  28204. "adc r8, r8, #0\n\t"
  28205. #else
  28206. "umull r9, r10, lr, lr\n\t"
  28207. "adds r6, r6, r9\n\t"
  28208. "adcs r7, r7, r10\n\t"
  28209. "adc r8, r8, #0\n\t"
  28210. #endif
  28211. "\n"
  28212. "L_sp_3072_sqr_96_inner_done_%=: \n\t"
  28213. "str r6, [sp, r5]\n\t"
  28214. "mov r6, r7\n\t"
  28215. "mov r7, r8\n\t"
  28216. "mov r8, #0\n\t"
  28217. "add r5, r5, #4\n\t"
  28218. "cmp r5, #0x2f4\n\t"
  28219. "ble L_sp_3072_sqr_96_outer_%=\n\t"
  28220. "ldr lr, [%[a], #380]\n\t"
  28221. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28222. "lsl r9, lr, #16\n\t"
  28223. "lsr r10, lr, #16\n\t"
  28224. "lsr r9, r9, #16\n\t"
  28225. "mov r11, r9\n\t"
  28226. "mul r9, r11, r9\n\t"
  28227. "mov r11, r10\n\t"
  28228. "mul r10, r11, r10\n\t"
  28229. "adds r6, r6, r9\n\t"
  28230. "adc r7, r7, r10\n\t"
  28231. "lsr r10, lr, #16\n\t"
  28232. "lsl r9, lr, #16\n\t"
  28233. "lsr r9, r9, #16\n\t"
  28234. "mul r9, r10, r9\n\t"
  28235. "lsr r10, r9, #15\n\t"
  28236. "lsl r9, r9, #17\n\t"
  28237. "adds r6, r6, r9\n\t"
  28238. "adc r7, r7, r10\n\t"
  28239. #else
  28240. "umull r9, r10, lr, lr\n\t"
  28241. "adds r6, r6, r9\n\t"
  28242. "adc r7, r7, r10\n\t"
  28243. #endif
  28244. "str r6, [sp, r5]\n\t"
  28245. "add r5, r5, #4\n\t"
  28246. "str r7, [sp, r5]\n\t"
  28247. "\n"
  28248. "L_sp_3072_sqr_96_store_%=: \n\t"
  28249. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28250. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28251. "subs r5, r5, #32\n\t"
  28252. "bgt L_sp_3072_sqr_96_store_%=\n\t"
  28253. : [r] "+r" (r), [a] "+r" (a)
  28254. :
  28255. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  28256. );
  28257. }
  28258. #endif /* WOLFSSL_SP_SMALL */
  28259. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  28260. #ifdef WOLFSSL_SP_SMALL
  28261. /* AND m into each word of a and store in r.
  28262. *
  28263. * r A single precision integer.
  28264. * a A single precision integer.
  28265. * m Mask to AND against each digit.
  28266. */
  28267. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  28268. {
  28269. int i;
  28270. for (i=0; i<48; i++) {
  28271. r[i] = a[i] & m;
  28272. }
  28273. }
  28274. #endif /* WOLFSSL_SP_SMALL */
  28275. #ifdef WOLFSSL_SP_SMALL
  28276. /* Add b to a into r. (r = a + b)
  28277. *
  28278. * r A single precision integer.
  28279. * a A single precision integer.
  28280. * b A single precision integer.
  28281. */
  28282. static sp_digit sp_3072_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  28283. {
  28284. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28285. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28286. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  28287. __asm__ __volatile__ (
  28288. "mov r3, #0\n\t"
  28289. "add r12, %[a], #0xc0\n\t"
  28290. "\n"
  28291. "L_sp_3072_add_48_word_%=: \n\t"
  28292. "adds r3, r3, #-1\n\t"
  28293. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  28294. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  28295. "adcs r4, r4, r8\n\t"
  28296. "adcs r5, r5, r9\n\t"
  28297. "adcs r6, r6, r10\n\t"
  28298. "adcs r7, r7, r11\n\t"
  28299. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  28300. "mov r4, #0\n\t"
  28301. "adc r3, r4, #0\n\t"
  28302. "cmp %[a], r12\n\t"
  28303. "bne L_sp_3072_add_48_word_%=\n\t"
  28304. "mov %[r], r3\n\t"
  28305. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  28306. :
  28307. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  28308. );
  28309. return (uint32_t)(size_t)r;
  28310. }
  28311. #endif /* WOLFSSL_SP_SMALL */
  28312. #ifdef WOLFSSL_SP_SMALL
  28313. /* Sub b from a into a. (a -= b)
  28314. *
  28315. * a A single precision integer.
  28316. * b A single precision integer.
  28317. */
  28318. static sp_digit sp_3072_sub_in_place_48(sp_digit* a_p, const sp_digit* b_p)
  28319. {
  28320. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  28321. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  28322. __asm__ __volatile__ (
  28323. "mov r12, #0\n\t"
  28324. "add lr, %[a], #0xc0\n\t"
  28325. "\n"
  28326. "L_sp_3072_sub_in_pkace_48_word_%=: \n\t"
  28327. "rsbs r12, r12, #0\n\t"
  28328. "ldm %[a], {r2, r3, r4, r5}\n\t"
  28329. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  28330. "sbcs r2, r2, r6\n\t"
  28331. "sbcs r3, r3, r7\n\t"
  28332. "sbcs r4, r4, r8\n\t"
  28333. "sbcs r5, r5, r9\n\t"
  28334. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  28335. "sbc r12, r12, r12\n\t"
  28336. "cmp %[a], lr\n\t"
  28337. "bne L_sp_3072_sub_in_pkace_48_word_%=\n\t"
  28338. "mov %[a], r12\n\t"
  28339. : [a] "+r" (a), [b] "+r" (b)
  28340. :
  28341. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  28342. );
  28343. return (uint32_t)(size_t)a;
  28344. }
  28345. #endif /* WOLFSSL_SP_SMALL */
  28346. #ifdef WOLFSSL_SP_SMALL
  28347. /* Multiply a and b into r. (r = a * b)
  28348. *
  28349. * r A single precision integer.
  28350. * a A single precision integer.
  28351. * b A single precision integer.
  28352. */
  28353. static void sp_3072_mul_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  28354. {
  28355. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28356. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28357. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  28358. __asm__ __volatile__ (
  28359. "sub sp, sp, #0x180\n\t"
  28360. "ldr lr, [%[a]]\n\t"
  28361. "ldr r11, [%[b]]\n\t"
  28362. "umull r8, r6, lr, r11\n\t"
  28363. "str r8, [sp]\n\t"
  28364. "mov r7, #0\n\t"
  28365. "mov r8, #0\n\t"
  28366. "mov r5, #4\n\t"
  28367. "\n"
  28368. "L_sp_3072_mul_48_outer_%=: \n\t"
  28369. "subs r3, r5, #0xbc\n\t"
  28370. "it cc\n\t"
  28371. "movcc r3, #0\n\t"
  28372. "sub r4, r5, r3\n\t"
  28373. "\n"
  28374. "L_sp_3072_mul_48_inner_%=: \n\t"
  28375. "ldr lr, [%[a], r3]\n\t"
  28376. "ldr r11, [%[b], r4]\n\t"
  28377. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28378. "lsl r9, lr, #16\n\t"
  28379. "lsl r10, r11, #16\n\t"
  28380. "lsr r9, r9, #16\n\t"
  28381. "lsr r10, r10, #16\n\t"
  28382. "mul r10, r9, r10\n\t"
  28383. "adds r6, r6, r10\n\t"
  28384. "adcs r7, r7, #0\n\t"
  28385. "adc r8, r8, #0\n\t"
  28386. "lsr r10, r11, #16\n\t"
  28387. "mul r9, r10, r9\n\t"
  28388. "lsr r10, r9, #16\n\t"
  28389. "lsl r9, r9, #16\n\t"
  28390. "adds r6, r6, r9\n\t"
  28391. "adcs r7, r7, r10\n\t"
  28392. "adc r8, r8, #0\n\t"
  28393. "lsr r9, lr, #16\n\t"
  28394. "lsr r10, r11, #16\n\t"
  28395. "mul r10, r9, r10\n\t"
  28396. "adds r7, r7, r10\n\t"
  28397. "adc r8, r8, #0\n\t"
  28398. "lsl r10, r11, #16\n\t"
  28399. "lsr r10, r10, #16\n\t"
  28400. "mul r9, r10, r9\n\t"
  28401. "lsr r10, r9, #16\n\t"
  28402. "lsl r9, r9, #16\n\t"
  28403. "adds r6, r6, r9\n\t"
  28404. "adcs r7, r7, r10\n\t"
  28405. "adc r8, r8, #0\n\t"
  28406. #else
  28407. "umull r9, r10, lr, r11\n\t"
  28408. "adds r6, r6, r9\n\t"
  28409. "adcs r7, r7, r10\n\t"
  28410. "adc r8, r8, #0\n\t"
  28411. #endif
  28412. "ldr lr, [%[a], r4]\n\t"
  28413. "ldr r11, [%[b], r3]\n\t"
  28414. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28415. "lsl r9, lr, #16\n\t"
  28416. "lsl r10, r11, #16\n\t"
  28417. "lsr r9, r9, #16\n\t"
  28418. "lsr r10, r10, #16\n\t"
  28419. "mul r10, r9, r10\n\t"
  28420. "adds r6, r6, r10\n\t"
  28421. "adcs r7, r7, #0\n\t"
  28422. "adc r8, r8, #0\n\t"
  28423. "lsr r10, r11, #16\n\t"
  28424. "mul r9, r10, r9\n\t"
  28425. "lsr r10, r9, #16\n\t"
  28426. "lsl r9, r9, #16\n\t"
  28427. "adds r6, r6, r9\n\t"
  28428. "adcs r7, r7, r10\n\t"
  28429. "adc r8, r8, #0\n\t"
  28430. "lsr r9, lr, #16\n\t"
  28431. "lsr r10, r11, #16\n\t"
  28432. "mul r10, r9, r10\n\t"
  28433. "adds r7, r7, r10\n\t"
  28434. "adc r8, r8, #0\n\t"
  28435. "lsl r10, r11, #16\n\t"
  28436. "lsr r10, r10, #16\n\t"
  28437. "mul r9, r10, r9\n\t"
  28438. "lsr r10, r9, #16\n\t"
  28439. "lsl r9, r9, #16\n\t"
  28440. "adds r6, r6, r9\n\t"
  28441. "adcs r7, r7, r10\n\t"
  28442. "adc r8, r8, #0\n\t"
  28443. #else
  28444. "umull r9, r10, lr, r11\n\t"
  28445. "adds r6, r6, r9\n\t"
  28446. "adcs r7, r7, r10\n\t"
  28447. "adc r8, r8, #0\n\t"
  28448. #endif
  28449. "add r3, r3, #4\n\t"
  28450. "sub r4, r4, #4\n\t"
  28451. "cmp r3, r4\n\t"
  28452. "bgt L_sp_3072_mul_48_inner_done_%=\n\t"
  28453. "blt L_sp_3072_mul_48_inner_%=\n\t"
  28454. "ldr lr, [%[a], r3]\n\t"
  28455. "ldr r11, [%[b], r3]\n\t"
  28456. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28457. "lsl r9, lr, #16\n\t"
  28458. "lsl r10, r11, #16\n\t"
  28459. "lsr r9, r9, #16\n\t"
  28460. "lsr r10, r10, #16\n\t"
  28461. "mul r10, r9, r10\n\t"
  28462. "adds r6, r6, r10\n\t"
  28463. "adcs r7, r7, #0\n\t"
  28464. "adc r8, r8, #0\n\t"
  28465. "lsr r10, r11, #16\n\t"
  28466. "mul r9, r10, r9\n\t"
  28467. "lsr r10, r9, #16\n\t"
  28468. "lsl r9, r9, #16\n\t"
  28469. "adds r6, r6, r9\n\t"
  28470. "adcs r7, r7, r10\n\t"
  28471. "adc r8, r8, #0\n\t"
  28472. "lsr r9, lr, #16\n\t"
  28473. "lsr r10, r11, #16\n\t"
  28474. "mul r10, r9, r10\n\t"
  28475. "adds r7, r7, r10\n\t"
  28476. "adc r8, r8, #0\n\t"
  28477. "lsl r10, r11, #16\n\t"
  28478. "lsr r10, r10, #16\n\t"
  28479. "mul r9, r10, r9\n\t"
  28480. "lsr r10, r9, #16\n\t"
  28481. "lsl r9, r9, #16\n\t"
  28482. "adds r6, r6, r9\n\t"
  28483. "adcs r7, r7, r10\n\t"
  28484. "adc r8, r8, #0\n\t"
  28485. #else
  28486. "umull r9, r10, lr, r11\n\t"
  28487. "adds r6, r6, r9\n\t"
  28488. "adcs r7, r7, r10\n\t"
  28489. "adc r8, r8, #0\n\t"
  28490. #endif
  28491. "\n"
  28492. "L_sp_3072_mul_48_inner_done_%=: \n\t"
  28493. "str r6, [sp, r5]\n\t"
  28494. "mov r6, r7\n\t"
  28495. "mov r7, r8\n\t"
  28496. "mov r8, #0\n\t"
  28497. "add r5, r5, #4\n\t"
  28498. "cmp r5, #0x174\n\t"
  28499. "ble L_sp_3072_mul_48_outer_%=\n\t"
  28500. "ldr lr, [%[a], #188]\n\t"
  28501. "ldr r11, [%[b], #188]\n\t"
  28502. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28503. "lsl r9, lr, #16\n\t"
  28504. "lsl r10, r11, #16\n\t"
  28505. "lsr r9, r9, #16\n\t"
  28506. "lsr r10, r10, #16\n\t"
  28507. "mul r10, r9, r10\n\t"
  28508. "adds r6, r6, r10\n\t"
  28509. "adc r7, r7, #0\n\t"
  28510. "lsr r10, r11, #16\n\t"
  28511. "mul r9, r10, r9\n\t"
  28512. "lsr r10, r9, #16\n\t"
  28513. "lsl r9, r9, #16\n\t"
  28514. "adds r6, r6, r9\n\t"
  28515. "adc r7, r7, r10\n\t"
  28516. "lsr r9, lr, #16\n\t"
  28517. "lsr r10, r11, #16\n\t"
  28518. "mul r10, r9, r10\n\t"
  28519. "add r7, r7, r10\n\t"
  28520. "lsl r10, r11, #16\n\t"
  28521. "lsr r10, r10, #16\n\t"
  28522. "mul r9, r10, r9\n\t"
  28523. "lsr r10, r9, #16\n\t"
  28524. "lsl r9, r9, #16\n\t"
  28525. "adds r6, r6, r9\n\t"
  28526. "adc r7, r7, r10\n\t"
  28527. #else
  28528. "umlal r6, r7, lr, r11\n\t"
  28529. #endif
  28530. "str r6, [sp, r5]\n\t"
  28531. "add r5, r5, #4\n\t"
  28532. "str r7, [sp, r5]\n\t"
  28533. "\n"
  28534. "L_sp_3072_mul_48_store_%=: \n\t"
  28535. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28536. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28537. "subs r5, r5, #32\n\t"
  28538. "bgt L_sp_3072_mul_48_store_%=\n\t"
  28539. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  28540. :
  28541. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  28542. );
  28543. }
  28544. /* Square a and put result in r. (r = a * a)
  28545. *
  28546. * r A single precision integer.
  28547. * a A single precision integer.
  28548. */
  28549. static void sp_3072_sqr_48(sp_digit* r_p, const sp_digit* a_p)
  28550. {
  28551. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28552. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28553. __asm__ __volatile__ (
  28554. "sub sp, sp, #0x180\n\t"
  28555. "ldr lr, [%[a]]\n\t"
  28556. "umull r8, r6, lr, lr\n\t"
  28557. "str r8, [sp]\n\t"
  28558. "mov r7, #0\n\t"
  28559. "mov r8, #0\n\t"
  28560. "mov r5, #4\n\t"
  28561. "\n"
  28562. "L_sp_3072_sqr_48_outer_%=: \n\t"
  28563. "subs r3, r5, #0xbc\n\t"
  28564. "it cc\n\t"
  28565. "movcc r3, #0\n\t"
  28566. "sub r4, r5, r3\n\t"
  28567. "\n"
  28568. "L_sp_3072_sqr_48_inner_%=: \n\t"
  28569. "ldr lr, [%[a], r3]\n\t"
  28570. "ldr r11, [%[a], r4]\n\t"
  28571. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28572. "lsl r9, lr, #16\n\t"
  28573. "lsl r10, r11, #16\n\t"
  28574. "lsr r9, r9, #16\n\t"
  28575. "lsr r10, r10, #16\n\t"
  28576. "mul r10, r9, r10\n\t"
  28577. "adds r6, r6, r10\n\t"
  28578. "adcs r7, r7, #0\n\t"
  28579. "adc r8, r8, #0\n\t"
  28580. "adds r6, r6, r10\n\t"
  28581. "adcs r7, r7, #0\n\t"
  28582. "adc r8, r8, #0\n\t"
  28583. "lsr r10, r11, #16\n\t"
  28584. "mul r9, r10, r9\n\t"
  28585. "lsr r10, r9, #16\n\t"
  28586. "lsl r9, r9, #16\n\t"
  28587. "adds r6, r6, r9\n\t"
  28588. "adcs r7, r7, r10\n\t"
  28589. "adc r8, r8, #0\n\t"
  28590. "adds r6, r6, r9\n\t"
  28591. "adcs r7, r7, r10\n\t"
  28592. "adc r8, r8, #0\n\t"
  28593. "lsr r9, lr, #16\n\t"
  28594. "lsr r10, r11, #16\n\t"
  28595. "mul r10, r9, r10\n\t"
  28596. "adds r7, r7, r10\n\t"
  28597. "adc r8, r8, #0\n\t"
  28598. "adds r7, r7, r10\n\t"
  28599. "adc r8, r8, #0\n\t"
  28600. "lsl r10, r11, #16\n\t"
  28601. "lsr r10, r10, #16\n\t"
  28602. "mul r9, r10, r9\n\t"
  28603. "lsr r10, r9, #16\n\t"
  28604. "lsl r9, r9, #16\n\t"
  28605. "adds r6, r6, r9\n\t"
  28606. "adcs r7, r7, r10\n\t"
  28607. "adc r8, r8, #0\n\t"
  28608. "adds r6, r6, r9\n\t"
  28609. "adcs r7, r7, r10\n\t"
  28610. "adc r8, r8, #0\n\t"
  28611. #else
  28612. "umull r9, r10, lr, r11\n\t"
  28613. "adds r6, r6, r9\n\t"
  28614. "adcs r7, r7, r10\n\t"
  28615. "adc r8, r8, #0\n\t"
  28616. "adds r6, r6, r9\n\t"
  28617. "adcs r7, r7, r10\n\t"
  28618. "adc r8, r8, #0\n\t"
  28619. #endif
  28620. "add r3, r3, #4\n\t"
  28621. "sub r4, r4, #4\n\t"
  28622. "cmp r3, r4\n\t"
  28623. "bgt L_sp_3072_sqr_48_inner_done_%=\n\t"
  28624. "blt L_sp_3072_sqr_48_inner_%=\n\t"
  28625. "ldr lr, [%[a], r3]\n\t"
  28626. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28627. "lsl r9, lr, #16\n\t"
  28628. "lsr r10, lr, #16\n\t"
  28629. "lsr r9, r9, #16\n\t"
  28630. "mov r11, r9\n\t"
  28631. "mul r9, r11, r9\n\t"
  28632. "mov r11, r10\n\t"
  28633. "mul r10, r11, r10\n\t"
  28634. "adds r6, r6, r9\n\t"
  28635. "adcs r7, r7, r10\n\t"
  28636. "adc r8, r8, #0\n\t"
  28637. "lsr r10, lr, #16\n\t"
  28638. "lsl r9, lr, #16\n\t"
  28639. "lsr r9, r9, #16\n\t"
  28640. "mul r9, r10, r9\n\t"
  28641. "lsr r10, r9, #15\n\t"
  28642. "lsl r9, r9, #17\n\t"
  28643. "adds r6, r6, r9\n\t"
  28644. "adcs r7, r7, r10\n\t"
  28645. "adc r8, r8, #0\n\t"
  28646. #else
  28647. "umull r9, r10, lr, lr\n\t"
  28648. "adds r6, r6, r9\n\t"
  28649. "adcs r7, r7, r10\n\t"
  28650. "adc r8, r8, #0\n\t"
  28651. #endif
  28652. "\n"
  28653. "L_sp_3072_sqr_48_inner_done_%=: \n\t"
  28654. "str r6, [sp, r5]\n\t"
  28655. "mov r6, r7\n\t"
  28656. "mov r7, r8\n\t"
  28657. "mov r8, #0\n\t"
  28658. "add r5, r5, #4\n\t"
  28659. "cmp r5, #0x174\n\t"
  28660. "ble L_sp_3072_sqr_48_outer_%=\n\t"
  28661. "ldr lr, [%[a], #188]\n\t"
  28662. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28663. "lsl r9, lr, #16\n\t"
  28664. "lsr r10, lr, #16\n\t"
  28665. "lsr r9, r9, #16\n\t"
  28666. "mov r11, r9\n\t"
  28667. "mul r9, r11, r9\n\t"
  28668. "mov r11, r10\n\t"
  28669. "mul r10, r11, r10\n\t"
  28670. "adds r6, r6, r9\n\t"
  28671. "adc r7, r7, r10\n\t"
  28672. "lsr r10, lr, #16\n\t"
  28673. "lsl r9, lr, #16\n\t"
  28674. "lsr r9, r9, #16\n\t"
  28675. "mul r9, r10, r9\n\t"
  28676. "lsr r10, r9, #15\n\t"
  28677. "lsl r9, r9, #17\n\t"
  28678. "adds r6, r6, r9\n\t"
  28679. "adc r7, r7, r10\n\t"
  28680. #else
  28681. "umull r9, r10, lr, lr\n\t"
  28682. "adds r6, r6, r9\n\t"
  28683. "adc r7, r7, r10\n\t"
  28684. #endif
  28685. "str r6, [sp, r5]\n\t"
  28686. "add r5, r5, #4\n\t"
  28687. "str r7, [sp, r5]\n\t"
  28688. "\n"
  28689. "L_sp_3072_sqr_48_store_%=: \n\t"
  28690. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28691. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  28692. "subs r5, r5, #32\n\t"
  28693. "bgt L_sp_3072_sqr_48_store_%=\n\t"
  28694. : [r] "+r" (r), [a] "+r" (a)
  28695. :
  28696. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  28697. );
  28698. }
  28699. #endif /* WOLFSSL_SP_SMALL */
  28700. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  28701. /* Calculate the bottom digit of -1/a mod 2^n.
  28702. *
  28703. * a A single precision number.
  28704. * rho Bottom word of inverse.
  28705. */
  28706. static void sp_3072_mont_setup(const sp_digit* a, sp_digit* rho)
  28707. {
  28708. sp_digit x;
  28709. sp_digit b;
  28710. b = a[0];
  28711. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  28712. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  28713. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  28714. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  28715. /* rho = -1/m mod b */
  28716. *rho = (sp_digit)0 - x;
  28717. }
  28718. #ifdef WOLFSSL_SP_SMALL
  28719. /* Mul a by digit b into r. (r = a * b)
  28720. *
  28721. * r A single precision integer.
  28722. * a A single precision integer.
  28723. * b A single precision digit.
  28724. */
  28725. static void sp_3072_mul_d_96(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  28726. {
  28727. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28728. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28729. register sp_digit b asm ("r2") = (sp_digit)b_p;
  28730. __asm__ __volatile__ (
  28731. /* A[0] * B */
  28732. "ldr r8, [%[a]]\n\t"
  28733. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28734. "lsl r6, %[b], #16\n\t"
  28735. "lsl r5, r8, #16\n\t"
  28736. "lsr r6, r6, #16\n\t"
  28737. "lsr r5, r5, #16\n\t"
  28738. "mul r5, r6, r5\n\t"
  28739. "lsr r7, r8, #16\n\t"
  28740. "mul r6, r7, r6\n\t"
  28741. "lsr r3, r6, #16\n\t"
  28742. "lsl r6, r6, #16\n\t"
  28743. "adds r5, r5, r6\n\t"
  28744. "adc r3, r3, #0\n\t"
  28745. "lsr r6, %[b], #16\n\t"
  28746. "mul r7, r6, r7\n\t"
  28747. "add r3, r3, r7\n\t"
  28748. "lsl r7, r8, #16\n\t"
  28749. "lsr r7, r7, #16\n\t"
  28750. "mul r6, r7, r6\n\t"
  28751. "lsr r7, r6, #16\n\t"
  28752. "lsl r6, r6, #16\n\t"
  28753. "adds r5, r5, r6\n\t"
  28754. "adc r3, r3, r7\n\t"
  28755. #else
  28756. "umull r5, r3, %[b], r8\n\t"
  28757. #endif
  28758. "mov r4, #0\n\t"
  28759. "str r5, [%[r]]\n\t"
  28760. "mov r5, #0\n\t"
  28761. "mov r9, #4\n\t"
  28762. "\n"
  28763. "L_sp_3072_mul_d_96_word_%=: \n\t"
  28764. /* A[i] * B */
  28765. "ldr r8, [%[a], r9]\n\t"
  28766. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28767. "lsl r6, %[b], #16\n\t"
  28768. "lsl r7, r8, #16\n\t"
  28769. "lsr r6, r6, #16\n\t"
  28770. "lsr r7, r7, #16\n\t"
  28771. "mul r7, r6, r7\n\t"
  28772. "adds r3, r3, r7\n\t"
  28773. "adcs r4, r4, #0\n\t"
  28774. "adc r5, r5, #0\n\t"
  28775. "lsr r7, r8, #16\n\t"
  28776. "mul r6, r7, r6\n\t"
  28777. "lsr r7, r6, #16\n\t"
  28778. "lsl r6, r6, #16\n\t"
  28779. "adds r3, r3, r6\n\t"
  28780. "adcs r4, r4, r7\n\t"
  28781. "adc r5, r5, #0\n\t"
  28782. "lsr r6, %[b], #16\n\t"
  28783. "lsr r7, r8, #16\n\t"
  28784. "mul r7, r6, r7\n\t"
  28785. "adds r4, r4, r7\n\t"
  28786. "adc r5, r5, #0\n\t"
  28787. "lsl r7, r8, #16\n\t"
  28788. "lsr r7, r7, #16\n\t"
  28789. "mul r6, r7, r6\n\t"
  28790. "lsr r7, r6, #16\n\t"
  28791. "lsl r6, r6, #16\n\t"
  28792. "adds r3, r3, r6\n\t"
  28793. "adcs r4, r4, r7\n\t"
  28794. "adc r5, r5, #0\n\t"
  28795. #else
  28796. "umull r6, r7, %[b], r8\n\t"
  28797. "adds r3, r3, r6\n\t"
  28798. "adcs r4, r4, r7\n\t"
  28799. "adc r5, r5, #0\n\t"
  28800. #endif
  28801. "str r3, [%[r], r9]\n\t"
  28802. "mov r3, r4\n\t"
  28803. "mov r4, r5\n\t"
  28804. "mov r5, #0\n\t"
  28805. "add r9, r9, #4\n\t"
  28806. "cmp r9, #0x180\n\t"
  28807. "blt L_sp_3072_mul_d_96_word_%=\n\t"
  28808. "str r3, [%[r], #384]\n\t"
  28809. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  28810. :
  28811. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  28812. );
  28813. }
  28814. #else
  28815. /* Mul a by digit b into r. (r = a * b)
  28816. *
  28817. * r A single precision integer.
  28818. * a A single precision integer.
  28819. * b A single precision digit.
  28820. */
  28821. static void sp_3072_mul_d_96(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  28822. {
  28823. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  28824. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  28825. register sp_digit b asm ("r2") = (sp_digit)b_p;
  28826. __asm__ __volatile__ (
  28827. /* A[0] * B */
  28828. "ldm %[a]!, {r8}\n\t"
  28829. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28830. "lsl r6, %[b], #16\n\t"
  28831. "lsl r3, r8, #16\n\t"
  28832. "lsr r6, r6, #16\n\t"
  28833. "lsr r3, r3, #16\n\t"
  28834. "mul r3, r6, r3\n\t"
  28835. "lsr r7, r8, #16\n\t"
  28836. "mul r6, r7, r6\n\t"
  28837. "lsr r4, r6, #16\n\t"
  28838. "lsl r6, r6, #16\n\t"
  28839. "adds r3, r3, r6\n\t"
  28840. "adc r4, r4, #0\n\t"
  28841. "lsr r6, %[b], #16\n\t"
  28842. "mul r7, r6, r7\n\t"
  28843. "add r4, r4, r7\n\t"
  28844. "lsl r7, r8, #16\n\t"
  28845. "lsr r7, r7, #16\n\t"
  28846. "mul r6, r7, r6\n\t"
  28847. "lsr r7, r6, #16\n\t"
  28848. "lsl r6, r6, #16\n\t"
  28849. "adds r3, r3, r6\n\t"
  28850. "adc r4, r4, r7\n\t"
  28851. #else
  28852. "umull r3, r4, %[b], r8\n\t"
  28853. #endif
  28854. "stm %[r]!, {r3}\n\t"
  28855. "mov r5, #0\n\t"
  28856. /* A[1] * B */
  28857. "ldm %[a]!, {r8}\n\t"
  28858. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28859. "lsl r6, %[b], #16\n\t"
  28860. "lsl r7, r8, #16\n\t"
  28861. "lsr r6, r6, #16\n\t"
  28862. "lsr r7, r7, #16\n\t"
  28863. "mul r7, r6, r7\n\t"
  28864. "adds r4, r4, r7\n\t"
  28865. "adc r5, r5, #0\n\t"
  28866. "lsr r7, r8, #16\n\t"
  28867. "mul r6, r7, r6\n\t"
  28868. "lsr r7, r6, #16\n\t"
  28869. "lsl r6, r6, #16\n\t"
  28870. "adds r4, r4, r6\n\t"
  28871. "adc r5, r5, r7\n\t"
  28872. "lsr r6, %[b], #16\n\t"
  28873. "lsr r7, r8, #16\n\t"
  28874. "mul r7, r6, r7\n\t"
  28875. "add r5, r5, r7\n\t"
  28876. "lsl r7, r8, #16\n\t"
  28877. "lsr r7, r7, #16\n\t"
  28878. "mul r6, r7, r6\n\t"
  28879. "lsr r7, r6, #16\n\t"
  28880. "lsl r6, r6, #16\n\t"
  28881. "adds r4, r4, r6\n\t"
  28882. "adc r5, r5, r7\n\t"
  28883. #else
  28884. "umlal r4, r5, %[b], r8\n\t"
  28885. #endif
  28886. "stm %[r]!, {r4}\n\t"
  28887. "mov r3, #0\n\t"
  28888. /* A[2] * B */
  28889. "ldm %[a]!, {r8}\n\t"
  28890. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28891. "lsl r6, %[b], #16\n\t"
  28892. "lsl r7, r8, #16\n\t"
  28893. "lsr r6, r6, #16\n\t"
  28894. "lsr r7, r7, #16\n\t"
  28895. "mul r7, r6, r7\n\t"
  28896. "adds r5, r5, r7\n\t"
  28897. "adc r3, r3, #0\n\t"
  28898. "lsr r7, r8, #16\n\t"
  28899. "mul r6, r7, r6\n\t"
  28900. "lsr r7, r6, #16\n\t"
  28901. "lsl r6, r6, #16\n\t"
  28902. "adds r5, r5, r6\n\t"
  28903. "adc r3, r3, r7\n\t"
  28904. "lsr r6, %[b], #16\n\t"
  28905. "lsr r7, r8, #16\n\t"
  28906. "mul r7, r6, r7\n\t"
  28907. "add r3, r3, r7\n\t"
  28908. "lsl r7, r8, #16\n\t"
  28909. "lsr r7, r7, #16\n\t"
  28910. "mul r6, r7, r6\n\t"
  28911. "lsr r7, r6, #16\n\t"
  28912. "lsl r6, r6, #16\n\t"
  28913. "adds r5, r5, r6\n\t"
  28914. "adc r3, r3, r7\n\t"
  28915. #else
  28916. "umlal r5, r3, %[b], r8\n\t"
  28917. #endif
  28918. "stm %[r]!, {r5}\n\t"
  28919. "mov r4, #0\n\t"
  28920. /* A[3] * B */
  28921. "ldm %[a]!, {r8}\n\t"
  28922. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28923. "lsl r6, %[b], #16\n\t"
  28924. "lsl r7, r8, #16\n\t"
  28925. "lsr r6, r6, #16\n\t"
  28926. "lsr r7, r7, #16\n\t"
  28927. "mul r7, r6, r7\n\t"
  28928. "adds r3, r3, r7\n\t"
  28929. "adc r4, r4, #0\n\t"
  28930. "lsr r7, r8, #16\n\t"
  28931. "mul r6, r7, r6\n\t"
  28932. "lsr r7, r6, #16\n\t"
  28933. "lsl r6, r6, #16\n\t"
  28934. "adds r3, r3, r6\n\t"
  28935. "adc r4, r4, r7\n\t"
  28936. "lsr r6, %[b], #16\n\t"
  28937. "lsr r7, r8, #16\n\t"
  28938. "mul r7, r6, r7\n\t"
  28939. "add r4, r4, r7\n\t"
  28940. "lsl r7, r8, #16\n\t"
  28941. "lsr r7, r7, #16\n\t"
  28942. "mul r6, r7, r6\n\t"
  28943. "lsr r7, r6, #16\n\t"
  28944. "lsl r6, r6, #16\n\t"
  28945. "adds r3, r3, r6\n\t"
  28946. "adc r4, r4, r7\n\t"
  28947. #else
  28948. "umlal r3, r4, %[b], r8\n\t"
  28949. #endif
  28950. "stm %[r]!, {r3}\n\t"
  28951. "mov r5, #0\n\t"
  28952. /* A[4] * B */
  28953. "ldm %[a]!, {r8}\n\t"
  28954. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28955. "lsl r6, %[b], #16\n\t"
  28956. "lsl r7, r8, #16\n\t"
  28957. "lsr r6, r6, #16\n\t"
  28958. "lsr r7, r7, #16\n\t"
  28959. "mul r7, r6, r7\n\t"
  28960. "adds r4, r4, r7\n\t"
  28961. "adc r5, r5, #0\n\t"
  28962. "lsr r7, r8, #16\n\t"
  28963. "mul r6, r7, r6\n\t"
  28964. "lsr r7, r6, #16\n\t"
  28965. "lsl r6, r6, #16\n\t"
  28966. "adds r4, r4, r6\n\t"
  28967. "adc r5, r5, r7\n\t"
  28968. "lsr r6, %[b], #16\n\t"
  28969. "lsr r7, r8, #16\n\t"
  28970. "mul r7, r6, r7\n\t"
  28971. "add r5, r5, r7\n\t"
  28972. "lsl r7, r8, #16\n\t"
  28973. "lsr r7, r7, #16\n\t"
  28974. "mul r6, r7, r6\n\t"
  28975. "lsr r7, r6, #16\n\t"
  28976. "lsl r6, r6, #16\n\t"
  28977. "adds r4, r4, r6\n\t"
  28978. "adc r5, r5, r7\n\t"
  28979. #else
  28980. "umlal r4, r5, %[b], r8\n\t"
  28981. #endif
  28982. "stm %[r]!, {r4}\n\t"
  28983. "mov r3, #0\n\t"
  28984. /* A[5] * B */
  28985. "ldm %[a]!, {r8}\n\t"
  28986. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  28987. "lsl r6, %[b], #16\n\t"
  28988. "lsl r7, r8, #16\n\t"
  28989. "lsr r6, r6, #16\n\t"
  28990. "lsr r7, r7, #16\n\t"
  28991. "mul r7, r6, r7\n\t"
  28992. "adds r5, r5, r7\n\t"
  28993. "adc r3, r3, #0\n\t"
  28994. "lsr r7, r8, #16\n\t"
  28995. "mul r6, r7, r6\n\t"
  28996. "lsr r7, r6, #16\n\t"
  28997. "lsl r6, r6, #16\n\t"
  28998. "adds r5, r5, r6\n\t"
  28999. "adc r3, r3, r7\n\t"
  29000. "lsr r6, %[b], #16\n\t"
  29001. "lsr r7, r8, #16\n\t"
  29002. "mul r7, r6, r7\n\t"
  29003. "add r3, r3, r7\n\t"
  29004. "lsl r7, r8, #16\n\t"
  29005. "lsr r7, r7, #16\n\t"
  29006. "mul r6, r7, r6\n\t"
  29007. "lsr r7, r6, #16\n\t"
  29008. "lsl r6, r6, #16\n\t"
  29009. "adds r5, r5, r6\n\t"
  29010. "adc r3, r3, r7\n\t"
  29011. #else
  29012. "umlal r5, r3, %[b], r8\n\t"
  29013. #endif
  29014. "stm %[r]!, {r5}\n\t"
  29015. "mov r4, #0\n\t"
  29016. /* A[6] * B */
  29017. "ldm %[a]!, {r8}\n\t"
  29018. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29019. "lsl r6, %[b], #16\n\t"
  29020. "lsl r7, r8, #16\n\t"
  29021. "lsr r6, r6, #16\n\t"
  29022. "lsr r7, r7, #16\n\t"
  29023. "mul r7, r6, r7\n\t"
  29024. "adds r3, r3, r7\n\t"
  29025. "adc r4, r4, #0\n\t"
  29026. "lsr r7, r8, #16\n\t"
  29027. "mul r6, r7, r6\n\t"
  29028. "lsr r7, r6, #16\n\t"
  29029. "lsl r6, r6, #16\n\t"
  29030. "adds r3, r3, r6\n\t"
  29031. "adc r4, r4, r7\n\t"
  29032. "lsr r6, %[b], #16\n\t"
  29033. "lsr r7, r8, #16\n\t"
  29034. "mul r7, r6, r7\n\t"
  29035. "add r4, r4, r7\n\t"
  29036. "lsl r7, r8, #16\n\t"
  29037. "lsr r7, r7, #16\n\t"
  29038. "mul r6, r7, r6\n\t"
  29039. "lsr r7, r6, #16\n\t"
  29040. "lsl r6, r6, #16\n\t"
  29041. "adds r3, r3, r6\n\t"
  29042. "adc r4, r4, r7\n\t"
  29043. #else
  29044. "umlal r3, r4, %[b], r8\n\t"
  29045. #endif
  29046. "stm %[r]!, {r3}\n\t"
  29047. "mov r5, #0\n\t"
  29048. /* A[7] * B */
  29049. "ldm %[a]!, {r8}\n\t"
  29050. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29051. "lsl r6, %[b], #16\n\t"
  29052. "lsl r7, r8, #16\n\t"
  29053. "lsr r6, r6, #16\n\t"
  29054. "lsr r7, r7, #16\n\t"
  29055. "mul r7, r6, r7\n\t"
  29056. "adds r4, r4, r7\n\t"
  29057. "adc r5, r5, #0\n\t"
  29058. "lsr r7, r8, #16\n\t"
  29059. "mul r6, r7, r6\n\t"
  29060. "lsr r7, r6, #16\n\t"
  29061. "lsl r6, r6, #16\n\t"
  29062. "adds r4, r4, r6\n\t"
  29063. "adc r5, r5, r7\n\t"
  29064. "lsr r6, %[b], #16\n\t"
  29065. "lsr r7, r8, #16\n\t"
  29066. "mul r7, r6, r7\n\t"
  29067. "add r5, r5, r7\n\t"
  29068. "lsl r7, r8, #16\n\t"
  29069. "lsr r7, r7, #16\n\t"
  29070. "mul r6, r7, r6\n\t"
  29071. "lsr r7, r6, #16\n\t"
  29072. "lsl r6, r6, #16\n\t"
  29073. "adds r4, r4, r6\n\t"
  29074. "adc r5, r5, r7\n\t"
  29075. #else
  29076. "umlal r4, r5, %[b], r8\n\t"
  29077. #endif
  29078. "stm %[r]!, {r4}\n\t"
  29079. "mov r3, #0\n\t"
  29080. /* A[8] * B */
  29081. "ldm %[a]!, {r8}\n\t"
  29082. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29083. "lsl r6, %[b], #16\n\t"
  29084. "lsl r7, r8, #16\n\t"
  29085. "lsr r6, r6, #16\n\t"
  29086. "lsr r7, r7, #16\n\t"
  29087. "mul r7, r6, r7\n\t"
  29088. "adds r5, r5, r7\n\t"
  29089. "adc r3, r3, #0\n\t"
  29090. "lsr r7, r8, #16\n\t"
  29091. "mul r6, r7, r6\n\t"
  29092. "lsr r7, r6, #16\n\t"
  29093. "lsl r6, r6, #16\n\t"
  29094. "adds r5, r5, r6\n\t"
  29095. "adc r3, r3, r7\n\t"
  29096. "lsr r6, %[b], #16\n\t"
  29097. "lsr r7, r8, #16\n\t"
  29098. "mul r7, r6, r7\n\t"
  29099. "add r3, r3, r7\n\t"
  29100. "lsl r7, r8, #16\n\t"
  29101. "lsr r7, r7, #16\n\t"
  29102. "mul r6, r7, r6\n\t"
  29103. "lsr r7, r6, #16\n\t"
  29104. "lsl r6, r6, #16\n\t"
  29105. "adds r5, r5, r6\n\t"
  29106. "adc r3, r3, r7\n\t"
  29107. #else
  29108. "umlal r5, r3, %[b], r8\n\t"
  29109. #endif
  29110. "stm %[r]!, {r5}\n\t"
  29111. "mov r4, #0\n\t"
  29112. /* A[9] * B */
  29113. "ldm %[a]!, {r8}\n\t"
  29114. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29115. "lsl r6, %[b], #16\n\t"
  29116. "lsl r7, r8, #16\n\t"
  29117. "lsr r6, r6, #16\n\t"
  29118. "lsr r7, r7, #16\n\t"
  29119. "mul r7, r6, r7\n\t"
  29120. "adds r3, r3, r7\n\t"
  29121. "adc r4, r4, #0\n\t"
  29122. "lsr r7, r8, #16\n\t"
  29123. "mul r6, r7, r6\n\t"
  29124. "lsr r7, r6, #16\n\t"
  29125. "lsl r6, r6, #16\n\t"
  29126. "adds r3, r3, r6\n\t"
  29127. "adc r4, r4, r7\n\t"
  29128. "lsr r6, %[b], #16\n\t"
  29129. "lsr r7, r8, #16\n\t"
  29130. "mul r7, r6, r7\n\t"
  29131. "add r4, r4, r7\n\t"
  29132. "lsl r7, r8, #16\n\t"
  29133. "lsr r7, r7, #16\n\t"
  29134. "mul r6, r7, r6\n\t"
  29135. "lsr r7, r6, #16\n\t"
  29136. "lsl r6, r6, #16\n\t"
  29137. "adds r3, r3, r6\n\t"
  29138. "adc r4, r4, r7\n\t"
  29139. #else
  29140. "umlal r3, r4, %[b], r8\n\t"
  29141. #endif
  29142. "stm %[r]!, {r3}\n\t"
  29143. "mov r5, #0\n\t"
  29144. /* A[10] * B */
  29145. "ldm %[a]!, {r8}\n\t"
  29146. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29147. "lsl r6, %[b], #16\n\t"
  29148. "lsl r7, r8, #16\n\t"
  29149. "lsr r6, r6, #16\n\t"
  29150. "lsr r7, r7, #16\n\t"
  29151. "mul r7, r6, r7\n\t"
  29152. "adds r4, r4, r7\n\t"
  29153. "adc r5, r5, #0\n\t"
  29154. "lsr r7, r8, #16\n\t"
  29155. "mul r6, r7, r6\n\t"
  29156. "lsr r7, r6, #16\n\t"
  29157. "lsl r6, r6, #16\n\t"
  29158. "adds r4, r4, r6\n\t"
  29159. "adc r5, r5, r7\n\t"
  29160. "lsr r6, %[b], #16\n\t"
  29161. "lsr r7, r8, #16\n\t"
  29162. "mul r7, r6, r7\n\t"
  29163. "add r5, r5, r7\n\t"
  29164. "lsl r7, r8, #16\n\t"
  29165. "lsr r7, r7, #16\n\t"
  29166. "mul r6, r7, r6\n\t"
  29167. "lsr r7, r6, #16\n\t"
  29168. "lsl r6, r6, #16\n\t"
  29169. "adds r4, r4, r6\n\t"
  29170. "adc r5, r5, r7\n\t"
  29171. #else
  29172. "umlal r4, r5, %[b], r8\n\t"
  29173. #endif
  29174. "stm %[r]!, {r4}\n\t"
  29175. "mov r3, #0\n\t"
  29176. /* A[11] * B */
  29177. "ldm %[a]!, {r8}\n\t"
  29178. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29179. "lsl r6, %[b], #16\n\t"
  29180. "lsl r7, r8, #16\n\t"
  29181. "lsr r6, r6, #16\n\t"
  29182. "lsr r7, r7, #16\n\t"
  29183. "mul r7, r6, r7\n\t"
  29184. "adds r5, r5, r7\n\t"
  29185. "adc r3, r3, #0\n\t"
  29186. "lsr r7, r8, #16\n\t"
  29187. "mul r6, r7, r6\n\t"
  29188. "lsr r7, r6, #16\n\t"
  29189. "lsl r6, r6, #16\n\t"
  29190. "adds r5, r5, r6\n\t"
  29191. "adc r3, r3, r7\n\t"
  29192. "lsr r6, %[b], #16\n\t"
  29193. "lsr r7, r8, #16\n\t"
  29194. "mul r7, r6, r7\n\t"
  29195. "add r3, r3, r7\n\t"
  29196. "lsl r7, r8, #16\n\t"
  29197. "lsr r7, r7, #16\n\t"
  29198. "mul r6, r7, r6\n\t"
  29199. "lsr r7, r6, #16\n\t"
  29200. "lsl r6, r6, #16\n\t"
  29201. "adds r5, r5, r6\n\t"
  29202. "adc r3, r3, r7\n\t"
  29203. #else
  29204. "umlal r5, r3, %[b], r8\n\t"
  29205. #endif
  29206. "stm %[r]!, {r5}\n\t"
  29207. "mov r4, #0\n\t"
  29208. /* A[12] * B */
  29209. "ldm %[a]!, {r8}\n\t"
  29210. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29211. "lsl r6, %[b], #16\n\t"
  29212. "lsl r7, r8, #16\n\t"
  29213. "lsr r6, r6, #16\n\t"
  29214. "lsr r7, r7, #16\n\t"
  29215. "mul r7, r6, r7\n\t"
  29216. "adds r3, r3, r7\n\t"
  29217. "adc r4, r4, #0\n\t"
  29218. "lsr r7, r8, #16\n\t"
  29219. "mul r6, r7, r6\n\t"
  29220. "lsr r7, r6, #16\n\t"
  29221. "lsl r6, r6, #16\n\t"
  29222. "adds r3, r3, r6\n\t"
  29223. "adc r4, r4, r7\n\t"
  29224. "lsr r6, %[b], #16\n\t"
  29225. "lsr r7, r8, #16\n\t"
  29226. "mul r7, r6, r7\n\t"
  29227. "add r4, r4, r7\n\t"
  29228. "lsl r7, r8, #16\n\t"
  29229. "lsr r7, r7, #16\n\t"
  29230. "mul r6, r7, r6\n\t"
  29231. "lsr r7, r6, #16\n\t"
  29232. "lsl r6, r6, #16\n\t"
  29233. "adds r3, r3, r6\n\t"
  29234. "adc r4, r4, r7\n\t"
  29235. #else
  29236. "umlal r3, r4, %[b], r8\n\t"
  29237. #endif
  29238. "stm %[r]!, {r3}\n\t"
  29239. "mov r5, #0\n\t"
  29240. /* A[13] * B */
  29241. "ldm %[a]!, {r8}\n\t"
  29242. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29243. "lsl r6, %[b], #16\n\t"
  29244. "lsl r7, r8, #16\n\t"
  29245. "lsr r6, r6, #16\n\t"
  29246. "lsr r7, r7, #16\n\t"
  29247. "mul r7, r6, r7\n\t"
  29248. "adds r4, r4, r7\n\t"
  29249. "adc r5, r5, #0\n\t"
  29250. "lsr r7, r8, #16\n\t"
  29251. "mul r6, r7, r6\n\t"
  29252. "lsr r7, r6, #16\n\t"
  29253. "lsl r6, r6, #16\n\t"
  29254. "adds r4, r4, r6\n\t"
  29255. "adc r5, r5, r7\n\t"
  29256. "lsr r6, %[b], #16\n\t"
  29257. "lsr r7, r8, #16\n\t"
  29258. "mul r7, r6, r7\n\t"
  29259. "add r5, r5, r7\n\t"
  29260. "lsl r7, r8, #16\n\t"
  29261. "lsr r7, r7, #16\n\t"
  29262. "mul r6, r7, r6\n\t"
  29263. "lsr r7, r6, #16\n\t"
  29264. "lsl r6, r6, #16\n\t"
  29265. "adds r4, r4, r6\n\t"
  29266. "adc r5, r5, r7\n\t"
  29267. #else
  29268. "umlal r4, r5, %[b], r8\n\t"
  29269. #endif
  29270. "stm %[r]!, {r4}\n\t"
  29271. "mov r3, #0\n\t"
  29272. /* A[14] * B */
  29273. "ldm %[a]!, {r8}\n\t"
  29274. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29275. "lsl r6, %[b], #16\n\t"
  29276. "lsl r7, r8, #16\n\t"
  29277. "lsr r6, r6, #16\n\t"
  29278. "lsr r7, r7, #16\n\t"
  29279. "mul r7, r6, r7\n\t"
  29280. "adds r5, r5, r7\n\t"
  29281. "adc r3, r3, #0\n\t"
  29282. "lsr r7, r8, #16\n\t"
  29283. "mul r6, r7, r6\n\t"
  29284. "lsr r7, r6, #16\n\t"
  29285. "lsl r6, r6, #16\n\t"
  29286. "adds r5, r5, r6\n\t"
  29287. "adc r3, r3, r7\n\t"
  29288. "lsr r6, %[b], #16\n\t"
  29289. "lsr r7, r8, #16\n\t"
  29290. "mul r7, r6, r7\n\t"
  29291. "add r3, r3, r7\n\t"
  29292. "lsl r7, r8, #16\n\t"
  29293. "lsr r7, r7, #16\n\t"
  29294. "mul r6, r7, r6\n\t"
  29295. "lsr r7, r6, #16\n\t"
  29296. "lsl r6, r6, #16\n\t"
  29297. "adds r5, r5, r6\n\t"
  29298. "adc r3, r3, r7\n\t"
  29299. #else
  29300. "umlal r5, r3, %[b], r8\n\t"
  29301. #endif
  29302. "stm %[r]!, {r5}\n\t"
  29303. "mov r4, #0\n\t"
  29304. /* A[15] * B */
  29305. "ldm %[a]!, {r8}\n\t"
  29306. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29307. "lsl r6, %[b], #16\n\t"
  29308. "lsl r7, r8, #16\n\t"
  29309. "lsr r6, r6, #16\n\t"
  29310. "lsr r7, r7, #16\n\t"
  29311. "mul r7, r6, r7\n\t"
  29312. "adds r3, r3, r7\n\t"
  29313. "adc r4, r4, #0\n\t"
  29314. "lsr r7, r8, #16\n\t"
  29315. "mul r6, r7, r6\n\t"
  29316. "lsr r7, r6, #16\n\t"
  29317. "lsl r6, r6, #16\n\t"
  29318. "adds r3, r3, r6\n\t"
  29319. "adc r4, r4, r7\n\t"
  29320. "lsr r6, %[b], #16\n\t"
  29321. "lsr r7, r8, #16\n\t"
  29322. "mul r7, r6, r7\n\t"
  29323. "add r4, r4, r7\n\t"
  29324. "lsl r7, r8, #16\n\t"
  29325. "lsr r7, r7, #16\n\t"
  29326. "mul r6, r7, r6\n\t"
  29327. "lsr r7, r6, #16\n\t"
  29328. "lsl r6, r6, #16\n\t"
  29329. "adds r3, r3, r6\n\t"
  29330. "adc r4, r4, r7\n\t"
  29331. #else
  29332. "umlal r3, r4, %[b], r8\n\t"
  29333. #endif
  29334. "stm %[r]!, {r3}\n\t"
  29335. "mov r5, #0\n\t"
  29336. /* A[16] * B */
  29337. "ldm %[a]!, {r8}\n\t"
  29338. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29339. "lsl r6, %[b], #16\n\t"
  29340. "lsl r7, r8, #16\n\t"
  29341. "lsr r6, r6, #16\n\t"
  29342. "lsr r7, r7, #16\n\t"
  29343. "mul r7, r6, r7\n\t"
  29344. "adds r4, r4, r7\n\t"
  29345. "adc r5, r5, #0\n\t"
  29346. "lsr r7, r8, #16\n\t"
  29347. "mul r6, r7, r6\n\t"
  29348. "lsr r7, r6, #16\n\t"
  29349. "lsl r6, r6, #16\n\t"
  29350. "adds r4, r4, r6\n\t"
  29351. "adc r5, r5, r7\n\t"
  29352. "lsr r6, %[b], #16\n\t"
  29353. "lsr r7, r8, #16\n\t"
  29354. "mul r7, r6, r7\n\t"
  29355. "add r5, r5, r7\n\t"
  29356. "lsl r7, r8, #16\n\t"
  29357. "lsr r7, r7, #16\n\t"
  29358. "mul r6, r7, r6\n\t"
  29359. "lsr r7, r6, #16\n\t"
  29360. "lsl r6, r6, #16\n\t"
  29361. "adds r4, r4, r6\n\t"
  29362. "adc r5, r5, r7\n\t"
  29363. #else
  29364. "umlal r4, r5, %[b], r8\n\t"
  29365. #endif
  29366. "stm %[r]!, {r4}\n\t"
  29367. "mov r3, #0\n\t"
  29368. /* A[17] * B */
  29369. "ldm %[a]!, {r8}\n\t"
  29370. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29371. "lsl r6, %[b], #16\n\t"
  29372. "lsl r7, r8, #16\n\t"
  29373. "lsr r6, r6, #16\n\t"
  29374. "lsr r7, r7, #16\n\t"
  29375. "mul r7, r6, r7\n\t"
  29376. "adds r5, r5, r7\n\t"
  29377. "adc r3, r3, #0\n\t"
  29378. "lsr r7, r8, #16\n\t"
  29379. "mul r6, r7, r6\n\t"
  29380. "lsr r7, r6, #16\n\t"
  29381. "lsl r6, r6, #16\n\t"
  29382. "adds r5, r5, r6\n\t"
  29383. "adc r3, r3, r7\n\t"
  29384. "lsr r6, %[b], #16\n\t"
  29385. "lsr r7, r8, #16\n\t"
  29386. "mul r7, r6, r7\n\t"
  29387. "add r3, r3, r7\n\t"
  29388. "lsl r7, r8, #16\n\t"
  29389. "lsr r7, r7, #16\n\t"
  29390. "mul r6, r7, r6\n\t"
  29391. "lsr r7, r6, #16\n\t"
  29392. "lsl r6, r6, #16\n\t"
  29393. "adds r5, r5, r6\n\t"
  29394. "adc r3, r3, r7\n\t"
  29395. #else
  29396. "umlal r5, r3, %[b], r8\n\t"
  29397. #endif
  29398. "stm %[r]!, {r5}\n\t"
  29399. "mov r4, #0\n\t"
  29400. /* A[18] * B */
  29401. "ldm %[a]!, {r8}\n\t"
  29402. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29403. "lsl r6, %[b], #16\n\t"
  29404. "lsl r7, r8, #16\n\t"
  29405. "lsr r6, r6, #16\n\t"
  29406. "lsr r7, r7, #16\n\t"
  29407. "mul r7, r6, r7\n\t"
  29408. "adds r3, r3, r7\n\t"
  29409. "adc r4, r4, #0\n\t"
  29410. "lsr r7, r8, #16\n\t"
  29411. "mul r6, r7, r6\n\t"
  29412. "lsr r7, r6, #16\n\t"
  29413. "lsl r6, r6, #16\n\t"
  29414. "adds r3, r3, r6\n\t"
  29415. "adc r4, r4, r7\n\t"
  29416. "lsr r6, %[b], #16\n\t"
  29417. "lsr r7, r8, #16\n\t"
  29418. "mul r7, r6, r7\n\t"
  29419. "add r4, r4, r7\n\t"
  29420. "lsl r7, r8, #16\n\t"
  29421. "lsr r7, r7, #16\n\t"
  29422. "mul r6, r7, r6\n\t"
  29423. "lsr r7, r6, #16\n\t"
  29424. "lsl r6, r6, #16\n\t"
  29425. "adds r3, r3, r6\n\t"
  29426. "adc r4, r4, r7\n\t"
  29427. #else
  29428. "umlal r3, r4, %[b], r8\n\t"
  29429. #endif
  29430. "stm %[r]!, {r3}\n\t"
  29431. "mov r5, #0\n\t"
  29432. /* A[19] * B */
  29433. "ldm %[a]!, {r8}\n\t"
  29434. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29435. "lsl r6, %[b], #16\n\t"
  29436. "lsl r7, r8, #16\n\t"
  29437. "lsr r6, r6, #16\n\t"
  29438. "lsr r7, r7, #16\n\t"
  29439. "mul r7, r6, r7\n\t"
  29440. "adds r4, r4, r7\n\t"
  29441. "adc r5, r5, #0\n\t"
  29442. "lsr r7, r8, #16\n\t"
  29443. "mul r6, r7, r6\n\t"
  29444. "lsr r7, r6, #16\n\t"
  29445. "lsl r6, r6, #16\n\t"
  29446. "adds r4, r4, r6\n\t"
  29447. "adc r5, r5, r7\n\t"
  29448. "lsr r6, %[b], #16\n\t"
  29449. "lsr r7, r8, #16\n\t"
  29450. "mul r7, r6, r7\n\t"
  29451. "add r5, r5, r7\n\t"
  29452. "lsl r7, r8, #16\n\t"
  29453. "lsr r7, r7, #16\n\t"
  29454. "mul r6, r7, r6\n\t"
  29455. "lsr r7, r6, #16\n\t"
  29456. "lsl r6, r6, #16\n\t"
  29457. "adds r4, r4, r6\n\t"
  29458. "adc r5, r5, r7\n\t"
  29459. #else
  29460. "umlal r4, r5, %[b], r8\n\t"
  29461. #endif
  29462. "stm %[r]!, {r4}\n\t"
  29463. "mov r3, #0\n\t"
  29464. /* A[20] * B */
  29465. "ldm %[a]!, {r8}\n\t"
  29466. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29467. "lsl r6, %[b], #16\n\t"
  29468. "lsl r7, r8, #16\n\t"
  29469. "lsr r6, r6, #16\n\t"
  29470. "lsr r7, r7, #16\n\t"
  29471. "mul r7, r6, r7\n\t"
  29472. "adds r5, r5, r7\n\t"
  29473. "adc r3, r3, #0\n\t"
  29474. "lsr r7, r8, #16\n\t"
  29475. "mul r6, r7, r6\n\t"
  29476. "lsr r7, r6, #16\n\t"
  29477. "lsl r6, r6, #16\n\t"
  29478. "adds r5, r5, r6\n\t"
  29479. "adc r3, r3, r7\n\t"
  29480. "lsr r6, %[b], #16\n\t"
  29481. "lsr r7, r8, #16\n\t"
  29482. "mul r7, r6, r7\n\t"
  29483. "add r3, r3, r7\n\t"
  29484. "lsl r7, r8, #16\n\t"
  29485. "lsr r7, r7, #16\n\t"
  29486. "mul r6, r7, r6\n\t"
  29487. "lsr r7, r6, #16\n\t"
  29488. "lsl r6, r6, #16\n\t"
  29489. "adds r5, r5, r6\n\t"
  29490. "adc r3, r3, r7\n\t"
  29491. #else
  29492. "umlal r5, r3, %[b], r8\n\t"
  29493. #endif
  29494. "stm %[r]!, {r5}\n\t"
  29495. "mov r4, #0\n\t"
  29496. /* A[21] * B */
  29497. "ldm %[a]!, {r8}\n\t"
  29498. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29499. "lsl r6, %[b], #16\n\t"
  29500. "lsl r7, r8, #16\n\t"
  29501. "lsr r6, r6, #16\n\t"
  29502. "lsr r7, r7, #16\n\t"
  29503. "mul r7, r6, r7\n\t"
  29504. "adds r3, r3, r7\n\t"
  29505. "adc r4, r4, #0\n\t"
  29506. "lsr r7, r8, #16\n\t"
  29507. "mul r6, r7, r6\n\t"
  29508. "lsr r7, r6, #16\n\t"
  29509. "lsl r6, r6, #16\n\t"
  29510. "adds r3, r3, r6\n\t"
  29511. "adc r4, r4, r7\n\t"
  29512. "lsr r6, %[b], #16\n\t"
  29513. "lsr r7, r8, #16\n\t"
  29514. "mul r7, r6, r7\n\t"
  29515. "add r4, r4, r7\n\t"
  29516. "lsl r7, r8, #16\n\t"
  29517. "lsr r7, r7, #16\n\t"
  29518. "mul r6, r7, r6\n\t"
  29519. "lsr r7, r6, #16\n\t"
  29520. "lsl r6, r6, #16\n\t"
  29521. "adds r3, r3, r6\n\t"
  29522. "adc r4, r4, r7\n\t"
  29523. #else
  29524. "umlal r3, r4, %[b], r8\n\t"
  29525. #endif
  29526. "stm %[r]!, {r3}\n\t"
  29527. "mov r5, #0\n\t"
  29528. /* A[22] * B */
  29529. "ldm %[a]!, {r8}\n\t"
  29530. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29531. "lsl r6, %[b], #16\n\t"
  29532. "lsl r7, r8, #16\n\t"
  29533. "lsr r6, r6, #16\n\t"
  29534. "lsr r7, r7, #16\n\t"
  29535. "mul r7, r6, r7\n\t"
  29536. "adds r4, r4, r7\n\t"
  29537. "adc r5, r5, #0\n\t"
  29538. "lsr r7, r8, #16\n\t"
  29539. "mul r6, r7, r6\n\t"
  29540. "lsr r7, r6, #16\n\t"
  29541. "lsl r6, r6, #16\n\t"
  29542. "adds r4, r4, r6\n\t"
  29543. "adc r5, r5, r7\n\t"
  29544. "lsr r6, %[b], #16\n\t"
  29545. "lsr r7, r8, #16\n\t"
  29546. "mul r7, r6, r7\n\t"
  29547. "add r5, r5, r7\n\t"
  29548. "lsl r7, r8, #16\n\t"
  29549. "lsr r7, r7, #16\n\t"
  29550. "mul r6, r7, r6\n\t"
  29551. "lsr r7, r6, #16\n\t"
  29552. "lsl r6, r6, #16\n\t"
  29553. "adds r4, r4, r6\n\t"
  29554. "adc r5, r5, r7\n\t"
  29555. #else
  29556. "umlal r4, r5, %[b], r8\n\t"
  29557. #endif
  29558. "stm %[r]!, {r4}\n\t"
  29559. "mov r3, #0\n\t"
  29560. /* A[23] * B */
  29561. "ldm %[a]!, {r8}\n\t"
  29562. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29563. "lsl r6, %[b], #16\n\t"
  29564. "lsl r7, r8, #16\n\t"
  29565. "lsr r6, r6, #16\n\t"
  29566. "lsr r7, r7, #16\n\t"
  29567. "mul r7, r6, r7\n\t"
  29568. "adds r5, r5, r7\n\t"
  29569. "adc r3, r3, #0\n\t"
  29570. "lsr r7, r8, #16\n\t"
  29571. "mul r6, r7, r6\n\t"
  29572. "lsr r7, r6, #16\n\t"
  29573. "lsl r6, r6, #16\n\t"
  29574. "adds r5, r5, r6\n\t"
  29575. "adc r3, r3, r7\n\t"
  29576. "lsr r6, %[b], #16\n\t"
  29577. "lsr r7, r8, #16\n\t"
  29578. "mul r7, r6, r7\n\t"
  29579. "add r3, r3, r7\n\t"
  29580. "lsl r7, r8, #16\n\t"
  29581. "lsr r7, r7, #16\n\t"
  29582. "mul r6, r7, r6\n\t"
  29583. "lsr r7, r6, #16\n\t"
  29584. "lsl r6, r6, #16\n\t"
  29585. "adds r5, r5, r6\n\t"
  29586. "adc r3, r3, r7\n\t"
  29587. #else
  29588. "umlal r5, r3, %[b], r8\n\t"
  29589. #endif
  29590. "stm %[r]!, {r5}\n\t"
  29591. "mov r4, #0\n\t"
  29592. /* A[24] * B */
  29593. "ldm %[a]!, {r8}\n\t"
  29594. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29595. "lsl r6, %[b], #16\n\t"
  29596. "lsl r7, r8, #16\n\t"
  29597. "lsr r6, r6, #16\n\t"
  29598. "lsr r7, r7, #16\n\t"
  29599. "mul r7, r6, r7\n\t"
  29600. "adds r3, r3, r7\n\t"
  29601. "adc r4, r4, #0\n\t"
  29602. "lsr r7, r8, #16\n\t"
  29603. "mul r6, r7, r6\n\t"
  29604. "lsr r7, r6, #16\n\t"
  29605. "lsl r6, r6, #16\n\t"
  29606. "adds r3, r3, r6\n\t"
  29607. "adc r4, r4, r7\n\t"
  29608. "lsr r6, %[b], #16\n\t"
  29609. "lsr r7, r8, #16\n\t"
  29610. "mul r7, r6, r7\n\t"
  29611. "add r4, r4, r7\n\t"
  29612. "lsl r7, r8, #16\n\t"
  29613. "lsr r7, r7, #16\n\t"
  29614. "mul r6, r7, r6\n\t"
  29615. "lsr r7, r6, #16\n\t"
  29616. "lsl r6, r6, #16\n\t"
  29617. "adds r3, r3, r6\n\t"
  29618. "adc r4, r4, r7\n\t"
  29619. #else
  29620. "umlal r3, r4, %[b], r8\n\t"
  29621. #endif
  29622. "stm %[r]!, {r3}\n\t"
  29623. "mov r5, #0\n\t"
  29624. /* A[25] * B */
  29625. "ldm %[a]!, {r8}\n\t"
  29626. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29627. "lsl r6, %[b], #16\n\t"
  29628. "lsl r7, r8, #16\n\t"
  29629. "lsr r6, r6, #16\n\t"
  29630. "lsr r7, r7, #16\n\t"
  29631. "mul r7, r6, r7\n\t"
  29632. "adds r4, r4, r7\n\t"
  29633. "adc r5, r5, #0\n\t"
  29634. "lsr r7, r8, #16\n\t"
  29635. "mul r6, r7, r6\n\t"
  29636. "lsr r7, r6, #16\n\t"
  29637. "lsl r6, r6, #16\n\t"
  29638. "adds r4, r4, r6\n\t"
  29639. "adc r5, r5, r7\n\t"
  29640. "lsr r6, %[b], #16\n\t"
  29641. "lsr r7, r8, #16\n\t"
  29642. "mul r7, r6, r7\n\t"
  29643. "add r5, r5, r7\n\t"
  29644. "lsl r7, r8, #16\n\t"
  29645. "lsr r7, r7, #16\n\t"
  29646. "mul r6, r7, r6\n\t"
  29647. "lsr r7, r6, #16\n\t"
  29648. "lsl r6, r6, #16\n\t"
  29649. "adds r4, r4, r6\n\t"
  29650. "adc r5, r5, r7\n\t"
  29651. #else
  29652. "umlal r4, r5, %[b], r8\n\t"
  29653. #endif
  29654. "stm %[r]!, {r4}\n\t"
  29655. "mov r3, #0\n\t"
  29656. /* A[26] * B */
  29657. "ldm %[a]!, {r8}\n\t"
  29658. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29659. "lsl r6, %[b], #16\n\t"
  29660. "lsl r7, r8, #16\n\t"
  29661. "lsr r6, r6, #16\n\t"
  29662. "lsr r7, r7, #16\n\t"
  29663. "mul r7, r6, r7\n\t"
  29664. "adds r5, r5, r7\n\t"
  29665. "adc r3, r3, #0\n\t"
  29666. "lsr r7, r8, #16\n\t"
  29667. "mul r6, r7, r6\n\t"
  29668. "lsr r7, r6, #16\n\t"
  29669. "lsl r6, r6, #16\n\t"
  29670. "adds r5, r5, r6\n\t"
  29671. "adc r3, r3, r7\n\t"
  29672. "lsr r6, %[b], #16\n\t"
  29673. "lsr r7, r8, #16\n\t"
  29674. "mul r7, r6, r7\n\t"
  29675. "add r3, r3, r7\n\t"
  29676. "lsl r7, r8, #16\n\t"
  29677. "lsr r7, r7, #16\n\t"
  29678. "mul r6, r7, r6\n\t"
  29679. "lsr r7, r6, #16\n\t"
  29680. "lsl r6, r6, #16\n\t"
  29681. "adds r5, r5, r6\n\t"
  29682. "adc r3, r3, r7\n\t"
  29683. #else
  29684. "umlal r5, r3, %[b], r8\n\t"
  29685. #endif
  29686. "stm %[r]!, {r5}\n\t"
  29687. "mov r4, #0\n\t"
  29688. /* A[27] * B */
  29689. "ldm %[a]!, {r8}\n\t"
  29690. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29691. "lsl r6, %[b], #16\n\t"
  29692. "lsl r7, r8, #16\n\t"
  29693. "lsr r6, r6, #16\n\t"
  29694. "lsr r7, r7, #16\n\t"
  29695. "mul r7, r6, r7\n\t"
  29696. "adds r3, r3, r7\n\t"
  29697. "adc r4, r4, #0\n\t"
  29698. "lsr r7, r8, #16\n\t"
  29699. "mul r6, r7, r6\n\t"
  29700. "lsr r7, r6, #16\n\t"
  29701. "lsl r6, r6, #16\n\t"
  29702. "adds r3, r3, r6\n\t"
  29703. "adc r4, r4, r7\n\t"
  29704. "lsr r6, %[b], #16\n\t"
  29705. "lsr r7, r8, #16\n\t"
  29706. "mul r7, r6, r7\n\t"
  29707. "add r4, r4, r7\n\t"
  29708. "lsl r7, r8, #16\n\t"
  29709. "lsr r7, r7, #16\n\t"
  29710. "mul r6, r7, r6\n\t"
  29711. "lsr r7, r6, #16\n\t"
  29712. "lsl r6, r6, #16\n\t"
  29713. "adds r3, r3, r6\n\t"
  29714. "adc r4, r4, r7\n\t"
  29715. #else
  29716. "umlal r3, r4, %[b], r8\n\t"
  29717. #endif
  29718. "stm %[r]!, {r3}\n\t"
  29719. "mov r5, #0\n\t"
  29720. /* A[28] * B */
  29721. "ldm %[a]!, {r8}\n\t"
  29722. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29723. "lsl r6, %[b], #16\n\t"
  29724. "lsl r7, r8, #16\n\t"
  29725. "lsr r6, r6, #16\n\t"
  29726. "lsr r7, r7, #16\n\t"
  29727. "mul r7, r6, r7\n\t"
  29728. "adds r4, r4, r7\n\t"
  29729. "adc r5, r5, #0\n\t"
  29730. "lsr r7, r8, #16\n\t"
  29731. "mul r6, r7, r6\n\t"
  29732. "lsr r7, r6, #16\n\t"
  29733. "lsl r6, r6, #16\n\t"
  29734. "adds r4, r4, r6\n\t"
  29735. "adc r5, r5, r7\n\t"
  29736. "lsr r6, %[b], #16\n\t"
  29737. "lsr r7, r8, #16\n\t"
  29738. "mul r7, r6, r7\n\t"
  29739. "add r5, r5, r7\n\t"
  29740. "lsl r7, r8, #16\n\t"
  29741. "lsr r7, r7, #16\n\t"
  29742. "mul r6, r7, r6\n\t"
  29743. "lsr r7, r6, #16\n\t"
  29744. "lsl r6, r6, #16\n\t"
  29745. "adds r4, r4, r6\n\t"
  29746. "adc r5, r5, r7\n\t"
  29747. #else
  29748. "umlal r4, r5, %[b], r8\n\t"
  29749. #endif
  29750. "stm %[r]!, {r4}\n\t"
  29751. "mov r3, #0\n\t"
  29752. /* A[29] * B */
  29753. "ldm %[a]!, {r8}\n\t"
  29754. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29755. "lsl r6, %[b], #16\n\t"
  29756. "lsl r7, r8, #16\n\t"
  29757. "lsr r6, r6, #16\n\t"
  29758. "lsr r7, r7, #16\n\t"
  29759. "mul r7, r6, r7\n\t"
  29760. "adds r5, r5, r7\n\t"
  29761. "adc r3, r3, #0\n\t"
  29762. "lsr r7, r8, #16\n\t"
  29763. "mul r6, r7, r6\n\t"
  29764. "lsr r7, r6, #16\n\t"
  29765. "lsl r6, r6, #16\n\t"
  29766. "adds r5, r5, r6\n\t"
  29767. "adc r3, r3, r7\n\t"
  29768. "lsr r6, %[b], #16\n\t"
  29769. "lsr r7, r8, #16\n\t"
  29770. "mul r7, r6, r7\n\t"
  29771. "add r3, r3, r7\n\t"
  29772. "lsl r7, r8, #16\n\t"
  29773. "lsr r7, r7, #16\n\t"
  29774. "mul r6, r7, r6\n\t"
  29775. "lsr r7, r6, #16\n\t"
  29776. "lsl r6, r6, #16\n\t"
  29777. "adds r5, r5, r6\n\t"
  29778. "adc r3, r3, r7\n\t"
  29779. #else
  29780. "umlal r5, r3, %[b], r8\n\t"
  29781. #endif
  29782. "stm %[r]!, {r5}\n\t"
  29783. "mov r4, #0\n\t"
  29784. /* A[30] * B */
  29785. "ldm %[a]!, {r8}\n\t"
  29786. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29787. "lsl r6, %[b], #16\n\t"
  29788. "lsl r7, r8, #16\n\t"
  29789. "lsr r6, r6, #16\n\t"
  29790. "lsr r7, r7, #16\n\t"
  29791. "mul r7, r6, r7\n\t"
  29792. "adds r3, r3, r7\n\t"
  29793. "adc r4, r4, #0\n\t"
  29794. "lsr r7, r8, #16\n\t"
  29795. "mul r6, r7, r6\n\t"
  29796. "lsr r7, r6, #16\n\t"
  29797. "lsl r6, r6, #16\n\t"
  29798. "adds r3, r3, r6\n\t"
  29799. "adc r4, r4, r7\n\t"
  29800. "lsr r6, %[b], #16\n\t"
  29801. "lsr r7, r8, #16\n\t"
  29802. "mul r7, r6, r7\n\t"
  29803. "add r4, r4, r7\n\t"
  29804. "lsl r7, r8, #16\n\t"
  29805. "lsr r7, r7, #16\n\t"
  29806. "mul r6, r7, r6\n\t"
  29807. "lsr r7, r6, #16\n\t"
  29808. "lsl r6, r6, #16\n\t"
  29809. "adds r3, r3, r6\n\t"
  29810. "adc r4, r4, r7\n\t"
  29811. #else
  29812. "umlal r3, r4, %[b], r8\n\t"
  29813. #endif
  29814. "stm %[r]!, {r3}\n\t"
  29815. "mov r5, #0\n\t"
  29816. /* A[31] * B */
  29817. "ldm %[a]!, {r8}\n\t"
  29818. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29819. "lsl r6, %[b], #16\n\t"
  29820. "lsl r7, r8, #16\n\t"
  29821. "lsr r6, r6, #16\n\t"
  29822. "lsr r7, r7, #16\n\t"
  29823. "mul r7, r6, r7\n\t"
  29824. "adds r4, r4, r7\n\t"
  29825. "adc r5, r5, #0\n\t"
  29826. "lsr r7, r8, #16\n\t"
  29827. "mul r6, r7, r6\n\t"
  29828. "lsr r7, r6, #16\n\t"
  29829. "lsl r6, r6, #16\n\t"
  29830. "adds r4, r4, r6\n\t"
  29831. "adc r5, r5, r7\n\t"
  29832. "lsr r6, %[b], #16\n\t"
  29833. "lsr r7, r8, #16\n\t"
  29834. "mul r7, r6, r7\n\t"
  29835. "add r5, r5, r7\n\t"
  29836. "lsl r7, r8, #16\n\t"
  29837. "lsr r7, r7, #16\n\t"
  29838. "mul r6, r7, r6\n\t"
  29839. "lsr r7, r6, #16\n\t"
  29840. "lsl r6, r6, #16\n\t"
  29841. "adds r4, r4, r6\n\t"
  29842. "adc r5, r5, r7\n\t"
  29843. #else
  29844. "umlal r4, r5, %[b], r8\n\t"
  29845. #endif
  29846. "stm %[r]!, {r4}\n\t"
  29847. "mov r3, #0\n\t"
  29848. /* A[32] * B */
  29849. "ldm %[a]!, {r8}\n\t"
  29850. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29851. "lsl r6, %[b], #16\n\t"
  29852. "lsl r7, r8, #16\n\t"
  29853. "lsr r6, r6, #16\n\t"
  29854. "lsr r7, r7, #16\n\t"
  29855. "mul r7, r6, r7\n\t"
  29856. "adds r5, r5, r7\n\t"
  29857. "adc r3, r3, #0\n\t"
  29858. "lsr r7, r8, #16\n\t"
  29859. "mul r6, r7, r6\n\t"
  29860. "lsr r7, r6, #16\n\t"
  29861. "lsl r6, r6, #16\n\t"
  29862. "adds r5, r5, r6\n\t"
  29863. "adc r3, r3, r7\n\t"
  29864. "lsr r6, %[b], #16\n\t"
  29865. "lsr r7, r8, #16\n\t"
  29866. "mul r7, r6, r7\n\t"
  29867. "add r3, r3, r7\n\t"
  29868. "lsl r7, r8, #16\n\t"
  29869. "lsr r7, r7, #16\n\t"
  29870. "mul r6, r7, r6\n\t"
  29871. "lsr r7, r6, #16\n\t"
  29872. "lsl r6, r6, #16\n\t"
  29873. "adds r5, r5, r6\n\t"
  29874. "adc r3, r3, r7\n\t"
  29875. #else
  29876. "umlal r5, r3, %[b], r8\n\t"
  29877. #endif
  29878. "stm %[r]!, {r5}\n\t"
  29879. "mov r4, #0\n\t"
  29880. /* A[33] * B */
  29881. "ldm %[a]!, {r8}\n\t"
  29882. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29883. "lsl r6, %[b], #16\n\t"
  29884. "lsl r7, r8, #16\n\t"
  29885. "lsr r6, r6, #16\n\t"
  29886. "lsr r7, r7, #16\n\t"
  29887. "mul r7, r6, r7\n\t"
  29888. "adds r3, r3, r7\n\t"
  29889. "adc r4, r4, #0\n\t"
  29890. "lsr r7, r8, #16\n\t"
  29891. "mul r6, r7, r6\n\t"
  29892. "lsr r7, r6, #16\n\t"
  29893. "lsl r6, r6, #16\n\t"
  29894. "adds r3, r3, r6\n\t"
  29895. "adc r4, r4, r7\n\t"
  29896. "lsr r6, %[b], #16\n\t"
  29897. "lsr r7, r8, #16\n\t"
  29898. "mul r7, r6, r7\n\t"
  29899. "add r4, r4, r7\n\t"
  29900. "lsl r7, r8, #16\n\t"
  29901. "lsr r7, r7, #16\n\t"
  29902. "mul r6, r7, r6\n\t"
  29903. "lsr r7, r6, #16\n\t"
  29904. "lsl r6, r6, #16\n\t"
  29905. "adds r3, r3, r6\n\t"
  29906. "adc r4, r4, r7\n\t"
  29907. #else
  29908. "umlal r3, r4, %[b], r8\n\t"
  29909. #endif
  29910. "stm %[r]!, {r3}\n\t"
  29911. "mov r5, #0\n\t"
  29912. /* A[34] * B */
  29913. "ldm %[a]!, {r8}\n\t"
  29914. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29915. "lsl r6, %[b], #16\n\t"
  29916. "lsl r7, r8, #16\n\t"
  29917. "lsr r6, r6, #16\n\t"
  29918. "lsr r7, r7, #16\n\t"
  29919. "mul r7, r6, r7\n\t"
  29920. "adds r4, r4, r7\n\t"
  29921. "adc r5, r5, #0\n\t"
  29922. "lsr r7, r8, #16\n\t"
  29923. "mul r6, r7, r6\n\t"
  29924. "lsr r7, r6, #16\n\t"
  29925. "lsl r6, r6, #16\n\t"
  29926. "adds r4, r4, r6\n\t"
  29927. "adc r5, r5, r7\n\t"
  29928. "lsr r6, %[b], #16\n\t"
  29929. "lsr r7, r8, #16\n\t"
  29930. "mul r7, r6, r7\n\t"
  29931. "add r5, r5, r7\n\t"
  29932. "lsl r7, r8, #16\n\t"
  29933. "lsr r7, r7, #16\n\t"
  29934. "mul r6, r7, r6\n\t"
  29935. "lsr r7, r6, #16\n\t"
  29936. "lsl r6, r6, #16\n\t"
  29937. "adds r4, r4, r6\n\t"
  29938. "adc r5, r5, r7\n\t"
  29939. #else
  29940. "umlal r4, r5, %[b], r8\n\t"
  29941. #endif
  29942. "stm %[r]!, {r4}\n\t"
  29943. "mov r3, #0\n\t"
  29944. /* A[35] * B */
  29945. "ldm %[a]!, {r8}\n\t"
  29946. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29947. "lsl r6, %[b], #16\n\t"
  29948. "lsl r7, r8, #16\n\t"
  29949. "lsr r6, r6, #16\n\t"
  29950. "lsr r7, r7, #16\n\t"
  29951. "mul r7, r6, r7\n\t"
  29952. "adds r5, r5, r7\n\t"
  29953. "adc r3, r3, #0\n\t"
  29954. "lsr r7, r8, #16\n\t"
  29955. "mul r6, r7, r6\n\t"
  29956. "lsr r7, r6, #16\n\t"
  29957. "lsl r6, r6, #16\n\t"
  29958. "adds r5, r5, r6\n\t"
  29959. "adc r3, r3, r7\n\t"
  29960. "lsr r6, %[b], #16\n\t"
  29961. "lsr r7, r8, #16\n\t"
  29962. "mul r7, r6, r7\n\t"
  29963. "add r3, r3, r7\n\t"
  29964. "lsl r7, r8, #16\n\t"
  29965. "lsr r7, r7, #16\n\t"
  29966. "mul r6, r7, r6\n\t"
  29967. "lsr r7, r6, #16\n\t"
  29968. "lsl r6, r6, #16\n\t"
  29969. "adds r5, r5, r6\n\t"
  29970. "adc r3, r3, r7\n\t"
  29971. #else
  29972. "umlal r5, r3, %[b], r8\n\t"
  29973. #endif
  29974. "stm %[r]!, {r5}\n\t"
  29975. "mov r4, #0\n\t"
  29976. /* A[36] * B */
  29977. "ldm %[a]!, {r8}\n\t"
  29978. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  29979. "lsl r6, %[b], #16\n\t"
  29980. "lsl r7, r8, #16\n\t"
  29981. "lsr r6, r6, #16\n\t"
  29982. "lsr r7, r7, #16\n\t"
  29983. "mul r7, r6, r7\n\t"
  29984. "adds r3, r3, r7\n\t"
  29985. "adc r4, r4, #0\n\t"
  29986. "lsr r7, r8, #16\n\t"
  29987. "mul r6, r7, r6\n\t"
  29988. "lsr r7, r6, #16\n\t"
  29989. "lsl r6, r6, #16\n\t"
  29990. "adds r3, r3, r6\n\t"
  29991. "adc r4, r4, r7\n\t"
  29992. "lsr r6, %[b], #16\n\t"
  29993. "lsr r7, r8, #16\n\t"
  29994. "mul r7, r6, r7\n\t"
  29995. "add r4, r4, r7\n\t"
  29996. "lsl r7, r8, #16\n\t"
  29997. "lsr r7, r7, #16\n\t"
  29998. "mul r6, r7, r6\n\t"
  29999. "lsr r7, r6, #16\n\t"
  30000. "lsl r6, r6, #16\n\t"
  30001. "adds r3, r3, r6\n\t"
  30002. "adc r4, r4, r7\n\t"
  30003. #else
  30004. "umlal r3, r4, %[b], r8\n\t"
  30005. #endif
  30006. "stm %[r]!, {r3}\n\t"
  30007. "mov r5, #0\n\t"
  30008. /* A[37] * B */
  30009. "ldm %[a]!, {r8}\n\t"
  30010. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30011. "lsl r6, %[b], #16\n\t"
  30012. "lsl r7, r8, #16\n\t"
  30013. "lsr r6, r6, #16\n\t"
  30014. "lsr r7, r7, #16\n\t"
  30015. "mul r7, r6, r7\n\t"
  30016. "adds r4, r4, r7\n\t"
  30017. "adc r5, r5, #0\n\t"
  30018. "lsr r7, r8, #16\n\t"
  30019. "mul r6, r7, r6\n\t"
  30020. "lsr r7, r6, #16\n\t"
  30021. "lsl r6, r6, #16\n\t"
  30022. "adds r4, r4, r6\n\t"
  30023. "adc r5, r5, r7\n\t"
  30024. "lsr r6, %[b], #16\n\t"
  30025. "lsr r7, r8, #16\n\t"
  30026. "mul r7, r6, r7\n\t"
  30027. "add r5, r5, r7\n\t"
  30028. "lsl r7, r8, #16\n\t"
  30029. "lsr r7, r7, #16\n\t"
  30030. "mul r6, r7, r6\n\t"
  30031. "lsr r7, r6, #16\n\t"
  30032. "lsl r6, r6, #16\n\t"
  30033. "adds r4, r4, r6\n\t"
  30034. "adc r5, r5, r7\n\t"
  30035. #else
  30036. "umlal r4, r5, %[b], r8\n\t"
  30037. #endif
  30038. "stm %[r]!, {r4}\n\t"
  30039. "mov r3, #0\n\t"
  30040. /* A[38] * B */
  30041. "ldm %[a]!, {r8}\n\t"
  30042. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30043. "lsl r6, %[b], #16\n\t"
  30044. "lsl r7, r8, #16\n\t"
  30045. "lsr r6, r6, #16\n\t"
  30046. "lsr r7, r7, #16\n\t"
  30047. "mul r7, r6, r7\n\t"
  30048. "adds r5, r5, r7\n\t"
  30049. "adc r3, r3, #0\n\t"
  30050. "lsr r7, r8, #16\n\t"
  30051. "mul r6, r7, r6\n\t"
  30052. "lsr r7, r6, #16\n\t"
  30053. "lsl r6, r6, #16\n\t"
  30054. "adds r5, r5, r6\n\t"
  30055. "adc r3, r3, r7\n\t"
  30056. "lsr r6, %[b], #16\n\t"
  30057. "lsr r7, r8, #16\n\t"
  30058. "mul r7, r6, r7\n\t"
  30059. "add r3, r3, r7\n\t"
  30060. "lsl r7, r8, #16\n\t"
  30061. "lsr r7, r7, #16\n\t"
  30062. "mul r6, r7, r6\n\t"
  30063. "lsr r7, r6, #16\n\t"
  30064. "lsl r6, r6, #16\n\t"
  30065. "adds r5, r5, r6\n\t"
  30066. "adc r3, r3, r7\n\t"
  30067. #else
  30068. "umlal r5, r3, %[b], r8\n\t"
  30069. #endif
  30070. "stm %[r]!, {r5}\n\t"
  30071. "mov r4, #0\n\t"
  30072. /* A[39] * B */
  30073. "ldm %[a]!, {r8}\n\t"
  30074. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30075. "lsl r6, %[b], #16\n\t"
  30076. "lsl r7, r8, #16\n\t"
  30077. "lsr r6, r6, #16\n\t"
  30078. "lsr r7, r7, #16\n\t"
  30079. "mul r7, r6, r7\n\t"
  30080. "adds r3, r3, r7\n\t"
  30081. "adc r4, r4, #0\n\t"
  30082. "lsr r7, r8, #16\n\t"
  30083. "mul r6, r7, r6\n\t"
  30084. "lsr r7, r6, #16\n\t"
  30085. "lsl r6, r6, #16\n\t"
  30086. "adds r3, r3, r6\n\t"
  30087. "adc r4, r4, r7\n\t"
  30088. "lsr r6, %[b], #16\n\t"
  30089. "lsr r7, r8, #16\n\t"
  30090. "mul r7, r6, r7\n\t"
  30091. "add r4, r4, r7\n\t"
  30092. "lsl r7, r8, #16\n\t"
  30093. "lsr r7, r7, #16\n\t"
  30094. "mul r6, r7, r6\n\t"
  30095. "lsr r7, r6, #16\n\t"
  30096. "lsl r6, r6, #16\n\t"
  30097. "adds r3, r3, r6\n\t"
  30098. "adc r4, r4, r7\n\t"
  30099. #else
  30100. "umlal r3, r4, %[b], r8\n\t"
  30101. #endif
  30102. "stm %[r]!, {r3}\n\t"
  30103. "mov r5, #0\n\t"
  30104. /* A[40] * B */
  30105. "ldm %[a]!, {r8}\n\t"
  30106. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30107. "lsl r6, %[b], #16\n\t"
  30108. "lsl r7, r8, #16\n\t"
  30109. "lsr r6, r6, #16\n\t"
  30110. "lsr r7, r7, #16\n\t"
  30111. "mul r7, r6, r7\n\t"
  30112. "adds r4, r4, r7\n\t"
  30113. "adc r5, r5, #0\n\t"
  30114. "lsr r7, r8, #16\n\t"
  30115. "mul r6, r7, r6\n\t"
  30116. "lsr r7, r6, #16\n\t"
  30117. "lsl r6, r6, #16\n\t"
  30118. "adds r4, r4, r6\n\t"
  30119. "adc r5, r5, r7\n\t"
  30120. "lsr r6, %[b], #16\n\t"
  30121. "lsr r7, r8, #16\n\t"
  30122. "mul r7, r6, r7\n\t"
  30123. "add r5, r5, r7\n\t"
  30124. "lsl r7, r8, #16\n\t"
  30125. "lsr r7, r7, #16\n\t"
  30126. "mul r6, r7, r6\n\t"
  30127. "lsr r7, r6, #16\n\t"
  30128. "lsl r6, r6, #16\n\t"
  30129. "adds r4, r4, r6\n\t"
  30130. "adc r5, r5, r7\n\t"
  30131. #else
  30132. "umlal r4, r5, %[b], r8\n\t"
  30133. #endif
  30134. "stm %[r]!, {r4}\n\t"
  30135. "mov r3, #0\n\t"
  30136. /* A[41] * B */
  30137. "ldm %[a]!, {r8}\n\t"
  30138. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30139. "lsl r6, %[b], #16\n\t"
  30140. "lsl r7, r8, #16\n\t"
  30141. "lsr r6, r6, #16\n\t"
  30142. "lsr r7, r7, #16\n\t"
  30143. "mul r7, r6, r7\n\t"
  30144. "adds r5, r5, r7\n\t"
  30145. "adc r3, r3, #0\n\t"
  30146. "lsr r7, r8, #16\n\t"
  30147. "mul r6, r7, r6\n\t"
  30148. "lsr r7, r6, #16\n\t"
  30149. "lsl r6, r6, #16\n\t"
  30150. "adds r5, r5, r6\n\t"
  30151. "adc r3, r3, r7\n\t"
  30152. "lsr r6, %[b], #16\n\t"
  30153. "lsr r7, r8, #16\n\t"
  30154. "mul r7, r6, r7\n\t"
  30155. "add r3, r3, r7\n\t"
  30156. "lsl r7, r8, #16\n\t"
  30157. "lsr r7, r7, #16\n\t"
  30158. "mul r6, r7, r6\n\t"
  30159. "lsr r7, r6, #16\n\t"
  30160. "lsl r6, r6, #16\n\t"
  30161. "adds r5, r5, r6\n\t"
  30162. "adc r3, r3, r7\n\t"
  30163. #else
  30164. "umlal r5, r3, %[b], r8\n\t"
  30165. #endif
  30166. "stm %[r]!, {r5}\n\t"
  30167. "mov r4, #0\n\t"
  30168. /* A[42] * B */
  30169. "ldm %[a]!, {r8}\n\t"
  30170. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30171. "lsl r6, %[b], #16\n\t"
  30172. "lsl r7, r8, #16\n\t"
  30173. "lsr r6, r6, #16\n\t"
  30174. "lsr r7, r7, #16\n\t"
  30175. "mul r7, r6, r7\n\t"
  30176. "adds r3, r3, r7\n\t"
  30177. "adc r4, r4, #0\n\t"
  30178. "lsr r7, r8, #16\n\t"
  30179. "mul r6, r7, r6\n\t"
  30180. "lsr r7, r6, #16\n\t"
  30181. "lsl r6, r6, #16\n\t"
  30182. "adds r3, r3, r6\n\t"
  30183. "adc r4, r4, r7\n\t"
  30184. "lsr r6, %[b], #16\n\t"
  30185. "lsr r7, r8, #16\n\t"
  30186. "mul r7, r6, r7\n\t"
  30187. "add r4, r4, r7\n\t"
  30188. "lsl r7, r8, #16\n\t"
  30189. "lsr r7, r7, #16\n\t"
  30190. "mul r6, r7, r6\n\t"
  30191. "lsr r7, r6, #16\n\t"
  30192. "lsl r6, r6, #16\n\t"
  30193. "adds r3, r3, r6\n\t"
  30194. "adc r4, r4, r7\n\t"
  30195. #else
  30196. "umlal r3, r4, %[b], r8\n\t"
  30197. #endif
  30198. "stm %[r]!, {r3}\n\t"
  30199. "mov r5, #0\n\t"
  30200. /* A[43] * B */
  30201. "ldm %[a]!, {r8}\n\t"
  30202. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30203. "lsl r6, %[b], #16\n\t"
  30204. "lsl r7, r8, #16\n\t"
  30205. "lsr r6, r6, #16\n\t"
  30206. "lsr r7, r7, #16\n\t"
  30207. "mul r7, r6, r7\n\t"
  30208. "adds r4, r4, r7\n\t"
  30209. "adc r5, r5, #0\n\t"
  30210. "lsr r7, r8, #16\n\t"
  30211. "mul r6, r7, r6\n\t"
  30212. "lsr r7, r6, #16\n\t"
  30213. "lsl r6, r6, #16\n\t"
  30214. "adds r4, r4, r6\n\t"
  30215. "adc r5, r5, r7\n\t"
  30216. "lsr r6, %[b], #16\n\t"
  30217. "lsr r7, r8, #16\n\t"
  30218. "mul r7, r6, r7\n\t"
  30219. "add r5, r5, r7\n\t"
  30220. "lsl r7, r8, #16\n\t"
  30221. "lsr r7, r7, #16\n\t"
  30222. "mul r6, r7, r6\n\t"
  30223. "lsr r7, r6, #16\n\t"
  30224. "lsl r6, r6, #16\n\t"
  30225. "adds r4, r4, r6\n\t"
  30226. "adc r5, r5, r7\n\t"
  30227. #else
  30228. "umlal r4, r5, %[b], r8\n\t"
  30229. #endif
  30230. "stm %[r]!, {r4}\n\t"
  30231. "mov r3, #0\n\t"
  30232. /* A[44] * B */
  30233. "ldm %[a]!, {r8}\n\t"
  30234. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30235. "lsl r6, %[b], #16\n\t"
  30236. "lsl r7, r8, #16\n\t"
  30237. "lsr r6, r6, #16\n\t"
  30238. "lsr r7, r7, #16\n\t"
  30239. "mul r7, r6, r7\n\t"
  30240. "adds r5, r5, r7\n\t"
  30241. "adc r3, r3, #0\n\t"
  30242. "lsr r7, r8, #16\n\t"
  30243. "mul r6, r7, r6\n\t"
  30244. "lsr r7, r6, #16\n\t"
  30245. "lsl r6, r6, #16\n\t"
  30246. "adds r5, r5, r6\n\t"
  30247. "adc r3, r3, r7\n\t"
  30248. "lsr r6, %[b], #16\n\t"
  30249. "lsr r7, r8, #16\n\t"
  30250. "mul r7, r6, r7\n\t"
  30251. "add r3, r3, r7\n\t"
  30252. "lsl r7, r8, #16\n\t"
  30253. "lsr r7, r7, #16\n\t"
  30254. "mul r6, r7, r6\n\t"
  30255. "lsr r7, r6, #16\n\t"
  30256. "lsl r6, r6, #16\n\t"
  30257. "adds r5, r5, r6\n\t"
  30258. "adc r3, r3, r7\n\t"
  30259. #else
  30260. "umlal r5, r3, %[b], r8\n\t"
  30261. #endif
  30262. "stm %[r]!, {r5}\n\t"
  30263. "mov r4, #0\n\t"
  30264. /* A[45] * B */
  30265. "ldm %[a]!, {r8}\n\t"
  30266. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30267. "lsl r6, %[b], #16\n\t"
  30268. "lsl r7, r8, #16\n\t"
  30269. "lsr r6, r6, #16\n\t"
  30270. "lsr r7, r7, #16\n\t"
  30271. "mul r7, r6, r7\n\t"
  30272. "adds r3, r3, r7\n\t"
  30273. "adc r4, r4, #0\n\t"
  30274. "lsr r7, r8, #16\n\t"
  30275. "mul r6, r7, r6\n\t"
  30276. "lsr r7, r6, #16\n\t"
  30277. "lsl r6, r6, #16\n\t"
  30278. "adds r3, r3, r6\n\t"
  30279. "adc r4, r4, r7\n\t"
  30280. "lsr r6, %[b], #16\n\t"
  30281. "lsr r7, r8, #16\n\t"
  30282. "mul r7, r6, r7\n\t"
  30283. "add r4, r4, r7\n\t"
  30284. "lsl r7, r8, #16\n\t"
  30285. "lsr r7, r7, #16\n\t"
  30286. "mul r6, r7, r6\n\t"
  30287. "lsr r7, r6, #16\n\t"
  30288. "lsl r6, r6, #16\n\t"
  30289. "adds r3, r3, r6\n\t"
  30290. "adc r4, r4, r7\n\t"
  30291. #else
  30292. "umlal r3, r4, %[b], r8\n\t"
  30293. #endif
  30294. "stm %[r]!, {r3}\n\t"
  30295. "mov r5, #0\n\t"
  30296. /* A[46] * B */
  30297. "ldm %[a]!, {r8}\n\t"
  30298. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30299. "lsl r6, %[b], #16\n\t"
  30300. "lsl r7, r8, #16\n\t"
  30301. "lsr r6, r6, #16\n\t"
  30302. "lsr r7, r7, #16\n\t"
  30303. "mul r7, r6, r7\n\t"
  30304. "adds r4, r4, r7\n\t"
  30305. "adc r5, r5, #0\n\t"
  30306. "lsr r7, r8, #16\n\t"
  30307. "mul r6, r7, r6\n\t"
  30308. "lsr r7, r6, #16\n\t"
  30309. "lsl r6, r6, #16\n\t"
  30310. "adds r4, r4, r6\n\t"
  30311. "adc r5, r5, r7\n\t"
  30312. "lsr r6, %[b], #16\n\t"
  30313. "lsr r7, r8, #16\n\t"
  30314. "mul r7, r6, r7\n\t"
  30315. "add r5, r5, r7\n\t"
  30316. "lsl r7, r8, #16\n\t"
  30317. "lsr r7, r7, #16\n\t"
  30318. "mul r6, r7, r6\n\t"
  30319. "lsr r7, r6, #16\n\t"
  30320. "lsl r6, r6, #16\n\t"
  30321. "adds r4, r4, r6\n\t"
  30322. "adc r5, r5, r7\n\t"
  30323. #else
  30324. "umlal r4, r5, %[b], r8\n\t"
  30325. #endif
  30326. "stm %[r]!, {r4}\n\t"
  30327. "mov r3, #0\n\t"
  30328. /* A[47] * B */
  30329. "ldm %[a]!, {r8}\n\t"
  30330. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30331. "lsl r6, %[b], #16\n\t"
  30332. "lsl r7, r8, #16\n\t"
  30333. "lsr r6, r6, #16\n\t"
  30334. "lsr r7, r7, #16\n\t"
  30335. "mul r7, r6, r7\n\t"
  30336. "adds r5, r5, r7\n\t"
  30337. "adc r3, r3, #0\n\t"
  30338. "lsr r7, r8, #16\n\t"
  30339. "mul r6, r7, r6\n\t"
  30340. "lsr r7, r6, #16\n\t"
  30341. "lsl r6, r6, #16\n\t"
  30342. "adds r5, r5, r6\n\t"
  30343. "adc r3, r3, r7\n\t"
  30344. "lsr r6, %[b], #16\n\t"
  30345. "lsr r7, r8, #16\n\t"
  30346. "mul r7, r6, r7\n\t"
  30347. "add r3, r3, r7\n\t"
  30348. "lsl r7, r8, #16\n\t"
  30349. "lsr r7, r7, #16\n\t"
  30350. "mul r6, r7, r6\n\t"
  30351. "lsr r7, r6, #16\n\t"
  30352. "lsl r6, r6, #16\n\t"
  30353. "adds r5, r5, r6\n\t"
  30354. "adc r3, r3, r7\n\t"
  30355. #else
  30356. "umlal r5, r3, %[b], r8\n\t"
  30357. #endif
  30358. "stm %[r]!, {r5}\n\t"
  30359. "mov r4, #0\n\t"
  30360. /* A[48] * B */
  30361. "ldm %[a]!, {r8}\n\t"
  30362. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30363. "lsl r6, %[b], #16\n\t"
  30364. "lsl r7, r8, #16\n\t"
  30365. "lsr r6, r6, #16\n\t"
  30366. "lsr r7, r7, #16\n\t"
  30367. "mul r7, r6, r7\n\t"
  30368. "adds r3, r3, r7\n\t"
  30369. "adc r4, r4, #0\n\t"
  30370. "lsr r7, r8, #16\n\t"
  30371. "mul r6, r7, r6\n\t"
  30372. "lsr r7, r6, #16\n\t"
  30373. "lsl r6, r6, #16\n\t"
  30374. "adds r3, r3, r6\n\t"
  30375. "adc r4, r4, r7\n\t"
  30376. "lsr r6, %[b], #16\n\t"
  30377. "lsr r7, r8, #16\n\t"
  30378. "mul r7, r6, r7\n\t"
  30379. "add r4, r4, r7\n\t"
  30380. "lsl r7, r8, #16\n\t"
  30381. "lsr r7, r7, #16\n\t"
  30382. "mul r6, r7, r6\n\t"
  30383. "lsr r7, r6, #16\n\t"
  30384. "lsl r6, r6, #16\n\t"
  30385. "adds r3, r3, r6\n\t"
  30386. "adc r4, r4, r7\n\t"
  30387. #else
  30388. "umlal r3, r4, %[b], r8\n\t"
  30389. #endif
  30390. "stm %[r]!, {r3}\n\t"
  30391. "mov r5, #0\n\t"
  30392. /* A[49] * B */
  30393. "ldm %[a]!, {r8}\n\t"
  30394. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30395. "lsl r6, %[b], #16\n\t"
  30396. "lsl r7, r8, #16\n\t"
  30397. "lsr r6, r6, #16\n\t"
  30398. "lsr r7, r7, #16\n\t"
  30399. "mul r7, r6, r7\n\t"
  30400. "adds r4, r4, r7\n\t"
  30401. "adc r5, r5, #0\n\t"
  30402. "lsr r7, r8, #16\n\t"
  30403. "mul r6, r7, r6\n\t"
  30404. "lsr r7, r6, #16\n\t"
  30405. "lsl r6, r6, #16\n\t"
  30406. "adds r4, r4, r6\n\t"
  30407. "adc r5, r5, r7\n\t"
  30408. "lsr r6, %[b], #16\n\t"
  30409. "lsr r7, r8, #16\n\t"
  30410. "mul r7, r6, r7\n\t"
  30411. "add r5, r5, r7\n\t"
  30412. "lsl r7, r8, #16\n\t"
  30413. "lsr r7, r7, #16\n\t"
  30414. "mul r6, r7, r6\n\t"
  30415. "lsr r7, r6, #16\n\t"
  30416. "lsl r6, r6, #16\n\t"
  30417. "adds r4, r4, r6\n\t"
  30418. "adc r5, r5, r7\n\t"
  30419. #else
  30420. "umlal r4, r5, %[b], r8\n\t"
  30421. #endif
  30422. "stm %[r]!, {r4}\n\t"
  30423. "mov r3, #0\n\t"
  30424. /* A[50] * B */
  30425. "ldm %[a]!, {r8}\n\t"
  30426. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30427. "lsl r6, %[b], #16\n\t"
  30428. "lsl r7, r8, #16\n\t"
  30429. "lsr r6, r6, #16\n\t"
  30430. "lsr r7, r7, #16\n\t"
  30431. "mul r7, r6, r7\n\t"
  30432. "adds r5, r5, r7\n\t"
  30433. "adc r3, r3, #0\n\t"
  30434. "lsr r7, r8, #16\n\t"
  30435. "mul r6, r7, r6\n\t"
  30436. "lsr r7, r6, #16\n\t"
  30437. "lsl r6, r6, #16\n\t"
  30438. "adds r5, r5, r6\n\t"
  30439. "adc r3, r3, r7\n\t"
  30440. "lsr r6, %[b], #16\n\t"
  30441. "lsr r7, r8, #16\n\t"
  30442. "mul r7, r6, r7\n\t"
  30443. "add r3, r3, r7\n\t"
  30444. "lsl r7, r8, #16\n\t"
  30445. "lsr r7, r7, #16\n\t"
  30446. "mul r6, r7, r6\n\t"
  30447. "lsr r7, r6, #16\n\t"
  30448. "lsl r6, r6, #16\n\t"
  30449. "adds r5, r5, r6\n\t"
  30450. "adc r3, r3, r7\n\t"
  30451. #else
  30452. "umlal r5, r3, %[b], r8\n\t"
  30453. #endif
  30454. "stm %[r]!, {r5}\n\t"
  30455. "mov r4, #0\n\t"
  30456. /* A[51] * B */
  30457. "ldm %[a]!, {r8}\n\t"
  30458. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30459. "lsl r6, %[b], #16\n\t"
  30460. "lsl r7, r8, #16\n\t"
  30461. "lsr r6, r6, #16\n\t"
  30462. "lsr r7, r7, #16\n\t"
  30463. "mul r7, r6, r7\n\t"
  30464. "adds r3, r3, r7\n\t"
  30465. "adc r4, r4, #0\n\t"
  30466. "lsr r7, r8, #16\n\t"
  30467. "mul r6, r7, r6\n\t"
  30468. "lsr r7, r6, #16\n\t"
  30469. "lsl r6, r6, #16\n\t"
  30470. "adds r3, r3, r6\n\t"
  30471. "adc r4, r4, r7\n\t"
  30472. "lsr r6, %[b], #16\n\t"
  30473. "lsr r7, r8, #16\n\t"
  30474. "mul r7, r6, r7\n\t"
  30475. "add r4, r4, r7\n\t"
  30476. "lsl r7, r8, #16\n\t"
  30477. "lsr r7, r7, #16\n\t"
  30478. "mul r6, r7, r6\n\t"
  30479. "lsr r7, r6, #16\n\t"
  30480. "lsl r6, r6, #16\n\t"
  30481. "adds r3, r3, r6\n\t"
  30482. "adc r4, r4, r7\n\t"
  30483. #else
  30484. "umlal r3, r4, %[b], r8\n\t"
  30485. #endif
  30486. "stm %[r]!, {r3}\n\t"
  30487. "mov r5, #0\n\t"
  30488. /* A[52] * B */
  30489. "ldm %[a]!, {r8}\n\t"
  30490. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30491. "lsl r6, %[b], #16\n\t"
  30492. "lsl r7, r8, #16\n\t"
  30493. "lsr r6, r6, #16\n\t"
  30494. "lsr r7, r7, #16\n\t"
  30495. "mul r7, r6, r7\n\t"
  30496. "adds r4, r4, r7\n\t"
  30497. "adc r5, r5, #0\n\t"
  30498. "lsr r7, r8, #16\n\t"
  30499. "mul r6, r7, r6\n\t"
  30500. "lsr r7, r6, #16\n\t"
  30501. "lsl r6, r6, #16\n\t"
  30502. "adds r4, r4, r6\n\t"
  30503. "adc r5, r5, r7\n\t"
  30504. "lsr r6, %[b], #16\n\t"
  30505. "lsr r7, r8, #16\n\t"
  30506. "mul r7, r6, r7\n\t"
  30507. "add r5, r5, r7\n\t"
  30508. "lsl r7, r8, #16\n\t"
  30509. "lsr r7, r7, #16\n\t"
  30510. "mul r6, r7, r6\n\t"
  30511. "lsr r7, r6, #16\n\t"
  30512. "lsl r6, r6, #16\n\t"
  30513. "adds r4, r4, r6\n\t"
  30514. "adc r5, r5, r7\n\t"
  30515. #else
  30516. "umlal r4, r5, %[b], r8\n\t"
  30517. #endif
  30518. "stm %[r]!, {r4}\n\t"
  30519. "mov r3, #0\n\t"
  30520. /* A[53] * B */
  30521. "ldm %[a]!, {r8}\n\t"
  30522. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30523. "lsl r6, %[b], #16\n\t"
  30524. "lsl r7, r8, #16\n\t"
  30525. "lsr r6, r6, #16\n\t"
  30526. "lsr r7, r7, #16\n\t"
  30527. "mul r7, r6, r7\n\t"
  30528. "adds r5, r5, r7\n\t"
  30529. "adc r3, r3, #0\n\t"
  30530. "lsr r7, r8, #16\n\t"
  30531. "mul r6, r7, r6\n\t"
  30532. "lsr r7, r6, #16\n\t"
  30533. "lsl r6, r6, #16\n\t"
  30534. "adds r5, r5, r6\n\t"
  30535. "adc r3, r3, r7\n\t"
  30536. "lsr r6, %[b], #16\n\t"
  30537. "lsr r7, r8, #16\n\t"
  30538. "mul r7, r6, r7\n\t"
  30539. "add r3, r3, r7\n\t"
  30540. "lsl r7, r8, #16\n\t"
  30541. "lsr r7, r7, #16\n\t"
  30542. "mul r6, r7, r6\n\t"
  30543. "lsr r7, r6, #16\n\t"
  30544. "lsl r6, r6, #16\n\t"
  30545. "adds r5, r5, r6\n\t"
  30546. "adc r3, r3, r7\n\t"
  30547. #else
  30548. "umlal r5, r3, %[b], r8\n\t"
  30549. #endif
  30550. "stm %[r]!, {r5}\n\t"
  30551. "mov r4, #0\n\t"
  30552. /* A[54] * B */
  30553. "ldm %[a]!, {r8}\n\t"
  30554. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30555. "lsl r6, %[b], #16\n\t"
  30556. "lsl r7, r8, #16\n\t"
  30557. "lsr r6, r6, #16\n\t"
  30558. "lsr r7, r7, #16\n\t"
  30559. "mul r7, r6, r7\n\t"
  30560. "adds r3, r3, r7\n\t"
  30561. "adc r4, r4, #0\n\t"
  30562. "lsr r7, r8, #16\n\t"
  30563. "mul r6, r7, r6\n\t"
  30564. "lsr r7, r6, #16\n\t"
  30565. "lsl r6, r6, #16\n\t"
  30566. "adds r3, r3, r6\n\t"
  30567. "adc r4, r4, r7\n\t"
  30568. "lsr r6, %[b], #16\n\t"
  30569. "lsr r7, r8, #16\n\t"
  30570. "mul r7, r6, r7\n\t"
  30571. "add r4, r4, r7\n\t"
  30572. "lsl r7, r8, #16\n\t"
  30573. "lsr r7, r7, #16\n\t"
  30574. "mul r6, r7, r6\n\t"
  30575. "lsr r7, r6, #16\n\t"
  30576. "lsl r6, r6, #16\n\t"
  30577. "adds r3, r3, r6\n\t"
  30578. "adc r4, r4, r7\n\t"
  30579. #else
  30580. "umlal r3, r4, %[b], r8\n\t"
  30581. #endif
  30582. "stm %[r]!, {r3}\n\t"
  30583. "mov r5, #0\n\t"
  30584. /* A[55] * B */
  30585. "ldm %[a]!, {r8}\n\t"
  30586. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30587. "lsl r6, %[b], #16\n\t"
  30588. "lsl r7, r8, #16\n\t"
  30589. "lsr r6, r6, #16\n\t"
  30590. "lsr r7, r7, #16\n\t"
  30591. "mul r7, r6, r7\n\t"
  30592. "adds r4, r4, r7\n\t"
  30593. "adc r5, r5, #0\n\t"
  30594. "lsr r7, r8, #16\n\t"
  30595. "mul r6, r7, r6\n\t"
  30596. "lsr r7, r6, #16\n\t"
  30597. "lsl r6, r6, #16\n\t"
  30598. "adds r4, r4, r6\n\t"
  30599. "adc r5, r5, r7\n\t"
  30600. "lsr r6, %[b], #16\n\t"
  30601. "lsr r7, r8, #16\n\t"
  30602. "mul r7, r6, r7\n\t"
  30603. "add r5, r5, r7\n\t"
  30604. "lsl r7, r8, #16\n\t"
  30605. "lsr r7, r7, #16\n\t"
  30606. "mul r6, r7, r6\n\t"
  30607. "lsr r7, r6, #16\n\t"
  30608. "lsl r6, r6, #16\n\t"
  30609. "adds r4, r4, r6\n\t"
  30610. "adc r5, r5, r7\n\t"
  30611. #else
  30612. "umlal r4, r5, %[b], r8\n\t"
  30613. #endif
  30614. "stm %[r]!, {r4}\n\t"
  30615. "mov r3, #0\n\t"
  30616. /* A[56] * B */
  30617. "ldm %[a]!, {r8}\n\t"
  30618. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30619. "lsl r6, %[b], #16\n\t"
  30620. "lsl r7, r8, #16\n\t"
  30621. "lsr r6, r6, #16\n\t"
  30622. "lsr r7, r7, #16\n\t"
  30623. "mul r7, r6, r7\n\t"
  30624. "adds r5, r5, r7\n\t"
  30625. "adc r3, r3, #0\n\t"
  30626. "lsr r7, r8, #16\n\t"
  30627. "mul r6, r7, r6\n\t"
  30628. "lsr r7, r6, #16\n\t"
  30629. "lsl r6, r6, #16\n\t"
  30630. "adds r5, r5, r6\n\t"
  30631. "adc r3, r3, r7\n\t"
  30632. "lsr r6, %[b], #16\n\t"
  30633. "lsr r7, r8, #16\n\t"
  30634. "mul r7, r6, r7\n\t"
  30635. "add r3, r3, r7\n\t"
  30636. "lsl r7, r8, #16\n\t"
  30637. "lsr r7, r7, #16\n\t"
  30638. "mul r6, r7, r6\n\t"
  30639. "lsr r7, r6, #16\n\t"
  30640. "lsl r6, r6, #16\n\t"
  30641. "adds r5, r5, r6\n\t"
  30642. "adc r3, r3, r7\n\t"
  30643. #else
  30644. "umlal r5, r3, %[b], r8\n\t"
  30645. #endif
  30646. "stm %[r]!, {r5}\n\t"
  30647. "mov r4, #0\n\t"
  30648. /* A[57] * B */
  30649. "ldm %[a]!, {r8}\n\t"
  30650. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30651. "lsl r6, %[b], #16\n\t"
  30652. "lsl r7, r8, #16\n\t"
  30653. "lsr r6, r6, #16\n\t"
  30654. "lsr r7, r7, #16\n\t"
  30655. "mul r7, r6, r7\n\t"
  30656. "adds r3, r3, r7\n\t"
  30657. "adc r4, r4, #0\n\t"
  30658. "lsr r7, r8, #16\n\t"
  30659. "mul r6, r7, r6\n\t"
  30660. "lsr r7, r6, #16\n\t"
  30661. "lsl r6, r6, #16\n\t"
  30662. "adds r3, r3, r6\n\t"
  30663. "adc r4, r4, r7\n\t"
  30664. "lsr r6, %[b], #16\n\t"
  30665. "lsr r7, r8, #16\n\t"
  30666. "mul r7, r6, r7\n\t"
  30667. "add r4, r4, r7\n\t"
  30668. "lsl r7, r8, #16\n\t"
  30669. "lsr r7, r7, #16\n\t"
  30670. "mul r6, r7, r6\n\t"
  30671. "lsr r7, r6, #16\n\t"
  30672. "lsl r6, r6, #16\n\t"
  30673. "adds r3, r3, r6\n\t"
  30674. "adc r4, r4, r7\n\t"
  30675. #else
  30676. "umlal r3, r4, %[b], r8\n\t"
  30677. #endif
  30678. "stm %[r]!, {r3}\n\t"
  30679. "mov r5, #0\n\t"
  30680. /* A[58] * B */
  30681. "ldm %[a]!, {r8}\n\t"
  30682. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30683. "lsl r6, %[b], #16\n\t"
  30684. "lsl r7, r8, #16\n\t"
  30685. "lsr r6, r6, #16\n\t"
  30686. "lsr r7, r7, #16\n\t"
  30687. "mul r7, r6, r7\n\t"
  30688. "adds r4, r4, r7\n\t"
  30689. "adc r5, r5, #0\n\t"
  30690. "lsr r7, r8, #16\n\t"
  30691. "mul r6, r7, r6\n\t"
  30692. "lsr r7, r6, #16\n\t"
  30693. "lsl r6, r6, #16\n\t"
  30694. "adds r4, r4, r6\n\t"
  30695. "adc r5, r5, r7\n\t"
  30696. "lsr r6, %[b], #16\n\t"
  30697. "lsr r7, r8, #16\n\t"
  30698. "mul r7, r6, r7\n\t"
  30699. "add r5, r5, r7\n\t"
  30700. "lsl r7, r8, #16\n\t"
  30701. "lsr r7, r7, #16\n\t"
  30702. "mul r6, r7, r6\n\t"
  30703. "lsr r7, r6, #16\n\t"
  30704. "lsl r6, r6, #16\n\t"
  30705. "adds r4, r4, r6\n\t"
  30706. "adc r5, r5, r7\n\t"
  30707. #else
  30708. "umlal r4, r5, %[b], r8\n\t"
  30709. #endif
  30710. "stm %[r]!, {r4}\n\t"
  30711. "mov r3, #0\n\t"
  30712. /* A[59] * B */
  30713. "ldm %[a]!, {r8}\n\t"
  30714. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30715. "lsl r6, %[b], #16\n\t"
  30716. "lsl r7, r8, #16\n\t"
  30717. "lsr r6, r6, #16\n\t"
  30718. "lsr r7, r7, #16\n\t"
  30719. "mul r7, r6, r7\n\t"
  30720. "adds r5, r5, r7\n\t"
  30721. "adc r3, r3, #0\n\t"
  30722. "lsr r7, r8, #16\n\t"
  30723. "mul r6, r7, r6\n\t"
  30724. "lsr r7, r6, #16\n\t"
  30725. "lsl r6, r6, #16\n\t"
  30726. "adds r5, r5, r6\n\t"
  30727. "adc r3, r3, r7\n\t"
  30728. "lsr r6, %[b], #16\n\t"
  30729. "lsr r7, r8, #16\n\t"
  30730. "mul r7, r6, r7\n\t"
  30731. "add r3, r3, r7\n\t"
  30732. "lsl r7, r8, #16\n\t"
  30733. "lsr r7, r7, #16\n\t"
  30734. "mul r6, r7, r6\n\t"
  30735. "lsr r7, r6, #16\n\t"
  30736. "lsl r6, r6, #16\n\t"
  30737. "adds r5, r5, r6\n\t"
  30738. "adc r3, r3, r7\n\t"
  30739. #else
  30740. "umlal r5, r3, %[b], r8\n\t"
  30741. #endif
  30742. "stm %[r]!, {r5}\n\t"
  30743. "mov r4, #0\n\t"
  30744. /* A[60] * B */
  30745. "ldm %[a]!, {r8}\n\t"
  30746. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30747. "lsl r6, %[b], #16\n\t"
  30748. "lsl r7, r8, #16\n\t"
  30749. "lsr r6, r6, #16\n\t"
  30750. "lsr r7, r7, #16\n\t"
  30751. "mul r7, r6, r7\n\t"
  30752. "adds r3, r3, r7\n\t"
  30753. "adc r4, r4, #0\n\t"
  30754. "lsr r7, r8, #16\n\t"
  30755. "mul r6, r7, r6\n\t"
  30756. "lsr r7, r6, #16\n\t"
  30757. "lsl r6, r6, #16\n\t"
  30758. "adds r3, r3, r6\n\t"
  30759. "adc r4, r4, r7\n\t"
  30760. "lsr r6, %[b], #16\n\t"
  30761. "lsr r7, r8, #16\n\t"
  30762. "mul r7, r6, r7\n\t"
  30763. "add r4, r4, r7\n\t"
  30764. "lsl r7, r8, #16\n\t"
  30765. "lsr r7, r7, #16\n\t"
  30766. "mul r6, r7, r6\n\t"
  30767. "lsr r7, r6, #16\n\t"
  30768. "lsl r6, r6, #16\n\t"
  30769. "adds r3, r3, r6\n\t"
  30770. "adc r4, r4, r7\n\t"
  30771. #else
  30772. "umlal r3, r4, %[b], r8\n\t"
  30773. #endif
  30774. "stm %[r]!, {r3}\n\t"
  30775. "mov r5, #0\n\t"
  30776. /* A[61] * B */
  30777. "ldm %[a]!, {r8}\n\t"
  30778. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30779. "lsl r6, %[b], #16\n\t"
  30780. "lsl r7, r8, #16\n\t"
  30781. "lsr r6, r6, #16\n\t"
  30782. "lsr r7, r7, #16\n\t"
  30783. "mul r7, r6, r7\n\t"
  30784. "adds r4, r4, r7\n\t"
  30785. "adc r5, r5, #0\n\t"
  30786. "lsr r7, r8, #16\n\t"
  30787. "mul r6, r7, r6\n\t"
  30788. "lsr r7, r6, #16\n\t"
  30789. "lsl r6, r6, #16\n\t"
  30790. "adds r4, r4, r6\n\t"
  30791. "adc r5, r5, r7\n\t"
  30792. "lsr r6, %[b], #16\n\t"
  30793. "lsr r7, r8, #16\n\t"
  30794. "mul r7, r6, r7\n\t"
  30795. "add r5, r5, r7\n\t"
  30796. "lsl r7, r8, #16\n\t"
  30797. "lsr r7, r7, #16\n\t"
  30798. "mul r6, r7, r6\n\t"
  30799. "lsr r7, r6, #16\n\t"
  30800. "lsl r6, r6, #16\n\t"
  30801. "adds r4, r4, r6\n\t"
  30802. "adc r5, r5, r7\n\t"
  30803. #else
  30804. "umlal r4, r5, %[b], r8\n\t"
  30805. #endif
  30806. "stm %[r]!, {r4}\n\t"
  30807. "mov r3, #0\n\t"
  30808. /* A[62] * B */
  30809. "ldm %[a]!, {r8}\n\t"
  30810. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30811. "lsl r6, %[b], #16\n\t"
  30812. "lsl r7, r8, #16\n\t"
  30813. "lsr r6, r6, #16\n\t"
  30814. "lsr r7, r7, #16\n\t"
  30815. "mul r7, r6, r7\n\t"
  30816. "adds r5, r5, r7\n\t"
  30817. "adc r3, r3, #0\n\t"
  30818. "lsr r7, r8, #16\n\t"
  30819. "mul r6, r7, r6\n\t"
  30820. "lsr r7, r6, #16\n\t"
  30821. "lsl r6, r6, #16\n\t"
  30822. "adds r5, r5, r6\n\t"
  30823. "adc r3, r3, r7\n\t"
  30824. "lsr r6, %[b], #16\n\t"
  30825. "lsr r7, r8, #16\n\t"
  30826. "mul r7, r6, r7\n\t"
  30827. "add r3, r3, r7\n\t"
  30828. "lsl r7, r8, #16\n\t"
  30829. "lsr r7, r7, #16\n\t"
  30830. "mul r6, r7, r6\n\t"
  30831. "lsr r7, r6, #16\n\t"
  30832. "lsl r6, r6, #16\n\t"
  30833. "adds r5, r5, r6\n\t"
  30834. "adc r3, r3, r7\n\t"
  30835. #else
  30836. "umlal r5, r3, %[b], r8\n\t"
  30837. #endif
  30838. "stm %[r]!, {r5}\n\t"
  30839. "mov r4, #0\n\t"
  30840. /* A[63] * B */
  30841. "ldm %[a]!, {r8}\n\t"
  30842. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30843. "lsl r6, %[b], #16\n\t"
  30844. "lsl r7, r8, #16\n\t"
  30845. "lsr r6, r6, #16\n\t"
  30846. "lsr r7, r7, #16\n\t"
  30847. "mul r7, r6, r7\n\t"
  30848. "adds r3, r3, r7\n\t"
  30849. "adc r4, r4, #0\n\t"
  30850. "lsr r7, r8, #16\n\t"
  30851. "mul r6, r7, r6\n\t"
  30852. "lsr r7, r6, #16\n\t"
  30853. "lsl r6, r6, #16\n\t"
  30854. "adds r3, r3, r6\n\t"
  30855. "adc r4, r4, r7\n\t"
  30856. "lsr r6, %[b], #16\n\t"
  30857. "lsr r7, r8, #16\n\t"
  30858. "mul r7, r6, r7\n\t"
  30859. "add r4, r4, r7\n\t"
  30860. "lsl r7, r8, #16\n\t"
  30861. "lsr r7, r7, #16\n\t"
  30862. "mul r6, r7, r6\n\t"
  30863. "lsr r7, r6, #16\n\t"
  30864. "lsl r6, r6, #16\n\t"
  30865. "adds r3, r3, r6\n\t"
  30866. "adc r4, r4, r7\n\t"
  30867. #else
  30868. "umlal r3, r4, %[b], r8\n\t"
  30869. #endif
  30870. "stm %[r]!, {r3}\n\t"
  30871. "mov r5, #0\n\t"
  30872. /* A[64] * B */
  30873. "ldm %[a]!, {r8}\n\t"
  30874. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30875. "lsl r6, %[b], #16\n\t"
  30876. "lsl r7, r8, #16\n\t"
  30877. "lsr r6, r6, #16\n\t"
  30878. "lsr r7, r7, #16\n\t"
  30879. "mul r7, r6, r7\n\t"
  30880. "adds r4, r4, r7\n\t"
  30881. "adc r5, r5, #0\n\t"
  30882. "lsr r7, r8, #16\n\t"
  30883. "mul r6, r7, r6\n\t"
  30884. "lsr r7, r6, #16\n\t"
  30885. "lsl r6, r6, #16\n\t"
  30886. "adds r4, r4, r6\n\t"
  30887. "adc r5, r5, r7\n\t"
  30888. "lsr r6, %[b], #16\n\t"
  30889. "lsr r7, r8, #16\n\t"
  30890. "mul r7, r6, r7\n\t"
  30891. "add r5, r5, r7\n\t"
  30892. "lsl r7, r8, #16\n\t"
  30893. "lsr r7, r7, #16\n\t"
  30894. "mul r6, r7, r6\n\t"
  30895. "lsr r7, r6, #16\n\t"
  30896. "lsl r6, r6, #16\n\t"
  30897. "adds r4, r4, r6\n\t"
  30898. "adc r5, r5, r7\n\t"
  30899. #else
  30900. "umlal r4, r5, %[b], r8\n\t"
  30901. #endif
  30902. "stm %[r]!, {r4}\n\t"
  30903. "mov r3, #0\n\t"
  30904. /* A[65] * B */
  30905. "ldm %[a]!, {r8}\n\t"
  30906. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30907. "lsl r6, %[b], #16\n\t"
  30908. "lsl r7, r8, #16\n\t"
  30909. "lsr r6, r6, #16\n\t"
  30910. "lsr r7, r7, #16\n\t"
  30911. "mul r7, r6, r7\n\t"
  30912. "adds r5, r5, r7\n\t"
  30913. "adc r3, r3, #0\n\t"
  30914. "lsr r7, r8, #16\n\t"
  30915. "mul r6, r7, r6\n\t"
  30916. "lsr r7, r6, #16\n\t"
  30917. "lsl r6, r6, #16\n\t"
  30918. "adds r5, r5, r6\n\t"
  30919. "adc r3, r3, r7\n\t"
  30920. "lsr r6, %[b], #16\n\t"
  30921. "lsr r7, r8, #16\n\t"
  30922. "mul r7, r6, r7\n\t"
  30923. "add r3, r3, r7\n\t"
  30924. "lsl r7, r8, #16\n\t"
  30925. "lsr r7, r7, #16\n\t"
  30926. "mul r6, r7, r6\n\t"
  30927. "lsr r7, r6, #16\n\t"
  30928. "lsl r6, r6, #16\n\t"
  30929. "adds r5, r5, r6\n\t"
  30930. "adc r3, r3, r7\n\t"
  30931. #else
  30932. "umlal r5, r3, %[b], r8\n\t"
  30933. #endif
  30934. "stm %[r]!, {r5}\n\t"
  30935. "mov r4, #0\n\t"
  30936. /* A[66] * B */
  30937. "ldm %[a]!, {r8}\n\t"
  30938. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30939. "lsl r6, %[b], #16\n\t"
  30940. "lsl r7, r8, #16\n\t"
  30941. "lsr r6, r6, #16\n\t"
  30942. "lsr r7, r7, #16\n\t"
  30943. "mul r7, r6, r7\n\t"
  30944. "adds r3, r3, r7\n\t"
  30945. "adc r4, r4, #0\n\t"
  30946. "lsr r7, r8, #16\n\t"
  30947. "mul r6, r7, r6\n\t"
  30948. "lsr r7, r6, #16\n\t"
  30949. "lsl r6, r6, #16\n\t"
  30950. "adds r3, r3, r6\n\t"
  30951. "adc r4, r4, r7\n\t"
  30952. "lsr r6, %[b], #16\n\t"
  30953. "lsr r7, r8, #16\n\t"
  30954. "mul r7, r6, r7\n\t"
  30955. "add r4, r4, r7\n\t"
  30956. "lsl r7, r8, #16\n\t"
  30957. "lsr r7, r7, #16\n\t"
  30958. "mul r6, r7, r6\n\t"
  30959. "lsr r7, r6, #16\n\t"
  30960. "lsl r6, r6, #16\n\t"
  30961. "adds r3, r3, r6\n\t"
  30962. "adc r4, r4, r7\n\t"
  30963. #else
  30964. "umlal r3, r4, %[b], r8\n\t"
  30965. #endif
  30966. "stm %[r]!, {r3}\n\t"
  30967. "mov r5, #0\n\t"
  30968. /* A[67] * B */
  30969. "ldm %[a]!, {r8}\n\t"
  30970. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  30971. "lsl r6, %[b], #16\n\t"
  30972. "lsl r7, r8, #16\n\t"
  30973. "lsr r6, r6, #16\n\t"
  30974. "lsr r7, r7, #16\n\t"
  30975. "mul r7, r6, r7\n\t"
  30976. "adds r4, r4, r7\n\t"
  30977. "adc r5, r5, #0\n\t"
  30978. "lsr r7, r8, #16\n\t"
  30979. "mul r6, r7, r6\n\t"
  30980. "lsr r7, r6, #16\n\t"
  30981. "lsl r6, r6, #16\n\t"
  30982. "adds r4, r4, r6\n\t"
  30983. "adc r5, r5, r7\n\t"
  30984. "lsr r6, %[b], #16\n\t"
  30985. "lsr r7, r8, #16\n\t"
  30986. "mul r7, r6, r7\n\t"
  30987. "add r5, r5, r7\n\t"
  30988. "lsl r7, r8, #16\n\t"
  30989. "lsr r7, r7, #16\n\t"
  30990. "mul r6, r7, r6\n\t"
  30991. "lsr r7, r6, #16\n\t"
  30992. "lsl r6, r6, #16\n\t"
  30993. "adds r4, r4, r6\n\t"
  30994. "adc r5, r5, r7\n\t"
  30995. #else
  30996. "umlal r4, r5, %[b], r8\n\t"
  30997. #endif
  30998. "stm %[r]!, {r4}\n\t"
  30999. "mov r3, #0\n\t"
  31000. /* A[68] * B */
  31001. "ldm %[a]!, {r8}\n\t"
  31002. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31003. "lsl r6, %[b], #16\n\t"
  31004. "lsl r7, r8, #16\n\t"
  31005. "lsr r6, r6, #16\n\t"
  31006. "lsr r7, r7, #16\n\t"
  31007. "mul r7, r6, r7\n\t"
  31008. "adds r5, r5, r7\n\t"
  31009. "adc r3, r3, #0\n\t"
  31010. "lsr r7, r8, #16\n\t"
  31011. "mul r6, r7, r6\n\t"
  31012. "lsr r7, r6, #16\n\t"
  31013. "lsl r6, r6, #16\n\t"
  31014. "adds r5, r5, r6\n\t"
  31015. "adc r3, r3, r7\n\t"
  31016. "lsr r6, %[b], #16\n\t"
  31017. "lsr r7, r8, #16\n\t"
  31018. "mul r7, r6, r7\n\t"
  31019. "add r3, r3, r7\n\t"
  31020. "lsl r7, r8, #16\n\t"
  31021. "lsr r7, r7, #16\n\t"
  31022. "mul r6, r7, r6\n\t"
  31023. "lsr r7, r6, #16\n\t"
  31024. "lsl r6, r6, #16\n\t"
  31025. "adds r5, r5, r6\n\t"
  31026. "adc r3, r3, r7\n\t"
  31027. #else
  31028. "umlal r5, r3, %[b], r8\n\t"
  31029. #endif
  31030. "stm %[r]!, {r5}\n\t"
  31031. "mov r4, #0\n\t"
  31032. /* A[69] * B */
  31033. "ldm %[a]!, {r8}\n\t"
  31034. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31035. "lsl r6, %[b], #16\n\t"
  31036. "lsl r7, r8, #16\n\t"
  31037. "lsr r6, r6, #16\n\t"
  31038. "lsr r7, r7, #16\n\t"
  31039. "mul r7, r6, r7\n\t"
  31040. "adds r3, r3, r7\n\t"
  31041. "adc r4, r4, #0\n\t"
  31042. "lsr r7, r8, #16\n\t"
  31043. "mul r6, r7, r6\n\t"
  31044. "lsr r7, r6, #16\n\t"
  31045. "lsl r6, r6, #16\n\t"
  31046. "adds r3, r3, r6\n\t"
  31047. "adc r4, r4, r7\n\t"
  31048. "lsr r6, %[b], #16\n\t"
  31049. "lsr r7, r8, #16\n\t"
  31050. "mul r7, r6, r7\n\t"
  31051. "add r4, r4, r7\n\t"
  31052. "lsl r7, r8, #16\n\t"
  31053. "lsr r7, r7, #16\n\t"
  31054. "mul r6, r7, r6\n\t"
  31055. "lsr r7, r6, #16\n\t"
  31056. "lsl r6, r6, #16\n\t"
  31057. "adds r3, r3, r6\n\t"
  31058. "adc r4, r4, r7\n\t"
  31059. #else
  31060. "umlal r3, r4, %[b], r8\n\t"
  31061. #endif
  31062. "stm %[r]!, {r3}\n\t"
  31063. "mov r5, #0\n\t"
  31064. /* A[70] * B */
  31065. "ldm %[a]!, {r8}\n\t"
  31066. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31067. "lsl r6, %[b], #16\n\t"
  31068. "lsl r7, r8, #16\n\t"
  31069. "lsr r6, r6, #16\n\t"
  31070. "lsr r7, r7, #16\n\t"
  31071. "mul r7, r6, r7\n\t"
  31072. "adds r4, r4, r7\n\t"
  31073. "adc r5, r5, #0\n\t"
  31074. "lsr r7, r8, #16\n\t"
  31075. "mul r6, r7, r6\n\t"
  31076. "lsr r7, r6, #16\n\t"
  31077. "lsl r6, r6, #16\n\t"
  31078. "adds r4, r4, r6\n\t"
  31079. "adc r5, r5, r7\n\t"
  31080. "lsr r6, %[b], #16\n\t"
  31081. "lsr r7, r8, #16\n\t"
  31082. "mul r7, r6, r7\n\t"
  31083. "add r5, r5, r7\n\t"
  31084. "lsl r7, r8, #16\n\t"
  31085. "lsr r7, r7, #16\n\t"
  31086. "mul r6, r7, r6\n\t"
  31087. "lsr r7, r6, #16\n\t"
  31088. "lsl r6, r6, #16\n\t"
  31089. "adds r4, r4, r6\n\t"
  31090. "adc r5, r5, r7\n\t"
  31091. #else
  31092. "umlal r4, r5, %[b], r8\n\t"
  31093. #endif
  31094. "stm %[r]!, {r4}\n\t"
  31095. "mov r3, #0\n\t"
  31096. /* A[71] * B */
  31097. "ldm %[a]!, {r8}\n\t"
  31098. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31099. "lsl r6, %[b], #16\n\t"
  31100. "lsl r7, r8, #16\n\t"
  31101. "lsr r6, r6, #16\n\t"
  31102. "lsr r7, r7, #16\n\t"
  31103. "mul r7, r6, r7\n\t"
  31104. "adds r5, r5, r7\n\t"
  31105. "adc r3, r3, #0\n\t"
  31106. "lsr r7, r8, #16\n\t"
  31107. "mul r6, r7, r6\n\t"
  31108. "lsr r7, r6, #16\n\t"
  31109. "lsl r6, r6, #16\n\t"
  31110. "adds r5, r5, r6\n\t"
  31111. "adc r3, r3, r7\n\t"
  31112. "lsr r6, %[b], #16\n\t"
  31113. "lsr r7, r8, #16\n\t"
  31114. "mul r7, r6, r7\n\t"
  31115. "add r3, r3, r7\n\t"
  31116. "lsl r7, r8, #16\n\t"
  31117. "lsr r7, r7, #16\n\t"
  31118. "mul r6, r7, r6\n\t"
  31119. "lsr r7, r6, #16\n\t"
  31120. "lsl r6, r6, #16\n\t"
  31121. "adds r5, r5, r6\n\t"
  31122. "adc r3, r3, r7\n\t"
  31123. #else
  31124. "umlal r5, r3, %[b], r8\n\t"
  31125. #endif
  31126. "stm %[r]!, {r5}\n\t"
  31127. "mov r4, #0\n\t"
  31128. /* A[72] * B */
  31129. "ldm %[a]!, {r8}\n\t"
  31130. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31131. "lsl r6, %[b], #16\n\t"
  31132. "lsl r7, r8, #16\n\t"
  31133. "lsr r6, r6, #16\n\t"
  31134. "lsr r7, r7, #16\n\t"
  31135. "mul r7, r6, r7\n\t"
  31136. "adds r3, r3, r7\n\t"
  31137. "adc r4, r4, #0\n\t"
  31138. "lsr r7, r8, #16\n\t"
  31139. "mul r6, r7, r6\n\t"
  31140. "lsr r7, r6, #16\n\t"
  31141. "lsl r6, r6, #16\n\t"
  31142. "adds r3, r3, r6\n\t"
  31143. "adc r4, r4, r7\n\t"
  31144. "lsr r6, %[b], #16\n\t"
  31145. "lsr r7, r8, #16\n\t"
  31146. "mul r7, r6, r7\n\t"
  31147. "add r4, r4, r7\n\t"
  31148. "lsl r7, r8, #16\n\t"
  31149. "lsr r7, r7, #16\n\t"
  31150. "mul r6, r7, r6\n\t"
  31151. "lsr r7, r6, #16\n\t"
  31152. "lsl r6, r6, #16\n\t"
  31153. "adds r3, r3, r6\n\t"
  31154. "adc r4, r4, r7\n\t"
  31155. #else
  31156. "umlal r3, r4, %[b], r8\n\t"
  31157. #endif
  31158. "stm %[r]!, {r3}\n\t"
  31159. "mov r5, #0\n\t"
  31160. /* A[73] * B */
  31161. "ldm %[a]!, {r8}\n\t"
  31162. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31163. "lsl r6, %[b], #16\n\t"
  31164. "lsl r7, r8, #16\n\t"
  31165. "lsr r6, r6, #16\n\t"
  31166. "lsr r7, r7, #16\n\t"
  31167. "mul r7, r6, r7\n\t"
  31168. "adds r4, r4, r7\n\t"
  31169. "adc r5, r5, #0\n\t"
  31170. "lsr r7, r8, #16\n\t"
  31171. "mul r6, r7, r6\n\t"
  31172. "lsr r7, r6, #16\n\t"
  31173. "lsl r6, r6, #16\n\t"
  31174. "adds r4, r4, r6\n\t"
  31175. "adc r5, r5, r7\n\t"
  31176. "lsr r6, %[b], #16\n\t"
  31177. "lsr r7, r8, #16\n\t"
  31178. "mul r7, r6, r7\n\t"
  31179. "add r5, r5, r7\n\t"
  31180. "lsl r7, r8, #16\n\t"
  31181. "lsr r7, r7, #16\n\t"
  31182. "mul r6, r7, r6\n\t"
  31183. "lsr r7, r6, #16\n\t"
  31184. "lsl r6, r6, #16\n\t"
  31185. "adds r4, r4, r6\n\t"
  31186. "adc r5, r5, r7\n\t"
  31187. #else
  31188. "umlal r4, r5, %[b], r8\n\t"
  31189. #endif
  31190. "stm %[r]!, {r4}\n\t"
  31191. "mov r3, #0\n\t"
  31192. /* A[74] * B */
  31193. "ldm %[a]!, {r8}\n\t"
  31194. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31195. "lsl r6, %[b], #16\n\t"
  31196. "lsl r7, r8, #16\n\t"
  31197. "lsr r6, r6, #16\n\t"
  31198. "lsr r7, r7, #16\n\t"
  31199. "mul r7, r6, r7\n\t"
  31200. "adds r5, r5, r7\n\t"
  31201. "adc r3, r3, #0\n\t"
  31202. "lsr r7, r8, #16\n\t"
  31203. "mul r6, r7, r6\n\t"
  31204. "lsr r7, r6, #16\n\t"
  31205. "lsl r6, r6, #16\n\t"
  31206. "adds r5, r5, r6\n\t"
  31207. "adc r3, r3, r7\n\t"
  31208. "lsr r6, %[b], #16\n\t"
  31209. "lsr r7, r8, #16\n\t"
  31210. "mul r7, r6, r7\n\t"
  31211. "add r3, r3, r7\n\t"
  31212. "lsl r7, r8, #16\n\t"
  31213. "lsr r7, r7, #16\n\t"
  31214. "mul r6, r7, r6\n\t"
  31215. "lsr r7, r6, #16\n\t"
  31216. "lsl r6, r6, #16\n\t"
  31217. "adds r5, r5, r6\n\t"
  31218. "adc r3, r3, r7\n\t"
  31219. #else
  31220. "umlal r5, r3, %[b], r8\n\t"
  31221. #endif
  31222. "stm %[r]!, {r5}\n\t"
  31223. "mov r4, #0\n\t"
  31224. /* A[75] * B */
  31225. "ldm %[a]!, {r8}\n\t"
  31226. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31227. "lsl r6, %[b], #16\n\t"
  31228. "lsl r7, r8, #16\n\t"
  31229. "lsr r6, r6, #16\n\t"
  31230. "lsr r7, r7, #16\n\t"
  31231. "mul r7, r6, r7\n\t"
  31232. "adds r3, r3, r7\n\t"
  31233. "adc r4, r4, #0\n\t"
  31234. "lsr r7, r8, #16\n\t"
  31235. "mul r6, r7, r6\n\t"
  31236. "lsr r7, r6, #16\n\t"
  31237. "lsl r6, r6, #16\n\t"
  31238. "adds r3, r3, r6\n\t"
  31239. "adc r4, r4, r7\n\t"
  31240. "lsr r6, %[b], #16\n\t"
  31241. "lsr r7, r8, #16\n\t"
  31242. "mul r7, r6, r7\n\t"
  31243. "add r4, r4, r7\n\t"
  31244. "lsl r7, r8, #16\n\t"
  31245. "lsr r7, r7, #16\n\t"
  31246. "mul r6, r7, r6\n\t"
  31247. "lsr r7, r6, #16\n\t"
  31248. "lsl r6, r6, #16\n\t"
  31249. "adds r3, r3, r6\n\t"
  31250. "adc r4, r4, r7\n\t"
  31251. #else
  31252. "umlal r3, r4, %[b], r8\n\t"
  31253. #endif
  31254. "stm %[r]!, {r3}\n\t"
  31255. "mov r5, #0\n\t"
  31256. /* A[76] * B */
  31257. "ldm %[a]!, {r8}\n\t"
  31258. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31259. "lsl r6, %[b], #16\n\t"
  31260. "lsl r7, r8, #16\n\t"
  31261. "lsr r6, r6, #16\n\t"
  31262. "lsr r7, r7, #16\n\t"
  31263. "mul r7, r6, r7\n\t"
  31264. "adds r4, r4, r7\n\t"
  31265. "adc r5, r5, #0\n\t"
  31266. "lsr r7, r8, #16\n\t"
  31267. "mul r6, r7, r6\n\t"
  31268. "lsr r7, r6, #16\n\t"
  31269. "lsl r6, r6, #16\n\t"
  31270. "adds r4, r4, r6\n\t"
  31271. "adc r5, r5, r7\n\t"
  31272. "lsr r6, %[b], #16\n\t"
  31273. "lsr r7, r8, #16\n\t"
  31274. "mul r7, r6, r7\n\t"
  31275. "add r5, r5, r7\n\t"
  31276. "lsl r7, r8, #16\n\t"
  31277. "lsr r7, r7, #16\n\t"
  31278. "mul r6, r7, r6\n\t"
  31279. "lsr r7, r6, #16\n\t"
  31280. "lsl r6, r6, #16\n\t"
  31281. "adds r4, r4, r6\n\t"
  31282. "adc r5, r5, r7\n\t"
  31283. #else
  31284. "umlal r4, r5, %[b], r8\n\t"
  31285. #endif
  31286. "stm %[r]!, {r4}\n\t"
  31287. "mov r3, #0\n\t"
  31288. /* A[77] * B */
  31289. "ldm %[a]!, {r8}\n\t"
  31290. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31291. "lsl r6, %[b], #16\n\t"
  31292. "lsl r7, r8, #16\n\t"
  31293. "lsr r6, r6, #16\n\t"
  31294. "lsr r7, r7, #16\n\t"
  31295. "mul r7, r6, r7\n\t"
  31296. "adds r5, r5, r7\n\t"
  31297. "adc r3, r3, #0\n\t"
  31298. "lsr r7, r8, #16\n\t"
  31299. "mul r6, r7, r6\n\t"
  31300. "lsr r7, r6, #16\n\t"
  31301. "lsl r6, r6, #16\n\t"
  31302. "adds r5, r5, r6\n\t"
  31303. "adc r3, r3, r7\n\t"
  31304. "lsr r6, %[b], #16\n\t"
  31305. "lsr r7, r8, #16\n\t"
  31306. "mul r7, r6, r7\n\t"
  31307. "add r3, r3, r7\n\t"
  31308. "lsl r7, r8, #16\n\t"
  31309. "lsr r7, r7, #16\n\t"
  31310. "mul r6, r7, r6\n\t"
  31311. "lsr r7, r6, #16\n\t"
  31312. "lsl r6, r6, #16\n\t"
  31313. "adds r5, r5, r6\n\t"
  31314. "adc r3, r3, r7\n\t"
  31315. #else
  31316. "umlal r5, r3, %[b], r8\n\t"
  31317. #endif
  31318. "stm %[r]!, {r5}\n\t"
  31319. "mov r4, #0\n\t"
  31320. /* A[78] * B */
  31321. "ldm %[a]!, {r8}\n\t"
  31322. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31323. "lsl r6, %[b], #16\n\t"
  31324. "lsl r7, r8, #16\n\t"
  31325. "lsr r6, r6, #16\n\t"
  31326. "lsr r7, r7, #16\n\t"
  31327. "mul r7, r6, r7\n\t"
  31328. "adds r3, r3, r7\n\t"
  31329. "adc r4, r4, #0\n\t"
  31330. "lsr r7, r8, #16\n\t"
  31331. "mul r6, r7, r6\n\t"
  31332. "lsr r7, r6, #16\n\t"
  31333. "lsl r6, r6, #16\n\t"
  31334. "adds r3, r3, r6\n\t"
  31335. "adc r4, r4, r7\n\t"
  31336. "lsr r6, %[b], #16\n\t"
  31337. "lsr r7, r8, #16\n\t"
  31338. "mul r7, r6, r7\n\t"
  31339. "add r4, r4, r7\n\t"
  31340. "lsl r7, r8, #16\n\t"
  31341. "lsr r7, r7, #16\n\t"
  31342. "mul r6, r7, r6\n\t"
  31343. "lsr r7, r6, #16\n\t"
  31344. "lsl r6, r6, #16\n\t"
  31345. "adds r3, r3, r6\n\t"
  31346. "adc r4, r4, r7\n\t"
  31347. #else
  31348. "umlal r3, r4, %[b], r8\n\t"
  31349. #endif
  31350. "stm %[r]!, {r3}\n\t"
  31351. "mov r5, #0\n\t"
  31352. /* A[79] * B */
  31353. "ldm %[a]!, {r8}\n\t"
  31354. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31355. "lsl r6, %[b], #16\n\t"
  31356. "lsl r7, r8, #16\n\t"
  31357. "lsr r6, r6, #16\n\t"
  31358. "lsr r7, r7, #16\n\t"
  31359. "mul r7, r6, r7\n\t"
  31360. "adds r4, r4, r7\n\t"
  31361. "adc r5, r5, #0\n\t"
  31362. "lsr r7, r8, #16\n\t"
  31363. "mul r6, r7, r6\n\t"
  31364. "lsr r7, r6, #16\n\t"
  31365. "lsl r6, r6, #16\n\t"
  31366. "adds r4, r4, r6\n\t"
  31367. "adc r5, r5, r7\n\t"
  31368. "lsr r6, %[b], #16\n\t"
  31369. "lsr r7, r8, #16\n\t"
  31370. "mul r7, r6, r7\n\t"
  31371. "add r5, r5, r7\n\t"
  31372. "lsl r7, r8, #16\n\t"
  31373. "lsr r7, r7, #16\n\t"
  31374. "mul r6, r7, r6\n\t"
  31375. "lsr r7, r6, #16\n\t"
  31376. "lsl r6, r6, #16\n\t"
  31377. "adds r4, r4, r6\n\t"
  31378. "adc r5, r5, r7\n\t"
  31379. #else
  31380. "umlal r4, r5, %[b], r8\n\t"
  31381. #endif
  31382. "stm %[r]!, {r4}\n\t"
  31383. "mov r3, #0\n\t"
  31384. /* A[80] * B */
  31385. "ldm %[a]!, {r8}\n\t"
  31386. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31387. "lsl r6, %[b], #16\n\t"
  31388. "lsl r7, r8, #16\n\t"
  31389. "lsr r6, r6, #16\n\t"
  31390. "lsr r7, r7, #16\n\t"
  31391. "mul r7, r6, r7\n\t"
  31392. "adds r5, r5, r7\n\t"
  31393. "adc r3, r3, #0\n\t"
  31394. "lsr r7, r8, #16\n\t"
  31395. "mul r6, r7, r6\n\t"
  31396. "lsr r7, r6, #16\n\t"
  31397. "lsl r6, r6, #16\n\t"
  31398. "adds r5, r5, r6\n\t"
  31399. "adc r3, r3, r7\n\t"
  31400. "lsr r6, %[b], #16\n\t"
  31401. "lsr r7, r8, #16\n\t"
  31402. "mul r7, r6, r7\n\t"
  31403. "add r3, r3, r7\n\t"
  31404. "lsl r7, r8, #16\n\t"
  31405. "lsr r7, r7, #16\n\t"
  31406. "mul r6, r7, r6\n\t"
  31407. "lsr r7, r6, #16\n\t"
  31408. "lsl r6, r6, #16\n\t"
  31409. "adds r5, r5, r6\n\t"
  31410. "adc r3, r3, r7\n\t"
  31411. #else
  31412. "umlal r5, r3, %[b], r8\n\t"
  31413. #endif
  31414. "stm %[r]!, {r5}\n\t"
  31415. "mov r4, #0\n\t"
  31416. /* A[81] * B */
  31417. "ldm %[a]!, {r8}\n\t"
  31418. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31419. "lsl r6, %[b], #16\n\t"
  31420. "lsl r7, r8, #16\n\t"
  31421. "lsr r6, r6, #16\n\t"
  31422. "lsr r7, r7, #16\n\t"
  31423. "mul r7, r6, r7\n\t"
  31424. "adds r3, r3, r7\n\t"
  31425. "adc r4, r4, #0\n\t"
  31426. "lsr r7, r8, #16\n\t"
  31427. "mul r6, r7, r6\n\t"
  31428. "lsr r7, r6, #16\n\t"
  31429. "lsl r6, r6, #16\n\t"
  31430. "adds r3, r3, r6\n\t"
  31431. "adc r4, r4, r7\n\t"
  31432. "lsr r6, %[b], #16\n\t"
  31433. "lsr r7, r8, #16\n\t"
  31434. "mul r7, r6, r7\n\t"
  31435. "add r4, r4, r7\n\t"
  31436. "lsl r7, r8, #16\n\t"
  31437. "lsr r7, r7, #16\n\t"
  31438. "mul r6, r7, r6\n\t"
  31439. "lsr r7, r6, #16\n\t"
  31440. "lsl r6, r6, #16\n\t"
  31441. "adds r3, r3, r6\n\t"
  31442. "adc r4, r4, r7\n\t"
  31443. #else
  31444. "umlal r3, r4, %[b], r8\n\t"
  31445. #endif
  31446. "stm %[r]!, {r3}\n\t"
  31447. "mov r5, #0\n\t"
  31448. /* A[82] * B */
  31449. "ldm %[a]!, {r8}\n\t"
  31450. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31451. "lsl r6, %[b], #16\n\t"
  31452. "lsl r7, r8, #16\n\t"
  31453. "lsr r6, r6, #16\n\t"
  31454. "lsr r7, r7, #16\n\t"
  31455. "mul r7, r6, r7\n\t"
  31456. "adds r4, r4, r7\n\t"
  31457. "adc r5, r5, #0\n\t"
  31458. "lsr r7, r8, #16\n\t"
  31459. "mul r6, r7, r6\n\t"
  31460. "lsr r7, r6, #16\n\t"
  31461. "lsl r6, r6, #16\n\t"
  31462. "adds r4, r4, r6\n\t"
  31463. "adc r5, r5, r7\n\t"
  31464. "lsr r6, %[b], #16\n\t"
  31465. "lsr r7, r8, #16\n\t"
  31466. "mul r7, r6, r7\n\t"
  31467. "add r5, r5, r7\n\t"
  31468. "lsl r7, r8, #16\n\t"
  31469. "lsr r7, r7, #16\n\t"
  31470. "mul r6, r7, r6\n\t"
  31471. "lsr r7, r6, #16\n\t"
  31472. "lsl r6, r6, #16\n\t"
  31473. "adds r4, r4, r6\n\t"
  31474. "adc r5, r5, r7\n\t"
  31475. #else
  31476. "umlal r4, r5, %[b], r8\n\t"
  31477. #endif
  31478. "stm %[r]!, {r4}\n\t"
  31479. "mov r3, #0\n\t"
  31480. /* A[83] * B */
  31481. "ldm %[a]!, {r8}\n\t"
  31482. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31483. "lsl r6, %[b], #16\n\t"
  31484. "lsl r7, r8, #16\n\t"
  31485. "lsr r6, r6, #16\n\t"
  31486. "lsr r7, r7, #16\n\t"
  31487. "mul r7, r6, r7\n\t"
  31488. "adds r5, r5, r7\n\t"
  31489. "adc r3, r3, #0\n\t"
  31490. "lsr r7, r8, #16\n\t"
  31491. "mul r6, r7, r6\n\t"
  31492. "lsr r7, r6, #16\n\t"
  31493. "lsl r6, r6, #16\n\t"
  31494. "adds r5, r5, r6\n\t"
  31495. "adc r3, r3, r7\n\t"
  31496. "lsr r6, %[b], #16\n\t"
  31497. "lsr r7, r8, #16\n\t"
  31498. "mul r7, r6, r7\n\t"
  31499. "add r3, r3, r7\n\t"
  31500. "lsl r7, r8, #16\n\t"
  31501. "lsr r7, r7, #16\n\t"
  31502. "mul r6, r7, r6\n\t"
  31503. "lsr r7, r6, #16\n\t"
  31504. "lsl r6, r6, #16\n\t"
  31505. "adds r5, r5, r6\n\t"
  31506. "adc r3, r3, r7\n\t"
  31507. #else
  31508. "umlal r5, r3, %[b], r8\n\t"
  31509. #endif
  31510. "stm %[r]!, {r5}\n\t"
  31511. "mov r4, #0\n\t"
  31512. /* A[84] * B */
  31513. "ldm %[a]!, {r8}\n\t"
  31514. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31515. "lsl r6, %[b], #16\n\t"
  31516. "lsl r7, r8, #16\n\t"
  31517. "lsr r6, r6, #16\n\t"
  31518. "lsr r7, r7, #16\n\t"
  31519. "mul r7, r6, r7\n\t"
  31520. "adds r3, r3, r7\n\t"
  31521. "adc r4, r4, #0\n\t"
  31522. "lsr r7, r8, #16\n\t"
  31523. "mul r6, r7, r6\n\t"
  31524. "lsr r7, r6, #16\n\t"
  31525. "lsl r6, r6, #16\n\t"
  31526. "adds r3, r3, r6\n\t"
  31527. "adc r4, r4, r7\n\t"
  31528. "lsr r6, %[b], #16\n\t"
  31529. "lsr r7, r8, #16\n\t"
  31530. "mul r7, r6, r7\n\t"
  31531. "add r4, r4, r7\n\t"
  31532. "lsl r7, r8, #16\n\t"
  31533. "lsr r7, r7, #16\n\t"
  31534. "mul r6, r7, r6\n\t"
  31535. "lsr r7, r6, #16\n\t"
  31536. "lsl r6, r6, #16\n\t"
  31537. "adds r3, r3, r6\n\t"
  31538. "adc r4, r4, r7\n\t"
  31539. #else
  31540. "umlal r3, r4, %[b], r8\n\t"
  31541. #endif
  31542. "stm %[r]!, {r3}\n\t"
  31543. "mov r5, #0\n\t"
  31544. /* A[85] * B */
  31545. "ldm %[a]!, {r8}\n\t"
  31546. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31547. "lsl r6, %[b], #16\n\t"
  31548. "lsl r7, r8, #16\n\t"
  31549. "lsr r6, r6, #16\n\t"
  31550. "lsr r7, r7, #16\n\t"
  31551. "mul r7, r6, r7\n\t"
  31552. "adds r4, r4, r7\n\t"
  31553. "adc r5, r5, #0\n\t"
  31554. "lsr r7, r8, #16\n\t"
  31555. "mul r6, r7, r6\n\t"
  31556. "lsr r7, r6, #16\n\t"
  31557. "lsl r6, r6, #16\n\t"
  31558. "adds r4, r4, r6\n\t"
  31559. "adc r5, r5, r7\n\t"
  31560. "lsr r6, %[b], #16\n\t"
  31561. "lsr r7, r8, #16\n\t"
  31562. "mul r7, r6, r7\n\t"
  31563. "add r5, r5, r7\n\t"
  31564. "lsl r7, r8, #16\n\t"
  31565. "lsr r7, r7, #16\n\t"
  31566. "mul r6, r7, r6\n\t"
  31567. "lsr r7, r6, #16\n\t"
  31568. "lsl r6, r6, #16\n\t"
  31569. "adds r4, r4, r6\n\t"
  31570. "adc r5, r5, r7\n\t"
  31571. #else
  31572. "umlal r4, r5, %[b], r8\n\t"
  31573. #endif
  31574. "stm %[r]!, {r4}\n\t"
  31575. "mov r3, #0\n\t"
  31576. /* A[86] * B */
  31577. "ldm %[a]!, {r8}\n\t"
  31578. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31579. "lsl r6, %[b], #16\n\t"
  31580. "lsl r7, r8, #16\n\t"
  31581. "lsr r6, r6, #16\n\t"
  31582. "lsr r7, r7, #16\n\t"
  31583. "mul r7, r6, r7\n\t"
  31584. "adds r5, r5, r7\n\t"
  31585. "adc r3, r3, #0\n\t"
  31586. "lsr r7, r8, #16\n\t"
  31587. "mul r6, r7, r6\n\t"
  31588. "lsr r7, r6, #16\n\t"
  31589. "lsl r6, r6, #16\n\t"
  31590. "adds r5, r5, r6\n\t"
  31591. "adc r3, r3, r7\n\t"
  31592. "lsr r6, %[b], #16\n\t"
  31593. "lsr r7, r8, #16\n\t"
  31594. "mul r7, r6, r7\n\t"
  31595. "add r3, r3, r7\n\t"
  31596. "lsl r7, r8, #16\n\t"
  31597. "lsr r7, r7, #16\n\t"
  31598. "mul r6, r7, r6\n\t"
  31599. "lsr r7, r6, #16\n\t"
  31600. "lsl r6, r6, #16\n\t"
  31601. "adds r5, r5, r6\n\t"
  31602. "adc r3, r3, r7\n\t"
  31603. #else
  31604. "umlal r5, r3, %[b], r8\n\t"
  31605. #endif
  31606. "stm %[r]!, {r5}\n\t"
  31607. "mov r4, #0\n\t"
  31608. /* A[87] * B */
  31609. "ldm %[a]!, {r8}\n\t"
  31610. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31611. "lsl r6, %[b], #16\n\t"
  31612. "lsl r7, r8, #16\n\t"
  31613. "lsr r6, r6, #16\n\t"
  31614. "lsr r7, r7, #16\n\t"
  31615. "mul r7, r6, r7\n\t"
  31616. "adds r3, r3, r7\n\t"
  31617. "adc r4, r4, #0\n\t"
  31618. "lsr r7, r8, #16\n\t"
  31619. "mul r6, r7, r6\n\t"
  31620. "lsr r7, r6, #16\n\t"
  31621. "lsl r6, r6, #16\n\t"
  31622. "adds r3, r3, r6\n\t"
  31623. "adc r4, r4, r7\n\t"
  31624. "lsr r6, %[b], #16\n\t"
  31625. "lsr r7, r8, #16\n\t"
  31626. "mul r7, r6, r7\n\t"
  31627. "add r4, r4, r7\n\t"
  31628. "lsl r7, r8, #16\n\t"
  31629. "lsr r7, r7, #16\n\t"
  31630. "mul r6, r7, r6\n\t"
  31631. "lsr r7, r6, #16\n\t"
  31632. "lsl r6, r6, #16\n\t"
  31633. "adds r3, r3, r6\n\t"
  31634. "adc r4, r4, r7\n\t"
  31635. #else
  31636. "umlal r3, r4, %[b], r8\n\t"
  31637. #endif
  31638. "stm %[r]!, {r3}\n\t"
  31639. "mov r5, #0\n\t"
  31640. /* A[88] * B */
  31641. "ldm %[a]!, {r8}\n\t"
  31642. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31643. "lsl r6, %[b], #16\n\t"
  31644. "lsl r7, r8, #16\n\t"
  31645. "lsr r6, r6, #16\n\t"
  31646. "lsr r7, r7, #16\n\t"
  31647. "mul r7, r6, r7\n\t"
  31648. "adds r4, r4, r7\n\t"
  31649. "adc r5, r5, #0\n\t"
  31650. "lsr r7, r8, #16\n\t"
  31651. "mul r6, r7, r6\n\t"
  31652. "lsr r7, r6, #16\n\t"
  31653. "lsl r6, r6, #16\n\t"
  31654. "adds r4, r4, r6\n\t"
  31655. "adc r5, r5, r7\n\t"
  31656. "lsr r6, %[b], #16\n\t"
  31657. "lsr r7, r8, #16\n\t"
  31658. "mul r7, r6, r7\n\t"
  31659. "add r5, r5, r7\n\t"
  31660. "lsl r7, r8, #16\n\t"
  31661. "lsr r7, r7, #16\n\t"
  31662. "mul r6, r7, r6\n\t"
  31663. "lsr r7, r6, #16\n\t"
  31664. "lsl r6, r6, #16\n\t"
  31665. "adds r4, r4, r6\n\t"
  31666. "adc r5, r5, r7\n\t"
  31667. #else
  31668. "umlal r4, r5, %[b], r8\n\t"
  31669. #endif
  31670. "stm %[r]!, {r4}\n\t"
  31671. "mov r3, #0\n\t"
  31672. /* A[89] * B */
  31673. "ldm %[a]!, {r8}\n\t"
  31674. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31675. "lsl r6, %[b], #16\n\t"
  31676. "lsl r7, r8, #16\n\t"
  31677. "lsr r6, r6, #16\n\t"
  31678. "lsr r7, r7, #16\n\t"
  31679. "mul r7, r6, r7\n\t"
  31680. "adds r5, r5, r7\n\t"
  31681. "adc r3, r3, #0\n\t"
  31682. "lsr r7, r8, #16\n\t"
  31683. "mul r6, r7, r6\n\t"
  31684. "lsr r7, r6, #16\n\t"
  31685. "lsl r6, r6, #16\n\t"
  31686. "adds r5, r5, r6\n\t"
  31687. "adc r3, r3, r7\n\t"
  31688. "lsr r6, %[b], #16\n\t"
  31689. "lsr r7, r8, #16\n\t"
  31690. "mul r7, r6, r7\n\t"
  31691. "add r3, r3, r7\n\t"
  31692. "lsl r7, r8, #16\n\t"
  31693. "lsr r7, r7, #16\n\t"
  31694. "mul r6, r7, r6\n\t"
  31695. "lsr r7, r6, #16\n\t"
  31696. "lsl r6, r6, #16\n\t"
  31697. "adds r5, r5, r6\n\t"
  31698. "adc r3, r3, r7\n\t"
  31699. #else
  31700. "umlal r5, r3, %[b], r8\n\t"
  31701. #endif
  31702. "stm %[r]!, {r5}\n\t"
  31703. "mov r4, #0\n\t"
  31704. /* A[90] * B */
  31705. "ldm %[a]!, {r8}\n\t"
  31706. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31707. "lsl r6, %[b], #16\n\t"
  31708. "lsl r7, r8, #16\n\t"
  31709. "lsr r6, r6, #16\n\t"
  31710. "lsr r7, r7, #16\n\t"
  31711. "mul r7, r6, r7\n\t"
  31712. "adds r3, r3, r7\n\t"
  31713. "adc r4, r4, #0\n\t"
  31714. "lsr r7, r8, #16\n\t"
  31715. "mul r6, r7, r6\n\t"
  31716. "lsr r7, r6, #16\n\t"
  31717. "lsl r6, r6, #16\n\t"
  31718. "adds r3, r3, r6\n\t"
  31719. "adc r4, r4, r7\n\t"
  31720. "lsr r6, %[b], #16\n\t"
  31721. "lsr r7, r8, #16\n\t"
  31722. "mul r7, r6, r7\n\t"
  31723. "add r4, r4, r7\n\t"
  31724. "lsl r7, r8, #16\n\t"
  31725. "lsr r7, r7, #16\n\t"
  31726. "mul r6, r7, r6\n\t"
  31727. "lsr r7, r6, #16\n\t"
  31728. "lsl r6, r6, #16\n\t"
  31729. "adds r3, r3, r6\n\t"
  31730. "adc r4, r4, r7\n\t"
  31731. #else
  31732. "umlal r3, r4, %[b], r8\n\t"
  31733. #endif
  31734. "stm %[r]!, {r3}\n\t"
  31735. "mov r5, #0\n\t"
  31736. /* A[91] * B */
  31737. "ldm %[a]!, {r8}\n\t"
  31738. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31739. "lsl r6, %[b], #16\n\t"
  31740. "lsl r7, r8, #16\n\t"
  31741. "lsr r6, r6, #16\n\t"
  31742. "lsr r7, r7, #16\n\t"
  31743. "mul r7, r6, r7\n\t"
  31744. "adds r4, r4, r7\n\t"
  31745. "adc r5, r5, #0\n\t"
  31746. "lsr r7, r8, #16\n\t"
  31747. "mul r6, r7, r6\n\t"
  31748. "lsr r7, r6, #16\n\t"
  31749. "lsl r6, r6, #16\n\t"
  31750. "adds r4, r4, r6\n\t"
  31751. "adc r5, r5, r7\n\t"
  31752. "lsr r6, %[b], #16\n\t"
  31753. "lsr r7, r8, #16\n\t"
  31754. "mul r7, r6, r7\n\t"
  31755. "add r5, r5, r7\n\t"
  31756. "lsl r7, r8, #16\n\t"
  31757. "lsr r7, r7, #16\n\t"
  31758. "mul r6, r7, r6\n\t"
  31759. "lsr r7, r6, #16\n\t"
  31760. "lsl r6, r6, #16\n\t"
  31761. "adds r4, r4, r6\n\t"
  31762. "adc r5, r5, r7\n\t"
  31763. #else
  31764. "umlal r4, r5, %[b], r8\n\t"
  31765. #endif
  31766. "stm %[r]!, {r4}\n\t"
  31767. "mov r3, #0\n\t"
  31768. /* A[92] * B */
  31769. "ldm %[a]!, {r8}\n\t"
  31770. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31771. "lsl r6, %[b], #16\n\t"
  31772. "lsl r7, r8, #16\n\t"
  31773. "lsr r6, r6, #16\n\t"
  31774. "lsr r7, r7, #16\n\t"
  31775. "mul r7, r6, r7\n\t"
  31776. "adds r5, r5, r7\n\t"
  31777. "adc r3, r3, #0\n\t"
  31778. "lsr r7, r8, #16\n\t"
  31779. "mul r6, r7, r6\n\t"
  31780. "lsr r7, r6, #16\n\t"
  31781. "lsl r6, r6, #16\n\t"
  31782. "adds r5, r5, r6\n\t"
  31783. "adc r3, r3, r7\n\t"
  31784. "lsr r6, %[b], #16\n\t"
  31785. "lsr r7, r8, #16\n\t"
  31786. "mul r7, r6, r7\n\t"
  31787. "add r3, r3, r7\n\t"
  31788. "lsl r7, r8, #16\n\t"
  31789. "lsr r7, r7, #16\n\t"
  31790. "mul r6, r7, r6\n\t"
  31791. "lsr r7, r6, #16\n\t"
  31792. "lsl r6, r6, #16\n\t"
  31793. "adds r5, r5, r6\n\t"
  31794. "adc r3, r3, r7\n\t"
  31795. #else
  31796. "umlal r5, r3, %[b], r8\n\t"
  31797. #endif
  31798. "stm %[r]!, {r5}\n\t"
  31799. "mov r4, #0\n\t"
  31800. /* A[93] * B */
  31801. "ldm %[a]!, {r8}\n\t"
  31802. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31803. "lsl r6, %[b], #16\n\t"
  31804. "lsl r7, r8, #16\n\t"
  31805. "lsr r6, r6, #16\n\t"
  31806. "lsr r7, r7, #16\n\t"
  31807. "mul r7, r6, r7\n\t"
  31808. "adds r3, r3, r7\n\t"
  31809. "adc r4, r4, #0\n\t"
  31810. "lsr r7, r8, #16\n\t"
  31811. "mul r6, r7, r6\n\t"
  31812. "lsr r7, r6, #16\n\t"
  31813. "lsl r6, r6, #16\n\t"
  31814. "adds r3, r3, r6\n\t"
  31815. "adc r4, r4, r7\n\t"
  31816. "lsr r6, %[b], #16\n\t"
  31817. "lsr r7, r8, #16\n\t"
  31818. "mul r7, r6, r7\n\t"
  31819. "add r4, r4, r7\n\t"
  31820. "lsl r7, r8, #16\n\t"
  31821. "lsr r7, r7, #16\n\t"
  31822. "mul r6, r7, r6\n\t"
  31823. "lsr r7, r6, #16\n\t"
  31824. "lsl r6, r6, #16\n\t"
  31825. "adds r3, r3, r6\n\t"
  31826. "adc r4, r4, r7\n\t"
  31827. #else
  31828. "umlal r3, r4, %[b], r8\n\t"
  31829. #endif
  31830. "stm %[r]!, {r3}\n\t"
  31831. "mov r5, #0\n\t"
  31832. /* A[94] * B */
  31833. "ldm %[a]!, {r8}\n\t"
  31834. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31835. "lsl r6, %[b], #16\n\t"
  31836. "lsl r7, r8, #16\n\t"
  31837. "lsr r6, r6, #16\n\t"
  31838. "lsr r7, r7, #16\n\t"
  31839. "mul r7, r6, r7\n\t"
  31840. "adds r4, r4, r7\n\t"
  31841. "adc r5, r5, #0\n\t"
  31842. "lsr r7, r8, #16\n\t"
  31843. "mul r6, r7, r6\n\t"
  31844. "lsr r7, r6, #16\n\t"
  31845. "lsl r6, r6, #16\n\t"
  31846. "adds r4, r4, r6\n\t"
  31847. "adc r5, r5, r7\n\t"
  31848. "lsr r6, %[b], #16\n\t"
  31849. "lsr r7, r8, #16\n\t"
  31850. "mul r7, r6, r7\n\t"
  31851. "add r5, r5, r7\n\t"
  31852. "lsl r7, r8, #16\n\t"
  31853. "lsr r7, r7, #16\n\t"
  31854. "mul r6, r7, r6\n\t"
  31855. "lsr r7, r6, #16\n\t"
  31856. "lsl r6, r6, #16\n\t"
  31857. "adds r4, r4, r6\n\t"
  31858. "adc r5, r5, r7\n\t"
  31859. #else
  31860. "umlal r4, r5, %[b], r8\n\t"
  31861. #endif
  31862. "stm %[r]!, {r4}\n\t"
  31863. "mov r3, #0\n\t"
  31864. /* A[95] * B */
  31865. "ldm %[a]!, {r8}\n\t"
  31866. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  31867. "lsl r6, %[b], #16\n\t"
  31868. "lsl r7, r8, #16\n\t"
  31869. "lsr r6, r6, #16\n\t"
  31870. "lsr r7, r7, #16\n\t"
  31871. "mul r7, r6, r7\n\t"
  31872. "adds r5, r5, r7\n\t"
  31873. "adc r3, r3, #0\n\t"
  31874. "lsr r7, r8, #16\n\t"
  31875. "mul r6, r7, r6\n\t"
  31876. "lsr r7, r6, #16\n\t"
  31877. "lsl r6, r6, #16\n\t"
  31878. "adds r5, r5, r6\n\t"
  31879. "adc r3, r3, r7\n\t"
  31880. "lsr r6, %[b], #16\n\t"
  31881. "lsr r7, r8, #16\n\t"
  31882. "mul r7, r6, r7\n\t"
  31883. "add r3, r3, r7\n\t"
  31884. "lsl r7, r8, #16\n\t"
  31885. "lsr r7, r7, #16\n\t"
  31886. "mul r6, r7, r6\n\t"
  31887. "lsr r7, r6, #16\n\t"
  31888. "lsl r6, r6, #16\n\t"
  31889. "adds r5, r5, r6\n\t"
  31890. "adc r3, r3, r7\n\t"
  31891. #else
  31892. "umlal r5, r3, %[b], r8\n\t"
  31893. #endif
  31894. "stm %[r]!, {r5}\n\t"
  31895. "str r3, [%[r]]\n\t"
  31896. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  31897. :
  31898. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  31899. );
  31900. }
  31901. #endif /* WOLFSSL_SP_SMALL */
  31902. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  31903. /* r = 2^n mod m where n is the number of bits to reduce by.
  31904. * Given m must be 3072 bits, just need to subtract.
  31905. *
  31906. * r A single precision number.
  31907. * m A single precision number.
  31908. */
  31909. static void sp_3072_mont_norm_48(sp_digit* r, const sp_digit* m)
  31910. {
  31911. XMEMSET(r, 0, sizeof(sp_digit) * 48);
  31912. /* r = 2^n mod m */
  31913. sp_3072_sub_in_place_48(r, m);
  31914. }
  31915. #ifdef WOLFSSL_SP_SMALL
  31916. /* Conditionally subtract b from a using the mask m.
  31917. * m is -1 to subtract and 0 when not copying.
  31918. *
  31919. * r A single precision number representing condition subtract result.
  31920. * a A single precision number to subtract from.
  31921. * b A single precision number to subtract.
  31922. * m Mask value to apply.
  31923. */
  31924. 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)
  31925. {
  31926. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  31927. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  31928. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  31929. register sp_digit m asm ("r3") = (sp_digit)m_p;
  31930. __asm__ __volatile__ (
  31931. "mov r6, #0\n\t"
  31932. "mov r12, #0\n\t"
  31933. "mov lr, #0\n\t"
  31934. "\n"
  31935. "L_sp_3072_cond_sub_48_words_%=: \n\t"
  31936. "subs r12, r6, r12\n\t"
  31937. "ldr r4, [%[a], lr]\n\t"
  31938. "ldr r5, [%[b], lr]\n\t"
  31939. "and r5, r5, %[m]\n\t"
  31940. "sbcs r4, r4, r5\n\t"
  31941. "sbc r12, r6, r6\n\t"
  31942. "str r4, [%[r], lr]\n\t"
  31943. "add lr, lr, #4\n\t"
  31944. "cmp lr, #0xc0\n\t"
  31945. "blt L_sp_3072_cond_sub_48_words_%=\n\t"
  31946. "mov %[r], r12\n\t"
  31947. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  31948. :
  31949. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  31950. );
  31951. return (uint32_t)(size_t)r;
  31952. }
  31953. #else
  31954. /* Conditionally subtract b from a using the mask m.
  31955. * m is -1 to subtract and 0 when not copying.
  31956. *
  31957. * r A single precision number representing condition subtract result.
  31958. * a A single precision number to subtract from.
  31959. * b A single precision number to subtract.
  31960. * m Mask value to apply.
  31961. */
  31962. 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)
  31963. {
  31964. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  31965. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  31966. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  31967. register sp_digit m asm ("r3") = (sp_digit)m_p;
  31968. __asm__ __volatile__ (
  31969. "mov lr, #0\n\t"
  31970. "ldm %[a]!, {r4, r5}\n\t"
  31971. "ldm %[b]!, {r6, r7}\n\t"
  31972. "and r6, r6, %[m]\n\t"
  31973. "and r7, r7, %[m]\n\t"
  31974. "subs r4, r4, r6\n\t"
  31975. "sbcs r5, r5, r7\n\t"
  31976. "stm %[r]!, {r4, r5}\n\t"
  31977. "ldm %[a]!, {r4, r5}\n\t"
  31978. "ldm %[b]!, {r6, r7}\n\t"
  31979. "and r6, r6, %[m]\n\t"
  31980. "and r7, r7, %[m]\n\t"
  31981. "sbcs r4, r4, r6\n\t"
  31982. "sbcs r5, r5, r7\n\t"
  31983. "stm %[r]!, {r4, r5}\n\t"
  31984. "ldm %[a]!, {r4, r5}\n\t"
  31985. "ldm %[b]!, {r6, r7}\n\t"
  31986. "and r6, r6, %[m]\n\t"
  31987. "and r7, r7, %[m]\n\t"
  31988. "sbcs r4, r4, r6\n\t"
  31989. "sbcs r5, r5, r7\n\t"
  31990. "stm %[r]!, {r4, r5}\n\t"
  31991. "ldm %[a]!, {r4, r5}\n\t"
  31992. "ldm %[b]!, {r6, r7}\n\t"
  31993. "and r6, r6, %[m]\n\t"
  31994. "and r7, r7, %[m]\n\t"
  31995. "sbcs r4, r4, r6\n\t"
  31996. "sbcs r5, r5, r7\n\t"
  31997. "stm %[r]!, {r4, r5}\n\t"
  31998. "ldm %[a]!, {r4, r5}\n\t"
  31999. "ldm %[b]!, {r6, r7}\n\t"
  32000. "and r6, r6, %[m]\n\t"
  32001. "and r7, r7, %[m]\n\t"
  32002. "sbcs r4, r4, r6\n\t"
  32003. "sbcs r5, r5, r7\n\t"
  32004. "stm %[r]!, {r4, r5}\n\t"
  32005. "ldm %[a]!, {r4, r5}\n\t"
  32006. "ldm %[b]!, {r6, r7}\n\t"
  32007. "and r6, r6, %[m]\n\t"
  32008. "and r7, r7, %[m]\n\t"
  32009. "sbcs r4, r4, r6\n\t"
  32010. "sbcs r5, r5, r7\n\t"
  32011. "stm %[r]!, {r4, r5}\n\t"
  32012. "ldm %[a]!, {r4, r5}\n\t"
  32013. "ldm %[b]!, {r6, r7}\n\t"
  32014. "and r6, r6, %[m]\n\t"
  32015. "and r7, r7, %[m]\n\t"
  32016. "sbcs r4, r4, r6\n\t"
  32017. "sbcs r5, r5, r7\n\t"
  32018. "stm %[r]!, {r4, r5}\n\t"
  32019. "ldm %[a]!, {r4, r5}\n\t"
  32020. "ldm %[b]!, {r6, r7}\n\t"
  32021. "and r6, r6, %[m]\n\t"
  32022. "and r7, r7, %[m]\n\t"
  32023. "sbcs r4, r4, r6\n\t"
  32024. "sbcs r5, r5, r7\n\t"
  32025. "stm %[r]!, {r4, r5}\n\t"
  32026. "ldm %[a]!, {r4, r5}\n\t"
  32027. "ldm %[b]!, {r6, r7}\n\t"
  32028. "and r6, r6, %[m]\n\t"
  32029. "and r7, r7, %[m]\n\t"
  32030. "sbcs r4, r4, r6\n\t"
  32031. "sbcs r5, r5, r7\n\t"
  32032. "stm %[r]!, {r4, r5}\n\t"
  32033. "ldm %[a]!, {r4, r5}\n\t"
  32034. "ldm %[b]!, {r6, r7}\n\t"
  32035. "and r6, r6, %[m]\n\t"
  32036. "and r7, r7, %[m]\n\t"
  32037. "sbcs r4, r4, r6\n\t"
  32038. "sbcs r5, r5, r7\n\t"
  32039. "stm %[r]!, {r4, r5}\n\t"
  32040. "ldm %[a]!, {r4, r5}\n\t"
  32041. "ldm %[b]!, {r6, r7}\n\t"
  32042. "and r6, r6, %[m]\n\t"
  32043. "and r7, r7, %[m]\n\t"
  32044. "sbcs r4, r4, r6\n\t"
  32045. "sbcs r5, r5, r7\n\t"
  32046. "stm %[r]!, {r4, r5}\n\t"
  32047. "ldm %[a]!, {r4, r5}\n\t"
  32048. "ldm %[b]!, {r6, r7}\n\t"
  32049. "and r6, r6, %[m]\n\t"
  32050. "and r7, r7, %[m]\n\t"
  32051. "sbcs r4, r4, r6\n\t"
  32052. "sbcs r5, r5, r7\n\t"
  32053. "stm %[r]!, {r4, r5}\n\t"
  32054. "ldm %[a]!, {r4, r5}\n\t"
  32055. "ldm %[b]!, {r6, r7}\n\t"
  32056. "and r6, r6, %[m]\n\t"
  32057. "and r7, r7, %[m]\n\t"
  32058. "sbcs r4, r4, r6\n\t"
  32059. "sbcs r5, r5, r7\n\t"
  32060. "stm %[r]!, {r4, r5}\n\t"
  32061. "ldm %[a]!, {r4, r5}\n\t"
  32062. "ldm %[b]!, {r6, r7}\n\t"
  32063. "and r6, r6, %[m]\n\t"
  32064. "and r7, r7, %[m]\n\t"
  32065. "sbcs r4, r4, r6\n\t"
  32066. "sbcs r5, r5, r7\n\t"
  32067. "stm %[r]!, {r4, r5}\n\t"
  32068. "ldm %[a]!, {r4, r5}\n\t"
  32069. "ldm %[b]!, {r6, r7}\n\t"
  32070. "and r6, r6, %[m]\n\t"
  32071. "and r7, r7, %[m]\n\t"
  32072. "sbcs r4, r4, r6\n\t"
  32073. "sbcs r5, r5, r7\n\t"
  32074. "stm %[r]!, {r4, r5}\n\t"
  32075. "ldm %[a]!, {r4, r5}\n\t"
  32076. "ldm %[b]!, {r6, r7}\n\t"
  32077. "and r6, r6, %[m]\n\t"
  32078. "and r7, r7, %[m]\n\t"
  32079. "sbcs r4, r4, r6\n\t"
  32080. "sbcs r5, r5, r7\n\t"
  32081. "stm %[r]!, {r4, r5}\n\t"
  32082. "ldm %[a]!, {r4, r5}\n\t"
  32083. "ldm %[b]!, {r6, r7}\n\t"
  32084. "and r6, r6, %[m]\n\t"
  32085. "and r7, r7, %[m]\n\t"
  32086. "sbcs r4, r4, r6\n\t"
  32087. "sbcs r5, r5, r7\n\t"
  32088. "stm %[r]!, {r4, r5}\n\t"
  32089. "ldm %[a]!, {r4, r5}\n\t"
  32090. "ldm %[b]!, {r6, r7}\n\t"
  32091. "and r6, r6, %[m]\n\t"
  32092. "and r7, r7, %[m]\n\t"
  32093. "sbcs r4, r4, r6\n\t"
  32094. "sbcs r5, r5, r7\n\t"
  32095. "stm %[r]!, {r4, r5}\n\t"
  32096. "ldm %[a]!, {r4, r5}\n\t"
  32097. "ldm %[b]!, {r6, r7}\n\t"
  32098. "and r6, r6, %[m]\n\t"
  32099. "and r7, r7, %[m]\n\t"
  32100. "sbcs r4, r4, r6\n\t"
  32101. "sbcs r5, r5, r7\n\t"
  32102. "stm %[r]!, {r4, r5}\n\t"
  32103. "ldm %[a]!, {r4, r5}\n\t"
  32104. "ldm %[b]!, {r6, r7}\n\t"
  32105. "and r6, r6, %[m]\n\t"
  32106. "and r7, r7, %[m]\n\t"
  32107. "sbcs r4, r4, r6\n\t"
  32108. "sbcs r5, r5, r7\n\t"
  32109. "stm %[r]!, {r4, r5}\n\t"
  32110. "ldm %[a]!, {r4, r5}\n\t"
  32111. "ldm %[b]!, {r6, r7}\n\t"
  32112. "and r6, r6, %[m]\n\t"
  32113. "and r7, r7, %[m]\n\t"
  32114. "sbcs r4, r4, r6\n\t"
  32115. "sbcs r5, r5, r7\n\t"
  32116. "stm %[r]!, {r4, r5}\n\t"
  32117. "ldm %[a]!, {r4, r5}\n\t"
  32118. "ldm %[b]!, {r6, r7}\n\t"
  32119. "and r6, r6, %[m]\n\t"
  32120. "and r7, r7, %[m]\n\t"
  32121. "sbcs r4, r4, r6\n\t"
  32122. "sbcs r5, r5, r7\n\t"
  32123. "stm %[r]!, {r4, r5}\n\t"
  32124. "ldm %[a]!, {r4, r5}\n\t"
  32125. "ldm %[b]!, {r6, r7}\n\t"
  32126. "and r6, r6, %[m]\n\t"
  32127. "and r7, r7, %[m]\n\t"
  32128. "sbcs r4, r4, r6\n\t"
  32129. "sbcs r5, r5, r7\n\t"
  32130. "stm %[r]!, {r4, r5}\n\t"
  32131. "ldm %[a]!, {r4, r5}\n\t"
  32132. "ldm %[b]!, {r6, r7}\n\t"
  32133. "and r6, r6, %[m]\n\t"
  32134. "and r7, r7, %[m]\n\t"
  32135. "sbcs r4, r4, r6\n\t"
  32136. "sbcs r5, r5, r7\n\t"
  32137. "stm %[r]!, {r4, r5}\n\t"
  32138. "sbc %[r], lr, lr\n\t"
  32139. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  32140. :
  32141. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  32142. );
  32143. return (uint32_t)(size_t)r;
  32144. }
  32145. #endif /* WOLFSSL_SP_SMALL */
  32146. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  32147. /* Reduce the number back to 3072 bits using Montgomery reduction.
  32148. *
  32149. * a A single precision number to reduce in place.
  32150. * m The single precision number representing the modulus.
  32151. * mp The digit representing the negative inverse of m mod 2^n.
  32152. */
  32153. static SP_NOINLINE void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  32154. {
  32155. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  32156. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  32157. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  32158. __asm__ __volatile__ (
  32159. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  32160. "ldr r11, [%[m]]\n\t"
  32161. #endif
  32162. /* i = 0 */
  32163. "mov r9, #0\n\t"
  32164. "mov r3, #0\n\t"
  32165. "ldr r12, [%[a]]\n\t"
  32166. "ldr lr, [%[a], #4]\n\t"
  32167. "\n"
  32168. "L_sp_3072_mont_reduce_48_word_%=: \n\t"
  32169. /* mu = a[i] * mp */
  32170. "mul r8, %[mp], r12\n\t"
  32171. /* a[i+0] += m[0] * mu */
  32172. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  32173. "ldr r11, [%[m]]\n\t"
  32174. #endif
  32175. "lsr r7, r11, #16\n\t"
  32176. "lsr r6, r8, #16\n\t"
  32177. "mul r5, r6, r7\n\t"
  32178. "lsl r7, r11, #16\n\t"
  32179. "lsr r7, r7, #16\n\t"
  32180. "mul r6, r7, r6\n\t"
  32181. "lsr r7, r6, #16\n\t"
  32182. "lsl r6, r6, #16\n\t"
  32183. "adds r12, r12, r6\n\t"
  32184. "adc r5, r5, r7\n\t"
  32185. "lsl r6, r8, #16\n\t"
  32186. "lsl r7, r11, #16\n\t"
  32187. "lsr r6, r6, #16\n\t"
  32188. "lsr r7, r7, #16\n\t"
  32189. "mul r7, r6, r7\n\t"
  32190. "adds r12, r12, r7\n\t"
  32191. "adc r5, r5, #0\n\t"
  32192. "lsr r7, r11, #16\n\t"
  32193. "mul r6, r7, r6\n\t"
  32194. "lsr r7, r6, #16\n\t"
  32195. "lsl r6, r6, #16\n\t"
  32196. "adds r12, r12, r6\n\t"
  32197. "adc r5, r5, r7\n\t"
  32198. /* a[i+1] += m[1] * mu */
  32199. "ldr r7, [%[m], #4]\n\t"
  32200. "lsr r10, r7, #16\n\t"
  32201. "lsr r6, r8, #16\n\t"
  32202. "mul r4, r6, r10\n\t"
  32203. "lsl r10, r7, #16\n\t"
  32204. "lsr r10, r10, #16\n\t"
  32205. "mul r6, r10, r6\n\t"
  32206. "lsr r10, r6, #16\n\t"
  32207. "lsl r6, r6, #16\n\t"
  32208. "adds lr, lr, r6\n\t"
  32209. "adc r4, r4, r10\n\t"
  32210. "lsl r6, r8, #16\n\t"
  32211. "lsl r10, r7, #16\n\t"
  32212. "lsr r6, r6, #16\n\t"
  32213. "lsr r10, r10, #16\n\t"
  32214. "mul r10, r6, r10\n\t"
  32215. "adds lr, lr, r10\n\t"
  32216. "adc r4, r4, #0\n\t"
  32217. "lsr r10, r7, #16\n\t"
  32218. "mul r6, r10, r6\n\t"
  32219. "lsr r10, r6, #16\n\t"
  32220. "lsl r6, r6, #16\n\t"
  32221. "adds lr, lr, r6\n\t"
  32222. "adc r4, r4, r10\n\t"
  32223. "mov r12, lr\n\t"
  32224. "adds r12, r12, r5\n\t"
  32225. "adc r4, r4, #0\n\t"
  32226. /* a[i+2] += m[2] * mu */
  32227. "ldr r7, [%[m], #8]\n\t"
  32228. "ldr lr, [%[a], #8]\n\t"
  32229. "lsr r10, r7, #16\n\t"
  32230. "lsr r6, r8, #16\n\t"
  32231. "mul r5, r6, r10\n\t"
  32232. "lsl r10, r7, #16\n\t"
  32233. "lsr r10, r10, #16\n\t"
  32234. "mul r6, r10, r6\n\t"
  32235. "lsr r10, r6, #16\n\t"
  32236. "lsl r6, r6, #16\n\t"
  32237. "adds lr, lr, r6\n\t"
  32238. "adc r5, r5, r10\n\t"
  32239. "lsl r6, r8, #16\n\t"
  32240. "lsl r10, r7, #16\n\t"
  32241. "lsr r6, r6, #16\n\t"
  32242. "lsr r10, r10, #16\n\t"
  32243. "mul r10, r6, r10\n\t"
  32244. "adds lr, lr, r10\n\t"
  32245. "adc r5, r5, #0\n\t"
  32246. "lsr r10, r7, #16\n\t"
  32247. "mul r6, r10, r6\n\t"
  32248. "lsr r10, r6, #16\n\t"
  32249. "lsl r6, r6, #16\n\t"
  32250. "adds lr, lr, r6\n\t"
  32251. "adc r5, r5, r10\n\t"
  32252. "adds lr, lr, r4\n\t"
  32253. "adc r5, r5, #0\n\t"
  32254. /* a[i+3] += m[3] * mu */
  32255. "ldr r7, [%[m], #12]\n\t"
  32256. "ldr r10, [%[a], #12]\n\t"
  32257. "lsr r11, r7, #16\n\t"
  32258. "lsr r6, r8, #16\n\t"
  32259. "mul r4, r6, r11\n\t"
  32260. "lsl r11, r7, #16\n\t"
  32261. "lsr r11, r11, #16\n\t"
  32262. "mul r6, r11, r6\n\t"
  32263. "lsr r11, r6, #16\n\t"
  32264. "lsl r6, r6, #16\n\t"
  32265. "adds r10, r10, r6\n\t"
  32266. "adc r4, r4, r11\n\t"
  32267. "lsl r6, r8, #16\n\t"
  32268. "lsl r11, r7, #16\n\t"
  32269. "lsr r6, r6, #16\n\t"
  32270. "lsr r11, r11, #16\n\t"
  32271. "mul r11, r6, r11\n\t"
  32272. "adds r10, r10, r11\n\t"
  32273. "adc r4, r4, #0\n\t"
  32274. "lsr r11, r7, #16\n\t"
  32275. "mul r6, r11, r6\n\t"
  32276. "lsr r11, r6, #16\n\t"
  32277. "lsl r6, r6, #16\n\t"
  32278. "adds r10, r10, r6\n\t"
  32279. "adc r4, r4, r11\n\t"
  32280. "adds r10, r10, r5\n\t"
  32281. "str r10, [%[a], #12]\n\t"
  32282. "adc r4, r4, #0\n\t"
  32283. /* a[i+4] += m[4] * mu */
  32284. "ldr r7, [%[m], #16]\n\t"
  32285. "ldr r10, [%[a], #16]\n\t"
  32286. "lsr r11, r7, #16\n\t"
  32287. "lsr r6, r8, #16\n\t"
  32288. "mul r5, r6, r11\n\t"
  32289. "lsl r11, r7, #16\n\t"
  32290. "lsr r11, r11, #16\n\t"
  32291. "mul r6, r11, r6\n\t"
  32292. "lsr r11, r6, #16\n\t"
  32293. "lsl r6, r6, #16\n\t"
  32294. "adds r10, r10, r6\n\t"
  32295. "adc r5, r5, r11\n\t"
  32296. "lsl r6, r8, #16\n\t"
  32297. "lsl r11, r7, #16\n\t"
  32298. "lsr r6, r6, #16\n\t"
  32299. "lsr r11, r11, #16\n\t"
  32300. "mul r11, r6, r11\n\t"
  32301. "adds r10, r10, r11\n\t"
  32302. "adc r5, r5, #0\n\t"
  32303. "lsr r11, r7, #16\n\t"
  32304. "mul r6, r11, r6\n\t"
  32305. "lsr r11, r6, #16\n\t"
  32306. "lsl r6, r6, #16\n\t"
  32307. "adds r10, r10, r6\n\t"
  32308. "adc r5, r5, r11\n\t"
  32309. "adds r10, r10, r4\n\t"
  32310. "str r10, [%[a], #16]\n\t"
  32311. "adc r5, r5, #0\n\t"
  32312. /* a[i+5] += m[5] * mu */
  32313. "ldr r7, [%[m], #20]\n\t"
  32314. "ldr r10, [%[a], #20]\n\t"
  32315. "lsr r11, r7, #16\n\t"
  32316. "lsr r6, r8, #16\n\t"
  32317. "mul r4, r6, r11\n\t"
  32318. "lsl r11, r7, #16\n\t"
  32319. "lsr r11, r11, #16\n\t"
  32320. "mul r6, r11, r6\n\t"
  32321. "lsr r11, r6, #16\n\t"
  32322. "lsl r6, r6, #16\n\t"
  32323. "adds r10, r10, r6\n\t"
  32324. "adc r4, r4, r11\n\t"
  32325. "lsl r6, r8, #16\n\t"
  32326. "lsl r11, r7, #16\n\t"
  32327. "lsr r6, r6, #16\n\t"
  32328. "lsr r11, r11, #16\n\t"
  32329. "mul r11, r6, r11\n\t"
  32330. "adds r10, r10, r11\n\t"
  32331. "adc r4, r4, #0\n\t"
  32332. "lsr r11, r7, #16\n\t"
  32333. "mul r6, r11, r6\n\t"
  32334. "lsr r11, r6, #16\n\t"
  32335. "lsl r6, r6, #16\n\t"
  32336. "adds r10, r10, r6\n\t"
  32337. "adc r4, r4, r11\n\t"
  32338. "adds r10, r10, r5\n\t"
  32339. "str r10, [%[a], #20]\n\t"
  32340. "adc r4, r4, #0\n\t"
  32341. /* a[i+6] += m[6] * mu */
  32342. "ldr r7, [%[m], #24]\n\t"
  32343. "ldr r10, [%[a], #24]\n\t"
  32344. "lsr r11, r7, #16\n\t"
  32345. "lsr r6, r8, #16\n\t"
  32346. "mul r5, r6, r11\n\t"
  32347. "lsl r11, r7, #16\n\t"
  32348. "lsr r11, r11, #16\n\t"
  32349. "mul r6, r11, r6\n\t"
  32350. "lsr r11, r6, #16\n\t"
  32351. "lsl r6, r6, #16\n\t"
  32352. "adds r10, r10, r6\n\t"
  32353. "adc r5, r5, r11\n\t"
  32354. "lsl r6, r8, #16\n\t"
  32355. "lsl r11, r7, #16\n\t"
  32356. "lsr r6, r6, #16\n\t"
  32357. "lsr r11, r11, #16\n\t"
  32358. "mul r11, r6, r11\n\t"
  32359. "adds r10, r10, r11\n\t"
  32360. "adc r5, r5, #0\n\t"
  32361. "lsr r11, r7, #16\n\t"
  32362. "mul r6, r11, r6\n\t"
  32363. "lsr r11, r6, #16\n\t"
  32364. "lsl r6, r6, #16\n\t"
  32365. "adds r10, r10, r6\n\t"
  32366. "adc r5, r5, r11\n\t"
  32367. "adds r10, r10, r4\n\t"
  32368. "str r10, [%[a], #24]\n\t"
  32369. "adc r5, r5, #0\n\t"
  32370. /* a[i+7] += m[7] * mu */
  32371. "ldr r7, [%[m], #28]\n\t"
  32372. "ldr r10, [%[a], #28]\n\t"
  32373. "lsr r11, r7, #16\n\t"
  32374. "lsr r6, r8, #16\n\t"
  32375. "mul r4, r6, r11\n\t"
  32376. "lsl r11, r7, #16\n\t"
  32377. "lsr r11, r11, #16\n\t"
  32378. "mul r6, r11, r6\n\t"
  32379. "lsr r11, r6, #16\n\t"
  32380. "lsl r6, r6, #16\n\t"
  32381. "adds r10, r10, r6\n\t"
  32382. "adc r4, r4, r11\n\t"
  32383. "lsl r6, r8, #16\n\t"
  32384. "lsl r11, r7, #16\n\t"
  32385. "lsr r6, r6, #16\n\t"
  32386. "lsr r11, r11, #16\n\t"
  32387. "mul r11, r6, r11\n\t"
  32388. "adds r10, r10, r11\n\t"
  32389. "adc r4, r4, #0\n\t"
  32390. "lsr r11, r7, #16\n\t"
  32391. "mul r6, r11, r6\n\t"
  32392. "lsr r11, r6, #16\n\t"
  32393. "lsl r6, r6, #16\n\t"
  32394. "adds r10, r10, r6\n\t"
  32395. "adc r4, r4, r11\n\t"
  32396. "adds r10, r10, r5\n\t"
  32397. "str r10, [%[a], #28]\n\t"
  32398. "adc r4, r4, #0\n\t"
  32399. /* a[i+8] += m[8] * mu */
  32400. "ldr r7, [%[m], #32]\n\t"
  32401. "ldr r10, [%[a], #32]\n\t"
  32402. "lsr r11, r7, #16\n\t"
  32403. "lsr r6, r8, #16\n\t"
  32404. "mul r5, r6, r11\n\t"
  32405. "lsl r11, r7, #16\n\t"
  32406. "lsr r11, r11, #16\n\t"
  32407. "mul r6, r11, r6\n\t"
  32408. "lsr r11, r6, #16\n\t"
  32409. "lsl r6, r6, #16\n\t"
  32410. "adds r10, r10, r6\n\t"
  32411. "adc r5, r5, r11\n\t"
  32412. "lsl r6, r8, #16\n\t"
  32413. "lsl r11, r7, #16\n\t"
  32414. "lsr r6, r6, #16\n\t"
  32415. "lsr r11, r11, #16\n\t"
  32416. "mul r11, r6, r11\n\t"
  32417. "adds r10, r10, r11\n\t"
  32418. "adc r5, r5, #0\n\t"
  32419. "lsr r11, r7, #16\n\t"
  32420. "mul r6, r11, r6\n\t"
  32421. "lsr r11, r6, #16\n\t"
  32422. "lsl r6, r6, #16\n\t"
  32423. "adds r10, r10, r6\n\t"
  32424. "adc r5, r5, r11\n\t"
  32425. "adds r10, r10, r4\n\t"
  32426. "str r10, [%[a], #32]\n\t"
  32427. "adc r5, r5, #0\n\t"
  32428. /* a[i+9] += m[9] * mu */
  32429. "ldr r7, [%[m], #36]\n\t"
  32430. "ldr r10, [%[a], #36]\n\t"
  32431. "lsr r11, r7, #16\n\t"
  32432. "lsr r6, r8, #16\n\t"
  32433. "mul r4, r6, r11\n\t"
  32434. "lsl r11, r7, #16\n\t"
  32435. "lsr r11, r11, #16\n\t"
  32436. "mul r6, r11, r6\n\t"
  32437. "lsr r11, r6, #16\n\t"
  32438. "lsl r6, r6, #16\n\t"
  32439. "adds r10, r10, r6\n\t"
  32440. "adc r4, r4, r11\n\t"
  32441. "lsl r6, r8, #16\n\t"
  32442. "lsl r11, r7, #16\n\t"
  32443. "lsr r6, r6, #16\n\t"
  32444. "lsr r11, r11, #16\n\t"
  32445. "mul r11, r6, r11\n\t"
  32446. "adds r10, r10, r11\n\t"
  32447. "adc r4, r4, #0\n\t"
  32448. "lsr r11, r7, #16\n\t"
  32449. "mul r6, r11, r6\n\t"
  32450. "lsr r11, r6, #16\n\t"
  32451. "lsl r6, r6, #16\n\t"
  32452. "adds r10, r10, r6\n\t"
  32453. "adc r4, r4, r11\n\t"
  32454. "adds r10, r10, r5\n\t"
  32455. "str r10, [%[a], #36]\n\t"
  32456. "adc r4, r4, #0\n\t"
  32457. /* a[i+10] += m[10] * mu */
  32458. "ldr r7, [%[m], #40]\n\t"
  32459. "ldr r10, [%[a], #40]\n\t"
  32460. "lsr r11, r7, #16\n\t"
  32461. "lsr r6, r8, #16\n\t"
  32462. "mul r5, r6, r11\n\t"
  32463. "lsl r11, r7, #16\n\t"
  32464. "lsr r11, r11, #16\n\t"
  32465. "mul r6, r11, r6\n\t"
  32466. "lsr r11, r6, #16\n\t"
  32467. "lsl r6, r6, #16\n\t"
  32468. "adds r10, r10, r6\n\t"
  32469. "adc r5, r5, r11\n\t"
  32470. "lsl r6, r8, #16\n\t"
  32471. "lsl r11, r7, #16\n\t"
  32472. "lsr r6, r6, #16\n\t"
  32473. "lsr r11, r11, #16\n\t"
  32474. "mul r11, r6, r11\n\t"
  32475. "adds r10, r10, r11\n\t"
  32476. "adc r5, r5, #0\n\t"
  32477. "lsr r11, r7, #16\n\t"
  32478. "mul r6, r11, r6\n\t"
  32479. "lsr r11, r6, #16\n\t"
  32480. "lsl r6, r6, #16\n\t"
  32481. "adds r10, r10, r6\n\t"
  32482. "adc r5, r5, r11\n\t"
  32483. "adds r10, r10, r4\n\t"
  32484. "str r10, [%[a], #40]\n\t"
  32485. "adc r5, r5, #0\n\t"
  32486. /* a[i+11] += m[11] * mu */
  32487. "ldr r7, [%[m], #44]\n\t"
  32488. "ldr r10, [%[a], #44]\n\t"
  32489. "lsr r11, r7, #16\n\t"
  32490. "lsr r6, r8, #16\n\t"
  32491. "mul r4, r6, r11\n\t"
  32492. "lsl r11, r7, #16\n\t"
  32493. "lsr r11, r11, #16\n\t"
  32494. "mul r6, r11, r6\n\t"
  32495. "lsr r11, r6, #16\n\t"
  32496. "lsl r6, r6, #16\n\t"
  32497. "adds r10, r10, r6\n\t"
  32498. "adc r4, r4, r11\n\t"
  32499. "lsl r6, r8, #16\n\t"
  32500. "lsl r11, r7, #16\n\t"
  32501. "lsr r6, r6, #16\n\t"
  32502. "lsr r11, r11, #16\n\t"
  32503. "mul r11, r6, r11\n\t"
  32504. "adds r10, r10, r11\n\t"
  32505. "adc r4, r4, #0\n\t"
  32506. "lsr r11, r7, #16\n\t"
  32507. "mul r6, r11, r6\n\t"
  32508. "lsr r11, r6, #16\n\t"
  32509. "lsl r6, r6, #16\n\t"
  32510. "adds r10, r10, r6\n\t"
  32511. "adc r4, r4, r11\n\t"
  32512. "adds r10, r10, r5\n\t"
  32513. "str r10, [%[a], #44]\n\t"
  32514. "adc r4, r4, #0\n\t"
  32515. /* a[i+12] += m[12] * mu */
  32516. "ldr r7, [%[m], #48]\n\t"
  32517. "ldr r10, [%[a], #48]\n\t"
  32518. "lsr r11, r7, #16\n\t"
  32519. "lsr r6, r8, #16\n\t"
  32520. "mul r5, r6, r11\n\t"
  32521. "lsl r11, r7, #16\n\t"
  32522. "lsr r11, r11, #16\n\t"
  32523. "mul r6, r11, r6\n\t"
  32524. "lsr r11, r6, #16\n\t"
  32525. "lsl r6, r6, #16\n\t"
  32526. "adds r10, r10, r6\n\t"
  32527. "adc r5, r5, r11\n\t"
  32528. "lsl r6, r8, #16\n\t"
  32529. "lsl r11, r7, #16\n\t"
  32530. "lsr r6, r6, #16\n\t"
  32531. "lsr r11, r11, #16\n\t"
  32532. "mul r11, r6, r11\n\t"
  32533. "adds r10, r10, r11\n\t"
  32534. "adc r5, r5, #0\n\t"
  32535. "lsr r11, r7, #16\n\t"
  32536. "mul r6, r11, r6\n\t"
  32537. "lsr r11, r6, #16\n\t"
  32538. "lsl r6, r6, #16\n\t"
  32539. "adds r10, r10, r6\n\t"
  32540. "adc r5, r5, r11\n\t"
  32541. "adds r10, r10, r4\n\t"
  32542. "str r10, [%[a], #48]\n\t"
  32543. "adc r5, r5, #0\n\t"
  32544. /* a[i+13] += m[13] * mu */
  32545. "ldr r7, [%[m], #52]\n\t"
  32546. "ldr r10, [%[a], #52]\n\t"
  32547. "lsr r11, r7, #16\n\t"
  32548. "lsr r6, r8, #16\n\t"
  32549. "mul r4, r6, r11\n\t"
  32550. "lsl r11, r7, #16\n\t"
  32551. "lsr r11, r11, #16\n\t"
  32552. "mul r6, r11, r6\n\t"
  32553. "lsr r11, r6, #16\n\t"
  32554. "lsl r6, r6, #16\n\t"
  32555. "adds r10, r10, r6\n\t"
  32556. "adc r4, r4, r11\n\t"
  32557. "lsl r6, r8, #16\n\t"
  32558. "lsl r11, r7, #16\n\t"
  32559. "lsr r6, r6, #16\n\t"
  32560. "lsr r11, r11, #16\n\t"
  32561. "mul r11, r6, r11\n\t"
  32562. "adds r10, r10, r11\n\t"
  32563. "adc r4, r4, #0\n\t"
  32564. "lsr r11, r7, #16\n\t"
  32565. "mul r6, r11, r6\n\t"
  32566. "lsr r11, r6, #16\n\t"
  32567. "lsl r6, r6, #16\n\t"
  32568. "adds r10, r10, r6\n\t"
  32569. "adc r4, r4, r11\n\t"
  32570. "adds r10, r10, r5\n\t"
  32571. "str r10, [%[a], #52]\n\t"
  32572. "adc r4, r4, #0\n\t"
  32573. /* a[i+14] += m[14] * mu */
  32574. "ldr r7, [%[m], #56]\n\t"
  32575. "ldr r10, [%[a], #56]\n\t"
  32576. "lsr r11, r7, #16\n\t"
  32577. "lsr r6, r8, #16\n\t"
  32578. "mul r5, r6, r11\n\t"
  32579. "lsl r11, r7, #16\n\t"
  32580. "lsr r11, r11, #16\n\t"
  32581. "mul r6, r11, r6\n\t"
  32582. "lsr r11, r6, #16\n\t"
  32583. "lsl r6, r6, #16\n\t"
  32584. "adds r10, r10, r6\n\t"
  32585. "adc r5, r5, r11\n\t"
  32586. "lsl r6, r8, #16\n\t"
  32587. "lsl r11, r7, #16\n\t"
  32588. "lsr r6, r6, #16\n\t"
  32589. "lsr r11, r11, #16\n\t"
  32590. "mul r11, r6, r11\n\t"
  32591. "adds r10, r10, r11\n\t"
  32592. "adc r5, r5, #0\n\t"
  32593. "lsr r11, r7, #16\n\t"
  32594. "mul r6, r11, r6\n\t"
  32595. "lsr r11, r6, #16\n\t"
  32596. "lsl r6, r6, #16\n\t"
  32597. "adds r10, r10, r6\n\t"
  32598. "adc r5, r5, r11\n\t"
  32599. "adds r10, r10, r4\n\t"
  32600. "str r10, [%[a], #56]\n\t"
  32601. "adc r5, r5, #0\n\t"
  32602. /* a[i+15] += m[15] * mu */
  32603. "ldr r7, [%[m], #60]\n\t"
  32604. "ldr r10, [%[a], #60]\n\t"
  32605. "lsr r11, r7, #16\n\t"
  32606. "lsr r6, r8, #16\n\t"
  32607. "mul r4, r6, r11\n\t"
  32608. "lsl r11, r7, #16\n\t"
  32609. "lsr r11, r11, #16\n\t"
  32610. "mul r6, r11, r6\n\t"
  32611. "lsr r11, r6, #16\n\t"
  32612. "lsl r6, r6, #16\n\t"
  32613. "adds r10, r10, r6\n\t"
  32614. "adc r4, r4, r11\n\t"
  32615. "lsl r6, r8, #16\n\t"
  32616. "lsl r11, r7, #16\n\t"
  32617. "lsr r6, r6, #16\n\t"
  32618. "lsr r11, r11, #16\n\t"
  32619. "mul r11, r6, r11\n\t"
  32620. "adds r10, r10, r11\n\t"
  32621. "adc r4, r4, #0\n\t"
  32622. "lsr r11, r7, #16\n\t"
  32623. "mul r6, r11, r6\n\t"
  32624. "lsr r11, r6, #16\n\t"
  32625. "lsl r6, r6, #16\n\t"
  32626. "adds r10, r10, r6\n\t"
  32627. "adc r4, r4, r11\n\t"
  32628. "adds r10, r10, r5\n\t"
  32629. "str r10, [%[a], #60]\n\t"
  32630. "adc r4, r4, #0\n\t"
  32631. /* a[i+16] += m[16] * mu */
  32632. "ldr r7, [%[m], #64]\n\t"
  32633. "ldr r10, [%[a], #64]\n\t"
  32634. "lsr r11, r7, #16\n\t"
  32635. "lsr r6, r8, #16\n\t"
  32636. "mul r5, r6, r11\n\t"
  32637. "lsl r11, r7, #16\n\t"
  32638. "lsr r11, r11, #16\n\t"
  32639. "mul r6, r11, r6\n\t"
  32640. "lsr r11, r6, #16\n\t"
  32641. "lsl r6, r6, #16\n\t"
  32642. "adds r10, r10, r6\n\t"
  32643. "adc r5, r5, r11\n\t"
  32644. "lsl r6, r8, #16\n\t"
  32645. "lsl r11, r7, #16\n\t"
  32646. "lsr r6, r6, #16\n\t"
  32647. "lsr r11, r11, #16\n\t"
  32648. "mul r11, r6, r11\n\t"
  32649. "adds r10, r10, r11\n\t"
  32650. "adc r5, r5, #0\n\t"
  32651. "lsr r11, r7, #16\n\t"
  32652. "mul r6, r11, r6\n\t"
  32653. "lsr r11, r6, #16\n\t"
  32654. "lsl r6, r6, #16\n\t"
  32655. "adds r10, r10, r6\n\t"
  32656. "adc r5, r5, r11\n\t"
  32657. "adds r10, r10, r4\n\t"
  32658. "str r10, [%[a], #64]\n\t"
  32659. "adc r5, r5, #0\n\t"
  32660. /* a[i+17] += m[17] * mu */
  32661. "ldr r7, [%[m], #68]\n\t"
  32662. "ldr r10, [%[a], #68]\n\t"
  32663. "lsr r11, r7, #16\n\t"
  32664. "lsr r6, r8, #16\n\t"
  32665. "mul r4, r6, r11\n\t"
  32666. "lsl r11, r7, #16\n\t"
  32667. "lsr r11, r11, #16\n\t"
  32668. "mul r6, r11, r6\n\t"
  32669. "lsr r11, r6, #16\n\t"
  32670. "lsl r6, r6, #16\n\t"
  32671. "adds r10, r10, r6\n\t"
  32672. "adc r4, r4, r11\n\t"
  32673. "lsl r6, r8, #16\n\t"
  32674. "lsl r11, r7, #16\n\t"
  32675. "lsr r6, r6, #16\n\t"
  32676. "lsr r11, r11, #16\n\t"
  32677. "mul r11, r6, r11\n\t"
  32678. "adds r10, r10, r11\n\t"
  32679. "adc r4, r4, #0\n\t"
  32680. "lsr r11, r7, #16\n\t"
  32681. "mul r6, r11, r6\n\t"
  32682. "lsr r11, r6, #16\n\t"
  32683. "lsl r6, r6, #16\n\t"
  32684. "adds r10, r10, r6\n\t"
  32685. "adc r4, r4, r11\n\t"
  32686. "adds r10, r10, r5\n\t"
  32687. "str r10, [%[a], #68]\n\t"
  32688. "adc r4, r4, #0\n\t"
  32689. /* a[i+18] += m[18] * mu */
  32690. "ldr r7, [%[m], #72]\n\t"
  32691. "ldr r10, [%[a], #72]\n\t"
  32692. "lsr r11, r7, #16\n\t"
  32693. "lsr r6, r8, #16\n\t"
  32694. "mul r5, r6, r11\n\t"
  32695. "lsl r11, r7, #16\n\t"
  32696. "lsr r11, r11, #16\n\t"
  32697. "mul r6, r11, r6\n\t"
  32698. "lsr r11, r6, #16\n\t"
  32699. "lsl r6, r6, #16\n\t"
  32700. "adds r10, r10, r6\n\t"
  32701. "adc r5, r5, r11\n\t"
  32702. "lsl r6, r8, #16\n\t"
  32703. "lsl r11, r7, #16\n\t"
  32704. "lsr r6, r6, #16\n\t"
  32705. "lsr r11, r11, #16\n\t"
  32706. "mul r11, r6, r11\n\t"
  32707. "adds r10, r10, r11\n\t"
  32708. "adc r5, r5, #0\n\t"
  32709. "lsr r11, r7, #16\n\t"
  32710. "mul r6, r11, r6\n\t"
  32711. "lsr r11, r6, #16\n\t"
  32712. "lsl r6, r6, #16\n\t"
  32713. "adds r10, r10, r6\n\t"
  32714. "adc r5, r5, r11\n\t"
  32715. "adds r10, r10, r4\n\t"
  32716. "str r10, [%[a], #72]\n\t"
  32717. "adc r5, r5, #0\n\t"
  32718. /* a[i+19] += m[19] * mu */
  32719. "ldr r7, [%[m], #76]\n\t"
  32720. "ldr r10, [%[a], #76]\n\t"
  32721. "lsr r11, r7, #16\n\t"
  32722. "lsr r6, r8, #16\n\t"
  32723. "mul r4, r6, r11\n\t"
  32724. "lsl r11, r7, #16\n\t"
  32725. "lsr r11, r11, #16\n\t"
  32726. "mul r6, r11, r6\n\t"
  32727. "lsr r11, r6, #16\n\t"
  32728. "lsl r6, r6, #16\n\t"
  32729. "adds r10, r10, r6\n\t"
  32730. "adc r4, r4, r11\n\t"
  32731. "lsl r6, r8, #16\n\t"
  32732. "lsl r11, r7, #16\n\t"
  32733. "lsr r6, r6, #16\n\t"
  32734. "lsr r11, r11, #16\n\t"
  32735. "mul r11, r6, r11\n\t"
  32736. "adds r10, r10, r11\n\t"
  32737. "adc r4, r4, #0\n\t"
  32738. "lsr r11, r7, #16\n\t"
  32739. "mul r6, r11, r6\n\t"
  32740. "lsr r11, r6, #16\n\t"
  32741. "lsl r6, r6, #16\n\t"
  32742. "adds r10, r10, r6\n\t"
  32743. "adc r4, r4, r11\n\t"
  32744. "adds r10, r10, r5\n\t"
  32745. "str r10, [%[a], #76]\n\t"
  32746. "adc r4, r4, #0\n\t"
  32747. /* a[i+20] += m[20] * mu */
  32748. "ldr r7, [%[m], #80]\n\t"
  32749. "ldr r10, [%[a], #80]\n\t"
  32750. "lsr r11, r7, #16\n\t"
  32751. "lsr r6, r8, #16\n\t"
  32752. "mul r5, r6, r11\n\t"
  32753. "lsl r11, r7, #16\n\t"
  32754. "lsr r11, r11, #16\n\t"
  32755. "mul r6, r11, r6\n\t"
  32756. "lsr r11, r6, #16\n\t"
  32757. "lsl r6, r6, #16\n\t"
  32758. "adds r10, r10, r6\n\t"
  32759. "adc r5, r5, r11\n\t"
  32760. "lsl r6, r8, #16\n\t"
  32761. "lsl r11, r7, #16\n\t"
  32762. "lsr r6, r6, #16\n\t"
  32763. "lsr r11, r11, #16\n\t"
  32764. "mul r11, r6, r11\n\t"
  32765. "adds r10, r10, r11\n\t"
  32766. "adc r5, r5, #0\n\t"
  32767. "lsr r11, r7, #16\n\t"
  32768. "mul r6, r11, r6\n\t"
  32769. "lsr r11, r6, #16\n\t"
  32770. "lsl r6, r6, #16\n\t"
  32771. "adds r10, r10, r6\n\t"
  32772. "adc r5, r5, r11\n\t"
  32773. "adds r10, r10, r4\n\t"
  32774. "str r10, [%[a], #80]\n\t"
  32775. "adc r5, r5, #0\n\t"
  32776. /* a[i+21] += m[21] * mu */
  32777. "ldr r7, [%[m], #84]\n\t"
  32778. "ldr r10, [%[a], #84]\n\t"
  32779. "lsr r11, r7, #16\n\t"
  32780. "lsr r6, r8, #16\n\t"
  32781. "mul r4, r6, r11\n\t"
  32782. "lsl r11, r7, #16\n\t"
  32783. "lsr r11, r11, #16\n\t"
  32784. "mul r6, r11, r6\n\t"
  32785. "lsr r11, r6, #16\n\t"
  32786. "lsl r6, r6, #16\n\t"
  32787. "adds r10, r10, r6\n\t"
  32788. "adc r4, r4, r11\n\t"
  32789. "lsl r6, r8, #16\n\t"
  32790. "lsl r11, r7, #16\n\t"
  32791. "lsr r6, r6, #16\n\t"
  32792. "lsr r11, r11, #16\n\t"
  32793. "mul r11, r6, r11\n\t"
  32794. "adds r10, r10, r11\n\t"
  32795. "adc r4, r4, #0\n\t"
  32796. "lsr r11, r7, #16\n\t"
  32797. "mul r6, r11, r6\n\t"
  32798. "lsr r11, r6, #16\n\t"
  32799. "lsl r6, r6, #16\n\t"
  32800. "adds r10, r10, r6\n\t"
  32801. "adc r4, r4, r11\n\t"
  32802. "adds r10, r10, r5\n\t"
  32803. "str r10, [%[a], #84]\n\t"
  32804. "adc r4, r4, #0\n\t"
  32805. /* a[i+22] += m[22] * mu */
  32806. "ldr r7, [%[m], #88]\n\t"
  32807. "ldr r10, [%[a], #88]\n\t"
  32808. "lsr r11, r7, #16\n\t"
  32809. "lsr r6, r8, #16\n\t"
  32810. "mul r5, r6, r11\n\t"
  32811. "lsl r11, r7, #16\n\t"
  32812. "lsr r11, r11, #16\n\t"
  32813. "mul r6, r11, r6\n\t"
  32814. "lsr r11, r6, #16\n\t"
  32815. "lsl r6, r6, #16\n\t"
  32816. "adds r10, r10, r6\n\t"
  32817. "adc r5, r5, r11\n\t"
  32818. "lsl r6, r8, #16\n\t"
  32819. "lsl r11, r7, #16\n\t"
  32820. "lsr r6, r6, #16\n\t"
  32821. "lsr r11, r11, #16\n\t"
  32822. "mul r11, r6, r11\n\t"
  32823. "adds r10, r10, r11\n\t"
  32824. "adc r5, r5, #0\n\t"
  32825. "lsr r11, r7, #16\n\t"
  32826. "mul r6, r11, r6\n\t"
  32827. "lsr r11, r6, #16\n\t"
  32828. "lsl r6, r6, #16\n\t"
  32829. "adds r10, r10, r6\n\t"
  32830. "adc r5, r5, r11\n\t"
  32831. "adds r10, r10, r4\n\t"
  32832. "str r10, [%[a], #88]\n\t"
  32833. "adc r5, r5, #0\n\t"
  32834. /* a[i+23] += m[23] * mu */
  32835. "ldr r7, [%[m], #92]\n\t"
  32836. "ldr r10, [%[a], #92]\n\t"
  32837. "lsr r11, r7, #16\n\t"
  32838. "lsr r6, r8, #16\n\t"
  32839. "mul r4, r6, r11\n\t"
  32840. "lsl r11, r7, #16\n\t"
  32841. "lsr r11, r11, #16\n\t"
  32842. "mul r6, r11, r6\n\t"
  32843. "lsr r11, r6, #16\n\t"
  32844. "lsl r6, r6, #16\n\t"
  32845. "adds r10, r10, r6\n\t"
  32846. "adc r4, r4, r11\n\t"
  32847. "lsl r6, r8, #16\n\t"
  32848. "lsl r11, r7, #16\n\t"
  32849. "lsr r6, r6, #16\n\t"
  32850. "lsr r11, r11, #16\n\t"
  32851. "mul r11, r6, r11\n\t"
  32852. "adds r10, r10, r11\n\t"
  32853. "adc r4, r4, #0\n\t"
  32854. "lsr r11, r7, #16\n\t"
  32855. "mul r6, r11, r6\n\t"
  32856. "lsr r11, r6, #16\n\t"
  32857. "lsl r6, r6, #16\n\t"
  32858. "adds r10, r10, r6\n\t"
  32859. "adc r4, r4, r11\n\t"
  32860. "adds r10, r10, r5\n\t"
  32861. "str r10, [%[a], #92]\n\t"
  32862. "adc r4, r4, #0\n\t"
  32863. /* a[i+24] += m[24] * mu */
  32864. "ldr r7, [%[m], #96]\n\t"
  32865. "ldr r10, [%[a], #96]\n\t"
  32866. "lsr r11, r7, #16\n\t"
  32867. "lsr r6, r8, #16\n\t"
  32868. "mul r5, r6, r11\n\t"
  32869. "lsl r11, r7, #16\n\t"
  32870. "lsr r11, r11, #16\n\t"
  32871. "mul r6, r11, r6\n\t"
  32872. "lsr r11, r6, #16\n\t"
  32873. "lsl r6, r6, #16\n\t"
  32874. "adds r10, r10, r6\n\t"
  32875. "adc r5, r5, r11\n\t"
  32876. "lsl r6, r8, #16\n\t"
  32877. "lsl r11, r7, #16\n\t"
  32878. "lsr r6, r6, #16\n\t"
  32879. "lsr r11, r11, #16\n\t"
  32880. "mul r11, r6, r11\n\t"
  32881. "adds r10, r10, r11\n\t"
  32882. "adc r5, r5, #0\n\t"
  32883. "lsr r11, r7, #16\n\t"
  32884. "mul r6, r11, r6\n\t"
  32885. "lsr r11, r6, #16\n\t"
  32886. "lsl r6, r6, #16\n\t"
  32887. "adds r10, r10, r6\n\t"
  32888. "adc r5, r5, r11\n\t"
  32889. "adds r10, r10, r4\n\t"
  32890. "str r10, [%[a], #96]\n\t"
  32891. "adc r5, r5, #0\n\t"
  32892. /* a[i+25] += m[25] * mu */
  32893. "ldr r7, [%[m], #100]\n\t"
  32894. "ldr r10, [%[a], #100]\n\t"
  32895. "lsr r11, r7, #16\n\t"
  32896. "lsr r6, r8, #16\n\t"
  32897. "mul r4, r6, r11\n\t"
  32898. "lsl r11, r7, #16\n\t"
  32899. "lsr r11, r11, #16\n\t"
  32900. "mul r6, r11, r6\n\t"
  32901. "lsr r11, r6, #16\n\t"
  32902. "lsl r6, r6, #16\n\t"
  32903. "adds r10, r10, r6\n\t"
  32904. "adc r4, r4, r11\n\t"
  32905. "lsl r6, r8, #16\n\t"
  32906. "lsl r11, r7, #16\n\t"
  32907. "lsr r6, r6, #16\n\t"
  32908. "lsr r11, r11, #16\n\t"
  32909. "mul r11, r6, r11\n\t"
  32910. "adds r10, r10, r11\n\t"
  32911. "adc r4, r4, #0\n\t"
  32912. "lsr r11, r7, #16\n\t"
  32913. "mul r6, r11, r6\n\t"
  32914. "lsr r11, r6, #16\n\t"
  32915. "lsl r6, r6, #16\n\t"
  32916. "adds r10, r10, r6\n\t"
  32917. "adc r4, r4, r11\n\t"
  32918. "adds r10, r10, r5\n\t"
  32919. "str r10, [%[a], #100]\n\t"
  32920. "adc r4, r4, #0\n\t"
  32921. /* a[i+26] += m[26] * mu */
  32922. "ldr r7, [%[m], #104]\n\t"
  32923. "ldr r10, [%[a], #104]\n\t"
  32924. "lsr r11, r7, #16\n\t"
  32925. "lsr r6, r8, #16\n\t"
  32926. "mul r5, r6, r11\n\t"
  32927. "lsl r11, r7, #16\n\t"
  32928. "lsr r11, r11, #16\n\t"
  32929. "mul r6, r11, r6\n\t"
  32930. "lsr r11, r6, #16\n\t"
  32931. "lsl r6, r6, #16\n\t"
  32932. "adds r10, r10, r6\n\t"
  32933. "adc r5, r5, r11\n\t"
  32934. "lsl r6, r8, #16\n\t"
  32935. "lsl r11, r7, #16\n\t"
  32936. "lsr r6, r6, #16\n\t"
  32937. "lsr r11, r11, #16\n\t"
  32938. "mul r11, r6, r11\n\t"
  32939. "adds r10, r10, r11\n\t"
  32940. "adc r5, r5, #0\n\t"
  32941. "lsr r11, r7, #16\n\t"
  32942. "mul r6, r11, r6\n\t"
  32943. "lsr r11, r6, #16\n\t"
  32944. "lsl r6, r6, #16\n\t"
  32945. "adds r10, r10, r6\n\t"
  32946. "adc r5, r5, r11\n\t"
  32947. "adds r10, r10, r4\n\t"
  32948. "str r10, [%[a], #104]\n\t"
  32949. "adc r5, r5, #0\n\t"
  32950. /* a[i+27] += m[27] * mu */
  32951. "ldr r7, [%[m], #108]\n\t"
  32952. "ldr r10, [%[a], #108]\n\t"
  32953. "lsr r11, r7, #16\n\t"
  32954. "lsr r6, r8, #16\n\t"
  32955. "mul r4, r6, r11\n\t"
  32956. "lsl r11, r7, #16\n\t"
  32957. "lsr r11, r11, #16\n\t"
  32958. "mul r6, r11, r6\n\t"
  32959. "lsr r11, r6, #16\n\t"
  32960. "lsl r6, r6, #16\n\t"
  32961. "adds r10, r10, r6\n\t"
  32962. "adc r4, r4, r11\n\t"
  32963. "lsl r6, r8, #16\n\t"
  32964. "lsl r11, r7, #16\n\t"
  32965. "lsr r6, r6, #16\n\t"
  32966. "lsr r11, r11, #16\n\t"
  32967. "mul r11, r6, r11\n\t"
  32968. "adds r10, r10, r11\n\t"
  32969. "adc r4, r4, #0\n\t"
  32970. "lsr r11, r7, #16\n\t"
  32971. "mul r6, r11, r6\n\t"
  32972. "lsr r11, r6, #16\n\t"
  32973. "lsl r6, r6, #16\n\t"
  32974. "adds r10, r10, r6\n\t"
  32975. "adc r4, r4, r11\n\t"
  32976. "adds r10, r10, r5\n\t"
  32977. "str r10, [%[a], #108]\n\t"
  32978. "adc r4, r4, #0\n\t"
  32979. /* a[i+28] += m[28] * mu */
  32980. "ldr r7, [%[m], #112]\n\t"
  32981. "ldr r10, [%[a], #112]\n\t"
  32982. "lsr r11, r7, #16\n\t"
  32983. "lsr r6, r8, #16\n\t"
  32984. "mul r5, r6, r11\n\t"
  32985. "lsl r11, r7, #16\n\t"
  32986. "lsr r11, r11, #16\n\t"
  32987. "mul r6, r11, r6\n\t"
  32988. "lsr r11, r6, #16\n\t"
  32989. "lsl r6, r6, #16\n\t"
  32990. "adds r10, r10, r6\n\t"
  32991. "adc r5, r5, r11\n\t"
  32992. "lsl r6, r8, #16\n\t"
  32993. "lsl r11, r7, #16\n\t"
  32994. "lsr r6, r6, #16\n\t"
  32995. "lsr r11, r11, #16\n\t"
  32996. "mul r11, r6, r11\n\t"
  32997. "adds r10, r10, r11\n\t"
  32998. "adc r5, r5, #0\n\t"
  32999. "lsr r11, r7, #16\n\t"
  33000. "mul r6, r11, r6\n\t"
  33001. "lsr r11, r6, #16\n\t"
  33002. "lsl r6, r6, #16\n\t"
  33003. "adds r10, r10, r6\n\t"
  33004. "adc r5, r5, r11\n\t"
  33005. "adds r10, r10, r4\n\t"
  33006. "str r10, [%[a], #112]\n\t"
  33007. "adc r5, r5, #0\n\t"
  33008. /* a[i+29] += m[29] * mu */
  33009. "ldr r7, [%[m], #116]\n\t"
  33010. "ldr r10, [%[a], #116]\n\t"
  33011. "lsr r11, r7, #16\n\t"
  33012. "lsr r6, r8, #16\n\t"
  33013. "mul r4, r6, r11\n\t"
  33014. "lsl r11, r7, #16\n\t"
  33015. "lsr r11, r11, #16\n\t"
  33016. "mul r6, r11, r6\n\t"
  33017. "lsr r11, r6, #16\n\t"
  33018. "lsl r6, r6, #16\n\t"
  33019. "adds r10, r10, r6\n\t"
  33020. "adc r4, r4, r11\n\t"
  33021. "lsl r6, r8, #16\n\t"
  33022. "lsl r11, r7, #16\n\t"
  33023. "lsr r6, r6, #16\n\t"
  33024. "lsr r11, r11, #16\n\t"
  33025. "mul r11, r6, r11\n\t"
  33026. "adds r10, r10, r11\n\t"
  33027. "adc r4, r4, #0\n\t"
  33028. "lsr r11, r7, #16\n\t"
  33029. "mul r6, r11, r6\n\t"
  33030. "lsr r11, r6, #16\n\t"
  33031. "lsl r6, r6, #16\n\t"
  33032. "adds r10, r10, r6\n\t"
  33033. "adc r4, r4, r11\n\t"
  33034. "adds r10, r10, r5\n\t"
  33035. "str r10, [%[a], #116]\n\t"
  33036. "adc r4, r4, #0\n\t"
  33037. /* a[i+30] += m[30] * mu */
  33038. "ldr r7, [%[m], #120]\n\t"
  33039. "ldr r10, [%[a], #120]\n\t"
  33040. "lsr r11, r7, #16\n\t"
  33041. "lsr r6, r8, #16\n\t"
  33042. "mul r5, r6, r11\n\t"
  33043. "lsl r11, r7, #16\n\t"
  33044. "lsr r11, r11, #16\n\t"
  33045. "mul r6, r11, r6\n\t"
  33046. "lsr r11, r6, #16\n\t"
  33047. "lsl r6, r6, #16\n\t"
  33048. "adds r10, r10, r6\n\t"
  33049. "adc r5, r5, r11\n\t"
  33050. "lsl r6, r8, #16\n\t"
  33051. "lsl r11, r7, #16\n\t"
  33052. "lsr r6, r6, #16\n\t"
  33053. "lsr r11, r11, #16\n\t"
  33054. "mul r11, r6, r11\n\t"
  33055. "adds r10, r10, r11\n\t"
  33056. "adc r5, r5, #0\n\t"
  33057. "lsr r11, r7, #16\n\t"
  33058. "mul r6, r11, r6\n\t"
  33059. "lsr r11, r6, #16\n\t"
  33060. "lsl r6, r6, #16\n\t"
  33061. "adds r10, r10, r6\n\t"
  33062. "adc r5, r5, r11\n\t"
  33063. "adds r10, r10, r4\n\t"
  33064. "str r10, [%[a], #120]\n\t"
  33065. "adc r5, r5, #0\n\t"
  33066. /* a[i+31] += m[31] * mu */
  33067. "ldr r7, [%[m], #124]\n\t"
  33068. "ldr r10, [%[a], #124]\n\t"
  33069. "lsr r11, r7, #16\n\t"
  33070. "lsr r6, r8, #16\n\t"
  33071. "mul r4, r6, r11\n\t"
  33072. "lsl r11, r7, #16\n\t"
  33073. "lsr r11, r11, #16\n\t"
  33074. "mul r6, r11, r6\n\t"
  33075. "lsr r11, r6, #16\n\t"
  33076. "lsl r6, r6, #16\n\t"
  33077. "adds r10, r10, r6\n\t"
  33078. "adc r4, r4, r11\n\t"
  33079. "lsl r6, r8, #16\n\t"
  33080. "lsl r11, r7, #16\n\t"
  33081. "lsr r6, r6, #16\n\t"
  33082. "lsr r11, r11, #16\n\t"
  33083. "mul r11, r6, r11\n\t"
  33084. "adds r10, r10, r11\n\t"
  33085. "adc r4, r4, #0\n\t"
  33086. "lsr r11, r7, #16\n\t"
  33087. "mul r6, r11, r6\n\t"
  33088. "lsr r11, r6, #16\n\t"
  33089. "lsl r6, r6, #16\n\t"
  33090. "adds r10, r10, r6\n\t"
  33091. "adc r4, r4, r11\n\t"
  33092. "adds r10, r10, r5\n\t"
  33093. "str r10, [%[a], #124]\n\t"
  33094. "adc r4, r4, #0\n\t"
  33095. /* a[i+32] += m[32] * mu */
  33096. "ldr r7, [%[m], #128]\n\t"
  33097. "ldr r10, [%[a], #128]\n\t"
  33098. "lsr r11, r7, #16\n\t"
  33099. "lsr r6, r8, #16\n\t"
  33100. "mul r5, r6, r11\n\t"
  33101. "lsl r11, r7, #16\n\t"
  33102. "lsr r11, r11, #16\n\t"
  33103. "mul r6, r11, r6\n\t"
  33104. "lsr r11, r6, #16\n\t"
  33105. "lsl r6, r6, #16\n\t"
  33106. "adds r10, r10, r6\n\t"
  33107. "adc r5, r5, r11\n\t"
  33108. "lsl r6, r8, #16\n\t"
  33109. "lsl r11, r7, #16\n\t"
  33110. "lsr r6, r6, #16\n\t"
  33111. "lsr r11, r11, #16\n\t"
  33112. "mul r11, r6, r11\n\t"
  33113. "adds r10, r10, r11\n\t"
  33114. "adc r5, r5, #0\n\t"
  33115. "lsr r11, r7, #16\n\t"
  33116. "mul r6, r11, r6\n\t"
  33117. "lsr r11, r6, #16\n\t"
  33118. "lsl r6, r6, #16\n\t"
  33119. "adds r10, r10, r6\n\t"
  33120. "adc r5, r5, r11\n\t"
  33121. "adds r10, r10, r4\n\t"
  33122. "str r10, [%[a], #128]\n\t"
  33123. "adc r5, r5, #0\n\t"
  33124. /* a[i+33] += m[33] * mu */
  33125. "ldr r7, [%[m], #132]\n\t"
  33126. "ldr r10, [%[a], #132]\n\t"
  33127. "lsr r11, r7, #16\n\t"
  33128. "lsr r6, r8, #16\n\t"
  33129. "mul r4, r6, r11\n\t"
  33130. "lsl r11, r7, #16\n\t"
  33131. "lsr r11, r11, #16\n\t"
  33132. "mul r6, r11, r6\n\t"
  33133. "lsr r11, r6, #16\n\t"
  33134. "lsl r6, r6, #16\n\t"
  33135. "adds r10, r10, r6\n\t"
  33136. "adc r4, r4, r11\n\t"
  33137. "lsl r6, r8, #16\n\t"
  33138. "lsl r11, r7, #16\n\t"
  33139. "lsr r6, r6, #16\n\t"
  33140. "lsr r11, r11, #16\n\t"
  33141. "mul r11, r6, r11\n\t"
  33142. "adds r10, r10, r11\n\t"
  33143. "adc r4, r4, #0\n\t"
  33144. "lsr r11, r7, #16\n\t"
  33145. "mul r6, r11, r6\n\t"
  33146. "lsr r11, r6, #16\n\t"
  33147. "lsl r6, r6, #16\n\t"
  33148. "adds r10, r10, r6\n\t"
  33149. "adc r4, r4, r11\n\t"
  33150. "adds r10, r10, r5\n\t"
  33151. "str r10, [%[a], #132]\n\t"
  33152. "adc r4, r4, #0\n\t"
  33153. /* a[i+34] += m[34] * mu */
  33154. "ldr r7, [%[m], #136]\n\t"
  33155. "ldr r10, [%[a], #136]\n\t"
  33156. "lsr r11, r7, #16\n\t"
  33157. "lsr r6, r8, #16\n\t"
  33158. "mul r5, r6, r11\n\t"
  33159. "lsl r11, r7, #16\n\t"
  33160. "lsr r11, r11, #16\n\t"
  33161. "mul r6, r11, r6\n\t"
  33162. "lsr r11, r6, #16\n\t"
  33163. "lsl r6, r6, #16\n\t"
  33164. "adds r10, r10, r6\n\t"
  33165. "adc r5, r5, r11\n\t"
  33166. "lsl r6, r8, #16\n\t"
  33167. "lsl r11, r7, #16\n\t"
  33168. "lsr r6, r6, #16\n\t"
  33169. "lsr r11, r11, #16\n\t"
  33170. "mul r11, r6, r11\n\t"
  33171. "adds r10, r10, r11\n\t"
  33172. "adc r5, r5, #0\n\t"
  33173. "lsr r11, r7, #16\n\t"
  33174. "mul r6, r11, r6\n\t"
  33175. "lsr r11, r6, #16\n\t"
  33176. "lsl r6, r6, #16\n\t"
  33177. "adds r10, r10, r6\n\t"
  33178. "adc r5, r5, r11\n\t"
  33179. "adds r10, r10, r4\n\t"
  33180. "str r10, [%[a], #136]\n\t"
  33181. "adc r5, r5, #0\n\t"
  33182. /* a[i+35] += m[35] * mu */
  33183. "ldr r7, [%[m], #140]\n\t"
  33184. "ldr r10, [%[a], #140]\n\t"
  33185. "lsr r11, r7, #16\n\t"
  33186. "lsr r6, r8, #16\n\t"
  33187. "mul r4, r6, r11\n\t"
  33188. "lsl r11, r7, #16\n\t"
  33189. "lsr r11, r11, #16\n\t"
  33190. "mul r6, r11, r6\n\t"
  33191. "lsr r11, r6, #16\n\t"
  33192. "lsl r6, r6, #16\n\t"
  33193. "adds r10, r10, r6\n\t"
  33194. "adc r4, r4, r11\n\t"
  33195. "lsl r6, r8, #16\n\t"
  33196. "lsl r11, r7, #16\n\t"
  33197. "lsr r6, r6, #16\n\t"
  33198. "lsr r11, r11, #16\n\t"
  33199. "mul r11, r6, r11\n\t"
  33200. "adds r10, r10, r11\n\t"
  33201. "adc r4, r4, #0\n\t"
  33202. "lsr r11, r7, #16\n\t"
  33203. "mul r6, r11, r6\n\t"
  33204. "lsr r11, r6, #16\n\t"
  33205. "lsl r6, r6, #16\n\t"
  33206. "adds r10, r10, r6\n\t"
  33207. "adc r4, r4, r11\n\t"
  33208. "adds r10, r10, r5\n\t"
  33209. "str r10, [%[a], #140]\n\t"
  33210. "adc r4, r4, #0\n\t"
  33211. /* a[i+36] += m[36] * mu */
  33212. "ldr r7, [%[m], #144]\n\t"
  33213. "ldr r10, [%[a], #144]\n\t"
  33214. "lsr r11, r7, #16\n\t"
  33215. "lsr r6, r8, #16\n\t"
  33216. "mul r5, r6, r11\n\t"
  33217. "lsl r11, r7, #16\n\t"
  33218. "lsr r11, r11, #16\n\t"
  33219. "mul r6, r11, r6\n\t"
  33220. "lsr r11, r6, #16\n\t"
  33221. "lsl r6, r6, #16\n\t"
  33222. "adds r10, r10, r6\n\t"
  33223. "adc r5, r5, r11\n\t"
  33224. "lsl r6, r8, #16\n\t"
  33225. "lsl r11, r7, #16\n\t"
  33226. "lsr r6, r6, #16\n\t"
  33227. "lsr r11, r11, #16\n\t"
  33228. "mul r11, r6, r11\n\t"
  33229. "adds r10, r10, r11\n\t"
  33230. "adc r5, r5, #0\n\t"
  33231. "lsr r11, r7, #16\n\t"
  33232. "mul r6, r11, r6\n\t"
  33233. "lsr r11, r6, #16\n\t"
  33234. "lsl r6, r6, #16\n\t"
  33235. "adds r10, r10, r6\n\t"
  33236. "adc r5, r5, r11\n\t"
  33237. "adds r10, r10, r4\n\t"
  33238. "str r10, [%[a], #144]\n\t"
  33239. "adc r5, r5, #0\n\t"
  33240. /* a[i+37] += m[37] * mu */
  33241. "ldr r7, [%[m], #148]\n\t"
  33242. "ldr r10, [%[a], #148]\n\t"
  33243. "lsr r11, r7, #16\n\t"
  33244. "lsr r6, r8, #16\n\t"
  33245. "mul r4, r6, r11\n\t"
  33246. "lsl r11, r7, #16\n\t"
  33247. "lsr r11, r11, #16\n\t"
  33248. "mul r6, r11, r6\n\t"
  33249. "lsr r11, r6, #16\n\t"
  33250. "lsl r6, r6, #16\n\t"
  33251. "adds r10, r10, r6\n\t"
  33252. "adc r4, r4, r11\n\t"
  33253. "lsl r6, r8, #16\n\t"
  33254. "lsl r11, r7, #16\n\t"
  33255. "lsr r6, r6, #16\n\t"
  33256. "lsr r11, r11, #16\n\t"
  33257. "mul r11, r6, r11\n\t"
  33258. "adds r10, r10, r11\n\t"
  33259. "adc r4, r4, #0\n\t"
  33260. "lsr r11, r7, #16\n\t"
  33261. "mul r6, r11, r6\n\t"
  33262. "lsr r11, r6, #16\n\t"
  33263. "lsl r6, r6, #16\n\t"
  33264. "adds r10, r10, r6\n\t"
  33265. "adc r4, r4, r11\n\t"
  33266. "adds r10, r10, r5\n\t"
  33267. "str r10, [%[a], #148]\n\t"
  33268. "adc r4, r4, #0\n\t"
  33269. /* a[i+38] += m[38] * mu */
  33270. "ldr r7, [%[m], #152]\n\t"
  33271. "ldr r10, [%[a], #152]\n\t"
  33272. "lsr r11, r7, #16\n\t"
  33273. "lsr r6, r8, #16\n\t"
  33274. "mul r5, r6, r11\n\t"
  33275. "lsl r11, r7, #16\n\t"
  33276. "lsr r11, r11, #16\n\t"
  33277. "mul r6, r11, r6\n\t"
  33278. "lsr r11, r6, #16\n\t"
  33279. "lsl r6, r6, #16\n\t"
  33280. "adds r10, r10, r6\n\t"
  33281. "adc r5, r5, r11\n\t"
  33282. "lsl r6, r8, #16\n\t"
  33283. "lsl r11, r7, #16\n\t"
  33284. "lsr r6, r6, #16\n\t"
  33285. "lsr r11, r11, #16\n\t"
  33286. "mul r11, r6, r11\n\t"
  33287. "adds r10, r10, r11\n\t"
  33288. "adc r5, r5, #0\n\t"
  33289. "lsr r11, r7, #16\n\t"
  33290. "mul r6, r11, r6\n\t"
  33291. "lsr r11, r6, #16\n\t"
  33292. "lsl r6, r6, #16\n\t"
  33293. "adds r10, r10, r6\n\t"
  33294. "adc r5, r5, r11\n\t"
  33295. "adds r10, r10, r4\n\t"
  33296. "str r10, [%[a], #152]\n\t"
  33297. "adc r5, r5, #0\n\t"
  33298. /* a[i+39] += m[39] * mu */
  33299. "ldr r7, [%[m], #156]\n\t"
  33300. "ldr r10, [%[a], #156]\n\t"
  33301. "lsr r11, r7, #16\n\t"
  33302. "lsr r6, r8, #16\n\t"
  33303. "mul r4, r6, r11\n\t"
  33304. "lsl r11, r7, #16\n\t"
  33305. "lsr r11, r11, #16\n\t"
  33306. "mul r6, r11, r6\n\t"
  33307. "lsr r11, r6, #16\n\t"
  33308. "lsl r6, r6, #16\n\t"
  33309. "adds r10, r10, r6\n\t"
  33310. "adc r4, r4, r11\n\t"
  33311. "lsl r6, r8, #16\n\t"
  33312. "lsl r11, r7, #16\n\t"
  33313. "lsr r6, r6, #16\n\t"
  33314. "lsr r11, r11, #16\n\t"
  33315. "mul r11, r6, r11\n\t"
  33316. "adds r10, r10, r11\n\t"
  33317. "adc r4, r4, #0\n\t"
  33318. "lsr r11, r7, #16\n\t"
  33319. "mul r6, r11, r6\n\t"
  33320. "lsr r11, r6, #16\n\t"
  33321. "lsl r6, r6, #16\n\t"
  33322. "adds r10, r10, r6\n\t"
  33323. "adc r4, r4, r11\n\t"
  33324. "adds r10, r10, r5\n\t"
  33325. "str r10, [%[a], #156]\n\t"
  33326. "adc r4, r4, #0\n\t"
  33327. /* a[i+40] += m[40] * mu */
  33328. "ldr r7, [%[m], #160]\n\t"
  33329. "ldr r10, [%[a], #160]\n\t"
  33330. "lsr r11, r7, #16\n\t"
  33331. "lsr r6, r8, #16\n\t"
  33332. "mul r5, r6, r11\n\t"
  33333. "lsl r11, r7, #16\n\t"
  33334. "lsr r11, r11, #16\n\t"
  33335. "mul r6, r11, r6\n\t"
  33336. "lsr r11, r6, #16\n\t"
  33337. "lsl r6, r6, #16\n\t"
  33338. "adds r10, r10, r6\n\t"
  33339. "adc r5, r5, r11\n\t"
  33340. "lsl r6, r8, #16\n\t"
  33341. "lsl r11, r7, #16\n\t"
  33342. "lsr r6, r6, #16\n\t"
  33343. "lsr r11, r11, #16\n\t"
  33344. "mul r11, r6, r11\n\t"
  33345. "adds r10, r10, r11\n\t"
  33346. "adc r5, r5, #0\n\t"
  33347. "lsr r11, r7, #16\n\t"
  33348. "mul r6, r11, r6\n\t"
  33349. "lsr r11, r6, #16\n\t"
  33350. "lsl r6, r6, #16\n\t"
  33351. "adds r10, r10, r6\n\t"
  33352. "adc r5, r5, r11\n\t"
  33353. "adds r10, r10, r4\n\t"
  33354. "str r10, [%[a], #160]\n\t"
  33355. "adc r5, r5, #0\n\t"
  33356. /* a[i+41] += m[41] * mu */
  33357. "ldr r7, [%[m], #164]\n\t"
  33358. "ldr r10, [%[a], #164]\n\t"
  33359. "lsr r11, r7, #16\n\t"
  33360. "lsr r6, r8, #16\n\t"
  33361. "mul r4, r6, r11\n\t"
  33362. "lsl r11, r7, #16\n\t"
  33363. "lsr r11, r11, #16\n\t"
  33364. "mul r6, r11, r6\n\t"
  33365. "lsr r11, r6, #16\n\t"
  33366. "lsl r6, r6, #16\n\t"
  33367. "adds r10, r10, r6\n\t"
  33368. "adc r4, r4, r11\n\t"
  33369. "lsl r6, r8, #16\n\t"
  33370. "lsl r11, r7, #16\n\t"
  33371. "lsr r6, r6, #16\n\t"
  33372. "lsr r11, r11, #16\n\t"
  33373. "mul r11, r6, r11\n\t"
  33374. "adds r10, r10, r11\n\t"
  33375. "adc r4, r4, #0\n\t"
  33376. "lsr r11, r7, #16\n\t"
  33377. "mul r6, r11, r6\n\t"
  33378. "lsr r11, r6, #16\n\t"
  33379. "lsl r6, r6, #16\n\t"
  33380. "adds r10, r10, r6\n\t"
  33381. "adc r4, r4, r11\n\t"
  33382. "adds r10, r10, r5\n\t"
  33383. "str r10, [%[a], #164]\n\t"
  33384. "adc r4, r4, #0\n\t"
  33385. /* a[i+42] += m[42] * mu */
  33386. "ldr r7, [%[m], #168]\n\t"
  33387. "ldr r10, [%[a], #168]\n\t"
  33388. "lsr r11, r7, #16\n\t"
  33389. "lsr r6, r8, #16\n\t"
  33390. "mul r5, r6, r11\n\t"
  33391. "lsl r11, r7, #16\n\t"
  33392. "lsr r11, r11, #16\n\t"
  33393. "mul r6, r11, r6\n\t"
  33394. "lsr r11, r6, #16\n\t"
  33395. "lsl r6, r6, #16\n\t"
  33396. "adds r10, r10, r6\n\t"
  33397. "adc r5, r5, r11\n\t"
  33398. "lsl r6, r8, #16\n\t"
  33399. "lsl r11, r7, #16\n\t"
  33400. "lsr r6, r6, #16\n\t"
  33401. "lsr r11, r11, #16\n\t"
  33402. "mul r11, r6, r11\n\t"
  33403. "adds r10, r10, r11\n\t"
  33404. "adc r5, r5, #0\n\t"
  33405. "lsr r11, r7, #16\n\t"
  33406. "mul r6, r11, r6\n\t"
  33407. "lsr r11, r6, #16\n\t"
  33408. "lsl r6, r6, #16\n\t"
  33409. "adds r10, r10, r6\n\t"
  33410. "adc r5, r5, r11\n\t"
  33411. "adds r10, r10, r4\n\t"
  33412. "str r10, [%[a], #168]\n\t"
  33413. "adc r5, r5, #0\n\t"
  33414. /* a[i+43] += m[43] * mu */
  33415. "ldr r7, [%[m], #172]\n\t"
  33416. "ldr r10, [%[a], #172]\n\t"
  33417. "lsr r11, r7, #16\n\t"
  33418. "lsr r6, r8, #16\n\t"
  33419. "mul r4, r6, r11\n\t"
  33420. "lsl r11, r7, #16\n\t"
  33421. "lsr r11, r11, #16\n\t"
  33422. "mul r6, r11, r6\n\t"
  33423. "lsr r11, r6, #16\n\t"
  33424. "lsl r6, r6, #16\n\t"
  33425. "adds r10, r10, r6\n\t"
  33426. "adc r4, r4, r11\n\t"
  33427. "lsl r6, r8, #16\n\t"
  33428. "lsl r11, r7, #16\n\t"
  33429. "lsr r6, r6, #16\n\t"
  33430. "lsr r11, r11, #16\n\t"
  33431. "mul r11, r6, r11\n\t"
  33432. "adds r10, r10, r11\n\t"
  33433. "adc r4, r4, #0\n\t"
  33434. "lsr r11, r7, #16\n\t"
  33435. "mul r6, r11, r6\n\t"
  33436. "lsr r11, r6, #16\n\t"
  33437. "lsl r6, r6, #16\n\t"
  33438. "adds r10, r10, r6\n\t"
  33439. "adc r4, r4, r11\n\t"
  33440. "adds r10, r10, r5\n\t"
  33441. "str r10, [%[a], #172]\n\t"
  33442. "adc r4, r4, #0\n\t"
  33443. /* a[i+44] += m[44] * mu */
  33444. "ldr r7, [%[m], #176]\n\t"
  33445. "ldr r10, [%[a], #176]\n\t"
  33446. "lsr r11, r7, #16\n\t"
  33447. "lsr r6, r8, #16\n\t"
  33448. "mul r5, r6, r11\n\t"
  33449. "lsl r11, r7, #16\n\t"
  33450. "lsr r11, r11, #16\n\t"
  33451. "mul r6, r11, r6\n\t"
  33452. "lsr r11, r6, #16\n\t"
  33453. "lsl r6, r6, #16\n\t"
  33454. "adds r10, r10, r6\n\t"
  33455. "adc r5, r5, r11\n\t"
  33456. "lsl r6, r8, #16\n\t"
  33457. "lsl r11, r7, #16\n\t"
  33458. "lsr r6, r6, #16\n\t"
  33459. "lsr r11, r11, #16\n\t"
  33460. "mul r11, r6, r11\n\t"
  33461. "adds r10, r10, r11\n\t"
  33462. "adc r5, r5, #0\n\t"
  33463. "lsr r11, r7, #16\n\t"
  33464. "mul r6, r11, r6\n\t"
  33465. "lsr r11, r6, #16\n\t"
  33466. "lsl r6, r6, #16\n\t"
  33467. "adds r10, r10, r6\n\t"
  33468. "adc r5, r5, r11\n\t"
  33469. "adds r10, r10, r4\n\t"
  33470. "str r10, [%[a], #176]\n\t"
  33471. "adc r5, r5, #0\n\t"
  33472. /* a[i+45] += m[45] * mu */
  33473. "ldr r7, [%[m], #180]\n\t"
  33474. "ldr r10, [%[a], #180]\n\t"
  33475. "lsr r11, r7, #16\n\t"
  33476. "lsr r6, r8, #16\n\t"
  33477. "mul r4, r6, r11\n\t"
  33478. "lsl r11, r7, #16\n\t"
  33479. "lsr r11, r11, #16\n\t"
  33480. "mul r6, r11, r6\n\t"
  33481. "lsr r11, r6, #16\n\t"
  33482. "lsl r6, r6, #16\n\t"
  33483. "adds r10, r10, r6\n\t"
  33484. "adc r4, r4, r11\n\t"
  33485. "lsl r6, r8, #16\n\t"
  33486. "lsl r11, r7, #16\n\t"
  33487. "lsr r6, r6, #16\n\t"
  33488. "lsr r11, r11, #16\n\t"
  33489. "mul r11, r6, r11\n\t"
  33490. "adds r10, r10, r11\n\t"
  33491. "adc r4, r4, #0\n\t"
  33492. "lsr r11, r7, #16\n\t"
  33493. "mul r6, r11, r6\n\t"
  33494. "lsr r11, r6, #16\n\t"
  33495. "lsl r6, r6, #16\n\t"
  33496. "adds r10, r10, r6\n\t"
  33497. "adc r4, r4, r11\n\t"
  33498. "adds r10, r10, r5\n\t"
  33499. "str r10, [%[a], #180]\n\t"
  33500. "adc r4, r4, #0\n\t"
  33501. /* a[i+46] += m[46] * mu */
  33502. "ldr r7, [%[m], #184]\n\t"
  33503. "ldr r10, [%[a], #184]\n\t"
  33504. "lsr r11, r7, #16\n\t"
  33505. "lsr r6, r8, #16\n\t"
  33506. "mul r5, r6, r11\n\t"
  33507. "lsl r11, r7, #16\n\t"
  33508. "lsr r11, r11, #16\n\t"
  33509. "mul r6, r11, r6\n\t"
  33510. "lsr r11, r6, #16\n\t"
  33511. "lsl r6, r6, #16\n\t"
  33512. "adds r10, r10, r6\n\t"
  33513. "adc r5, r5, r11\n\t"
  33514. "lsl r6, r8, #16\n\t"
  33515. "lsl r11, r7, #16\n\t"
  33516. "lsr r6, r6, #16\n\t"
  33517. "lsr r11, r11, #16\n\t"
  33518. "mul r11, r6, r11\n\t"
  33519. "adds r10, r10, r11\n\t"
  33520. "adc r5, r5, #0\n\t"
  33521. "lsr r11, r7, #16\n\t"
  33522. "mul r6, r11, r6\n\t"
  33523. "lsr r11, r6, #16\n\t"
  33524. "lsl r6, r6, #16\n\t"
  33525. "adds r10, r10, r6\n\t"
  33526. "adc r5, r5, r11\n\t"
  33527. "adds r10, r10, r4\n\t"
  33528. "str r10, [%[a], #184]\n\t"
  33529. "adc r5, r5, #0\n\t"
  33530. /* a[i+47] += m[47] * mu */
  33531. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  33532. "ldr r11, [%[m], #188]\n\t"
  33533. #else
  33534. "ldr r7, [%[m], #188]\n\t"
  33535. #endif
  33536. "ldr r10, [%[a], #188]\n\t"
  33537. "lsl r6, r8, #16\n\t"
  33538. "lsl r7, r11, #16\n\t"
  33539. "lsr r6, r6, #16\n\t"
  33540. "lsr r7, r7, #16\n\t"
  33541. "mul r7, r6, r7\n\t"
  33542. "adds r5, r5, r7\n\t"
  33543. "adcs r4, r3, #0\n\t"
  33544. "mov r3, #0\n\t"
  33545. "adc r3, r3, r3\n\t"
  33546. "lsr r7, r11, #16\n\t"
  33547. "mul r6, r7, r6\n\t"
  33548. "lsr r7, r6, #16\n\t"
  33549. "lsl r6, r6, #16\n\t"
  33550. "adds r5, r5, r6\n\t"
  33551. "adcs r4, r4, r7\n\t"
  33552. "adc r3, r3, #0\n\t"
  33553. "mov r6, r8\n\t"
  33554. "lsr r7, r11, #16\n\t"
  33555. "lsr r6, r6, #16\n\t"
  33556. "mul r7, r6, r7\n\t"
  33557. "adds r4, r4, r7\n\t"
  33558. "lsl r7, r11, #16\n\t"
  33559. "adc r3, r3, #0\n\t"
  33560. "lsr r7, r7, #16\n\t"
  33561. "mul r6, r7, r6\n\t"
  33562. "lsr r7, r6, #16\n\t"
  33563. "lsl r6, r6, #16\n\t"
  33564. "adds r5, r5, r6\n\t"
  33565. "adcs r4, r4, r7\n\t"
  33566. "adc r3, r3, #0\n\t"
  33567. "adds r10, r10, r5\n\t"
  33568. "str r10, [%[a], #188]\n\t"
  33569. "ldr r10, [%[a], #192]\n\t"
  33570. "adcs r10, r10, r4\n\t"
  33571. "str r10, [%[a], #192]\n\t"
  33572. "adc r3, r3, #0\n\t"
  33573. /* i += 1 */
  33574. "add r9, r9, #4\n\t"
  33575. "add %[a], %[a], #4\n\t"
  33576. "cmp r9, #0xc0\n\t"
  33577. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  33578. /* Loop Done */
  33579. "str r12, [%[a]]\n\t"
  33580. "str lr, [%[a], #4]\n\t"
  33581. "mov %[mp], r3\n\t"
  33582. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  33583. :
  33584. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  33585. );
  33586. sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp);
  33587. }
  33588. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  33589. /* Reduce the number back to 3072 bits using Montgomery reduction.
  33590. *
  33591. * a A single precision number to reduce in place.
  33592. * m The single precision number representing the modulus.
  33593. * mp The digit representing the negative inverse of m mod 2^n.
  33594. */
  33595. static SP_NOINLINE void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  33596. {
  33597. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  33598. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  33599. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  33600. __asm__ __volatile__ (
  33601. "ldr r11, [%[m]]\n\t"
  33602. /* i = 0 */
  33603. "mov r9, #0\n\t"
  33604. "mov r3, #0\n\t"
  33605. "ldr r12, [%[a]]\n\t"
  33606. "ldr lr, [%[a], #4]\n\t"
  33607. "\n"
  33608. "L_sp_3072_mont_reduce_48_word_%=: \n\t"
  33609. /* mu = a[i] * mp */
  33610. "mul r8, %[mp], r12\n\t"
  33611. /* a[i+0] += m[0] * mu */
  33612. "mov r5, #0\n\t"
  33613. "umlal r12, r5, r8, r11\n\t"
  33614. /* a[i+1] += m[1] * mu */
  33615. "ldr r7, [%[m], #4]\n\t"
  33616. "mov r4, #0\n\t"
  33617. "umlal lr, r4, r8, r7\n\t"
  33618. "mov r12, lr\n\t"
  33619. "adds r12, r12, r5\n\t"
  33620. "adc r4, r4, #0\n\t"
  33621. /* a[i+2] += m[2] * mu */
  33622. "ldr r7, [%[m], #8]\n\t"
  33623. "ldr lr, [%[a], #8]\n\t"
  33624. "mov r5, #0\n\t"
  33625. "umlal lr, r5, r8, r7\n\t"
  33626. "adds lr, lr, r4\n\t"
  33627. "adc r5, r5, #0\n\t"
  33628. /* a[i+3] += m[3] * mu */
  33629. "ldr r7, [%[m], #12]\n\t"
  33630. "ldr r10, [%[a], #12]\n\t"
  33631. "mov r4, #0\n\t"
  33632. "umlal r10, r4, r8, r7\n\t"
  33633. "adds r10, r10, r5\n\t"
  33634. "str r10, [%[a], #12]\n\t"
  33635. "adc r4, r4, #0\n\t"
  33636. /* a[i+4] += m[4] * mu */
  33637. "ldr r7, [%[m], #16]\n\t"
  33638. "ldr r10, [%[a], #16]\n\t"
  33639. "mov r5, #0\n\t"
  33640. "umlal r10, r5, r8, r7\n\t"
  33641. "adds r10, r10, r4\n\t"
  33642. "str r10, [%[a], #16]\n\t"
  33643. "adc r5, r5, #0\n\t"
  33644. /* a[i+5] += m[5] * mu */
  33645. "ldr r7, [%[m], #20]\n\t"
  33646. "ldr r10, [%[a], #20]\n\t"
  33647. "mov r4, #0\n\t"
  33648. "umlal r10, r4, r8, r7\n\t"
  33649. "adds r10, r10, r5\n\t"
  33650. "str r10, [%[a], #20]\n\t"
  33651. "adc r4, r4, #0\n\t"
  33652. /* a[i+6] += m[6] * mu */
  33653. "ldr r7, [%[m], #24]\n\t"
  33654. "ldr r10, [%[a], #24]\n\t"
  33655. "mov r5, #0\n\t"
  33656. "umlal r10, r5, r8, r7\n\t"
  33657. "adds r10, r10, r4\n\t"
  33658. "str r10, [%[a], #24]\n\t"
  33659. "adc r5, r5, #0\n\t"
  33660. /* a[i+7] += m[7] * mu */
  33661. "ldr r7, [%[m], #28]\n\t"
  33662. "ldr r10, [%[a], #28]\n\t"
  33663. "mov r4, #0\n\t"
  33664. "umlal r10, r4, r8, r7\n\t"
  33665. "adds r10, r10, r5\n\t"
  33666. "str r10, [%[a], #28]\n\t"
  33667. "adc r4, r4, #0\n\t"
  33668. /* a[i+8] += m[8] * mu */
  33669. "ldr r7, [%[m], #32]\n\t"
  33670. "ldr r10, [%[a], #32]\n\t"
  33671. "mov r5, #0\n\t"
  33672. "umlal r10, r5, r8, r7\n\t"
  33673. "adds r10, r10, r4\n\t"
  33674. "str r10, [%[a], #32]\n\t"
  33675. "adc r5, r5, #0\n\t"
  33676. /* a[i+9] += m[9] * mu */
  33677. "ldr r7, [%[m], #36]\n\t"
  33678. "ldr r10, [%[a], #36]\n\t"
  33679. "mov r4, #0\n\t"
  33680. "umlal r10, r4, r8, r7\n\t"
  33681. "adds r10, r10, r5\n\t"
  33682. "str r10, [%[a], #36]\n\t"
  33683. "adc r4, r4, #0\n\t"
  33684. /* a[i+10] += m[10] * mu */
  33685. "ldr r7, [%[m], #40]\n\t"
  33686. "ldr r10, [%[a], #40]\n\t"
  33687. "mov r5, #0\n\t"
  33688. "umlal r10, r5, r8, r7\n\t"
  33689. "adds r10, r10, r4\n\t"
  33690. "str r10, [%[a], #40]\n\t"
  33691. "adc r5, r5, #0\n\t"
  33692. /* a[i+11] += m[11] * mu */
  33693. "ldr r7, [%[m], #44]\n\t"
  33694. "ldr r10, [%[a], #44]\n\t"
  33695. "mov r4, #0\n\t"
  33696. "umlal r10, r4, r8, r7\n\t"
  33697. "adds r10, r10, r5\n\t"
  33698. "str r10, [%[a], #44]\n\t"
  33699. "adc r4, r4, #0\n\t"
  33700. /* a[i+12] += m[12] * mu */
  33701. "ldr r7, [%[m], #48]\n\t"
  33702. "ldr r10, [%[a], #48]\n\t"
  33703. "mov r5, #0\n\t"
  33704. "umlal r10, r5, r8, r7\n\t"
  33705. "adds r10, r10, r4\n\t"
  33706. "str r10, [%[a], #48]\n\t"
  33707. "adc r5, r5, #0\n\t"
  33708. /* a[i+13] += m[13] * mu */
  33709. "ldr r7, [%[m], #52]\n\t"
  33710. "ldr r10, [%[a], #52]\n\t"
  33711. "mov r4, #0\n\t"
  33712. "umlal r10, r4, r8, r7\n\t"
  33713. "adds r10, r10, r5\n\t"
  33714. "str r10, [%[a], #52]\n\t"
  33715. "adc r4, r4, #0\n\t"
  33716. /* a[i+14] += m[14] * mu */
  33717. "ldr r7, [%[m], #56]\n\t"
  33718. "ldr r10, [%[a], #56]\n\t"
  33719. "mov r5, #0\n\t"
  33720. "umlal r10, r5, r8, r7\n\t"
  33721. "adds r10, r10, r4\n\t"
  33722. "str r10, [%[a], #56]\n\t"
  33723. "adc r5, r5, #0\n\t"
  33724. /* a[i+15] += m[15] * mu */
  33725. "ldr r7, [%[m], #60]\n\t"
  33726. "ldr r10, [%[a], #60]\n\t"
  33727. "mov r4, #0\n\t"
  33728. "umlal r10, r4, r8, r7\n\t"
  33729. "adds r10, r10, r5\n\t"
  33730. "str r10, [%[a], #60]\n\t"
  33731. "adc r4, r4, #0\n\t"
  33732. /* a[i+16] += m[16] * mu */
  33733. "ldr r7, [%[m], #64]\n\t"
  33734. "ldr r10, [%[a], #64]\n\t"
  33735. "mov r5, #0\n\t"
  33736. "umlal r10, r5, r8, r7\n\t"
  33737. "adds r10, r10, r4\n\t"
  33738. "str r10, [%[a], #64]\n\t"
  33739. "adc r5, r5, #0\n\t"
  33740. /* a[i+17] += m[17] * mu */
  33741. "ldr r7, [%[m], #68]\n\t"
  33742. "ldr r10, [%[a], #68]\n\t"
  33743. "mov r4, #0\n\t"
  33744. "umlal r10, r4, r8, r7\n\t"
  33745. "adds r10, r10, r5\n\t"
  33746. "str r10, [%[a], #68]\n\t"
  33747. "adc r4, r4, #0\n\t"
  33748. /* a[i+18] += m[18] * mu */
  33749. "ldr r7, [%[m], #72]\n\t"
  33750. "ldr r10, [%[a], #72]\n\t"
  33751. "mov r5, #0\n\t"
  33752. "umlal r10, r5, r8, r7\n\t"
  33753. "adds r10, r10, r4\n\t"
  33754. "str r10, [%[a], #72]\n\t"
  33755. "adc r5, r5, #0\n\t"
  33756. /* a[i+19] += m[19] * mu */
  33757. "ldr r7, [%[m], #76]\n\t"
  33758. "ldr r10, [%[a], #76]\n\t"
  33759. "mov r4, #0\n\t"
  33760. "umlal r10, r4, r8, r7\n\t"
  33761. "adds r10, r10, r5\n\t"
  33762. "str r10, [%[a], #76]\n\t"
  33763. "adc r4, r4, #0\n\t"
  33764. /* a[i+20] += m[20] * mu */
  33765. "ldr r7, [%[m], #80]\n\t"
  33766. "ldr r10, [%[a], #80]\n\t"
  33767. "mov r5, #0\n\t"
  33768. "umlal r10, r5, r8, r7\n\t"
  33769. "adds r10, r10, r4\n\t"
  33770. "str r10, [%[a], #80]\n\t"
  33771. "adc r5, r5, #0\n\t"
  33772. /* a[i+21] += m[21] * mu */
  33773. "ldr r7, [%[m], #84]\n\t"
  33774. "ldr r10, [%[a], #84]\n\t"
  33775. "mov r4, #0\n\t"
  33776. "umlal r10, r4, r8, r7\n\t"
  33777. "adds r10, r10, r5\n\t"
  33778. "str r10, [%[a], #84]\n\t"
  33779. "adc r4, r4, #0\n\t"
  33780. /* a[i+22] += m[22] * mu */
  33781. "ldr r7, [%[m], #88]\n\t"
  33782. "ldr r10, [%[a], #88]\n\t"
  33783. "mov r5, #0\n\t"
  33784. "umlal r10, r5, r8, r7\n\t"
  33785. "adds r10, r10, r4\n\t"
  33786. "str r10, [%[a], #88]\n\t"
  33787. "adc r5, r5, #0\n\t"
  33788. /* a[i+23] += m[23] * mu */
  33789. "ldr r7, [%[m], #92]\n\t"
  33790. "ldr r10, [%[a], #92]\n\t"
  33791. "mov r4, #0\n\t"
  33792. "umlal r10, r4, r8, r7\n\t"
  33793. "adds r10, r10, r5\n\t"
  33794. "str r10, [%[a], #92]\n\t"
  33795. "adc r4, r4, #0\n\t"
  33796. /* a[i+24] += m[24] * mu */
  33797. "ldr r7, [%[m], #96]\n\t"
  33798. "ldr r10, [%[a], #96]\n\t"
  33799. "mov r5, #0\n\t"
  33800. "umlal r10, r5, r8, r7\n\t"
  33801. "adds r10, r10, r4\n\t"
  33802. "str r10, [%[a], #96]\n\t"
  33803. "adc r5, r5, #0\n\t"
  33804. /* a[i+25] += m[25] * mu */
  33805. "ldr r7, [%[m], #100]\n\t"
  33806. "ldr r10, [%[a], #100]\n\t"
  33807. "mov r4, #0\n\t"
  33808. "umlal r10, r4, r8, r7\n\t"
  33809. "adds r10, r10, r5\n\t"
  33810. "str r10, [%[a], #100]\n\t"
  33811. "adc r4, r4, #0\n\t"
  33812. /* a[i+26] += m[26] * mu */
  33813. "ldr r7, [%[m], #104]\n\t"
  33814. "ldr r10, [%[a], #104]\n\t"
  33815. "mov r5, #0\n\t"
  33816. "umlal r10, r5, r8, r7\n\t"
  33817. "adds r10, r10, r4\n\t"
  33818. "str r10, [%[a], #104]\n\t"
  33819. "adc r5, r5, #0\n\t"
  33820. /* a[i+27] += m[27] * mu */
  33821. "ldr r7, [%[m], #108]\n\t"
  33822. "ldr r10, [%[a], #108]\n\t"
  33823. "mov r4, #0\n\t"
  33824. "umlal r10, r4, r8, r7\n\t"
  33825. "adds r10, r10, r5\n\t"
  33826. "str r10, [%[a], #108]\n\t"
  33827. "adc r4, r4, #0\n\t"
  33828. /* a[i+28] += m[28] * mu */
  33829. "ldr r7, [%[m], #112]\n\t"
  33830. "ldr r10, [%[a], #112]\n\t"
  33831. "mov r5, #0\n\t"
  33832. "umlal r10, r5, r8, r7\n\t"
  33833. "adds r10, r10, r4\n\t"
  33834. "str r10, [%[a], #112]\n\t"
  33835. "adc r5, r5, #0\n\t"
  33836. /* a[i+29] += m[29] * mu */
  33837. "ldr r7, [%[m], #116]\n\t"
  33838. "ldr r10, [%[a], #116]\n\t"
  33839. "mov r4, #0\n\t"
  33840. "umlal r10, r4, r8, r7\n\t"
  33841. "adds r10, r10, r5\n\t"
  33842. "str r10, [%[a], #116]\n\t"
  33843. "adc r4, r4, #0\n\t"
  33844. /* a[i+30] += m[30] * mu */
  33845. "ldr r7, [%[m], #120]\n\t"
  33846. "ldr r10, [%[a], #120]\n\t"
  33847. "mov r5, #0\n\t"
  33848. "umlal r10, r5, r8, r7\n\t"
  33849. "adds r10, r10, r4\n\t"
  33850. "str r10, [%[a], #120]\n\t"
  33851. "adc r5, r5, #0\n\t"
  33852. /* a[i+31] += m[31] * mu */
  33853. "ldr r7, [%[m], #124]\n\t"
  33854. "ldr r10, [%[a], #124]\n\t"
  33855. "mov r4, #0\n\t"
  33856. "umlal r10, r4, r8, r7\n\t"
  33857. "adds r10, r10, r5\n\t"
  33858. "str r10, [%[a], #124]\n\t"
  33859. "adc r4, r4, #0\n\t"
  33860. /* a[i+32] += m[32] * mu */
  33861. "ldr r7, [%[m], #128]\n\t"
  33862. "ldr r10, [%[a], #128]\n\t"
  33863. "mov r5, #0\n\t"
  33864. "umlal r10, r5, r8, r7\n\t"
  33865. "adds r10, r10, r4\n\t"
  33866. "str r10, [%[a], #128]\n\t"
  33867. "adc r5, r5, #0\n\t"
  33868. /* a[i+33] += m[33] * mu */
  33869. "ldr r7, [%[m], #132]\n\t"
  33870. "ldr r10, [%[a], #132]\n\t"
  33871. "mov r4, #0\n\t"
  33872. "umlal r10, r4, r8, r7\n\t"
  33873. "adds r10, r10, r5\n\t"
  33874. "str r10, [%[a], #132]\n\t"
  33875. "adc r4, r4, #0\n\t"
  33876. /* a[i+34] += m[34] * mu */
  33877. "ldr r7, [%[m], #136]\n\t"
  33878. "ldr r10, [%[a], #136]\n\t"
  33879. "mov r5, #0\n\t"
  33880. "umlal r10, r5, r8, r7\n\t"
  33881. "adds r10, r10, r4\n\t"
  33882. "str r10, [%[a], #136]\n\t"
  33883. "adc r5, r5, #0\n\t"
  33884. /* a[i+35] += m[35] * mu */
  33885. "ldr r7, [%[m], #140]\n\t"
  33886. "ldr r10, [%[a], #140]\n\t"
  33887. "mov r4, #0\n\t"
  33888. "umlal r10, r4, r8, r7\n\t"
  33889. "adds r10, r10, r5\n\t"
  33890. "str r10, [%[a], #140]\n\t"
  33891. "adc r4, r4, #0\n\t"
  33892. /* a[i+36] += m[36] * mu */
  33893. "ldr r7, [%[m], #144]\n\t"
  33894. "ldr r10, [%[a], #144]\n\t"
  33895. "mov r5, #0\n\t"
  33896. "umlal r10, r5, r8, r7\n\t"
  33897. "adds r10, r10, r4\n\t"
  33898. "str r10, [%[a], #144]\n\t"
  33899. "adc r5, r5, #0\n\t"
  33900. /* a[i+37] += m[37] * mu */
  33901. "ldr r7, [%[m], #148]\n\t"
  33902. "ldr r10, [%[a], #148]\n\t"
  33903. "mov r4, #0\n\t"
  33904. "umlal r10, r4, r8, r7\n\t"
  33905. "adds r10, r10, r5\n\t"
  33906. "str r10, [%[a], #148]\n\t"
  33907. "adc r4, r4, #0\n\t"
  33908. /* a[i+38] += m[38] * mu */
  33909. "ldr r7, [%[m], #152]\n\t"
  33910. "ldr r10, [%[a], #152]\n\t"
  33911. "mov r5, #0\n\t"
  33912. "umlal r10, r5, r8, r7\n\t"
  33913. "adds r10, r10, r4\n\t"
  33914. "str r10, [%[a], #152]\n\t"
  33915. "adc r5, r5, #0\n\t"
  33916. /* a[i+39] += m[39] * mu */
  33917. "ldr r7, [%[m], #156]\n\t"
  33918. "ldr r10, [%[a], #156]\n\t"
  33919. "mov r4, #0\n\t"
  33920. "umlal r10, r4, r8, r7\n\t"
  33921. "adds r10, r10, r5\n\t"
  33922. "str r10, [%[a], #156]\n\t"
  33923. "adc r4, r4, #0\n\t"
  33924. /* a[i+40] += m[40] * mu */
  33925. "ldr r7, [%[m], #160]\n\t"
  33926. "ldr r10, [%[a], #160]\n\t"
  33927. "mov r5, #0\n\t"
  33928. "umlal r10, r5, r8, r7\n\t"
  33929. "adds r10, r10, r4\n\t"
  33930. "str r10, [%[a], #160]\n\t"
  33931. "adc r5, r5, #0\n\t"
  33932. /* a[i+41] += m[41] * mu */
  33933. "ldr r7, [%[m], #164]\n\t"
  33934. "ldr r10, [%[a], #164]\n\t"
  33935. "mov r4, #0\n\t"
  33936. "umlal r10, r4, r8, r7\n\t"
  33937. "adds r10, r10, r5\n\t"
  33938. "str r10, [%[a], #164]\n\t"
  33939. "adc r4, r4, #0\n\t"
  33940. /* a[i+42] += m[42] * mu */
  33941. "ldr r7, [%[m], #168]\n\t"
  33942. "ldr r10, [%[a], #168]\n\t"
  33943. "mov r5, #0\n\t"
  33944. "umlal r10, r5, r8, r7\n\t"
  33945. "adds r10, r10, r4\n\t"
  33946. "str r10, [%[a], #168]\n\t"
  33947. "adc r5, r5, #0\n\t"
  33948. /* a[i+43] += m[43] * mu */
  33949. "ldr r7, [%[m], #172]\n\t"
  33950. "ldr r10, [%[a], #172]\n\t"
  33951. "mov r4, #0\n\t"
  33952. "umlal r10, r4, r8, r7\n\t"
  33953. "adds r10, r10, r5\n\t"
  33954. "str r10, [%[a], #172]\n\t"
  33955. "adc r4, r4, #0\n\t"
  33956. /* a[i+44] += m[44] * mu */
  33957. "ldr r7, [%[m], #176]\n\t"
  33958. "ldr r10, [%[a], #176]\n\t"
  33959. "mov r5, #0\n\t"
  33960. "umlal r10, r5, r8, r7\n\t"
  33961. "adds r10, r10, r4\n\t"
  33962. "str r10, [%[a], #176]\n\t"
  33963. "adc r5, r5, #0\n\t"
  33964. /* a[i+45] += m[45] * mu */
  33965. "ldr r7, [%[m], #180]\n\t"
  33966. "ldr r10, [%[a], #180]\n\t"
  33967. "mov r4, #0\n\t"
  33968. "umlal r10, r4, r8, r7\n\t"
  33969. "adds r10, r10, r5\n\t"
  33970. "str r10, [%[a], #180]\n\t"
  33971. "adc r4, r4, #0\n\t"
  33972. /* a[i+46] += m[46] * mu */
  33973. "ldr r7, [%[m], #184]\n\t"
  33974. "ldr r10, [%[a], #184]\n\t"
  33975. "mov r5, #0\n\t"
  33976. "umlal r10, r5, r8, r7\n\t"
  33977. "adds r10, r10, r4\n\t"
  33978. "str r10, [%[a], #184]\n\t"
  33979. "adc r5, r5, #0\n\t"
  33980. /* a[i+47] += m[47] * mu */
  33981. "ldr r7, [%[m], #188]\n\t"
  33982. "ldr r10, [%[a], #188]\n\t"
  33983. "umull r6, r7, r8, r7\n\t"
  33984. "adds r5, r5, r6\n\t"
  33985. "adcs r4, r7, r3\n\t"
  33986. "mov r3, #0\n\t"
  33987. "adc r3, r3, r3\n\t"
  33988. "adds r10, r10, r5\n\t"
  33989. "str r10, [%[a], #188]\n\t"
  33990. "ldr r10, [%[a], #192]\n\t"
  33991. "adcs r10, r10, r4\n\t"
  33992. "str r10, [%[a], #192]\n\t"
  33993. "adc r3, r3, #0\n\t"
  33994. /* i += 1 */
  33995. "add r9, r9, #4\n\t"
  33996. "add %[a], %[a], #4\n\t"
  33997. "cmp r9, #0xc0\n\t"
  33998. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  33999. /* Loop Done */
  34000. "str r12, [%[a]]\n\t"
  34001. "str lr, [%[a], #4]\n\t"
  34002. "mov %[mp], r3\n\t"
  34003. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  34004. :
  34005. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  34006. );
  34007. sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp);
  34008. }
  34009. #else
  34010. /* Reduce the number back to 3072 bits using Montgomery reduction.
  34011. *
  34012. * a A single precision number to reduce in place.
  34013. * m The single precision number representing the modulus.
  34014. * mp The digit representing the negative inverse of m mod 2^n.
  34015. */
  34016. static SP_NOINLINE void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  34017. {
  34018. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  34019. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  34020. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  34021. __asm__ __volatile__ (
  34022. /* i = 0 */
  34023. "mov r12, #0\n\t"
  34024. "mov lr, #0\n\t"
  34025. "ldr r4, [%[a]]\n\t"
  34026. "ldr r5, [%[a], #4]\n\t"
  34027. "ldr r6, [%[a], #8]\n\t"
  34028. "ldr r7, [%[a], #12]\n\t"
  34029. "ldr r8, [%[a], #16]\n\t"
  34030. "\n"
  34031. "L_sp_3072_mont_reduce_48_word_%=: \n\t"
  34032. /* mu = a[i] * mp */
  34033. "mul r11, %[mp], r4\n\t"
  34034. /* a[i+0] += m[0] * mu */
  34035. "ldr r10, [%[m]]\n\t"
  34036. "mov r3, #0\n\t"
  34037. "umaal r4, r3, r11, r10\n\t"
  34038. /* a[i+1] += m[1] * mu */
  34039. "ldr r10, [%[m], #4]\n\t"
  34040. "mov r4, r5\n\t"
  34041. "umaal r4, r3, r11, r10\n\t"
  34042. /* a[i+2] += m[2] * mu */
  34043. "ldr r10, [%[m], #8]\n\t"
  34044. "mov r5, r6\n\t"
  34045. "umaal r5, r3, r11, r10\n\t"
  34046. /* a[i+3] += m[3] * mu */
  34047. "ldr r10, [%[m], #12]\n\t"
  34048. "mov r6, r7\n\t"
  34049. "umaal r6, r3, r11, r10\n\t"
  34050. /* a[i+4] += m[4] * mu */
  34051. "ldr r10, [%[m], #16]\n\t"
  34052. "mov r7, r8\n\t"
  34053. "umaal r7, r3, r11, r10\n\t"
  34054. /* a[i+5] += m[5] * mu */
  34055. "ldr r10, [%[m], #20]\n\t"
  34056. "ldr r8, [%[a], #20]\n\t"
  34057. "umaal r8, r3, r11, r10\n\t"
  34058. /* a[i+6] += m[6] * mu */
  34059. "ldr r10, [%[m], #24]\n\t"
  34060. "ldr r9, [%[a], #24]\n\t"
  34061. "umaal r9, r3, r11, r10\n\t"
  34062. "str r9, [%[a], #24]\n\t"
  34063. /* a[i+7] += m[7] * mu */
  34064. "ldr r10, [%[m], #28]\n\t"
  34065. "ldr r9, [%[a], #28]\n\t"
  34066. "umaal r9, r3, r11, r10\n\t"
  34067. "str r9, [%[a], #28]\n\t"
  34068. /* a[i+8] += m[8] * mu */
  34069. "ldr r10, [%[m], #32]\n\t"
  34070. "ldr r9, [%[a], #32]\n\t"
  34071. "umaal r9, r3, r11, r10\n\t"
  34072. "str r9, [%[a], #32]\n\t"
  34073. /* a[i+9] += m[9] * mu */
  34074. "ldr r10, [%[m], #36]\n\t"
  34075. "ldr r9, [%[a], #36]\n\t"
  34076. "umaal r9, r3, r11, r10\n\t"
  34077. "str r9, [%[a], #36]\n\t"
  34078. /* a[i+10] += m[10] * mu */
  34079. "ldr r10, [%[m], #40]\n\t"
  34080. "ldr r9, [%[a], #40]\n\t"
  34081. "umaal r9, r3, r11, r10\n\t"
  34082. "str r9, [%[a], #40]\n\t"
  34083. /* a[i+11] += m[11] * mu */
  34084. "ldr r10, [%[m], #44]\n\t"
  34085. "ldr r9, [%[a], #44]\n\t"
  34086. "umaal r9, r3, r11, r10\n\t"
  34087. "str r9, [%[a], #44]\n\t"
  34088. /* a[i+12] += m[12] * mu */
  34089. "ldr r10, [%[m], #48]\n\t"
  34090. "ldr r9, [%[a], #48]\n\t"
  34091. "umaal r9, r3, r11, r10\n\t"
  34092. "str r9, [%[a], #48]\n\t"
  34093. /* a[i+13] += m[13] * mu */
  34094. "ldr r10, [%[m], #52]\n\t"
  34095. "ldr r9, [%[a], #52]\n\t"
  34096. "umaal r9, r3, r11, r10\n\t"
  34097. "str r9, [%[a], #52]\n\t"
  34098. /* a[i+14] += m[14] * mu */
  34099. "ldr r10, [%[m], #56]\n\t"
  34100. "ldr r9, [%[a], #56]\n\t"
  34101. "umaal r9, r3, r11, r10\n\t"
  34102. "str r9, [%[a], #56]\n\t"
  34103. /* a[i+15] += m[15] * mu */
  34104. "ldr r10, [%[m], #60]\n\t"
  34105. "ldr r9, [%[a], #60]\n\t"
  34106. "umaal r9, r3, r11, r10\n\t"
  34107. "str r9, [%[a], #60]\n\t"
  34108. /* a[i+16] += m[16] * mu */
  34109. "ldr r10, [%[m], #64]\n\t"
  34110. "ldr r9, [%[a], #64]\n\t"
  34111. "umaal r9, r3, r11, r10\n\t"
  34112. "str r9, [%[a], #64]\n\t"
  34113. /* a[i+17] += m[17] * mu */
  34114. "ldr r10, [%[m], #68]\n\t"
  34115. "ldr r9, [%[a], #68]\n\t"
  34116. "umaal r9, r3, r11, r10\n\t"
  34117. "str r9, [%[a], #68]\n\t"
  34118. /* a[i+18] += m[18] * mu */
  34119. "ldr r10, [%[m], #72]\n\t"
  34120. "ldr r9, [%[a], #72]\n\t"
  34121. "umaal r9, r3, r11, r10\n\t"
  34122. "str r9, [%[a], #72]\n\t"
  34123. /* a[i+19] += m[19] * mu */
  34124. "ldr r10, [%[m], #76]\n\t"
  34125. "ldr r9, [%[a], #76]\n\t"
  34126. "umaal r9, r3, r11, r10\n\t"
  34127. "str r9, [%[a], #76]\n\t"
  34128. /* a[i+20] += m[20] * mu */
  34129. "ldr r10, [%[m], #80]\n\t"
  34130. "ldr r9, [%[a], #80]\n\t"
  34131. "umaal r9, r3, r11, r10\n\t"
  34132. "str r9, [%[a], #80]\n\t"
  34133. /* a[i+21] += m[21] * mu */
  34134. "ldr r10, [%[m], #84]\n\t"
  34135. "ldr r9, [%[a], #84]\n\t"
  34136. "umaal r9, r3, r11, r10\n\t"
  34137. "str r9, [%[a], #84]\n\t"
  34138. /* a[i+22] += m[22] * mu */
  34139. "ldr r10, [%[m], #88]\n\t"
  34140. "ldr r9, [%[a], #88]\n\t"
  34141. "umaal r9, r3, r11, r10\n\t"
  34142. "str r9, [%[a], #88]\n\t"
  34143. /* a[i+23] += m[23] * mu */
  34144. "ldr r10, [%[m], #92]\n\t"
  34145. "ldr r9, [%[a], #92]\n\t"
  34146. "umaal r9, r3, r11, r10\n\t"
  34147. "str r9, [%[a], #92]\n\t"
  34148. /* a[i+24] += m[24] * mu */
  34149. "ldr r10, [%[m], #96]\n\t"
  34150. "ldr r9, [%[a], #96]\n\t"
  34151. "umaal r9, r3, r11, r10\n\t"
  34152. "str r9, [%[a], #96]\n\t"
  34153. /* a[i+25] += m[25] * mu */
  34154. "ldr r10, [%[m], #100]\n\t"
  34155. "ldr r9, [%[a], #100]\n\t"
  34156. "umaal r9, r3, r11, r10\n\t"
  34157. "str r9, [%[a], #100]\n\t"
  34158. /* a[i+26] += m[26] * mu */
  34159. "ldr r10, [%[m], #104]\n\t"
  34160. "ldr r9, [%[a], #104]\n\t"
  34161. "umaal r9, r3, r11, r10\n\t"
  34162. "str r9, [%[a], #104]\n\t"
  34163. /* a[i+27] += m[27] * mu */
  34164. "ldr r10, [%[m], #108]\n\t"
  34165. "ldr r9, [%[a], #108]\n\t"
  34166. "umaal r9, r3, r11, r10\n\t"
  34167. "str r9, [%[a], #108]\n\t"
  34168. /* a[i+28] += m[28] * mu */
  34169. "ldr r10, [%[m], #112]\n\t"
  34170. "ldr r9, [%[a], #112]\n\t"
  34171. "umaal r9, r3, r11, r10\n\t"
  34172. "str r9, [%[a], #112]\n\t"
  34173. /* a[i+29] += m[29] * mu */
  34174. "ldr r10, [%[m], #116]\n\t"
  34175. "ldr r9, [%[a], #116]\n\t"
  34176. "umaal r9, r3, r11, r10\n\t"
  34177. "str r9, [%[a], #116]\n\t"
  34178. /* a[i+30] += m[30] * mu */
  34179. "ldr r10, [%[m], #120]\n\t"
  34180. "ldr r9, [%[a], #120]\n\t"
  34181. "umaal r9, r3, r11, r10\n\t"
  34182. "str r9, [%[a], #120]\n\t"
  34183. /* a[i+31] += m[31] * mu */
  34184. "ldr r10, [%[m], #124]\n\t"
  34185. "ldr r9, [%[a], #124]\n\t"
  34186. "umaal r9, r3, r11, r10\n\t"
  34187. "str r9, [%[a], #124]\n\t"
  34188. /* a[i+32] += m[32] * mu */
  34189. "ldr r10, [%[m], #128]\n\t"
  34190. "ldr r9, [%[a], #128]\n\t"
  34191. "umaal r9, r3, r11, r10\n\t"
  34192. "str r9, [%[a], #128]\n\t"
  34193. /* a[i+33] += m[33] * mu */
  34194. "ldr r10, [%[m], #132]\n\t"
  34195. "ldr r9, [%[a], #132]\n\t"
  34196. "umaal r9, r3, r11, r10\n\t"
  34197. "str r9, [%[a], #132]\n\t"
  34198. /* a[i+34] += m[34] * mu */
  34199. "ldr r10, [%[m], #136]\n\t"
  34200. "ldr r9, [%[a], #136]\n\t"
  34201. "umaal r9, r3, r11, r10\n\t"
  34202. "str r9, [%[a], #136]\n\t"
  34203. /* a[i+35] += m[35] * mu */
  34204. "ldr r10, [%[m], #140]\n\t"
  34205. "ldr r9, [%[a], #140]\n\t"
  34206. "umaal r9, r3, r11, r10\n\t"
  34207. "str r9, [%[a], #140]\n\t"
  34208. /* a[i+36] += m[36] * mu */
  34209. "ldr r10, [%[m], #144]\n\t"
  34210. "ldr r9, [%[a], #144]\n\t"
  34211. "umaal r9, r3, r11, r10\n\t"
  34212. "str r9, [%[a], #144]\n\t"
  34213. /* a[i+37] += m[37] * mu */
  34214. "ldr r10, [%[m], #148]\n\t"
  34215. "ldr r9, [%[a], #148]\n\t"
  34216. "umaal r9, r3, r11, r10\n\t"
  34217. "str r9, [%[a], #148]\n\t"
  34218. /* a[i+38] += m[38] * mu */
  34219. "ldr r10, [%[m], #152]\n\t"
  34220. "ldr r9, [%[a], #152]\n\t"
  34221. "umaal r9, r3, r11, r10\n\t"
  34222. "str r9, [%[a], #152]\n\t"
  34223. /* a[i+39] += m[39] * mu */
  34224. "ldr r10, [%[m], #156]\n\t"
  34225. "ldr r9, [%[a], #156]\n\t"
  34226. "umaal r9, r3, r11, r10\n\t"
  34227. "str r9, [%[a], #156]\n\t"
  34228. /* a[i+40] += m[40] * mu */
  34229. "ldr r10, [%[m], #160]\n\t"
  34230. "ldr r9, [%[a], #160]\n\t"
  34231. "umaal r9, r3, r11, r10\n\t"
  34232. "str r9, [%[a], #160]\n\t"
  34233. /* a[i+41] += m[41] * mu */
  34234. "ldr r10, [%[m], #164]\n\t"
  34235. "ldr r9, [%[a], #164]\n\t"
  34236. "umaal r9, r3, r11, r10\n\t"
  34237. "str r9, [%[a], #164]\n\t"
  34238. /* a[i+42] += m[42] * mu */
  34239. "ldr r10, [%[m], #168]\n\t"
  34240. "ldr r9, [%[a], #168]\n\t"
  34241. "umaal r9, r3, r11, r10\n\t"
  34242. "str r9, [%[a], #168]\n\t"
  34243. /* a[i+43] += m[43] * mu */
  34244. "ldr r10, [%[m], #172]\n\t"
  34245. "ldr r9, [%[a], #172]\n\t"
  34246. "umaal r9, r3, r11, r10\n\t"
  34247. "str r9, [%[a], #172]\n\t"
  34248. /* a[i+44] += m[44] * mu */
  34249. "ldr r10, [%[m], #176]\n\t"
  34250. "ldr r9, [%[a], #176]\n\t"
  34251. "umaal r9, r3, r11, r10\n\t"
  34252. "str r9, [%[a], #176]\n\t"
  34253. /* a[i+45] += m[45] * mu */
  34254. "ldr r10, [%[m], #180]\n\t"
  34255. "ldr r9, [%[a], #180]\n\t"
  34256. "umaal r9, r3, r11, r10\n\t"
  34257. "str r9, [%[a], #180]\n\t"
  34258. /* a[i+46] += m[46] * mu */
  34259. "ldr r10, [%[m], #184]\n\t"
  34260. "ldr r9, [%[a], #184]\n\t"
  34261. "umaal r9, r3, r11, r10\n\t"
  34262. "str r9, [%[a], #184]\n\t"
  34263. /* a[i+47] += m[47] * mu */
  34264. "ldr r10, [%[m], #188]\n\t"
  34265. "ldr r9, [%[a], #188]\n\t"
  34266. "umaal r9, r3, r11, r10\n\t"
  34267. "ldr r11, [%[a], #192]\n\t"
  34268. "mov r10, #0\n\t"
  34269. "umaal r3, r11, r10, r10\n\t"
  34270. "str r9, [%[a], #188]\n\t"
  34271. "adds r3, r3, lr\n\t"
  34272. "adc lr, r11, #0\n\t"
  34273. "str r3, [%[a], #192]\n\t"
  34274. /* i += 1 */
  34275. "add r12, r12, #4\n\t"
  34276. "add %[a], %[a], #4\n\t"
  34277. "cmp r12, #0xc0\n\t"
  34278. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  34279. /* Loop Done */
  34280. "str r4, [%[a]]\n\t"
  34281. "str r5, [%[a], #4]\n\t"
  34282. "str r6, [%[a], #8]\n\t"
  34283. "str r7, [%[a], #12]\n\t"
  34284. "str r8, [%[a], #16]\n\t"
  34285. "mov %[mp], lr\n\t"
  34286. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  34287. :
  34288. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  34289. );
  34290. sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp);
  34291. }
  34292. #endif
  34293. /* Multiply two Montgomery form numbers mod the modulus (prime).
  34294. * (r = a * b mod m)
  34295. *
  34296. * r Result of multiplication.
  34297. * a First number to multiply in Montgomery form.
  34298. * b Second number to multiply in Montgomery form.
  34299. * m Modulus (prime).
  34300. * mp Montgomery multiplier.
  34301. */
  34302. SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a,
  34303. const sp_digit* b, const sp_digit* m, sp_digit mp)
  34304. {
  34305. sp_3072_mul_48(r, a, b);
  34306. sp_3072_mont_reduce_48(r, m, mp);
  34307. }
  34308. /* Square the Montgomery form number. (r = a * a mod m)
  34309. *
  34310. * r Result of squaring.
  34311. * a Number to square in Montgomery form.
  34312. * m Modulus (prime).
  34313. * mp Montgomery multiplier.
  34314. */
  34315. SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a,
  34316. const sp_digit* m, sp_digit mp)
  34317. {
  34318. sp_3072_sqr_48(r, a);
  34319. sp_3072_mont_reduce_48(r, m, mp);
  34320. }
  34321. #ifdef WOLFSSL_SP_SMALL
  34322. /* Mul a by digit b into r. (r = a * b)
  34323. *
  34324. * r A single precision integer.
  34325. * a A single precision integer.
  34326. * b A single precision digit.
  34327. */
  34328. static void sp_3072_mul_d_48(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  34329. {
  34330. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  34331. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  34332. register sp_digit b asm ("r2") = (sp_digit)b_p;
  34333. __asm__ __volatile__ (
  34334. /* A[0] * B */
  34335. "ldr r8, [%[a]]\n\t"
  34336. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34337. "lsl r6, %[b], #16\n\t"
  34338. "lsl r5, r8, #16\n\t"
  34339. "lsr r6, r6, #16\n\t"
  34340. "lsr r5, r5, #16\n\t"
  34341. "mul r5, r6, r5\n\t"
  34342. "lsr r7, r8, #16\n\t"
  34343. "mul r6, r7, r6\n\t"
  34344. "lsr r3, r6, #16\n\t"
  34345. "lsl r6, r6, #16\n\t"
  34346. "adds r5, r5, r6\n\t"
  34347. "adc r3, r3, #0\n\t"
  34348. "lsr r6, %[b], #16\n\t"
  34349. "mul r7, r6, r7\n\t"
  34350. "add r3, r3, r7\n\t"
  34351. "lsl r7, r8, #16\n\t"
  34352. "lsr r7, r7, #16\n\t"
  34353. "mul r6, r7, r6\n\t"
  34354. "lsr r7, r6, #16\n\t"
  34355. "lsl r6, r6, #16\n\t"
  34356. "adds r5, r5, r6\n\t"
  34357. "adc r3, r3, r7\n\t"
  34358. #else
  34359. "umull r5, r3, %[b], r8\n\t"
  34360. #endif
  34361. "mov r4, #0\n\t"
  34362. "str r5, [%[r]]\n\t"
  34363. "mov r5, #0\n\t"
  34364. "mov r9, #4\n\t"
  34365. "\n"
  34366. "L_sp_3072_mul_d_48_word_%=: \n\t"
  34367. /* A[i] * B */
  34368. "ldr r8, [%[a], r9]\n\t"
  34369. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34370. "lsl r6, %[b], #16\n\t"
  34371. "lsl r7, r8, #16\n\t"
  34372. "lsr r6, r6, #16\n\t"
  34373. "lsr r7, r7, #16\n\t"
  34374. "mul r7, r6, r7\n\t"
  34375. "adds r3, r3, r7\n\t"
  34376. "adcs r4, r4, #0\n\t"
  34377. "adc r5, r5, #0\n\t"
  34378. "lsr r7, r8, #16\n\t"
  34379. "mul r6, r7, r6\n\t"
  34380. "lsr r7, r6, #16\n\t"
  34381. "lsl r6, r6, #16\n\t"
  34382. "adds r3, r3, r6\n\t"
  34383. "adcs r4, r4, r7\n\t"
  34384. "adc r5, r5, #0\n\t"
  34385. "lsr r6, %[b], #16\n\t"
  34386. "lsr r7, r8, #16\n\t"
  34387. "mul r7, r6, r7\n\t"
  34388. "adds r4, r4, r7\n\t"
  34389. "adc r5, r5, #0\n\t"
  34390. "lsl r7, r8, #16\n\t"
  34391. "lsr r7, r7, #16\n\t"
  34392. "mul r6, r7, r6\n\t"
  34393. "lsr r7, r6, #16\n\t"
  34394. "lsl r6, r6, #16\n\t"
  34395. "adds r3, r3, r6\n\t"
  34396. "adcs r4, r4, r7\n\t"
  34397. "adc r5, r5, #0\n\t"
  34398. #else
  34399. "umull r6, r7, %[b], r8\n\t"
  34400. "adds r3, r3, r6\n\t"
  34401. "adcs r4, r4, r7\n\t"
  34402. "adc r5, r5, #0\n\t"
  34403. #endif
  34404. "str r3, [%[r], r9]\n\t"
  34405. "mov r3, r4\n\t"
  34406. "mov r4, r5\n\t"
  34407. "mov r5, #0\n\t"
  34408. "add r9, r9, #4\n\t"
  34409. "cmp r9, #0xc0\n\t"
  34410. "blt L_sp_3072_mul_d_48_word_%=\n\t"
  34411. "str r3, [%[r], #192]\n\t"
  34412. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  34413. :
  34414. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  34415. );
  34416. }
  34417. #else
  34418. /* Mul a by digit b into r. (r = a * b)
  34419. *
  34420. * r A single precision integer.
  34421. * a A single precision integer.
  34422. * b A single precision digit.
  34423. */
  34424. static void sp_3072_mul_d_48(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  34425. {
  34426. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  34427. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  34428. register sp_digit b asm ("r2") = (sp_digit)b_p;
  34429. __asm__ __volatile__ (
  34430. /* A[0] * B */
  34431. "ldm %[a]!, {r8}\n\t"
  34432. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34433. "lsl r6, %[b], #16\n\t"
  34434. "lsl r3, r8, #16\n\t"
  34435. "lsr r6, r6, #16\n\t"
  34436. "lsr r3, r3, #16\n\t"
  34437. "mul r3, r6, r3\n\t"
  34438. "lsr r7, r8, #16\n\t"
  34439. "mul r6, r7, r6\n\t"
  34440. "lsr r4, r6, #16\n\t"
  34441. "lsl r6, r6, #16\n\t"
  34442. "adds r3, r3, r6\n\t"
  34443. "adc r4, r4, #0\n\t"
  34444. "lsr r6, %[b], #16\n\t"
  34445. "mul r7, r6, r7\n\t"
  34446. "add r4, r4, r7\n\t"
  34447. "lsl r7, r8, #16\n\t"
  34448. "lsr r7, r7, #16\n\t"
  34449. "mul r6, r7, r6\n\t"
  34450. "lsr r7, r6, #16\n\t"
  34451. "lsl r6, r6, #16\n\t"
  34452. "adds r3, r3, r6\n\t"
  34453. "adc r4, r4, r7\n\t"
  34454. #else
  34455. "umull r3, r4, %[b], r8\n\t"
  34456. #endif
  34457. "stm %[r]!, {r3}\n\t"
  34458. "mov r5, #0\n\t"
  34459. /* A[1] * B */
  34460. "ldm %[a]!, {r8}\n\t"
  34461. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34462. "lsl r6, %[b], #16\n\t"
  34463. "lsl r7, r8, #16\n\t"
  34464. "lsr r6, r6, #16\n\t"
  34465. "lsr r7, r7, #16\n\t"
  34466. "mul r7, r6, r7\n\t"
  34467. "adds r4, r4, r7\n\t"
  34468. "adc r5, r5, #0\n\t"
  34469. "lsr r7, r8, #16\n\t"
  34470. "mul r6, r7, r6\n\t"
  34471. "lsr r7, r6, #16\n\t"
  34472. "lsl r6, r6, #16\n\t"
  34473. "adds r4, r4, r6\n\t"
  34474. "adc r5, r5, r7\n\t"
  34475. "lsr r6, %[b], #16\n\t"
  34476. "lsr r7, r8, #16\n\t"
  34477. "mul r7, r6, r7\n\t"
  34478. "add r5, r5, r7\n\t"
  34479. "lsl r7, r8, #16\n\t"
  34480. "lsr r7, r7, #16\n\t"
  34481. "mul r6, r7, r6\n\t"
  34482. "lsr r7, r6, #16\n\t"
  34483. "lsl r6, r6, #16\n\t"
  34484. "adds r4, r4, r6\n\t"
  34485. "adc r5, r5, r7\n\t"
  34486. #else
  34487. "umlal r4, r5, %[b], r8\n\t"
  34488. #endif
  34489. "stm %[r]!, {r4}\n\t"
  34490. "mov r3, #0\n\t"
  34491. /* A[2] * B */
  34492. "ldm %[a]!, {r8}\n\t"
  34493. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34494. "lsl r6, %[b], #16\n\t"
  34495. "lsl r7, r8, #16\n\t"
  34496. "lsr r6, r6, #16\n\t"
  34497. "lsr r7, r7, #16\n\t"
  34498. "mul r7, r6, r7\n\t"
  34499. "adds r5, r5, r7\n\t"
  34500. "adc r3, r3, #0\n\t"
  34501. "lsr r7, r8, #16\n\t"
  34502. "mul r6, r7, r6\n\t"
  34503. "lsr r7, r6, #16\n\t"
  34504. "lsl r6, r6, #16\n\t"
  34505. "adds r5, r5, r6\n\t"
  34506. "adc r3, r3, r7\n\t"
  34507. "lsr r6, %[b], #16\n\t"
  34508. "lsr r7, r8, #16\n\t"
  34509. "mul r7, r6, r7\n\t"
  34510. "add r3, r3, r7\n\t"
  34511. "lsl r7, r8, #16\n\t"
  34512. "lsr r7, r7, #16\n\t"
  34513. "mul r6, r7, r6\n\t"
  34514. "lsr r7, r6, #16\n\t"
  34515. "lsl r6, r6, #16\n\t"
  34516. "adds r5, r5, r6\n\t"
  34517. "adc r3, r3, r7\n\t"
  34518. #else
  34519. "umlal r5, r3, %[b], r8\n\t"
  34520. #endif
  34521. "stm %[r]!, {r5}\n\t"
  34522. "mov r4, #0\n\t"
  34523. /* A[3] * B */
  34524. "ldm %[a]!, {r8}\n\t"
  34525. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34526. "lsl r6, %[b], #16\n\t"
  34527. "lsl r7, r8, #16\n\t"
  34528. "lsr r6, r6, #16\n\t"
  34529. "lsr r7, r7, #16\n\t"
  34530. "mul r7, r6, r7\n\t"
  34531. "adds r3, r3, r7\n\t"
  34532. "adc r4, r4, #0\n\t"
  34533. "lsr r7, r8, #16\n\t"
  34534. "mul r6, r7, r6\n\t"
  34535. "lsr r7, r6, #16\n\t"
  34536. "lsl r6, r6, #16\n\t"
  34537. "adds r3, r3, r6\n\t"
  34538. "adc r4, r4, r7\n\t"
  34539. "lsr r6, %[b], #16\n\t"
  34540. "lsr r7, r8, #16\n\t"
  34541. "mul r7, r6, r7\n\t"
  34542. "add r4, r4, r7\n\t"
  34543. "lsl r7, r8, #16\n\t"
  34544. "lsr r7, r7, #16\n\t"
  34545. "mul r6, r7, r6\n\t"
  34546. "lsr r7, r6, #16\n\t"
  34547. "lsl r6, r6, #16\n\t"
  34548. "adds r3, r3, r6\n\t"
  34549. "adc r4, r4, r7\n\t"
  34550. #else
  34551. "umlal r3, r4, %[b], r8\n\t"
  34552. #endif
  34553. "stm %[r]!, {r3}\n\t"
  34554. "mov r5, #0\n\t"
  34555. /* A[4] * B */
  34556. "ldm %[a]!, {r8}\n\t"
  34557. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34558. "lsl r6, %[b], #16\n\t"
  34559. "lsl r7, r8, #16\n\t"
  34560. "lsr r6, r6, #16\n\t"
  34561. "lsr r7, r7, #16\n\t"
  34562. "mul r7, r6, r7\n\t"
  34563. "adds r4, r4, r7\n\t"
  34564. "adc r5, r5, #0\n\t"
  34565. "lsr r7, r8, #16\n\t"
  34566. "mul r6, r7, r6\n\t"
  34567. "lsr r7, r6, #16\n\t"
  34568. "lsl r6, r6, #16\n\t"
  34569. "adds r4, r4, r6\n\t"
  34570. "adc r5, r5, r7\n\t"
  34571. "lsr r6, %[b], #16\n\t"
  34572. "lsr r7, r8, #16\n\t"
  34573. "mul r7, r6, r7\n\t"
  34574. "add r5, r5, r7\n\t"
  34575. "lsl r7, r8, #16\n\t"
  34576. "lsr r7, r7, #16\n\t"
  34577. "mul r6, r7, r6\n\t"
  34578. "lsr r7, r6, #16\n\t"
  34579. "lsl r6, r6, #16\n\t"
  34580. "adds r4, r4, r6\n\t"
  34581. "adc r5, r5, r7\n\t"
  34582. #else
  34583. "umlal r4, r5, %[b], r8\n\t"
  34584. #endif
  34585. "stm %[r]!, {r4}\n\t"
  34586. "mov r3, #0\n\t"
  34587. /* A[5] * B */
  34588. "ldm %[a]!, {r8}\n\t"
  34589. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34590. "lsl r6, %[b], #16\n\t"
  34591. "lsl r7, r8, #16\n\t"
  34592. "lsr r6, r6, #16\n\t"
  34593. "lsr r7, r7, #16\n\t"
  34594. "mul r7, r6, r7\n\t"
  34595. "adds r5, r5, r7\n\t"
  34596. "adc r3, r3, #0\n\t"
  34597. "lsr r7, r8, #16\n\t"
  34598. "mul r6, r7, r6\n\t"
  34599. "lsr r7, r6, #16\n\t"
  34600. "lsl r6, r6, #16\n\t"
  34601. "adds r5, r5, r6\n\t"
  34602. "adc r3, r3, r7\n\t"
  34603. "lsr r6, %[b], #16\n\t"
  34604. "lsr r7, r8, #16\n\t"
  34605. "mul r7, r6, r7\n\t"
  34606. "add r3, r3, r7\n\t"
  34607. "lsl r7, r8, #16\n\t"
  34608. "lsr r7, r7, #16\n\t"
  34609. "mul r6, r7, r6\n\t"
  34610. "lsr r7, r6, #16\n\t"
  34611. "lsl r6, r6, #16\n\t"
  34612. "adds r5, r5, r6\n\t"
  34613. "adc r3, r3, r7\n\t"
  34614. #else
  34615. "umlal r5, r3, %[b], r8\n\t"
  34616. #endif
  34617. "stm %[r]!, {r5}\n\t"
  34618. "mov r4, #0\n\t"
  34619. /* A[6] * B */
  34620. "ldm %[a]!, {r8}\n\t"
  34621. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34622. "lsl r6, %[b], #16\n\t"
  34623. "lsl r7, r8, #16\n\t"
  34624. "lsr r6, r6, #16\n\t"
  34625. "lsr r7, r7, #16\n\t"
  34626. "mul r7, r6, r7\n\t"
  34627. "adds r3, r3, r7\n\t"
  34628. "adc r4, r4, #0\n\t"
  34629. "lsr r7, r8, #16\n\t"
  34630. "mul r6, r7, r6\n\t"
  34631. "lsr r7, r6, #16\n\t"
  34632. "lsl r6, r6, #16\n\t"
  34633. "adds r3, r3, r6\n\t"
  34634. "adc r4, r4, r7\n\t"
  34635. "lsr r6, %[b], #16\n\t"
  34636. "lsr r7, r8, #16\n\t"
  34637. "mul r7, r6, r7\n\t"
  34638. "add r4, r4, r7\n\t"
  34639. "lsl r7, r8, #16\n\t"
  34640. "lsr r7, r7, #16\n\t"
  34641. "mul r6, r7, r6\n\t"
  34642. "lsr r7, r6, #16\n\t"
  34643. "lsl r6, r6, #16\n\t"
  34644. "adds r3, r3, r6\n\t"
  34645. "adc r4, r4, r7\n\t"
  34646. #else
  34647. "umlal r3, r4, %[b], r8\n\t"
  34648. #endif
  34649. "stm %[r]!, {r3}\n\t"
  34650. "mov r5, #0\n\t"
  34651. /* A[7] * B */
  34652. "ldm %[a]!, {r8}\n\t"
  34653. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34654. "lsl r6, %[b], #16\n\t"
  34655. "lsl r7, r8, #16\n\t"
  34656. "lsr r6, r6, #16\n\t"
  34657. "lsr r7, r7, #16\n\t"
  34658. "mul r7, r6, r7\n\t"
  34659. "adds r4, r4, r7\n\t"
  34660. "adc r5, r5, #0\n\t"
  34661. "lsr r7, r8, #16\n\t"
  34662. "mul r6, r7, r6\n\t"
  34663. "lsr r7, r6, #16\n\t"
  34664. "lsl r6, r6, #16\n\t"
  34665. "adds r4, r4, r6\n\t"
  34666. "adc r5, r5, r7\n\t"
  34667. "lsr r6, %[b], #16\n\t"
  34668. "lsr r7, r8, #16\n\t"
  34669. "mul r7, r6, r7\n\t"
  34670. "add r5, r5, r7\n\t"
  34671. "lsl r7, r8, #16\n\t"
  34672. "lsr r7, r7, #16\n\t"
  34673. "mul r6, r7, r6\n\t"
  34674. "lsr r7, r6, #16\n\t"
  34675. "lsl r6, r6, #16\n\t"
  34676. "adds r4, r4, r6\n\t"
  34677. "adc r5, r5, r7\n\t"
  34678. #else
  34679. "umlal r4, r5, %[b], r8\n\t"
  34680. #endif
  34681. "stm %[r]!, {r4}\n\t"
  34682. "mov r3, #0\n\t"
  34683. /* A[8] * B */
  34684. "ldm %[a]!, {r8}\n\t"
  34685. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34686. "lsl r6, %[b], #16\n\t"
  34687. "lsl r7, r8, #16\n\t"
  34688. "lsr r6, r6, #16\n\t"
  34689. "lsr r7, r7, #16\n\t"
  34690. "mul r7, r6, r7\n\t"
  34691. "adds r5, r5, r7\n\t"
  34692. "adc r3, r3, #0\n\t"
  34693. "lsr r7, r8, #16\n\t"
  34694. "mul r6, r7, r6\n\t"
  34695. "lsr r7, r6, #16\n\t"
  34696. "lsl r6, r6, #16\n\t"
  34697. "adds r5, r5, r6\n\t"
  34698. "adc r3, r3, r7\n\t"
  34699. "lsr r6, %[b], #16\n\t"
  34700. "lsr r7, r8, #16\n\t"
  34701. "mul r7, r6, r7\n\t"
  34702. "add r3, r3, r7\n\t"
  34703. "lsl r7, r8, #16\n\t"
  34704. "lsr r7, r7, #16\n\t"
  34705. "mul r6, r7, r6\n\t"
  34706. "lsr r7, r6, #16\n\t"
  34707. "lsl r6, r6, #16\n\t"
  34708. "adds r5, r5, r6\n\t"
  34709. "adc r3, r3, r7\n\t"
  34710. #else
  34711. "umlal r5, r3, %[b], r8\n\t"
  34712. #endif
  34713. "stm %[r]!, {r5}\n\t"
  34714. "mov r4, #0\n\t"
  34715. /* A[9] * B */
  34716. "ldm %[a]!, {r8}\n\t"
  34717. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34718. "lsl r6, %[b], #16\n\t"
  34719. "lsl r7, r8, #16\n\t"
  34720. "lsr r6, r6, #16\n\t"
  34721. "lsr r7, r7, #16\n\t"
  34722. "mul r7, r6, r7\n\t"
  34723. "adds r3, r3, r7\n\t"
  34724. "adc r4, r4, #0\n\t"
  34725. "lsr r7, r8, #16\n\t"
  34726. "mul r6, r7, r6\n\t"
  34727. "lsr r7, r6, #16\n\t"
  34728. "lsl r6, r6, #16\n\t"
  34729. "adds r3, r3, r6\n\t"
  34730. "adc r4, r4, r7\n\t"
  34731. "lsr r6, %[b], #16\n\t"
  34732. "lsr r7, r8, #16\n\t"
  34733. "mul r7, r6, r7\n\t"
  34734. "add r4, r4, r7\n\t"
  34735. "lsl r7, r8, #16\n\t"
  34736. "lsr r7, r7, #16\n\t"
  34737. "mul r6, r7, r6\n\t"
  34738. "lsr r7, r6, #16\n\t"
  34739. "lsl r6, r6, #16\n\t"
  34740. "adds r3, r3, r6\n\t"
  34741. "adc r4, r4, r7\n\t"
  34742. #else
  34743. "umlal r3, r4, %[b], r8\n\t"
  34744. #endif
  34745. "stm %[r]!, {r3}\n\t"
  34746. "mov r5, #0\n\t"
  34747. /* A[10] * B */
  34748. "ldm %[a]!, {r8}\n\t"
  34749. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34750. "lsl r6, %[b], #16\n\t"
  34751. "lsl r7, r8, #16\n\t"
  34752. "lsr r6, r6, #16\n\t"
  34753. "lsr r7, r7, #16\n\t"
  34754. "mul r7, r6, r7\n\t"
  34755. "adds r4, r4, r7\n\t"
  34756. "adc r5, r5, #0\n\t"
  34757. "lsr r7, r8, #16\n\t"
  34758. "mul r6, r7, r6\n\t"
  34759. "lsr r7, r6, #16\n\t"
  34760. "lsl r6, r6, #16\n\t"
  34761. "adds r4, r4, r6\n\t"
  34762. "adc r5, r5, r7\n\t"
  34763. "lsr r6, %[b], #16\n\t"
  34764. "lsr r7, r8, #16\n\t"
  34765. "mul r7, r6, r7\n\t"
  34766. "add r5, r5, r7\n\t"
  34767. "lsl r7, r8, #16\n\t"
  34768. "lsr r7, r7, #16\n\t"
  34769. "mul r6, r7, r6\n\t"
  34770. "lsr r7, r6, #16\n\t"
  34771. "lsl r6, r6, #16\n\t"
  34772. "adds r4, r4, r6\n\t"
  34773. "adc r5, r5, r7\n\t"
  34774. #else
  34775. "umlal r4, r5, %[b], r8\n\t"
  34776. #endif
  34777. "stm %[r]!, {r4}\n\t"
  34778. "mov r3, #0\n\t"
  34779. /* A[11] * B */
  34780. "ldm %[a]!, {r8}\n\t"
  34781. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34782. "lsl r6, %[b], #16\n\t"
  34783. "lsl r7, r8, #16\n\t"
  34784. "lsr r6, r6, #16\n\t"
  34785. "lsr r7, r7, #16\n\t"
  34786. "mul r7, r6, r7\n\t"
  34787. "adds r5, r5, r7\n\t"
  34788. "adc r3, r3, #0\n\t"
  34789. "lsr r7, r8, #16\n\t"
  34790. "mul r6, r7, r6\n\t"
  34791. "lsr r7, r6, #16\n\t"
  34792. "lsl r6, r6, #16\n\t"
  34793. "adds r5, r5, r6\n\t"
  34794. "adc r3, r3, r7\n\t"
  34795. "lsr r6, %[b], #16\n\t"
  34796. "lsr r7, r8, #16\n\t"
  34797. "mul r7, r6, r7\n\t"
  34798. "add r3, r3, r7\n\t"
  34799. "lsl r7, r8, #16\n\t"
  34800. "lsr r7, r7, #16\n\t"
  34801. "mul r6, r7, r6\n\t"
  34802. "lsr r7, r6, #16\n\t"
  34803. "lsl r6, r6, #16\n\t"
  34804. "adds r5, r5, r6\n\t"
  34805. "adc r3, r3, r7\n\t"
  34806. #else
  34807. "umlal r5, r3, %[b], r8\n\t"
  34808. #endif
  34809. "stm %[r]!, {r5}\n\t"
  34810. "mov r4, #0\n\t"
  34811. /* A[12] * B */
  34812. "ldm %[a]!, {r8}\n\t"
  34813. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34814. "lsl r6, %[b], #16\n\t"
  34815. "lsl r7, r8, #16\n\t"
  34816. "lsr r6, r6, #16\n\t"
  34817. "lsr r7, r7, #16\n\t"
  34818. "mul r7, r6, r7\n\t"
  34819. "adds r3, r3, r7\n\t"
  34820. "adc r4, r4, #0\n\t"
  34821. "lsr r7, r8, #16\n\t"
  34822. "mul r6, r7, r6\n\t"
  34823. "lsr r7, r6, #16\n\t"
  34824. "lsl r6, r6, #16\n\t"
  34825. "adds r3, r3, r6\n\t"
  34826. "adc r4, r4, r7\n\t"
  34827. "lsr r6, %[b], #16\n\t"
  34828. "lsr r7, r8, #16\n\t"
  34829. "mul r7, r6, r7\n\t"
  34830. "add r4, r4, r7\n\t"
  34831. "lsl r7, r8, #16\n\t"
  34832. "lsr r7, r7, #16\n\t"
  34833. "mul r6, r7, r6\n\t"
  34834. "lsr r7, r6, #16\n\t"
  34835. "lsl r6, r6, #16\n\t"
  34836. "adds r3, r3, r6\n\t"
  34837. "adc r4, r4, r7\n\t"
  34838. #else
  34839. "umlal r3, r4, %[b], r8\n\t"
  34840. #endif
  34841. "stm %[r]!, {r3}\n\t"
  34842. "mov r5, #0\n\t"
  34843. /* A[13] * B */
  34844. "ldm %[a]!, {r8}\n\t"
  34845. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34846. "lsl r6, %[b], #16\n\t"
  34847. "lsl r7, r8, #16\n\t"
  34848. "lsr r6, r6, #16\n\t"
  34849. "lsr r7, r7, #16\n\t"
  34850. "mul r7, r6, r7\n\t"
  34851. "adds r4, r4, r7\n\t"
  34852. "adc r5, r5, #0\n\t"
  34853. "lsr r7, r8, #16\n\t"
  34854. "mul r6, r7, r6\n\t"
  34855. "lsr r7, r6, #16\n\t"
  34856. "lsl r6, r6, #16\n\t"
  34857. "adds r4, r4, r6\n\t"
  34858. "adc r5, r5, r7\n\t"
  34859. "lsr r6, %[b], #16\n\t"
  34860. "lsr r7, r8, #16\n\t"
  34861. "mul r7, r6, r7\n\t"
  34862. "add r5, r5, r7\n\t"
  34863. "lsl r7, r8, #16\n\t"
  34864. "lsr r7, r7, #16\n\t"
  34865. "mul r6, r7, r6\n\t"
  34866. "lsr r7, r6, #16\n\t"
  34867. "lsl r6, r6, #16\n\t"
  34868. "adds r4, r4, r6\n\t"
  34869. "adc r5, r5, r7\n\t"
  34870. #else
  34871. "umlal r4, r5, %[b], r8\n\t"
  34872. #endif
  34873. "stm %[r]!, {r4}\n\t"
  34874. "mov r3, #0\n\t"
  34875. /* A[14] * B */
  34876. "ldm %[a]!, {r8}\n\t"
  34877. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34878. "lsl r6, %[b], #16\n\t"
  34879. "lsl r7, r8, #16\n\t"
  34880. "lsr r6, r6, #16\n\t"
  34881. "lsr r7, r7, #16\n\t"
  34882. "mul r7, r6, r7\n\t"
  34883. "adds r5, r5, r7\n\t"
  34884. "adc r3, r3, #0\n\t"
  34885. "lsr r7, r8, #16\n\t"
  34886. "mul r6, r7, r6\n\t"
  34887. "lsr r7, r6, #16\n\t"
  34888. "lsl r6, r6, #16\n\t"
  34889. "adds r5, r5, r6\n\t"
  34890. "adc r3, r3, r7\n\t"
  34891. "lsr r6, %[b], #16\n\t"
  34892. "lsr r7, r8, #16\n\t"
  34893. "mul r7, r6, r7\n\t"
  34894. "add r3, r3, r7\n\t"
  34895. "lsl r7, r8, #16\n\t"
  34896. "lsr r7, r7, #16\n\t"
  34897. "mul r6, r7, r6\n\t"
  34898. "lsr r7, r6, #16\n\t"
  34899. "lsl r6, r6, #16\n\t"
  34900. "adds r5, r5, r6\n\t"
  34901. "adc r3, r3, r7\n\t"
  34902. #else
  34903. "umlal r5, r3, %[b], r8\n\t"
  34904. #endif
  34905. "stm %[r]!, {r5}\n\t"
  34906. "mov r4, #0\n\t"
  34907. /* A[15] * B */
  34908. "ldm %[a]!, {r8}\n\t"
  34909. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34910. "lsl r6, %[b], #16\n\t"
  34911. "lsl r7, r8, #16\n\t"
  34912. "lsr r6, r6, #16\n\t"
  34913. "lsr r7, r7, #16\n\t"
  34914. "mul r7, r6, r7\n\t"
  34915. "adds r3, r3, r7\n\t"
  34916. "adc r4, r4, #0\n\t"
  34917. "lsr r7, r8, #16\n\t"
  34918. "mul r6, r7, r6\n\t"
  34919. "lsr r7, r6, #16\n\t"
  34920. "lsl r6, r6, #16\n\t"
  34921. "adds r3, r3, r6\n\t"
  34922. "adc r4, r4, r7\n\t"
  34923. "lsr r6, %[b], #16\n\t"
  34924. "lsr r7, r8, #16\n\t"
  34925. "mul r7, r6, r7\n\t"
  34926. "add r4, r4, r7\n\t"
  34927. "lsl r7, r8, #16\n\t"
  34928. "lsr r7, r7, #16\n\t"
  34929. "mul r6, r7, r6\n\t"
  34930. "lsr r7, r6, #16\n\t"
  34931. "lsl r6, r6, #16\n\t"
  34932. "adds r3, r3, r6\n\t"
  34933. "adc r4, r4, r7\n\t"
  34934. #else
  34935. "umlal r3, r4, %[b], r8\n\t"
  34936. #endif
  34937. "stm %[r]!, {r3}\n\t"
  34938. "mov r5, #0\n\t"
  34939. /* A[16] * B */
  34940. "ldm %[a]!, {r8}\n\t"
  34941. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34942. "lsl r6, %[b], #16\n\t"
  34943. "lsl r7, r8, #16\n\t"
  34944. "lsr r6, r6, #16\n\t"
  34945. "lsr r7, r7, #16\n\t"
  34946. "mul r7, r6, r7\n\t"
  34947. "adds r4, r4, r7\n\t"
  34948. "adc r5, r5, #0\n\t"
  34949. "lsr r7, r8, #16\n\t"
  34950. "mul r6, r7, r6\n\t"
  34951. "lsr r7, r6, #16\n\t"
  34952. "lsl r6, r6, #16\n\t"
  34953. "adds r4, r4, r6\n\t"
  34954. "adc r5, r5, r7\n\t"
  34955. "lsr r6, %[b], #16\n\t"
  34956. "lsr r7, r8, #16\n\t"
  34957. "mul r7, r6, r7\n\t"
  34958. "add r5, r5, r7\n\t"
  34959. "lsl r7, r8, #16\n\t"
  34960. "lsr r7, r7, #16\n\t"
  34961. "mul r6, r7, r6\n\t"
  34962. "lsr r7, r6, #16\n\t"
  34963. "lsl r6, r6, #16\n\t"
  34964. "adds r4, r4, r6\n\t"
  34965. "adc r5, r5, r7\n\t"
  34966. #else
  34967. "umlal r4, r5, %[b], r8\n\t"
  34968. #endif
  34969. "stm %[r]!, {r4}\n\t"
  34970. "mov r3, #0\n\t"
  34971. /* A[17] * B */
  34972. "ldm %[a]!, {r8}\n\t"
  34973. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  34974. "lsl r6, %[b], #16\n\t"
  34975. "lsl r7, r8, #16\n\t"
  34976. "lsr r6, r6, #16\n\t"
  34977. "lsr r7, r7, #16\n\t"
  34978. "mul r7, r6, r7\n\t"
  34979. "adds r5, r5, r7\n\t"
  34980. "adc r3, r3, #0\n\t"
  34981. "lsr r7, r8, #16\n\t"
  34982. "mul r6, r7, r6\n\t"
  34983. "lsr r7, r6, #16\n\t"
  34984. "lsl r6, r6, #16\n\t"
  34985. "adds r5, r5, r6\n\t"
  34986. "adc r3, r3, r7\n\t"
  34987. "lsr r6, %[b], #16\n\t"
  34988. "lsr r7, r8, #16\n\t"
  34989. "mul r7, r6, r7\n\t"
  34990. "add r3, r3, r7\n\t"
  34991. "lsl r7, r8, #16\n\t"
  34992. "lsr r7, r7, #16\n\t"
  34993. "mul r6, r7, r6\n\t"
  34994. "lsr r7, r6, #16\n\t"
  34995. "lsl r6, r6, #16\n\t"
  34996. "adds r5, r5, r6\n\t"
  34997. "adc r3, r3, r7\n\t"
  34998. #else
  34999. "umlal r5, r3, %[b], r8\n\t"
  35000. #endif
  35001. "stm %[r]!, {r5}\n\t"
  35002. "mov r4, #0\n\t"
  35003. /* A[18] * B */
  35004. "ldm %[a]!, {r8}\n\t"
  35005. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35006. "lsl r6, %[b], #16\n\t"
  35007. "lsl r7, r8, #16\n\t"
  35008. "lsr r6, r6, #16\n\t"
  35009. "lsr r7, r7, #16\n\t"
  35010. "mul r7, r6, r7\n\t"
  35011. "adds r3, r3, r7\n\t"
  35012. "adc r4, r4, #0\n\t"
  35013. "lsr r7, r8, #16\n\t"
  35014. "mul r6, r7, r6\n\t"
  35015. "lsr r7, r6, #16\n\t"
  35016. "lsl r6, r6, #16\n\t"
  35017. "adds r3, r3, r6\n\t"
  35018. "adc r4, r4, r7\n\t"
  35019. "lsr r6, %[b], #16\n\t"
  35020. "lsr r7, r8, #16\n\t"
  35021. "mul r7, r6, r7\n\t"
  35022. "add r4, r4, r7\n\t"
  35023. "lsl r7, r8, #16\n\t"
  35024. "lsr r7, r7, #16\n\t"
  35025. "mul r6, r7, r6\n\t"
  35026. "lsr r7, r6, #16\n\t"
  35027. "lsl r6, r6, #16\n\t"
  35028. "adds r3, r3, r6\n\t"
  35029. "adc r4, r4, r7\n\t"
  35030. #else
  35031. "umlal r3, r4, %[b], r8\n\t"
  35032. #endif
  35033. "stm %[r]!, {r3}\n\t"
  35034. "mov r5, #0\n\t"
  35035. /* A[19] * B */
  35036. "ldm %[a]!, {r8}\n\t"
  35037. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35038. "lsl r6, %[b], #16\n\t"
  35039. "lsl r7, r8, #16\n\t"
  35040. "lsr r6, r6, #16\n\t"
  35041. "lsr r7, r7, #16\n\t"
  35042. "mul r7, r6, r7\n\t"
  35043. "adds r4, r4, r7\n\t"
  35044. "adc r5, r5, #0\n\t"
  35045. "lsr r7, r8, #16\n\t"
  35046. "mul r6, r7, r6\n\t"
  35047. "lsr r7, r6, #16\n\t"
  35048. "lsl r6, r6, #16\n\t"
  35049. "adds r4, r4, r6\n\t"
  35050. "adc r5, r5, r7\n\t"
  35051. "lsr r6, %[b], #16\n\t"
  35052. "lsr r7, r8, #16\n\t"
  35053. "mul r7, r6, r7\n\t"
  35054. "add r5, r5, r7\n\t"
  35055. "lsl r7, r8, #16\n\t"
  35056. "lsr r7, r7, #16\n\t"
  35057. "mul r6, r7, r6\n\t"
  35058. "lsr r7, r6, #16\n\t"
  35059. "lsl r6, r6, #16\n\t"
  35060. "adds r4, r4, r6\n\t"
  35061. "adc r5, r5, r7\n\t"
  35062. #else
  35063. "umlal r4, r5, %[b], r8\n\t"
  35064. #endif
  35065. "stm %[r]!, {r4}\n\t"
  35066. "mov r3, #0\n\t"
  35067. /* A[20] * B */
  35068. "ldm %[a]!, {r8}\n\t"
  35069. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35070. "lsl r6, %[b], #16\n\t"
  35071. "lsl r7, r8, #16\n\t"
  35072. "lsr r6, r6, #16\n\t"
  35073. "lsr r7, r7, #16\n\t"
  35074. "mul r7, r6, r7\n\t"
  35075. "adds r5, r5, r7\n\t"
  35076. "adc r3, r3, #0\n\t"
  35077. "lsr r7, r8, #16\n\t"
  35078. "mul r6, r7, r6\n\t"
  35079. "lsr r7, r6, #16\n\t"
  35080. "lsl r6, r6, #16\n\t"
  35081. "adds r5, r5, r6\n\t"
  35082. "adc r3, r3, r7\n\t"
  35083. "lsr r6, %[b], #16\n\t"
  35084. "lsr r7, r8, #16\n\t"
  35085. "mul r7, r6, r7\n\t"
  35086. "add r3, r3, r7\n\t"
  35087. "lsl r7, r8, #16\n\t"
  35088. "lsr r7, r7, #16\n\t"
  35089. "mul r6, r7, r6\n\t"
  35090. "lsr r7, r6, #16\n\t"
  35091. "lsl r6, r6, #16\n\t"
  35092. "adds r5, r5, r6\n\t"
  35093. "adc r3, r3, r7\n\t"
  35094. #else
  35095. "umlal r5, r3, %[b], r8\n\t"
  35096. #endif
  35097. "stm %[r]!, {r5}\n\t"
  35098. "mov r4, #0\n\t"
  35099. /* A[21] * B */
  35100. "ldm %[a]!, {r8}\n\t"
  35101. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35102. "lsl r6, %[b], #16\n\t"
  35103. "lsl r7, r8, #16\n\t"
  35104. "lsr r6, r6, #16\n\t"
  35105. "lsr r7, r7, #16\n\t"
  35106. "mul r7, r6, r7\n\t"
  35107. "adds r3, r3, r7\n\t"
  35108. "adc r4, r4, #0\n\t"
  35109. "lsr r7, r8, #16\n\t"
  35110. "mul r6, r7, r6\n\t"
  35111. "lsr r7, r6, #16\n\t"
  35112. "lsl r6, r6, #16\n\t"
  35113. "adds r3, r3, r6\n\t"
  35114. "adc r4, r4, r7\n\t"
  35115. "lsr r6, %[b], #16\n\t"
  35116. "lsr r7, r8, #16\n\t"
  35117. "mul r7, r6, r7\n\t"
  35118. "add r4, r4, r7\n\t"
  35119. "lsl r7, r8, #16\n\t"
  35120. "lsr r7, r7, #16\n\t"
  35121. "mul r6, r7, r6\n\t"
  35122. "lsr r7, r6, #16\n\t"
  35123. "lsl r6, r6, #16\n\t"
  35124. "adds r3, r3, r6\n\t"
  35125. "adc r4, r4, r7\n\t"
  35126. #else
  35127. "umlal r3, r4, %[b], r8\n\t"
  35128. #endif
  35129. "stm %[r]!, {r3}\n\t"
  35130. "mov r5, #0\n\t"
  35131. /* A[22] * B */
  35132. "ldm %[a]!, {r8}\n\t"
  35133. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35134. "lsl r6, %[b], #16\n\t"
  35135. "lsl r7, r8, #16\n\t"
  35136. "lsr r6, r6, #16\n\t"
  35137. "lsr r7, r7, #16\n\t"
  35138. "mul r7, r6, r7\n\t"
  35139. "adds r4, r4, r7\n\t"
  35140. "adc r5, r5, #0\n\t"
  35141. "lsr r7, r8, #16\n\t"
  35142. "mul r6, r7, r6\n\t"
  35143. "lsr r7, r6, #16\n\t"
  35144. "lsl r6, r6, #16\n\t"
  35145. "adds r4, r4, r6\n\t"
  35146. "adc r5, r5, r7\n\t"
  35147. "lsr r6, %[b], #16\n\t"
  35148. "lsr r7, r8, #16\n\t"
  35149. "mul r7, r6, r7\n\t"
  35150. "add r5, r5, r7\n\t"
  35151. "lsl r7, r8, #16\n\t"
  35152. "lsr r7, r7, #16\n\t"
  35153. "mul r6, r7, r6\n\t"
  35154. "lsr r7, r6, #16\n\t"
  35155. "lsl r6, r6, #16\n\t"
  35156. "adds r4, r4, r6\n\t"
  35157. "adc r5, r5, r7\n\t"
  35158. #else
  35159. "umlal r4, r5, %[b], r8\n\t"
  35160. #endif
  35161. "stm %[r]!, {r4}\n\t"
  35162. "mov r3, #0\n\t"
  35163. /* A[23] * B */
  35164. "ldm %[a]!, {r8}\n\t"
  35165. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35166. "lsl r6, %[b], #16\n\t"
  35167. "lsl r7, r8, #16\n\t"
  35168. "lsr r6, r6, #16\n\t"
  35169. "lsr r7, r7, #16\n\t"
  35170. "mul r7, r6, r7\n\t"
  35171. "adds r5, r5, r7\n\t"
  35172. "adc r3, r3, #0\n\t"
  35173. "lsr r7, r8, #16\n\t"
  35174. "mul r6, r7, r6\n\t"
  35175. "lsr r7, r6, #16\n\t"
  35176. "lsl r6, r6, #16\n\t"
  35177. "adds r5, r5, r6\n\t"
  35178. "adc r3, r3, r7\n\t"
  35179. "lsr r6, %[b], #16\n\t"
  35180. "lsr r7, r8, #16\n\t"
  35181. "mul r7, r6, r7\n\t"
  35182. "add r3, r3, r7\n\t"
  35183. "lsl r7, r8, #16\n\t"
  35184. "lsr r7, r7, #16\n\t"
  35185. "mul r6, r7, r6\n\t"
  35186. "lsr r7, r6, #16\n\t"
  35187. "lsl r6, r6, #16\n\t"
  35188. "adds r5, r5, r6\n\t"
  35189. "adc r3, r3, r7\n\t"
  35190. #else
  35191. "umlal r5, r3, %[b], r8\n\t"
  35192. #endif
  35193. "stm %[r]!, {r5}\n\t"
  35194. "mov r4, #0\n\t"
  35195. /* A[24] * B */
  35196. "ldm %[a]!, {r8}\n\t"
  35197. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35198. "lsl r6, %[b], #16\n\t"
  35199. "lsl r7, r8, #16\n\t"
  35200. "lsr r6, r6, #16\n\t"
  35201. "lsr r7, r7, #16\n\t"
  35202. "mul r7, r6, r7\n\t"
  35203. "adds r3, r3, r7\n\t"
  35204. "adc r4, r4, #0\n\t"
  35205. "lsr r7, r8, #16\n\t"
  35206. "mul r6, r7, r6\n\t"
  35207. "lsr r7, r6, #16\n\t"
  35208. "lsl r6, r6, #16\n\t"
  35209. "adds r3, r3, r6\n\t"
  35210. "adc r4, r4, r7\n\t"
  35211. "lsr r6, %[b], #16\n\t"
  35212. "lsr r7, r8, #16\n\t"
  35213. "mul r7, r6, r7\n\t"
  35214. "add r4, r4, r7\n\t"
  35215. "lsl r7, r8, #16\n\t"
  35216. "lsr r7, r7, #16\n\t"
  35217. "mul r6, r7, r6\n\t"
  35218. "lsr r7, r6, #16\n\t"
  35219. "lsl r6, r6, #16\n\t"
  35220. "adds r3, r3, r6\n\t"
  35221. "adc r4, r4, r7\n\t"
  35222. #else
  35223. "umlal r3, r4, %[b], r8\n\t"
  35224. #endif
  35225. "stm %[r]!, {r3}\n\t"
  35226. "mov r5, #0\n\t"
  35227. /* A[25] * B */
  35228. "ldm %[a]!, {r8}\n\t"
  35229. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35230. "lsl r6, %[b], #16\n\t"
  35231. "lsl r7, r8, #16\n\t"
  35232. "lsr r6, r6, #16\n\t"
  35233. "lsr r7, r7, #16\n\t"
  35234. "mul r7, r6, r7\n\t"
  35235. "adds r4, r4, r7\n\t"
  35236. "adc r5, r5, #0\n\t"
  35237. "lsr r7, r8, #16\n\t"
  35238. "mul r6, r7, r6\n\t"
  35239. "lsr r7, r6, #16\n\t"
  35240. "lsl r6, r6, #16\n\t"
  35241. "adds r4, r4, r6\n\t"
  35242. "adc r5, r5, r7\n\t"
  35243. "lsr r6, %[b], #16\n\t"
  35244. "lsr r7, r8, #16\n\t"
  35245. "mul r7, r6, r7\n\t"
  35246. "add r5, r5, r7\n\t"
  35247. "lsl r7, r8, #16\n\t"
  35248. "lsr r7, r7, #16\n\t"
  35249. "mul r6, r7, r6\n\t"
  35250. "lsr r7, r6, #16\n\t"
  35251. "lsl r6, r6, #16\n\t"
  35252. "adds r4, r4, r6\n\t"
  35253. "adc r5, r5, r7\n\t"
  35254. #else
  35255. "umlal r4, r5, %[b], r8\n\t"
  35256. #endif
  35257. "stm %[r]!, {r4}\n\t"
  35258. "mov r3, #0\n\t"
  35259. /* A[26] * B */
  35260. "ldm %[a]!, {r8}\n\t"
  35261. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35262. "lsl r6, %[b], #16\n\t"
  35263. "lsl r7, r8, #16\n\t"
  35264. "lsr r6, r6, #16\n\t"
  35265. "lsr r7, r7, #16\n\t"
  35266. "mul r7, r6, r7\n\t"
  35267. "adds r5, r5, r7\n\t"
  35268. "adc r3, r3, #0\n\t"
  35269. "lsr r7, r8, #16\n\t"
  35270. "mul r6, r7, r6\n\t"
  35271. "lsr r7, r6, #16\n\t"
  35272. "lsl r6, r6, #16\n\t"
  35273. "adds r5, r5, r6\n\t"
  35274. "adc r3, r3, r7\n\t"
  35275. "lsr r6, %[b], #16\n\t"
  35276. "lsr r7, r8, #16\n\t"
  35277. "mul r7, r6, r7\n\t"
  35278. "add r3, r3, r7\n\t"
  35279. "lsl r7, r8, #16\n\t"
  35280. "lsr r7, r7, #16\n\t"
  35281. "mul r6, r7, r6\n\t"
  35282. "lsr r7, r6, #16\n\t"
  35283. "lsl r6, r6, #16\n\t"
  35284. "adds r5, r5, r6\n\t"
  35285. "adc r3, r3, r7\n\t"
  35286. #else
  35287. "umlal r5, r3, %[b], r8\n\t"
  35288. #endif
  35289. "stm %[r]!, {r5}\n\t"
  35290. "mov r4, #0\n\t"
  35291. /* A[27] * B */
  35292. "ldm %[a]!, {r8}\n\t"
  35293. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35294. "lsl r6, %[b], #16\n\t"
  35295. "lsl r7, r8, #16\n\t"
  35296. "lsr r6, r6, #16\n\t"
  35297. "lsr r7, r7, #16\n\t"
  35298. "mul r7, r6, r7\n\t"
  35299. "adds r3, r3, r7\n\t"
  35300. "adc r4, r4, #0\n\t"
  35301. "lsr r7, r8, #16\n\t"
  35302. "mul r6, r7, r6\n\t"
  35303. "lsr r7, r6, #16\n\t"
  35304. "lsl r6, r6, #16\n\t"
  35305. "adds r3, r3, r6\n\t"
  35306. "adc r4, r4, r7\n\t"
  35307. "lsr r6, %[b], #16\n\t"
  35308. "lsr r7, r8, #16\n\t"
  35309. "mul r7, r6, r7\n\t"
  35310. "add r4, r4, r7\n\t"
  35311. "lsl r7, r8, #16\n\t"
  35312. "lsr r7, r7, #16\n\t"
  35313. "mul r6, r7, r6\n\t"
  35314. "lsr r7, r6, #16\n\t"
  35315. "lsl r6, r6, #16\n\t"
  35316. "adds r3, r3, r6\n\t"
  35317. "adc r4, r4, r7\n\t"
  35318. #else
  35319. "umlal r3, r4, %[b], r8\n\t"
  35320. #endif
  35321. "stm %[r]!, {r3}\n\t"
  35322. "mov r5, #0\n\t"
  35323. /* A[28] * B */
  35324. "ldm %[a]!, {r8}\n\t"
  35325. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35326. "lsl r6, %[b], #16\n\t"
  35327. "lsl r7, r8, #16\n\t"
  35328. "lsr r6, r6, #16\n\t"
  35329. "lsr r7, r7, #16\n\t"
  35330. "mul r7, r6, r7\n\t"
  35331. "adds r4, r4, r7\n\t"
  35332. "adc r5, r5, #0\n\t"
  35333. "lsr r7, r8, #16\n\t"
  35334. "mul r6, r7, r6\n\t"
  35335. "lsr r7, r6, #16\n\t"
  35336. "lsl r6, r6, #16\n\t"
  35337. "adds r4, r4, r6\n\t"
  35338. "adc r5, r5, r7\n\t"
  35339. "lsr r6, %[b], #16\n\t"
  35340. "lsr r7, r8, #16\n\t"
  35341. "mul r7, r6, r7\n\t"
  35342. "add r5, r5, r7\n\t"
  35343. "lsl r7, r8, #16\n\t"
  35344. "lsr r7, r7, #16\n\t"
  35345. "mul r6, r7, r6\n\t"
  35346. "lsr r7, r6, #16\n\t"
  35347. "lsl r6, r6, #16\n\t"
  35348. "adds r4, r4, r6\n\t"
  35349. "adc r5, r5, r7\n\t"
  35350. #else
  35351. "umlal r4, r5, %[b], r8\n\t"
  35352. #endif
  35353. "stm %[r]!, {r4}\n\t"
  35354. "mov r3, #0\n\t"
  35355. /* A[29] * B */
  35356. "ldm %[a]!, {r8}\n\t"
  35357. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35358. "lsl r6, %[b], #16\n\t"
  35359. "lsl r7, r8, #16\n\t"
  35360. "lsr r6, r6, #16\n\t"
  35361. "lsr r7, r7, #16\n\t"
  35362. "mul r7, r6, r7\n\t"
  35363. "adds r5, r5, r7\n\t"
  35364. "adc r3, r3, #0\n\t"
  35365. "lsr r7, r8, #16\n\t"
  35366. "mul r6, r7, r6\n\t"
  35367. "lsr r7, r6, #16\n\t"
  35368. "lsl r6, r6, #16\n\t"
  35369. "adds r5, r5, r6\n\t"
  35370. "adc r3, r3, r7\n\t"
  35371. "lsr r6, %[b], #16\n\t"
  35372. "lsr r7, r8, #16\n\t"
  35373. "mul r7, r6, r7\n\t"
  35374. "add r3, r3, r7\n\t"
  35375. "lsl r7, r8, #16\n\t"
  35376. "lsr r7, r7, #16\n\t"
  35377. "mul r6, r7, r6\n\t"
  35378. "lsr r7, r6, #16\n\t"
  35379. "lsl r6, r6, #16\n\t"
  35380. "adds r5, r5, r6\n\t"
  35381. "adc r3, r3, r7\n\t"
  35382. #else
  35383. "umlal r5, r3, %[b], r8\n\t"
  35384. #endif
  35385. "stm %[r]!, {r5}\n\t"
  35386. "mov r4, #0\n\t"
  35387. /* A[30] * B */
  35388. "ldm %[a]!, {r8}\n\t"
  35389. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35390. "lsl r6, %[b], #16\n\t"
  35391. "lsl r7, r8, #16\n\t"
  35392. "lsr r6, r6, #16\n\t"
  35393. "lsr r7, r7, #16\n\t"
  35394. "mul r7, r6, r7\n\t"
  35395. "adds r3, r3, r7\n\t"
  35396. "adc r4, r4, #0\n\t"
  35397. "lsr r7, r8, #16\n\t"
  35398. "mul r6, r7, r6\n\t"
  35399. "lsr r7, r6, #16\n\t"
  35400. "lsl r6, r6, #16\n\t"
  35401. "adds r3, r3, r6\n\t"
  35402. "adc r4, r4, r7\n\t"
  35403. "lsr r6, %[b], #16\n\t"
  35404. "lsr r7, r8, #16\n\t"
  35405. "mul r7, r6, r7\n\t"
  35406. "add r4, r4, r7\n\t"
  35407. "lsl r7, r8, #16\n\t"
  35408. "lsr r7, r7, #16\n\t"
  35409. "mul r6, r7, r6\n\t"
  35410. "lsr r7, r6, #16\n\t"
  35411. "lsl r6, r6, #16\n\t"
  35412. "adds r3, r3, r6\n\t"
  35413. "adc r4, r4, r7\n\t"
  35414. #else
  35415. "umlal r3, r4, %[b], r8\n\t"
  35416. #endif
  35417. "stm %[r]!, {r3}\n\t"
  35418. "mov r5, #0\n\t"
  35419. /* A[31] * B */
  35420. "ldm %[a]!, {r8}\n\t"
  35421. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35422. "lsl r6, %[b], #16\n\t"
  35423. "lsl r7, r8, #16\n\t"
  35424. "lsr r6, r6, #16\n\t"
  35425. "lsr r7, r7, #16\n\t"
  35426. "mul r7, r6, r7\n\t"
  35427. "adds r4, r4, r7\n\t"
  35428. "adc r5, r5, #0\n\t"
  35429. "lsr r7, r8, #16\n\t"
  35430. "mul r6, r7, r6\n\t"
  35431. "lsr r7, r6, #16\n\t"
  35432. "lsl r6, r6, #16\n\t"
  35433. "adds r4, r4, r6\n\t"
  35434. "adc r5, r5, r7\n\t"
  35435. "lsr r6, %[b], #16\n\t"
  35436. "lsr r7, r8, #16\n\t"
  35437. "mul r7, r6, r7\n\t"
  35438. "add r5, r5, r7\n\t"
  35439. "lsl r7, r8, #16\n\t"
  35440. "lsr r7, r7, #16\n\t"
  35441. "mul r6, r7, r6\n\t"
  35442. "lsr r7, r6, #16\n\t"
  35443. "lsl r6, r6, #16\n\t"
  35444. "adds r4, r4, r6\n\t"
  35445. "adc r5, r5, r7\n\t"
  35446. #else
  35447. "umlal r4, r5, %[b], r8\n\t"
  35448. #endif
  35449. "stm %[r]!, {r4}\n\t"
  35450. "mov r3, #0\n\t"
  35451. /* A[32] * B */
  35452. "ldm %[a]!, {r8}\n\t"
  35453. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35454. "lsl r6, %[b], #16\n\t"
  35455. "lsl r7, r8, #16\n\t"
  35456. "lsr r6, r6, #16\n\t"
  35457. "lsr r7, r7, #16\n\t"
  35458. "mul r7, r6, r7\n\t"
  35459. "adds r5, r5, r7\n\t"
  35460. "adc r3, r3, #0\n\t"
  35461. "lsr r7, r8, #16\n\t"
  35462. "mul r6, r7, r6\n\t"
  35463. "lsr r7, r6, #16\n\t"
  35464. "lsl r6, r6, #16\n\t"
  35465. "adds r5, r5, r6\n\t"
  35466. "adc r3, r3, r7\n\t"
  35467. "lsr r6, %[b], #16\n\t"
  35468. "lsr r7, r8, #16\n\t"
  35469. "mul r7, r6, r7\n\t"
  35470. "add r3, r3, r7\n\t"
  35471. "lsl r7, r8, #16\n\t"
  35472. "lsr r7, r7, #16\n\t"
  35473. "mul r6, r7, r6\n\t"
  35474. "lsr r7, r6, #16\n\t"
  35475. "lsl r6, r6, #16\n\t"
  35476. "adds r5, r5, r6\n\t"
  35477. "adc r3, r3, r7\n\t"
  35478. #else
  35479. "umlal r5, r3, %[b], r8\n\t"
  35480. #endif
  35481. "stm %[r]!, {r5}\n\t"
  35482. "mov r4, #0\n\t"
  35483. /* A[33] * B */
  35484. "ldm %[a]!, {r8}\n\t"
  35485. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35486. "lsl r6, %[b], #16\n\t"
  35487. "lsl r7, r8, #16\n\t"
  35488. "lsr r6, r6, #16\n\t"
  35489. "lsr r7, r7, #16\n\t"
  35490. "mul r7, r6, r7\n\t"
  35491. "adds r3, r3, r7\n\t"
  35492. "adc r4, r4, #0\n\t"
  35493. "lsr r7, r8, #16\n\t"
  35494. "mul r6, r7, r6\n\t"
  35495. "lsr r7, r6, #16\n\t"
  35496. "lsl r6, r6, #16\n\t"
  35497. "adds r3, r3, r6\n\t"
  35498. "adc r4, r4, r7\n\t"
  35499. "lsr r6, %[b], #16\n\t"
  35500. "lsr r7, r8, #16\n\t"
  35501. "mul r7, r6, r7\n\t"
  35502. "add r4, r4, r7\n\t"
  35503. "lsl r7, r8, #16\n\t"
  35504. "lsr r7, r7, #16\n\t"
  35505. "mul r6, r7, r6\n\t"
  35506. "lsr r7, r6, #16\n\t"
  35507. "lsl r6, r6, #16\n\t"
  35508. "adds r3, r3, r6\n\t"
  35509. "adc r4, r4, r7\n\t"
  35510. #else
  35511. "umlal r3, r4, %[b], r8\n\t"
  35512. #endif
  35513. "stm %[r]!, {r3}\n\t"
  35514. "mov r5, #0\n\t"
  35515. /* A[34] * B */
  35516. "ldm %[a]!, {r8}\n\t"
  35517. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35518. "lsl r6, %[b], #16\n\t"
  35519. "lsl r7, r8, #16\n\t"
  35520. "lsr r6, r6, #16\n\t"
  35521. "lsr r7, r7, #16\n\t"
  35522. "mul r7, r6, r7\n\t"
  35523. "adds r4, r4, r7\n\t"
  35524. "adc r5, r5, #0\n\t"
  35525. "lsr r7, r8, #16\n\t"
  35526. "mul r6, r7, r6\n\t"
  35527. "lsr r7, r6, #16\n\t"
  35528. "lsl r6, r6, #16\n\t"
  35529. "adds r4, r4, r6\n\t"
  35530. "adc r5, r5, r7\n\t"
  35531. "lsr r6, %[b], #16\n\t"
  35532. "lsr r7, r8, #16\n\t"
  35533. "mul r7, r6, r7\n\t"
  35534. "add r5, r5, r7\n\t"
  35535. "lsl r7, r8, #16\n\t"
  35536. "lsr r7, r7, #16\n\t"
  35537. "mul r6, r7, r6\n\t"
  35538. "lsr r7, r6, #16\n\t"
  35539. "lsl r6, r6, #16\n\t"
  35540. "adds r4, r4, r6\n\t"
  35541. "adc r5, r5, r7\n\t"
  35542. #else
  35543. "umlal r4, r5, %[b], r8\n\t"
  35544. #endif
  35545. "stm %[r]!, {r4}\n\t"
  35546. "mov r3, #0\n\t"
  35547. /* A[35] * B */
  35548. "ldm %[a]!, {r8}\n\t"
  35549. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35550. "lsl r6, %[b], #16\n\t"
  35551. "lsl r7, r8, #16\n\t"
  35552. "lsr r6, r6, #16\n\t"
  35553. "lsr r7, r7, #16\n\t"
  35554. "mul r7, r6, r7\n\t"
  35555. "adds r5, r5, r7\n\t"
  35556. "adc r3, r3, #0\n\t"
  35557. "lsr r7, r8, #16\n\t"
  35558. "mul r6, r7, r6\n\t"
  35559. "lsr r7, r6, #16\n\t"
  35560. "lsl r6, r6, #16\n\t"
  35561. "adds r5, r5, r6\n\t"
  35562. "adc r3, r3, r7\n\t"
  35563. "lsr r6, %[b], #16\n\t"
  35564. "lsr r7, r8, #16\n\t"
  35565. "mul r7, r6, r7\n\t"
  35566. "add r3, r3, r7\n\t"
  35567. "lsl r7, r8, #16\n\t"
  35568. "lsr r7, r7, #16\n\t"
  35569. "mul r6, r7, r6\n\t"
  35570. "lsr r7, r6, #16\n\t"
  35571. "lsl r6, r6, #16\n\t"
  35572. "adds r5, r5, r6\n\t"
  35573. "adc r3, r3, r7\n\t"
  35574. #else
  35575. "umlal r5, r3, %[b], r8\n\t"
  35576. #endif
  35577. "stm %[r]!, {r5}\n\t"
  35578. "mov r4, #0\n\t"
  35579. /* A[36] * B */
  35580. "ldm %[a]!, {r8}\n\t"
  35581. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35582. "lsl r6, %[b], #16\n\t"
  35583. "lsl r7, r8, #16\n\t"
  35584. "lsr r6, r6, #16\n\t"
  35585. "lsr r7, r7, #16\n\t"
  35586. "mul r7, r6, r7\n\t"
  35587. "adds r3, r3, r7\n\t"
  35588. "adc r4, r4, #0\n\t"
  35589. "lsr r7, r8, #16\n\t"
  35590. "mul r6, r7, r6\n\t"
  35591. "lsr r7, r6, #16\n\t"
  35592. "lsl r6, r6, #16\n\t"
  35593. "adds r3, r3, r6\n\t"
  35594. "adc r4, r4, r7\n\t"
  35595. "lsr r6, %[b], #16\n\t"
  35596. "lsr r7, r8, #16\n\t"
  35597. "mul r7, r6, r7\n\t"
  35598. "add r4, r4, r7\n\t"
  35599. "lsl r7, r8, #16\n\t"
  35600. "lsr r7, r7, #16\n\t"
  35601. "mul r6, r7, r6\n\t"
  35602. "lsr r7, r6, #16\n\t"
  35603. "lsl r6, r6, #16\n\t"
  35604. "adds r3, r3, r6\n\t"
  35605. "adc r4, r4, r7\n\t"
  35606. #else
  35607. "umlal r3, r4, %[b], r8\n\t"
  35608. #endif
  35609. "stm %[r]!, {r3}\n\t"
  35610. "mov r5, #0\n\t"
  35611. /* A[37] * B */
  35612. "ldm %[a]!, {r8}\n\t"
  35613. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35614. "lsl r6, %[b], #16\n\t"
  35615. "lsl r7, r8, #16\n\t"
  35616. "lsr r6, r6, #16\n\t"
  35617. "lsr r7, r7, #16\n\t"
  35618. "mul r7, r6, r7\n\t"
  35619. "adds r4, r4, r7\n\t"
  35620. "adc r5, r5, #0\n\t"
  35621. "lsr r7, r8, #16\n\t"
  35622. "mul r6, r7, r6\n\t"
  35623. "lsr r7, r6, #16\n\t"
  35624. "lsl r6, r6, #16\n\t"
  35625. "adds r4, r4, r6\n\t"
  35626. "adc r5, r5, r7\n\t"
  35627. "lsr r6, %[b], #16\n\t"
  35628. "lsr r7, r8, #16\n\t"
  35629. "mul r7, r6, r7\n\t"
  35630. "add r5, r5, r7\n\t"
  35631. "lsl r7, r8, #16\n\t"
  35632. "lsr r7, r7, #16\n\t"
  35633. "mul r6, r7, r6\n\t"
  35634. "lsr r7, r6, #16\n\t"
  35635. "lsl r6, r6, #16\n\t"
  35636. "adds r4, r4, r6\n\t"
  35637. "adc r5, r5, r7\n\t"
  35638. #else
  35639. "umlal r4, r5, %[b], r8\n\t"
  35640. #endif
  35641. "stm %[r]!, {r4}\n\t"
  35642. "mov r3, #0\n\t"
  35643. /* A[38] * B */
  35644. "ldm %[a]!, {r8}\n\t"
  35645. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35646. "lsl r6, %[b], #16\n\t"
  35647. "lsl r7, r8, #16\n\t"
  35648. "lsr r6, r6, #16\n\t"
  35649. "lsr r7, r7, #16\n\t"
  35650. "mul r7, r6, r7\n\t"
  35651. "adds r5, r5, r7\n\t"
  35652. "adc r3, r3, #0\n\t"
  35653. "lsr r7, r8, #16\n\t"
  35654. "mul r6, r7, r6\n\t"
  35655. "lsr r7, r6, #16\n\t"
  35656. "lsl r6, r6, #16\n\t"
  35657. "adds r5, r5, r6\n\t"
  35658. "adc r3, r3, r7\n\t"
  35659. "lsr r6, %[b], #16\n\t"
  35660. "lsr r7, r8, #16\n\t"
  35661. "mul r7, r6, r7\n\t"
  35662. "add r3, r3, r7\n\t"
  35663. "lsl r7, r8, #16\n\t"
  35664. "lsr r7, r7, #16\n\t"
  35665. "mul r6, r7, r6\n\t"
  35666. "lsr r7, r6, #16\n\t"
  35667. "lsl r6, r6, #16\n\t"
  35668. "adds r5, r5, r6\n\t"
  35669. "adc r3, r3, r7\n\t"
  35670. #else
  35671. "umlal r5, r3, %[b], r8\n\t"
  35672. #endif
  35673. "stm %[r]!, {r5}\n\t"
  35674. "mov r4, #0\n\t"
  35675. /* A[39] * B */
  35676. "ldm %[a]!, {r8}\n\t"
  35677. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35678. "lsl r6, %[b], #16\n\t"
  35679. "lsl r7, r8, #16\n\t"
  35680. "lsr r6, r6, #16\n\t"
  35681. "lsr r7, r7, #16\n\t"
  35682. "mul r7, r6, r7\n\t"
  35683. "adds r3, r3, r7\n\t"
  35684. "adc r4, r4, #0\n\t"
  35685. "lsr r7, r8, #16\n\t"
  35686. "mul r6, r7, r6\n\t"
  35687. "lsr r7, r6, #16\n\t"
  35688. "lsl r6, r6, #16\n\t"
  35689. "adds r3, r3, r6\n\t"
  35690. "adc r4, r4, r7\n\t"
  35691. "lsr r6, %[b], #16\n\t"
  35692. "lsr r7, r8, #16\n\t"
  35693. "mul r7, r6, r7\n\t"
  35694. "add r4, r4, r7\n\t"
  35695. "lsl r7, r8, #16\n\t"
  35696. "lsr r7, r7, #16\n\t"
  35697. "mul r6, r7, r6\n\t"
  35698. "lsr r7, r6, #16\n\t"
  35699. "lsl r6, r6, #16\n\t"
  35700. "adds r3, r3, r6\n\t"
  35701. "adc r4, r4, r7\n\t"
  35702. #else
  35703. "umlal r3, r4, %[b], r8\n\t"
  35704. #endif
  35705. "stm %[r]!, {r3}\n\t"
  35706. "mov r5, #0\n\t"
  35707. /* A[40] * B */
  35708. "ldm %[a]!, {r8}\n\t"
  35709. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35710. "lsl r6, %[b], #16\n\t"
  35711. "lsl r7, r8, #16\n\t"
  35712. "lsr r6, r6, #16\n\t"
  35713. "lsr r7, r7, #16\n\t"
  35714. "mul r7, r6, r7\n\t"
  35715. "adds r4, r4, r7\n\t"
  35716. "adc r5, r5, #0\n\t"
  35717. "lsr r7, r8, #16\n\t"
  35718. "mul r6, r7, r6\n\t"
  35719. "lsr r7, r6, #16\n\t"
  35720. "lsl r6, r6, #16\n\t"
  35721. "adds r4, r4, r6\n\t"
  35722. "adc r5, r5, r7\n\t"
  35723. "lsr r6, %[b], #16\n\t"
  35724. "lsr r7, r8, #16\n\t"
  35725. "mul r7, r6, r7\n\t"
  35726. "add r5, r5, r7\n\t"
  35727. "lsl r7, r8, #16\n\t"
  35728. "lsr r7, r7, #16\n\t"
  35729. "mul r6, r7, r6\n\t"
  35730. "lsr r7, r6, #16\n\t"
  35731. "lsl r6, r6, #16\n\t"
  35732. "adds r4, r4, r6\n\t"
  35733. "adc r5, r5, r7\n\t"
  35734. #else
  35735. "umlal r4, r5, %[b], r8\n\t"
  35736. #endif
  35737. "stm %[r]!, {r4}\n\t"
  35738. "mov r3, #0\n\t"
  35739. /* A[41] * B */
  35740. "ldm %[a]!, {r8}\n\t"
  35741. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35742. "lsl r6, %[b], #16\n\t"
  35743. "lsl r7, r8, #16\n\t"
  35744. "lsr r6, r6, #16\n\t"
  35745. "lsr r7, r7, #16\n\t"
  35746. "mul r7, r6, r7\n\t"
  35747. "adds r5, r5, r7\n\t"
  35748. "adc r3, r3, #0\n\t"
  35749. "lsr r7, r8, #16\n\t"
  35750. "mul r6, r7, r6\n\t"
  35751. "lsr r7, r6, #16\n\t"
  35752. "lsl r6, r6, #16\n\t"
  35753. "adds r5, r5, r6\n\t"
  35754. "adc r3, r3, r7\n\t"
  35755. "lsr r6, %[b], #16\n\t"
  35756. "lsr r7, r8, #16\n\t"
  35757. "mul r7, r6, r7\n\t"
  35758. "add r3, r3, r7\n\t"
  35759. "lsl r7, r8, #16\n\t"
  35760. "lsr r7, r7, #16\n\t"
  35761. "mul r6, r7, r6\n\t"
  35762. "lsr r7, r6, #16\n\t"
  35763. "lsl r6, r6, #16\n\t"
  35764. "adds r5, r5, r6\n\t"
  35765. "adc r3, r3, r7\n\t"
  35766. #else
  35767. "umlal r5, r3, %[b], r8\n\t"
  35768. #endif
  35769. "stm %[r]!, {r5}\n\t"
  35770. "mov r4, #0\n\t"
  35771. /* A[42] * B */
  35772. "ldm %[a]!, {r8}\n\t"
  35773. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35774. "lsl r6, %[b], #16\n\t"
  35775. "lsl r7, r8, #16\n\t"
  35776. "lsr r6, r6, #16\n\t"
  35777. "lsr r7, r7, #16\n\t"
  35778. "mul r7, r6, r7\n\t"
  35779. "adds r3, r3, r7\n\t"
  35780. "adc r4, r4, #0\n\t"
  35781. "lsr r7, r8, #16\n\t"
  35782. "mul r6, r7, r6\n\t"
  35783. "lsr r7, r6, #16\n\t"
  35784. "lsl r6, r6, #16\n\t"
  35785. "adds r3, r3, r6\n\t"
  35786. "adc r4, r4, r7\n\t"
  35787. "lsr r6, %[b], #16\n\t"
  35788. "lsr r7, r8, #16\n\t"
  35789. "mul r7, r6, r7\n\t"
  35790. "add r4, r4, r7\n\t"
  35791. "lsl r7, r8, #16\n\t"
  35792. "lsr r7, r7, #16\n\t"
  35793. "mul r6, r7, r6\n\t"
  35794. "lsr r7, r6, #16\n\t"
  35795. "lsl r6, r6, #16\n\t"
  35796. "adds r3, r3, r6\n\t"
  35797. "adc r4, r4, r7\n\t"
  35798. #else
  35799. "umlal r3, r4, %[b], r8\n\t"
  35800. #endif
  35801. "stm %[r]!, {r3}\n\t"
  35802. "mov r5, #0\n\t"
  35803. /* A[43] * B */
  35804. "ldm %[a]!, {r8}\n\t"
  35805. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35806. "lsl r6, %[b], #16\n\t"
  35807. "lsl r7, r8, #16\n\t"
  35808. "lsr r6, r6, #16\n\t"
  35809. "lsr r7, r7, #16\n\t"
  35810. "mul r7, r6, r7\n\t"
  35811. "adds r4, r4, r7\n\t"
  35812. "adc r5, r5, #0\n\t"
  35813. "lsr r7, r8, #16\n\t"
  35814. "mul r6, r7, r6\n\t"
  35815. "lsr r7, r6, #16\n\t"
  35816. "lsl r6, r6, #16\n\t"
  35817. "adds r4, r4, r6\n\t"
  35818. "adc r5, r5, r7\n\t"
  35819. "lsr r6, %[b], #16\n\t"
  35820. "lsr r7, r8, #16\n\t"
  35821. "mul r7, r6, r7\n\t"
  35822. "add r5, r5, r7\n\t"
  35823. "lsl r7, r8, #16\n\t"
  35824. "lsr r7, r7, #16\n\t"
  35825. "mul r6, r7, r6\n\t"
  35826. "lsr r7, r6, #16\n\t"
  35827. "lsl r6, r6, #16\n\t"
  35828. "adds r4, r4, r6\n\t"
  35829. "adc r5, r5, r7\n\t"
  35830. #else
  35831. "umlal r4, r5, %[b], r8\n\t"
  35832. #endif
  35833. "stm %[r]!, {r4}\n\t"
  35834. "mov r3, #0\n\t"
  35835. /* A[44] * B */
  35836. "ldm %[a]!, {r8}\n\t"
  35837. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35838. "lsl r6, %[b], #16\n\t"
  35839. "lsl r7, r8, #16\n\t"
  35840. "lsr r6, r6, #16\n\t"
  35841. "lsr r7, r7, #16\n\t"
  35842. "mul r7, r6, r7\n\t"
  35843. "adds r5, r5, r7\n\t"
  35844. "adc r3, r3, #0\n\t"
  35845. "lsr r7, r8, #16\n\t"
  35846. "mul r6, r7, r6\n\t"
  35847. "lsr r7, r6, #16\n\t"
  35848. "lsl r6, r6, #16\n\t"
  35849. "adds r5, r5, r6\n\t"
  35850. "adc r3, r3, r7\n\t"
  35851. "lsr r6, %[b], #16\n\t"
  35852. "lsr r7, r8, #16\n\t"
  35853. "mul r7, r6, r7\n\t"
  35854. "add r3, r3, r7\n\t"
  35855. "lsl r7, r8, #16\n\t"
  35856. "lsr r7, r7, #16\n\t"
  35857. "mul r6, r7, r6\n\t"
  35858. "lsr r7, r6, #16\n\t"
  35859. "lsl r6, r6, #16\n\t"
  35860. "adds r5, r5, r6\n\t"
  35861. "adc r3, r3, r7\n\t"
  35862. #else
  35863. "umlal r5, r3, %[b], r8\n\t"
  35864. #endif
  35865. "stm %[r]!, {r5}\n\t"
  35866. "mov r4, #0\n\t"
  35867. /* A[45] * B */
  35868. "ldm %[a]!, {r8}\n\t"
  35869. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35870. "lsl r6, %[b], #16\n\t"
  35871. "lsl r7, r8, #16\n\t"
  35872. "lsr r6, r6, #16\n\t"
  35873. "lsr r7, r7, #16\n\t"
  35874. "mul r7, r6, r7\n\t"
  35875. "adds r3, r3, r7\n\t"
  35876. "adc r4, r4, #0\n\t"
  35877. "lsr r7, r8, #16\n\t"
  35878. "mul r6, r7, r6\n\t"
  35879. "lsr r7, r6, #16\n\t"
  35880. "lsl r6, r6, #16\n\t"
  35881. "adds r3, r3, r6\n\t"
  35882. "adc r4, r4, r7\n\t"
  35883. "lsr r6, %[b], #16\n\t"
  35884. "lsr r7, r8, #16\n\t"
  35885. "mul r7, r6, r7\n\t"
  35886. "add r4, r4, r7\n\t"
  35887. "lsl r7, r8, #16\n\t"
  35888. "lsr r7, r7, #16\n\t"
  35889. "mul r6, r7, r6\n\t"
  35890. "lsr r7, r6, #16\n\t"
  35891. "lsl r6, r6, #16\n\t"
  35892. "adds r3, r3, r6\n\t"
  35893. "adc r4, r4, r7\n\t"
  35894. #else
  35895. "umlal r3, r4, %[b], r8\n\t"
  35896. #endif
  35897. "stm %[r]!, {r3}\n\t"
  35898. "mov r5, #0\n\t"
  35899. /* A[46] * B */
  35900. "ldm %[a]!, {r8}\n\t"
  35901. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35902. "lsl r6, %[b], #16\n\t"
  35903. "lsl r7, r8, #16\n\t"
  35904. "lsr r6, r6, #16\n\t"
  35905. "lsr r7, r7, #16\n\t"
  35906. "mul r7, r6, r7\n\t"
  35907. "adds r4, r4, r7\n\t"
  35908. "adc r5, r5, #0\n\t"
  35909. "lsr r7, r8, #16\n\t"
  35910. "mul r6, r7, r6\n\t"
  35911. "lsr r7, r6, #16\n\t"
  35912. "lsl r6, r6, #16\n\t"
  35913. "adds r4, r4, r6\n\t"
  35914. "adc r5, r5, r7\n\t"
  35915. "lsr r6, %[b], #16\n\t"
  35916. "lsr r7, r8, #16\n\t"
  35917. "mul r7, r6, r7\n\t"
  35918. "add r5, r5, r7\n\t"
  35919. "lsl r7, r8, #16\n\t"
  35920. "lsr r7, r7, #16\n\t"
  35921. "mul r6, r7, r6\n\t"
  35922. "lsr r7, r6, #16\n\t"
  35923. "lsl r6, r6, #16\n\t"
  35924. "adds r4, r4, r6\n\t"
  35925. "adc r5, r5, r7\n\t"
  35926. #else
  35927. "umlal r4, r5, %[b], r8\n\t"
  35928. #endif
  35929. "stm %[r]!, {r4}\n\t"
  35930. "mov r3, #0\n\t"
  35931. /* A[47] * B */
  35932. "ldm %[a]!, {r8}\n\t"
  35933. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  35934. "lsl r6, %[b], #16\n\t"
  35935. "lsl r7, r8, #16\n\t"
  35936. "lsr r6, r6, #16\n\t"
  35937. "lsr r7, r7, #16\n\t"
  35938. "mul r7, r6, r7\n\t"
  35939. "adds r5, r5, r7\n\t"
  35940. "adc r3, r3, #0\n\t"
  35941. "lsr r7, r8, #16\n\t"
  35942. "mul r6, r7, r6\n\t"
  35943. "lsr r7, r6, #16\n\t"
  35944. "lsl r6, r6, #16\n\t"
  35945. "adds r5, r5, r6\n\t"
  35946. "adc r3, r3, r7\n\t"
  35947. "lsr r6, %[b], #16\n\t"
  35948. "lsr r7, r8, #16\n\t"
  35949. "mul r7, r6, r7\n\t"
  35950. "add r3, r3, r7\n\t"
  35951. "lsl r7, r8, #16\n\t"
  35952. "lsr r7, r7, #16\n\t"
  35953. "mul r6, r7, r6\n\t"
  35954. "lsr r7, r6, #16\n\t"
  35955. "lsl r6, r6, #16\n\t"
  35956. "adds r5, r5, r6\n\t"
  35957. "adc r3, r3, r7\n\t"
  35958. #else
  35959. "umlal r5, r3, %[b], r8\n\t"
  35960. #endif
  35961. "stm %[r]!, {r5}\n\t"
  35962. "str r3, [%[r]]\n\t"
  35963. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  35964. :
  35965. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  35966. );
  35967. }
  35968. #endif /* WOLFSSL_SP_SMALL */
  35969. #ifdef WOLFSSL_SP_USE_UDIV
  35970. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  35971. *
  35972. * d1 The high order half of the number to divide.
  35973. * d0 The low order half of the number to divide.
  35974. * div The divisor.
  35975. * returns the result of the division.
  35976. *
  35977. * Note that this is an approximate div. It may give an answer 1 larger.
  35978. */
  35979. static sp_digit div_3072_word_48(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  35980. {
  35981. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  35982. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  35983. register sp_digit div asm ("r2") = (sp_digit)div_p;
  35984. __asm__ __volatile__ (
  35985. "lsr r6, %[div], #16\n\t"
  35986. "add lr, r6, #1\n\t"
  35987. "udiv r4, %[d1], lr\n\t"
  35988. "lsl r5, %[div], #16\n\t"
  35989. "lsl r4, r4, #16\n\t"
  35990. "umull r3, r12, %[div], r4\n\t"
  35991. "subs %[d0], %[d0], r3\n\t"
  35992. "sbc %[d1], %[d1], r12\n\t"
  35993. "subs r3, %[d1], lr\n\t"
  35994. "sbc r7, r7, r7\n\t"
  35995. "add r7, r7, #1\n\t"
  35996. "rsb r8, r7, #0\n\t"
  35997. "lsl r7, r7, #16\n\t"
  35998. "and r5, r5, r8\n\t"
  35999. "and r6, r6, r8\n\t"
  36000. "subs %[d0], %[d0], r5\n\t"
  36001. "add r4, r4, r7\n\t"
  36002. "sbc %[d1], %[d1], r6\n\t"
  36003. "lsl r12, %[d1], #16\n\t"
  36004. "lsr r3, %[d0], #16\n\t"
  36005. "orr r3, r3, r12\n\t"
  36006. "udiv r3, r3, lr\n\t"
  36007. "add r4, r4, r3\n\t"
  36008. "umull r3, r12, %[div], r3\n\t"
  36009. "subs %[d0], %[d0], r3\n\t"
  36010. "sbc %[d1], %[d1], r12\n\t"
  36011. "lsl r12, %[d1], #16\n\t"
  36012. "lsr r3, %[d0], #16\n\t"
  36013. "orr r3, r3, r12\n\t"
  36014. "udiv r3, r3, lr\n\t"
  36015. "add r4, r4, r3\n\t"
  36016. "mul r3, %[div], r3\n\t"
  36017. "sub %[d0], %[d0], r3\n\t"
  36018. "udiv r3, %[d0], %[div]\n\t"
  36019. "add %[d1], r4, r3\n\t"
  36020. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  36021. :
  36022. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  36023. );
  36024. return (uint32_t)(size_t)d1;
  36025. }
  36026. #else
  36027. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  36028. *
  36029. * d1 The high order half of the number to divide.
  36030. * d0 The low order half of the number to divide.
  36031. * div The divisor.
  36032. * returns the result of the division.
  36033. *
  36034. * Note that this is an approximate div. It may give an answer 1 larger.
  36035. */
  36036. static sp_digit div_3072_word_48(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  36037. {
  36038. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  36039. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  36040. register sp_digit div asm ("r2") = (sp_digit)div_p;
  36041. __asm__ __volatile__ (
  36042. "lsr lr, %[div], #1\n\t"
  36043. "add lr, lr, #1\n\t"
  36044. "mov r4, %[d0]\n\t"
  36045. "mov r5, %[d1]\n\t"
  36046. /* Do top 32 */
  36047. "subs r6, lr, r5\n\t"
  36048. "sbc r6, r6, r6\n\t"
  36049. "mov r3, #0\n\t"
  36050. "sub r3, r3, r6\n\t"
  36051. "and r6, r6, lr\n\t"
  36052. "subs r5, r5, r6\n\t"
  36053. /* Next 30 bits */
  36054. "mov r12, #29\n\t"
  36055. "\n"
  36056. "L_div_3072_word_48_bit_%=: \n\t"
  36057. "lsls r4, r4, #1\n\t"
  36058. "adc r5, r5, r5\n\t"
  36059. "subs r6, lr, r5\n\t"
  36060. "sbc r6, r6, r6\n\t"
  36061. "add r3, r3, r3\n\t"
  36062. "sub r3, r3, r6\n\t"
  36063. "and r6, r6, lr\n\t"
  36064. "subs r5, r5, r6\n\t"
  36065. "subs r12, r12, #1\n\t"
  36066. "bpl L_div_3072_word_48_bit_%=\n\t"
  36067. "add r3, r3, r3\n\t"
  36068. "add r3, r3, #1\n\t"
  36069. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  36070. "lsl r7, r3, #16\n\t"
  36071. "lsl r4, %[div], #16\n\t"
  36072. "lsr r7, r7, #16\n\t"
  36073. "lsr r4, r4, #16\n\t"
  36074. "mul r4, r7, r4\n\t"
  36075. "lsr r8, %[div], #16\n\t"
  36076. "mul r7, r8, r7\n\t"
  36077. "lsr r5, r7, #16\n\t"
  36078. "lsl r7, r7, #16\n\t"
  36079. "adds r4, r4, r7\n\t"
  36080. "adc r5, r5, #0\n\t"
  36081. "lsr r7, r3, #16\n\t"
  36082. "mul r8, r7, r8\n\t"
  36083. "add r5, r5, r8\n\t"
  36084. "lsl r8, %[div], #16\n\t"
  36085. "lsr r8, r8, #16\n\t"
  36086. "mul r7, r8, r7\n\t"
  36087. "lsr r8, r7, #16\n\t"
  36088. "lsl r7, r7, #16\n\t"
  36089. "adds r4, r4, r7\n\t"
  36090. "adc r5, r5, r8\n\t"
  36091. #else
  36092. "umull r4, r5, r3, %[div]\n\t"
  36093. #endif
  36094. "subs r7, %[d0], r4\n\t"
  36095. "sbc r8, %[d1], r5\n\t"
  36096. "add r3, r3, r8\n\t"
  36097. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  36098. "lsl r7, r3, #16\n\t"
  36099. "lsl r4, %[div], #16\n\t"
  36100. "lsr r7, r7, #16\n\t"
  36101. "lsr r4, r4, #16\n\t"
  36102. "mul r4, r7, r4\n\t"
  36103. "lsr r8, %[div], #16\n\t"
  36104. "mul r7, r8, r7\n\t"
  36105. "lsr r5, r7, #16\n\t"
  36106. "lsl r7, r7, #16\n\t"
  36107. "adds r4, r4, r7\n\t"
  36108. "adc r5, r5, #0\n\t"
  36109. "lsr r7, r3, #16\n\t"
  36110. "mul r8, r7, r8\n\t"
  36111. "add r5, r5, r8\n\t"
  36112. "lsl r8, %[div], #16\n\t"
  36113. "lsr r8, r8, #16\n\t"
  36114. "mul r7, r8, r7\n\t"
  36115. "lsr r8, r7, #16\n\t"
  36116. "lsl r7, r7, #16\n\t"
  36117. "adds r4, r4, r7\n\t"
  36118. "adc r5, r5, r8\n\t"
  36119. #else
  36120. "umull r4, r5, r3, %[div]\n\t"
  36121. #endif
  36122. "subs r7, %[d0], r4\n\t"
  36123. "sbc r8, %[d1], r5\n\t"
  36124. "add r3, r3, r8\n\t"
  36125. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  36126. "lsl r7, r3, #16\n\t"
  36127. "lsl r4, %[div], #16\n\t"
  36128. "lsr r7, r7, #16\n\t"
  36129. "lsr r4, r4, #16\n\t"
  36130. "mul r4, r7, r4\n\t"
  36131. "lsr r8, %[div], #16\n\t"
  36132. "mul r7, r8, r7\n\t"
  36133. "lsr r5, r7, #16\n\t"
  36134. "lsl r7, r7, #16\n\t"
  36135. "adds r4, r4, r7\n\t"
  36136. "adc r5, r5, #0\n\t"
  36137. "lsr r7, r3, #16\n\t"
  36138. "mul r8, r7, r8\n\t"
  36139. "add r5, r5, r8\n\t"
  36140. "lsl r8, %[div], #16\n\t"
  36141. "lsr r8, r8, #16\n\t"
  36142. "mul r7, r8, r7\n\t"
  36143. "lsr r8, r7, #16\n\t"
  36144. "lsl r7, r7, #16\n\t"
  36145. "adds r4, r4, r7\n\t"
  36146. "adc r5, r5, r8\n\t"
  36147. #else
  36148. "umull r4, r5, r3, %[div]\n\t"
  36149. #endif
  36150. "subs r7, %[d0], r4\n\t"
  36151. "sbc r8, %[d1], r5\n\t"
  36152. "add r3, r3, r8\n\t"
  36153. "subs r6, %[div], r7\n\t"
  36154. "sbc r6, r6, r6\n\t"
  36155. "sub %[d1], r3, r6\n\t"
  36156. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  36157. :
  36158. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  36159. );
  36160. return (uint32_t)(size_t)d1;
  36161. }
  36162. #endif
  36163. /* Compare a with b in constant time.
  36164. *
  36165. * a A single precision integer.
  36166. * b A single precision integer.
  36167. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  36168. * respectively.
  36169. */
  36170. static sp_int32 sp_3072_cmp_48(const sp_digit* a_p, const sp_digit* b_p)
  36171. {
  36172. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  36173. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  36174. __asm__ __volatile__ (
  36175. "mov r2, #-1\n\t"
  36176. "mov r6, #1\n\t"
  36177. "mov r5, #0\n\t"
  36178. "mov r3, #-1\n\t"
  36179. #ifdef WOLFSSL_SP_SMALL
  36180. "mov r4, #0xbc\n\t"
  36181. "\n"
  36182. "L_sp_3072_cmp_48_words_%=: \n\t"
  36183. "ldr r12, [%[a], r4]\n\t"
  36184. "ldr lr, [%[b], r4]\n\t"
  36185. "and r12, r12, r3\n\t"
  36186. "and lr, lr, r3\n\t"
  36187. "subs r12, r12, lr\n\t"
  36188. "it hi\n\t"
  36189. "movhi r2, r6\n\t"
  36190. "it lo\n\t"
  36191. "movlo r2, r3\n\t"
  36192. "it ne\n\t"
  36193. "movne r3, r5\n\t"
  36194. "subs r4, r4, #4\n\t"
  36195. "bcs L_sp_3072_cmp_48_words_%=\n\t"
  36196. "eor r2, r2, r3\n\t"
  36197. #else
  36198. "ldr r12, [%[a], #188]\n\t"
  36199. "ldr lr, [%[b], #188]\n\t"
  36200. "and r12, r12, r3\n\t"
  36201. "and lr, lr, r3\n\t"
  36202. "subs r12, r12, lr\n\t"
  36203. "it hi\n\t"
  36204. "movhi r2, r6\n\t"
  36205. "it lo\n\t"
  36206. "movlo r2, r3\n\t"
  36207. "it ne\n\t"
  36208. "movne r3, r5\n\t"
  36209. "ldr r12, [%[a], #184]\n\t"
  36210. "ldr lr, [%[b], #184]\n\t"
  36211. "and r12, r12, r3\n\t"
  36212. "and lr, lr, r3\n\t"
  36213. "subs r12, r12, lr\n\t"
  36214. "it hi\n\t"
  36215. "movhi r2, r6\n\t"
  36216. "it lo\n\t"
  36217. "movlo r2, r3\n\t"
  36218. "it ne\n\t"
  36219. "movne r3, r5\n\t"
  36220. "ldr r12, [%[a], #180]\n\t"
  36221. "ldr lr, [%[b], #180]\n\t"
  36222. "and r12, r12, r3\n\t"
  36223. "and lr, lr, r3\n\t"
  36224. "subs r12, r12, lr\n\t"
  36225. "it hi\n\t"
  36226. "movhi r2, r6\n\t"
  36227. "it lo\n\t"
  36228. "movlo r2, r3\n\t"
  36229. "it ne\n\t"
  36230. "movne r3, r5\n\t"
  36231. "ldr r12, [%[a], #176]\n\t"
  36232. "ldr lr, [%[b], #176]\n\t"
  36233. "and r12, r12, r3\n\t"
  36234. "and lr, lr, r3\n\t"
  36235. "subs r12, r12, lr\n\t"
  36236. "it hi\n\t"
  36237. "movhi r2, r6\n\t"
  36238. "it lo\n\t"
  36239. "movlo r2, r3\n\t"
  36240. "it ne\n\t"
  36241. "movne r3, r5\n\t"
  36242. "ldr r12, [%[a], #172]\n\t"
  36243. "ldr lr, [%[b], #172]\n\t"
  36244. "and r12, r12, r3\n\t"
  36245. "and lr, lr, r3\n\t"
  36246. "subs r12, r12, lr\n\t"
  36247. "it hi\n\t"
  36248. "movhi r2, r6\n\t"
  36249. "it lo\n\t"
  36250. "movlo r2, r3\n\t"
  36251. "it ne\n\t"
  36252. "movne r3, r5\n\t"
  36253. "ldr r12, [%[a], #168]\n\t"
  36254. "ldr lr, [%[b], #168]\n\t"
  36255. "and r12, r12, r3\n\t"
  36256. "and lr, lr, r3\n\t"
  36257. "subs r12, r12, lr\n\t"
  36258. "it hi\n\t"
  36259. "movhi r2, r6\n\t"
  36260. "it lo\n\t"
  36261. "movlo r2, r3\n\t"
  36262. "it ne\n\t"
  36263. "movne r3, r5\n\t"
  36264. "ldr r12, [%[a], #164]\n\t"
  36265. "ldr lr, [%[b], #164]\n\t"
  36266. "and r12, r12, r3\n\t"
  36267. "and lr, lr, r3\n\t"
  36268. "subs r12, r12, lr\n\t"
  36269. "it hi\n\t"
  36270. "movhi r2, r6\n\t"
  36271. "it lo\n\t"
  36272. "movlo r2, r3\n\t"
  36273. "it ne\n\t"
  36274. "movne r3, r5\n\t"
  36275. "ldr r12, [%[a], #160]\n\t"
  36276. "ldr lr, [%[b], #160]\n\t"
  36277. "and r12, r12, r3\n\t"
  36278. "and lr, lr, r3\n\t"
  36279. "subs r12, r12, lr\n\t"
  36280. "it hi\n\t"
  36281. "movhi r2, r6\n\t"
  36282. "it lo\n\t"
  36283. "movlo r2, r3\n\t"
  36284. "it ne\n\t"
  36285. "movne r3, r5\n\t"
  36286. "ldr r12, [%[a], #156]\n\t"
  36287. "ldr lr, [%[b], #156]\n\t"
  36288. "and r12, r12, r3\n\t"
  36289. "and lr, lr, r3\n\t"
  36290. "subs r12, r12, lr\n\t"
  36291. "it hi\n\t"
  36292. "movhi r2, r6\n\t"
  36293. "it lo\n\t"
  36294. "movlo r2, r3\n\t"
  36295. "it ne\n\t"
  36296. "movne r3, r5\n\t"
  36297. "ldr r12, [%[a], #152]\n\t"
  36298. "ldr lr, [%[b], #152]\n\t"
  36299. "and r12, r12, r3\n\t"
  36300. "and lr, lr, r3\n\t"
  36301. "subs r12, r12, lr\n\t"
  36302. "it hi\n\t"
  36303. "movhi r2, r6\n\t"
  36304. "it lo\n\t"
  36305. "movlo r2, r3\n\t"
  36306. "it ne\n\t"
  36307. "movne r3, r5\n\t"
  36308. "ldr r12, [%[a], #148]\n\t"
  36309. "ldr lr, [%[b], #148]\n\t"
  36310. "and r12, r12, r3\n\t"
  36311. "and lr, lr, r3\n\t"
  36312. "subs r12, r12, lr\n\t"
  36313. "it hi\n\t"
  36314. "movhi r2, r6\n\t"
  36315. "it lo\n\t"
  36316. "movlo r2, r3\n\t"
  36317. "it ne\n\t"
  36318. "movne r3, r5\n\t"
  36319. "ldr r12, [%[a], #144]\n\t"
  36320. "ldr lr, [%[b], #144]\n\t"
  36321. "and r12, r12, r3\n\t"
  36322. "and lr, lr, r3\n\t"
  36323. "subs r12, r12, lr\n\t"
  36324. "it hi\n\t"
  36325. "movhi r2, r6\n\t"
  36326. "it lo\n\t"
  36327. "movlo r2, r3\n\t"
  36328. "it ne\n\t"
  36329. "movne r3, r5\n\t"
  36330. "ldr r12, [%[a], #140]\n\t"
  36331. "ldr lr, [%[b], #140]\n\t"
  36332. "and r12, r12, r3\n\t"
  36333. "and lr, lr, r3\n\t"
  36334. "subs r12, r12, lr\n\t"
  36335. "it hi\n\t"
  36336. "movhi r2, r6\n\t"
  36337. "it lo\n\t"
  36338. "movlo r2, r3\n\t"
  36339. "it ne\n\t"
  36340. "movne r3, r5\n\t"
  36341. "ldr r12, [%[a], #136]\n\t"
  36342. "ldr lr, [%[b], #136]\n\t"
  36343. "and r12, r12, r3\n\t"
  36344. "and lr, lr, r3\n\t"
  36345. "subs r12, r12, lr\n\t"
  36346. "it hi\n\t"
  36347. "movhi r2, r6\n\t"
  36348. "it lo\n\t"
  36349. "movlo r2, r3\n\t"
  36350. "it ne\n\t"
  36351. "movne r3, r5\n\t"
  36352. "ldr r12, [%[a], #132]\n\t"
  36353. "ldr lr, [%[b], #132]\n\t"
  36354. "and r12, r12, r3\n\t"
  36355. "and lr, lr, r3\n\t"
  36356. "subs r12, r12, lr\n\t"
  36357. "it hi\n\t"
  36358. "movhi r2, r6\n\t"
  36359. "it lo\n\t"
  36360. "movlo r2, r3\n\t"
  36361. "it ne\n\t"
  36362. "movne r3, r5\n\t"
  36363. "ldr r12, [%[a], #128]\n\t"
  36364. "ldr lr, [%[b], #128]\n\t"
  36365. "and r12, r12, r3\n\t"
  36366. "and lr, lr, r3\n\t"
  36367. "subs r12, r12, lr\n\t"
  36368. "it hi\n\t"
  36369. "movhi r2, r6\n\t"
  36370. "it lo\n\t"
  36371. "movlo r2, r3\n\t"
  36372. "it ne\n\t"
  36373. "movne r3, r5\n\t"
  36374. "ldr r12, [%[a], #124]\n\t"
  36375. "ldr lr, [%[b], #124]\n\t"
  36376. "and r12, r12, r3\n\t"
  36377. "and lr, lr, r3\n\t"
  36378. "subs r12, r12, lr\n\t"
  36379. "it hi\n\t"
  36380. "movhi r2, r6\n\t"
  36381. "it lo\n\t"
  36382. "movlo r2, r3\n\t"
  36383. "it ne\n\t"
  36384. "movne r3, r5\n\t"
  36385. "ldr r12, [%[a], #120]\n\t"
  36386. "ldr lr, [%[b], #120]\n\t"
  36387. "and r12, r12, r3\n\t"
  36388. "and lr, lr, r3\n\t"
  36389. "subs r12, r12, lr\n\t"
  36390. "it hi\n\t"
  36391. "movhi r2, r6\n\t"
  36392. "it lo\n\t"
  36393. "movlo r2, r3\n\t"
  36394. "it ne\n\t"
  36395. "movne r3, r5\n\t"
  36396. "ldr r12, [%[a], #116]\n\t"
  36397. "ldr lr, [%[b], #116]\n\t"
  36398. "and r12, r12, r3\n\t"
  36399. "and lr, lr, r3\n\t"
  36400. "subs r12, r12, lr\n\t"
  36401. "it hi\n\t"
  36402. "movhi r2, r6\n\t"
  36403. "it lo\n\t"
  36404. "movlo r2, r3\n\t"
  36405. "it ne\n\t"
  36406. "movne r3, r5\n\t"
  36407. "ldr r12, [%[a], #112]\n\t"
  36408. "ldr lr, [%[b], #112]\n\t"
  36409. "and r12, r12, r3\n\t"
  36410. "and lr, lr, r3\n\t"
  36411. "subs r12, r12, lr\n\t"
  36412. "it hi\n\t"
  36413. "movhi r2, r6\n\t"
  36414. "it lo\n\t"
  36415. "movlo r2, r3\n\t"
  36416. "it ne\n\t"
  36417. "movne r3, r5\n\t"
  36418. "ldr r12, [%[a], #108]\n\t"
  36419. "ldr lr, [%[b], #108]\n\t"
  36420. "and r12, r12, r3\n\t"
  36421. "and lr, lr, r3\n\t"
  36422. "subs r12, r12, lr\n\t"
  36423. "it hi\n\t"
  36424. "movhi r2, r6\n\t"
  36425. "it lo\n\t"
  36426. "movlo r2, r3\n\t"
  36427. "it ne\n\t"
  36428. "movne r3, r5\n\t"
  36429. "ldr r12, [%[a], #104]\n\t"
  36430. "ldr lr, [%[b], #104]\n\t"
  36431. "and r12, r12, r3\n\t"
  36432. "and lr, lr, r3\n\t"
  36433. "subs r12, r12, lr\n\t"
  36434. "it hi\n\t"
  36435. "movhi r2, r6\n\t"
  36436. "it lo\n\t"
  36437. "movlo r2, r3\n\t"
  36438. "it ne\n\t"
  36439. "movne r3, r5\n\t"
  36440. "ldr r12, [%[a], #100]\n\t"
  36441. "ldr lr, [%[b], #100]\n\t"
  36442. "and r12, r12, r3\n\t"
  36443. "and lr, lr, r3\n\t"
  36444. "subs r12, r12, lr\n\t"
  36445. "it hi\n\t"
  36446. "movhi r2, r6\n\t"
  36447. "it lo\n\t"
  36448. "movlo r2, r3\n\t"
  36449. "it ne\n\t"
  36450. "movne r3, r5\n\t"
  36451. "ldr r12, [%[a], #96]\n\t"
  36452. "ldr lr, [%[b], #96]\n\t"
  36453. "and r12, r12, r3\n\t"
  36454. "and lr, lr, r3\n\t"
  36455. "subs r12, r12, lr\n\t"
  36456. "it hi\n\t"
  36457. "movhi r2, r6\n\t"
  36458. "it lo\n\t"
  36459. "movlo r2, r3\n\t"
  36460. "it ne\n\t"
  36461. "movne r3, r5\n\t"
  36462. "ldr r12, [%[a], #92]\n\t"
  36463. "ldr lr, [%[b], #92]\n\t"
  36464. "and r12, r12, r3\n\t"
  36465. "and lr, lr, r3\n\t"
  36466. "subs r12, r12, lr\n\t"
  36467. "it hi\n\t"
  36468. "movhi r2, r6\n\t"
  36469. "it lo\n\t"
  36470. "movlo r2, r3\n\t"
  36471. "it ne\n\t"
  36472. "movne r3, r5\n\t"
  36473. "ldr r12, [%[a], #88]\n\t"
  36474. "ldr lr, [%[b], #88]\n\t"
  36475. "and r12, r12, r3\n\t"
  36476. "and lr, lr, r3\n\t"
  36477. "subs r12, r12, lr\n\t"
  36478. "it hi\n\t"
  36479. "movhi r2, r6\n\t"
  36480. "it lo\n\t"
  36481. "movlo r2, r3\n\t"
  36482. "it ne\n\t"
  36483. "movne r3, r5\n\t"
  36484. "ldr r12, [%[a], #84]\n\t"
  36485. "ldr lr, [%[b], #84]\n\t"
  36486. "and r12, r12, r3\n\t"
  36487. "and lr, lr, r3\n\t"
  36488. "subs r12, r12, lr\n\t"
  36489. "it hi\n\t"
  36490. "movhi r2, r6\n\t"
  36491. "it lo\n\t"
  36492. "movlo r2, r3\n\t"
  36493. "it ne\n\t"
  36494. "movne r3, r5\n\t"
  36495. "ldr r12, [%[a], #80]\n\t"
  36496. "ldr lr, [%[b], #80]\n\t"
  36497. "and r12, r12, r3\n\t"
  36498. "and lr, lr, r3\n\t"
  36499. "subs r12, r12, lr\n\t"
  36500. "it hi\n\t"
  36501. "movhi r2, r6\n\t"
  36502. "it lo\n\t"
  36503. "movlo r2, r3\n\t"
  36504. "it ne\n\t"
  36505. "movne r3, r5\n\t"
  36506. "ldr r12, [%[a], #76]\n\t"
  36507. "ldr lr, [%[b], #76]\n\t"
  36508. "and r12, r12, r3\n\t"
  36509. "and lr, lr, r3\n\t"
  36510. "subs r12, r12, lr\n\t"
  36511. "it hi\n\t"
  36512. "movhi r2, r6\n\t"
  36513. "it lo\n\t"
  36514. "movlo r2, r3\n\t"
  36515. "it ne\n\t"
  36516. "movne r3, r5\n\t"
  36517. "ldr r12, [%[a], #72]\n\t"
  36518. "ldr lr, [%[b], #72]\n\t"
  36519. "and r12, r12, r3\n\t"
  36520. "and lr, lr, r3\n\t"
  36521. "subs r12, r12, lr\n\t"
  36522. "it hi\n\t"
  36523. "movhi r2, r6\n\t"
  36524. "it lo\n\t"
  36525. "movlo r2, r3\n\t"
  36526. "it ne\n\t"
  36527. "movne r3, r5\n\t"
  36528. "ldr r12, [%[a], #68]\n\t"
  36529. "ldr lr, [%[b], #68]\n\t"
  36530. "and r12, r12, r3\n\t"
  36531. "and lr, lr, r3\n\t"
  36532. "subs r12, r12, lr\n\t"
  36533. "it hi\n\t"
  36534. "movhi r2, r6\n\t"
  36535. "it lo\n\t"
  36536. "movlo r2, r3\n\t"
  36537. "it ne\n\t"
  36538. "movne r3, r5\n\t"
  36539. "ldr r12, [%[a], #64]\n\t"
  36540. "ldr lr, [%[b], #64]\n\t"
  36541. "and r12, r12, r3\n\t"
  36542. "and lr, lr, r3\n\t"
  36543. "subs r12, r12, lr\n\t"
  36544. "it hi\n\t"
  36545. "movhi r2, r6\n\t"
  36546. "it lo\n\t"
  36547. "movlo r2, r3\n\t"
  36548. "it ne\n\t"
  36549. "movne r3, r5\n\t"
  36550. "ldr r12, [%[a], #60]\n\t"
  36551. "ldr lr, [%[b], #60]\n\t"
  36552. "and r12, r12, r3\n\t"
  36553. "and lr, lr, r3\n\t"
  36554. "subs r12, r12, lr\n\t"
  36555. "it hi\n\t"
  36556. "movhi r2, r6\n\t"
  36557. "it lo\n\t"
  36558. "movlo r2, r3\n\t"
  36559. "it ne\n\t"
  36560. "movne r3, r5\n\t"
  36561. "ldr r12, [%[a], #56]\n\t"
  36562. "ldr lr, [%[b], #56]\n\t"
  36563. "and r12, r12, r3\n\t"
  36564. "and lr, lr, r3\n\t"
  36565. "subs r12, r12, lr\n\t"
  36566. "it hi\n\t"
  36567. "movhi r2, r6\n\t"
  36568. "it lo\n\t"
  36569. "movlo r2, r3\n\t"
  36570. "it ne\n\t"
  36571. "movne r3, r5\n\t"
  36572. "ldr r12, [%[a], #52]\n\t"
  36573. "ldr lr, [%[b], #52]\n\t"
  36574. "and r12, r12, r3\n\t"
  36575. "and lr, lr, r3\n\t"
  36576. "subs r12, r12, lr\n\t"
  36577. "it hi\n\t"
  36578. "movhi r2, r6\n\t"
  36579. "it lo\n\t"
  36580. "movlo r2, r3\n\t"
  36581. "it ne\n\t"
  36582. "movne r3, r5\n\t"
  36583. "ldr r12, [%[a], #48]\n\t"
  36584. "ldr lr, [%[b], #48]\n\t"
  36585. "and r12, r12, r3\n\t"
  36586. "and lr, lr, r3\n\t"
  36587. "subs r12, r12, lr\n\t"
  36588. "it hi\n\t"
  36589. "movhi r2, r6\n\t"
  36590. "it lo\n\t"
  36591. "movlo r2, r3\n\t"
  36592. "it ne\n\t"
  36593. "movne r3, r5\n\t"
  36594. "ldr r12, [%[a], #44]\n\t"
  36595. "ldr lr, [%[b], #44]\n\t"
  36596. "and r12, r12, r3\n\t"
  36597. "and lr, lr, r3\n\t"
  36598. "subs r12, r12, lr\n\t"
  36599. "it hi\n\t"
  36600. "movhi r2, r6\n\t"
  36601. "it lo\n\t"
  36602. "movlo r2, r3\n\t"
  36603. "it ne\n\t"
  36604. "movne r3, r5\n\t"
  36605. "ldr r12, [%[a], #40]\n\t"
  36606. "ldr lr, [%[b], #40]\n\t"
  36607. "and r12, r12, r3\n\t"
  36608. "and lr, lr, r3\n\t"
  36609. "subs r12, r12, lr\n\t"
  36610. "it hi\n\t"
  36611. "movhi r2, r6\n\t"
  36612. "it lo\n\t"
  36613. "movlo r2, r3\n\t"
  36614. "it ne\n\t"
  36615. "movne r3, r5\n\t"
  36616. "ldr r12, [%[a], #36]\n\t"
  36617. "ldr lr, [%[b], #36]\n\t"
  36618. "and r12, r12, r3\n\t"
  36619. "and lr, lr, r3\n\t"
  36620. "subs r12, r12, lr\n\t"
  36621. "it hi\n\t"
  36622. "movhi r2, r6\n\t"
  36623. "it lo\n\t"
  36624. "movlo r2, r3\n\t"
  36625. "it ne\n\t"
  36626. "movne r3, r5\n\t"
  36627. "ldr r12, [%[a], #32]\n\t"
  36628. "ldr lr, [%[b], #32]\n\t"
  36629. "and r12, r12, r3\n\t"
  36630. "and lr, lr, r3\n\t"
  36631. "subs r12, r12, lr\n\t"
  36632. "it hi\n\t"
  36633. "movhi r2, r6\n\t"
  36634. "it lo\n\t"
  36635. "movlo r2, r3\n\t"
  36636. "it ne\n\t"
  36637. "movne r3, r5\n\t"
  36638. "ldr r12, [%[a], #28]\n\t"
  36639. "ldr lr, [%[b], #28]\n\t"
  36640. "and r12, r12, r3\n\t"
  36641. "and lr, lr, r3\n\t"
  36642. "subs r12, r12, lr\n\t"
  36643. "it hi\n\t"
  36644. "movhi r2, r6\n\t"
  36645. "it lo\n\t"
  36646. "movlo r2, r3\n\t"
  36647. "it ne\n\t"
  36648. "movne r3, r5\n\t"
  36649. "ldr r12, [%[a], #24]\n\t"
  36650. "ldr lr, [%[b], #24]\n\t"
  36651. "and r12, r12, r3\n\t"
  36652. "and lr, lr, r3\n\t"
  36653. "subs r12, r12, lr\n\t"
  36654. "it hi\n\t"
  36655. "movhi r2, r6\n\t"
  36656. "it lo\n\t"
  36657. "movlo r2, r3\n\t"
  36658. "it ne\n\t"
  36659. "movne r3, r5\n\t"
  36660. "ldr r12, [%[a], #20]\n\t"
  36661. "ldr lr, [%[b], #20]\n\t"
  36662. "and r12, r12, r3\n\t"
  36663. "and lr, lr, r3\n\t"
  36664. "subs r12, r12, lr\n\t"
  36665. "it hi\n\t"
  36666. "movhi r2, r6\n\t"
  36667. "it lo\n\t"
  36668. "movlo r2, r3\n\t"
  36669. "it ne\n\t"
  36670. "movne r3, r5\n\t"
  36671. "ldr r12, [%[a], #16]\n\t"
  36672. "ldr lr, [%[b], #16]\n\t"
  36673. "and r12, r12, r3\n\t"
  36674. "and lr, lr, r3\n\t"
  36675. "subs r12, r12, lr\n\t"
  36676. "it hi\n\t"
  36677. "movhi r2, r6\n\t"
  36678. "it lo\n\t"
  36679. "movlo r2, r3\n\t"
  36680. "it ne\n\t"
  36681. "movne r3, r5\n\t"
  36682. "ldr r12, [%[a], #12]\n\t"
  36683. "ldr lr, [%[b], #12]\n\t"
  36684. "and r12, r12, r3\n\t"
  36685. "and lr, lr, r3\n\t"
  36686. "subs r12, r12, lr\n\t"
  36687. "it hi\n\t"
  36688. "movhi r2, r6\n\t"
  36689. "it lo\n\t"
  36690. "movlo r2, r3\n\t"
  36691. "it ne\n\t"
  36692. "movne r3, r5\n\t"
  36693. "ldr r12, [%[a], #8]\n\t"
  36694. "ldr lr, [%[b], #8]\n\t"
  36695. "and r12, r12, r3\n\t"
  36696. "and lr, lr, r3\n\t"
  36697. "subs r12, r12, lr\n\t"
  36698. "it hi\n\t"
  36699. "movhi r2, r6\n\t"
  36700. "it lo\n\t"
  36701. "movlo r2, r3\n\t"
  36702. "it ne\n\t"
  36703. "movne r3, r5\n\t"
  36704. "ldr r12, [%[a], #4]\n\t"
  36705. "ldr lr, [%[b], #4]\n\t"
  36706. "and r12, r12, r3\n\t"
  36707. "and lr, lr, r3\n\t"
  36708. "subs r12, r12, lr\n\t"
  36709. "it hi\n\t"
  36710. "movhi r2, r6\n\t"
  36711. "it lo\n\t"
  36712. "movlo r2, r3\n\t"
  36713. "it ne\n\t"
  36714. "movne r3, r5\n\t"
  36715. "ldr r12, [%[a]]\n\t"
  36716. "ldr lr, [%[b]]\n\t"
  36717. "and r12, r12, r3\n\t"
  36718. "and lr, lr, r3\n\t"
  36719. "subs r12, r12, lr\n\t"
  36720. "it hi\n\t"
  36721. "movhi r2, r6\n\t"
  36722. "it lo\n\t"
  36723. "movlo r2, r3\n\t"
  36724. "it ne\n\t"
  36725. "movne r3, r5\n\t"
  36726. "eor r2, r2, r3\n\t"
  36727. #endif /*WOLFSSL_SP_SMALL */
  36728. "mov %[a], r2\n\t"
  36729. : [a] "+r" (a), [b] "+r" (b)
  36730. :
  36731. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  36732. );
  36733. return (uint32_t)(size_t)a;
  36734. }
  36735. /* Divide d in a and put remainder into r (m*d + r = a)
  36736. * m is not calculated as it is not needed at this time.
  36737. *
  36738. * a Number to be divided.
  36739. * d Number to divide with.
  36740. * m Multiplier result.
  36741. * r Remainder from the division.
  36742. * returns MP_OKAY indicating success.
  36743. */
  36744. static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d,
  36745. sp_digit* m, sp_digit* r)
  36746. {
  36747. sp_digit t1[96], t2[49];
  36748. sp_digit div, r1;
  36749. int i;
  36750. (void)m;
  36751. div = d[47];
  36752. XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
  36753. r1 = sp_3072_cmp_48(&t1[48], d) >= 0;
  36754. sp_3072_cond_sub_48(&t1[48], &t1[48], d, (sp_digit)0 - r1);
  36755. for (i = 47; i >= 0; i--) {
  36756. volatile sp_digit mask = (sp_digit)0 - (t1[48 + i] == div);
  36757. sp_digit hi = t1[48 + i] + mask;
  36758. r1 = div_3072_word_48(hi, t1[48 + i - 1], div);
  36759. r1 |= mask;
  36760. sp_3072_mul_d_48(t2, d, r1);
  36761. t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
  36762. t1[48 + i] -= t2[48];
  36763. sp_3072_mask_48(t2, d, t1[48 + i]);
  36764. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  36765. sp_3072_mask_48(t2, d, t1[48 + i]);
  36766. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  36767. }
  36768. r1 = sp_3072_cmp_48(t1, d) >= 0;
  36769. sp_3072_cond_sub_48(r, t1, d, (sp_digit)0 - r1);
  36770. return MP_OKAY;
  36771. }
  36772. /* Reduce a modulo m into r. (r = a mod m)
  36773. *
  36774. * r A single precision number that is the reduced result.
  36775. * a A single precision number that is to be reduced.
  36776. * m A single precision number that is the modulus to reduce with.
  36777. * returns MP_OKAY indicating success.
  36778. */
  36779. static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a,
  36780. const sp_digit* m)
  36781. {
  36782. return sp_3072_div_48(a, m, NULL, r);
  36783. }
  36784. #ifdef WOLFSSL_SP_SMALL
  36785. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  36786. *
  36787. * r A single precision number that is the result of the operation.
  36788. * a A single precision number being exponentiated.
  36789. * e A single precision number that is the exponent.
  36790. * bits The number of bits in the exponent.
  36791. * m A single precision number that is the modulus.
  36792. * returns 0 on success.
  36793. * returns MEMORY_E on dynamic memory allocation failure.
  36794. * returns MP_VAL when base is even or exponent is 0.
  36795. */
  36796. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  36797. int bits, const sp_digit* m, int reduceA)
  36798. {
  36799. #ifdef WOLFSSL_SP_SMALL_STACK
  36800. sp_digit* td = NULL;
  36801. #else
  36802. sp_digit td[16 * 96];
  36803. #endif
  36804. sp_digit* t[16];
  36805. sp_digit* norm = NULL;
  36806. sp_digit mp = 1;
  36807. sp_digit n;
  36808. sp_digit mask;
  36809. int i;
  36810. int c;
  36811. byte y;
  36812. int err = MP_OKAY;
  36813. if (bits == 0) {
  36814. err = MP_VAL;
  36815. }
  36816. #ifdef WOLFSSL_SP_SMALL_STACK
  36817. if (err == MP_OKAY) {
  36818. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL,
  36819. DYNAMIC_TYPE_TMP_BUFFER);
  36820. if (td == NULL)
  36821. err = MEMORY_E;
  36822. }
  36823. #endif
  36824. if (err == MP_OKAY) {
  36825. norm = td;
  36826. for (i=0; i<16; i++) {
  36827. t[i] = td + i * 96;
  36828. }
  36829. sp_3072_mont_setup(m, &mp);
  36830. sp_3072_mont_norm_48(norm, m);
  36831. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  36832. if (reduceA != 0) {
  36833. err = sp_3072_mod_48(t[1] + 48, a, m);
  36834. if (err == MP_OKAY) {
  36835. err = sp_3072_mod_48(t[1], t[1], m);
  36836. }
  36837. }
  36838. else {
  36839. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  36840. err = sp_3072_mod_48(t[1], t[1], m);
  36841. }
  36842. }
  36843. if (err == MP_OKAY) {
  36844. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  36845. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  36846. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  36847. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  36848. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  36849. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  36850. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  36851. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  36852. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  36853. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  36854. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  36855. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  36856. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  36857. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  36858. i = (bits - 1) / 32;
  36859. n = e[i--];
  36860. c = bits & 31;
  36861. if (c == 0) {
  36862. c = 32;
  36863. }
  36864. c -= bits % 4;
  36865. if (c == 32) {
  36866. c = 28;
  36867. }
  36868. if (c < 0) {
  36869. /* Number of bits in top word is less than number needed. */
  36870. c = -c;
  36871. y = (byte)(n << c);
  36872. n = e[i--];
  36873. y |= (byte)(n >> (64 - c));
  36874. n <<= c;
  36875. c = 64 - c;
  36876. }
  36877. else if (c == 0) {
  36878. /* All bits in top word used. */
  36879. y = (byte)n;
  36880. }
  36881. else {
  36882. y = (byte)(n >> c);
  36883. n <<= 32 - c;
  36884. }
  36885. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  36886. for (; i>=0 || c>=4; ) {
  36887. if (c == 0) {
  36888. n = e[i--];
  36889. y = (byte)(n >> 28);
  36890. n <<= 4;
  36891. c = 28;
  36892. }
  36893. else if (c < 4) {
  36894. y = (byte)(n >> 28);
  36895. n = e[i--];
  36896. c = 4 - c;
  36897. y |= (byte)(n >> (32 - c));
  36898. n <<= c;
  36899. c = 32 - c;
  36900. }
  36901. else {
  36902. y = (byte)((n >> 28) & 0xf);
  36903. n <<= 4;
  36904. c -= 4;
  36905. }
  36906. sp_3072_mont_sqr_48(r, r, m, mp);
  36907. sp_3072_mont_sqr_48(r, r, m, mp);
  36908. sp_3072_mont_sqr_48(r, r, m, mp);
  36909. sp_3072_mont_sqr_48(r, r, m, mp);
  36910. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  36911. }
  36912. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  36913. sp_3072_mont_reduce_48(r, m, mp);
  36914. mask = (sp_digit)0 - (sp_3072_cmp_48(r, m) >= 0);
  36915. sp_3072_cond_sub_48(r, r, m, mask);
  36916. }
  36917. #ifdef WOLFSSL_SP_SMALL_STACK
  36918. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36919. #endif
  36920. return err;
  36921. }
  36922. #else
  36923. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  36924. *
  36925. * r A single precision number that is the result of the operation.
  36926. * a A single precision number being exponentiated.
  36927. * e A single precision number that is the exponent.
  36928. * bits The number of bits in the exponent.
  36929. * m A single precision number that is the modulus.
  36930. * returns 0 on success.
  36931. * returns MEMORY_E on dynamic memory allocation failure.
  36932. * returns MP_VAL when base is even or exponent is 0.
  36933. */
  36934. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  36935. int bits, const sp_digit* m, int reduceA)
  36936. {
  36937. #ifdef WOLFSSL_SP_SMALL_STACK
  36938. sp_digit* td = NULL;
  36939. #else
  36940. sp_digit td[32 * 96];
  36941. #endif
  36942. sp_digit* t[32];
  36943. sp_digit* norm = NULL;
  36944. sp_digit mp = 1;
  36945. sp_digit n;
  36946. sp_digit mask;
  36947. int i;
  36948. int c;
  36949. byte y;
  36950. int err = MP_OKAY;
  36951. if (bits == 0) {
  36952. err = MP_VAL;
  36953. }
  36954. #ifdef WOLFSSL_SP_SMALL_STACK
  36955. if (err == MP_OKAY) {
  36956. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL,
  36957. DYNAMIC_TYPE_TMP_BUFFER);
  36958. if (td == NULL)
  36959. err = MEMORY_E;
  36960. }
  36961. #endif
  36962. if (err == MP_OKAY) {
  36963. norm = td;
  36964. for (i=0; i<32; i++) {
  36965. t[i] = td + i * 96;
  36966. }
  36967. sp_3072_mont_setup(m, &mp);
  36968. sp_3072_mont_norm_48(norm, m);
  36969. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  36970. if (reduceA != 0) {
  36971. err = sp_3072_mod_48(t[1] + 48, a, m);
  36972. if (err == MP_OKAY) {
  36973. err = sp_3072_mod_48(t[1], t[1], m);
  36974. }
  36975. }
  36976. else {
  36977. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  36978. err = sp_3072_mod_48(t[1], t[1], m);
  36979. }
  36980. }
  36981. if (err == MP_OKAY) {
  36982. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  36983. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  36984. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  36985. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  36986. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  36987. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  36988. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  36989. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  36990. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  36991. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  36992. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  36993. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  36994. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  36995. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  36996. sp_3072_mont_sqr_48(t[16], t[ 8], m, mp);
  36997. sp_3072_mont_mul_48(t[17], t[ 9], t[ 8], m, mp);
  36998. sp_3072_mont_sqr_48(t[18], t[ 9], m, mp);
  36999. sp_3072_mont_mul_48(t[19], t[10], t[ 9], m, mp);
  37000. sp_3072_mont_sqr_48(t[20], t[10], m, mp);
  37001. sp_3072_mont_mul_48(t[21], t[11], t[10], m, mp);
  37002. sp_3072_mont_sqr_48(t[22], t[11], m, mp);
  37003. sp_3072_mont_mul_48(t[23], t[12], t[11], m, mp);
  37004. sp_3072_mont_sqr_48(t[24], t[12], m, mp);
  37005. sp_3072_mont_mul_48(t[25], t[13], t[12], m, mp);
  37006. sp_3072_mont_sqr_48(t[26], t[13], m, mp);
  37007. sp_3072_mont_mul_48(t[27], t[14], t[13], m, mp);
  37008. sp_3072_mont_sqr_48(t[28], t[14], m, mp);
  37009. sp_3072_mont_mul_48(t[29], t[15], t[14], m, mp);
  37010. sp_3072_mont_sqr_48(t[30], t[15], m, mp);
  37011. sp_3072_mont_mul_48(t[31], t[16], t[15], m, mp);
  37012. i = (bits - 1) / 32;
  37013. n = e[i--];
  37014. c = bits & 31;
  37015. if (c == 0) {
  37016. c = 32;
  37017. }
  37018. c -= bits % 5;
  37019. if (c == 32) {
  37020. c = 27;
  37021. }
  37022. if (c < 0) {
  37023. /* Number of bits in top word is less than number needed. */
  37024. c = -c;
  37025. y = (byte)(n << c);
  37026. n = e[i--];
  37027. y |= (byte)(n >> (64 - c));
  37028. n <<= c;
  37029. c = 64 - c;
  37030. }
  37031. else if (c == 0) {
  37032. /* All bits in top word used. */
  37033. y = (byte)n;
  37034. }
  37035. else {
  37036. y = (byte)(n >> c);
  37037. n <<= 32 - c;
  37038. }
  37039. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  37040. for (; i>=0 || c>=5; ) {
  37041. if (c == 0) {
  37042. n = e[i--];
  37043. y = (byte)(n >> 27);
  37044. n <<= 5;
  37045. c = 27;
  37046. }
  37047. else if (c < 5) {
  37048. y = (byte)(n >> 27);
  37049. n = e[i--];
  37050. c = 5 - c;
  37051. y |= (byte)(n >> (32 - c));
  37052. n <<= c;
  37053. c = 32 - c;
  37054. }
  37055. else {
  37056. y = (byte)((n >> 27) & 0x1f);
  37057. n <<= 5;
  37058. c -= 5;
  37059. }
  37060. sp_3072_mont_sqr_48(r, r, m, mp);
  37061. sp_3072_mont_sqr_48(r, r, m, mp);
  37062. sp_3072_mont_sqr_48(r, r, m, mp);
  37063. sp_3072_mont_sqr_48(r, r, m, mp);
  37064. sp_3072_mont_sqr_48(r, r, m, mp);
  37065. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  37066. }
  37067. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  37068. sp_3072_mont_reduce_48(r, m, mp);
  37069. mask = (sp_digit)0 - (sp_3072_cmp_48(r, m) >= 0);
  37070. sp_3072_cond_sub_48(r, r, m, mask);
  37071. }
  37072. #ifdef WOLFSSL_SP_SMALL_STACK
  37073. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37074. #endif
  37075. return err;
  37076. }
  37077. #endif /* WOLFSSL_SP_SMALL */
  37078. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  37079. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  37080. /* r = 2^n mod m where n is the number of bits to reduce by.
  37081. * Given m must be 3072 bits, just need to subtract.
  37082. *
  37083. * r A single precision number.
  37084. * m A single precision number.
  37085. */
  37086. static void sp_3072_mont_norm_96(sp_digit* r, const sp_digit* m)
  37087. {
  37088. XMEMSET(r, 0, sizeof(sp_digit) * 96);
  37089. /* r = 2^n mod m */
  37090. sp_3072_sub_in_place_96(r, m);
  37091. }
  37092. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  37093. #ifdef WOLFSSL_SP_SMALL
  37094. /* Conditionally subtract b from a using the mask m.
  37095. * m is -1 to subtract and 0 when not copying.
  37096. *
  37097. * r A single precision number representing condition subtract result.
  37098. * a A single precision number to subtract from.
  37099. * b A single precision number to subtract.
  37100. * m Mask value to apply.
  37101. */
  37102. 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)
  37103. {
  37104. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  37105. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  37106. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  37107. register sp_digit m asm ("r3") = (sp_digit)m_p;
  37108. __asm__ __volatile__ (
  37109. "mov r6, #0\n\t"
  37110. "mov r12, #0\n\t"
  37111. "mov lr, #0\n\t"
  37112. "\n"
  37113. "L_sp_3072_cond_sub_96_words_%=: \n\t"
  37114. "subs r12, r6, r12\n\t"
  37115. "ldr r4, [%[a], lr]\n\t"
  37116. "ldr r5, [%[b], lr]\n\t"
  37117. "and r5, r5, %[m]\n\t"
  37118. "sbcs r4, r4, r5\n\t"
  37119. "sbc r12, r6, r6\n\t"
  37120. "str r4, [%[r], lr]\n\t"
  37121. "add lr, lr, #4\n\t"
  37122. "cmp lr, #0x180\n\t"
  37123. "blt L_sp_3072_cond_sub_96_words_%=\n\t"
  37124. "mov %[r], r12\n\t"
  37125. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  37126. :
  37127. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  37128. );
  37129. return (uint32_t)(size_t)r;
  37130. }
  37131. #else
  37132. /* Conditionally subtract b from a using the mask m.
  37133. * m is -1 to subtract and 0 when not copying.
  37134. *
  37135. * r A single precision number representing condition subtract result.
  37136. * a A single precision number to subtract from.
  37137. * b A single precision number to subtract.
  37138. * m Mask value to apply.
  37139. */
  37140. 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)
  37141. {
  37142. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  37143. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  37144. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  37145. register sp_digit m asm ("r3") = (sp_digit)m_p;
  37146. __asm__ __volatile__ (
  37147. "mov lr, #0\n\t"
  37148. "ldm %[a]!, {r4, r5}\n\t"
  37149. "ldm %[b]!, {r6, r7}\n\t"
  37150. "and r6, r6, %[m]\n\t"
  37151. "and r7, r7, %[m]\n\t"
  37152. "subs r4, r4, r6\n\t"
  37153. "sbcs r5, r5, r7\n\t"
  37154. "stm %[r]!, {r4, r5}\n\t"
  37155. "ldm %[a]!, {r4, r5}\n\t"
  37156. "ldm %[b]!, {r6, r7}\n\t"
  37157. "and r6, r6, %[m]\n\t"
  37158. "and r7, r7, %[m]\n\t"
  37159. "sbcs r4, r4, r6\n\t"
  37160. "sbcs r5, r5, r7\n\t"
  37161. "stm %[r]!, {r4, r5}\n\t"
  37162. "ldm %[a]!, {r4, r5}\n\t"
  37163. "ldm %[b]!, {r6, r7}\n\t"
  37164. "and r6, r6, %[m]\n\t"
  37165. "and r7, r7, %[m]\n\t"
  37166. "sbcs r4, r4, r6\n\t"
  37167. "sbcs r5, r5, r7\n\t"
  37168. "stm %[r]!, {r4, r5}\n\t"
  37169. "ldm %[a]!, {r4, r5}\n\t"
  37170. "ldm %[b]!, {r6, r7}\n\t"
  37171. "and r6, r6, %[m]\n\t"
  37172. "and r7, r7, %[m]\n\t"
  37173. "sbcs r4, r4, r6\n\t"
  37174. "sbcs r5, r5, r7\n\t"
  37175. "stm %[r]!, {r4, r5}\n\t"
  37176. "ldm %[a]!, {r4, r5}\n\t"
  37177. "ldm %[b]!, {r6, r7}\n\t"
  37178. "and r6, r6, %[m]\n\t"
  37179. "and r7, r7, %[m]\n\t"
  37180. "sbcs r4, r4, r6\n\t"
  37181. "sbcs r5, r5, r7\n\t"
  37182. "stm %[r]!, {r4, r5}\n\t"
  37183. "ldm %[a]!, {r4, r5}\n\t"
  37184. "ldm %[b]!, {r6, r7}\n\t"
  37185. "and r6, r6, %[m]\n\t"
  37186. "and r7, r7, %[m]\n\t"
  37187. "sbcs r4, r4, r6\n\t"
  37188. "sbcs r5, r5, r7\n\t"
  37189. "stm %[r]!, {r4, r5}\n\t"
  37190. "ldm %[a]!, {r4, r5}\n\t"
  37191. "ldm %[b]!, {r6, r7}\n\t"
  37192. "and r6, r6, %[m]\n\t"
  37193. "and r7, r7, %[m]\n\t"
  37194. "sbcs r4, r4, r6\n\t"
  37195. "sbcs r5, r5, r7\n\t"
  37196. "stm %[r]!, {r4, r5}\n\t"
  37197. "ldm %[a]!, {r4, r5}\n\t"
  37198. "ldm %[b]!, {r6, r7}\n\t"
  37199. "and r6, r6, %[m]\n\t"
  37200. "and r7, r7, %[m]\n\t"
  37201. "sbcs r4, r4, r6\n\t"
  37202. "sbcs r5, r5, r7\n\t"
  37203. "stm %[r]!, {r4, r5}\n\t"
  37204. "ldm %[a]!, {r4, r5}\n\t"
  37205. "ldm %[b]!, {r6, r7}\n\t"
  37206. "and r6, r6, %[m]\n\t"
  37207. "and r7, r7, %[m]\n\t"
  37208. "sbcs r4, r4, r6\n\t"
  37209. "sbcs r5, r5, r7\n\t"
  37210. "stm %[r]!, {r4, r5}\n\t"
  37211. "ldm %[a]!, {r4, r5}\n\t"
  37212. "ldm %[b]!, {r6, r7}\n\t"
  37213. "and r6, r6, %[m]\n\t"
  37214. "and r7, r7, %[m]\n\t"
  37215. "sbcs r4, r4, r6\n\t"
  37216. "sbcs r5, r5, r7\n\t"
  37217. "stm %[r]!, {r4, r5}\n\t"
  37218. "ldm %[a]!, {r4, r5}\n\t"
  37219. "ldm %[b]!, {r6, r7}\n\t"
  37220. "and r6, r6, %[m]\n\t"
  37221. "and r7, r7, %[m]\n\t"
  37222. "sbcs r4, r4, r6\n\t"
  37223. "sbcs r5, r5, r7\n\t"
  37224. "stm %[r]!, {r4, r5}\n\t"
  37225. "ldm %[a]!, {r4, r5}\n\t"
  37226. "ldm %[b]!, {r6, r7}\n\t"
  37227. "and r6, r6, %[m]\n\t"
  37228. "and r7, r7, %[m]\n\t"
  37229. "sbcs r4, r4, r6\n\t"
  37230. "sbcs r5, r5, r7\n\t"
  37231. "stm %[r]!, {r4, r5}\n\t"
  37232. "ldm %[a]!, {r4, r5}\n\t"
  37233. "ldm %[b]!, {r6, r7}\n\t"
  37234. "and r6, r6, %[m]\n\t"
  37235. "and r7, r7, %[m]\n\t"
  37236. "sbcs r4, r4, r6\n\t"
  37237. "sbcs r5, r5, r7\n\t"
  37238. "stm %[r]!, {r4, r5}\n\t"
  37239. "ldm %[a]!, {r4, r5}\n\t"
  37240. "ldm %[b]!, {r6, r7}\n\t"
  37241. "and r6, r6, %[m]\n\t"
  37242. "and r7, r7, %[m]\n\t"
  37243. "sbcs r4, r4, r6\n\t"
  37244. "sbcs r5, r5, r7\n\t"
  37245. "stm %[r]!, {r4, r5}\n\t"
  37246. "ldm %[a]!, {r4, r5}\n\t"
  37247. "ldm %[b]!, {r6, r7}\n\t"
  37248. "and r6, r6, %[m]\n\t"
  37249. "and r7, r7, %[m]\n\t"
  37250. "sbcs r4, r4, r6\n\t"
  37251. "sbcs r5, r5, r7\n\t"
  37252. "stm %[r]!, {r4, r5}\n\t"
  37253. "ldm %[a]!, {r4, r5}\n\t"
  37254. "ldm %[b]!, {r6, r7}\n\t"
  37255. "and r6, r6, %[m]\n\t"
  37256. "and r7, r7, %[m]\n\t"
  37257. "sbcs r4, r4, r6\n\t"
  37258. "sbcs r5, r5, r7\n\t"
  37259. "stm %[r]!, {r4, r5}\n\t"
  37260. "ldm %[a]!, {r4, r5}\n\t"
  37261. "ldm %[b]!, {r6, r7}\n\t"
  37262. "and r6, r6, %[m]\n\t"
  37263. "and r7, r7, %[m]\n\t"
  37264. "sbcs r4, r4, r6\n\t"
  37265. "sbcs r5, r5, r7\n\t"
  37266. "stm %[r]!, {r4, r5}\n\t"
  37267. "ldm %[a]!, {r4, r5}\n\t"
  37268. "ldm %[b]!, {r6, r7}\n\t"
  37269. "and r6, r6, %[m]\n\t"
  37270. "and r7, r7, %[m]\n\t"
  37271. "sbcs r4, r4, r6\n\t"
  37272. "sbcs r5, r5, r7\n\t"
  37273. "stm %[r]!, {r4, r5}\n\t"
  37274. "ldm %[a]!, {r4, r5}\n\t"
  37275. "ldm %[b]!, {r6, r7}\n\t"
  37276. "and r6, r6, %[m]\n\t"
  37277. "and r7, r7, %[m]\n\t"
  37278. "sbcs r4, r4, r6\n\t"
  37279. "sbcs r5, r5, r7\n\t"
  37280. "stm %[r]!, {r4, r5}\n\t"
  37281. "ldm %[a]!, {r4, r5}\n\t"
  37282. "ldm %[b]!, {r6, r7}\n\t"
  37283. "and r6, r6, %[m]\n\t"
  37284. "and r7, r7, %[m]\n\t"
  37285. "sbcs r4, r4, r6\n\t"
  37286. "sbcs r5, r5, r7\n\t"
  37287. "stm %[r]!, {r4, r5}\n\t"
  37288. "ldm %[a]!, {r4, r5}\n\t"
  37289. "ldm %[b]!, {r6, r7}\n\t"
  37290. "and r6, r6, %[m]\n\t"
  37291. "and r7, r7, %[m]\n\t"
  37292. "sbcs r4, r4, r6\n\t"
  37293. "sbcs r5, r5, r7\n\t"
  37294. "stm %[r]!, {r4, r5}\n\t"
  37295. "ldm %[a]!, {r4, r5}\n\t"
  37296. "ldm %[b]!, {r6, r7}\n\t"
  37297. "and r6, r6, %[m]\n\t"
  37298. "and r7, r7, %[m]\n\t"
  37299. "sbcs r4, r4, r6\n\t"
  37300. "sbcs r5, r5, r7\n\t"
  37301. "stm %[r]!, {r4, r5}\n\t"
  37302. "ldm %[a]!, {r4, r5}\n\t"
  37303. "ldm %[b]!, {r6, r7}\n\t"
  37304. "and r6, r6, %[m]\n\t"
  37305. "and r7, r7, %[m]\n\t"
  37306. "sbcs r4, r4, r6\n\t"
  37307. "sbcs r5, r5, r7\n\t"
  37308. "stm %[r]!, {r4, r5}\n\t"
  37309. "ldm %[a]!, {r4, r5}\n\t"
  37310. "ldm %[b]!, {r6, r7}\n\t"
  37311. "and r6, r6, %[m]\n\t"
  37312. "and r7, r7, %[m]\n\t"
  37313. "sbcs r4, r4, r6\n\t"
  37314. "sbcs r5, r5, r7\n\t"
  37315. "stm %[r]!, {r4, r5}\n\t"
  37316. "ldm %[a]!, {r4, r5}\n\t"
  37317. "ldm %[b]!, {r6, r7}\n\t"
  37318. "and r6, r6, %[m]\n\t"
  37319. "and r7, r7, %[m]\n\t"
  37320. "sbcs r4, r4, r6\n\t"
  37321. "sbcs r5, r5, r7\n\t"
  37322. "stm %[r]!, {r4, r5}\n\t"
  37323. "ldm %[a]!, {r4, r5}\n\t"
  37324. "ldm %[b]!, {r6, r7}\n\t"
  37325. "and r6, r6, %[m]\n\t"
  37326. "and r7, r7, %[m]\n\t"
  37327. "sbcs r4, r4, r6\n\t"
  37328. "sbcs r5, r5, r7\n\t"
  37329. "stm %[r]!, {r4, r5}\n\t"
  37330. "ldm %[a]!, {r4, r5}\n\t"
  37331. "ldm %[b]!, {r6, r7}\n\t"
  37332. "and r6, r6, %[m]\n\t"
  37333. "and r7, r7, %[m]\n\t"
  37334. "sbcs r4, r4, r6\n\t"
  37335. "sbcs r5, r5, r7\n\t"
  37336. "stm %[r]!, {r4, r5}\n\t"
  37337. "ldm %[a]!, {r4, r5}\n\t"
  37338. "ldm %[b]!, {r6, r7}\n\t"
  37339. "and r6, r6, %[m]\n\t"
  37340. "and r7, r7, %[m]\n\t"
  37341. "sbcs r4, r4, r6\n\t"
  37342. "sbcs r5, r5, r7\n\t"
  37343. "stm %[r]!, {r4, r5}\n\t"
  37344. "ldm %[a]!, {r4, r5}\n\t"
  37345. "ldm %[b]!, {r6, r7}\n\t"
  37346. "and r6, r6, %[m]\n\t"
  37347. "and r7, r7, %[m]\n\t"
  37348. "sbcs r4, r4, r6\n\t"
  37349. "sbcs r5, r5, r7\n\t"
  37350. "stm %[r]!, {r4, r5}\n\t"
  37351. "ldm %[a]!, {r4, r5}\n\t"
  37352. "ldm %[b]!, {r6, r7}\n\t"
  37353. "and r6, r6, %[m]\n\t"
  37354. "and r7, r7, %[m]\n\t"
  37355. "sbcs r4, r4, r6\n\t"
  37356. "sbcs r5, r5, r7\n\t"
  37357. "stm %[r]!, {r4, r5}\n\t"
  37358. "ldm %[a]!, {r4, r5}\n\t"
  37359. "ldm %[b]!, {r6, r7}\n\t"
  37360. "and r6, r6, %[m]\n\t"
  37361. "and r7, r7, %[m]\n\t"
  37362. "sbcs r4, r4, r6\n\t"
  37363. "sbcs r5, r5, r7\n\t"
  37364. "stm %[r]!, {r4, r5}\n\t"
  37365. "ldm %[a]!, {r4, r5}\n\t"
  37366. "ldm %[b]!, {r6, r7}\n\t"
  37367. "and r6, r6, %[m]\n\t"
  37368. "and r7, r7, %[m]\n\t"
  37369. "sbcs r4, r4, r6\n\t"
  37370. "sbcs r5, r5, r7\n\t"
  37371. "stm %[r]!, {r4, r5}\n\t"
  37372. "ldm %[a]!, {r4, r5}\n\t"
  37373. "ldm %[b]!, {r6, r7}\n\t"
  37374. "and r6, r6, %[m]\n\t"
  37375. "and r7, r7, %[m]\n\t"
  37376. "sbcs r4, r4, r6\n\t"
  37377. "sbcs r5, r5, r7\n\t"
  37378. "stm %[r]!, {r4, r5}\n\t"
  37379. "ldm %[a]!, {r4, r5}\n\t"
  37380. "ldm %[b]!, {r6, r7}\n\t"
  37381. "and r6, r6, %[m]\n\t"
  37382. "and r7, r7, %[m]\n\t"
  37383. "sbcs r4, r4, r6\n\t"
  37384. "sbcs r5, r5, r7\n\t"
  37385. "stm %[r]!, {r4, r5}\n\t"
  37386. "ldm %[a]!, {r4, r5}\n\t"
  37387. "ldm %[b]!, {r6, r7}\n\t"
  37388. "and r6, r6, %[m]\n\t"
  37389. "and r7, r7, %[m]\n\t"
  37390. "sbcs r4, r4, r6\n\t"
  37391. "sbcs r5, r5, r7\n\t"
  37392. "stm %[r]!, {r4, r5}\n\t"
  37393. "ldm %[a]!, {r4, r5}\n\t"
  37394. "ldm %[b]!, {r6, r7}\n\t"
  37395. "and r6, r6, %[m]\n\t"
  37396. "and r7, r7, %[m]\n\t"
  37397. "sbcs r4, r4, r6\n\t"
  37398. "sbcs r5, r5, r7\n\t"
  37399. "stm %[r]!, {r4, r5}\n\t"
  37400. "ldm %[a]!, {r4, r5}\n\t"
  37401. "ldm %[b]!, {r6, r7}\n\t"
  37402. "and r6, r6, %[m]\n\t"
  37403. "and r7, r7, %[m]\n\t"
  37404. "sbcs r4, r4, r6\n\t"
  37405. "sbcs r5, r5, r7\n\t"
  37406. "stm %[r]!, {r4, r5}\n\t"
  37407. "ldm %[a]!, {r4, r5}\n\t"
  37408. "ldm %[b]!, {r6, r7}\n\t"
  37409. "and r6, r6, %[m]\n\t"
  37410. "and r7, r7, %[m]\n\t"
  37411. "sbcs r4, r4, r6\n\t"
  37412. "sbcs r5, r5, r7\n\t"
  37413. "stm %[r]!, {r4, r5}\n\t"
  37414. "ldm %[a]!, {r4, r5}\n\t"
  37415. "ldm %[b]!, {r6, r7}\n\t"
  37416. "and r6, r6, %[m]\n\t"
  37417. "and r7, r7, %[m]\n\t"
  37418. "sbcs r4, r4, r6\n\t"
  37419. "sbcs r5, r5, r7\n\t"
  37420. "stm %[r]!, {r4, r5}\n\t"
  37421. "ldm %[a]!, {r4, r5}\n\t"
  37422. "ldm %[b]!, {r6, r7}\n\t"
  37423. "and r6, r6, %[m]\n\t"
  37424. "and r7, r7, %[m]\n\t"
  37425. "sbcs r4, r4, r6\n\t"
  37426. "sbcs r5, r5, r7\n\t"
  37427. "stm %[r]!, {r4, r5}\n\t"
  37428. "ldm %[a]!, {r4, r5}\n\t"
  37429. "ldm %[b]!, {r6, r7}\n\t"
  37430. "and r6, r6, %[m]\n\t"
  37431. "and r7, r7, %[m]\n\t"
  37432. "sbcs r4, r4, r6\n\t"
  37433. "sbcs r5, r5, r7\n\t"
  37434. "stm %[r]!, {r4, r5}\n\t"
  37435. "ldm %[a]!, {r4, r5}\n\t"
  37436. "ldm %[b]!, {r6, r7}\n\t"
  37437. "and r6, r6, %[m]\n\t"
  37438. "and r7, r7, %[m]\n\t"
  37439. "sbcs r4, r4, r6\n\t"
  37440. "sbcs r5, r5, r7\n\t"
  37441. "stm %[r]!, {r4, r5}\n\t"
  37442. "ldm %[a]!, {r4, r5}\n\t"
  37443. "ldm %[b]!, {r6, r7}\n\t"
  37444. "and r6, r6, %[m]\n\t"
  37445. "and r7, r7, %[m]\n\t"
  37446. "sbcs r4, r4, r6\n\t"
  37447. "sbcs r5, r5, r7\n\t"
  37448. "stm %[r]!, {r4, r5}\n\t"
  37449. "ldm %[a]!, {r4, r5}\n\t"
  37450. "ldm %[b]!, {r6, r7}\n\t"
  37451. "and r6, r6, %[m]\n\t"
  37452. "and r7, r7, %[m]\n\t"
  37453. "sbcs r4, r4, r6\n\t"
  37454. "sbcs r5, r5, r7\n\t"
  37455. "stm %[r]!, {r4, r5}\n\t"
  37456. "ldm %[a]!, {r4, r5}\n\t"
  37457. "ldm %[b]!, {r6, r7}\n\t"
  37458. "and r6, r6, %[m]\n\t"
  37459. "and r7, r7, %[m]\n\t"
  37460. "sbcs r4, r4, r6\n\t"
  37461. "sbcs r5, r5, r7\n\t"
  37462. "stm %[r]!, {r4, r5}\n\t"
  37463. "ldm %[a]!, {r4, r5}\n\t"
  37464. "ldm %[b]!, {r6, r7}\n\t"
  37465. "and r6, r6, %[m]\n\t"
  37466. "and r7, r7, %[m]\n\t"
  37467. "sbcs r4, r4, r6\n\t"
  37468. "sbcs r5, r5, r7\n\t"
  37469. "stm %[r]!, {r4, r5}\n\t"
  37470. "ldm %[a]!, {r4, r5}\n\t"
  37471. "ldm %[b]!, {r6, r7}\n\t"
  37472. "and r6, r6, %[m]\n\t"
  37473. "and r7, r7, %[m]\n\t"
  37474. "sbcs r4, r4, r6\n\t"
  37475. "sbcs r5, r5, r7\n\t"
  37476. "stm %[r]!, {r4, r5}\n\t"
  37477. "ldm %[a]!, {r4, r5}\n\t"
  37478. "ldm %[b]!, {r6, r7}\n\t"
  37479. "and r6, r6, %[m]\n\t"
  37480. "and r7, r7, %[m]\n\t"
  37481. "sbcs r4, r4, r6\n\t"
  37482. "sbcs r5, r5, r7\n\t"
  37483. "stm %[r]!, {r4, r5}\n\t"
  37484. "sbc %[r], lr, lr\n\t"
  37485. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  37486. :
  37487. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  37488. );
  37489. return (uint32_t)(size_t)r;
  37490. }
  37491. #endif /* WOLFSSL_SP_SMALL */
  37492. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  37493. /* Reduce the number back to 3072 bits using Montgomery reduction.
  37494. *
  37495. * a A single precision number to reduce in place.
  37496. * m The single precision number representing the modulus.
  37497. * mp The digit representing the negative inverse of m mod 2^n.
  37498. */
  37499. static SP_NOINLINE void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  37500. {
  37501. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  37502. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  37503. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  37504. __asm__ __volatile__ (
  37505. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  37506. "ldr r11, [%[m]]\n\t"
  37507. #endif
  37508. /* i = 0 */
  37509. "mov r9, #0\n\t"
  37510. "mov r3, #0\n\t"
  37511. "ldr r12, [%[a]]\n\t"
  37512. "ldr lr, [%[a], #4]\n\t"
  37513. "\n"
  37514. "L_sp_3072_mont_reduce_96_word_%=: \n\t"
  37515. /* mu = a[i] * mp */
  37516. "mul r8, %[mp], r12\n\t"
  37517. /* a[i+0] += m[0] * mu */
  37518. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  37519. "ldr r11, [%[m]]\n\t"
  37520. #endif
  37521. "lsr r7, r11, #16\n\t"
  37522. "lsr r6, r8, #16\n\t"
  37523. "mul r5, r6, r7\n\t"
  37524. "lsl r7, r11, #16\n\t"
  37525. "lsr r7, r7, #16\n\t"
  37526. "mul r6, r7, r6\n\t"
  37527. "lsr r7, r6, #16\n\t"
  37528. "lsl r6, r6, #16\n\t"
  37529. "adds r12, r12, r6\n\t"
  37530. "adc r5, r5, r7\n\t"
  37531. "lsl r6, r8, #16\n\t"
  37532. "lsl r7, r11, #16\n\t"
  37533. "lsr r6, r6, #16\n\t"
  37534. "lsr r7, r7, #16\n\t"
  37535. "mul r7, r6, r7\n\t"
  37536. "adds r12, r12, r7\n\t"
  37537. "adc r5, r5, #0\n\t"
  37538. "lsr r7, r11, #16\n\t"
  37539. "mul r6, r7, r6\n\t"
  37540. "lsr r7, r6, #16\n\t"
  37541. "lsl r6, r6, #16\n\t"
  37542. "adds r12, r12, r6\n\t"
  37543. "adc r5, r5, r7\n\t"
  37544. /* a[i+1] += m[1] * mu */
  37545. "ldr r7, [%[m], #4]\n\t"
  37546. "lsr r10, r7, #16\n\t"
  37547. "lsr r6, r8, #16\n\t"
  37548. "mul r4, r6, r10\n\t"
  37549. "lsl r10, r7, #16\n\t"
  37550. "lsr r10, r10, #16\n\t"
  37551. "mul r6, r10, r6\n\t"
  37552. "lsr r10, r6, #16\n\t"
  37553. "lsl r6, r6, #16\n\t"
  37554. "adds lr, lr, r6\n\t"
  37555. "adc r4, r4, r10\n\t"
  37556. "lsl r6, r8, #16\n\t"
  37557. "lsl r10, r7, #16\n\t"
  37558. "lsr r6, r6, #16\n\t"
  37559. "lsr r10, r10, #16\n\t"
  37560. "mul r10, r6, r10\n\t"
  37561. "adds lr, lr, r10\n\t"
  37562. "adc r4, r4, #0\n\t"
  37563. "lsr r10, r7, #16\n\t"
  37564. "mul r6, r10, r6\n\t"
  37565. "lsr r10, r6, #16\n\t"
  37566. "lsl r6, r6, #16\n\t"
  37567. "adds lr, lr, r6\n\t"
  37568. "adc r4, r4, r10\n\t"
  37569. "mov r12, lr\n\t"
  37570. "adds r12, r12, r5\n\t"
  37571. "adc r4, r4, #0\n\t"
  37572. /* a[i+2] += m[2] * mu */
  37573. "ldr r7, [%[m], #8]\n\t"
  37574. "ldr lr, [%[a], #8]\n\t"
  37575. "lsr r10, r7, #16\n\t"
  37576. "lsr r6, r8, #16\n\t"
  37577. "mul r5, r6, r10\n\t"
  37578. "lsl r10, r7, #16\n\t"
  37579. "lsr r10, r10, #16\n\t"
  37580. "mul r6, r10, r6\n\t"
  37581. "lsr r10, r6, #16\n\t"
  37582. "lsl r6, r6, #16\n\t"
  37583. "adds lr, lr, r6\n\t"
  37584. "adc r5, r5, r10\n\t"
  37585. "lsl r6, r8, #16\n\t"
  37586. "lsl r10, r7, #16\n\t"
  37587. "lsr r6, r6, #16\n\t"
  37588. "lsr r10, r10, #16\n\t"
  37589. "mul r10, r6, r10\n\t"
  37590. "adds lr, lr, r10\n\t"
  37591. "adc r5, r5, #0\n\t"
  37592. "lsr r10, r7, #16\n\t"
  37593. "mul r6, r10, r6\n\t"
  37594. "lsr r10, r6, #16\n\t"
  37595. "lsl r6, r6, #16\n\t"
  37596. "adds lr, lr, r6\n\t"
  37597. "adc r5, r5, r10\n\t"
  37598. "adds lr, lr, r4\n\t"
  37599. "adc r5, r5, #0\n\t"
  37600. /* a[i+3] += m[3] * mu */
  37601. "ldr r7, [%[m], #12]\n\t"
  37602. "ldr r10, [%[a], #12]\n\t"
  37603. "lsr r11, r7, #16\n\t"
  37604. "lsr r6, r8, #16\n\t"
  37605. "mul r4, r6, r11\n\t"
  37606. "lsl r11, r7, #16\n\t"
  37607. "lsr r11, r11, #16\n\t"
  37608. "mul r6, r11, r6\n\t"
  37609. "lsr r11, r6, #16\n\t"
  37610. "lsl r6, r6, #16\n\t"
  37611. "adds r10, r10, r6\n\t"
  37612. "adc r4, r4, r11\n\t"
  37613. "lsl r6, r8, #16\n\t"
  37614. "lsl r11, r7, #16\n\t"
  37615. "lsr r6, r6, #16\n\t"
  37616. "lsr r11, r11, #16\n\t"
  37617. "mul r11, r6, r11\n\t"
  37618. "adds r10, r10, r11\n\t"
  37619. "adc r4, r4, #0\n\t"
  37620. "lsr r11, r7, #16\n\t"
  37621. "mul r6, r11, r6\n\t"
  37622. "lsr r11, r6, #16\n\t"
  37623. "lsl r6, r6, #16\n\t"
  37624. "adds r10, r10, r6\n\t"
  37625. "adc r4, r4, r11\n\t"
  37626. "adds r10, r10, r5\n\t"
  37627. "str r10, [%[a], #12]\n\t"
  37628. "adc r4, r4, #0\n\t"
  37629. /* a[i+4] += m[4] * mu */
  37630. "ldr r7, [%[m], #16]\n\t"
  37631. "ldr r10, [%[a], #16]\n\t"
  37632. "lsr r11, r7, #16\n\t"
  37633. "lsr r6, r8, #16\n\t"
  37634. "mul r5, r6, r11\n\t"
  37635. "lsl r11, r7, #16\n\t"
  37636. "lsr r11, r11, #16\n\t"
  37637. "mul r6, r11, r6\n\t"
  37638. "lsr r11, r6, #16\n\t"
  37639. "lsl r6, r6, #16\n\t"
  37640. "adds r10, r10, r6\n\t"
  37641. "adc r5, r5, r11\n\t"
  37642. "lsl r6, r8, #16\n\t"
  37643. "lsl r11, r7, #16\n\t"
  37644. "lsr r6, r6, #16\n\t"
  37645. "lsr r11, r11, #16\n\t"
  37646. "mul r11, r6, r11\n\t"
  37647. "adds r10, r10, r11\n\t"
  37648. "adc r5, r5, #0\n\t"
  37649. "lsr r11, r7, #16\n\t"
  37650. "mul r6, r11, r6\n\t"
  37651. "lsr r11, r6, #16\n\t"
  37652. "lsl r6, r6, #16\n\t"
  37653. "adds r10, r10, r6\n\t"
  37654. "adc r5, r5, r11\n\t"
  37655. "adds r10, r10, r4\n\t"
  37656. "str r10, [%[a], #16]\n\t"
  37657. "adc r5, r5, #0\n\t"
  37658. /* a[i+5] += m[5] * mu */
  37659. "ldr r7, [%[m], #20]\n\t"
  37660. "ldr r10, [%[a], #20]\n\t"
  37661. "lsr r11, r7, #16\n\t"
  37662. "lsr r6, r8, #16\n\t"
  37663. "mul r4, r6, r11\n\t"
  37664. "lsl r11, r7, #16\n\t"
  37665. "lsr r11, r11, #16\n\t"
  37666. "mul r6, r11, r6\n\t"
  37667. "lsr r11, r6, #16\n\t"
  37668. "lsl r6, r6, #16\n\t"
  37669. "adds r10, r10, r6\n\t"
  37670. "adc r4, r4, r11\n\t"
  37671. "lsl r6, r8, #16\n\t"
  37672. "lsl r11, r7, #16\n\t"
  37673. "lsr r6, r6, #16\n\t"
  37674. "lsr r11, r11, #16\n\t"
  37675. "mul r11, r6, r11\n\t"
  37676. "adds r10, r10, r11\n\t"
  37677. "adc r4, r4, #0\n\t"
  37678. "lsr r11, r7, #16\n\t"
  37679. "mul r6, r11, r6\n\t"
  37680. "lsr r11, r6, #16\n\t"
  37681. "lsl r6, r6, #16\n\t"
  37682. "adds r10, r10, r6\n\t"
  37683. "adc r4, r4, r11\n\t"
  37684. "adds r10, r10, r5\n\t"
  37685. "str r10, [%[a], #20]\n\t"
  37686. "adc r4, r4, #0\n\t"
  37687. /* a[i+6] += m[6] * mu */
  37688. "ldr r7, [%[m], #24]\n\t"
  37689. "ldr r10, [%[a], #24]\n\t"
  37690. "lsr r11, r7, #16\n\t"
  37691. "lsr r6, r8, #16\n\t"
  37692. "mul r5, r6, r11\n\t"
  37693. "lsl r11, r7, #16\n\t"
  37694. "lsr r11, r11, #16\n\t"
  37695. "mul r6, r11, r6\n\t"
  37696. "lsr r11, r6, #16\n\t"
  37697. "lsl r6, r6, #16\n\t"
  37698. "adds r10, r10, r6\n\t"
  37699. "adc r5, r5, r11\n\t"
  37700. "lsl r6, r8, #16\n\t"
  37701. "lsl r11, r7, #16\n\t"
  37702. "lsr r6, r6, #16\n\t"
  37703. "lsr r11, r11, #16\n\t"
  37704. "mul r11, r6, r11\n\t"
  37705. "adds r10, r10, r11\n\t"
  37706. "adc r5, r5, #0\n\t"
  37707. "lsr r11, r7, #16\n\t"
  37708. "mul r6, r11, r6\n\t"
  37709. "lsr r11, r6, #16\n\t"
  37710. "lsl r6, r6, #16\n\t"
  37711. "adds r10, r10, r6\n\t"
  37712. "adc r5, r5, r11\n\t"
  37713. "adds r10, r10, r4\n\t"
  37714. "str r10, [%[a], #24]\n\t"
  37715. "adc r5, r5, #0\n\t"
  37716. /* a[i+7] += m[7] * mu */
  37717. "ldr r7, [%[m], #28]\n\t"
  37718. "ldr r10, [%[a], #28]\n\t"
  37719. "lsr r11, r7, #16\n\t"
  37720. "lsr r6, r8, #16\n\t"
  37721. "mul r4, r6, r11\n\t"
  37722. "lsl r11, r7, #16\n\t"
  37723. "lsr r11, r11, #16\n\t"
  37724. "mul r6, r11, r6\n\t"
  37725. "lsr r11, r6, #16\n\t"
  37726. "lsl r6, r6, #16\n\t"
  37727. "adds r10, r10, r6\n\t"
  37728. "adc r4, r4, r11\n\t"
  37729. "lsl r6, r8, #16\n\t"
  37730. "lsl r11, r7, #16\n\t"
  37731. "lsr r6, r6, #16\n\t"
  37732. "lsr r11, r11, #16\n\t"
  37733. "mul r11, r6, r11\n\t"
  37734. "adds r10, r10, r11\n\t"
  37735. "adc r4, r4, #0\n\t"
  37736. "lsr r11, r7, #16\n\t"
  37737. "mul r6, r11, r6\n\t"
  37738. "lsr r11, r6, #16\n\t"
  37739. "lsl r6, r6, #16\n\t"
  37740. "adds r10, r10, r6\n\t"
  37741. "adc r4, r4, r11\n\t"
  37742. "adds r10, r10, r5\n\t"
  37743. "str r10, [%[a], #28]\n\t"
  37744. "adc r4, r4, #0\n\t"
  37745. /* a[i+8] += m[8] * mu */
  37746. "ldr r7, [%[m], #32]\n\t"
  37747. "ldr r10, [%[a], #32]\n\t"
  37748. "lsr r11, r7, #16\n\t"
  37749. "lsr r6, r8, #16\n\t"
  37750. "mul r5, r6, r11\n\t"
  37751. "lsl r11, r7, #16\n\t"
  37752. "lsr r11, r11, #16\n\t"
  37753. "mul r6, r11, r6\n\t"
  37754. "lsr r11, r6, #16\n\t"
  37755. "lsl r6, r6, #16\n\t"
  37756. "adds r10, r10, r6\n\t"
  37757. "adc r5, r5, r11\n\t"
  37758. "lsl r6, r8, #16\n\t"
  37759. "lsl r11, r7, #16\n\t"
  37760. "lsr r6, r6, #16\n\t"
  37761. "lsr r11, r11, #16\n\t"
  37762. "mul r11, r6, r11\n\t"
  37763. "adds r10, r10, r11\n\t"
  37764. "adc r5, r5, #0\n\t"
  37765. "lsr r11, r7, #16\n\t"
  37766. "mul r6, r11, r6\n\t"
  37767. "lsr r11, r6, #16\n\t"
  37768. "lsl r6, r6, #16\n\t"
  37769. "adds r10, r10, r6\n\t"
  37770. "adc r5, r5, r11\n\t"
  37771. "adds r10, r10, r4\n\t"
  37772. "str r10, [%[a], #32]\n\t"
  37773. "adc r5, r5, #0\n\t"
  37774. /* a[i+9] += m[9] * mu */
  37775. "ldr r7, [%[m], #36]\n\t"
  37776. "ldr r10, [%[a], #36]\n\t"
  37777. "lsr r11, r7, #16\n\t"
  37778. "lsr r6, r8, #16\n\t"
  37779. "mul r4, r6, r11\n\t"
  37780. "lsl r11, r7, #16\n\t"
  37781. "lsr r11, r11, #16\n\t"
  37782. "mul r6, r11, r6\n\t"
  37783. "lsr r11, r6, #16\n\t"
  37784. "lsl r6, r6, #16\n\t"
  37785. "adds r10, r10, r6\n\t"
  37786. "adc r4, r4, r11\n\t"
  37787. "lsl r6, r8, #16\n\t"
  37788. "lsl r11, r7, #16\n\t"
  37789. "lsr r6, r6, #16\n\t"
  37790. "lsr r11, r11, #16\n\t"
  37791. "mul r11, r6, r11\n\t"
  37792. "adds r10, r10, r11\n\t"
  37793. "adc r4, r4, #0\n\t"
  37794. "lsr r11, r7, #16\n\t"
  37795. "mul r6, r11, r6\n\t"
  37796. "lsr r11, r6, #16\n\t"
  37797. "lsl r6, r6, #16\n\t"
  37798. "adds r10, r10, r6\n\t"
  37799. "adc r4, r4, r11\n\t"
  37800. "adds r10, r10, r5\n\t"
  37801. "str r10, [%[a], #36]\n\t"
  37802. "adc r4, r4, #0\n\t"
  37803. /* a[i+10] += m[10] * mu */
  37804. "ldr r7, [%[m], #40]\n\t"
  37805. "ldr r10, [%[a], #40]\n\t"
  37806. "lsr r11, r7, #16\n\t"
  37807. "lsr r6, r8, #16\n\t"
  37808. "mul r5, r6, r11\n\t"
  37809. "lsl r11, r7, #16\n\t"
  37810. "lsr r11, r11, #16\n\t"
  37811. "mul r6, r11, r6\n\t"
  37812. "lsr r11, r6, #16\n\t"
  37813. "lsl r6, r6, #16\n\t"
  37814. "adds r10, r10, r6\n\t"
  37815. "adc r5, r5, r11\n\t"
  37816. "lsl r6, r8, #16\n\t"
  37817. "lsl r11, r7, #16\n\t"
  37818. "lsr r6, r6, #16\n\t"
  37819. "lsr r11, r11, #16\n\t"
  37820. "mul r11, r6, r11\n\t"
  37821. "adds r10, r10, r11\n\t"
  37822. "adc r5, r5, #0\n\t"
  37823. "lsr r11, r7, #16\n\t"
  37824. "mul r6, r11, r6\n\t"
  37825. "lsr r11, r6, #16\n\t"
  37826. "lsl r6, r6, #16\n\t"
  37827. "adds r10, r10, r6\n\t"
  37828. "adc r5, r5, r11\n\t"
  37829. "adds r10, r10, r4\n\t"
  37830. "str r10, [%[a], #40]\n\t"
  37831. "adc r5, r5, #0\n\t"
  37832. /* a[i+11] += m[11] * mu */
  37833. "ldr r7, [%[m], #44]\n\t"
  37834. "ldr r10, [%[a], #44]\n\t"
  37835. "lsr r11, r7, #16\n\t"
  37836. "lsr r6, r8, #16\n\t"
  37837. "mul r4, r6, r11\n\t"
  37838. "lsl r11, r7, #16\n\t"
  37839. "lsr r11, r11, #16\n\t"
  37840. "mul r6, r11, r6\n\t"
  37841. "lsr r11, r6, #16\n\t"
  37842. "lsl r6, r6, #16\n\t"
  37843. "adds r10, r10, r6\n\t"
  37844. "adc r4, r4, r11\n\t"
  37845. "lsl r6, r8, #16\n\t"
  37846. "lsl r11, r7, #16\n\t"
  37847. "lsr r6, r6, #16\n\t"
  37848. "lsr r11, r11, #16\n\t"
  37849. "mul r11, r6, r11\n\t"
  37850. "adds r10, r10, r11\n\t"
  37851. "adc r4, r4, #0\n\t"
  37852. "lsr r11, r7, #16\n\t"
  37853. "mul r6, r11, r6\n\t"
  37854. "lsr r11, r6, #16\n\t"
  37855. "lsl r6, r6, #16\n\t"
  37856. "adds r10, r10, r6\n\t"
  37857. "adc r4, r4, r11\n\t"
  37858. "adds r10, r10, r5\n\t"
  37859. "str r10, [%[a], #44]\n\t"
  37860. "adc r4, r4, #0\n\t"
  37861. /* a[i+12] += m[12] * mu */
  37862. "ldr r7, [%[m], #48]\n\t"
  37863. "ldr r10, [%[a], #48]\n\t"
  37864. "lsr r11, r7, #16\n\t"
  37865. "lsr r6, r8, #16\n\t"
  37866. "mul r5, r6, r11\n\t"
  37867. "lsl r11, r7, #16\n\t"
  37868. "lsr r11, r11, #16\n\t"
  37869. "mul r6, r11, r6\n\t"
  37870. "lsr r11, r6, #16\n\t"
  37871. "lsl r6, r6, #16\n\t"
  37872. "adds r10, r10, r6\n\t"
  37873. "adc r5, r5, r11\n\t"
  37874. "lsl r6, r8, #16\n\t"
  37875. "lsl r11, r7, #16\n\t"
  37876. "lsr r6, r6, #16\n\t"
  37877. "lsr r11, r11, #16\n\t"
  37878. "mul r11, r6, r11\n\t"
  37879. "adds r10, r10, r11\n\t"
  37880. "adc r5, r5, #0\n\t"
  37881. "lsr r11, r7, #16\n\t"
  37882. "mul r6, r11, r6\n\t"
  37883. "lsr r11, r6, #16\n\t"
  37884. "lsl r6, r6, #16\n\t"
  37885. "adds r10, r10, r6\n\t"
  37886. "adc r5, r5, r11\n\t"
  37887. "adds r10, r10, r4\n\t"
  37888. "str r10, [%[a], #48]\n\t"
  37889. "adc r5, r5, #0\n\t"
  37890. /* a[i+13] += m[13] * mu */
  37891. "ldr r7, [%[m], #52]\n\t"
  37892. "ldr r10, [%[a], #52]\n\t"
  37893. "lsr r11, r7, #16\n\t"
  37894. "lsr r6, r8, #16\n\t"
  37895. "mul r4, r6, r11\n\t"
  37896. "lsl r11, r7, #16\n\t"
  37897. "lsr r11, r11, #16\n\t"
  37898. "mul r6, r11, r6\n\t"
  37899. "lsr r11, r6, #16\n\t"
  37900. "lsl r6, r6, #16\n\t"
  37901. "adds r10, r10, r6\n\t"
  37902. "adc r4, r4, r11\n\t"
  37903. "lsl r6, r8, #16\n\t"
  37904. "lsl r11, r7, #16\n\t"
  37905. "lsr r6, r6, #16\n\t"
  37906. "lsr r11, r11, #16\n\t"
  37907. "mul r11, r6, r11\n\t"
  37908. "adds r10, r10, r11\n\t"
  37909. "adc r4, r4, #0\n\t"
  37910. "lsr r11, r7, #16\n\t"
  37911. "mul r6, r11, r6\n\t"
  37912. "lsr r11, r6, #16\n\t"
  37913. "lsl r6, r6, #16\n\t"
  37914. "adds r10, r10, r6\n\t"
  37915. "adc r4, r4, r11\n\t"
  37916. "adds r10, r10, r5\n\t"
  37917. "str r10, [%[a], #52]\n\t"
  37918. "adc r4, r4, #0\n\t"
  37919. /* a[i+14] += m[14] * mu */
  37920. "ldr r7, [%[m], #56]\n\t"
  37921. "ldr r10, [%[a], #56]\n\t"
  37922. "lsr r11, r7, #16\n\t"
  37923. "lsr r6, r8, #16\n\t"
  37924. "mul r5, r6, r11\n\t"
  37925. "lsl r11, r7, #16\n\t"
  37926. "lsr r11, r11, #16\n\t"
  37927. "mul r6, r11, r6\n\t"
  37928. "lsr r11, r6, #16\n\t"
  37929. "lsl r6, r6, #16\n\t"
  37930. "adds r10, r10, r6\n\t"
  37931. "adc r5, r5, r11\n\t"
  37932. "lsl r6, r8, #16\n\t"
  37933. "lsl r11, r7, #16\n\t"
  37934. "lsr r6, r6, #16\n\t"
  37935. "lsr r11, r11, #16\n\t"
  37936. "mul r11, r6, r11\n\t"
  37937. "adds r10, r10, r11\n\t"
  37938. "adc r5, r5, #0\n\t"
  37939. "lsr r11, r7, #16\n\t"
  37940. "mul r6, r11, r6\n\t"
  37941. "lsr r11, r6, #16\n\t"
  37942. "lsl r6, r6, #16\n\t"
  37943. "adds r10, r10, r6\n\t"
  37944. "adc r5, r5, r11\n\t"
  37945. "adds r10, r10, r4\n\t"
  37946. "str r10, [%[a], #56]\n\t"
  37947. "adc r5, r5, #0\n\t"
  37948. /* a[i+15] += m[15] * mu */
  37949. "ldr r7, [%[m], #60]\n\t"
  37950. "ldr r10, [%[a], #60]\n\t"
  37951. "lsr r11, r7, #16\n\t"
  37952. "lsr r6, r8, #16\n\t"
  37953. "mul r4, r6, r11\n\t"
  37954. "lsl r11, r7, #16\n\t"
  37955. "lsr r11, r11, #16\n\t"
  37956. "mul r6, r11, r6\n\t"
  37957. "lsr r11, r6, #16\n\t"
  37958. "lsl r6, r6, #16\n\t"
  37959. "adds r10, r10, r6\n\t"
  37960. "adc r4, r4, r11\n\t"
  37961. "lsl r6, r8, #16\n\t"
  37962. "lsl r11, r7, #16\n\t"
  37963. "lsr r6, r6, #16\n\t"
  37964. "lsr r11, r11, #16\n\t"
  37965. "mul r11, r6, r11\n\t"
  37966. "adds r10, r10, r11\n\t"
  37967. "adc r4, r4, #0\n\t"
  37968. "lsr r11, r7, #16\n\t"
  37969. "mul r6, r11, r6\n\t"
  37970. "lsr r11, r6, #16\n\t"
  37971. "lsl r6, r6, #16\n\t"
  37972. "adds r10, r10, r6\n\t"
  37973. "adc r4, r4, r11\n\t"
  37974. "adds r10, r10, r5\n\t"
  37975. "str r10, [%[a], #60]\n\t"
  37976. "adc r4, r4, #0\n\t"
  37977. /* a[i+16] += m[16] * mu */
  37978. "ldr r7, [%[m], #64]\n\t"
  37979. "ldr r10, [%[a], #64]\n\t"
  37980. "lsr r11, r7, #16\n\t"
  37981. "lsr r6, r8, #16\n\t"
  37982. "mul r5, r6, r11\n\t"
  37983. "lsl r11, r7, #16\n\t"
  37984. "lsr r11, r11, #16\n\t"
  37985. "mul r6, r11, r6\n\t"
  37986. "lsr r11, r6, #16\n\t"
  37987. "lsl r6, r6, #16\n\t"
  37988. "adds r10, r10, r6\n\t"
  37989. "adc r5, r5, r11\n\t"
  37990. "lsl r6, r8, #16\n\t"
  37991. "lsl r11, r7, #16\n\t"
  37992. "lsr r6, r6, #16\n\t"
  37993. "lsr r11, r11, #16\n\t"
  37994. "mul r11, r6, r11\n\t"
  37995. "adds r10, r10, r11\n\t"
  37996. "adc r5, r5, #0\n\t"
  37997. "lsr r11, r7, #16\n\t"
  37998. "mul r6, r11, r6\n\t"
  37999. "lsr r11, r6, #16\n\t"
  38000. "lsl r6, r6, #16\n\t"
  38001. "adds r10, r10, r6\n\t"
  38002. "adc r5, r5, r11\n\t"
  38003. "adds r10, r10, r4\n\t"
  38004. "str r10, [%[a], #64]\n\t"
  38005. "adc r5, r5, #0\n\t"
  38006. /* a[i+17] += m[17] * mu */
  38007. "ldr r7, [%[m], #68]\n\t"
  38008. "ldr r10, [%[a], #68]\n\t"
  38009. "lsr r11, r7, #16\n\t"
  38010. "lsr r6, r8, #16\n\t"
  38011. "mul r4, r6, r11\n\t"
  38012. "lsl r11, r7, #16\n\t"
  38013. "lsr r11, r11, #16\n\t"
  38014. "mul r6, r11, r6\n\t"
  38015. "lsr r11, r6, #16\n\t"
  38016. "lsl r6, r6, #16\n\t"
  38017. "adds r10, r10, r6\n\t"
  38018. "adc r4, r4, r11\n\t"
  38019. "lsl r6, r8, #16\n\t"
  38020. "lsl r11, r7, #16\n\t"
  38021. "lsr r6, r6, #16\n\t"
  38022. "lsr r11, r11, #16\n\t"
  38023. "mul r11, r6, r11\n\t"
  38024. "adds r10, r10, r11\n\t"
  38025. "adc r4, r4, #0\n\t"
  38026. "lsr r11, r7, #16\n\t"
  38027. "mul r6, r11, r6\n\t"
  38028. "lsr r11, r6, #16\n\t"
  38029. "lsl r6, r6, #16\n\t"
  38030. "adds r10, r10, r6\n\t"
  38031. "adc r4, r4, r11\n\t"
  38032. "adds r10, r10, r5\n\t"
  38033. "str r10, [%[a], #68]\n\t"
  38034. "adc r4, r4, #0\n\t"
  38035. /* a[i+18] += m[18] * mu */
  38036. "ldr r7, [%[m], #72]\n\t"
  38037. "ldr r10, [%[a], #72]\n\t"
  38038. "lsr r11, r7, #16\n\t"
  38039. "lsr r6, r8, #16\n\t"
  38040. "mul r5, r6, r11\n\t"
  38041. "lsl r11, r7, #16\n\t"
  38042. "lsr r11, r11, #16\n\t"
  38043. "mul r6, r11, r6\n\t"
  38044. "lsr r11, r6, #16\n\t"
  38045. "lsl r6, r6, #16\n\t"
  38046. "adds r10, r10, r6\n\t"
  38047. "adc r5, r5, r11\n\t"
  38048. "lsl r6, r8, #16\n\t"
  38049. "lsl r11, r7, #16\n\t"
  38050. "lsr r6, r6, #16\n\t"
  38051. "lsr r11, r11, #16\n\t"
  38052. "mul r11, r6, r11\n\t"
  38053. "adds r10, r10, r11\n\t"
  38054. "adc r5, r5, #0\n\t"
  38055. "lsr r11, r7, #16\n\t"
  38056. "mul r6, r11, r6\n\t"
  38057. "lsr r11, r6, #16\n\t"
  38058. "lsl r6, r6, #16\n\t"
  38059. "adds r10, r10, r6\n\t"
  38060. "adc r5, r5, r11\n\t"
  38061. "adds r10, r10, r4\n\t"
  38062. "str r10, [%[a], #72]\n\t"
  38063. "adc r5, r5, #0\n\t"
  38064. /* a[i+19] += m[19] * mu */
  38065. "ldr r7, [%[m], #76]\n\t"
  38066. "ldr r10, [%[a], #76]\n\t"
  38067. "lsr r11, r7, #16\n\t"
  38068. "lsr r6, r8, #16\n\t"
  38069. "mul r4, r6, r11\n\t"
  38070. "lsl r11, r7, #16\n\t"
  38071. "lsr r11, r11, #16\n\t"
  38072. "mul r6, r11, r6\n\t"
  38073. "lsr r11, r6, #16\n\t"
  38074. "lsl r6, r6, #16\n\t"
  38075. "adds r10, r10, r6\n\t"
  38076. "adc r4, r4, r11\n\t"
  38077. "lsl r6, r8, #16\n\t"
  38078. "lsl r11, r7, #16\n\t"
  38079. "lsr r6, r6, #16\n\t"
  38080. "lsr r11, r11, #16\n\t"
  38081. "mul r11, r6, r11\n\t"
  38082. "adds r10, r10, r11\n\t"
  38083. "adc r4, r4, #0\n\t"
  38084. "lsr r11, r7, #16\n\t"
  38085. "mul r6, r11, r6\n\t"
  38086. "lsr r11, r6, #16\n\t"
  38087. "lsl r6, r6, #16\n\t"
  38088. "adds r10, r10, r6\n\t"
  38089. "adc r4, r4, r11\n\t"
  38090. "adds r10, r10, r5\n\t"
  38091. "str r10, [%[a], #76]\n\t"
  38092. "adc r4, r4, #0\n\t"
  38093. /* a[i+20] += m[20] * mu */
  38094. "ldr r7, [%[m], #80]\n\t"
  38095. "ldr r10, [%[a], #80]\n\t"
  38096. "lsr r11, r7, #16\n\t"
  38097. "lsr r6, r8, #16\n\t"
  38098. "mul r5, r6, r11\n\t"
  38099. "lsl r11, r7, #16\n\t"
  38100. "lsr r11, r11, #16\n\t"
  38101. "mul r6, r11, r6\n\t"
  38102. "lsr r11, r6, #16\n\t"
  38103. "lsl r6, r6, #16\n\t"
  38104. "adds r10, r10, r6\n\t"
  38105. "adc r5, r5, r11\n\t"
  38106. "lsl r6, r8, #16\n\t"
  38107. "lsl r11, r7, #16\n\t"
  38108. "lsr r6, r6, #16\n\t"
  38109. "lsr r11, r11, #16\n\t"
  38110. "mul r11, r6, r11\n\t"
  38111. "adds r10, r10, r11\n\t"
  38112. "adc r5, r5, #0\n\t"
  38113. "lsr r11, r7, #16\n\t"
  38114. "mul r6, r11, r6\n\t"
  38115. "lsr r11, r6, #16\n\t"
  38116. "lsl r6, r6, #16\n\t"
  38117. "adds r10, r10, r6\n\t"
  38118. "adc r5, r5, r11\n\t"
  38119. "adds r10, r10, r4\n\t"
  38120. "str r10, [%[a], #80]\n\t"
  38121. "adc r5, r5, #0\n\t"
  38122. /* a[i+21] += m[21] * mu */
  38123. "ldr r7, [%[m], #84]\n\t"
  38124. "ldr r10, [%[a], #84]\n\t"
  38125. "lsr r11, r7, #16\n\t"
  38126. "lsr r6, r8, #16\n\t"
  38127. "mul r4, r6, r11\n\t"
  38128. "lsl r11, r7, #16\n\t"
  38129. "lsr r11, r11, #16\n\t"
  38130. "mul r6, r11, r6\n\t"
  38131. "lsr r11, r6, #16\n\t"
  38132. "lsl r6, r6, #16\n\t"
  38133. "adds r10, r10, r6\n\t"
  38134. "adc r4, r4, r11\n\t"
  38135. "lsl r6, r8, #16\n\t"
  38136. "lsl r11, r7, #16\n\t"
  38137. "lsr r6, r6, #16\n\t"
  38138. "lsr r11, r11, #16\n\t"
  38139. "mul r11, r6, r11\n\t"
  38140. "adds r10, r10, r11\n\t"
  38141. "adc r4, r4, #0\n\t"
  38142. "lsr r11, r7, #16\n\t"
  38143. "mul r6, r11, r6\n\t"
  38144. "lsr r11, r6, #16\n\t"
  38145. "lsl r6, r6, #16\n\t"
  38146. "adds r10, r10, r6\n\t"
  38147. "adc r4, r4, r11\n\t"
  38148. "adds r10, r10, r5\n\t"
  38149. "str r10, [%[a], #84]\n\t"
  38150. "adc r4, r4, #0\n\t"
  38151. /* a[i+22] += m[22] * mu */
  38152. "ldr r7, [%[m], #88]\n\t"
  38153. "ldr r10, [%[a], #88]\n\t"
  38154. "lsr r11, r7, #16\n\t"
  38155. "lsr r6, r8, #16\n\t"
  38156. "mul r5, r6, r11\n\t"
  38157. "lsl r11, r7, #16\n\t"
  38158. "lsr r11, r11, #16\n\t"
  38159. "mul r6, r11, r6\n\t"
  38160. "lsr r11, r6, #16\n\t"
  38161. "lsl r6, r6, #16\n\t"
  38162. "adds r10, r10, r6\n\t"
  38163. "adc r5, r5, r11\n\t"
  38164. "lsl r6, r8, #16\n\t"
  38165. "lsl r11, r7, #16\n\t"
  38166. "lsr r6, r6, #16\n\t"
  38167. "lsr r11, r11, #16\n\t"
  38168. "mul r11, r6, r11\n\t"
  38169. "adds r10, r10, r11\n\t"
  38170. "adc r5, r5, #0\n\t"
  38171. "lsr r11, r7, #16\n\t"
  38172. "mul r6, r11, r6\n\t"
  38173. "lsr r11, r6, #16\n\t"
  38174. "lsl r6, r6, #16\n\t"
  38175. "adds r10, r10, r6\n\t"
  38176. "adc r5, r5, r11\n\t"
  38177. "adds r10, r10, r4\n\t"
  38178. "str r10, [%[a], #88]\n\t"
  38179. "adc r5, r5, #0\n\t"
  38180. /* a[i+23] += m[23] * mu */
  38181. "ldr r7, [%[m], #92]\n\t"
  38182. "ldr r10, [%[a], #92]\n\t"
  38183. "lsr r11, r7, #16\n\t"
  38184. "lsr r6, r8, #16\n\t"
  38185. "mul r4, r6, r11\n\t"
  38186. "lsl r11, r7, #16\n\t"
  38187. "lsr r11, r11, #16\n\t"
  38188. "mul r6, r11, r6\n\t"
  38189. "lsr r11, r6, #16\n\t"
  38190. "lsl r6, r6, #16\n\t"
  38191. "adds r10, r10, r6\n\t"
  38192. "adc r4, r4, r11\n\t"
  38193. "lsl r6, r8, #16\n\t"
  38194. "lsl r11, r7, #16\n\t"
  38195. "lsr r6, r6, #16\n\t"
  38196. "lsr r11, r11, #16\n\t"
  38197. "mul r11, r6, r11\n\t"
  38198. "adds r10, r10, r11\n\t"
  38199. "adc r4, r4, #0\n\t"
  38200. "lsr r11, r7, #16\n\t"
  38201. "mul r6, r11, r6\n\t"
  38202. "lsr r11, r6, #16\n\t"
  38203. "lsl r6, r6, #16\n\t"
  38204. "adds r10, r10, r6\n\t"
  38205. "adc r4, r4, r11\n\t"
  38206. "adds r10, r10, r5\n\t"
  38207. "str r10, [%[a], #92]\n\t"
  38208. "adc r4, r4, #0\n\t"
  38209. /* a[i+24] += m[24] * mu */
  38210. "ldr r7, [%[m], #96]\n\t"
  38211. "ldr r10, [%[a], #96]\n\t"
  38212. "lsr r11, r7, #16\n\t"
  38213. "lsr r6, r8, #16\n\t"
  38214. "mul r5, r6, r11\n\t"
  38215. "lsl r11, r7, #16\n\t"
  38216. "lsr r11, r11, #16\n\t"
  38217. "mul r6, r11, r6\n\t"
  38218. "lsr r11, r6, #16\n\t"
  38219. "lsl r6, r6, #16\n\t"
  38220. "adds r10, r10, r6\n\t"
  38221. "adc r5, r5, r11\n\t"
  38222. "lsl r6, r8, #16\n\t"
  38223. "lsl r11, r7, #16\n\t"
  38224. "lsr r6, r6, #16\n\t"
  38225. "lsr r11, r11, #16\n\t"
  38226. "mul r11, r6, r11\n\t"
  38227. "adds r10, r10, r11\n\t"
  38228. "adc r5, r5, #0\n\t"
  38229. "lsr r11, r7, #16\n\t"
  38230. "mul r6, r11, r6\n\t"
  38231. "lsr r11, r6, #16\n\t"
  38232. "lsl r6, r6, #16\n\t"
  38233. "adds r10, r10, r6\n\t"
  38234. "adc r5, r5, r11\n\t"
  38235. "adds r10, r10, r4\n\t"
  38236. "str r10, [%[a], #96]\n\t"
  38237. "adc r5, r5, #0\n\t"
  38238. /* a[i+25] += m[25] * mu */
  38239. "ldr r7, [%[m], #100]\n\t"
  38240. "ldr r10, [%[a], #100]\n\t"
  38241. "lsr r11, r7, #16\n\t"
  38242. "lsr r6, r8, #16\n\t"
  38243. "mul r4, r6, r11\n\t"
  38244. "lsl r11, r7, #16\n\t"
  38245. "lsr r11, r11, #16\n\t"
  38246. "mul r6, r11, r6\n\t"
  38247. "lsr r11, r6, #16\n\t"
  38248. "lsl r6, r6, #16\n\t"
  38249. "adds r10, r10, r6\n\t"
  38250. "adc r4, r4, r11\n\t"
  38251. "lsl r6, r8, #16\n\t"
  38252. "lsl r11, r7, #16\n\t"
  38253. "lsr r6, r6, #16\n\t"
  38254. "lsr r11, r11, #16\n\t"
  38255. "mul r11, r6, r11\n\t"
  38256. "adds r10, r10, r11\n\t"
  38257. "adc r4, r4, #0\n\t"
  38258. "lsr r11, r7, #16\n\t"
  38259. "mul r6, r11, r6\n\t"
  38260. "lsr r11, r6, #16\n\t"
  38261. "lsl r6, r6, #16\n\t"
  38262. "adds r10, r10, r6\n\t"
  38263. "adc r4, r4, r11\n\t"
  38264. "adds r10, r10, r5\n\t"
  38265. "str r10, [%[a], #100]\n\t"
  38266. "adc r4, r4, #0\n\t"
  38267. /* a[i+26] += m[26] * mu */
  38268. "ldr r7, [%[m], #104]\n\t"
  38269. "ldr r10, [%[a], #104]\n\t"
  38270. "lsr r11, r7, #16\n\t"
  38271. "lsr r6, r8, #16\n\t"
  38272. "mul r5, r6, r11\n\t"
  38273. "lsl r11, r7, #16\n\t"
  38274. "lsr r11, r11, #16\n\t"
  38275. "mul r6, r11, r6\n\t"
  38276. "lsr r11, r6, #16\n\t"
  38277. "lsl r6, r6, #16\n\t"
  38278. "adds r10, r10, r6\n\t"
  38279. "adc r5, r5, r11\n\t"
  38280. "lsl r6, r8, #16\n\t"
  38281. "lsl r11, r7, #16\n\t"
  38282. "lsr r6, r6, #16\n\t"
  38283. "lsr r11, r11, #16\n\t"
  38284. "mul r11, r6, r11\n\t"
  38285. "adds r10, r10, r11\n\t"
  38286. "adc r5, r5, #0\n\t"
  38287. "lsr r11, r7, #16\n\t"
  38288. "mul r6, r11, r6\n\t"
  38289. "lsr r11, r6, #16\n\t"
  38290. "lsl r6, r6, #16\n\t"
  38291. "adds r10, r10, r6\n\t"
  38292. "adc r5, r5, r11\n\t"
  38293. "adds r10, r10, r4\n\t"
  38294. "str r10, [%[a], #104]\n\t"
  38295. "adc r5, r5, #0\n\t"
  38296. /* a[i+27] += m[27] * mu */
  38297. "ldr r7, [%[m], #108]\n\t"
  38298. "ldr r10, [%[a], #108]\n\t"
  38299. "lsr r11, r7, #16\n\t"
  38300. "lsr r6, r8, #16\n\t"
  38301. "mul r4, r6, r11\n\t"
  38302. "lsl r11, r7, #16\n\t"
  38303. "lsr r11, r11, #16\n\t"
  38304. "mul r6, r11, r6\n\t"
  38305. "lsr r11, r6, #16\n\t"
  38306. "lsl r6, r6, #16\n\t"
  38307. "adds r10, r10, r6\n\t"
  38308. "adc r4, r4, r11\n\t"
  38309. "lsl r6, r8, #16\n\t"
  38310. "lsl r11, r7, #16\n\t"
  38311. "lsr r6, r6, #16\n\t"
  38312. "lsr r11, r11, #16\n\t"
  38313. "mul r11, r6, r11\n\t"
  38314. "adds r10, r10, r11\n\t"
  38315. "adc r4, r4, #0\n\t"
  38316. "lsr r11, r7, #16\n\t"
  38317. "mul r6, r11, r6\n\t"
  38318. "lsr r11, r6, #16\n\t"
  38319. "lsl r6, r6, #16\n\t"
  38320. "adds r10, r10, r6\n\t"
  38321. "adc r4, r4, r11\n\t"
  38322. "adds r10, r10, r5\n\t"
  38323. "str r10, [%[a], #108]\n\t"
  38324. "adc r4, r4, #0\n\t"
  38325. /* a[i+28] += m[28] * mu */
  38326. "ldr r7, [%[m], #112]\n\t"
  38327. "ldr r10, [%[a], #112]\n\t"
  38328. "lsr r11, r7, #16\n\t"
  38329. "lsr r6, r8, #16\n\t"
  38330. "mul r5, r6, r11\n\t"
  38331. "lsl r11, r7, #16\n\t"
  38332. "lsr r11, r11, #16\n\t"
  38333. "mul r6, r11, r6\n\t"
  38334. "lsr r11, r6, #16\n\t"
  38335. "lsl r6, r6, #16\n\t"
  38336. "adds r10, r10, r6\n\t"
  38337. "adc r5, r5, r11\n\t"
  38338. "lsl r6, r8, #16\n\t"
  38339. "lsl r11, r7, #16\n\t"
  38340. "lsr r6, r6, #16\n\t"
  38341. "lsr r11, r11, #16\n\t"
  38342. "mul r11, r6, r11\n\t"
  38343. "adds r10, r10, r11\n\t"
  38344. "adc r5, r5, #0\n\t"
  38345. "lsr r11, r7, #16\n\t"
  38346. "mul r6, r11, r6\n\t"
  38347. "lsr r11, r6, #16\n\t"
  38348. "lsl r6, r6, #16\n\t"
  38349. "adds r10, r10, r6\n\t"
  38350. "adc r5, r5, r11\n\t"
  38351. "adds r10, r10, r4\n\t"
  38352. "str r10, [%[a], #112]\n\t"
  38353. "adc r5, r5, #0\n\t"
  38354. /* a[i+29] += m[29] * mu */
  38355. "ldr r7, [%[m], #116]\n\t"
  38356. "ldr r10, [%[a], #116]\n\t"
  38357. "lsr r11, r7, #16\n\t"
  38358. "lsr r6, r8, #16\n\t"
  38359. "mul r4, r6, r11\n\t"
  38360. "lsl r11, r7, #16\n\t"
  38361. "lsr r11, r11, #16\n\t"
  38362. "mul r6, r11, r6\n\t"
  38363. "lsr r11, r6, #16\n\t"
  38364. "lsl r6, r6, #16\n\t"
  38365. "adds r10, r10, r6\n\t"
  38366. "adc r4, r4, r11\n\t"
  38367. "lsl r6, r8, #16\n\t"
  38368. "lsl r11, r7, #16\n\t"
  38369. "lsr r6, r6, #16\n\t"
  38370. "lsr r11, r11, #16\n\t"
  38371. "mul r11, r6, r11\n\t"
  38372. "adds r10, r10, r11\n\t"
  38373. "adc r4, r4, #0\n\t"
  38374. "lsr r11, r7, #16\n\t"
  38375. "mul r6, r11, r6\n\t"
  38376. "lsr r11, r6, #16\n\t"
  38377. "lsl r6, r6, #16\n\t"
  38378. "adds r10, r10, r6\n\t"
  38379. "adc r4, r4, r11\n\t"
  38380. "adds r10, r10, r5\n\t"
  38381. "str r10, [%[a], #116]\n\t"
  38382. "adc r4, r4, #0\n\t"
  38383. /* a[i+30] += m[30] * mu */
  38384. "ldr r7, [%[m], #120]\n\t"
  38385. "ldr r10, [%[a], #120]\n\t"
  38386. "lsr r11, r7, #16\n\t"
  38387. "lsr r6, r8, #16\n\t"
  38388. "mul r5, r6, r11\n\t"
  38389. "lsl r11, r7, #16\n\t"
  38390. "lsr r11, r11, #16\n\t"
  38391. "mul r6, r11, r6\n\t"
  38392. "lsr r11, r6, #16\n\t"
  38393. "lsl r6, r6, #16\n\t"
  38394. "adds r10, r10, r6\n\t"
  38395. "adc r5, r5, r11\n\t"
  38396. "lsl r6, r8, #16\n\t"
  38397. "lsl r11, r7, #16\n\t"
  38398. "lsr r6, r6, #16\n\t"
  38399. "lsr r11, r11, #16\n\t"
  38400. "mul r11, r6, r11\n\t"
  38401. "adds r10, r10, r11\n\t"
  38402. "adc r5, r5, #0\n\t"
  38403. "lsr r11, r7, #16\n\t"
  38404. "mul r6, r11, r6\n\t"
  38405. "lsr r11, r6, #16\n\t"
  38406. "lsl r6, r6, #16\n\t"
  38407. "adds r10, r10, r6\n\t"
  38408. "adc r5, r5, r11\n\t"
  38409. "adds r10, r10, r4\n\t"
  38410. "str r10, [%[a], #120]\n\t"
  38411. "adc r5, r5, #0\n\t"
  38412. /* a[i+31] += m[31] * mu */
  38413. "ldr r7, [%[m], #124]\n\t"
  38414. "ldr r10, [%[a], #124]\n\t"
  38415. "lsr r11, r7, #16\n\t"
  38416. "lsr r6, r8, #16\n\t"
  38417. "mul r4, r6, r11\n\t"
  38418. "lsl r11, r7, #16\n\t"
  38419. "lsr r11, r11, #16\n\t"
  38420. "mul r6, r11, r6\n\t"
  38421. "lsr r11, r6, #16\n\t"
  38422. "lsl r6, r6, #16\n\t"
  38423. "adds r10, r10, r6\n\t"
  38424. "adc r4, r4, r11\n\t"
  38425. "lsl r6, r8, #16\n\t"
  38426. "lsl r11, r7, #16\n\t"
  38427. "lsr r6, r6, #16\n\t"
  38428. "lsr r11, r11, #16\n\t"
  38429. "mul r11, r6, r11\n\t"
  38430. "adds r10, r10, r11\n\t"
  38431. "adc r4, r4, #0\n\t"
  38432. "lsr r11, r7, #16\n\t"
  38433. "mul r6, r11, r6\n\t"
  38434. "lsr r11, r6, #16\n\t"
  38435. "lsl r6, r6, #16\n\t"
  38436. "adds r10, r10, r6\n\t"
  38437. "adc r4, r4, r11\n\t"
  38438. "adds r10, r10, r5\n\t"
  38439. "str r10, [%[a], #124]\n\t"
  38440. "adc r4, r4, #0\n\t"
  38441. /* a[i+32] += m[32] * mu */
  38442. "ldr r7, [%[m], #128]\n\t"
  38443. "ldr r10, [%[a], #128]\n\t"
  38444. "lsr r11, r7, #16\n\t"
  38445. "lsr r6, r8, #16\n\t"
  38446. "mul r5, r6, r11\n\t"
  38447. "lsl r11, r7, #16\n\t"
  38448. "lsr r11, r11, #16\n\t"
  38449. "mul r6, r11, r6\n\t"
  38450. "lsr r11, r6, #16\n\t"
  38451. "lsl r6, r6, #16\n\t"
  38452. "adds r10, r10, r6\n\t"
  38453. "adc r5, r5, r11\n\t"
  38454. "lsl r6, r8, #16\n\t"
  38455. "lsl r11, r7, #16\n\t"
  38456. "lsr r6, r6, #16\n\t"
  38457. "lsr r11, r11, #16\n\t"
  38458. "mul r11, r6, r11\n\t"
  38459. "adds r10, r10, r11\n\t"
  38460. "adc r5, r5, #0\n\t"
  38461. "lsr r11, r7, #16\n\t"
  38462. "mul r6, r11, r6\n\t"
  38463. "lsr r11, r6, #16\n\t"
  38464. "lsl r6, r6, #16\n\t"
  38465. "adds r10, r10, r6\n\t"
  38466. "adc r5, r5, r11\n\t"
  38467. "adds r10, r10, r4\n\t"
  38468. "str r10, [%[a], #128]\n\t"
  38469. "adc r5, r5, #0\n\t"
  38470. /* a[i+33] += m[33] * mu */
  38471. "ldr r7, [%[m], #132]\n\t"
  38472. "ldr r10, [%[a], #132]\n\t"
  38473. "lsr r11, r7, #16\n\t"
  38474. "lsr r6, r8, #16\n\t"
  38475. "mul r4, r6, r11\n\t"
  38476. "lsl r11, r7, #16\n\t"
  38477. "lsr r11, r11, #16\n\t"
  38478. "mul r6, r11, r6\n\t"
  38479. "lsr r11, r6, #16\n\t"
  38480. "lsl r6, r6, #16\n\t"
  38481. "adds r10, r10, r6\n\t"
  38482. "adc r4, r4, r11\n\t"
  38483. "lsl r6, r8, #16\n\t"
  38484. "lsl r11, r7, #16\n\t"
  38485. "lsr r6, r6, #16\n\t"
  38486. "lsr r11, r11, #16\n\t"
  38487. "mul r11, r6, r11\n\t"
  38488. "adds r10, r10, r11\n\t"
  38489. "adc r4, r4, #0\n\t"
  38490. "lsr r11, r7, #16\n\t"
  38491. "mul r6, r11, r6\n\t"
  38492. "lsr r11, r6, #16\n\t"
  38493. "lsl r6, r6, #16\n\t"
  38494. "adds r10, r10, r6\n\t"
  38495. "adc r4, r4, r11\n\t"
  38496. "adds r10, r10, r5\n\t"
  38497. "str r10, [%[a], #132]\n\t"
  38498. "adc r4, r4, #0\n\t"
  38499. /* a[i+34] += m[34] * mu */
  38500. "ldr r7, [%[m], #136]\n\t"
  38501. "ldr r10, [%[a], #136]\n\t"
  38502. "lsr r11, r7, #16\n\t"
  38503. "lsr r6, r8, #16\n\t"
  38504. "mul r5, r6, r11\n\t"
  38505. "lsl r11, r7, #16\n\t"
  38506. "lsr r11, r11, #16\n\t"
  38507. "mul r6, r11, r6\n\t"
  38508. "lsr r11, r6, #16\n\t"
  38509. "lsl r6, r6, #16\n\t"
  38510. "adds r10, r10, r6\n\t"
  38511. "adc r5, r5, r11\n\t"
  38512. "lsl r6, r8, #16\n\t"
  38513. "lsl r11, r7, #16\n\t"
  38514. "lsr r6, r6, #16\n\t"
  38515. "lsr r11, r11, #16\n\t"
  38516. "mul r11, r6, r11\n\t"
  38517. "adds r10, r10, r11\n\t"
  38518. "adc r5, r5, #0\n\t"
  38519. "lsr r11, r7, #16\n\t"
  38520. "mul r6, r11, r6\n\t"
  38521. "lsr r11, r6, #16\n\t"
  38522. "lsl r6, r6, #16\n\t"
  38523. "adds r10, r10, r6\n\t"
  38524. "adc r5, r5, r11\n\t"
  38525. "adds r10, r10, r4\n\t"
  38526. "str r10, [%[a], #136]\n\t"
  38527. "adc r5, r5, #0\n\t"
  38528. /* a[i+35] += m[35] * mu */
  38529. "ldr r7, [%[m], #140]\n\t"
  38530. "ldr r10, [%[a], #140]\n\t"
  38531. "lsr r11, r7, #16\n\t"
  38532. "lsr r6, r8, #16\n\t"
  38533. "mul r4, r6, r11\n\t"
  38534. "lsl r11, r7, #16\n\t"
  38535. "lsr r11, r11, #16\n\t"
  38536. "mul r6, r11, r6\n\t"
  38537. "lsr r11, r6, #16\n\t"
  38538. "lsl r6, r6, #16\n\t"
  38539. "adds r10, r10, r6\n\t"
  38540. "adc r4, r4, r11\n\t"
  38541. "lsl r6, r8, #16\n\t"
  38542. "lsl r11, r7, #16\n\t"
  38543. "lsr r6, r6, #16\n\t"
  38544. "lsr r11, r11, #16\n\t"
  38545. "mul r11, r6, r11\n\t"
  38546. "adds r10, r10, r11\n\t"
  38547. "adc r4, r4, #0\n\t"
  38548. "lsr r11, r7, #16\n\t"
  38549. "mul r6, r11, r6\n\t"
  38550. "lsr r11, r6, #16\n\t"
  38551. "lsl r6, r6, #16\n\t"
  38552. "adds r10, r10, r6\n\t"
  38553. "adc r4, r4, r11\n\t"
  38554. "adds r10, r10, r5\n\t"
  38555. "str r10, [%[a], #140]\n\t"
  38556. "adc r4, r4, #0\n\t"
  38557. /* a[i+36] += m[36] * mu */
  38558. "ldr r7, [%[m], #144]\n\t"
  38559. "ldr r10, [%[a], #144]\n\t"
  38560. "lsr r11, r7, #16\n\t"
  38561. "lsr r6, r8, #16\n\t"
  38562. "mul r5, r6, r11\n\t"
  38563. "lsl r11, r7, #16\n\t"
  38564. "lsr r11, r11, #16\n\t"
  38565. "mul r6, r11, r6\n\t"
  38566. "lsr r11, r6, #16\n\t"
  38567. "lsl r6, r6, #16\n\t"
  38568. "adds r10, r10, r6\n\t"
  38569. "adc r5, r5, r11\n\t"
  38570. "lsl r6, r8, #16\n\t"
  38571. "lsl r11, r7, #16\n\t"
  38572. "lsr r6, r6, #16\n\t"
  38573. "lsr r11, r11, #16\n\t"
  38574. "mul r11, r6, r11\n\t"
  38575. "adds r10, r10, r11\n\t"
  38576. "adc r5, r5, #0\n\t"
  38577. "lsr r11, r7, #16\n\t"
  38578. "mul r6, r11, r6\n\t"
  38579. "lsr r11, r6, #16\n\t"
  38580. "lsl r6, r6, #16\n\t"
  38581. "adds r10, r10, r6\n\t"
  38582. "adc r5, r5, r11\n\t"
  38583. "adds r10, r10, r4\n\t"
  38584. "str r10, [%[a], #144]\n\t"
  38585. "adc r5, r5, #0\n\t"
  38586. /* a[i+37] += m[37] * mu */
  38587. "ldr r7, [%[m], #148]\n\t"
  38588. "ldr r10, [%[a], #148]\n\t"
  38589. "lsr r11, r7, #16\n\t"
  38590. "lsr r6, r8, #16\n\t"
  38591. "mul r4, r6, r11\n\t"
  38592. "lsl r11, r7, #16\n\t"
  38593. "lsr r11, r11, #16\n\t"
  38594. "mul r6, r11, r6\n\t"
  38595. "lsr r11, r6, #16\n\t"
  38596. "lsl r6, r6, #16\n\t"
  38597. "adds r10, r10, r6\n\t"
  38598. "adc r4, r4, r11\n\t"
  38599. "lsl r6, r8, #16\n\t"
  38600. "lsl r11, r7, #16\n\t"
  38601. "lsr r6, r6, #16\n\t"
  38602. "lsr r11, r11, #16\n\t"
  38603. "mul r11, r6, r11\n\t"
  38604. "adds r10, r10, r11\n\t"
  38605. "adc r4, r4, #0\n\t"
  38606. "lsr r11, r7, #16\n\t"
  38607. "mul r6, r11, r6\n\t"
  38608. "lsr r11, r6, #16\n\t"
  38609. "lsl r6, r6, #16\n\t"
  38610. "adds r10, r10, r6\n\t"
  38611. "adc r4, r4, r11\n\t"
  38612. "adds r10, r10, r5\n\t"
  38613. "str r10, [%[a], #148]\n\t"
  38614. "adc r4, r4, #0\n\t"
  38615. /* a[i+38] += m[38] * mu */
  38616. "ldr r7, [%[m], #152]\n\t"
  38617. "ldr r10, [%[a], #152]\n\t"
  38618. "lsr r11, r7, #16\n\t"
  38619. "lsr r6, r8, #16\n\t"
  38620. "mul r5, r6, r11\n\t"
  38621. "lsl r11, r7, #16\n\t"
  38622. "lsr r11, r11, #16\n\t"
  38623. "mul r6, r11, r6\n\t"
  38624. "lsr r11, r6, #16\n\t"
  38625. "lsl r6, r6, #16\n\t"
  38626. "adds r10, r10, r6\n\t"
  38627. "adc r5, r5, r11\n\t"
  38628. "lsl r6, r8, #16\n\t"
  38629. "lsl r11, r7, #16\n\t"
  38630. "lsr r6, r6, #16\n\t"
  38631. "lsr r11, r11, #16\n\t"
  38632. "mul r11, r6, r11\n\t"
  38633. "adds r10, r10, r11\n\t"
  38634. "adc r5, r5, #0\n\t"
  38635. "lsr r11, r7, #16\n\t"
  38636. "mul r6, r11, r6\n\t"
  38637. "lsr r11, r6, #16\n\t"
  38638. "lsl r6, r6, #16\n\t"
  38639. "adds r10, r10, r6\n\t"
  38640. "adc r5, r5, r11\n\t"
  38641. "adds r10, r10, r4\n\t"
  38642. "str r10, [%[a], #152]\n\t"
  38643. "adc r5, r5, #0\n\t"
  38644. /* a[i+39] += m[39] * mu */
  38645. "ldr r7, [%[m], #156]\n\t"
  38646. "ldr r10, [%[a], #156]\n\t"
  38647. "lsr r11, r7, #16\n\t"
  38648. "lsr r6, r8, #16\n\t"
  38649. "mul r4, r6, r11\n\t"
  38650. "lsl r11, r7, #16\n\t"
  38651. "lsr r11, r11, #16\n\t"
  38652. "mul r6, r11, r6\n\t"
  38653. "lsr r11, r6, #16\n\t"
  38654. "lsl r6, r6, #16\n\t"
  38655. "adds r10, r10, r6\n\t"
  38656. "adc r4, r4, r11\n\t"
  38657. "lsl r6, r8, #16\n\t"
  38658. "lsl r11, r7, #16\n\t"
  38659. "lsr r6, r6, #16\n\t"
  38660. "lsr r11, r11, #16\n\t"
  38661. "mul r11, r6, r11\n\t"
  38662. "adds r10, r10, r11\n\t"
  38663. "adc r4, r4, #0\n\t"
  38664. "lsr r11, r7, #16\n\t"
  38665. "mul r6, r11, r6\n\t"
  38666. "lsr r11, r6, #16\n\t"
  38667. "lsl r6, r6, #16\n\t"
  38668. "adds r10, r10, r6\n\t"
  38669. "adc r4, r4, r11\n\t"
  38670. "adds r10, r10, r5\n\t"
  38671. "str r10, [%[a], #156]\n\t"
  38672. "adc r4, r4, #0\n\t"
  38673. /* a[i+40] += m[40] * mu */
  38674. "ldr r7, [%[m], #160]\n\t"
  38675. "ldr r10, [%[a], #160]\n\t"
  38676. "lsr r11, r7, #16\n\t"
  38677. "lsr r6, r8, #16\n\t"
  38678. "mul r5, r6, r11\n\t"
  38679. "lsl r11, r7, #16\n\t"
  38680. "lsr r11, r11, #16\n\t"
  38681. "mul r6, r11, r6\n\t"
  38682. "lsr r11, r6, #16\n\t"
  38683. "lsl r6, r6, #16\n\t"
  38684. "adds r10, r10, r6\n\t"
  38685. "adc r5, r5, r11\n\t"
  38686. "lsl r6, r8, #16\n\t"
  38687. "lsl r11, r7, #16\n\t"
  38688. "lsr r6, r6, #16\n\t"
  38689. "lsr r11, r11, #16\n\t"
  38690. "mul r11, r6, r11\n\t"
  38691. "adds r10, r10, r11\n\t"
  38692. "adc r5, r5, #0\n\t"
  38693. "lsr r11, r7, #16\n\t"
  38694. "mul r6, r11, r6\n\t"
  38695. "lsr r11, r6, #16\n\t"
  38696. "lsl r6, r6, #16\n\t"
  38697. "adds r10, r10, r6\n\t"
  38698. "adc r5, r5, r11\n\t"
  38699. "adds r10, r10, r4\n\t"
  38700. "str r10, [%[a], #160]\n\t"
  38701. "adc r5, r5, #0\n\t"
  38702. /* a[i+41] += m[41] * mu */
  38703. "ldr r7, [%[m], #164]\n\t"
  38704. "ldr r10, [%[a], #164]\n\t"
  38705. "lsr r11, r7, #16\n\t"
  38706. "lsr r6, r8, #16\n\t"
  38707. "mul r4, r6, r11\n\t"
  38708. "lsl r11, r7, #16\n\t"
  38709. "lsr r11, r11, #16\n\t"
  38710. "mul r6, r11, r6\n\t"
  38711. "lsr r11, r6, #16\n\t"
  38712. "lsl r6, r6, #16\n\t"
  38713. "adds r10, r10, r6\n\t"
  38714. "adc r4, r4, r11\n\t"
  38715. "lsl r6, r8, #16\n\t"
  38716. "lsl r11, r7, #16\n\t"
  38717. "lsr r6, r6, #16\n\t"
  38718. "lsr r11, r11, #16\n\t"
  38719. "mul r11, r6, r11\n\t"
  38720. "adds r10, r10, r11\n\t"
  38721. "adc r4, r4, #0\n\t"
  38722. "lsr r11, r7, #16\n\t"
  38723. "mul r6, r11, r6\n\t"
  38724. "lsr r11, r6, #16\n\t"
  38725. "lsl r6, r6, #16\n\t"
  38726. "adds r10, r10, r6\n\t"
  38727. "adc r4, r4, r11\n\t"
  38728. "adds r10, r10, r5\n\t"
  38729. "str r10, [%[a], #164]\n\t"
  38730. "adc r4, r4, #0\n\t"
  38731. /* a[i+42] += m[42] * mu */
  38732. "ldr r7, [%[m], #168]\n\t"
  38733. "ldr r10, [%[a], #168]\n\t"
  38734. "lsr r11, r7, #16\n\t"
  38735. "lsr r6, r8, #16\n\t"
  38736. "mul r5, r6, r11\n\t"
  38737. "lsl r11, r7, #16\n\t"
  38738. "lsr r11, r11, #16\n\t"
  38739. "mul r6, r11, r6\n\t"
  38740. "lsr r11, r6, #16\n\t"
  38741. "lsl r6, r6, #16\n\t"
  38742. "adds r10, r10, r6\n\t"
  38743. "adc r5, r5, r11\n\t"
  38744. "lsl r6, r8, #16\n\t"
  38745. "lsl r11, r7, #16\n\t"
  38746. "lsr r6, r6, #16\n\t"
  38747. "lsr r11, r11, #16\n\t"
  38748. "mul r11, r6, r11\n\t"
  38749. "adds r10, r10, r11\n\t"
  38750. "adc r5, r5, #0\n\t"
  38751. "lsr r11, r7, #16\n\t"
  38752. "mul r6, r11, r6\n\t"
  38753. "lsr r11, r6, #16\n\t"
  38754. "lsl r6, r6, #16\n\t"
  38755. "adds r10, r10, r6\n\t"
  38756. "adc r5, r5, r11\n\t"
  38757. "adds r10, r10, r4\n\t"
  38758. "str r10, [%[a], #168]\n\t"
  38759. "adc r5, r5, #0\n\t"
  38760. /* a[i+43] += m[43] * mu */
  38761. "ldr r7, [%[m], #172]\n\t"
  38762. "ldr r10, [%[a], #172]\n\t"
  38763. "lsr r11, r7, #16\n\t"
  38764. "lsr r6, r8, #16\n\t"
  38765. "mul r4, r6, r11\n\t"
  38766. "lsl r11, r7, #16\n\t"
  38767. "lsr r11, r11, #16\n\t"
  38768. "mul r6, r11, r6\n\t"
  38769. "lsr r11, r6, #16\n\t"
  38770. "lsl r6, r6, #16\n\t"
  38771. "adds r10, r10, r6\n\t"
  38772. "adc r4, r4, r11\n\t"
  38773. "lsl r6, r8, #16\n\t"
  38774. "lsl r11, r7, #16\n\t"
  38775. "lsr r6, r6, #16\n\t"
  38776. "lsr r11, r11, #16\n\t"
  38777. "mul r11, r6, r11\n\t"
  38778. "adds r10, r10, r11\n\t"
  38779. "adc r4, r4, #0\n\t"
  38780. "lsr r11, r7, #16\n\t"
  38781. "mul r6, r11, r6\n\t"
  38782. "lsr r11, r6, #16\n\t"
  38783. "lsl r6, r6, #16\n\t"
  38784. "adds r10, r10, r6\n\t"
  38785. "adc r4, r4, r11\n\t"
  38786. "adds r10, r10, r5\n\t"
  38787. "str r10, [%[a], #172]\n\t"
  38788. "adc r4, r4, #0\n\t"
  38789. /* a[i+44] += m[44] * mu */
  38790. "ldr r7, [%[m], #176]\n\t"
  38791. "ldr r10, [%[a], #176]\n\t"
  38792. "lsr r11, r7, #16\n\t"
  38793. "lsr r6, r8, #16\n\t"
  38794. "mul r5, r6, r11\n\t"
  38795. "lsl r11, r7, #16\n\t"
  38796. "lsr r11, r11, #16\n\t"
  38797. "mul r6, r11, r6\n\t"
  38798. "lsr r11, r6, #16\n\t"
  38799. "lsl r6, r6, #16\n\t"
  38800. "adds r10, r10, r6\n\t"
  38801. "adc r5, r5, r11\n\t"
  38802. "lsl r6, r8, #16\n\t"
  38803. "lsl r11, r7, #16\n\t"
  38804. "lsr r6, r6, #16\n\t"
  38805. "lsr r11, r11, #16\n\t"
  38806. "mul r11, r6, r11\n\t"
  38807. "adds r10, r10, r11\n\t"
  38808. "adc r5, r5, #0\n\t"
  38809. "lsr r11, r7, #16\n\t"
  38810. "mul r6, r11, r6\n\t"
  38811. "lsr r11, r6, #16\n\t"
  38812. "lsl r6, r6, #16\n\t"
  38813. "adds r10, r10, r6\n\t"
  38814. "adc r5, r5, r11\n\t"
  38815. "adds r10, r10, r4\n\t"
  38816. "str r10, [%[a], #176]\n\t"
  38817. "adc r5, r5, #0\n\t"
  38818. /* a[i+45] += m[45] * mu */
  38819. "ldr r7, [%[m], #180]\n\t"
  38820. "ldr r10, [%[a], #180]\n\t"
  38821. "lsr r11, r7, #16\n\t"
  38822. "lsr r6, r8, #16\n\t"
  38823. "mul r4, r6, r11\n\t"
  38824. "lsl r11, r7, #16\n\t"
  38825. "lsr r11, r11, #16\n\t"
  38826. "mul r6, r11, r6\n\t"
  38827. "lsr r11, r6, #16\n\t"
  38828. "lsl r6, r6, #16\n\t"
  38829. "adds r10, r10, r6\n\t"
  38830. "adc r4, r4, r11\n\t"
  38831. "lsl r6, r8, #16\n\t"
  38832. "lsl r11, r7, #16\n\t"
  38833. "lsr r6, r6, #16\n\t"
  38834. "lsr r11, r11, #16\n\t"
  38835. "mul r11, r6, r11\n\t"
  38836. "adds r10, r10, r11\n\t"
  38837. "adc r4, r4, #0\n\t"
  38838. "lsr r11, r7, #16\n\t"
  38839. "mul r6, r11, r6\n\t"
  38840. "lsr r11, r6, #16\n\t"
  38841. "lsl r6, r6, #16\n\t"
  38842. "adds r10, r10, r6\n\t"
  38843. "adc r4, r4, r11\n\t"
  38844. "adds r10, r10, r5\n\t"
  38845. "str r10, [%[a], #180]\n\t"
  38846. "adc r4, r4, #0\n\t"
  38847. /* a[i+46] += m[46] * mu */
  38848. "ldr r7, [%[m], #184]\n\t"
  38849. "ldr r10, [%[a], #184]\n\t"
  38850. "lsr r11, r7, #16\n\t"
  38851. "lsr r6, r8, #16\n\t"
  38852. "mul r5, r6, r11\n\t"
  38853. "lsl r11, r7, #16\n\t"
  38854. "lsr r11, r11, #16\n\t"
  38855. "mul r6, r11, r6\n\t"
  38856. "lsr r11, r6, #16\n\t"
  38857. "lsl r6, r6, #16\n\t"
  38858. "adds r10, r10, r6\n\t"
  38859. "adc r5, r5, r11\n\t"
  38860. "lsl r6, r8, #16\n\t"
  38861. "lsl r11, r7, #16\n\t"
  38862. "lsr r6, r6, #16\n\t"
  38863. "lsr r11, r11, #16\n\t"
  38864. "mul r11, r6, r11\n\t"
  38865. "adds r10, r10, r11\n\t"
  38866. "adc r5, r5, #0\n\t"
  38867. "lsr r11, r7, #16\n\t"
  38868. "mul r6, r11, r6\n\t"
  38869. "lsr r11, r6, #16\n\t"
  38870. "lsl r6, r6, #16\n\t"
  38871. "adds r10, r10, r6\n\t"
  38872. "adc r5, r5, r11\n\t"
  38873. "adds r10, r10, r4\n\t"
  38874. "str r10, [%[a], #184]\n\t"
  38875. "adc r5, r5, #0\n\t"
  38876. /* a[i+47] += m[47] * mu */
  38877. "ldr r7, [%[m], #188]\n\t"
  38878. "ldr r10, [%[a], #188]\n\t"
  38879. "lsr r11, r7, #16\n\t"
  38880. "lsr r6, r8, #16\n\t"
  38881. "mul r4, r6, r11\n\t"
  38882. "lsl r11, r7, #16\n\t"
  38883. "lsr r11, r11, #16\n\t"
  38884. "mul r6, r11, r6\n\t"
  38885. "lsr r11, r6, #16\n\t"
  38886. "lsl r6, r6, #16\n\t"
  38887. "adds r10, r10, r6\n\t"
  38888. "adc r4, r4, r11\n\t"
  38889. "lsl r6, r8, #16\n\t"
  38890. "lsl r11, r7, #16\n\t"
  38891. "lsr r6, r6, #16\n\t"
  38892. "lsr r11, r11, #16\n\t"
  38893. "mul r11, r6, r11\n\t"
  38894. "adds r10, r10, r11\n\t"
  38895. "adc r4, r4, #0\n\t"
  38896. "lsr r11, r7, #16\n\t"
  38897. "mul r6, r11, r6\n\t"
  38898. "lsr r11, r6, #16\n\t"
  38899. "lsl r6, r6, #16\n\t"
  38900. "adds r10, r10, r6\n\t"
  38901. "adc r4, r4, r11\n\t"
  38902. "adds r10, r10, r5\n\t"
  38903. "str r10, [%[a], #188]\n\t"
  38904. "adc r4, r4, #0\n\t"
  38905. /* a[i+48] += m[48] * mu */
  38906. "ldr r7, [%[m], #192]\n\t"
  38907. "ldr r10, [%[a], #192]\n\t"
  38908. "lsr r11, r7, #16\n\t"
  38909. "lsr r6, r8, #16\n\t"
  38910. "mul r5, r6, r11\n\t"
  38911. "lsl r11, r7, #16\n\t"
  38912. "lsr r11, r11, #16\n\t"
  38913. "mul r6, r11, r6\n\t"
  38914. "lsr r11, r6, #16\n\t"
  38915. "lsl r6, r6, #16\n\t"
  38916. "adds r10, r10, r6\n\t"
  38917. "adc r5, r5, r11\n\t"
  38918. "lsl r6, r8, #16\n\t"
  38919. "lsl r11, r7, #16\n\t"
  38920. "lsr r6, r6, #16\n\t"
  38921. "lsr r11, r11, #16\n\t"
  38922. "mul r11, r6, r11\n\t"
  38923. "adds r10, r10, r11\n\t"
  38924. "adc r5, r5, #0\n\t"
  38925. "lsr r11, r7, #16\n\t"
  38926. "mul r6, r11, r6\n\t"
  38927. "lsr r11, r6, #16\n\t"
  38928. "lsl r6, r6, #16\n\t"
  38929. "adds r10, r10, r6\n\t"
  38930. "adc r5, r5, r11\n\t"
  38931. "adds r10, r10, r4\n\t"
  38932. "str r10, [%[a], #192]\n\t"
  38933. "adc r5, r5, #0\n\t"
  38934. /* a[i+49] += m[49] * mu */
  38935. "ldr r7, [%[m], #196]\n\t"
  38936. "ldr r10, [%[a], #196]\n\t"
  38937. "lsr r11, r7, #16\n\t"
  38938. "lsr r6, r8, #16\n\t"
  38939. "mul r4, r6, r11\n\t"
  38940. "lsl r11, r7, #16\n\t"
  38941. "lsr r11, r11, #16\n\t"
  38942. "mul r6, r11, r6\n\t"
  38943. "lsr r11, r6, #16\n\t"
  38944. "lsl r6, r6, #16\n\t"
  38945. "adds r10, r10, r6\n\t"
  38946. "adc r4, r4, r11\n\t"
  38947. "lsl r6, r8, #16\n\t"
  38948. "lsl r11, r7, #16\n\t"
  38949. "lsr r6, r6, #16\n\t"
  38950. "lsr r11, r11, #16\n\t"
  38951. "mul r11, r6, r11\n\t"
  38952. "adds r10, r10, r11\n\t"
  38953. "adc r4, r4, #0\n\t"
  38954. "lsr r11, r7, #16\n\t"
  38955. "mul r6, r11, r6\n\t"
  38956. "lsr r11, r6, #16\n\t"
  38957. "lsl r6, r6, #16\n\t"
  38958. "adds r10, r10, r6\n\t"
  38959. "adc r4, r4, r11\n\t"
  38960. "adds r10, r10, r5\n\t"
  38961. "str r10, [%[a], #196]\n\t"
  38962. "adc r4, r4, #0\n\t"
  38963. /* a[i+50] += m[50] * mu */
  38964. "ldr r7, [%[m], #200]\n\t"
  38965. "ldr r10, [%[a], #200]\n\t"
  38966. "lsr r11, r7, #16\n\t"
  38967. "lsr r6, r8, #16\n\t"
  38968. "mul r5, r6, r11\n\t"
  38969. "lsl r11, r7, #16\n\t"
  38970. "lsr r11, r11, #16\n\t"
  38971. "mul r6, r11, r6\n\t"
  38972. "lsr r11, r6, #16\n\t"
  38973. "lsl r6, r6, #16\n\t"
  38974. "adds r10, r10, r6\n\t"
  38975. "adc r5, r5, r11\n\t"
  38976. "lsl r6, r8, #16\n\t"
  38977. "lsl r11, r7, #16\n\t"
  38978. "lsr r6, r6, #16\n\t"
  38979. "lsr r11, r11, #16\n\t"
  38980. "mul r11, r6, r11\n\t"
  38981. "adds r10, r10, r11\n\t"
  38982. "adc r5, r5, #0\n\t"
  38983. "lsr r11, r7, #16\n\t"
  38984. "mul r6, r11, r6\n\t"
  38985. "lsr r11, r6, #16\n\t"
  38986. "lsl r6, r6, #16\n\t"
  38987. "adds r10, r10, r6\n\t"
  38988. "adc r5, r5, r11\n\t"
  38989. "adds r10, r10, r4\n\t"
  38990. "str r10, [%[a], #200]\n\t"
  38991. "adc r5, r5, #0\n\t"
  38992. /* a[i+51] += m[51] * mu */
  38993. "ldr r7, [%[m], #204]\n\t"
  38994. "ldr r10, [%[a], #204]\n\t"
  38995. "lsr r11, r7, #16\n\t"
  38996. "lsr r6, r8, #16\n\t"
  38997. "mul r4, r6, r11\n\t"
  38998. "lsl r11, r7, #16\n\t"
  38999. "lsr r11, r11, #16\n\t"
  39000. "mul r6, r11, r6\n\t"
  39001. "lsr r11, r6, #16\n\t"
  39002. "lsl r6, r6, #16\n\t"
  39003. "adds r10, r10, r6\n\t"
  39004. "adc r4, r4, r11\n\t"
  39005. "lsl r6, r8, #16\n\t"
  39006. "lsl r11, r7, #16\n\t"
  39007. "lsr r6, r6, #16\n\t"
  39008. "lsr r11, r11, #16\n\t"
  39009. "mul r11, r6, r11\n\t"
  39010. "adds r10, r10, r11\n\t"
  39011. "adc r4, r4, #0\n\t"
  39012. "lsr r11, r7, #16\n\t"
  39013. "mul r6, r11, r6\n\t"
  39014. "lsr r11, r6, #16\n\t"
  39015. "lsl r6, r6, #16\n\t"
  39016. "adds r10, r10, r6\n\t"
  39017. "adc r4, r4, r11\n\t"
  39018. "adds r10, r10, r5\n\t"
  39019. "str r10, [%[a], #204]\n\t"
  39020. "adc r4, r4, #0\n\t"
  39021. /* a[i+52] += m[52] * mu */
  39022. "ldr r7, [%[m], #208]\n\t"
  39023. "ldr r10, [%[a], #208]\n\t"
  39024. "lsr r11, r7, #16\n\t"
  39025. "lsr r6, r8, #16\n\t"
  39026. "mul r5, r6, r11\n\t"
  39027. "lsl r11, r7, #16\n\t"
  39028. "lsr r11, r11, #16\n\t"
  39029. "mul r6, r11, r6\n\t"
  39030. "lsr r11, r6, #16\n\t"
  39031. "lsl r6, r6, #16\n\t"
  39032. "adds r10, r10, r6\n\t"
  39033. "adc r5, r5, r11\n\t"
  39034. "lsl r6, r8, #16\n\t"
  39035. "lsl r11, r7, #16\n\t"
  39036. "lsr r6, r6, #16\n\t"
  39037. "lsr r11, r11, #16\n\t"
  39038. "mul r11, r6, r11\n\t"
  39039. "adds r10, r10, r11\n\t"
  39040. "adc r5, r5, #0\n\t"
  39041. "lsr r11, r7, #16\n\t"
  39042. "mul r6, r11, r6\n\t"
  39043. "lsr r11, r6, #16\n\t"
  39044. "lsl r6, r6, #16\n\t"
  39045. "adds r10, r10, r6\n\t"
  39046. "adc r5, r5, r11\n\t"
  39047. "adds r10, r10, r4\n\t"
  39048. "str r10, [%[a], #208]\n\t"
  39049. "adc r5, r5, #0\n\t"
  39050. /* a[i+53] += m[53] * mu */
  39051. "ldr r7, [%[m], #212]\n\t"
  39052. "ldr r10, [%[a], #212]\n\t"
  39053. "lsr r11, r7, #16\n\t"
  39054. "lsr r6, r8, #16\n\t"
  39055. "mul r4, r6, r11\n\t"
  39056. "lsl r11, r7, #16\n\t"
  39057. "lsr r11, r11, #16\n\t"
  39058. "mul r6, r11, r6\n\t"
  39059. "lsr r11, r6, #16\n\t"
  39060. "lsl r6, r6, #16\n\t"
  39061. "adds r10, r10, r6\n\t"
  39062. "adc r4, r4, r11\n\t"
  39063. "lsl r6, r8, #16\n\t"
  39064. "lsl r11, r7, #16\n\t"
  39065. "lsr r6, r6, #16\n\t"
  39066. "lsr r11, r11, #16\n\t"
  39067. "mul r11, r6, r11\n\t"
  39068. "adds r10, r10, r11\n\t"
  39069. "adc r4, r4, #0\n\t"
  39070. "lsr r11, r7, #16\n\t"
  39071. "mul r6, r11, r6\n\t"
  39072. "lsr r11, r6, #16\n\t"
  39073. "lsl r6, r6, #16\n\t"
  39074. "adds r10, r10, r6\n\t"
  39075. "adc r4, r4, r11\n\t"
  39076. "adds r10, r10, r5\n\t"
  39077. "str r10, [%[a], #212]\n\t"
  39078. "adc r4, r4, #0\n\t"
  39079. /* a[i+54] += m[54] * mu */
  39080. "ldr r7, [%[m], #216]\n\t"
  39081. "ldr r10, [%[a], #216]\n\t"
  39082. "lsr r11, r7, #16\n\t"
  39083. "lsr r6, r8, #16\n\t"
  39084. "mul r5, r6, r11\n\t"
  39085. "lsl r11, r7, #16\n\t"
  39086. "lsr r11, r11, #16\n\t"
  39087. "mul r6, r11, r6\n\t"
  39088. "lsr r11, r6, #16\n\t"
  39089. "lsl r6, r6, #16\n\t"
  39090. "adds r10, r10, r6\n\t"
  39091. "adc r5, r5, r11\n\t"
  39092. "lsl r6, r8, #16\n\t"
  39093. "lsl r11, r7, #16\n\t"
  39094. "lsr r6, r6, #16\n\t"
  39095. "lsr r11, r11, #16\n\t"
  39096. "mul r11, r6, r11\n\t"
  39097. "adds r10, r10, r11\n\t"
  39098. "adc r5, r5, #0\n\t"
  39099. "lsr r11, r7, #16\n\t"
  39100. "mul r6, r11, r6\n\t"
  39101. "lsr r11, r6, #16\n\t"
  39102. "lsl r6, r6, #16\n\t"
  39103. "adds r10, r10, r6\n\t"
  39104. "adc r5, r5, r11\n\t"
  39105. "adds r10, r10, r4\n\t"
  39106. "str r10, [%[a], #216]\n\t"
  39107. "adc r5, r5, #0\n\t"
  39108. /* a[i+55] += m[55] * mu */
  39109. "ldr r7, [%[m], #220]\n\t"
  39110. "ldr r10, [%[a], #220]\n\t"
  39111. "lsr r11, r7, #16\n\t"
  39112. "lsr r6, r8, #16\n\t"
  39113. "mul r4, r6, r11\n\t"
  39114. "lsl r11, r7, #16\n\t"
  39115. "lsr r11, r11, #16\n\t"
  39116. "mul r6, r11, r6\n\t"
  39117. "lsr r11, r6, #16\n\t"
  39118. "lsl r6, r6, #16\n\t"
  39119. "adds r10, r10, r6\n\t"
  39120. "adc r4, r4, r11\n\t"
  39121. "lsl r6, r8, #16\n\t"
  39122. "lsl r11, r7, #16\n\t"
  39123. "lsr r6, r6, #16\n\t"
  39124. "lsr r11, r11, #16\n\t"
  39125. "mul r11, r6, r11\n\t"
  39126. "adds r10, r10, r11\n\t"
  39127. "adc r4, r4, #0\n\t"
  39128. "lsr r11, r7, #16\n\t"
  39129. "mul r6, r11, r6\n\t"
  39130. "lsr r11, r6, #16\n\t"
  39131. "lsl r6, r6, #16\n\t"
  39132. "adds r10, r10, r6\n\t"
  39133. "adc r4, r4, r11\n\t"
  39134. "adds r10, r10, r5\n\t"
  39135. "str r10, [%[a], #220]\n\t"
  39136. "adc r4, r4, #0\n\t"
  39137. /* a[i+56] += m[56] * mu */
  39138. "ldr r7, [%[m], #224]\n\t"
  39139. "ldr r10, [%[a], #224]\n\t"
  39140. "lsr r11, r7, #16\n\t"
  39141. "lsr r6, r8, #16\n\t"
  39142. "mul r5, r6, r11\n\t"
  39143. "lsl r11, r7, #16\n\t"
  39144. "lsr r11, r11, #16\n\t"
  39145. "mul r6, r11, r6\n\t"
  39146. "lsr r11, r6, #16\n\t"
  39147. "lsl r6, r6, #16\n\t"
  39148. "adds r10, r10, r6\n\t"
  39149. "adc r5, r5, r11\n\t"
  39150. "lsl r6, r8, #16\n\t"
  39151. "lsl r11, r7, #16\n\t"
  39152. "lsr r6, r6, #16\n\t"
  39153. "lsr r11, r11, #16\n\t"
  39154. "mul r11, r6, r11\n\t"
  39155. "adds r10, r10, r11\n\t"
  39156. "adc r5, r5, #0\n\t"
  39157. "lsr r11, r7, #16\n\t"
  39158. "mul r6, r11, r6\n\t"
  39159. "lsr r11, r6, #16\n\t"
  39160. "lsl r6, r6, #16\n\t"
  39161. "adds r10, r10, r6\n\t"
  39162. "adc r5, r5, r11\n\t"
  39163. "adds r10, r10, r4\n\t"
  39164. "str r10, [%[a], #224]\n\t"
  39165. "adc r5, r5, #0\n\t"
  39166. /* a[i+57] += m[57] * mu */
  39167. "ldr r7, [%[m], #228]\n\t"
  39168. "ldr r10, [%[a], #228]\n\t"
  39169. "lsr r11, r7, #16\n\t"
  39170. "lsr r6, r8, #16\n\t"
  39171. "mul r4, r6, r11\n\t"
  39172. "lsl r11, r7, #16\n\t"
  39173. "lsr r11, r11, #16\n\t"
  39174. "mul r6, r11, r6\n\t"
  39175. "lsr r11, r6, #16\n\t"
  39176. "lsl r6, r6, #16\n\t"
  39177. "adds r10, r10, r6\n\t"
  39178. "adc r4, r4, r11\n\t"
  39179. "lsl r6, r8, #16\n\t"
  39180. "lsl r11, r7, #16\n\t"
  39181. "lsr r6, r6, #16\n\t"
  39182. "lsr r11, r11, #16\n\t"
  39183. "mul r11, r6, r11\n\t"
  39184. "adds r10, r10, r11\n\t"
  39185. "adc r4, r4, #0\n\t"
  39186. "lsr r11, r7, #16\n\t"
  39187. "mul r6, r11, r6\n\t"
  39188. "lsr r11, r6, #16\n\t"
  39189. "lsl r6, r6, #16\n\t"
  39190. "adds r10, r10, r6\n\t"
  39191. "adc r4, r4, r11\n\t"
  39192. "adds r10, r10, r5\n\t"
  39193. "str r10, [%[a], #228]\n\t"
  39194. "adc r4, r4, #0\n\t"
  39195. /* a[i+58] += m[58] * mu */
  39196. "ldr r7, [%[m], #232]\n\t"
  39197. "ldr r10, [%[a], #232]\n\t"
  39198. "lsr r11, r7, #16\n\t"
  39199. "lsr r6, r8, #16\n\t"
  39200. "mul r5, r6, r11\n\t"
  39201. "lsl r11, r7, #16\n\t"
  39202. "lsr r11, r11, #16\n\t"
  39203. "mul r6, r11, r6\n\t"
  39204. "lsr r11, r6, #16\n\t"
  39205. "lsl r6, r6, #16\n\t"
  39206. "adds r10, r10, r6\n\t"
  39207. "adc r5, r5, r11\n\t"
  39208. "lsl r6, r8, #16\n\t"
  39209. "lsl r11, r7, #16\n\t"
  39210. "lsr r6, r6, #16\n\t"
  39211. "lsr r11, r11, #16\n\t"
  39212. "mul r11, r6, r11\n\t"
  39213. "adds r10, r10, r11\n\t"
  39214. "adc r5, r5, #0\n\t"
  39215. "lsr r11, r7, #16\n\t"
  39216. "mul r6, r11, r6\n\t"
  39217. "lsr r11, r6, #16\n\t"
  39218. "lsl r6, r6, #16\n\t"
  39219. "adds r10, r10, r6\n\t"
  39220. "adc r5, r5, r11\n\t"
  39221. "adds r10, r10, r4\n\t"
  39222. "str r10, [%[a], #232]\n\t"
  39223. "adc r5, r5, #0\n\t"
  39224. /* a[i+59] += m[59] * mu */
  39225. "ldr r7, [%[m], #236]\n\t"
  39226. "ldr r10, [%[a], #236]\n\t"
  39227. "lsr r11, r7, #16\n\t"
  39228. "lsr r6, r8, #16\n\t"
  39229. "mul r4, r6, r11\n\t"
  39230. "lsl r11, r7, #16\n\t"
  39231. "lsr r11, r11, #16\n\t"
  39232. "mul r6, r11, r6\n\t"
  39233. "lsr r11, r6, #16\n\t"
  39234. "lsl r6, r6, #16\n\t"
  39235. "adds r10, r10, r6\n\t"
  39236. "adc r4, r4, r11\n\t"
  39237. "lsl r6, r8, #16\n\t"
  39238. "lsl r11, r7, #16\n\t"
  39239. "lsr r6, r6, #16\n\t"
  39240. "lsr r11, r11, #16\n\t"
  39241. "mul r11, r6, r11\n\t"
  39242. "adds r10, r10, r11\n\t"
  39243. "adc r4, r4, #0\n\t"
  39244. "lsr r11, r7, #16\n\t"
  39245. "mul r6, r11, r6\n\t"
  39246. "lsr r11, r6, #16\n\t"
  39247. "lsl r6, r6, #16\n\t"
  39248. "adds r10, r10, r6\n\t"
  39249. "adc r4, r4, r11\n\t"
  39250. "adds r10, r10, r5\n\t"
  39251. "str r10, [%[a], #236]\n\t"
  39252. "adc r4, r4, #0\n\t"
  39253. /* a[i+60] += m[60] * mu */
  39254. "ldr r7, [%[m], #240]\n\t"
  39255. "ldr r10, [%[a], #240]\n\t"
  39256. "lsr r11, r7, #16\n\t"
  39257. "lsr r6, r8, #16\n\t"
  39258. "mul r5, r6, r11\n\t"
  39259. "lsl r11, r7, #16\n\t"
  39260. "lsr r11, r11, #16\n\t"
  39261. "mul r6, r11, r6\n\t"
  39262. "lsr r11, r6, #16\n\t"
  39263. "lsl r6, r6, #16\n\t"
  39264. "adds r10, r10, r6\n\t"
  39265. "adc r5, r5, r11\n\t"
  39266. "lsl r6, r8, #16\n\t"
  39267. "lsl r11, r7, #16\n\t"
  39268. "lsr r6, r6, #16\n\t"
  39269. "lsr r11, r11, #16\n\t"
  39270. "mul r11, r6, r11\n\t"
  39271. "adds r10, r10, r11\n\t"
  39272. "adc r5, r5, #0\n\t"
  39273. "lsr r11, r7, #16\n\t"
  39274. "mul r6, r11, r6\n\t"
  39275. "lsr r11, r6, #16\n\t"
  39276. "lsl r6, r6, #16\n\t"
  39277. "adds r10, r10, r6\n\t"
  39278. "adc r5, r5, r11\n\t"
  39279. "adds r10, r10, r4\n\t"
  39280. "str r10, [%[a], #240]\n\t"
  39281. "adc r5, r5, #0\n\t"
  39282. /* a[i+61] += m[61] * mu */
  39283. "ldr r7, [%[m], #244]\n\t"
  39284. "ldr r10, [%[a], #244]\n\t"
  39285. "lsr r11, r7, #16\n\t"
  39286. "lsr r6, r8, #16\n\t"
  39287. "mul r4, r6, r11\n\t"
  39288. "lsl r11, r7, #16\n\t"
  39289. "lsr r11, r11, #16\n\t"
  39290. "mul r6, r11, r6\n\t"
  39291. "lsr r11, r6, #16\n\t"
  39292. "lsl r6, r6, #16\n\t"
  39293. "adds r10, r10, r6\n\t"
  39294. "adc r4, r4, r11\n\t"
  39295. "lsl r6, r8, #16\n\t"
  39296. "lsl r11, r7, #16\n\t"
  39297. "lsr r6, r6, #16\n\t"
  39298. "lsr r11, r11, #16\n\t"
  39299. "mul r11, r6, r11\n\t"
  39300. "adds r10, r10, r11\n\t"
  39301. "adc r4, r4, #0\n\t"
  39302. "lsr r11, r7, #16\n\t"
  39303. "mul r6, r11, r6\n\t"
  39304. "lsr r11, r6, #16\n\t"
  39305. "lsl r6, r6, #16\n\t"
  39306. "adds r10, r10, r6\n\t"
  39307. "adc r4, r4, r11\n\t"
  39308. "adds r10, r10, r5\n\t"
  39309. "str r10, [%[a], #244]\n\t"
  39310. "adc r4, r4, #0\n\t"
  39311. /* a[i+62] += m[62] * mu */
  39312. "ldr r7, [%[m], #248]\n\t"
  39313. "ldr r10, [%[a], #248]\n\t"
  39314. "lsr r11, r7, #16\n\t"
  39315. "lsr r6, r8, #16\n\t"
  39316. "mul r5, r6, r11\n\t"
  39317. "lsl r11, r7, #16\n\t"
  39318. "lsr r11, r11, #16\n\t"
  39319. "mul r6, r11, r6\n\t"
  39320. "lsr r11, r6, #16\n\t"
  39321. "lsl r6, r6, #16\n\t"
  39322. "adds r10, r10, r6\n\t"
  39323. "adc r5, r5, r11\n\t"
  39324. "lsl r6, r8, #16\n\t"
  39325. "lsl r11, r7, #16\n\t"
  39326. "lsr r6, r6, #16\n\t"
  39327. "lsr r11, r11, #16\n\t"
  39328. "mul r11, r6, r11\n\t"
  39329. "adds r10, r10, r11\n\t"
  39330. "adc r5, r5, #0\n\t"
  39331. "lsr r11, r7, #16\n\t"
  39332. "mul r6, r11, r6\n\t"
  39333. "lsr r11, r6, #16\n\t"
  39334. "lsl r6, r6, #16\n\t"
  39335. "adds r10, r10, r6\n\t"
  39336. "adc r5, r5, r11\n\t"
  39337. "adds r10, r10, r4\n\t"
  39338. "str r10, [%[a], #248]\n\t"
  39339. "adc r5, r5, #0\n\t"
  39340. /* a[i+63] += m[63] * mu */
  39341. "ldr r7, [%[m], #252]\n\t"
  39342. "ldr r10, [%[a], #252]\n\t"
  39343. "lsr r11, r7, #16\n\t"
  39344. "lsr r6, r8, #16\n\t"
  39345. "mul r4, r6, r11\n\t"
  39346. "lsl r11, r7, #16\n\t"
  39347. "lsr r11, r11, #16\n\t"
  39348. "mul r6, r11, r6\n\t"
  39349. "lsr r11, r6, #16\n\t"
  39350. "lsl r6, r6, #16\n\t"
  39351. "adds r10, r10, r6\n\t"
  39352. "adc r4, r4, r11\n\t"
  39353. "lsl r6, r8, #16\n\t"
  39354. "lsl r11, r7, #16\n\t"
  39355. "lsr r6, r6, #16\n\t"
  39356. "lsr r11, r11, #16\n\t"
  39357. "mul r11, r6, r11\n\t"
  39358. "adds r10, r10, r11\n\t"
  39359. "adc r4, r4, #0\n\t"
  39360. "lsr r11, r7, #16\n\t"
  39361. "mul r6, r11, r6\n\t"
  39362. "lsr r11, r6, #16\n\t"
  39363. "lsl r6, r6, #16\n\t"
  39364. "adds r10, r10, r6\n\t"
  39365. "adc r4, r4, r11\n\t"
  39366. "adds r10, r10, r5\n\t"
  39367. "str r10, [%[a], #252]\n\t"
  39368. "adc r4, r4, #0\n\t"
  39369. /* a[i+64] += m[64] * mu */
  39370. "ldr r7, [%[m], #256]\n\t"
  39371. "ldr r10, [%[a], #256]\n\t"
  39372. "lsr r11, r7, #16\n\t"
  39373. "lsr r6, r8, #16\n\t"
  39374. "mul r5, r6, r11\n\t"
  39375. "lsl r11, r7, #16\n\t"
  39376. "lsr r11, r11, #16\n\t"
  39377. "mul r6, r11, r6\n\t"
  39378. "lsr r11, r6, #16\n\t"
  39379. "lsl r6, r6, #16\n\t"
  39380. "adds r10, r10, r6\n\t"
  39381. "adc r5, r5, r11\n\t"
  39382. "lsl r6, r8, #16\n\t"
  39383. "lsl r11, r7, #16\n\t"
  39384. "lsr r6, r6, #16\n\t"
  39385. "lsr r11, r11, #16\n\t"
  39386. "mul r11, r6, r11\n\t"
  39387. "adds r10, r10, r11\n\t"
  39388. "adc r5, r5, #0\n\t"
  39389. "lsr r11, r7, #16\n\t"
  39390. "mul r6, r11, r6\n\t"
  39391. "lsr r11, r6, #16\n\t"
  39392. "lsl r6, r6, #16\n\t"
  39393. "adds r10, r10, r6\n\t"
  39394. "adc r5, r5, r11\n\t"
  39395. "adds r10, r10, r4\n\t"
  39396. "str r10, [%[a], #256]\n\t"
  39397. "adc r5, r5, #0\n\t"
  39398. /* a[i+65] += m[65] * mu */
  39399. "ldr r7, [%[m], #260]\n\t"
  39400. "ldr r10, [%[a], #260]\n\t"
  39401. "lsr r11, r7, #16\n\t"
  39402. "lsr r6, r8, #16\n\t"
  39403. "mul r4, r6, r11\n\t"
  39404. "lsl r11, r7, #16\n\t"
  39405. "lsr r11, r11, #16\n\t"
  39406. "mul r6, r11, r6\n\t"
  39407. "lsr r11, r6, #16\n\t"
  39408. "lsl r6, r6, #16\n\t"
  39409. "adds r10, r10, r6\n\t"
  39410. "adc r4, r4, r11\n\t"
  39411. "lsl r6, r8, #16\n\t"
  39412. "lsl r11, r7, #16\n\t"
  39413. "lsr r6, r6, #16\n\t"
  39414. "lsr r11, r11, #16\n\t"
  39415. "mul r11, r6, r11\n\t"
  39416. "adds r10, r10, r11\n\t"
  39417. "adc r4, r4, #0\n\t"
  39418. "lsr r11, r7, #16\n\t"
  39419. "mul r6, r11, r6\n\t"
  39420. "lsr r11, r6, #16\n\t"
  39421. "lsl r6, r6, #16\n\t"
  39422. "adds r10, r10, r6\n\t"
  39423. "adc r4, r4, r11\n\t"
  39424. "adds r10, r10, r5\n\t"
  39425. "str r10, [%[a], #260]\n\t"
  39426. "adc r4, r4, #0\n\t"
  39427. /* a[i+66] += m[66] * mu */
  39428. "ldr r7, [%[m], #264]\n\t"
  39429. "ldr r10, [%[a], #264]\n\t"
  39430. "lsr r11, r7, #16\n\t"
  39431. "lsr r6, r8, #16\n\t"
  39432. "mul r5, r6, r11\n\t"
  39433. "lsl r11, r7, #16\n\t"
  39434. "lsr r11, r11, #16\n\t"
  39435. "mul r6, r11, r6\n\t"
  39436. "lsr r11, r6, #16\n\t"
  39437. "lsl r6, r6, #16\n\t"
  39438. "adds r10, r10, r6\n\t"
  39439. "adc r5, r5, r11\n\t"
  39440. "lsl r6, r8, #16\n\t"
  39441. "lsl r11, r7, #16\n\t"
  39442. "lsr r6, r6, #16\n\t"
  39443. "lsr r11, r11, #16\n\t"
  39444. "mul r11, r6, r11\n\t"
  39445. "adds r10, r10, r11\n\t"
  39446. "adc r5, r5, #0\n\t"
  39447. "lsr r11, r7, #16\n\t"
  39448. "mul r6, r11, r6\n\t"
  39449. "lsr r11, r6, #16\n\t"
  39450. "lsl r6, r6, #16\n\t"
  39451. "adds r10, r10, r6\n\t"
  39452. "adc r5, r5, r11\n\t"
  39453. "adds r10, r10, r4\n\t"
  39454. "str r10, [%[a], #264]\n\t"
  39455. "adc r5, r5, #0\n\t"
  39456. /* a[i+67] += m[67] * mu */
  39457. "ldr r7, [%[m], #268]\n\t"
  39458. "ldr r10, [%[a], #268]\n\t"
  39459. "lsr r11, r7, #16\n\t"
  39460. "lsr r6, r8, #16\n\t"
  39461. "mul r4, r6, r11\n\t"
  39462. "lsl r11, r7, #16\n\t"
  39463. "lsr r11, r11, #16\n\t"
  39464. "mul r6, r11, r6\n\t"
  39465. "lsr r11, r6, #16\n\t"
  39466. "lsl r6, r6, #16\n\t"
  39467. "adds r10, r10, r6\n\t"
  39468. "adc r4, r4, r11\n\t"
  39469. "lsl r6, r8, #16\n\t"
  39470. "lsl r11, r7, #16\n\t"
  39471. "lsr r6, r6, #16\n\t"
  39472. "lsr r11, r11, #16\n\t"
  39473. "mul r11, r6, r11\n\t"
  39474. "adds r10, r10, r11\n\t"
  39475. "adc r4, r4, #0\n\t"
  39476. "lsr r11, r7, #16\n\t"
  39477. "mul r6, r11, r6\n\t"
  39478. "lsr r11, r6, #16\n\t"
  39479. "lsl r6, r6, #16\n\t"
  39480. "adds r10, r10, r6\n\t"
  39481. "adc r4, r4, r11\n\t"
  39482. "adds r10, r10, r5\n\t"
  39483. "str r10, [%[a], #268]\n\t"
  39484. "adc r4, r4, #0\n\t"
  39485. /* a[i+68] += m[68] * mu */
  39486. "ldr r7, [%[m], #272]\n\t"
  39487. "ldr r10, [%[a], #272]\n\t"
  39488. "lsr r11, r7, #16\n\t"
  39489. "lsr r6, r8, #16\n\t"
  39490. "mul r5, r6, r11\n\t"
  39491. "lsl r11, r7, #16\n\t"
  39492. "lsr r11, r11, #16\n\t"
  39493. "mul r6, r11, r6\n\t"
  39494. "lsr r11, r6, #16\n\t"
  39495. "lsl r6, r6, #16\n\t"
  39496. "adds r10, r10, r6\n\t"
  39497. "adc r5, r5, r11\n\t"
  39498. "lsl r6, r8, #16\n\t"
  39499. "lsl r11, r7, #16\n\t"
  39500. "lsr r6, r6, #16\n\t"
  39501. "lsr r11, r11, #16\n\t"
  39502. "mul r11, r6, r11\n\t"
  39503. "adds r10, r10, r11\n\t"
  39504. "adc r5, r5, #0\n\t"
  39505. "lsr r11, r7, #16\n\t"
  39506. "mul r6, r11, r6\n\t"
  39507. "lsr r11, r6, #16\n\t"
  39508. "lsl r6, r6, #16\n\t"
  39509. "adds r10, r10, r6\n\t"
  39510. "adc r5, r5, r11\n\t"
  39511. "adds r10, r10, r4\n\t"
  39512. "str r10, [%[a], #272]\n\t"
  39513. "adc r5, r5, #0\n\t"
  39514. /* a[i+69] += m[69] * mu */
  39515. "ldr r7, [%[m], #276]\n\t"
  39516. "ldr r10, [%[a], #276]\n\t"
  39517. "lsr r11, r7, #16\n\t"
  39518. "lsr r6, r8, #16\n\t"
  39519. "mul r4, r6, r11\n\t"
  39520. "lsl r11, r7, #16\n\t"
  39521. "lsr r11, r11, #16\n\t"
  39522. "mul r6, r11, r6\n\t"
  39523. "lsr r11, r6, #16\n\t"
  39524. "lsl r6, r6, #16\n\t"
  39525. "adds r10, r10, r6\n\t"
  39526. "adc r4, r4, r11\n\t"
  39527. "lsl r6, r8, #16\n\t"
  39528. "lsl r11, r7, #16\n\t"
  39529. "lsr r6, r6, #16\n\t"
  39530. "lsr r11, r11, #16\n\t"
  39531. "mul r11, r6, r11\n\t"
  39532. "adds r10, r10, r11\n\t"
  39533. "adc r4, r4, #0\n\t"
  39534. "lsr r11, r7, #16\n\t"
  39535. "mul r6, r11, r6\n\t"
  39536. "lsr r11, r6, #16\n\t"
  39537. "lsl r6, r6, #16\n\t"
  39538. "adds r10, r10, r6\n\t"
  39539. "adc r4, r4, r11\n\t"
  39540. "adds r10, r10, r5\n\t"
  39541. "str r10, [%[a], #276]\n\t"
  39542. "adc r4, r4, #0\n\t"
  39543. /* a[i+70] += m[70] * mu */
  39544. "ldr r7, [%[m], #280]\n\t"
  39545. "ldr r10, [%[a], #280]\n\t"
  39546. "lsr r11, r7, #16\n\t"
  39547. "lsr r6, r8, #16\n\t"
  39548. "mul r5, r6, r11\n\t"
  39549. "lsl r11, r7, #16\n\t"
  39550. "lsr r11, r11, #16\n\t"
  39551. "mul r6, r11, r6\n\t"
  39552. "lsr r11, r6, #16\n\t"
  39553. "lsl r6, r6, #16\n\t"
  39554. "adds r10, r10, r6\n\t"
  39555. "adc r5, r5, r11\n\t"
  39556. "lsl r6, r8, #16\n\t"
  39557. "lsl r11, r7, #16\n\t"
  39558. "lsr r6, r6, #16\n\t"
  39559. "lsr r11, r11, #16\n\t"
  39560. "mul r11, r6, r11\n\t"
  39561. "adds r10, r10, r11\n\t"
  39562. "adc r5, r5, #0\n\t"
  39563. "lsr r11, r7, #16\n\t"
  39564. "mul r6, r11, r6\n\t"
  39565. "lsr r11, r6, #16\n\t"
  39566. "lsl r6, r6, #16\n\t"
  39567. "adds r10, r10, r6\n\t"
  39568. "adc r5, r5, r11\n\t"
  39569. "adds r10, r10, r4\n\t"
  39570. "str r10, [%[a], #280]\n\t"
  39571. "adc r5, r5, #0\n\t"
  39572. /* a[i+71] += m[71] * mu */
  39573. "ldr r7, [%[m], #284]\n\t"
  39574. "ldr r10, [%[a], #284]\n\t"
  39575. "lsr r11, r7, #16\n\t"
  39576. "lsr r6, r8, #16\n\t"
  39577. "mul r4, r6, r11\n\t"
  39578. "lsl r11, r7, #16\n\t"
  39579. "lsr r11, r11, #16\n\t"
  39580. "mul r6, r11, r6\n\t"
  39581. "lsr r11, r6, #16\n\t"
  39582. "lsl r6, r6, #16\n\t"
  39583. "adds r10, r10, r6\n\t"
  39584. "adc r4, r4, r11\n\t"
  39585. "lsl r6, r8, #16\n\t"
  39586. "lsl r11, r7, #16\n\t"
  39587. "lsr r6, r6, #16\n\t"
  39588. "lsr r11, r11, #16\n\t"
  39589. "mul r11, r6, r11\n\t"
  39590. "adds r10, r10, r11\n\t"
  39591. "adc r4, r4, #0\n\t"
  39592. "lsr r11, r7, #16\n\t"
  39593. "mul r6, r11, r6\n\t"
  39594. "lsr r11, r6, #16\n\t"
  39595. "lsl r6, r6, #16\n\t"
  39596. "adds r10, r10, r6\n\t"
  39597. "adc r4, r4, r11\n\t"
  39598. "adds r10, r10, r5\n\t"
  39599. "str r10, [%[a], #284]\n\t"
  39600. "adc r4, r4, #0\n\t"
  39601. /* a[i+72] += m[72] * mu */
  39602. "ldr r7, [%[m], #288]\n\t"
  39603. "ldr r10, [%[a], #288]\n\t"
  39604. "lsr r11, r7, #16\n\t"
  39605. "lsr r6, r8, #16\n\t"
  39606. "mul r5, r6, r11\n\t"
  39607. "lsl r11, r7, #16\n\t"
  39608. "lsr r11, r11, #16\n\t"
  39609. "mul r6, r11, r6\n\t"
  39610. "lsr r11, r6, #16\n\t"
  39611. "lsl r6, r6, #16\n\t"
  39612. "adds r10, r10, r6\n\t"
  39613. "adc r5, r5, r11\n\t"
  39614. "lsl r6, r8, #16\n\t"
  39615. "lsl r11, r7, #16\n\t"
  39616. "lsr r6, r6, #16\n\t"
  39617. "lsr r11, r11, #16\n\t"
  39618. "mul r11, r6, r11\n\t"
  39619. "adds r10, r10, r11\n\t"
  39620. "adc r5, r5, #0\n\t"
  39621. "lsr r11, r7, #16\n\t"
  39622. "mul r6, r11, r6\n\t"
  39623. "lsr r11, r6, #16\n\t"
  39624. "lsl r6, r6, #16\n\t"
  39625. "adds r10, r10, r6\n\t"
  39626. "adc r5, r5, r11\n\t"
  39627. "adds r10, r10, r4\n\t"
  39628. "str r10, [%[a], #288]\n\t"
  39629. "adc r5, r5, #0\n\t"
  39630. /* a[i+73] += m[73] * mu */
  39631. "ldr r7, [%[m], #292]\n\t"
  39632. "ldr r10, [%[a], #292]\n\t"
  39633. "lsr r11, r7, #16\n\t"
  39634. "lsr r6, r8, #16\n\t"
  39635. "mul r4, r6, r11\n\t"
  39636. "lsl r11, r7, #16\n\t"
  39637. "lsr r11, r11, #16\n\t"
  39638. "mul r6, r11, r6\n\t"
  39639. "lsr r11, r6, #16\n\t"
  39640. "lsl r6, r6, #16\n\t"
  39641. "adds r10, r10, r6\n\t"
  39642. "adc r4, r4, r11\n\t"
  39643. "lsl r6, r8, #16\n\t"
  39644. "lsl r11, r7, #16\n\t"
  39645. "lsr r6, r6, #16\n\t"
  39646. "lsr r11, r11, #16\n\t"
  39647. "mul r11, r6, r11\n\t"
  39648. "adds r10, r10, r11\n\t"
  39649. "adc r4, r4, #0\n\t"
  39650. "lsr r11, r7, #16\n\t"
  39651. "mul r6, r11, r6\n\t"
  39652. "lsr r11, r6, #16\n\t"
  39653. "lsl r6, r6, #16\n\t"
  39654. "adds r10, r10, r6\n\t"
  39655. "adc r4, r4, r11\n\t"
  39656. "adds r10, r10, r5\n\t"
  39657. "str r10, [%[a], #292]\n\t"
  39658. "adc r4, r4, #0\n\t"
  39659. /* a[i+74] += m[74] * mu */
  39660. "ldr r7, [%[m], #296]\n\t"
  39661. "ldr r10, [%[a], #296]\n\t"
  39662. "lsr r11, r7, #16\n\t"
  39663. "lsr r6, r8, #16\n\t"
  39664. "mul r5, r6, r11\n\t"
  39665. "lsl r11, r7, #16\n\t"
  39666. "lsr r11, r11, #16\n\t"
  39667. "mul r6, r11, r6\n\t"
  39668. "lsr r11, r6, #16\n\t"
  39669. "lsl r6, r6, #16\n\t"
  39670. "adds r10, r10, r6\n\t"
  39671. "adc r5, r5, r11\n\t"
  39672. "lsl r6, r8, #16\n\t"
  39673. "lsl r11, r7, #16\n\t"
  39674. "lsr r6, r6, #16\n\t"
  39675. "lsr r11, r11, #16\n\t"
  39676. "mul r11, r6, r11\n\t"
  39677. "adds r10, r10, r11\n\t"
  39678. "adc r5, r5, #0\n\t"
  39679. "lsr r11, r7, #16\n\t"
  39680. "mul r6, r11, r6\n\t"
  39681. "lsr r11, r6, #16\n\t"
  39682. "lsl r6, r6, #16\n\t"
  39683. "adds r10, r10, r6\n\t"
  39684. "adc r5, r5, r11\n\t"
  39685. "adds r10, r10, r4\n\t"
  39686. "str r10, [%[a], #296]\n\t"
  39687. "adc r5, r5, #0\n\t"
  39688. /* a[i+75] += m[75] * mu */
  39689. "ldr r7, [%[m], #300]\n\t"
  39690. "ldr r10, [%[a], #300]\n\t"
  39691. "lsr r11, r7, #16\n\t"
  39692. "lsr r6, r8, #16\n\t"
  39693. "mul r4, r6, r11\n\t"
  39694. "lsl r11, r7, #16\n\t"
  39695. "lsr r11, r11, #16\n\t"
  39696. "mul r6, r11, r6\n\t"
  39697. "lsr r11, r6, #16\n\t"
  39698. "lsl r6, r6, #16\n\t"
  39699. "adds r10, r10, r6\n\t"
  39700. "adc r4, r4, r11\n\t"
  39701. "lsl r6, r8, #16\n\t"
  39702. "lsl r11, r7, #16\n\t"
  39703. "lsr r6, r6, #16\n\t"
  39704. "lsr r11, r11, #16\n\t"
  39705. "mul r11, r6, r11\n\t"
  39706. "adds r10, r10, r11\n\t"
  39707. "adc r4, r4, #0\n\t"
  39708. "lsr r11, r7, #16\n\t"
  39709. "mul r6, r11, r6\n\t"
  39710. "lsr r11, r6, #16\n\t"
  39711. "lsl r6, r6, #16\n\t"
  39712. "adds r10, r10, r6\n\t"
  39713. "adc r4, r4, r11\n\t"
  39714. "adds r10, r10, r5\n\t"
  39715. "str r10, [%[a], #300]\n\t"
  39716. "adc r4, r4, #0\n\t"
  39717. /* a[i+76] += m[76] * mu */
  39718. "ldr r7, [%[m], #304]\n\t"
  39719. "ldr r10, [%[a], #304]\n\t"
  39720. "lsr r11, r7, #16\n\t"
  39721. "lsr r6, r8, #16\n\t"
  39722. "mul r5, r6, r11\n\t"
  39723. "lsl r11, r7, #16\n\t"
  39724. "lsr r11, r11, #16\n\t"
  39725. "mul r6, r11, r6\n\t"
  39726. "lsr r11, r6, #16\n\t"
  39727. "lsl r6, r6, #16\n\t"
  39728. "adds r10, r10, r6\n\t"
  39729. "adc r5, r5, r11\n\t"
  39730. "lsl r6, r8, #16\n\t"
  39731. "lsl r11, r7, #16\n\t"
  39732. "lsr r6, r6, #16\n\t"
  39733. "lsr r11, r11, #16\n\t"
  39734. "mul r11, r6, r11\n\t"
  39735. "adds r10, r10, r11\n\t"
  39736. "adc r5, r5, #0\n\t"
  39737. "lsr r11, r7, #16\n\t"
  39738. "mul r6, r11, r6\n\t"
  39739. "lsr r11, r6, #16\n\t"
  39740. "lsl r6, r6, #16\n\t"
  39741. "adds r10, r10, r6\n\t"
  39742. "adc r5, r5, r11\n\t"
  39743. "adds r10, r10, r4\n\t"
  39744. "str r10, [%[a], #304]\n\t"
  39745. "adc r5, r5, #0\n\t"
  39746. /* a[i+77] += m[77] * mu */
  39747. "ldr r7, [%[m], #308]\n\t"
  39748. "ldr r10, [%[a], #308]\n\t"
  39749. "lsr r11, r7, #16\n\t"
  39750. "lsr r6, r8, #16\n\t"
  39751. "mul r4, r6, r11\n\t"
  39752. "lsl r11, r7, #16\n\t"
  39753. "lsr r11, r11, #16\n\t"
  39754. "mul r6, r11, r6\n\t"
  39755. "lsr r11, r6, #16\n\t"
  39756. "lsl r6, r6, #16\n\t"
  39757. "adds r10, r10, r6\n\t"
  39758. "adc r4, r4, r11\n\t"
  39759. "lsl r6, r8, #16\n\t"
  39760. "lsl r11, r7, #16\n\t"
  39761. "lsr r6, r6, #16\n\t"
  39762. "lsr r11, r11, #16\n\t"
  39763. "mul r11, r6, r11\n\t"
  39764. "adds r10, r10, r11\n\t"
  39765. "adc r4, r4, #0\n\t"
  39766. "lsr r11, r7, #16\n\t"
  39767. "mul r6, r11, r6\n\t"
  39768. "lsr r11, r6, #16\n\t"
  39769. "lsl r6, r6, #16\n\t"
  39770. "adds r10, r10, r6\n\t"
  39771. "adc r4, r4, r11\n\t"
  39772. "adds r10, r10, r5\n\t"
  39773. "str r10, [%[a], #308]\n\t"
  39774. "adc r4, r4, #0\n\t"
  39775. /* a[i+78] += m[78] * mu */
  39776. "ldr r7, [%[m], #312]\n\t"
  39777. "ldr r10, [%[a], #312]\n\t"
  39778. "lsr r11, r7, #16\n\t"
  39779. "lsr r6, r8, #16\n\t"
  39780. "mul r5, r6, r11\n\t"
  39781. "lsl r11, r7, #16\n\t"
  39782. "lsr r11, r11, #16\n\t"
  39783. "mul r6, r11, r6\n\t"
  39784. "lsr r11, r6, #16\n\t"
  39785. "lsl r6, r6, #16\n\t"
  39786. "adds r10, r10, r6\n\t"
  39787. "adc r5, r5, r11\n\t"
  39788. "lsl r6, r8, #16\n\t"
  39789. "lsl r11, r7, #16\n\t"
  39790. "lsr r6, r6, #16\n\t"
  39791. "lsr r11, r11, #16\n\t"
  39792. "mul r11, r6, r11\n\t"
  39793. "adds r10, r10, r11\n\t"
  39794. "adc r5, r5, #0\n\t"
  39795. "lsr r11, r7, #16\n\t"
  39796. "mul r6, r11, r6\n\t"
  39797. "lsr r11, r6, #16\n\t"
  39798. "lsl r6, r6, #16\n\t"
  39799. "adds r10, r10, r6\n\t"
  39800. "adc r5, r5, r11\n\t"
  39801. "adds r10, r10, r4\n\t"
  39802. "str r10, [%[a], #312]\n\t"
  39803. "adc r5, r5, #0\n\t"
  39804. /* a[i+79] += m[79] * mu */
  39805. "ldr r7, [%[m], #316]\n\t"
  39806. "ldr r10, [%[a], #316]\n\t"
  39807. "lsr r11, r7, #16\n\t"
  39808. "lsr r6, r8, #16\n\t"
  39809. "mul r4, r6, r11\n\t"
  39810. "lsl r11, r7, #16\n\t"
  39811. "lsr r11, r11, #16\n\t"
  39812. "mul r6, r11, r6\n\t"
  39813. "lsr r11, r6, #16\n\t"
  39814. "lsl r6, r6, #16\n\t"
  39815. "adds r10, r10, r6\n\t"
  39816. "adc r4, r4, r11\n\t"
  39817. "lsl r6, r8, #16\n\t"
  39818. "lsl r11, r7, #16\n\t"
  39819. "lsr r6, r6, #16\n\t"
  39820. "lsr r11, r11, #16\n\t"
  39821. "mul r11, r6, r11\n\t"
  39822. "adds r10, r10, r11\n\t"
  39823. "adc r4, r4, #0\n\t"
  39824. "lsr r11, r7, #16\n\t"
  39825. "mul r6, r11, r6\n\t"
  39826. "lsr r11, r6, #16\n\t"
  39827. "lsl r6, r6, #16\n\t"
  39828. "adds r10, r10, r6\n\t"
  39829. "adc r4, r4, r11\n\t"
  39830. "adds r10, r10, r5\n\t"
  39831. "str r10, [%[a], #316]\n\t"
  39832. "adc r4, r4, #0\n\t"
  39833. /* a[i+80] += m[80] * mu */
  39834. "ldr r7, [%[m], #320]\n\t"
  39835. "ldr r10, [%[a], #320]\n\t"
  39836. "lsr r11, r7, #16\n\t"
  39837. "lsr r6, r8, #16\n\t"
  39838. "mul r5, r6, r11\n\t"
  39839. "lsl r11, r7, #16\n\t"
  39840. "lsr r11, r11, #16\n\t"
  39841. "mul r6, r11, r6\n\t"
  39842. "lsr r11, r6, #16\n\t"
  39843. "lsl r6, r6, #16\n\t"
  39844. "adds r10, r10, r6\n\t"
  39845. "adc r5, r5, r11\n\t"
  39846. "lsl r6, r8, #16\n\t"
  39847. "lsl r11, r7, #16\n\t"
  39848. "lsr r6, r6, #16\n\t"
  39849. "lsr r11, r11, #16\n\t"
  39850. "mul r11, r6, r11\n\t"
  39851. "adds r10, r10, r11\n\t"
  39852. "adc r5, r5, #0\n\t"
  39853. "lsr r11, r7, #16\n\t"
  39854. "mul r6, r11, r6\n\t"
  39855. "lsr r11, r6, #16\n\t"
  39856. "lsl r6, r6, #16\n\t"
  39857. "adds r10, r10, r6\n\t"
  39858. "adc r5, r5, r11\n\t"
  39859. "adds r10, r10, r4\n\t"
  39860. "str r10, [%[a], #320]\n\t"
  39861. "adc r5, r5, #0\n\t"
  39862. /* a[i+81] += m[81] * mu */
  39863. "ldr r7, [%[m], #324]\n\t"
  39864. "ldr r10, [%[a], #324]\n\t"
  39865. "lsr r11, r7, #16\n\t"
  39866. "lsr r6, r8, #16\n\t"
  39867. "mul r4, r6, r11\n\t"
  39868. "lsl r11, r7, #16\n\t"
  39869. "lsr r11, r11, #16\n\t"
  39870. "mul r6, r11, r6\n\t"
  39871. "lsr r11, r6, #16\n\t"
  39872. "lsl r6, r6, #16\n\t"
  39873. "adds r10, r10, r6\n\t"
  39874. "adc r4, r4, r11\n\t"
  39875. "lsl r6, r8, #16\n\t"
  39876. "lsl r11, r7, #16\n\t"
  39877. "lsr r6, r6, #16\n\t"
  39878. "lsr r11, r11, #16\n\t"
  39879. "mul r11, r6, r11\n\t"
  39880. "adds r10, r10, r11\n\t"
  39881. "adc r4, r4, #0\n\t"
  39882. "lsr r11, r7, #16\n\t"
  39883. "mul r6, r11, r6\n\t"
  39884. "lsr r11, r6, #16\n\t"
  39885. "lsl r6, r6, #16\n\t"
  39886. "adds r10, r10, r6\n\t"
  39887. "adc r4, r4, r11\n\t"
  39888. "adds r10, r10, r5\n\t"
  39889. "str r10, [%[a], #324]\n\t"
  39890. "adc r4, r4, #0\n\t"
  39891. /* a[i+82] += m[82] * mu */
  39892. "ldr r7, [%[m], #328]\n\t"
  39893. "ldr r10, [%[a], #328]\n\t"
  39894. "lsr r11, r7, #16\n\t"
  39895. "lsr r6, r8, #16\n\t"
  39896. "mul r5, r6, r11\n\t"
  39897. "lsl r11, r7, #16\n\t"
  39898. "lsr r11, r11, #16\n\t"
  39899. "mul r6, r11, r6\n\t"
  39900. "lsr r11, r6, #16\n\t"
  39901. "lsl r6, r6, #16\n\t"
  39902. "adds r10, r10, r6\n\t"
  39903. "adc r5, r5, r11\n\t"
  39904. "lsl r6, r8, #16\n\t"
  39905. "lsl r11, r7, #16\n\t"
  39906. "lsr r6, r6, #16\n\t"
  39907. "lsr r11, r11, #16\n\t"
  39908. "mul r11, r6, r11\n\t"
  39909. "adds r10, r10, r11\n\t"
  39910. "adc r5, r5, #0\n\t"
  39911. "lsr r11, r7, #16\n\t"
  39912. "mul r6, r11, r6\n\t"
  39913. "lsr r11, r6, #16\n\t"
  39914. "lsl r6, r6, #16\n\t"
  39915. "adds r10, r10, r6\n\t"
  39916. "adc r5, r5, r11\n\t"
  39917. "adds r10, r10, r4\n\t"
  39918. "str r10, [%[a], #328]\n\t"
  39919. "adc r5, r5, #0\n\t"
  39920. /* a[i+83] += m[83] * mu */
  39921. "ldr r7, [%[m], #332]\n\t"
  39922. "ldr r10, [%[a], #332]\n\t"
  39923. "lsr r11, r7, #16\n\t"
  39924. "lsr r6, r8, #16\n\t"
  39925. "mul r4, r6, r11\n\t"
  39926. "lsl r11, r7, #16\n\t"
  39927. "lsr r11, r11, #16\n\t"
  39928. "mul r6, r11, r6\n\t"
  39929. "lsr r11, r6, #16\n\t"
  39930. "lsl r6, r6, #16\n\t"
  39931. "adds r10, r10, r6\n\t"
  39932. "adc r4, r4, r11\n\t"
  39933. "lsl r6, r8, #16\n\t"
  39934. "lsl r11, r7, #16\n\t"
  39935. "lsr r6, r6, #16\n\t"
  39936. "lsr r11, r11, #16\n\t"
  39937. "mul r11, r6, r11\n\t"
  39938. "adds r10, r10, r11\n\t"
  39939. "adc r4, r4, #0\n\t"
  39940. "lsr r11, r7, #16\n\t"
  39941. "mul r6, r11, r6\n\t"
  39942. "lsr r11, r6, #16\n\t"
  39943. "lsl r6, r6, #16\n\t"
  39944. "adds r10, r10, r6\n\t"
  39945. "adc r4, r4, r11\n\t"
  39946. "adds r10, r10, r5\n\t"
  39947. "str r10, [%[a], #332]\n\t"
  39948. "adc r4, r4, #0\n\t"
  39949. /* a[i+84] += m[84] * mu */
  39950. "ldr r7, [%[m], #336]\n\t"
  39951. "ldr r10, [%[a], #336]\n\t"
  39952. "lsr r11, r7, #16\n\t"
  39953. "lsr r6, r8, #16\n\t"
  39954. "mul r5, r6, r11\n\t"
  39955. "lsl r11, r7, #16\n\t"
  39956. "lsr r11, r11, #16\n\t"
  39957. "mul r6, r11, r6\n\t"
  39958. "lsr r11, r6, #16\n\t"
  39959. "lsl r6, r6, #16\n\t"
  39960. "adds r10, r10, r6\n\t"
  39961. "adc r5, r5, r11\n\t"
  39962. "lsl r6, r8, #16\n\t"
  39963. "lsl r11, r7, #16\n\t"
  39964. "lsr r6, r6, #16\n\t"
  39965. "lsr r11, r11, #16\n\t"
  39966. "mul r11, r6, r11\n\t"
  39967. "adds r10, r10, r11\n\t"
  39968. "adc r5, r5, #0\n\t"
  39969. "lsr r11, r7, #16\n\t"
  39970. "mul r6, r11, r6\n\t"
  39971. "lsr r11, r6, #16\n\t"
  39972. "lsl r6, r6, #16\n\t"
  39973. "adds r10, r10, r6\n\t"
  39974. "adc r5, r5, r11\n\t"
  39975. "adds r10, r10, r4\n\t"
  39976. "str r10, [%[a], #336]\n\t"
  39977. "adc r5, r5, #0\n\t"
  39978. /* a[i+85] += m[85] * mu */
  39979. "ldr r7, [%[m], #340]\n\t"
  39980. "ldr r10, [%[a], #340]\n\t"
  39981. "lsr r11, r7, #16\n\t"
  39982. "lsr r6, r8, #16\n\t"
  39983. "mul r4, r6, r11\n\t"
  39984. "lsl r11, r7, #16\n\t"
  39985. "lsr r11, r11, #16\n\t"
  39986. "mul r6, r11, r6\n\t"
  39987. "lsr r11, r6, #16\n\t"
  39988. "lsl r6, r6, #16\n\t"
  39989. "adds r10, r10, r6\n\t"
  39990. "adc r4, r4, r11\n\t"
  39991. "lsl r6, r8, #16\n\t"
  39992. "lsl r11, r7, #16\n\t"
  39993. "lsr r6, r6, #16\n\t"
  39994. "lsr r11, r11, #16\n\t"
  39995. "mul r11, r6, r11\n\t"
  39996. "adds r10, r10, r11\n\t"
  39997. "adc r4, r4, #0\n\t"
  39998. "lsr r11, r7, #16\n\t"
  39999. "mul r6, r11, r6\n\t"
  40000. "lsr r11, r6, #16\n\t"
  40001. "lsl r6, r6, #16\n\t"
  40002. "adds r10, r10, r6\n\t"
  40003. "adc r4, r4, r11\n\t"
  40004. "adds r10, r10, r5\n\t"
  40005. "str r10, [%[a], #340]\n\t"
  40006. "adc r4, r4, #0\n\t"
  40007. /* a[i+86] += m[86] * mu */
  40008. "ldr r7, [%[m], #344]\n\t"
  40009. "ldr r10, [%[a], #344]\n\t"
  40010. "lsr r11, r7, #16\n\t"
  40011. "lsr r6, r8, #16\n\t"
  40012. "mul r5, r6, r11\n\t"
  40013. "lsl r11, r7, #16\n\t"
  40014. "lsr r11, r11, #16\n\t"
  40015. "mul r6, r11, r6\n\t"
  40016. "lsr r11, r6, #16\n\t"
  40017. "lsl r6, r6, #16\n\t"
  40018. "adds r10, r10, r6\n\t"
  40019. "adc r5, r5, r11\n\t"
  40020. "lsl r6, r8, #16\n\t"
  40021. "lsl r11, r7, #16\n\t"
  40022. "lsr r6, r6, #16\n\t"
  40023. "lsr r11, r11, #16\n\t"
  40024. "mul r11, r6, r11\n\t"
  40025. "adds r10, r10, r11\n\t"
  40026. "adc r5, r5, #0\n\t"
  40027. "lsr r11, r7, #16\n\t"
  40028. "mul r6, r11, r6\n\t"
  40029. "lsr r11, r6, #16\n\t"
  40030. "lsl r6, r6, #16\n\t"
  40031. "adds r10, r10, r6\n\t"
  40032. "adc r5, r5, r11\n\t"
  40033. "adds r10, r10, r4\n\t"
  40034. "str r10, [%[a], #344]\n\t"
  40035. "adc r5, r5, #0\n\t"
  40036. /* a[i+87] += m[87] * mu */
  40037. "ldr r7, [%[m], #348]\n\t"
  40038. "ldr r10, [%[a], #348]\n\t"
  40039. "lsr r11, r7, #16\n\t"
  40040. "lsr r6, r8, #16\n\t"
  40041. "mul r4, r6, r11\n\t"
  40042. "lsl r11, r7, #16\n\t"
  40043. "lsr r11, r11, #16\n\t"
  40044. "mul r6, r11, r6\n\t"
  40045. "lsr r11, r6, #16\n\t"
  40046. "lsl r6, r6, #16\n\t"
  40047. "adds r10, r10, r6\n\t"
  40048. "adc r4, r4, r11\n\t"
  40049. "lsl r6, r8, #16\n\t"
  40050. "lsl r11, r7, #16\n\t"
  40051. "lsr r6, r6, #16\n\t"
  40052. "lsr r11, r11, #16\n\t"
  40053. "mul r11, r6, r11\n\t"
  40054. "adds r10, r10, r11\n\t"
  40055. "adc r4, r4, #0\n\t"
  40056. "lsr r11, r7, #16\n\t"
  40057. "mul r6, r11, r6\n\t"
  40058. "lsr r11, r6, #16\n\t"
  40059. "lsl r6, r6, #16\n\t"
  40060. "adds r10, r10, r6\n\t"
  40061. "adc r4, r4, r11\n\t"
  40062. "adds r10, r10, r5\n\t"
  40063. "str r10, [%[a], #348]\n\t"
  40064. "adc r4, r4, #0\n\t"
  40065. /* a[i+88] += m[88] * mu */
  40066. "ldr r7, [%[m], #352]\n\t"
  40067. "ldr r10, [%[a], #352]\n\t"
  40068. "lsr r11, r7, #16\n\t"
  40069. "lsr r6, r8, #16\n\t"
  40070. "mul r5, r6, r11\n\t"
  40071. "lsl r11, r7, #16\n\t"
  40072. "lsr r11, r11, #16\n\t"
  40073. "mul r6, r11, r6\n\t"
  40074. "lsr r11, r6, #16\n\t"
  40075. "lsl r6, r6, #16\n\t"
  40076. "adds r10, r10, r6\n\t"
  40077. "adc r5, r5, r11\n\t"
  40078. "lsl r6, r8, #16\n\t"
  40079. "lsl r11, r7, #16\n\t"
  40080. "lsr r6, r6, #16\n\t"
  40081. "lsr r11, r11, #16\n\t"
  40082. "mul r11, r6, r11\n\t"
  40083. "adds r10, r10, r11\n\t"
  40084. "adc r5, r5, #0\n\t"
  40085. "lsr r11, r7, #16\n\t"
  40086. "mul r6, r11, r6\n\t"
  40087. "lsr r11, r6, #16\n\t"
  40088. "lsl r6, r6, #16\n\t"
  40089. "adds r10, r10, r6\n\t"
  40090. "adc r5, r5, r11\n\t"
  40091. "adds r10, r10, r4\n\t"
  40092. "str r10, [%[a], #352]\n\t"
  40093. "adc r5, r5, #0\n\t"
  40094. /* a[i+89] += m[89] * mu */
  40095. "ldr r7, [%[m], #356]\n\t"
  40096. "ldr r10, [%[a], #356]\n\t"
  40097. "lsr r11, r7, #16\n\t"
  40098. "lsr r6, r8, #16\n\t"
  40099. "mul r4, r6, r11\n\t"
  40100. "lsl r11, r7, #16\n\t"
  40101. "lsr r11, r11, #16\n\t"
  40102. "mul r6, r11, r6\n\t"
  40103. "lsr r11, r6, #16\n\t"
  40104. "lsl r6, r6, #16\n\t"
  40105. "adds r10, r10, r6\n\t"
  40106. "adc r4, r4, r11\n\t"
  40107. "lsl r6, r8, #16\n\t"
  40108. "lsl r11, r7, #16\n\t"
  40109. "lsr r6, r6, #16\n\t"
  40110. "lsr r11, r11, #16\n\t"
  40111. "mul r11, r6, r11\n\t"
  40112. "adds r10, r10, r11\n\t"
  40113. "adc r4, r4, #0\n\t"
  40114. "lsr r11, r7, #16\n\t"
  40115. "mul r6, r11, r6\n\t"
  40116. "lsr r11, r6, #16\n\t"
  40117. "lsl r6, r6, #16\n\t"
  40118. "adds r10, r10, r6\n\t"
  40119. "adc r4, r4, r11\n\t"
  40120. "adds r10, r10, r5\n\t"
  40121. "str r10, [%[a], #356]\n\t"
  40122. "adc r4, r4, #0\n\t"
  40123. /* a[i+90] += m[90] * mu */
  40124. "ldr r7, [%[m], #360]\n\t"
  40125. "ldr r10, [%[a], #360]\n\t"
  40126. "lsr r11, r7, #16\n\t"
  40127. "lsr r6, r8, #16\n\t"
  40128. "mul r5, r6, r11\n\t"
  40129. "lsl r11, r7, #16\n\t"
  40130. "lsr r11, r11, #16\n\t"
  40131. "mul r6, r11, r6\n\t"
  40132. "lsr r11, r6, #16\n\t"
  40133. "lsl r6, r6, #16\n\t"
  40134. "adds r10, r10, r6\n\t"
  40135. "adc r5, r5, r11\n\t"
  40136. "lsl r6, r8, #16\n\t"
  40137. "lsl r11, r7, #16\n\t"
  40138. "lsr r6, r6, #16\n\t"
  40139. "lsr r11, r11, #16\n\t"
  40140. "mul r11, r6, r11\n\t"
  40141. "adds r10, r10, r11\n\t"
  40142. "adc r5, r5, #0\n\t"
  40143. "lsr r11, r7, #16\n\t"
  40144. "mul r6, r11, r6\n\t"
  40145. "lsr r11, r6, #16\n\t"
  40146. "lsl r6, r6, #16\n\t"
  40147. "adds r10, r10, r6\n\t"
  40148. "adc r5, r5, r11\n\t"
  40149. "adds r10, r10, r4\n\t"
  40150. "str r10, [%[a], #360]\n\t"
  40151. "adc r5, r5, #0\n\t"
  40152. /* a[i+91] += m[91] * mu */
  40153. "ldr r7, [%[m], #364]\n\t"
  40154. "ldr r10, [%[a], #364]\n\t"
  40155. "lsr r11, r7, #16\n\t"
  40156. "lsr r6, r8, #16\n\t"
  40157. "mul r4, r6, r11\n\t"
  40158. "lsl r11, r7, #16\n\t"
  40159. "lsr r11, r11, #16\n\t"
  40160. "mul r6, r11, r6\n\t"
  40161. "lsr r11, r6, #16\n\t"
  40162. "lsl r6, r6, #16\n\t"
  40163. "adds r10, r10, r6\n\t"
  40164. "adc r4, r4, r11\n\t"
  40165. "lsl r6, r8, #16\n\t"
  40166. "lsl r11, r7, #16\n\t"
  40167. "lsr r6, r6, #16\n\t"
  40168. "lsr r11, r11, #16\n\t"
  40169. "mul r11, r6, r11\n\t"
  40170. "adds r10, r10, r11\n\t"
  40171. "adc r4, r4, #0\n\t"
  40172. "lsr r11, r7, #16\n\t"
  40173. "mul r6, r11, r6\n\t"
  40174. "lsr r11, r6, #16\n\t"
  40175. "lsl r6, r6, #16\n\t"
  40176. "adds r10, r10, r6\n\t"
  40177. "adc r4, r4, r11\n\t"
  40178. "adds r10, r10, r5\n\t"
  40179. "str r10, [%[a], #364]\n\t"
  40180. "adc r4, r4, #0\n\t"
  40181. /* a[i+92] += m[92] * mu */
  40182. "ldr r7, [%[m], #368]\n\t"
  40183. "ldr r10, [%[a], #368]\n\t"
  40184. "lsr r11, r7, #16\n\t"
  40185. "lsr r6, r8, #16\n\t"
  40186. "mul r5, r6, r11\n\t"
  40187. "lsl r11, r7, #16\n\t"
  40188. "lsr r11, r11, #16\n\t"
  40189. "mul r6, r11, r6\n\t"
  40190. "lsr r11, r6, #16\n\t"
  40191. "lsl r6, r6, #16\n\t"
  40192. "adds r10, r10, r6\n\t"
  40193. "adc r5, r5, r11\n\t"
  40194. "lsl r6, r8, #16\n\t"
  40195. "lsl r11, r7, #16\n\t"
  40196. "lsr r6, r6, #16\n\t"
  40197. "lsr r11, r11, #16\n\t"
  40198. "mul r11, r6, r11\n\t"
  40199. "adds r10, r10, r11\n\t"
  40200. "adc r5, r5, #0\n\t"
  40201. "lsr r11, r7, #16\n\t"
  40202. "mul r6, r11, r6\n\t"
  40203. "lsr r11, r6, #16\n\t"
  40204. "lsl r6, r6, #16\n\t"
  40205. "adds r10, r10, r6\n\t"
  40206. "adc r5, r5, r11\n\t"
  40207. "adds r10, r10, r4\n\t"
  40208. "str r10, [%[a], #368]\n\t"
  40209. "adc r5, r5, #0\n\t"
  40210. /* a[i+93] += m[93] * mu */
  40211. "ldr r7, [%[m], #372]\n\t"
  40212. "ldr r10, [%[a], #372]\n\t"
  40213. "lsr r11, r7, #16\n\t"
  40214. "lsr r6, r8, #16\n\t"
  40215. "mul r4, r6, r11\n\t"
  40216. "lsl r11, r7, #16\n\t"
  40217. "lsr r11, r11, #16\n\t"
  40218. "mul r6, r11, r6\n\t"
  40219. "lsr r11, r6, #16\n\t"
  40220. "lsl r6, r6, #16\n\t"
  40221. "adds r10, r10, r6\n\t"
  40222. "adc r4, r4, r11\n\t"
  40223. "lsl r6, r8, #16\n\t"
  40224. "lsl r11, r7, #16\n\t"
  40225. "lsr r6, r6, #16\n\t"
  40226. "lsr r11, r11, #16\n\t"
  40227. "mul r11, r6, r11\n\t"
  40228. "adds r10, r10, r11\n\t"
  40229. "adc r4, r4, #0\n\t"
  40230. "lsr r11, r7, #16\n\t"
  40231. "mul r6, r11, r6\n\t"
  40232. "lsr r11, r6, #16\n\t"
  40233. "lsl r6, r6, #16\n\t"
  40234. "adds r10, r10, r6\n\t"
  40235. "adc r4, r4, r11\n\t"
  40236. "adds r10, r10, r5\n\t"
  40237. "str r10, [%[a], #372]\n\t"
  40238. "adc r4, r4, #0\n\t"
  40239. /* a[i+94] += m[94] * mu */
  40240. "ldr r7, [%[m], #376]\n\t"
  40241. "ldr r10, [%[a], #376]\n\t"
  40242. "lsr r11, r7, #16\n\t"
  40243. "lsr r6, r8, #16\n\t"
  40244. "mul r5, r6, r11\n\t"
  40245. "lsl r11, r7, #16\n\t"
  40246. "lsr r11, r11, #16\n\t"
  40247. "mul r6, r11, r6\n\t"
  40248. "lsr r11, r6, #16\n\t"
  40249. "lsl r6, r6, #16\n\t"
  40250. "adds r10, r10, r6\n\t"
  40251. "adc r5, r5, r11\n\t"
  40252. "lsl r6, r8, #16\n\t"
  40253. "lsl r11, r7, #16\n\t"
  40254. "lsr r6, r6, #16\n\t"
  40255. "lsr r11, r11, #16\n\t"
  40256. "mul r11, r6, r11\n\t"
  40257. "adds r10, r10, r11\n\t"
  40258. "adc r5, r5, #0\n\t"
  40259. "lsr r11, r7, #16\n\t"
  40260. "mul r6, r11, r6\n\t"
  40261. "lsr r11, r6, #16\n\t"
  40262. "lsl r6, r6, #16\n\t"
  40263. "adds r10, r10, r6\n\t"
  40264. "adc r5, r5, r11\n\t"
  40265. "adds r10, r10, r4\n\t"
  40266. "str r10, [%[a], #376]\n\t"
  40267. "adc r5, r5, #0\n\t"
  40268. /* a[i+95] += m[95] * mu */
  40269. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  40270. "ldr r11, [%[m], #380]\n\t"
  40271. #else
  40272. "ldr r7, [%[m], #380]\n\t"
  40273. #endif
  40274. "ldr r10, [%[a], #380]\n\t"
  40275. "lsl r6, r8, #16\n\t"
  40276. "lsl r7, r11, #16\n\t"
  40277. "lsr r6, r6, #16\n\t"
  40278. "lsr r7, r7, #16\n\t"
  40279. "mul r7, r6, r7\n\t"
  40280. "adds r5, r5, r7\n\t"
  40281. "adcs r4, r3, #0\n\t"
  40282. "mov r3, #0\n\t"
  40283. "adc r3, r3, r3\n\t"
  40284. "lsr r7, r11, #16\n\t"
  40285. "mul r6, r7, r6\n\t"
  40286. "lsr r7, r6, #16\n\t"
  40287. "lsl r6, r6, #16\n\t"
  40288. "adds r5, r5, r6\n\t"
  40289. "adcs r4, r4, r7\n\t"
  40290. "adc r3, r3, #0\n\t"
  40291. "mov r6, r8\n\t"
  40292. "lsr r7, r11, #16\n\t"
  40293. "lsr r6, r6, #16\n\t"
  40294. "mul r7, r6, r7\n\t"
  40295. "adds r4, r4, r7\n\t"
  40296. "lsl r7, r11, #16\n\t"
  40297. "adc r3, r3, #0\n\t"
  40298. "lsr r7, r7, #16\n\t"
  40299. "mul r6, r7, r6\n\t"
  40300. "lsr r7, r6, #16\n\t"
  40301. "lsl r6, r6, #16\n\t"
  40302. "adds r5, r5, r6\n\t"
  40303. "adcs r4, r4, r7\n\t"
  40304. "adc r3, r3, #0\n\t"
  40305. "adds r10, r10, r5\n\t"
  40306. "str r10, [%[a], #380]\n\t"
  40307. "ldr r10, [%[a], #384]\n\t"
  40308. "adcs r10, r10, r4\n\t"
  40309. "str r10, [%[a], #384]\n\t"
  40310. "adc r3, r3, #0\n\t"
  40311. /* i += 1 */
  40312. "add r9, r9, #4\n\t"
  40313. "add %[a], %[a], #4\n\t"
  40314. "cmp r9, #0x180\n\t"
  40315. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  40316. /* Loop Done */
  40317. "str r12, [%[a]]\n\t"
  40318. "str lr, [%[a], #4]\n\t"
  40319. "mov %[mp], r3\n\t"
  40320. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  40321. :
  40322. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  40323. );
  40324. sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp);
  40325. }
  40326. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  40327. /* Reduce the number back to 3072 bits using Montgomery reduction.
  40328. *
  40329. * a A single precision number to reduce in place.
  40330. * m The single precision number representing the modulus.
  40331. * mp The digit representing the negative inverse of m mod 2^n.
  40332. */
  40333. static SP_NOINLINE void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  40334. {
  40335. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  40336. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  40337. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  40338. __asm__ __volatile__ (
  40339. "ldr r11, [%[m]]\n\t"
  40340. /* i = 0 */
  40341. "mov r9, #0\n\t"
  40342. "mov r3, #0\n\t"
  40343. "ldr r12, [%[a]]\n\t"
  40344. "ldr lr, [%[a], #4]\n\t"
  40345. "\n"
  40346. "L_sp_3072_mont_reduce_96_word_%=: \n\t"
  40347. /* mu = a[i] * mp */
  40348. "mul r8, %[mp], r12\n\t"
  40349. /* a[i+0] += m[0] * mu */
  40350. "mov r5, #0\n\t"
  40351. "umlal r12, r5, r8, r11\n\t"
  40352. /* a[i+1] += m[1] * mu */
  40353. "ldr r7, [%[m], #4]\n\t"
  40354. "mov r4, #0\n\t"
  40355. "umlal lr, r4, r8, r7\n\t"
  40356. "mov r12, lr\n\t"
  40357. "adds r12, r12, r5\n\t"
  40358. "adc r4, r4, #0\n\t"
  40359. /* a[i+2] += m[2] * mu */
  40360. "ldr r7, [%[m], #8]\n\t"
  40361. "ldr lr, [%[a], #8]\n\t"
  40362. "mov r5, #0\n\t"
  40363. "umlal lr, r5, r8, r7\n\t"
  40364. "adds lr, lr, r4\n\t"
  40365. "adc r5, r5, #0\n\t"
  40366. /* a[i+3] += m[3] * mu */
  40367. "ldr r7, [%[m], #12]\n\t"
  40368. "ldr r10, [%[a], #12]\n\t"
  40369. "mov r4, #0\n\t"
  40370. "umlal r10, r4, r8, r7\n\t"
  40371. "adds r10, r10, r5\n\t"
  40372. "str r10, [%[a], #12]\n\t"
  40373. "adc r4, r4, #0\n\t"
  40374. /* a[i+4] += m[4] * mu */
  40375. "ldr r7, [%[m], #16]\n\t"
  40376. "ldr r10, [%[a], #16]\n\t"
  40377. "mov r5, #0\n\t"
  40378. "umlal r10, r5, r8, r7\n\t"
  40379. "adds r10, r10, r4\n\t"
  40380. "str r10, [%[a], #16]\n\t"
  40381. "adc r5, r5, #0\n\t"
  40382. /* a[i+5] += m[5] * mu */
  40383. "ldr r7, [%[m], #20]\n\t"
  40384. "ldr r10, [%[a], #20]\n\t"
  40385. "mov r4, #0\n\t"
  40386. "umlal r10, r4, r8, r7\n\t"
  40387. "adds r10, r10, r5\n\t"
  40388. "str r10, [%[a], #20]\n\t"
  40389. "adc r4, r4, #0\n\t"
  40390. /* a[i+6] += m[6] * mu */
  40391. "ldr r7, [%[m], #24]\n\t"
  40392. "ldr r10, [%[a], #24]\n\t"
  40393. "mov r5, #0\n\t"
  40394. "umlal r10, r5, r8, r7\n\t"
  40395. "adds r10, r10, r4\n\t"
  40396. "str r10, [%[a], #24]\n\t"
  40397. "adc r5, r5, #0\n\t"
  40398. /* a[i+7] += m[7] * mu */
  40399. "ldr r7, [%[m], #28]\n\t"
  40400. "ldr r10, [%[a], #28]\n\t"
  40401. "mov r4, #0\n\t"
  40402. "umlal r10, r4, r8, r7\n\t"
  40403. "adds r10, r10, r5\n\t"
  40404. "str r10, [%[a], #28]\n\t"
  40405. "adc r4, r4, #0\n\t"
  40406. /* a[i+8] += m[8] * mu */
  40407. "ldr r7, [%[m], #32]\n\t"
  40408. "ldr r10, [%[a], #32]\n\t"
  40409. "mov r5, #0\n\t"
  40410. "umlal r10, r5, r8, r7\n\t"
  40411. "adds r10, r10, r4\n\t"
  40412. "str r10, [%[a], #32]\n\t"
  40413. "adc r5, r5, #0\n\t"
  40414. /* a[i+9] += m[9] * mu */
  40415. "ldr r7, [%[m], #36]\n\t"
  40416. "ldr r10, [%[a], #36]\n\t"
  40417. "mov r4, #0\n\t"
  40418. "umlal r10, r4, r8, r7\n\t"
  40419. "adds r10, r10, r5\n\t"
  40420. "str r10, [%[a], #36]\n\t"
  40421. "adc r4, r4, #0\n\t"
  40422. /* a[i+10] += m[10] * mu */
  40423. "ldr r7, [%[m], #40]\n\t"
  40424. "ldr r10, [%[a], #40]\n\t"
  40425. "mov r5, #0\n\t"
  40426. "umlal r10, r5, r8, r7\n\t"
  40427. "adds r10, r10, r4\n\t"
  40428. "str r10, [%[a], #40]\n\t"
  40429. "adc r5, r5, #0\n\t"
  40430. /* a[i+11] += m[11] * mu */
  40431. "ldr r7, [%[m], #44]\n\t"
  40432. "ldr r10, [%[a], #44]\n\t"
  40433. "mov r4, #0\n\t"
  40434. "umlal r10, r4, r8, r7\n\t"
  40435. "adds r10, r10, r5\n\t"
  40436. "str r10, [%[a], #44]\n\t"
  40437. "adc r4, r4, #0\n\t"
  40438. /* a[i+12] += m[12] * mu */
  40439. "ldr r7, [%[m], #48]\n\t"
  40440. "ldr r10, [%[a], #48]\n\t"
  40441. "mov r5, #0\n\t"
  40442. "umlal r10, r5, r8, r7\n\t"
  40443. "adds r10, r10, r4\n\t"
  40444. "str r10, [%[a], #48]\n\t"
  40445. "adc r5, r5, #0\n\t"
  40446. /* a[i+13] += m[13] * mu */
  40447. "ldr r7, [%[m], #52]\n\t"
  40448. "ldr r10, [%[a], #52]\n\t"
  40449. "mov r4, #0\n\t"
  40450. "umlal r10, r4, r8, r7\n\t"
  40451. "adds r10, r10, r5\n\t"
  40452. "str r10, [%[a], #52]\n\t"
  40453. "adc r4, r4, #0\n\t"
  40454. /* a[i+14] += m[14] * mu */
  40455. "ldr r7, [%[m], #56]\n\t"
  40456. "ldr r10, [%[a], #56]\n\t"
  40457. "mov r5, #0\n\t"
  40458. "umlal r10, r5, r8, r7\n\t"
  40459. "adds r10, r10, r4\n\t"
  40460. "str r10, [%[a], #56]\n\t"
  40461. "adc r5, r5, #0\n\t"
  40462. /* a[i+15] += m[15] * mu */
  40463. "ldr r7, [%[m], #60]\n\t"
  40464. "ldr r10, [%[a], #60]\n\t"
  40465. "mov r4, #0\n\t"
  40466. "umlal r10, r4, r8, r7\n\t"
  40467. "adds r10, r10, r5\n\t"
  40468. "str r10, [%[a], #60]\n\t"
  40469. "adc r4, r4, #0\n\t"
  40470. /* a[i+16] += m[16] * mu */
  40471. "ldr r7, [%[m], #64]\n\t"
  40472. "ldr r10, [%[a], #64]\n\t"
  40473. "mov r5, #0\n\t"
  40474. "umlal r10, r5, r8, r7\n\t"
  40475. "adds r10, r10, r4\n\t"
  40476. "str r10, [%[a], #64]\n\t"
  40477. "adc r5, r5, #0\n\t"
  40478. /* a[i+17] += m[17] * mu */
  40479. "ldr r7, [%[m], #68]\n\t"
  40480. "ldr r10, [%[a], #68]\n\t"
  40481. "mov r4, #0\n\t"
  40482. "umlal r10, r4, r8, r7\n\t"
  40483. "adds r10, r10, r5\n\t"
  40484. "str r10, [%[a], #68]\n\t"
  40485. "adc r4, r4, #0\n\t"
  40486. /* a[i+18] += m[18] * mu */
  40487. "ldr r7, [%[m], #72]\n\t"
  40488. "ldr r10, [%[a], #72]\n\t"
  40489. "mov r5, #0\n\t"
  40490. "umlal r10, r5, r8, r7\n\t"
  40491. "adds r10, r10, r4\n\t"
  40492. "str r10, [%[a], #72]\n\t"
  40493. "adc r5, r5, #0\n\t"
  40494. /* a[i+19] += m[19] * mu */
  40495. "ldr r7, [%[m], #76]\n\t"
  40496. "ldr r10, [%[a], #76]\n\t"
  40497. "mov r4, #0\n\t"
  40498. "umlal r10, r4, r8, r7\n\t"
  40499. "adds r10, r10, r5\n\t"
  40500. "str r10, [%[a], #76]\n\t"
  40501. "adc r4, r4, #0\n\t"
  40502. /* a[i+20] += m[20] * mu */
  40503. "ldr r7, [%[m], #80]\n\t"
  40504. "ldr r10, [%[a], #80]\n\t"
  40505. "mov r5, #0\n\t"
  40506. "umlal r10, r5, r8, r7\n\t"
  40507. "adds r10, r10, r4\n\t"
  40508. "str r10, [%[a], #80]\n\t"
  40509. "adc r5, r5, #0\n\t"
  40510. /* a[i+21] += m[21] * mu */
  40511. "ldr r7, [%[m], #84]\n\t"
  40512. "ldr r10, [%[a], #84]\n\t"
  40513. "mov r4, #0\n\t"
  40514. "umlal r10, r4, r8, r7\n\t"
  40515. "adds r10, r10, r5\n\t"
  40516. "str r10, [%[a], #84]\n\t"
  40517. "adc r4, r4, #0\n\t"
  40518. /* a[i+22] += m[22] * mu */
  40519. "ldr r7, [%[m], #88]\n\t"
  40520. "ldr r10, [%[a], #88]\n\t"
  40521. "mov r5, #0\n\t"
  40522. "umlal r10, r5, r8, r7\n\t"
  40523. "adds r10, r10, r4\n\t"
  40524. "str r10, [%[a], #88]\n\t"
  40525. "adc r5, r5, #0\n\t"
  40526. /* a[i+23] += m[23] * mu */
  40527. "ldr r7, [%[m], #92]\n\t"
  40528. "ldr r10, [%[a], #92]\n\t"
  40529. "mov r4, #0\n\t"
  40530. "umlal r10, r4, r8, r7\n\t"
  40531. "adds r10, r10, r5\n\t"
  40532. "str r10, [%[a], #92]\n\t"
  40533. "adc r4, r4, #0\n\t"
  40534. /* a[i+24] += m[24] * mu */
  40535. "ldr r7, [%[m], #96]\n\t"
  40536. "ldr r10, [%[a], #96]\n\t"
  40537. "mov r5, #0\n\t"
  40538. "umlal r10, r5, r8, r7\n\t"
  40539. "adds r10, r10, r4\n\t"
  40540. "str r10, [%[a], #96]\n\t"
  40541. "adc r5, r5, #0\n\t"
  40542. /* a[i+25] += m[25] * mu */
  40543. "ldr r7, [%[m], #100]\n\t"
  40544. "ldr r10, [%[a], #100]\n\t"
  40545. "mov r4, #0\n\t"
  40546. "umlal r10, r4, r8, r7\n\t"
  40547. "adds r10, r10, r5\n\t"
  40548. "str r10, [%[a], #100]\n\t"
  40549. "adc r4, r4, #0\n\t"
  40550. /* a[i+26] += m[26] * mu */
  40551. "ldr r7, [%[m], #104]\n\t"
  40552. "ldr r10, [%[a], #104]\n\t"
  40553. "mov r5, #0\n\t"
  40554. "umlal r10, r5, r8, r7\n\t"
  40555. "adds r10, r10, r4\n\t"
  40556. "str r10, [%[a], #104]\n\t"
  40557. "adc r5, r5, #0\n\t"
  40558. /* a[i+27] += m[27] * mu */
  40559. "ldr r7, [%[m], #108]\n\t"
  40560. "ldr r10, [%[a], #108]\n\t"
  40561. "mov r4, #0\n\t"
  40562. "umlal r10, r4, r8, r7\n\t"
  40563. "adds r10, r10, r5\n\t"
  40564. "str r10, [%[a], #108]\n\t"
  40565. "adc r4, r4, #0\n\t"
  40566. /* a[i+28] += m[28] * mu */
  40567. "ldr r7, [%[m], #112]\n\t"
  40568. "ldr r10, [%[a], #112]\n\t"
  40569. "mov r5, #0\n\t"
  40570. "umlal r10, r5, r8, r7\n\t"
  40571. "adds r10, r10, r4\n\t"
  40572. "str r10, [%[a], #112]\n\t"
  40573. "adc r5, r5, #0\n\t"
  40574. /* a[i+29] += m[29] * mu */
  40575. "ldr r7, [%[m], #116]\n\t"
  40576. "ldr r10, [%[a], #116]\n\t"
  40577. "mov r4, #0\n\t"
  40578. "umlal r10, r4, r8, r7\n\t"
  40579. "adds r10, r10, r5\n\t"
  40580. "str r10, [%[a], #116]\n\t"
  40581. "adc r4, r4, #0\n\t"
  40582. /* a[i+30] += m[30] * mu */
  40583. "ldr r7, [%[m], #120]\n\t"
  40584. "ldr r10, [%[a], #120]\n\t"
  40585. "mov r5, #0\n\t"
  40586. "umlal r10, r5, r8, r7\n\t"
  40587. "adds r10, r10, r4\n\t"
  40588. "str r10, [%[a], #120]\n\t"
  40589. "adc r5, r5, #0\n\t"
  40590. /* a[i+31] += m[31] * mu */
  40591. "ldr r7, [%[m], #124]\n\t"
  40592. "ldr r10, [%[a], #124]\n\t"
  40593. "mov r4, #0\n\t"
  40594. "umlal r10, r4, r8, r7\n\t"
  40595. "adds r10, r10, r5\n\t"
  40596. "str r10, [%[a], #124]\n\t"
  40597. "adc r4, r4, #0\n\t"
  40598. /* a[i+32] += m[32] * mu */
  40599. "ldr r7, [%[m], #128]\n\t"
  40600. "ldr r10, [%[a], #128]\n\t"
  40601. "mov r5, #0\n\t"
  40602. "umlal r10, r5, r8, r7\n\t"
  40603. "adds r10, r10, r4\n\t"
  40604. "str r10, [%[a], #128]\n\t"
  40605. "adc r5, r5, #0\n\t"
  40606. /* a[i+33] += m[33] * mu */
  40607. "ldr r7, [%[m], #132]\n\t"
  40608. "ldr r10, [%[a], #132]\n\t"
  40609. "mov r4, #0\n\t"
  40610. "umlal r10, r4, r8, r7\n\t"
  40611. "adds r10, r10, r5\n\t"
  40612. "str r10, [%[a], #132]\n\t"
  40613. "adc r4, r4, #0\n\t"
  40614. /* a[i+34] += m[34] * mu */
  40615. "ldr r7, [%[m], #136]\n\t"
  40616. "ldr r10, [%[a], #136]\n\t"
  40617. "mov r5, #0\n\t"
  40618. "umlal r10, r5, r8, r7\n\t"
  40619. "adds r10, r10, r4\n\t"
  40620. "str r10, [%[a], #136]\n\t"
  40621. "adc r5, r5, #0\n\t"
  40622. /* a[i+35] += m[35] * mu */
  40623. "ldr r7, [%[m], #140]\n\t"
  40624. "ldr r10, [%[a], #140]\n\t"
  40625. "mov r4, #0\n\t"
  40626. "umlal r10, r4, r8, r7\n\t"
  40627. "adds r10, r10, r5\n\t"
  40628. "str r10, [%[a], #140]\n\t"
  40629. "adc r4, r4, #0\n\t"
  40630. /* a[i+36] += m[36] * mu */
  40631. "ldr r7, [%[m], #144]\n\t"
  40632. "ldr r10, [%[a], #144]\n\t"
  40633. "mov r5, #0\n\t"
  40634. "umlal r10, r5, r8, r7\n\t"
  40635. "adds r10, r10, r4\n\t"
  40636. "str r10, [%[a], #144]\n\t"
  40637. "adc r5, r5, #0\n\t"
  40638. /* a[i+37] += m[37] * mu */
  40639. "ldr r7, [%[m], #148]\n\t"
  40640. "ldr r10, [%[a], #148]\n\t"
  40641. "mov r4, #0\n\t"
  40642. "umlal r10, r4, r8, r7\n\t"
  40643. "adds r10, r10, r5\n\t"
  40644. "str r10, [%[a], #148]\n\t"
  40645. "adc r4, r4, #0\n\t"
  40646. /* a[i+38] += m[38] * mu */
  40647. "ldr r7, [%[m], #152]\n\t"
  40648. "ldr r10, [%[a], #152]\n\t"
  40649. "mov r5, #0\n\t"
  40650. "umlal r10, r5, r8, r7\n\t"
  40651. "adds r10, r10, r4\n\t"
  40652. "str r10, [%[a], #152]\n\t"
  40653. "adc r5, r5, #0\n\t"
  40654. /* a[i+39] += m[39] * mu */
  40655. "ldr r7, [%[m], #156]\n\t"
  40656. "ldr r10, [%[a], #156]\n\t"
  40657. "mov r4, #0\n\t"
  40658. "umlal r10, r4, r8, r7\n\t"
  40659. "adds r10, r10, r5\n\t"
  40660. "str r10, [%[a], #156]\n\t"
  40661. "adc r4, r4, #0\n\t"
  40662. /* a[i+40] += m[40] * mu */
  40663. "ldr r7, [%[m], #160]\n\t"
  40664. "ldr r10, [%[a], #160]\n\t"
  40665. "mov r5, #0\n\t"
  40666. "umlal r10, r5, r8, r7\n\t"
  40667. "adds r10, r10, r4\n\t"
  40668. "str r10, [%[a], #160]\n\t"
  40669. "adc r5, r5, #0\n\t"
  40670. /* a[i+41] += m[41] * mu */
  40671. "ldr r7, [%[m], #164]\n\t"
  40672. "ldr r10, [%[a], #164]\n\t"
  40673. "mov r4, #0\n\t"
  40674. "umlal r10, r4, r8, r7\n\t"
  40675. "adds r10, r10, r5\n\t"
  40676. "str r10, [%[a], #164]\n\t"
  40677. "adc r4, r4, #0\n\t"
  40678. /* a[i+42] += m[42] * mu */
  40679. "ldr r7, [%[m], #168]\n\t"
  40680. "ldr r10, [%[a], #168]\n\t"
  40681. "mov r5, #0\n\t"
  40682. "umlal r10, r5, r8, r7\n\t"
  40683. "adds r10, r10, r4\n\t"
  40684. "str r10, [%[a], #168]\n\t"
  40685. "adc r5, r5, #0\n\t"
  40686. /* a[i+43] += m[43] * mu */
  40687. "ldr r7, [%[m], #172]\n\t"
  40688. "ldr r10, [%[a], #172]\n\t"
  40689. "mov r4, #0\n\t"
  40690. "umlal r10, r4, r8, r7\n\t"
  40691. "adds r10, r10, r5\n\t"
  40692. "str r10, [%[a], #172]\n\t"
  40693. "adc r4, r4, #0\n\t"
  40694. /* a[i+44] += m[44] * mu */
  40695. "ldr r7, [%[m], #176]\n\t"
  40696. "ldr r10, [%[a], #176]\n\t"
  40697. "mov r5, #0\n\t"
  40698. "umlal r10, r5, r8, r7\n\t"
  40699. "adds r10, r10, r4\n\t"
  40700. "str r10, [%[a], #176]\n\t"
  40701. "adc r5, r5, #0\n\t"
  40702. /* a[i+45] += m[45] * mu */
  40703. "ldr r7, [%[m], #180]\n\t"
  40704. "ldr r10, [%[a], #180]\n\t"
  40705. "mov r4, #0\n\t"
  40706. "umlal r10, r4, r8, r7\n\t"
  40707. "adds r10, r10, r5\n\t"
  40708. "str r10, [%[a], #180]\n\t"
  40709. "adc r4, r4, #0\n\t"
  40710. /* a[i+46] += m[46] * mu */
  40711. "ldr r7, [%[m], #184]\n\t"
  40712. "ldr r10, [%[a], #184]\n\t"
  40713. "mov r5, #0\n\t"
  40714. "umlal r10, r5, r8, r7\n\t"
  40715. "adds r10, r10, r4\n\t"
  40716. "str r10, [%[a], #184]\n\t"
  40717. "adc r5, r5, #0\n\t"
  40718. /* a[i+47] += m[47] * mu */
  40719. "ldr r7, [%[m], #188]\n\t"
  40720. "ldr r10, [%[a], #188]\n\t"
  40721. "mov r4, #0\n\t"
  40722. "umlal r10, r4, r8, r7\n\t"
  40723. "adds r10, r10, r5\n\t"
  40724. "str r10, [%[a], #188]\n\t"
  40725. "adc r4, r4, #0\n\t"
  40726. /* a[i+48] += m[48] * mu */
  40727. "ldr r7, [%[m], #192]\n\t"
  40728. "ldr r10, [%[a], #192]\n\t"
  40729. "mov r5, #0\n\t"
  40730. "umlal r10, r5, r8, r7\n\t"
  40731. "adds r10, r10, r4\n\t"
  40732. "str r10, [%[a], #192]\n\t"
  40733. "adc r5, r5, #0\n\t"
  40734. /* a[i+49] += m[49] * mu */
  40735. "ldr r7, [%[m], #196]\n\t"
  40736. "ldr r10, [%[a], #196]\n\t"
  40737. "mov r4, #0\n\t"
  40738. "umlal r10, r4, r8, r7\n\t"
  40739. "adds r10, r10, r5\n\t"
  40740. "str r10, [%[a], #196]\n\t"
  40741. "adc r4, r4, #0\n\t"
  40742. /* a[i+50] += m[50] * mu */
  40743. "ldr r7, [%[m], #200]\n\t"
  40744. "ldr r10, [%[a], #200]\n\t"
  40745. "mov r5, #0\n\t"
  40746. "umlal r10, r5, r8, r7\n\t"
  40747. "adds r10, r10, r4\n\t"
  40748. "str r10, [%[a], #200]\n\t"
  40749. "adc r5, r5, #0\n\t"
  40750. /* a[i+51] += m[51] * mu */
  40751. "ldr r7, [%[m], #204]\n\t"
  40752. "ldr r10, [%[a], #204]\n\t"
  40753. "mov r4, #0\n\t"
  40754. "umlal r10, r4, r8, r7\n\t"
  40755. "adds r10, r10, r5\n\t"
  40756. "str r10, [%[a], #204]\n\t"
  40757. "adc r4, r4, #0\n\t"
  40758. /* a[i+52] += m[52] * mu */
  40759. "ldr r7, [%[m], #208]\n\t"
  40760. "ldr r10, [%[a], #208]\n\t"
  40761. "mov r5, #0\n\t"
  40762. "umlal r10, r5, r8, r7\n\t"
  40763. "adds r10, r10, r4\n\t"
  40764. "str r10, [%[a], #208]\n\t"
  40765. "adc r5, r5, #0\n\t"
  40766. /* a[i+53] += m[53] * mu */
  40767. "ldr r7, [%[m], #212]\n\t"
  40768. "ldr r10, [%[a], #212]\n\t"
  40769. "mov r4, #0\n\t"
  40770. "umlal r10, r4, r8, r7\n\t"
  40771. "adds r10, r10, r5\n\t"
  40772. "str r10, [%[a], #212]\n\t"
  40773. "adc r4, r4, #0\n\t"
  40774. /* a[i+54] += m[54] * mu */
  40775. "ldr r7, [%[m], #216]\n\t"
  40776. "ldr r10, [%[a], #216]\n\t"
  40777. "mov r5, #0\n\t"
  40778. "umlal r10, r5, r8, r7\n\t"
  40779. "adds r10, r10, r4\n\t"
  40780. "str r10, [%[a], #216]\n\t"
  40781. "adc r5, r5, #0\n\t"
  40782. /* a[i+55] += m[55] * mu */
  40783. "ldr r7, [%[m], #220]\n\t"
  40784. "ldr r10, [%[a], #220]\n\t"
  40785. "mov r4, #0\n\t"
  40786. "umlal r10, r4, r8, r7\n\t"
  40787. "adds r10, r10, r5\n\t"
  40788. "str r10, [%[a], #220]\n\t"
  40789. "adc r4, r4, #0\n\t"
  40790. /* a[i+56] += m[56] * mu */
  40791. "ldr r7, [%[m], #224]\n\t"
  40792. "ldr r10, [%[a], #224]\n\t"
  40793. "mov r5, #0\n\t"
  40794. "umlal r10, r5, r8, r7\n\t"
  40795. "adds r10, r10, r4\n\t"
  40796. "str r10, [%[a], #224]\n\t"
  40797. "adc r5, r5, #0\n\t"
  40798. /* a[i+57] += m[57] * mu */
  40799. "ldr r7, [%[m], #228]\n\t"
  40800. "ldr r10, [%[a], #228]\n\t"
  40801. "mov r4, #0\n\t"
  40802. "umlal r10, r4, r8, r7\n\t"
  40803. "adds r10, r10, r5\n\t"
  40804. "str r10, [%[a], #228]\n\t"
  40805. "adc r4, r4, #0\n\t"
  40806. /* a[i+58] += m[58] * mu */
  40807. "ldr r7, [%[m], #232]\n\t"
  40808. "ldr r10, [%[a], #232]\n\t"
  40809. "mov r5, #0\n\t"
  40810. "umlal r10, r5, r8, r7\n\t"
  40811. "adds r10, r10, r4\n\t"
  40812. "str r10, [%[a], #232]\n\t"
  40813. "adc r5, r5, #0\n\t"
  40814. /* a[i+59] += m[59] * mu */
  40815. "ldr r7, [%[m], #236]\n\t"
  40816. "ldr r10, [%[a], #236]\n\t"
  40817. "mov r4, #0\n\t"
  40818. "umlal r10, r4, r8, r7\n\t"
  40819. "adds r10, r10, r5\n\t"
  40820. "str r10, [%[a], #236]\n\t"
  40821. "adc r4, r4, #0\n\t"
  40822. /* a[i+60] += m[60] * mu */
  40823. "ldr r7, [%[m], #240]\n\t"
  40824. "ldr r10, [%[a], #240]\n\t"
  40825. "mov r5, #0\n\t"
  40826. "umlal r10, r5, r8, r7\n\t"
  40827. "adds r10, r10, r4\n\t"
  40828. "str r10, [%[a], #240]\n\t"
  40829. "adc r5, r5, #0\n\t"
  40830. /* a[i+61] += m[61] * mu */
  40831. "ldr r7, [%[m], #244]\n\t"
  40832. "ldr r10, [%[a], #244]\n\t"
  40833. "mov r4, #0\n\t"
  40834. "umlal r10, r4, r8, r7\n\t"
  40835. "adds r10, r10, r5\n\t"
  40836. "str r10, [%[a], #244]\n\t"
  40837. "adc r4, r4, #0\n\t"
  40838. /* a[i+62] += m[62] * mu */
  40839. "ldr r7, [%[m], #248]\n\t"
  40840. "ldr r10, [%[a], #248]\n\t"
  40841. "mov r5, #0\n\t"
  40842. "umlal r10, r5, r8, r7\n\t"
  40843. "adds r10, r10, r4\n\t"
  40844. "str r10, [%[a], #248]\n\t"
  40845. "adc r5, r5, #0\n\t"
  40846. /* a[i+63] += m[63] * mu */
  40847. "ldr r7, [%[m], #252]\n\t"
  40848. "ldr r10, [%[a], #252]\n\t"
  40849. "mov r4, #0\n\t"
  40850. "umlal r10, r4, r8, r7\n\t"
  40851. "adds r10, r10, r5\n\t"
  40852. "str r10, [%[a], #252]\n\t"
  40853. "adc r4, r4, #0\n\t"
  40854. /* a[i+64] += m[64] * mu */
  40855. "ldr r7, [%[m], #256]\n\t"
  40856. "ldr r10, [%[a], #256]\n\t"
  40857. "mov r5, #0\n\t"
  40858. "umlal r10, r5, r8, r7\n\t"
  40859. "adds r10, r10, r4\n\t"
  40860. "str r10, [%[a], #256]\n\t"
  40861. "adc r5, r5, #0\n\t"
  40862. /* a[i+65] += m[65] * mu */
  40863. "ldr r7, [%[m], #260]\n\t"
  40864. "ldr r10, [%[a], #260]\n\t"
  40865. "mov r4, #0\n\t"
  40866. "umlal r10, r4, r8, r7\n\t"
  40867. "adds r10, r10, r5\n\t"
  40868. "str r10, [%[a], #260]\n\t"
  40869. "adc r4, r4, #0\n\t"
  40870. /* a[i+66] += m[66] * mu */
  40871. "ldr r7, [%[m], #264]\n\t"
  40872. "ldr r10, [%[a], #264]\n\t"
  40873. "mov r5, #0\n\t"
  40874. "umlal r10, r5, r8, r7\n\t"
  40875. "adds r10, r10, r4\n\t"
  40876. "str r10, [%[a], #264]\n\t"
  40877. "adc r5, r5, #0\n\t"
  40878. /* a[i+67] += m[67] * mu */
  40879. "ldr r7, [%[m], #268]\n\t"
  40880. "ldr r10, [%[a], #268]\n\t"
  40881. "mov r4, #0\n\t"
  40882. "umlal r10, r4, r8, r7\n\t"
  40883. "adds r10, r10, r5\n\t"
  40884. "str r10, [%[a], #268]\n\t"
  40885. "adc r4, r4, #0\n\t"
  40886. /* a[i+68] += m[68] * mu */
  40887. "ldr r7, [%[m], #272]\n\t"
  40888. "ldr r10, [%[a], #272]\n\t"
  40889. "mov r5, #0\n\t"
  40890. "umlal r10, r5, r8, r7\n\t"
  40891. "adds r10, r10, r4\n\t"
  40892. "str r10, [%[a], #272]\n\t"
  40893. "adc r5, r5, #0\n\t"
  40894. /* a[i+69] += m[69] * mu */
  40895. "ldr r7, [%[m], #276]\n\t"
  40896. "ldr r10, [%[a], #276]\n\t"
  40897. "mov r4, #0\n\t"
  40898. "umlal r10, r4, r8, r7\n\t"
  40899. "adds r10, r10, r5\n\t"
  40900. "str r10, [%[a], #276]\n\t"
  40901. "adc r4, r4, #0\n\t"
  40902. /* a[i+70] += m[70] * mu */
  40903. "ldr r7, [%[m], #280]\n\t"
  40904. "ldr r10, [%[a], #280]\n\t"
  40905. "mov r5, #0\n\t"
  40906. "umlal r10, r5, r8, r7\n\t"
  40907. "adds r10, r10, r4\n\t"
  40908. "str r10, [%[a], #280]\n\t"
  40909. "adc r5, r5, #0\n\t"
  40910. /* a[i+71] += m[71] * mu */
  40911. "ldr r7, [%[m], #284]\n\t"
  40912. "ldr r10, [%[a], #284]\n\t"
  40913. "mov r4, #0\n\t"
  40914. "umlal r10, r4, r8, r7\n\t"
  40915. "adds r10, r10, r5\n\t"
  40916. "str r10, [%[a], #284]\n\t"
  40917. "adc r4, r4, #0\n\t"
  40918. /* a[i+72] += m[72] * mu */
  40919. "ldr r7, [%[m], #288]\n\t"
  40920. "ldr r10, [%[a], #288]\n\t"
  40921. "mov r5, #0\n\t"
  40922. "umlal r10, r5, r8, r7\n\t"
  40923. "adds r10, r10, r4\n\t"
  40924. "str r10, [%[a], #288]\n\t"
  40925. "adc r5, r5, #0\n\t"
  40926. /* a[i+73] += m[73] * mu */
  40927. "ldr r7, [%[m], #292]\n\t"
  40928. "ldr r10, [%[a], #292]\n\t"
  40929. "mov r4, #0\n\t"
  40930. "umlal r10, r4, r8, r7\n\t"
  40931. "adds r10, r10, r5\n\t"
  40932. "str r10, [%[a], #292]\n\t"
  40933. "adc r4, r4, #0\n\t"
  40934. /* a[i+74] += m[74] * mu */
  40935. "ldr r7, [%[m], #296]\n\t"
  40936. "ldr r10, [%[a], #296]\n\t"
  40937. "mov r5, #0\n\t"
  40938. "umlal r10, r5, r8, r7\n\t"
  40939. "adds r10, r10, r4\n\t"
  40940. "str r10, [%[a], #296]\n\t"
  40941. "adc r5, r5, #0\n\t"
  40942. /* a[i+75] += m[75] * mu */
  40943. "ldr r7, [%[m], #300]\n\t"
  40944. "ldr r10, [%[a], #300]\n\t"
  40945. "mov r4, #0\n\t"
  40946. "umlal r10, r4, r8, r7\n\t"
  40947. "adds r10, r10, r5\n\t"
  40948. "str r10, [%[a], #300]\n\t"
  40949. "adc r4, r4, #0\n\t"
  40950. /* a[i+76] += m[76] * mu */
  40951. "ldr r7, [%[m], #304]\n\t"
  40952. "ldr r10, [%[a], #304]\n\t"
  40953. "mov r5, #0\n\t"
  40954. "umlal r10, r5, r8, r7\n\t"
  40955. "adds r10, r10, r4\n\t"
  40956. "str r10, [%[a], #304]\n\t"
  40957. "adc r5, r5, #0\n\t"
  40958. /* a[i+77] += m[77] * mu */
  40959. "ldr r7, [%[m], #308]\n\t"
  40960. "ldr r10, [%[a], #308]\n\t"
  40961. "mov r4, #0\n\t"
  40962. "umlal r10, r4, r8, r7\n\t"
  40963. "adds r10, r10, r5\n\t"
  40964. "str r10, [%[a], #308]\n\t"
  40965. "adc r4, r4, #0\n\t"
  40966. /* a[i+78] += m[78] * mu */
  40967. "ldr r7, [%[m], #312]\n\t"
  40968. "ldr r10, [%[a], #312]\n\t"
  40969. "mov r5, #0\n\t"
  40970. "umlal r10, r5, r8, r7\n\t"
  40971. "adds r10, r10, r4\n\t"
  40972. "str r10, [%[a], #312]\n\t"
  40973. "adc r5, r5, #0\n\t"
  40974. /* a[i+79] += m[79] * mu */
  40975. "ldr r7, [%[m], #316]\n\t"
  40976. "ldr r10, [%[a], #316]\n\t"
  40977. "mov r4, #0\n\t"
  40978. "umlal r10, r4, r8, r7\n\t"
  40979. "adds r10, r10, r5\n\t"
  40980. "str r10, [%[a], #316]\n\t"
  40981. "adc r4, r4, #0\n\t"
  40982. /* a[i+80] += m[80] * mu */
  40983. "ldr r7, [%[m], #320]\n\t"
  40984. "ldr r10, [%[a], #320]\n\t"
  40985. "mov r5, #0\n\t"
  40986. "umlal r10, r5, r8, r7\n\t"
  40987. "adds r10, r10, r4\n\t"
  40988. "str r10, [%[a], #320]\n\t"
  40989. "adc r5, r5, #0\n\t"
  40990. /* a[i+81] += m[81] * mu */
  40991. "ldr r7, [%[m], #324]\n\t"
  40992. "ldr r10, [%[a], #324]\n\t"
  40993. "mov r4, #0\n\t"
  40994. "umlal r10, r4, r8, r7\n\t"
  40995. "adds r10, r10, r5\n\t"
  40996. "str r10, [%[a], #324]\n\t"
  40997. "adc r4, r4, #0\n\t"
  40998. /* a[i+82] += m[82] * mu */
  40999. "ldr r7, [%[m], #328]\n\t"
  41000. "ldr r10, [%[a], #328]\n\t"
  41001. "mov r5, #0\n\t"
  41002. "umlal r10, r5, r8, r7\n\t"
  41003. "adds r10, r10, r4\n\t"
  41004. "str r10, [%[a], #328]\n\t"
  41005. "adc r5, r5, #0\n\t"
  41006. /* a[i+83] += m[83] * mu */
  41007. "ldr r7, [%[m], #332]\n\t"
  41008. "ldr r10, [%[a], #332]\n\t"
  41009. "mov r4, #0\n\t"
  41010. "umlal r10, r4, r8, r7\n\t"
  41011. "adds r10, r10, r5\n\t"
  41012. "str r10, [%[a], #332]\n\t"
  41013. "adc r4, r4, #0\n\t"
  41014. /* a[i+84] += m[84] * mu */
  41015. "ldr r7, [%[m], #336]\n\t"
  41016. "ldr r10, [%[a], #336]\n\t"
  41017. "mov r5, #0\n\t"
  41018. "umlal r10, r5, r8, r7\n\t"
  41019. "adds r10, r10, r4\n\t"
  41020. "str r10, [%[a], #336]\n\t"
  41021. "adc r5, r5, #0\n\t"
  41022. /* a[i+85] += m[85] * mu */
  41023. "ldr r7, [%[m], #340]\n\t"
  41024. "ldr r10, [%[a], #340]\n\t"
  41025. "mov r4, #0\n\t"
  41026. "umlal r10, r4, r8, r7\n\t"
  41027. "adds r10, r10, r5\n\t"
  41028. "str r10, [%[a], #340]\n\t"
  41029. "adc r4, r4, #0\n\t"
  41030. /* a[i+86] += m[86] * mu */
  41031. "ldr r7, [%[m], #344]\n\t"
  41032. "ldr r10, [%[a], #344]\n\t"
  41033. "mov r5, #0\n\t"
  41034. "umlal r10, r5, r8, r7\n\t"
  41035. "adds r10, r10, r4\n\t"
  41036. "str r10, [%[a], #344]\n\t"
  41037. "adc r5, r5, #0\n\t"
  41038. /* a[i+87] += m[87] * mu */
  41039. "ldr r7, [%[m], #348]\n\t"
  41040. "ldr r10, [%[a], #348]\n\t"
  41041. "mov r4, #0\n\t"
  41042. "umlal r10, r4, r8, r7\n\t"
  41043. "adds r10, r10, r5\n\t"
  41044. "str r10, [%[a], #348]\n\t"
  41045. "adc r4, r4, #0\n\t"
  41046. /* a[i+88] += m[88] * mu */
  41047. "ldr r7, [%[m], #352]\n\t"
  41048. "ldr r10, [%[a], #352]\n\t"
  41049. "mov r5, #0\n\t"
  41050. "umlal r10, r5, r8, r7\n\t"
  41051. "adds r10, r10, r4\n\t"
  41052. "str r10, [%[a], #352]\n\t"
  41053. "adc r5, r5, #0\n\t"
  41054. /* a[i+89] += m[89] * mu */
  41055. "ldr r7, [%[m], #356]\n\t"
  41056. "ldr r10, [%[a], #356]\n\t"
  41057. "mov r4, #0\n\t"
  41058. "umlal r10, r4, r8, r7\n\t"
  41059. "adds r10, r10, r5\n\t"
  41060. "str r10, [%[a], #356]\n\t"
  41061. "adc r4, r4, #0\n\t"
  41062. /* a[i+90] += m[90] * mu */
  41063. "ldr r7, [%[m], #360]\n\t"
  41064. "ldr r10, [%[a], #360]\n\t"
  41065. "mov r5, #0\n\t"
  41066. "umlal r10, r5, r8, r7\n\t"
  41067. "adds r10, r10, r4\n\t"
  41068. "str r10, [%[a], #360]\n\t"
  41069. "adc r5, r5, #0\n\t"
  41070. /* a[i+91] += m[91] * mu */
  41071. "ldr r7, [%[m], #364]\n\t"
  41072. "ldr r10, [%[a], #364]\n\t"
  41073. "mov r4, #0\n\t"
  41074. "umlal r10, r4, r8, r7\n\t"
  41075. "adds r10, r10, r5\n\t"
  41076. "str r10, [%[a], #364]\n\t"
  41077. "adc r4, r4, #0\n\t"
  41078. /* a[i+92] += m[92] * mu */
  41079. "ldr r7, [%[m], #368]\n\t"
  41080. "ldr r10, [%[a], #368]\n\t"
  41081. "mov r5, #0\n\t"
  41082. "umlal r10, r5, r8, r7\n\t"
  41083. "adds r10, r10, r4\n\t"
  41084. "str r10, [%[a], #368]\n\t"
  41085. "adc r5, r5, #0\n\t"
  41086. /* a[i+93] += m[93] * mu */
  41087. "ldr r7, [%[m], #372]\n\t"
  41088. "ldr r10, [%[a], #372]\n\t"
  41089. "mov r4, #0\n\t"
  41090. "umlal r10, r4, r8, r7\n\t"
  41091. "adds r10, r10, r5\n\t"
  41092. "str r10, [%[a], #372]\n\t"
  41093. "adc r4, r4, #0\n\t"
  41094. /* a[i+94] += m[94] * mu */
  41095. "ldr r7, [%[m], #376]\n\t"
  41096. "ldr r10, [%[a], #376]\n\t"
  41097. "mov r5, #0\n\t"
  41098. "umlal r10, r5, r8, r7\n\t"
  41099. "adds r10, r10, r4\n\t"
  41100. "str r10, [%[a], #376]\n\t"
  41101. "adc r5, r5, #0\n\t"
  41102. /* a[i+95] += m[95] * mu */
  41103. "ldr r7, [%[m], #380]\n\t"
  41104. "ldr r10, [%[a], #380]\n\t"
  41105. "umull r6, r7, r8, r7\n\t"
  41106. "adds r5, r5, r6\n\t"
  41107. "adcs r4, r7, r3\n\t"
  41108. "mov r3, #0\n\t"
  41109. "adc r3, r3, r3\n\t"
  41110. "adds r10, r10, r5\n\t"
  41111. "str r10, [%[a], #380]\n\t"
  41112. "ldr r10, [%[a], #384]\n\t"
  41113. "adcs r10, r10, r4\n\t"
  41114. "str r10, [%[a], #384]\n\t"
  41115. "adc r3, r3, #0\n\t"
  41116. /* i += 1 */
  41117. "add r9, r9, #4\n\t"
  41118. "add %[a], %[a], #4\n\t"
  41119. "cmp r9, #0x180\n\t"
  41120. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  41121. /* Loop Done */
  41122. "str r12, [%[a]]\n\t"
  41123. "str lr, [%[a], #4]\n\t"
  41124. "mov %[mp], r3\n\t"
  41125. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  41126. :
  41127. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  41128. );
  41129. sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp);
  41130. }
  41131. #else
  41132. /* Reduce the number back to 3072 bits using Montgomery reduction.
  41133. *
  41134. * a A single precision number to reduce in place.
  41135. * m The single precision number representing the modulus.
  41136. * mp The digit representing the negative inverse of m mod 2^n.
  41137. */
  41138. static SP_NOINLINE void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  41139. {
  41140. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  41141. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  41142. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  41143. __asm__ __volatile__ (
  41144. /* i = 0 */
  41145. "mov r12, #0\n\t"
  41146. "mov lr, #0\n\t"
  41147. "ldr r4, [%[a]]\n\t"
  41148. "ldr r5, [%[a], #4]\n\t"
  41149. "ldr r6, [%[a], #8]\n\t"
  41150. "ldr r7, [%[a], #12]\n\t"
  41151. "ldr r8, [%[a], #16]\n\t"
  41152. "\n"
  41153. "L_sp_3072_mont_reduce_96_word_%=: \n\t"
  41154. /* mu = a[i] * mp */
  41155. "mul r11, %[mp], r4\n\t"
  41156. /* a[i+0] += m[0] * mu */
  41157. "ldr r10, [%[m]]\n\t"
  41158. "mov r3, #0\n\t"
  41159. "umaal r4, r3, r11, r10\n\t"
  41160. /* a[i+1] += m[1] * mu */
  41161. "ldr r10, [%[m], #4]\n\t"
  41162. "mov r4, r5\n\t"
  41163. "umaal r4, r3, r11, r10\n\t"
  41164. /* a[i+2] += m[2] * mu */
  41165. "ldr r10, [%[m], #8]\n\t"
  41166. "mov r5, r6\n\t"
  41167. "umaal r5, r3, r11, r10\n\t"
  41168. /* a[i+3] += m[3] * mu */
  41169. "ldr r10, [%[m], #12]\n\t"
  41170. "mov r6, r7\n\t"
  41171. "umaal r6, r3, r11, r10\n\t"
  41172. /* a[i+4] += m[4] * mu */
  41173. "ldr r10, [%[m], #16]\n\t"
  41174. "mov r7, r8\n\t"
  41175. "umaal r7, r3, r11, r10\n\t"
  41176. /* a[i+5] += m[5] * mu */
  41177. "ldr r10, [%[m], #20]\n\t"
  41178. "ldr r8, [%[a], #20]\n\t"
  41179. "umaal r8, r3, r11, r10\n\t"
  41180. /* a[i+6] += m[6] * mu */
  41181. "ldr r10, [%[m], #24]\n\t"
  41182. "ldr r9, [%[a], #24]\n\t"
  41183. "umaal r9, r3, r11, r10\n\t"
  41184. "str r9, [%[a], #24]\n\t"
  41185. /* a[i+7] += m[7] * mu */
  41186. "ldr r10, [%[m], #28]\n\t"
  41187. "ldr r9, [%[a], #28]\n\t"
  41188. "umaal r9, r3, r11, r10\n\t"
  41189. "str r9, [%[a], #28]\n\t"
  41190. /* a[i+8] += m[8] * mu */
  41191. "ldr r10, [%[m], #32]\n\t"
  41192. "ldr r9, [%[a], #32]\n\t"
  41193. "umaal r9, r3, r11, r10\n\t"
  41194. "str r9, [%[a], #32]\n\t"
  41195. /* a[i+9] += m[9] * mu */
  41196. "ldr r10, [%[m], #36]\n\t"
  41197. "ldr r9, [%[a], #36]\n\t"
  41198. "umaal r9, r3, r11, r10\n\t"
  41199. "str r9, [%[a], #36]\n\t"
  41200. /* a[i+10] += m[10] * mu */
  41201. "ldr r10, [%[m], #40]\n\t"
  41202. "ldr r9, [%[a], #40]\n\t"
  41203. "umaal r9, r3, r11, r10\n\t"
  41204. "str r9, [%[a], #40]\n\t"
  41205. /* a[i+11] += m[11] * mu */
  41206. "ldr r10, [%[m], #44]\n\t"
  41207. "ldr r9, [%[a], #44]\n\t"
  41208. "umaal r9, r3, r11, r10\n\t"
  41209. "str r9, [%[a], #44]\n\t"
  41210. /* a[i+12] += m[12] * mu */
  41211. "ldr r10, [%[m], #48]\n\t"
  41212. "ldr r9, [%[a], #48]\n\t"
  41213. "umaal r9, r3, r11, r10\n\t"
  41214. "str r9, [%[a], #48]\n\t"
  41215. /* a[i+13] += m[13] * mu */
  41216. "ldr r10, [%[m], #52]\n\t"
  41217. "ldr r9, [%[a], #52]\n\t"
  41218. "umaal r9, r3, r11, r10\n\t"
  41219. "str r9, [%[a], #52]\n\t"
  41220. /* a[i+14] += m[14] * mu */
  41221. "ldr r10, [%[m], #56]\n\t"
  41222. "ldr r9, [%[a], #56]\n\t"
  41223. "umaal r9, r3, r11, r10\n\t"
  41224. "str r9, [%[a], #56]\n\t"
  41225. /* a[i+15] += m[15] * mu */
  41226. "ldr r10, [%[m], #60]\n\t"
  41227. "ldr r9, [%[a], #60]\n\t"
  41228. "umaal r9, r3, r11, r10\n\t"
  41229. "str r9, [%[a], #60]\n\t"
  41230. /* a[i+16] += m[16] * mu */
  41231. "ldr r10, [%[m], #64]\n\t"
  41232. "ldr r9, [%[a], #64]\n\t"
  41233. "umaal r9, r3, r11, r10\n\t"
  41234. "str r9, [%[a], #64]\n\t"
  41235. /* a[i+17] += m[17] * mu */
  41236. "ldr r10, [%[m], #68]\n\t"
  41237. "ldr r9, [%[a], #68]\n\t"
  41238. "umaal r9, r3, r11, r10\n\t"
  41239. "str r9, [%[a], #68]\n\t"
  41240. /* a[i+18] += m[18] * mu */
  41241. "ldr r10, [%[m], #72]\n\t"
  41242. "ldr r9, [%[a], #72]\n\t"
  41243. "umaal r9, r3, r11, r10\n\t"
  41244. "str r9, [%[a], #72]\n\t"
  41245. /* a[i+19] += m[19] * mu */
  41246. "ldr r10, [%[m], #76]\n\t"
  41247. "ldr r9, [%[a], #76]\n\t"
  41248. "umaal r9, r3, r11, r10\n\t"
  41249. "str r9, [%[a], #76]\n\t"
  41250. /* a[i+20] += m[20] * mu */
  41251. "ldr r10, [%[m], #80]\n\t"
  41252. "ldr r9, [%[a], #80]\n\t"
  41253. "umaal r9, r3, r11, r10\n\t"
  41254. "str r9, [%[a], #80]\n\t"
  41255. /* a[i+21] += m[21] * mu */
  41256. "ldr r10, [%[m], #84]\n\t"
  41257. "ldr r9, [%[a], #84]\n\t"
  41258. "umaal r9, r3, r11, r10\n\t"
  41259. "str r9, [%[a], #84]\n\t"
  41260. /* a[i+22] += m[22] * mu */
  41261. "ldr r10, [%[m], #88]\n\t"
  41262. "ldr r9, [%[a], #88]\n\t"
  41263. "umaal r9, r3, r11, r10\n\t"
  41264. "str r9, [%[a], #88]\n\t"
  41265. /* a[i+23] += m[23] * mu */
  41266. "ldr r10, [%[m], #92]\n\t"
  41267. "ldr r9, [%[a], #92]\n\t"
  41268. "umaal r9, r3, r11, r10\n\t"
  41269. "str r9, [%[a], #92]\n\t"
  41270. /* a[i+24] += m[24] * mu */
  41271. "ldr r10, [%[m], #96]\n\t"
  41272. "ldr r9, [%[a], #96]\n\t"
  41273. "umaal r9, r3, r11, r10\n\t"
  41274. "str r9, [%[a], #96]\n\t"
  41275. /* a[i+25] += m[25] * mu */
  41276. "ldr r10, [%[m], #100]\n\t"
  41277. "ldr r9, [%[a], #100]\n\t"
  41278. "umaal r9, r3, r11, r10\n\t"
  41279. "str r9, [%[a], #100]\n\t"
  41280. /* a[i+26] += m[26] * mu */
  41281. "ldr r10, [%[m], #104]\n\t"
  41282. "ldr r9, [%[a], #104]\n\t"
  41283. "umaal r9, r3, r11, r10\n\t"
  41284. "str r9, [%[a], #104]\n\t"
  41285. /* a[i+27] += m[27] * mu */
  41286. "ldr r10, [%[m], #108]\n\t"
  41287. "ldr r9, [%[a], #108]\n\t"
  41288. "umaal r9, r3, r11, r10\n\t"
  41289. "str r9, [%[a], #108]\n\t"
  41290. /* a[i+28] += m[28] * mu */
  41291. "ldr r10, [%[m], #112]\n\t"
  41292. "ldr r9, [%[a], #112]\n\t"
  41293. "umaal r9, r3, r11, r10\n\t"
  41294. "str r9, [%[a], #112]\n\t"
  41295. /* a[i+29] += m[29] * mu */
  41296. "ldr r10, [%[m], #116]\n\t"
  41297. "ldr r9, [%[a], #116]\n\t"
  41298. "umaal r9, r3, r11, r10\n\t"
  41299. "str r9, [%[a], #116]\n\t"
  41300. /* a[i+30] += m[30] * mu */
  41301. "ldr r10, [%[m], #120]\n\t"
  41302. "ldr r9, [%[a], #120]\n\t"
  41303. "umaal r9, r3, r11, r10\n\t"
  41304. "str r9, [%[a], #120]\n\t"
  41305. /* a[i+31] += m[31] * mu */
  41306. "ldr r10, [%[m], #124]\n\t"
  41307. "ldr r9, [%[a], #124]\n\t"
  41308. "umaal r9, r3, r11, r10\n\t"
  41309. "str r9, [%[a], #124]\n\t"
  41310. /* a[i+32] += m[32] * mu */
  41311. "ldr r10, [%[m], #128]\n\t"
  41312. "ldr r9, [%[a], #128]\n\t"
  41313. "umaal r9, r3, r11, r10\n\t"
  41314. "str r9, [%[a], #128]\n\t"
  41315. /* a[i+33] += m[33] * mu */
  41316. "ldr r10, [%[m], #132]\n\t"
  41317. "ldr r9, [%[a], #132]\n\t"
  41318. "umaal r9, r3, r11, r10\n\t"
  41319. "str r9, [%[a], #132]\n\t"
  41320. /* a[i+34] += m[34] * mu */
  41321. "ldr r10, [%[m], #136]\n\t"
  41322. "ldr r9, [%[a], #136]\n\t"
  41323. "umaal r9, r3, r11, r10\n\t"
  41324. "str r9, [%[a], #136]\n\t"
  41325. /* a[i+35] += m[35] * mu */
  41326. "ldr r10, [%[m], #140]\n\t"
  41327. "ldr r9, [%[a], #140]\n\t"
  41328. "umaal r9, r3, r11, r10\n\t"
  41329. "str r9, [%[a], #140]\n\t"
  41330. /* a[i+36] += m[36] * mu */
  41331. "ldr r10, [%[m], #144]\n\t"
  41332. "ldr r9, [%[a], #144]\n\t"
  41333. "umaal r9, r3, r11, r10\n\t"
  41334. "str r9, [%[a], #144]\n\t"
  41335. /* a[i+37] += m[37] * mu */
  41336. "ldr r10, [%[m], #148]\n\t"
  41337. "ldr r9, [%[a], #148]\n\t"
  41338. "umaal r9, r3, r11, r10\n\t"
  41339. "str r9, [%[a], #148]\n\t"
  41340. /* a[i+38] += m[38] * mu */
  41341. "ldr r10, [%[m], #152]\n\t"
  41342. "ldr r9, [%[a], #152]\n\t"
  41343. "umaal r9, r3, r11, r10\n\t"
  41344. "str r9, [%[a], #152]\n\t"
  41345. /* a[i+39] += m[39] * mu */
  41346. "ldr r10, [%[m], #156]\n\t"
  41347. "ldr r9, [%[a], #156]\n\t"
  41348. "umaal r9, r3, r11, r10\n\t"
  41349. "str r9, [%[a], #156]\n\t"
  41350. /* a[i+40] += m[40] * mu */
  41351. "ldr r10, [%[m], #160]\n\t"
  41352. "ldr r9, [%[a], #160]\n\t"
  41353. "umaal r9, r3, r11, r10\n\t"
  41354. "str r9, [%[a], #160]\n\t"
  41355. /* a[i+41] += m[41] * mu */
  41356. "ldr r10, [%[m], #164]\n\t"
  41357. "ldr r9, [%[a], #164]\n\t"
  41358. "umaal r9, r3, r11, r10\n\t"
  41359. "str r9, [%[a], #164]\n\t"
  41360. /* a[i+42] += m[42] * mu */
  41361. "ldr r10, [%[m], #168]\n\t"
  41362. "ldr r9, [%[a], #168]\n\t"
  41363. "umaal r9, r3, r11, r10\n\t"
  41364. "str r9, [%[a], #168]\n\t"
  41365. /* a[i+43] += m[43] * mu */
  41366. "ldr r10, [%[m], #172]\n\t"
  41367. "ldr r9, [%[a], #172]\n\t"
  41368. "umaal r9, r3, r11, r10\n\t"
  41369. "str r9, [%[a], #172]\n\t"
  41370. /* a[i+44] += m[44] * mu */
  41371. "ldr r10, [%[m], #176]\n\t"
  41372. "ldr r9, [%[a], #176]\n\t"
  41373. "umaal r9, r3, r11, r10\n\t"
  41374. "str r9, [%[a], #176]\n\t"
  41375. /* a[i+45] += m[45] * mu */
  41376. "ldr r10, [%[m], #180]\n\t"
  41377. "ldr r9, [%[a], #180]\n\t"
  41378. "umaal r9, r3, r11, r10\n\t"
  41379. "str r9, [%[a], #180]\n\t"
  41380. /* a[i+46] += m[46] * mu */
  41381. "ldr r10, [%[m], #184]\n\t"
  41382. "ldr r9, [%[a], #184]\n\t"
  41383. "umaal r9, r3, r11, r10\n\t"
  41384. "str r9, [%[a], #184]\n\t"
  41385. /* a[i+47] += m[47] * mu */
  41386. "ldr r10, [%[m], #188]\n\t"
  41387. "ldr r9, [%[a], #188]\n\t"
  41388. "umaal r9, r3, r11, r10\n\t"
  41389. "str r9, [%[a], #188]\n\t"
  41390. /* a[i+48] += m[48] * mu */
  41391. "ldr r10, [%[m], #192]\n\t"
  41392. "ldr r9, [%[a], #192]\n\t"
  41393. "umaal r9, r3, r11, r10\n\t"
  41394. "str r9, [%[a], #192]\n\t"
  41395. /* a[i+49] += m[49] * mu */
  41396. "ldr r10, [%[m], #196]\n\t"
  41397. "ldr r9, [%[a], #196]\n\t"
  41398. "umaal r9, r3, r11, r10\n\t"
  41399. "str r9, [%[a], #196]\n\t"
  41400. /* a[i+50] += m[50] * mu */
  41401. "ldr r10, [%[m], #200]\n\t"
  41402. "ldr r9, [%[a], #200]\n\t"
  41403. "umaal r9, r3, r11, r10\n\t"
  41404. "str r9, [%[a], #200]\n\t"
  41405. /* a[i+51] += m[51] * mu */
  41406. "ldr r10, [%[m], #204]\n\t"
  41407. "ldr r9, [%[a], #204]\n\t"
  41408. "umaal r9, r3, r11, r10\n\t"
  41409. "str r9, [%[a], #204]\n\t"
  41410. /* a[i+52] += m[52] * mu */
  41411. "ldr r10, [%[m], #208]\n\t"
  41412. "ldr r9, [%[a], #208]\n\t"
  41413. "umaal r9, r3, r11, r10\n\t"
  41414. "str r9, [%[a], #208]\n\t"
  41415. /* a[i+53] += m[53] * mu */
  41416. "ldr r10, [%[m], #212]\n\t"
  41417. "ldr r9, [%[a], #212]\n\t"
  41418. "umaal r9, r3, r11, r10\n\t"
  41419. "str r9, [%[a], #212]\n\t"
  41420. /* a[i+54] += m[54] * mu */
  41421. "ldr r10, [%[m], #216]\n\t"
  41422. "ldr r9, [%[a], #216]\n\t"
  41423. "umaal r9, r3, r11, r10\n\t"
  41424. "str r9, [%[a], #216]\n\t"
  41425. /* a[i+55] += m[55] * mu */
  41426. "ldr r10, [%[m], #220]\n\t"
  41427. "ldr r9, [%[a], #220]\n\t"
  41428. "umaal r9, r3, r11, r10\n\t"
  41429. "str r9, [%[a], #220]\n\t"
  41430. /* a[i+56] += m[56] * mu */
  41431. "ldr r10, [%[m], #224]\n\t"
  41432. "ldr r9, [%[a], #224]\n\t"
  41433. "umaal r9, r3, r11, r10\n\t"
  41434. "str r9, [%[a], #224]\n\t"
  41435. /* a[i+57] += m[57] * mu */
  41436. "ldr r10, [%[m], #228]\n\t"
  41437. "ldr r9, [%[a], #228]\n\t"
  41438. "umaal r9, r3, r11, r10\n\t"
  41439. "str r9, [%[a], #228]\n\t"
  41440. /* a[i+58] += m[58] * mu */
  41441. "ldr r10, [%[m], #232]\n\t"
  41442. "ldr r9, [%[a], #232]\n\t"
  41443. "umaal r9, r3, r11, r10\n\t"
  41444. "str r9, [%[a], #232]\n\t"
  41445. /* a[i+59] += m[59] * mu */
  41446. "ldr r10, [%[m], #236]\n\t"
  41447. "ldr r9, [%[a], #236]\n\t"
  41448. "umaal r9, r3, r11, r10\n\t"
  41449. "str r9, [%[a], #236]\n\t"
  41450. /* a[i+60] += m[60] * mu */
  41451. "ldr r10, [%[m], #240]\n\t"
  41452. "ldr r9, [%[a], #240]\n\t"
  41453. "umaal r9, r3, r11, r10\n\t"
  41454. "str r9, [%[a], #240]\n\t"
  41455. /* a[i+61] += m[61] * mu */
  41456. "ldr r10, [%[m], #244]\n\t"
  41457. "ldr r9, [%[a], #244]\n\t"
  41458. "umaal r9, r3, r11, r10\n\t"
  41459. "str r9, [%[a], #244]\n\t"
  41460. /* a[i+62] += m[62] * mu */
  41461. "ldr r10, [%[m], #248]\n\t"
  41462. "ldr r9, [%[a], #248]\n\t"
  41463. "umaal r9, r3, r11, r10\n\t"
  41464. "str r9, [%[a], #248]\n\t"
  41465. /* a[i+63] += m[63] * mu */
  41466. "ldr r10, [%[m], #252]\n\t"
  41467. "ldr r9, [%[a], #252]\n\t"
  41468. "umaal r9, r3, r11, r10\n\t"
  41469. "str r9, [%[a], #252]\n\t"
  41470. /* a[i+64] += m[64] * mu */
  41471. "ldr r10, [%[m], #256]\n\t"
  41472. "ldr r9, [%[a], #256]\n\t"
  41473. "umaal r9, r3, r11, r10\n\t"
  41474. "str r9, [%[a], #256]\n\t"
  41475. /* a[i+65] += m[65] * mu */
  41476. "ldr r10, [%[m], #260]\n\t"
  41477. "ldr r9, [%[a], #260]\n\t"
  41478. "umaal r9, r3, r11, r10\n\t"
  41479. "str r9, [%[a], #260]\n\t"
  41480. /* a[i+66] += m[66] * mu */
  41481. "ldr r10, [%[m], #264]\n\t"
  41482. "ldr r9, [%[a], #264]\n\t"
  41483. "umaal r9, r3, r11, r10\n\t"
  41484. "str r9, [%[a], #264]\n\t"
  41485. /* a[i+67] += m[67] * mu */
  41486. "ldr r10, [%[m], #268]\n\t"
  41487. "ldr r9, [%[a], #268]\n\t"
  41488. "umaal r9, r3, r11, r10\n\t"
  41489. "str r9, [%[a], #268]\n\t"
  41490. /* a[i+68] += m[68] * mu */
  41491. "ldr r10, [%[m], #272]\n\t"
  41492. "ldr r9, [%[a], #272]\n\t"
  41493. "umaal r9, r3, r11, r10\n\t"
  41494. "str r9, [%[a], #272]\n\t"
  41495. /* a[i+69] += m[69] * mu */
  41496. "ldr r10, [%[m], #276]\n\t"
  41497. "ldr r9, [%[a], #276]\n\t"
  41498. "umaal r9, r3, r11, r10\n\t"
  41499. "str r9, [%[a], #276]\n\t"
  41500. /* a[i+70] += m[70] * mu */
  41501. "ldr r10, [%[m], #280]\n\t"
  41502. "ldr r9, [%[a], #280]\n\t"
  41503. "umaal r9, r3, r11, r10\n\t"
  41504. "str r9, [%[a], #280]\n\t"
  41505. /* a[i+71] += m[71] * mu */
  41506. "ldr r10, [%[m], #284]\n\t"
  41507. "ldr r9, [%[a], #284]\n\t"
  41508. "umaal r9, r3, r11, r10\n\t"
  41509. "str r9, [%[a], #284]\n\t"
  41510. /* a[i+72] += m[72] * mu */
  41511. "ldr r10, [%[m], #288]\n\t"
  41512. "ldr r9, [%[a], #288]\n\t"
  41513. "umaal r9, r3, r11, r10\n\t"
  41514. "str r9, [%[a], #288]\n\t"
  41515. /* a[i+73] += m[73] * mu */
  41516. "ldr r10, [%[m], #292]\n\t"
  41517. "ldr r9, [%[a], #292]\n\t"
  41518. "umaal r9, r3, r11, r10\n\t"
  41519. "str r9, [%[a], #292]\n\t"
  41520. /* a[i+74] += m[74] * mu */
  41521. "ldr r10, [%[m], #296]\n\t"
  41522. "ldr r9, [%[a], #296]\n\t"
  41523. "umaal r9, r3, r11, r10\n\t"
  41524. "str r9, [%[a], #296]\n\t"
  41525. /* a[i+75] += m[75] * mu */
  41526. "ldr r10, [%[m], #300]\n\t"
  41527. "ldr r9, [%[a], #300]\n\t"
  41528. "umaal r9, r3, r11, r10\n\t"
  41529. "str r9, [%[a], #300]\n\t"
  41530. /* a[i+76] += m[76] * mu */
  41531. "ldr r10, [%[m], #304]\n\t"
  41532. "ldr r9, [%[a], #304]\n\t"
  41533. "umaal r9, r3, r11, r10\n\t"
  41534. "str r9, [%[a], #304]\n\t"
  41535. /* a[i+77] += m[77] * mu */
  41536. "ldr r10, [%[m], #308]\n\t"
  41537. "ldr r9, [%[a], #308]\n\t"
  41538. "umaal r9, r3, r11, r10\n\t"
  41539. "str r9, [%[a], #308]\n\t"
  41540. /* a[i+78] += m[78] * mu */
  41541. "ldr r10, [%[m], #312]\n\t"
  41542. "ldr r9, [%[a], #312]\n\t"
  41543. "umaal r9, r3, r11, r10\n\t"
  41544. "str r9, [%[a], #312]\n\t"
  41545. /* a[i+79] += m[79] * mu */
  41546. "ldr r10, [%[m], #316]\n\t"
  41547. "ldr r9, [%[a], #316]\n\t"
  41548. "umaal r9, r3, r11, r10\n\t"
  41549. "str r9, [%[a], #316]\n\t"
  41550. /* a[i+80] += m[80] * mu */
  41551. "ldr r10, [%[m], #320]\n\t"
  41552. "ldr r9, [%[a], #320]\n\t"
  41553. "umaal r9, r3, r11, r10\n\t"
  41554. "str r9, [%[a], #320]\n\t"
  41555. /* a[i+81] += m[81] * mu */
  41556. "ldr r10, [%[m], #324]\n\t"
  41557. "ldr r9, [%[a], #324]\n\t"
  41558. "umaal r9, r3, r11, r10\n\t"
  41559. "str r9, [%[a], #324]\n\t"
  41560. /* a[i+82] += m[82] * mu */
  41561. "ldr r10, [%[m], #328]\n\t"
  41562. "ldr r9, [%[a], #328]\n\t"
  41563. "umaal r9, r3, r11, r10\n\t"
  41564. "str r9, [%[a], #328]\n\t"
  41565. /* a[i+83] += m[83] * mu */
  41566. "ldr r10, [%[m], #332]\n\t"
  41567. "ldr r9, [%[a], #332]\n\t"
  41568. "umaal r9, r3, r11, r10\n\t"
  41569. "str r9, [%[a], #332]\n\t"
  41570. /* a[i+84] += m[84] * mu */
  41571. "ldr r10, [%[m], #336]\n\t"
  41572. "ldr r9, [%[a], #336]\n\t"
  41573. "umaal r9, r3, r11, r10\n\t"
  41574. "str r9, [%[a], #336]\n\t"
  41575. /* a[i+85] += m[85] * mu */
  41576. "ldr r10, [%[m], #340]\n\t"
  41577. "ldr r9, [%[a], #340]\n\t"
  41578. "umaal r9, r3, r11, r10\n\t"
  41579. "str r9, [%[a], #340]\n\t"
  41580. /* a[i+86] += m[86] * mu */
  41581. "ldr r10, [%[m], #344]\n\t"
  41582. "ldr r9, [%[a], #344]\n\t"
  41583. "umaal r9, r3, r11, r10\n\t"
  41584. "str r9, [%[a], #344]\n\t"
  41585. /* a[i+87] += m[87] * mu */
  41586. "ldr r10, [%[m], #348]\n\t"
  41587. "ldr r9, [%[a], #348]\n\t"
  41588. "umaal r9, r3, r11, r10\n\t"
  41589. "str r9, [%[a], #348]\n\t"
  41590. /* a[i+88] += m[88] * mu */
  41591. "ldr r10, [%[m], #352]\n\t"
  41592. "ldr r9, [%[a], #352]\n\t"
  41593. "umaal r9, r3, r11, r10\n\t"
  41594. "str r9, [%[a], #352]\n\t"
  41595. /* a[i+89] += m[89] * mu */
  41596. "ldr r10, [%[m], #356]\n\t"
  41597. "ldr r9, [%[a], #356]\n\t"
  41598. "umaal r9, r3, r11, r10\n\t"
  41599. "str r9, [%[a], #356]\n\t"
  41600. /* a[i+90] += m[90] * mu */
  41601. "ldr r10, [%[m], #360]\n\t"
  41602. "ldr r9, [%[a], #360]\n\t"
  41603. "umaal r9, r3, r11, r10\n\t"
  41604. "str r9, [%[a], #360]\n\t"
  41605. /* a[i+91] += m[91] * mu */
  41606. "ldr r10, [%[m], #364]\n\t"
  41607. "ldr r9, [%[a], #364]\n\t"
  41608. "umaal r9, r3, r11, r10\n\t"
  41609. "str r9, [%[a], #364]\n\t"
  41610. /* a[i+92] += m[92] * mu */
  41611. "ldr r10, [%[m], #368]\n\t"
  41612. "ldr r9, [%[a], #368]\n\t"
  41613. "umaal r9, r3, r11, r10\n\t"
  41614. "str r9, [%[a], #368]\n\t"
  41615. /* a[i+93] += m[93] * mu */
  41616. "ldr r10, [%[m], #372]\n\t"
  41617. "ldr r9, [%[a], #372]\n\t"
  41618. "umaal r9, r3, r11, r10\n\t"
  41619. "str r9, [%[a], #372]\n\t"
  41620. /* a[i+94] += m[94] * mu */
  41621. "ldr r10, [%[m], #376]\n\t"
  41622. "ldr r9, [%[a], #376]\n\t"
  41623. "umaal r9, r3, r11, r10\n\t"
  41624. "str r9, [%[a], #376]\n\t"
  41625. /* a[i+95] += m[95] * mu */
  41626. "ldr r10, [%[m], #380]\n\t"
  41627. "ldr r9, [%[a], #380]\n\t"
  41628. "umaal r9, r3, r11, r10\n\t"
  41629. "ldr r11, [%[a], #384]\n\t"
  41630. "mov r10, #0\n\t"
  41631. "umaal r3, r11, r10, r10\n\t"
  41632. "str r9, [%[a], #380]\n\t"
  41633. "adds r3, r3, lr\n\t"
  41634. "adc lr, r11, #0\n\t"
  41635. "str r3, [%[a], #384]\n\t"
  41636. /* i += 1 */
  41637. "add r12, r12, #4\n\t"
  41638. "add %[a], %[a], #4\n\t"
  41639. "cmp r12, #0x180\n\t"
  41640. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  41641. /* Loop Done */
  41642. "str r4, [%[a]]\n\t"
  41643. "str r5, [%[a], #4]\n\t"
  41644. "str r6, [%[a], #8]\n\t"
  41645. "str r7, [%[a], #12]\n\t"
  41646. "str r8, [%[a], #16]\n\t"
  41647. "mov %[mp], lr\n\t"
  41648. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  41649. :
  41650. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  41651. );
  41652. sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp);
  41653. }
  41654. #endif
  41655. /* Multiply two Montgomery form numbers mod the modulus (prime).
  41656. * (r = a * b mod m)
  41657. *
  41658. * r Result of multiplication.
  41659. * a First number to multiply in Montgomery form.
  41660. * b Second number to multiply in Montgomery form.
  41661. * m Modulus (prime).
  41662. * mp Montgomery multiplier.
  41663. */
  41664. SP_NOINLINE static void sp_3072_mont_mul_96(sp_digit* r, const sp_digit* a,
  41665. const sp_digit* b, const sp_digit* m, sp_digit mp)
  41666. {
  41667. sp_3072_mul_96(r, a, b);
  41668. sp_3072_mont_reduce_96(r, m, mp);
  41669. }
  41670. /* Square the Montgomery form number. (r = a * a mod m)
  41671. *
  41672. * r Result of squaring.
  41673. * a Number to square in Montgomery form.
  41674. * m Modulus (prime).
  41675. * mp Montgomery multiplier.
  41676. */
  41677. SP_NOINLINE static void sp_3072_mont_sqr_96(sp_digit* r, const sp_digit* a,
  41678. const sp_digit* m, sp_digit mp)
  41679. {
  41680. sp_3072_sqr_96(r, a);
  41681. sp_3072_mont_reduce_96(r, m, mp);
  41682. }
  41683. #ifdef WOLFSSL_SP_SMALL
  41684. /* Sub b from a into r. (r = a - b)
  41685. *
  41686. * r A single precision integer.
  41687. * a A single precision integer.
  41688. * b A single precision integer.
  41689. */
  41690. static sp_digit sp_3072_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  41691. {
  41692. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  41693. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  41694. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  41695. __asm__ __volatile__ (
  41696. "mov r12, #0\n\t"
  41697. "add lr, %[a], #0x180\n\t"
  41698. "\n"
  41699. "L_sp_3072_sub_96_word_%=: \n\t"
  41700. "rsbs r12, r12, #0\n\t"
  41701. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41702. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41703. "sbcs r3, r3, r7\n\t"
  41704. "sbcs r4, r4, r8\n\t"
  41705. "sbcs r5, r5, r9\n\t"
  41706. "sbcs r6, r6, r10\n\t"
  41707. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41708. "sbc r12, r3, r3\n\t"
  41709. "cmp %[a], lr\n\t"
  41710. "bne L_sp_3072_sub_96_word_%=\n\t"
  41711. "mov %[r], r12\n\t"
  41712. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  41713. :
  41714. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  41715. );
  41716. return (uint32_t)(size_t)r;
  41717. }
  41718. #else
  41719. /* Sub b from a into r. (r = a - b)
  41720. *
  41721. * r A single precision integer.
  41722. * a A single precision integer.
  41723. * b A single precision integer.
  41724. */
  41725. static sp_digit sp_3072_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  41726. {
  41727. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  41728. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  41729. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  41730. __asm__ __volatile__ (
  41731. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41732. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41733. "subs r3, r3, r7\n\t"
  41734. "sbcs r4, r4, r8\n\t"
  41735. "sbcs r5, r5, r9\n\t"
  41736. "sbcs r6, r6, r10\n\t"
  41737. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41738. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41739. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41740. "sbcs r3, r3, r7\n\t"
  41741. "sbcs r4, r4, r8\n\t"
  41742. "sbcs r5, r5, r9\n\t"
  41743. "sbcs r6, r6, r10\n\t"
  41744. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41745. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41746. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41747. "sbcs r3, r3, r7\n\t"
  41748. "sbcs r4, r4, r8\n\t"
  41749. "sbcs r5, r5, r9\n\t"
  41750. "sbcs r6, r6, r10\n\t"
  41751. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41752. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41753. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41754. "sbcs r3, r3, r7\n\t"
  41755. "sbcs r4, r4, r8\n\t"
  41756. "sbcs r5, r5, r9\n\t"
  41757. "sbcs r6, r6, r10\n\t"
  41758. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41759. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41760. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41761. "sbcs r3, r3, r7\n\t"
  41762. "sbcs r4, r4, r8\n\t"
  41763. "sbcs r5, r5, r9\n\t"
  41764. "sbcs r6, r6, r10\n\t"
  41765. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41766. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41767. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41768. "sbcs r3, r3, r7\n\t"
  41769. "sbcs r4, r4, r8\n\t"
  41770. "sbcs r5, r5, r9\n\t"
  41771. "sbcs r6, r6, r10\n\t"
  41772. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41773. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41774. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41775. "sbcs r3, r3, r7\n\t"
  41776. "sbcs r4, r4, r8\n\t"
  41777. "sbcs r5, r5, r9\n\t"
  41778. "sbcs r6, r6, r10\n\t"
  41779. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41780. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41781. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41782. "sbcs r3, r3, r7\n\t"
  41783. "sbcs r4, r4, r8\n\t"
  41784. "sbcs r5, r5, r9\n\t"
  41785. "sbcs r6, r6, r10\n\t"
  41786. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41787. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41788. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41789. "sbcs r3, r3, r7\n\t"
  41790. "sbcs r4, r4, r8\n\t"
  41791. "sbcs r5, r5, r9\n\t"
  41792. "sbcs r6, r6, r10\n\t"
  41793. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41794. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41795. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41796. "sbcs r3, r3, r7\n\t"
  41797. "sbcs r4, r4, r8\n\t"
  41798. "sbcs r5, r5, r9\n\t"
  41799. "sbcs r6, r6, r10\n\t"
  41800. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41801. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41802. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41803. "sbcs r3, r3, r7\n\t"
  41804. "sbcs r4, r4, r8\n\t"
  41805. "sbcs r5, r5, r9\n\t"
  41806. "sbcs r6, r6, r10\n\t"
  41807. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41808. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41809. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41810. "sbcs r3, r3, r7\n\t"
  41811. "sbcs r4, r4, r8\n\t"
  41812. "sbcs r5, r5, r9\n\t"
  41813. "sbcs r6, r6, r10\n\t"
  41814. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41815. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41816. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41817. "sbcs r3, r3, r7\n\t"
  41818. "sbcs r4, r4, r8\n\t"
  41819. "sbcs r5, r5, r9\n\t"
  41820. "sbcs r6, r6, r10\n\t"
  41821. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41822. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41823. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41824. "sbcs r3, r3, r7\n\t"
  41825. "sbcs r4, r4, r8\n\t"
  41826. "sbcs r5, r5, r9\n\t"
  41827. "sbcs r6, r6, r10\n\t"
  41828. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41829. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41830. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41831. "sbcs r3, r3, r7\n\t"
  41832. "sbcs r4, r4, r8\n\t"
  41833. "sbcs r5, r5, r9\n\t"
  41834. "sbcs r6, r6, r10\n\t"
  41835. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41836. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41837. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41838. "sbcs r3, r3, r7\n\t"
  41839. "sbcs r4, r4, r8\n\t"
  41840. "sbcs r5, r5, r9\n\t"
  41841. "sbcs r6, r6, r10\n\t"
  41842. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41843. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41844. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41845. "sbcs r3, r3, r7\n\t"
  41846. "sbcs r4, r4, r8\n\t"
  41847. "sbcs r5, r5, r9\n\t"
  41848. "sbcs r6, r6, r10\n\t"
  41849. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41850. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41851. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41852. "sbcs r3, r3, r7\n\t"
  41853. "sbcs r4, r4, r8\n\t"
  41854. "sbcs r5, r5, r9\n\t"
  41855. "sbcs r6, r6, r10\n\t"
  41856. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41857. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41858. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41859. "sbcs r3, r3, r7\n\t"
  41860. "sbcs r4, r4, r8\n\t"
  41861. "sbcs r5, r5, r9\n\t"
  41862. "sbcs r6, r6, r10\n\t"
  41863. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41864. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41865. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41866. "sbcs r3, r3, r7\n\t"
  41867. "sbcs r4, r4, r8\n\t"
  41868. "sbcs r5, r5, r9\n\t"
  41869. "sbcs r6, r6, r10\n\t"
  41870. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41871. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41872. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41873. "sbcs r3, r3, r7\n\t"
  41874. "sbcs r4, r4, r8\n\t"
  41875. "sbcs r5, r5, r9\n\t"
  41876. "sbcs r6, r6, r10\n\t"
  41877. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41878. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41879. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41880. "sbcs r3, r3, r7\n\t"
  41881. "sbcs r4, r4, r8\n\t"
  41882. "sbcs r5, r5, r9\n\t"
  41883. "sbcs r6, r6, r10\n\t"
  41884. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41885. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41886. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41887. "sbcs r3, r3, r7\n\t"
  41888. "sbcs r4, r4, r8\n\t"
  41889. "sbcs r5, r5, r9\n\t"
  41890. "sbcs r6, r6, r10\n\t"
  41891. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41892. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41893. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41894. "sbcs r3, r3, r7\n\t"
  41895. "sbcs r4, r4, r8\n\t"
  41896. "sbcs r5, r5, r9\n\t"
  41897. "sbcs r6, r6, r10\n\t"
  41898. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41899. "sbc %[r], r6, r6\n\t"
  41900. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  41901. :
  41902. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  41903. );
  41904. return (uint32_t)(size_t)r;
  41905. }
  41906. #endif /* WOLFSSL_SP_SMALL */
  41907. #ifdef WOLFSSL_SP_USE_UDIV
  41908. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  41909. *
  41910. * d1 The high order half of the number to divide.
  41911. * d0 The low order half of the number to divide.
  41912. * div The divisor.
  41913. * returns the result of the division.
  41914. *
  41915. * Note that this is an approximate div. It may give an answer 1 larger.
  41916. */
  41917. static sp_digit div_3072_word_96(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  41918. {
  41919. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  41920. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  41921. register sp_digit div asm ("r2") = (sp_digit)div_p;
  41922. __asm__ __volatile__ (
  41923. "lsr r6, %[div], #16\n\t"
  41924. "add lr, r6, #1\n\t"
  41925. "udiv r4, %[d1], lr\n\t"
  41926. "lsl r5, %[div], #16\n\t"
  41927. "lsl r4, r4, #16\n\t"
  41928. "umull r3, r12, %[div], r4\n\t"
  41929. "subs %[d0], %[d0], r3\n\t"
  41930. "sbc %[d1], %[d1], r12\n\t"
  41931. "subs r3, %[d1], lr\n\t"
  41932. "sbc r7, r7, r7\n\t"
  41933. "add r7, r7, #1\n\t"
  41934. "rsb r8, r7, #0\n\t"
  41935. "lsl r7, r7, #16\n\t"
  41936. "and r5, r5, r8\n\t"
  41937. "and r6, r6, r8\n\t"
  41938. "subs %[d0], %[d0], r5\n\t"
  41939. "add r4, r4, r7\n\t"
  41940. "sbc %[d1], %[d1], r6\n\t"
  41941. "lsl r12, %[d1], #16\n\t"
  41942. "lsr r3, %[d0], #16\n\t"
  41943. "orr r3, r3, r12\n\t"
  41944. "udiv r3, r3, lr\n\t"
  41945. "add r4, r4, r3\n\t"
  41946. "umull r3, r12, %[div], r3\n\t"
  41947. "subs %[d0], %[d0], r3\n\t"
  41948. "sbc %[d1], %[d1], r12\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. "mul r3, %[div], r3\n\t"
  41955. "sub %[d0], %[d0], r3\n\t"
  41956. "udiv r3, %[d0], %[div]\n\t"
  41957. "add %[d1], r4, r3\n\t"
  41958. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  41959. :
  41960. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  41961. );
  41962. return (uint32_t)(size_t)d1;
  41963. }
  41964. #else
  41965. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  41966. *
  41967. * d1 The high order half of the number to divide.
  41968. * d0 The low order half of the number to divide.
  41969. * div The divisor.
  41970. * returns the result of the division.
  41971. *
  41972. * Note that this is an approximate div. It may give an answer 1 larger.
  41973. */
  41974. static sp_digit div_3072_word_96(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  41975. {
  41976. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  41977. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  41978. register sp_digit div asm ("r2") = (sp_digit)div_p;
  41979. __asm__ __volatile__ (
  41980. "lsr lr, %[div], #1\n\t"
  41981. "add lr, lr, #1\n\t"
  41982. "mov r4, %[d0]\n\t"
  41983. "mov r5, %[d1]\n\t"
  41984. /* Do top 32 */
  41985. "subs r6, lr, r5\n\t"
  41986. "sbc r6, r6, r6\n\t"
  41987. "mov r3, #0\n\t"
  41988. "sub r3, r3, r6\n\t"
  41989. "and r6, r6, lr\n\t"
  41990. "subs r5, r5, r6\n\t"
  41991. /* Next 30 bits */
  41992. "mov r12, #29\n\t"
  41993. "\n"
  41994. "L_div_3072_word_96_bit_%=: \n\t"
  41995. "lsls r4, r4, #1\n\t"
  41996. "adc r5, r5, r5\n\t"
  41997. "subs r6, lr, r5\n\t"
  41998. "sbc r6, r6, r6\n\t"
  41999. "add r3, r3, r3\n\t"
  42000. "sub r3, r3, r6\n\t"
  42001. "and r6, r6, lr\n\t"
  42002. "subs r5, r5, r6\n\t"
  42003. "subs r12, r12, #1\n\t"
  42004. "bpl L_div_3072_word_96_bit_%=\n\t"
  42005. "add r3, r3, r3\n\t"
  42006. "add r3, r3, #1\n\t"
  42007. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  42008. "lsl r7, r3, #16\n\t"
  42009. "lsl r4, %[div], #16\n\t"
  42010. "lsr r7, r7, #16\n\t"
  42011. "lsr r4, r4, #16\n\t"
  42012. "mul r4, r7, r4\n\t"
  42013. "lsr r8, %[div], #16\n\t"
  42014. "mul r7, r8, r7\n\t"
  42015. "lsr r5, r7, #16\n\t"
  42016. "lsl r7, r7, #16\n\t"
  42017. "adds r4, r4, r7\n\t"
  42018. "adc r5, r5, #0\n\t"
  42019. "lsr r7, r3, #16\n\t"
  42020. "mul r8, r7, r8\n\t"
  42021. "add r5, r5, r8\n\t"
  42022. "lsl r8, %[div], #16\n\t"
  42023. "lsr r8, r8, #16\n\t"
  42024. "mul r7, r8, r7\n\t"
  42025. "lsr r8, r7, #16\n\t"
  42026. "lsl r7, r7, #16\n\t"
  42027. "adds r4, r4, r7\n\t"
  42028. "adc r5, r5, r8\n\t"
  42029. #else
  42030. "umull r4, r5, r3, %[div]\n\t"
  42031. #endif
  42032. "subs r7, %[d0], r4\n\t"
  42033. "sbc r8, %[d1], r5\n\t"
  42034. "add r3, r3, r8\n\t"
  42035. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  42036. "lsl r7, r3, #16\n\t"
  42037. "lsl r4, %[div], #16\n\t"
  42038. "lsr r7, r7, #16\n\t"
  42039. "lsr r4, r4, #16\n\t"
  42040. "mul r4, r7, r4\n\t"
  42041. "lsr r8, %[div], #16\n\t"
  42042. "mul r7, r8, r7\n\t"
  42043. "lsr r5, r7, #16\n\t"
  42044. "lsl r7, r7, #16\n\t"
  42045. "adds r4, r4, r7\n\t"
  42046. "adc r5, r5, #0\n\t"
  42047. "lsr r7, r3, #16\n\t"
  42048. "mul r8, r7, r8\n\t"
  42049. "add r5, r5, r8\n\t"
  42050. "lsl r8, %[div], #16\n\t"
  42051. "lsr r8, r8, #16\n\t"
  42052. "mul r7, r8, r7\n\t"
  42053. "lsr r8, r7, #16\n\t"
  42054. "lsl r7, r7, #16\n\t"
  42055. "adds r4, r4, r7\n\t"
  42056. "adc r5, r5, r8\n\t"
  42057. #else
  42058. "umull r4, r5, r3, %[div]\n\t"
  42059. #endif
  42060. "subs r7, %[d0], r4\n\t"
  42061. "sbc r8, %[d1], r5\n\t"
  42062. "add r3, r3, r8\n\t"
  42063. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  42064. "lsl r7, r3, #16\n\t"
  42065. "lsl r4, %[div], #16\n\t"
  42066. "lsr r7, r7, #16\n\t"
  42067. "lsr r4, r4, #16\n\t"
  42068. "mul r4, r7, r4\n\t"
  42069. "lsr r8, %[div], #16\n\t"
  42070. "mul r7, r8, r7\n\t"
  42071. "lsr r5, r7, #16\n\t"
  42072. "lsl r7, r7, #16\n\t"
  42073. "adds r4, r4, r7\n\t"
  42074. "adc r5, r5, #0\n\t"
  42075. "lsr r7, r3, #16\n\t"
  42076. "mul r8, r7, r8\n\t"
  42077. "add r5, r5, r8\n\t"
  42078. "lsl r8, %[div], #16\n\t"
  42079. "lsr r8, r8, #16\n\t"
  42080. "mul r7, r8, r7\n\t"
  42081. "lsr r8, r7, #16\n\t"
  42082. "lsl r7, r7, #16\n\t"
  42083. "adds r4, r4, r7\n\t"
  42084. "adc r5, r5, r8\n\t"
  42085. #else
  42086. "umull r4, r5, r3, %[div]\n\t"
  42087. #endif
  42088. "subs r7, %[d0], r4\n\t"
  42089. "sbc r8, %[d1], r5\n\t"
  42090. "add r3, r3, r8\n\t"
  42091. "subs r6, %[div], r7\n\t"
  42092. "sbc r6, r6, r6\n\t"
  42093. "sub %[d1], r3, r6\n\t"
  42094. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  42095. :
  42096. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  42097. );
  42098. return (uint32_t)(size_t)d1;
  42099. }
  42100. #endif
  42101. /* Divide d in a and put remainder into r (m*d + r = a)
  42102. * m is not calculated as it is not needed at this time.
  42103. *
  42104. * a Number to be divided.
  42105. * d Number to divide with.
  42106. * m Multiplier result.
  42107. * r Remainder from the division.
  42108. * returns MP_OKAY indicating success.
  42109. */
  42110. static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d,
  42111. sp_digit* m, sp_digit* r)
  42112. {
  42113. sp_digit t1[192], t2[97];
  42114. sp_digit div, r1;
  42115. int i;
  42116. (void)m;
  42117. div = d[95];
  42118. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  42119. for (i = 95; i > 0; i--) {
  42120. if (t1[i + 96] != d[i])
  42121. break;
  42122. }
  42123. if (t1[i + 96] >= d[i]) {
  42124. sp_3072_sub_in_place_96(&t1[96], d);
  42125. }
  42126. for (i = 95; i >= 0; i--) {
  42127. if (t1[96 + i] == div) {
  42128. r1 = SP_DIGIT_MAX;
  42129. }
  42130. else {
  42131. r1 = div_3072_word_96(t1[96 + i], t1[96 + i - 1], div);
  42132. }
  42133. sp_3072_mul_d_96(t2, d, r1);
  42134. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  42135. t1[96 + i] -= t2[96];
  42136. if (t1[96 + i] != 0) {
  42137. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  42138. if (t1[96 + i] != 0)
  42139. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  42140. }
  42141. }
  42142. for (i = 95; i > 0; i--) {
  42143. if (t1[i] != d[i])
  42144. break;
  42145. }
  42146. if (t1[i] >= d[i]) {
  42147. sp_3072_sub_96(r, t1, d);
  42148. }
  42149. else {
  42150. XMEMCPY(r, t1, sizeof(*t1) * 96);
  42151. }
  42152. return MP_OKAY;
  42153. }
  42154. /* Reduce a modulo m into r. (r = a mod m)
  42155. *
  42156. * r A single precision number that is the reduced result.
  42157. * a A single precision number that is to be reduced.
  42158. * m A single precision number that is the modulus to reduce with.
  42159. * returns MP_OKAY indicating success.
  42160. */
  42161. static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a,
  42162. const sp_digit* m)
  42163. {
  42164. return sp_3072_div_96_cond(a, m, NULL, r);
  42165. }
  42166. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  42167. #if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY)
  42168. /* AND m into each word of a and store in r.
  42169. *
  42170. * r A single precision integer.
  42171. * a A single precision integer.
  42172. * m Mask to AND against each digit.
  42173. */
  42174. static void sp_3072_mask_96(sp_digit* r, const sp_digit* a, sp_digit m)
  42175. {
  42176. #ifdef WOLFSSL_SP_SMALL
  42177. int i;
  42178. for (i=0; i<96; i++) {
  42179. r[i] = a[i] & m;
  42180. }
  42181. #else
  42182. int i;
  42183. for (i = 0; i < 96; i += 8) {
  42184. r[i+0] = a[i+0] & m;
  42185. r[i+1] = a[i+1] & m;
  42186. r[i+2] = a[i+2] & m;
  42187. r[i+3] = a[i+3] & m;
  42188. r[i+4] = a[i+4] & m;
  42189. r[i+5] = a[i+5] & m;
  42190. r[i+6] = a[i+6] & m;
  42191. r[i+7] = a[i+7] & m;
  42192. }
  42193. #endif
  42194. }
  42195. /* Compare a with b in constant time.
  42196. *
  42197. * a A single precision integer.
  42198. * b A single precision integer.
  42199. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  42200. * respectively.
  42201. */
  42202. static sp_int32 sp_3072_cmp_96(const sp_digit* a_p, const sp_digit* b_p)
  42203. {
  42204. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  42205. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  42206. __asm__ __volatile__ (
  42207. "mov r2, #-1\n\t"
  42208. "mov r6, #1\n\t"
  42209. "mov r5, #0\n\t"
  42210. "mov r3, #-1\n\t"
  42211. #ifdef WOLFSSL_SP_SMALL
  42212. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  42213. "mov r4, #0x1\n\t"
  42214. "lsl r4, r4, #8\n\t"
  42215. "add r4, r4, #0x7c\n\t"
  42216. #else
  42217. "mov r4, #0x17c\n\t"
  42218. #endif
  42219. "\n"
  42220. "L_sp_3072_cmp_96_words_%=: \n\t"
  42221. "ldr r12, [%[a], r4]\n\t"
  42222. "ldr lr, [%[b], r4]\n\t"
  42223. "and r12, r12, r3\n\t"
  42224. "and lr, lr, r3\n\t"
  42225. "subs r12, r12, lr\n\t"
  42226. "it hi\n\t"
  42227. "movhi r2, r6\n\t"
  42228. "it lo\n\t"
  42229. "movlo r2, r3\n\t"
  42230. "it ne\n\t"
  42231. "movne r3, r5\n\t"
  42232. "subs r4, r4, #4\n\t"
  42233. "bcs L_sp_3072_cmp_96_words_%=\n\t"
  42234. "eor r2, r2, r3\n\t"
  42235. #else
  42236. "ldr r12, [%[a], #380]\n\t"
  42237. "ldr lr, [%[b], #380]\n\t"
  42238. "and r12, r12, r3\n\t"
  42239. "and lr, lr, r3\n\t"
  42240. "subs r12, r12, lr\n\t"
  42241. "it hi\n\t"
  42242. "movhi r2, r6\n\t"
  42243. "it lo\n\t"
  42244. "movlo r2, r3\n\t"
  42245. "it ne\n\t"
  42246. "movne r3, r5\n\t"
  42247. "ldr r12, [%[a], #376]\n\t"
  42248. "ldr lr, [%[b], #376]\n\t"
  42249. "and r12, r12, r3\n\t"
  42250. "and lr, lr, r3\n\t"
  42251. "subs r12, r12, lr\n\t"
  42252. "it hi\n\t"
  42253. "movhi r2, r6\n\t"
  42254. "it lo\n\t"
  42255. "movlo r2, r3\n\t"
  42256. "it ne\n\t"
  42257. "movne r3, r5\n\t"
  42258. "ldr r12, [%[a], #372]\n\t"
  42259. "ldr lr, [%[b], #372]\n\t"
  42260. "and r12, r12, r3\n\t"
  42261. "and lr, lr, r3\n\t"
  42262. "subs r12, r12, lr\n\t"
  42263. "it hi\n\t"
  42264. "movhi r2, r6\n\t"
  42265. "it lo\n\t"
  42266. "movlo r2, r3\n\t"
  42267. "it ne\n\t"
  42268. "movne r3, r5\n\t"
  42269. "ldr r12, [%[a], #368]\n\t"
  42270. "ldr lr, [%[b], #368]\n\t"
  42271. "and r12, r12, r3\n\t"
  42272. "and lr, lr, r3\n\t"
  42273. "subs r12, r12, lr\n\t"
  42274. "it hi\n\t"
  42275. "movhi r2, r6\n\t"
  42276. "it lo\n\t"
  42277. "movlo r2, r3\n\t"
  42278. "it ne\n\t"
  42279. "movne r3, r5\n\t"
  42280. "ldr r12, [%[a], #364]\n\t"
  42281. "ldr lr, [%[b], #364]\n\t"
  42282. "and r12, r12, r3\n\t"
  42283. "and lr, lr, r3\n\t"
  42284. "subs r12, r12, lr\n\t"
  42285. "it hi\n\t"
  42286. "movhi r2, r6\n\t"
  42287. "it lo\n\t"
  42288. "movlo r2, r3\n\t"
  42289. "it ne\n\t"
  42290. "movne r3, r5\n\t"
  42291. "ldr r12, [%[a], #360]\n\t"
  42292. "ldr lr, [%[b], #360]\n\t"
  42293. "and r12, r12, r3\n\t"
  42294. "and lr, lr, r3\n\t"
  42295. "subs r12, r12, lr\n\t"
  42296. "it hi\n\t"
  42297. "movhi r2, r6\n\t"
  42298. "it lo\n\t"
  42299. "movlo r2, r3\n\t"
  42300. "it ne\n\t"
  42301. "movne r3, r5\n\t"
  42302. "ldr r12, [%[a], #356]\n\t"
  42303. "ldr lr, [%[b], #356]\n\t"
  42304. "and r12, r12, r3\n\t"
  42305. "and lr, lr, r3\n\t"
  42306. "subs r12, r12, lr\n\t"
  42307. "it hi\n\t"
  42308. "movhi r2, r6\n\t"
  42309. "it lo\n\t"
  42310. "movlo r2, r3\n\t"
  42311. "it ne\n\t"
  42312. "movne r3, r5\n\t"
  42313. "ldr r12, [%[a], #352]\n\t"
  42314. "ldr lr, [%[b], #352]\n\t"
  42315. "and r12, r12, r3\n\t"
  42316. "and lr, lr, r3\n\t"
  42317. "subs r12, r12, lr\n\t"
  42318. "it hi\n\t"
  42319. "movhi r2, r6\n\t"
  42320. "it lo\n\t"
  42321. "movlo r2, r3\n\t"
  42322. "it ne\n\t"
  42323. "movne r3, r5\n\t"
  42324. "ldr r12, [%[a], #348]\n\t"
  42325. "ldr lr, [%[b], #348]\n\t"
  42326. "and r12, r12, r3\n\t"
  42327. "and lr, lr, r3\n\t"
  42328. "subs r12, r12, lr\n\t"
  42329. "it hi\n\t"
  42330. "movhi r2, r6\n\t"
  42331. "it lo\n\t"
  42332. "movlo r2, r3\n\t"
  42333. "it ne\n\t"
  42334. "movne r3, r5\n\t"
  42335. "ldr r12, [%[a], #344]\n\t"
  42336. "ldr lr, [%[b], #344]\n\t"
  42337. "and r12, r12, r3\n\t"
  42338. "and lr, lr, r3\n\t"
  42339. "subs r12, r12, lr\n\t"
  42340. "it hi\n\t"
  42341. "movhi r2, r6\n\t"
  42342. "it lo\n\t"
  42343. "movlo r2, r3\n\t"
  42344. "it ne\n\t"
  42345. "movne r3, r5\n\t"
  42346. "ldr r12, [%[a], #340]\n\t"
  42347. "ldr lr, [%[b], #340]\n\t"
  42348. "and r12, r12, r3\n\t"
  42349. "and lr, lr, r3\n\t"
  42350. "subs r12, r12, lr\n\t"
  42351. "it hi\n\t"
  42352. "movhi r2, r6\n\t"
  42353. "it lo\n\t"
  42354. "movlo r2, r3\n\t"
  42355. "it ne\n\t"
  42356. "movne r3, r5\n\t"
  42357. "ldr r12, [%[a], #336]\n\t"
  42358. "ldr lr, [%[b], #336]\n\t"
  42359. "and r12, r12, r3\n\t"
  42360. "and lr, lr, r3\n\t"
  42361. "subs r12, r12, lr\n\t"
  42362. "it hi\n\t"
  42363. "movhi r2, r6\n\t"
  42364. "it lo\n\t"
  42365. "movlo r2, r3\n\t"
  42366. "it ne\n\t"
  42367. "movne r3, r5\n\t"
  42368. "ldr r12, [%[a], #332]\n\t"
  42369. "ldr lr, [%[b], #332]\n\t"
  42370. "and r12, r12, r3\n\t"
  42371. "and lr, lr, r3\n\t"
  42372. "subs r12, r12, lr\n\t"
  42373. "it hi\n\t"
  42374. "movhi r2, r6\n\t"
  42375. "it lo\n\t"
  42376. "movlo r2, r3\n\t"
  42377. "it ne\n\t"
  42378. "movne r3, r5\n\t"
  42379. "ldr r12, [%[a], #328]\n\t"
  42380. "ldr lr, [%[b], #328]\n\t"
  42381. "and r12, r12, r3\n\t"
  42382. "and lr, lr, r3\n\t"
  42383. "subs r12, r12, lr\n\t"
  42384. "it hi\n\t"
  42385. "movhi r2, r6\n\t"
  42386. "it lo\n\t"
  42387. "movlo r2, r3\n\t"
  42388. "it ne\n\t"
  42389. "movne r3, r5\n\t"
  42390. "ldr r12, [%[a], #324]\n\t"
  42391. "ldr lr, [%[b], #324]\n\t"
  42392. "and r12, r12, r3\n\t"
  42393. "and lr, lr, r3\n\t"
  42394. "subs r12, r12, lr\n\t"
  42395. "it hi\n\t"
  42396. "movhi r2, r6\n\t"
  42397. "it lo\n\t"
  42398. "movlo r2, r3\n\t"
  42399. "it ne\n\t"
  42400. "movne r3, r5\n\t"
  42401. "ldr r12, [%[a], #320]\n\t"
  42402. "ldr lr, [%[b], #320]\n\t"
  42403. "and r12, r12, r3\n\t"
  42404. "and lr, lr, r3\n\t"
  42405. "subs r12, r12, lr\n\t"
  42406. "it hi\n\t"
  42407. "movhi r2, r6\n\t"
  42408. "it lo\n\t"
  42409. "movlo r2, r3\n\t"
  42410. "it ne\n\t"
  42411. "movne r3, r5\n\t"
  42412. "ldr r12, [%[a], #316]\n\t"
  42413. "ldr lr, [%[b], #316]\n\t"
  42414. "and r12, r12, r3\n\t"
  42415. "and lr, lr, r3\n\t"
  42416. "subs r12, r12, lr\n\t"
  42417. "it hi\n\t"
  42418. "movhi r2, r6\n\t"
  42419. "it lo\n\t"
  42420. "movlo r2, r3\n\t"
  42421. "it ne\n\t"
  42422. "movne r3, r5\n\t"
  42423. "ldr r12, [%[a], #312]\n\t"
  42424. "ldr lr, [%[b], #312]\n\t"
  42425. "and r12, r12, r3\n\t"
  42426. "and lr, lr, r3\n\t"
  42427. "subs r12, r12, lr\n\t"
  42428. "it hi\n\t"
  42429. "movhi r2, r6\n\t"
  42430. "it lo\n\t"
  42431. "movlo r2, r3\n\t"
  42432. "it ne\n\t"
  42433. "movne r3, r5\n\t"
  42434. "ldr r12, [%[a], #308]\n\t"
  42435. "ldr lr, [%[b], #308]\n\t"
  42436. "and r12, r12, r3\n\t"
  42437. "and lr, lr, r3\n\t"
  42438. "subs r12, r12, lr\n\t"
  42439. "it hi\n\t"
  42440. "movhi r2, r6\n\t"
  42441. "it lo\n\t"
  42442. "movlo r2, r3\n\t"
  42443. "it ne\n\t"
  42444. "movne r3, r5\n\t"
  42445. "ldr r12, [%[a], #304]\n\t"
  42446. "ldr lr, [%[b], #304]\n\t"
  42447. "and r12, r12, r3\n\t"
  42448. "and lr, lr, r3\n\t"
  42449. "subs r12, r12, lr\n\t"
  42450. "it hi\n\t"
  42451. "movhi r2, r6\n\t"
  42452. "it lo\n\t"
  42453. "movlo r2, r3\n\t"
  42454. "it ne\n\t"
  42455. "movne r3, r5\n\t"
  42456. "ldr r12, [%[a], #300]\n\t"
  42457. "ldr lr, [%[b], #300]\n\t"
  42458. "and r12, r12, r3\n\t"
  42459. "and lr, lr, r3\n\t"
  42460. "subs r12, r12, lr\n\t"
  42461. "it hi\n\t"
  42462. "movhi r2, r6\n\t"
  42463. "it lo\n\t"
  42464. "movlo r2, r3\n\t"
  42465. "it ne\n\t"
  42466. "movne r3, r5\n\t"
  42467. "ldr r12, [%[a], #296]\n\t"
  42468. "ldr lr, [%[b], #296]\n\t"
  42469. "and r12, r12, r3\n\t"
  42470. "and lr, lr, r3\n\t"
  42471. "subs r12, r12, lr\n\t"
  42472. "it hi\n\t"
  42473. "movhi r2, r6\n\t"
  42474. "it lo\n\t"
  42475. "movlo r2, r3\n\t"
  42476. "it ne\n\t"
  42477. "movne r3, r5\n\t"
  42478. "ldr r12, [%[a], #292]\n\t"
  42479. "ldr lr, [%[b], #292]\n\t"
  42480. "and r12, r12, r3\n\t"
  42481. "and lr, lr, r3\n\t"
  42482. "subs r12, r12, lr\n\t"
  42483. "it hi\n\t"
  42484. "movhi r2, r6\n\t"
  42485. "it lo\n\t"
  42486. "movlo r2, r3\n\t"
  42487. "it ne\n\t"
  42488. "movne r3, r5\n\t"
  42489. "ldr r12, [%[a], #288]\n\t"
  42490. "ldr lr, [%[b], #288]\n\t"
  42491. "and r12, r12, r3\n\t"
  42492. "and lr, lr, r3\n\t"
  42493. "subs r12, r12, lr\n\t"
  42494. "it hi\n\t"
  42495. "movhi r2, r6\n\t"
  42496. "it lo\n\t"
  42497. "movlo r2, r3\n\t"
  42498. "it ne\n\t"
  42499. "movne r3, r5\n\t"
  42500. "ldr r12, [%[a], #284]\n\t"
  42501. "ldr lr, [%[b], #284]\n\t"
  42502. "and r12, r12, r3\n\t"
  42503. "and lr, lr, r3\n\t"
  42504. "subs r12, r12, lr\n\t"
  42505. "it hi\n\t"
  42506. "movhi r2, r6\n\t"
  42507. "it lo\n\t"
  42508. "movlo r2, r3\n\t"
  42509. "it ne\n\t"
  42510. "movne r3, r5\n\t"
  42511. "ldr r12, [%[a], #280]\n\t"
  42512. "ldr lr, [%[b], #280]\n\t"
  42513. "and r12, r12, r3\n\t"
  42514. "and lr, lr, r3\n\t"
  42515. "subs r12, r12, lr\n\t"
  42516. "it hi\n\t"
  42517. "movhi r2, r6\n\t"
  42518. "it lo\n\t"
  42519. "movlo r2, r3\n\t"
  42520. "it ne\n\t"
  42521. "movne r3, r5\n\t"
  42522. "ldr r12, [%[a], #276]\n\t"
  42523. "ldr lr, [%[b], #276]\n\t"
  42524. "and r12, r12, r3\n\t"
  42525. "and lr, lr, r3\n\t"
  42526. "subs r12, r12, lr\n\t"
  42527. "it hi\n\t"
  42528. "movhi r2, r6\n\t"
  42529. "it lo\n\t"
  42530. "movlo r2, r3\n\t"
  42531. "it ne\n\t"
  42532. "movne r3, r5\n\t"
  42533. "ldr r12, [%[a], #272]\n\t"
  42534. "ldr lr, [%[b], #272]\n\t"
  42535. "and r12, r12, r3\n\t"
  42536. "and lr, lr, r3\n\t"
  42537. "subs r12, r12, lr\n\t"
  42538. "it hi\n\t"
  42539. "movhi r2, r6\n\t"
  42540. "it lo\n\t"
  42541. "movlo r2, r3\n\t"
  42542. "it ne\n\t"
  42543. "movne r3, r5\n\t"
  42544. "ldr r12, [%[a], #268]\n\t"
  42545. "ldr lr, [%[b], #268]\n\t"
  42546. "and r12, r12, r3\n\t"
  42547. "and lr, lr, r3\n\t"
  42548. "subs r12, r12, lr\n\t"
  42549. "it hi\n\t"
  42550. "movhi r2, r6\n\t"
  42551. "it lo\n\t"
  42552. "movlo r2, r3\n\t"
  42553. "it ne\n\t"
  42554. "movne r3, r5\n\t"
  42555. "ldr r12, [%[a], #264]\n\t"
  42556. "ldr lr, [%[b], #264]\n\t"
  42557. "and r12, r12, r3\n\t"
  42558. "and lr, lr, r3\n\t"
  42559. "subs r12, r12, lr\n\t"
  42560. "it hi\n\t"
  42561. "movhi r2, r6\n\t"
  42562. "it lo\n\t"
  42563. "movlo r2, r3\n\t"
  42564. "it ne\n\t"
  42565. "movne r3, r5\n\t"
  42566. "ldr r12, [%[a], #260]\n\t"
  42567. "ldr lr, [%[b], #260]\n\t"
  42568. "and r12, r12, r3\n\t"
  42569. "and lr, lr, r3\n\t"
  42570. "subs r12, r12, lr\n\t"
  42571. "it hi\n\t"
  42572. "movhi r2, r6\n\t"
  42573. "it lo\n\t"
  42574. "movlo r2, r3\n\t"
  42575. "it ne\n\t"
  42576. "movne r3, r5\n\t"
  42577. "ldr r12, [%[a], #256]\n\t"
  42578. "ldr lr, [%[b], #256]\n\t"
  42579. "and r12, r12, r3\n\t"
  42580. "and lr, lr, r3\n\t"
  42581. "subs r12, r12, lr\n\t"
  42582. "it hi\n\t"
  42583. "movhi r2, r6\n\t"
  42584. "it lo\n\t"
  42585. "movlo r2, r3\n\t"
  42586. "it ne\n\t"
  42587. "movne r3, r5\n\t"
  42588. "ldr r12, [%[a], #252]\n\t"
  42589. "ldr lr, [%[b], #252]\n\t"
  42590. "and r12, r12, r3\n\t"
  42591. "and lr, lr, r3\n\t"
  42592. "subs r12, r12, lr\n\t"
  42593. "it hi\n\t"
  42594. "movhi r2, r6\n\t"
  42595. "it lo\n\t"
  42596. "movlo r2, r3\n\t"
  42597. "it ne\n\t"
  42598. "movne r3, r5\n\t"
  42599. "ldr r12, [%[a], #248]\n\t"
  42600. "ldr lr, [%[b], #248]\n\t"
  42601. "and r12, r12, r3\n\t"
  42602. "and lr, lr, r3\n\t"
  42603. "subs r12, r12, lr\n\t"
  42604. "it hi\n\t"
  42605. "movhi r2, r6\n\t"
  42606. "it lo\n\t"
  42607. "movlo r2, r3\n\t"
  42608. "it ne\n\t"
  42609. "movne r3, r5\n\t"
  42610. "ldr r12, [%[a], #244]\n\t"
  42611. "ldr lr, [%[b], #244]\n\t"
  42612. "and r12, r12, r3\n\t"
  42613. "and lr, lr, r3\n\t"
  42614. "subs r12, r12, lr\n\t"
  42615. "it hi\n\t"
  42616. "movhi r2, r6\n\t"
  42617. "it lo\n\t"
  42618. "movlo r2, r3\n\t"
  42619. "it ne\n\t"
  42620. "movne r3, r5\n\t"
  42621. "ldr r12, [%[a], #240]\n\t"
  42622. "ldr lr, [%[b], #240]\n\t"
  42623. "and r12, r12, r3\n\t"
  42624. "and lr, lr, r3\n\t"
  42625. "subs r12, r12, lr\n\t"
  42626. "it hi\n\t"
  42627. "movhi r2, r6\n\t"
  42628. "it lo\n\t"
  42629. "movlo r2, r3\n\t"
  42630. "it ne\n\t"
  42631. "movne r3, r5\n\t"
  42632. "ldr r12, [%[a], #236]\n\t"
  42633. "ldr lr, [%[b], #236]\n\t"
  42634. "and r12, r12, r3\n\t"
  42635. "and lr, lr, r3\n\t"
  42636. "subs r12, r12, lr\n\t"
  42637. "it hi\n\t"
  42638. "movhi r2, r6\n\t"
  42639. "it lo\n\t"
  42640. "movlo r2, r3\n\t"
  42641. "it ne\n\t"
  42642. "movne r3, r5\n\t"
  42643. "ldr r12, [%[a], #232]\n\t"
  42644. "ldr lr, [%[b], #232]\n\t"
  42645. "and r12, r12, r3\n\t"
  42646. "and lr, lr, r3\n\t"
  42647. "subs r12, r12, lr\n\t"
  42648. "it hi\n\t"
  42649. "movhi r2, r6\n\t"
  42650. "it lo\n\t"
  42651. "movlo r2, r3\n\t"
  42652. "it ne\n\t"
  42653. "movne r3, r5\n\t"
  42654. "ldr r12, [%[a], #228]\n\t"
  42655. "ldr lr, [%[b], #228]\n\t"
  42656. "and r12, r12, r3\n\t"
  42657. "and lr, lr, r3\n\t"
  42658. "subs r12, r12, lr\n\t"
  42659. "it hi\n\t"
  42660. "movhi r2, r6\n\t"
  42661. "it lo\n\t"
  42662. "movlo r2, r3\n\t"
  42663. "it ne\n\t"
  42664. "movne r3, r5\n\t"
  42665. "ldr r12, [%[a], #224]\n\t"
  42666. "ldr lr, [%[b], #224]\n\t"
  42667. "and r12, r12, r3\n\t"
  42668. "and lr, lr, r3\n\t"
  42669. "subs r12, r12, lr\n\t"
  42670. "it hi\n\t"
  42671. "movhi r2, r6\n\t"
  42672. "it lo\n\t"
  42673. "movlo r2, r3\n\t"
  42674. "it ne\n\t"
  42675. "movne r3, r5\n\t"
  42676. "ldr r12, [%[a], #220]\n\t"
  42677. "ldr lr, [%[b], #220]\n\t"
  42678. "and r12, r12, r3\n\t"
  42679. "and lr, lr, r3\n\t"
  42680. "subs r12, r12, lr\n\t"
  42681. "it hi\n\t"
  42682. "movhi r2, r6\n\t"
  42683. "it lo\n\t"
  42684. "movlo r2, r3\n\t"
  42685. "it ne\n\t"
  42686. "movne r3, r5\n\t"
  42687. "ldr r12, [%[a], #216]\n\t"
  42688. "ldr lr, [%[b], #216]\n\t"
  42689. "and r12, r12, r3\n\t"
  42690. "and lr, lr, r3\n\t"
  42691. "subs r12, r12, lr\n\t"
  42692. "it hi\n\t"
  42693. "movhi r2, r6\n\t"
  42694. "it lo\n\t"
  42695. "movlo r2, r3\n\t"
  42696. "it ne\n\t"
  42697. "movne r3, r5\n\t"
  42698. "ldr r12, [%[a], #212]\n\t"
  42699. "ldr lr, [%[b], #212]\n\t"
  42700. "and r12, r12, r3\n\t"
  42701. "and lr, lr, r3\n\t"
  42702. "subs r12, r12, lr\n\t"
  42703. "it hi\n\t"
  42704. "movhi r2, r6\n\t"
  42705. "it lo\n\t"
  42706. "movlo r2, r3\n\t"
  42707. "it ne\n\t"
  42708. "movne r3, r5\n\t"
  42709. "ldr r12, [%[a], #208]\n\t"
  42710. "ldr lr, [%[b], #208]\n\t"
  42711. "and r12, r12, r3\n\t"
  42712. "and lr, lr, r3\n\t"
  42713. "subs r12, r12, lr\n\t"
  42714. "it hi\n\t"
  42715. "movhi r2, r6\n\t"
  42716. "it lo\n\t"
  42717. "movlo r2, r3\n\t"
  42718. "it ne\n\t"
  42719. "movne r3, r5\n\t"
  42720. "ldr r12, [%[a], #204]\n\t"
  42721. "ldr lr, [%[b], #204]\n\t"
  42722. "and r12, r12, r3\n\t"
  42723. "and lr, lr, r3\n\t"
  42724. "subs r12, r12, lr\n\t"
  42725. "it hi\n\t"
  42726. "movhi r2, r6\n\t"
  42727. "it lo\n\t"
  42728. "movlo r2, r3\n\t"
  42729. "it ne\n\t"
  42730. "movne r3, r5\n\t"
  42731. "ldr r12, [%[a], #200]\n\t"
  42732. "ldr lr, [%[b], #200]\n\t"
  42733. "and r12, r12, r3\n\t"
  42734. "and lr, lr, r3\n\t"
  42735. "subs r12, r12, lr\n\t"
  42736. "it hi\n\t"
  42737. "movhi r2, r6\n\t"
  42738. "it lo\n\t"
  42739. "movlo r2, r3\n\t"
  42740. "it ne\n\t"
  42741. "movne r3, r5\n\t"
  42742. "ldr r12, [%[a], #196]\n\t"
  42743. "ldr lr, [%[b], #196]\n\t"
  42744. "and r12, r12, r3\n\t"
  42745. "and lr, lr, r3\n\t"
  42746. "subs r12, r12, lr\n\t"
  42747. "it hi\n\t"
  42748. "movhi r2, r6\n\t"
  42749. "it lo\n\t"
  42750. "movlo r2, r3\n\t"
  42751. "it ne\n\t"
  42752. "movne r3, r5\n\t"
  42753. "ldr r12, [%[a], #192]\n\t"
  42754. "ldr lr, [%[b], #192]\n\t"
  42755. "and r12, r12, r3\n\t"
  42756. "and lr, lr, r3\n\t"
  42757. "subs r12, r12, lr\n\t"
  42758. "it hi\n\t"
  42759. "movhi r2, r6\n\t"
  42760. "it lo\n\t"
  42761. "movlo r2, r3\n\t"
  42762. "it ne\n\t"
  42763. "movne r3, r5\n\t"
  42764. "ldr r12, [%[a], #188]\n\t"
  42765. "ldr lr, [%[b], #188]\n\t"
  42766. "and r12, r12, r3\n\t"
  42767. "and lr, lr, r3\n\t"
  42768. "subs r12, r12, lr\n\t"
  42769. "it hi\n\t"
  42770. "movhi r2, r6\n\t"
  42771. "it lo\n\t"
  42772. "movlo r2, r3\n\t"
  42773. "it ne\n\t"
  42774. "movne r3, r5\n\t"
  42775. "ldr r12, [%[a], #184]\n\t"
  42776. "ldr lr, [%[b], #184]\n\t"
  42777. "and r12, r12, r3\n\t"
  42778. "and lr, lr, r3\n\t"
  42779. "subs r12, r12, lr\n\t"
  42780. "it hi\n\t"
  42781. "movhi r2, r6\n\t"
  42782. "it lo\n\t"
  42783. "movlo r2, r3\n\t"
  42784. "it ne\n\t"
  42785. "movne r3, r5\n\t"
  42786. "ldr r12, [%[a], #180]\n\t"
  42787. "ldr lr, [%[b], #180]\n\t"
  42788. "and r12, r12, r3\n\t"
  42789. "and lr, lr, r3\n\t"
  42790. "subs r12, r12, lr\n\t"
  42791. "it hi\n\t"
  42792. "movhi r2, r6\n\t"
  42793. "it lo\n\t"
  42794. "movlo r2, r3\n\t"
  42795. "it ne\n\t"
  42796. "movne r3, r5\n\t"
  42797. "ldr r12, [%[a], #176]\n\t"
  42798. "ldr lr, [%[b], #176]\n\t"
  42799. "and r12, r12, r3\n\t"
  42800. "and lr, lr, r3\n\t"
  42801. "subs r12, r12, lr\n\t"
  42802. "it hi\n\t"
  42803. "movhi r2, r6\n\t"
  42804. "it lo\n\t"
  42805. "movlo r2, r3\n\t"
  42806. "it ne\n\t"
  42807. "movne r3, r5\n\t"
  42808. "ldr r12, [%[a], #172]\n\t"
  42809. "ldr lr, [%[b], #172]\n\t"
  42810. "and r12, r12, r3\n\t"
  42811. "and lr, lr, r3\n\t"
  42812. "subs r12, r12, lr\n\t"
  42813. "it hi\n\t"
  42814. "movhi r2, r6\n\t"
  42815. "it lo\n\t"
  42816. "movlo r2, r3\n\t"
  42817. "it ne\n\t"
  42818. "movne r3, r5\n\t"
  42819. "ldr r12, [%[a], #168]\n\t"
  42820. "ldr lr, [%[b], #168]\n\t"
  42821. "and r12, r12, r3\n\t"
  42822. "and lr, lr, r3\n\t"
  42823. "subs r12, r12, lr\n\t"
  42824. "it hi\n\t"
  42825. "movhi r2, r6\n\t"
  42826. "it lo\n\t"
  42827. "movlo r2, r3\n\t"
  42828. "it ne\n\t"
  42829. "movne r3, r5\n\t"
  42830. "ldr r12, [%[a], #164]\n\t"
  42831. "ldr lr, [%[b], #164]\n\t"
  42832. "and r12, r12, r3\n\t"
  42833. "and lr, lr, r3\n\t"
  42834. "subs r12, r12, lr\n\t"
  42835. "it hi\n\t"
  42836. "movhi r2, r6\n\t"
  42837. "it lo\n\t"
  42838. "movlo r2, r3\n\t"
  42839. "it ne\n\t"
  42840. "movne r3, r5\n\t"
  42841. "ldr r12, [%[a], #160]\n\t"
  42842. "ldr lr, [%[b], #160]\n\t"
  42843. "and r12, r12, r3\n\t"
  42844. "and lr, lr, r3\n\t"
  42845. "subs r12, r12, lr\n\t"
  42846. "it hi\n\t"
  42847. "movhi r2, r6\n\t"
  42848. "it lo\n\t"
  42849. "movlo r2, r3\n\t"
  42850. "it ne\n\t"
  42851. "movne r3, r5\n\t"
  42852. "ldr r12, [%[a], #156]\n\t"
  42853. "ldr lr, [%[b], #156]\n\t"
  42854. "and r12, r12, r3\n\t"
  42855. "and lr, lr, r3\n\t"
  42856. "subs r12, r12, lr\n\t"
  42857. "it hi\n\t"
  42858. "movhi r2, r6\n\t"
  42859. "it lo\n\t"
  42860. "movlo r2, r3\n\t"
  42861. "it ne\n\t"
  42862. "movne r3, r5\n\t"
  42863. "ldr r12, [%[a], #152]\n\t"
  42864. "ldr lr, [%[b], #152]\n\t"
  42865. "and r12, r12, r3\n\t"
  42866. "and lr, lr, r3\n\t"
  42867. "subs r12, r12, lr\n\t"
  42868. "it hi\n\t"
  42869. "movhi r2, r6\n\t"
  42870. "it lo\n\t"
  42871. "movlo r2, r3\n\t"
  42872. "it ne\n\t"
  42873. "movne r3, r5\n\t"
  42874. "ldr r12, [%[a], #148]\n\t"
  42875. "ldr lr, [%[b], #148]\n\t"
  42876. "and r12, r12, r3\n\t"
  42877. "and lr, lr, r3\n\t"
  42878. "subs r12, r12, lr\n\t"
  42879. "it hi\n\t"
  42880. "movhi r2, r6\n\t"
  42881. "it lo\n\t"
  42882. "movlo r2, r3\n\t"
  42883. "it ne\n\t"
  42884. "movne r3, r5\n\t"
  42885. "ldr r12, [%[a], #144]\n\t"
  42886. "ldr lr, [%[b], #144]\n\t"
  42887. "and r12, r12, r3\n\t"
  42888. "and lr, lr, r3\n\t"
  42889. "subs r12, r12, lr\n\t"
  42890. "it hi\n\t"
  42891. "movhi r2, r6\n\t"
  42892. "it lo\n\t"
  42893. "movlo r2, r3\n\t"
  42894. "it ne\n\t"
  42895. "movne r3, r5\n\t"
  42896. "ldr r12, [%[a], #140]\n\t"
  42897. "ldr lr, [%[b], #140]\n\t"
  42898. "and r12, r12, r3\n\t"
  42899. "and lr, lr, r3\n\t"
  42900. "subs r12, r12, lr\n\t"
  42901. "it hi\n\t"
  42902. "movhi r2, r6\n\t"
  42903. "it lo\n\t"
  42904. "movlo r2, r3\n\t"
  42905. "it ne\n\t"
  42906. "movne r3, r5\n\t"
  42907. "ldr r12, [%[a], #136]\n\t"
  42908. "ldr lr, [%[b], #136]\n\t"
  42909. "and r12, r12, r3\n\t"
  42910. "and lr, lr, r3\n\t"
  42911. "subs r12, r12, lr\n\t"
  42912. "it hi\n\t"
  42913. "movhi r2, r6\n\t"
  42914. "it lo\n\t"
  42915. "movlo r2, r3\n\t"
  42916. "it ne\n\t"
  42917. "movne r3, r5\n\t"
  42918. "ldr r12, [%[a], #132]\n\t"
  42919. "ldr lr, [%[b], #132]\n\t"
  42920. "and r12, r12, r3\n\t"
  42921. "and lr, lr, r3\n\t"
  42922. "subs r12, r12, lr\n\t"
  42923. "it hi\n\t"
  42924. "movhi r2, r6\n\t"
  42925. "it lo\n\t"
  42926. "movlo r2, r3\n\t"
  42927. "it ne\n\t"
  42928. "movne r3, r5\n\t"
  42929. "ldr r12, [%[a], #128]\n\t"
  42930. "ldr lr, [%[b], #128]\n\t"
  42931. "and r12, r12, r3\n\t"
  42932. "and lr, lr, r3\n\t"
  42933. "subs r12, r12, lr\n\t"
  42934. "it hi\n\t"
  42935. "movhi r2, r6\n\t"
  42936. "it lo\n\t"
  42937. "movlo r2, r3\n\t"
  42938. "it ne\n\t"
  42939. "movne r3, r5\n\t"
  42940. "ldr r12, [%[a], #124]\n\t"
  42941. "ldr lr, [%[b], #124]\n\t"
  42942. "and r12, r12, r3\n\t"
  42943. "and lr, lr, r3\n\t"
  42944. "subs r12, r12, lr\n\t"
  42945. "it hi\n\t"
  42946. "movhi r2, r6\n\t"
  42947. "it lo\n\t"
  42948. "movlo r2, r3\n\t"
  42949. "it ne\n\t"
  42950. "movne r3, r5\n\t"
  42951. "ldr r12, [%[a], #120]\n\t"
  42952. "ldr lr, [%[b], #120]\n\t"
  42953. "and r12, r12, r3\n\t"
  42954. "and lr, lr, r3\n\t"
  42955. "subs r12, r12, lr\n\t"
  42956. "it hi\n\t"
  42957. "movhi r2, r6\n\t"
  42958. "it lo\n\t"
  42959. "movlo r2, r3\n\t"
  42960. "it ne\n\t"
  42961. "movne r3, r5\n\t"
  42962. "ldr r12, [%[a], #116]\n\t"
  42963. "ldr lr, [%[b], #116]\n\t"
  42964. "and r12, r12, r3\n\t"
  42965. "and lr, lr, r3\n\t"
  42966. "subs r12, r12, lr\n\t"
  42967. "it hi\n\t"
  42968. "movhi r2, r6\n\t"
  42969. "it lo\n\t"
  42970. "movlo r2, r3\n\t"
  42971. "it ne\n\t"
  42972. "movne r3, r5\n\t"
  42973. "ldr r12, [%[a], #112]\n\t"
  42974. "ldr lr, [%[b], #112]\n\t"
  42975. "and r12, r12, r3\n\t"
  42976. "and lr, lr, r3\n\t"
  42977. "subs r12, r12, lr\n\t"
  42978. "it hi\n\t"
  42979. "movhi r2, r6\n\t"
  42980. "it lo\n\t"
  42981. "movlo r2, r3\n\t"
  42982. "it ne\n\t"
  42983. "movne r3, r5\n\t"
  42984. "ldr r12, [%[a], #108]\n\t"
  42985. "ldr lr, [%[b], #108]\n\t"
  42986. "and r12, r12, r3\n\t"
  42987. "and lr, lr, r3\n\t"
  42988. "subs r12, r12, lr\n\t"
  42989. "it hi\n\t"
  42990. "movhi r2, r6\n\t"
  42991. "it lo\n\t"
  42992. "movlo r2, r3\n\t"
  42993. "it ne\n\t"
  42994. "movne r3, r5\n\t"
  42995. "ldr r12, [%[a], #104]\n\t"
  42996. "ldr lr, [%[b], #104]\n\t"
  42997. "and r12, r12, r3\n\t"
  42998. "and lr, lr, r3\n\t"
  42999. "subs r12, r12, lr\n\t"
  43000. "it hi\n\t"
  43001. "movhi r2, r6\n\t"
  43002. "it lo\n\t"
  43003. "movlo r2, r3\n\t"
  43004. "it ne\n\t"
  43005. "movne r3, r5\n\t"
  43006. "ldr r12, [%[a], #100]\n\t"
  43007. "ldr lr, [%[b], #100]\n\t"
  43008. "and r12, r12, r3\n\t"
  43009. "and lr, lr, r3\n\t"
  43010. "subs r12, r12, lr\n\t"
  43011. "it hi\n\t"
  43012. "movhi r2, r6\n\t"
  43013. "it lo\n\t"
  43014. "movlo r2, r3\n\t"
  43015. "it ne\n\t"
  43016. "movne r3, r5\n\t"
  43017. "ldr r12, [%[a], #96]\n\t"
  43018. "ldr lr, [%[b], #96]\n\t"
  43019. "and r12, r12, r3\n\t"
  43020. "and lr, lr, r3\n\t"
  43021. "subs r12, r12, lr\n\t"
  43022. "it hi\n\t"
  43023. "movhi r2, r6\n\t"
  43024. "it lo\n\t"
  43025. "movlo r2, r3\n\t"
  43026. "it ne\n\t"
  43027. "movne r3, r5\n\t"
  43028. "ldr r12, [%[a], #92]\n\t"
  43029. "ldr lr, [%[b], #92]\n\t"
  43030. "and r12, r12, r3\n\t"
  43031. "and lr, lr, r3\n\t"
  43032. "subs r12, r12, lr\n\t"
  43033. "it hi\n\t"
  43034. "movhi r2, r6\n\t"
  43035. "it lo\n\t"
  43036. "movlo r2, r3\n\t"
  43037. "it ne\n\t"
  43038. "movne r3, r5\n\t"
  43039. "ldr r12, [%[a], #88]\n\t"
  43040. "ldr lr, [%[b], #88]\n\t"
  43041. "and r12, r12, r3\n\t"
  43042. "and lr, lr, r3\n\t"
  43043. "subs r12, r12, lr\n\t"
  43044. "it hi\n\t"
  43045. "movhi r2, r6\n\t"
  43046. "it lo\n\t"
  43047. "movlo r2, r3\n\t"
  43048. "it ne\n\t"
  43049. "movne r3, r5\n\t"
  43050. "ldr r12, [%[a], #84]\n\t"
  43051. "ldr lr, [%[b], #84]\n\t"
  43052. "and r12, r12, r3\n\t"
  43053. "and lr, lr, r3\n\t"
  43054. "subs r12, r12, lr\n\t"
  43055. "it hi\n\t"
  43056. "movhi r2, r6\n\t"
  43057. "it lo\n\t"
  43058. "movlo r2, r3\n\t"
  43059. "it ne\n\t"
  43060. "movne r3, r5\n\t"
  43061. "ldr r12, [%[a], #80]\n\t"
  43062. "ldr lr, [%[b], #80]\n\t"
  43063. "and r12, r12, r3\n\t"
  43064. "and lr, lr, r3\n\t"
  43065. "subs r12, r12, lr\n\t"
  43066. "it hi\n\t"
  43067. "movhi r2, r6\n\t"
  43068. "it lo\n\t"
  43069. "movlo r2, r3\n\t"
  43070. "it ne\n\t"
  43071. "movne r3, r5\n\t"
  43072. "ldr r12, [%[a], #76]\n\t"
  43073. "ldr lr, [%[b], #76]\n\t"
  43074. "and r12, r12, r3\n\t"
  43075. "and lr, lr, r3\n\t"
  43076. "subs r12, r12, lr\n\t"
  43077. "it hi\n\t"
  43078. "movhi r2, r6\n\t"
  43079. "it lo\n\t"
  43080. "movlo r2, r3\n\t"
  43081. "it ne\n\t"
  43082. "movne r3, r5\n\t"
  43083. "ldr r12, [%[a], #72]\n\t"
  43084. "ldr lr, [%[b], #72]\n\t"
  43085. "and r12, r12, r3\n\t"
  43086. "and lr, lr, r3\n\t"
  43087. "subs r12, r12, lr\n\t"
  43088. "it hi\n\t"
  43089. "movhi r2, r6\n\t"
  43090. "it lo\n\t"
  43091. "movlo r2, r3\n\t"
  43092. "it ne\n\t"
  43093. "movne r3, r5\n\t"
  43094. "ldr r12, [%[a], #68]\n\t"
  43095. "ldr lr, [%[b], #68]\n\t"
  43096. "and r12, r12, r3\n\t"
  43097. "and lr, lr, r3\n\t"
  43098. "subs r12, r12, lr\n\t"
  43099. "it hi\n\t"
  43100. "movhi r2, r6\n\t"
  43101. "it lo\n\t"
  43102. "movlo r2, r3\n\t"
  43103. "it ne\n\t"
  43104. "movne r3, r5\n\t"
  43105. "ldr r12, [%[a], #64]\n\t"
  43106. "ldr lr, [%[b], #64]\n\t"
  43107. "and r12, r12, r3\n\t"
  43108. "and lr, lr, r3\n\t"
  43109. "subs r12, r12, lr\n\t"
  43110. "it hi\n\t"
  43111. "movhi r2, r6\n\t"
  43112. "it lo\n\t"
  43113. "movlo r2, r3\n\t"
  43114. "it ne\n\t"
  43115. "movne r3, r5\n\t"
  43116. "ldr r12, [%[a], #60]\n\t"
  43117. "ldr lr, [%[b], #60]\n\t"
  43118. "and r12, r12, r3\n\t"
  43119. "and lr, lr, r3\n\t"
  43120. "subs r12, r12, lr\n\t"
  43121. "it hi\n\t"
  43122. "movhi r2, r6\n\t"
  43123. "it lo\n\t"
  43124. "movlo r2, r3\n\t"
  43125. "it ne\n\t"
  43126. "movne r3, r5\n\t"
  43127. "ldr r12, [%[a], #56]\n\t"
  43128. "ldr lr, [%[b], #56]\n\t"
  43129. "and r12, r12, r3\n\t"
  43130. "and lr, lr, r3\n\t"
  43131. "subs r12, r12, lr\n\t"
  43132. "it hi\n\t"
  43133. "movhi r2, r6\n\t"
  43134. "it lo\n\t"
  43135. "movlo r2, r3\n\t"
  43136. "it ne\n\t"
  43137. "movne r3, r5\n\t"
  43138. "ldr r12, [%[a], #52]\n\t"
  43139. "ldr lr, [%[b], #52]\n\t"
  43140. "and r12, r12, r3\n\t"
  43141. "and lr, lr, r3\n\t"
  43142. "subs r12, r12, lr\n\t"
  43143. "it hi\n\t"
  43144. "movhi r2, r6\n\t"
  43145. "it lo\n\t"
  43146. "movlo r2, r3\n\t"
  43147. "it ne\n\t"
  43148. "movne r3, r5\n\t"
  43149. "ldr r12, [%[a], #48]\n\t"
  43150. "ldr lr, [%[b], #48]\n\t"
  43151. "and r12, r12, r3\n\t"
  43152. "and lr, lr, r3\n\t"
  43153. "subs r12, r12, lr\n\t"
  43154. "it hi\n\t"
  43155. "movhi r2, r6\n\t"
  43156. "it lo\n\t"
  43157. "movlo r2, r3\n\t"
  43158. "it ne\n\t"
  43159. "movne r3, r5\n\t"
  43160. "ldr r12, [%[a], #44]\n\t"
  43161. "ldr lr, [%[b], #44]\n\t"
  43162. "and r12, r12, r3\n\t"
  43163. "and lr, lr, r3\n\t"
  43164. "subs r12, r12, lr\n\t"
  43165. "it hi\n\t"
  43166. "movhi r2, r6\n\t"
  43167. "it lo\n\t"
  43168. "movlo r2, r3\n\t"
  43169. "it ne\n\t"
  43170. "movne r3, r5\n\t"
  43171. "ldr r12, [%[a], #40]\n\t"
  43172. "ldr lr, [%[b], #40]\n\t"
  43173. "and r12, r12, r3\n\t"
  43174. "and lr, lr, r3\n\t"
  43175. "subs r12, r12, lr\n\t"
  43176. "it hi\n\t"
  43177. "movhi r2, r6\n\t"
  43178. "it lo\n\t"
  43179. "movlo r2, r3\n\t"
  43180. "it ne\n\t"
  43181. "movne r3, r5\n\t"
  43182. "ldr r12, [%[a], #36]\n\t"
  43183. "ldr lr, [%[b], #36]\n\t"
  43184. "and r12, r12, r3\n\t"
  43185. "and lr, lr, r3\n\t"
  43186. "subs r12, r12, lr\n\t"
  43187. "it hi\n\t"
  43188. "movhi r2, r6\n\t"
  43189. "it lo\n\t"
  43190. "movlo r2, r3\n\t"
  43191. "it ne\n\t"
  43192. "movne r3, r5\n\t"
  43193. "ldr r12, [%[a], #32]\n\t"
  43194. "ldr lr, [%[b], #32]\n\t"
  43195. "and r12, r12, r3\n\t"
  43196. "and lr, lr, r3\n\t"
  43197. "subs r12, r12, lr\n\t"
  43198. "it hi\n\t"
  43199. "movhi r2, r6\n\t"
  43200. "it lo\n\t"
  43201. "movlo r2, r3\n\t"
  43202. "it ne\n\t"
  43203. "movne r3, r5\n\t"
  43204. "ldr r12, [%[a], #28]\n\t"
  43205. "ldr lr, [%[b], #28]\n\t"
  43206. "and r12, r12, r3\n\t"
  43207. "and lr, lr, r3\n\t"
  43208. "subs r12, r12, lr\n\t"
  43209. "it hi\n\t"
  43210. "movhi r2, r6\n\t"
  43211. "it lo\n\t"
  43212. "movlo r2, r3\n\t"
  43213. "it ne\n\t"
  43214. "movne r3, r5\n\t"
  43215. "ldr r12, [%[a], #24]\n\t"
  43216. "ldr lr, [%[b], #24]\n\t"
  43217. "and r12, r12, r3\n\t"
  43218. "and lr, lr, r3\n\t"
  43219. "subs r12, r12, lr\n\t"
  43220. "it hi\n\t"
  43221. "movhi r2, r6\n\t"
  43222. "it lo\n\t"
  43223. "movlo r2, r3\n\t"
  43224. "it ne\n\t"
  43225. "movne r3, r5\n\t"
  43226. "ldr r12, [%[a], #20]\n\t"
  43227. "ldr lr, [%[b], #20]\n\t"
  43228. "and r12, r12, r3\n\t"
  43229. "and lr, lr, r3\n\t"
  43230. "subs r12, r12, lr\n\t"
  43231. "it hi\n\t"
  43232. "movhi r2, r6\n\t"
  43233. "it lo\n\t"
  43234. "movlo r2, r3\n\t"
  43235. "it ne\n\t"
  43236. "movne r3, r5\n\t"
  43237. "ldr r12, [%[a], #16]\n\t"
  43238. "ldr lr, [%[b], #16]\n\t"
  43239. "and r12, r12, r3\n\t"
  43240. "and lr, lr, r3\n\t"
  43241. "subs r12, r12, lr\n\t"
  43242. "it hi\n\t"
  43243. "movhi r2, r6\n\t"
  43244. "it lo\n\t"
  43245. "movlo r2, r3\n\t"
  43246. "it ne\n\t"
  43247. "movne r3, r5\n\t"
  43248. "ldr r12, [%[a], #12]\n\t"
  43249. "ldr lr, [%[b], #12]\n\t"
  43250. "and r12, r12, r3\n\t"
  43251. "and lr, lr, r3\n\t"
  43252. "subs r12, r12, lr\n\t"
  43253. "it hi\n\t"
  43254. "movhi r2, r6\n\t"
  43255. "it lo\n\t"
  43256. "movlo r2, r3\n\t"
  43257. "it ne\n\t"
  43258. "movne r3, r5\n\t"
  43259. "ldr r12, [%[a], #8]\n\t"
  43260. "ldr lr, [%[b], #8]\n\t"
  43261. "and r12, r12, r3\n\t"
  43262. "and lr, lr, r3\n\t"
  43263. "subs r12, r12, lr\n\t"
  43264. "it hi\n\t"
  43265. "movhi r2, r6\n\t"
  43266. "it lo\n\t"
  43267. "movlo r2, r3\n\t"
  43268. "it ne\n\t"
  43269. "movne r3, r5\n\t"
  43270. "ldr r12, [%[a], #4]\n\t"
  43271. "ldr lr, [%[b], #4]\n\t"
  43272. "and r12, r12, r3\n\t"
  43273. "and lr, lr, r3\n\t"
  43274. "subs r12, r12, lr\n\t"
  43275. "it hi\n\t"
  43276. "movhi r2, r6\n\t"
  43277. "it lo\n\t"
  43278. "movlo r2, r3\n\t"
  43279. "it ne\n\t"
  43280. "movne r3, r5\n\t"
  43281. "ldr r12, [%[a]]\n\t"
  43282. "ldr lr, [%[b]]\n\t"
  43283. "and r12, r12, r3\n\t"
  43284. "and lr, lr, r3\n\t"
  43285. "subs r12, r12, lr\n\t"
  43286. "it hi\n\t"
  43287. "movhi r2, r6\n\t"
  43288. "it lo\n\t"
  43289. "movlo r2, r3\n\t"
  43290. "it ne\n\t"
  43291. "movne r3, r5\n\t"
  43292. "eor r2, r2, r3\n\t"
  43293. #endif /*WOLFSSL_SP_SMALL */
  43294. "mov %[a], r2\n\t"
  43295. : [a] "+r" (a), [b] "+r" (b)
  43296. :
  43297. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  43298. );
  43299. return (uint32_t)(size_t)a;
  43300. }
  43301. /* Divide d in a and put remainder into r (m*d + r = a)
  43302. * m is not calculated as it is not needed at this time.
  43303. *
  43304. * a Number to be divided.
  43305. * d Number to divide with.
  43306. * m Multiplier result.
  43307. * r Remainder from the division.
  43308. * returns MP_OKAY indicating success.
  43309. */
  43310. static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d,
  43311. sp_digit* m, sp_digit* r)
  43312. {
  43313. sp_digit t1[192], t2[97];
  43314. sp_digit div, r1;
  43315. int i;
  43316. (void)m;
  43317. div = d[95];
  43318. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  43319. r1 = sp_3072_cmp_96(&t1[96], d) >= 0;
  43320. sp_3072_cond_sub_96(&t1[96], &t1[96], d, (sp_digit)0 - r1);
  43321. for (i = 95; i >= 0; i--) {
  43322. volatile sp_digit mask = (sp_digit)0 - (t1[96 + i] == div);
  43323. sp_digit hi = t1[96 + i] + mask;
  43324. r1 = div_3072_word_96(hi, t1[96 + i - 1], div);
  43325. r1 |= mask;
  43326. sp_3072_mul_d_96(t2, d, r1);
  43327. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  43328. t1[96 + i] -= t2[96];
  43329. sp_3072_mask_96(t2, d, t1[96 + i]);
  43330. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  43331. sp_3072_mask_96(t2, d, t1[96 + i]);
  43332. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  43333. }
  43334. r1 = sp_3072_cmp_96(t1, d) >= 0;
  43335. sp_3072_cond_sub_96(r, t1, d, (sp_digit)0 - r1);
  43336. return MP_OKAY;
  43337. }
  43338. /* Reduce a modulo m into r. (r = a mod m)
  43339. *
  43340. * r A single precision number that is the reduced result.
  43341. * a A single precision number that is to be reduced.
  43342. * m A single precision number that is the modulus to reduce with.
  43343. * returns MP_OKAY indicating success.
  43344. */
  43345. static WC_INLINE int sp_3072_mod_96(sp_digit* r, const sp_digit* a,
  43346. const sp_digit* m)
  43347. {
  43348. return sp_3072_div_96(a, m, NULL, r);
  43349. }
  43350. #endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */
  43351. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  43352. defined(WOLFSSL_HAVE_SP_DH)
  43353. #ifdef WOLFSSL_SP_SMALL
  43354. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  43355. *
  43356. * r A single precision number that is the result of the operation.
  43357. * a A single precision number being exponentiated.
  43358. * e A single precision number that is the exponent.
  43359. * bits The number of bits in the exponent.
  43360. * m A single precision number that is the modulus.
  43361. * returns 0 on success.
  43362. * returns MEMORY_E on dynamic memory allocation failure.
  43363. * returns MP_VAL when base is even or exponent is 0.
  43364. */
  43365. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  43366. int bits, const sp_digit* m, int reduceA)
  43367. {
  43368. #ifdef WOLFSSL_SP_SMALL_STACK
  43369. sp_digit* td = NULL;
  43370. #else
  43371. sp_digit td[8 * 192];
  43372. #endif
  43373. sp_digit* t[8];
  43374. sp_digit* norm = NULL;
  43375. sp_digit mp = 1;
  43376. sp_digit n;
  43377. sp_digit mask;
  43378. int i;
  43379. int c;
  43380. byte y;
  43381. int err = MP_OKAY;
  43382. if (bits == 0) {
  43383. err = MP_VAL;
  43384. }
  43385. #ifdef WOLFSSL_SP_SMALL_STACK
  43386. if (err == MP_OKAY) {
  43387. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 192), NULL,
  43388. DYNAMIC_TYPE_TMP_BUFFER);
  43389. if (td == NULL)
  43390. err = MEMORY_E;
  43391. }
  43392. #endif
  43393. if (err == MP_OKAY) {
  43394. norm = td;
  43395. for (i=0; i<8; i++) {
  43396. t[i] = td + i * 192;
  43397. }
  43398. sp_3072_mont_setup(m, &mp);
  43399. sp_3072_mont_norm_96(norm, m);
  43400. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  43401. if (reduceA != 0) {
  43402. err = sp_3072_mod_96(t[1] + 96, a, m);
  43403. if (err == MP_OKAY) {
  43404. err = sp_3072_mod_96(t[1], t[1], m);
  43405. }
  43406. }
  43407. else {
  43408. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  43409. err = sp_3072_mod_96(t[1], t[1], m);
  43410. }
  43411. }
  43412. if (err == MP_OKAY) {
  43413. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  43414. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  43415. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  43416. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  43417. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  43418. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  43419. i = (bits - 1) / 32;
  43420. n = e[i--];
  43421. c = bits & 31;
  43422. if (c == 0) {
  43423. c = 32;
  43424. }
  43425. c -= bits % 3;
  43426. if (c == 32) {
  43427. c = 29;
  43428. }
  43429. if (c < 0) {
  43430. /* Number of bits in top word is less than number needed. */
  43431. c = -c;
  43432. y = (byte)(n << c);
  43433. n = e[i--];
  43434. y |= (byte)(n >> (64 - c));
  43435. n <<= c;
  43436. c = 64 - c;
  43437. }
  43438. else if (c == 0) {
  43439. /* All bits in top word used. */
  43440. y = (byte)n;
  43441. }
  43442. else {
  43443. y = (byte)(n >> c);
  43444. n <<= 32 - c;
  43445. }
  43446. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  43447. for (; i>=0 || c>=3; ) {
  43448. if (c == 0) {
  43449. n = e[i--];
  43450. y = (byte)(n >> 29);
  43451. n <<= 3;
  43452. c = 29;
  43453. }
  43454. else if (c < 3) {
  43455. y = (byte)(n >> 29);
  43456. n = e[i--];
  43457. c = 3 - c;
  43458. y |= (byte)(n >> (32 - c));
  43459. n <<= c;
  43460. c = 32 - c;
  43461. }
  43462. else {
  43463. y = (byte)((n >> 29) & 0x7);
  43464. n <<= 3;
  43465. c -= 3;
  43466. }
  43467. sp_3072_mont_sqr_96(r, r, m, mp);
  43468. sp_3072_mont_sqr_96(r, r, m, mp);
  43469. sp_3072_mont_sqr_96(r, r, m, mp);
  43470. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  43471. }
  43472. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  43473. sp_3072_mont_reduce_96(r, m, mp);
  43474. mask = (sp_digit)0 - (sp_3072_cmp_96(r, m) >= 0);
  43475. sp_3072_cond_sub_96(r, r, m, mask);
  43476. }
  43477. #ifdef WOLFSSL_SP_SMALL_STACK
  43478. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43479. #endif
  43480. return err;
  43481. }
  43482. #else
  43483. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  43484. *
  43485. * r A single precision number that is the result of the operation.
  43486. * a A single precision number being exponentiated.
  43487. * e A single precision number that is the exponent.
  43488. * bits The number of bits in the exponent.
  43489. * m A single precision number that is the modulus.
  43490. * returns 0 on success.
  43491. * returns MEMORY_E on dynamic memory allocation failure.
  43492. * returns MP_VAL when base is even or exponent is 0.
  43493. */
  43494. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  43495. int bits, const sp_digit* m, int reduceA)
  43496. {
  43497. #ifdef WOLFSSL_SP_SMALL_STACK
  43498. sp_digit* td = NULL;
  43499. #else
  43500. sp_digit td[16 * 192];
  43501. #endif
  43502. sp_digit* t[16];
  43503. sp_digit* norm = NULL;
  43504. sp_digit mp = 1;
  43505. sp_digit n;
  43506. sp_digit mask;
  43507. int i;
  43508. int c;
  43509. byte y;
  43510. int err = MP_OKAY;
  43511. if (bits == 0) {
  43512. err = MP_VAL;
  43513. }
  43514. #ifdef WOLFSSL_SP_SMALL_STACK
  43515. if (err == MP_OKAY) {
  43516. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 192), NULL,
  43517. DYNAMIC_TYPE_TMP_BUFFER);
  43518. if (td == NULL)
  43519. err = MEMORY_E;
  43520. }
  43521. #endif
  43522. if (err == MP_OKAY) {
  43523. norm = td;
  43524. for (i=0; i<16; i++) {
  43525. t[i] = td + i * 192;
  43526. }
  43527. sp_3072_mont_setup(m, &mp);
  43528. sp_3072_mont_norm_96(norm, m);
  43529. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  43530. if (reduceA != 0) {
  43531. err = sp_3072_mod_96(t[1] + 96, a, m);
  43532. if (err == MP_OKAY) {
  43533. err = sp_3072_mod_96(t[1], t[1], m);
  43534. }
  43535. }
  43536. else {
  43537. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  43538. err = sp_3072_mod_96(t[1], t[1], m);
  43539. }
  43540. }
  43541. if (err == MP_OKAY) {
  43542. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  43543. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  43544. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  43545. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  43546. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  43547. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  43548. sp_3072_mont_sqr_96(t[ 8], t[ 4], m, mp);
  43549. sp_3072_mont_mul_96(t[ 9], t[ 5], t[ 4], m, mp);
  43550. sp_3072_mont_sqr_96(t[10], t[ 5], m, mp);
  43551. sp_3072_mont_mul_96(t[11], t[ 6], t[ 5], m, mp);
  43552. sp_3072_mont_sqr_96(t[12], t[ 6], m, mp);
  43553. sp_3072_mont_mul_96(t[13], t[ 7], t[ 6], m, mp);
  43554. sp_3072_mont_sqr_96(t[14], t[ 7], m, mp);
  43555. sp_3072_mont_mul_96(t[15], t[ 8], t[ 7], m, mp);
  43556. i = (bits - 1) / 32;
  43557. n = e[i--];
  43558. c = bits & 31;
  43559. if (c == 0) {
  43560. c = 32;
  43561. }
  43562. c -= bits % 4;
  43563. if (c == 32) {
  43564. c = 28;
  43565. }
  43566. if (c < 0) {
  43567. /* Number of bits in top word is less than number needed. */
  43568. c = -c;
  43569. y = (byte)(n << c);
  43570. n = e[i--];
  43571. y |= (byte)(n >> (64 - c));
  43572. n <<= c;
  43573. c = 64 - c;
  43574. }
  43575. else if (c == 0) {
  43576. /* All bits in top word used. */
  43577. y = (byte)n;
  43578. }
  43579. else {
  43580. y = (byte)(n >> c);
  43581. n <<= 32 - c;
  43582. }
  43583. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  43584. for (; i>=0 || c>=4; ) {
  43585. if (c == 0) {
  43586. n = e[i--];
  43587. y = (byte)(n >> 28);
  43588. n <<= 4;
  43589. c = 28;
  43590. }
  43591. else if (c < 4) {
  43592. y = (byte)(n >> 28);
  43593. n = e[i--];
  43594. c = 4 - c;
  43595. y |= (byte)(n >> (32 - c));
  43596. n <<= c;
  43597. c = 32 - c;
  43598. }
  43599. else {
  43600. y = (byte)((n >> 28) & 0xf);
  43601. n <<= 4;
  43602. c -= 4;
  43603. }
  43604. sp_3072_mont_sqr_96(r, r, m, mp);
  43605. sp_3072_mont_sqr_96(r, r, m, mp);
  43606. sp_3072_mont_sqr_96(r, r, m, mp);
  43607. sp_3072_mont_sqr_96(r, r, m, mp);
  43608. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  43609. }
  43610. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  43611. sp_3072_mont_reduce_96(r, m, mp);
  43612. mask = (sp_digit)0 - (sp_3072_cmp_96(r, m) >= 0);
  43613. sp_3072_cond_sub_96(r, r, m, mask);
  43614. }
  43615. #ifdef WOLFSSL_SP_SMALL_STACK
  43616. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43617. #endif
  43618. return err;
  43619. }
  43620. #endif /* WOLFSSL_SP_SMALL */
  43621. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  43622. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  43623. #ifdef WOLFSSL_HAVE_SP_RSA
  43624. /* RSA public key operation.
  43625. *
  43626. * in Array of bytes representing the number to exponentiate, base.
  43627. * inLen Number of bytes in base.
  43628. * em Public exponent.
  43629. * mm Modulus.
  43630. * out Buffer to hold big-endian bytes of exponentiation result.
  43631. * Must be at least 384 bytes long.
  43632. * outLen Number of bytes in result.
  43633. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  43634. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  43635. */
  43636. int sp_RsaPublic_3072(const byte* in, word32 inLen, const mp_int* em,
  43637. const mp_int* mm, byte* out, word32* outLen)
  43638. {
  43639. #ifdef WOLFSSL_SP_SMALL_STACK
  43640. sp_digit* a = NULL;
  43641. #else
  43642. sp_digit a[96 * 5];
  43643. #endif
  43644. sp_digit* m = NULL;
  43645. sp_digit* r = NULL;
  43646. sp_digit *ah = NULL;
  43647. sp_digit e[1] = {0};
  43648. int err = MP_OKAY;
  43649. if (*outLen < 384) {
  43650. err = MP_TO_E;
  43651. }
  43652. else if (mp_count_bits(em) > 32 || inLen > 384 ||
  43653. mp_count_bits(mm) != 3072) {
  43654. err = MP_READ_E;
  43655. }
  43656. else if (mp_iseven(mm)) {
  43657. err = MP_VAL;
  43658. }
  43659. #ifdef WOLFSSL_SP_SMALL_STACK
  43660. if (err == MP_OKAY) {
  43661. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 5, NULL,
  43662. DYNAMIC_TYPE_RSA);
  43663. if (a == NULL)
  43664. err = MEMORY_E;
  43665. }
  43666. #endif
  43667. if (err == MP_OKAY) {
  43668. ah = a + 96;
  43669. r = a + 96 * 2;
  43670. m = r + 96 * 2;
  43671. sp_3072_from_bin(ah, 96, in, inLen);
  43672. #if DIGIT_BIT >= 32
  43673. e[0] = em->dp[0];
  43674. #else
  43675. e[0] = em->dp[0];
  43676. if (em->used > 1) {
  43677. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  43678. }
  43679. #endif
  43680. if (e[0] == 0) {
  43681. err = MP_EXPTMOD_E;
  43682. }
  43683. }
  43684. if (err == MP_OKAY) {
  43685. sp_3072_from_mp(m, 96, mm);
  43686. if (e[0] == 0x10001) {
  43687. int i;
  43688. sp_digit mp;
  43689. sp_3072_mont_setup(m, &mp);
  43690. /* Convert to Montgomery form. */
  43691. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  43692. err = sp_3072_mod_96_cond(r, a, m);
  43693. /* Montgomery form: r = a.R mod m */
  43694. if (err == MP_OKAY) {
  43695. /* r = a ^ 0x10000 => r = a squared 16 times */
  43696. for (i = 15; i >= 0; i--) {
  43697. sp_3072_mont_sqr_96(r, r, m, mp);
  43698. }
  43699. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  43700. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  43701. */
  43702. sp_3072_mont_mul_96(r, r, ah, m, mp);
  43703. for (i = 95; i > 0; i--) {
  43704. if (r[i] != m[i]) {
  43705. break;
  43706. }
  43707. }
  43708. if (r[i] >= m[i]) {
  43709. sp_3072_sub_in_place_96(r, m);
  43710. }
  43711. }
  43712. }
  43713. else if (e[0] == 0x3) {
  43714. if (err == MP_OKAY) {
  43715. sp_3072_sqr_96(r, ah);
  43716. err = sp_3072_mod_96_cond(r, r, m);
  43717. }
  43718. if (err == MP_OKAY) {
  43719. sp_3072_mul_96(r, ah, r);
  43720. err = sp_3072_mod_96_cond(r, r, m);
  43721. }
  43722. }
  43723. else {
  43724. int i;
  43725. sp_digit mp;
  43726. sp_3072_mont_setup(m, &mp);
  43727. /* Convert to Montgomery form. */
  43728. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  43729. err = sp_3072_mod_96_cond(a, a, m);
  43730. if (err == MP_OKAY) {
  43731. for (i = 31; i >= 0; i--) {
  43732. if (e[0] >> i) {
  43733. break;
  43734. }
  43735. }
  43736. XMEMCPY(r, a, sizeof(sp_digit) * 96);
  43737. for (i--; i >= 0; i--) {
  43738. sp_3072_mont_sqr_96(r, r, m, mp);
  43739. if (((e[0] >> i) & 1) == 1) {
  43740. sp_3072_mont_mul_96(r, r, a, m, mp);
  43741. }
  43742. }
  43743. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96);
  43744. sp_3072_mont_reduce_96(r, m, mp);
  43745. for (i = 95; i > 0; i--) {
  43746. if (r[i] != m[i]) {
  43747. break;
  43748. }
  43749. }
  43750. if (r[i] >= m[i]) {
  43751. sp_3072_sub_in_place_96(r, m);
  43752. }
  43753. }
  43754. }
  43755. }
  43756. if (err == MP_OKAY) {
  43757. sp_3072_to_bin_96(r, out);
  43758. *outLen = 384;
  43759. }
  43760. #ifdef WOLFSSL_SP_SMALL_STACK
  43761. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  43762. #endif
  43763. return err;
  43764. }
  43765. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  43766. #ifdef WOLFSSL_SP_SMALL
  43767. /* Conditionally add a and b using the mask m.
  43768. * m is -1 to add and 0 when not.
  43769. *
  43770. * r A single precision number representing conditional add result.
  43771. * a A single precision number to add with.
  43772. * b A single precision number to add.
  43773. * m Mask value to apply.
  43774. */
  43775. 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)
  43776. {
  43777. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  43778. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  43779. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  43780. register sp_digit m asm ("r3") = (sp_digit)m_p;
  43781. __asm__ __volatile__ (
  43782. "mov lr, #0\n\t"
  43783. "mov r6, #0\n\t"
  43784. "mov r12, #0\n\t"
  43785. "\n"
  43786. "L_sp_3072_cond_add_48_words_%=: \n\t"
  43787. "adds lr, lr, #-1\n\t"
  43788. "ldr r4, [%[a], r12]\n\t"
  43789. "ldr r5, [%[b], r12]\n\t"
  43790. "and r5, r5, %[m]\n\t"
  43791. "adcs r4, r4, r5\n\t"
  43792. "adc lr, r6, r6\n\t"
  43793. "str r4, [%[r], r12]\n\t"
  43794. "add r12, r12, #4\n\t"
  43795. "cmp r12, #0xc0\n\t"
  43796. "blt L_sp_3072_cond_add_48_words_%=\n\t"
  43797. "mov %[r], lr\n\t"
  43798. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  43799. :
  43800. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  43801. );
  43802. return (uint32_t)(size_t)r;
  43803. }
  43804. #else
  43805. /* Conditionally add a and b using the mask m.
  43806. * m is -1 to add and 0 when not.
  43807. *
  43808. * r A single precision number representing conditional add result.
  43809. * a A single precision number to add with.
  43810. * b A single precision number to add.
  43811. * m Mask value to apply.
  43812. */
  43813. 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)
  43814. {
  43815. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  43816. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  43817. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  43818. register sp_digit m asm ("r3") = (sp_digit)m_p;
  43819. __asm__ __volatile__ (
  43820. "mov r8, #0\n\t"
  43821. "ldm %[a]!, {r4, r5}\n\t"
  43822. "ldm %[b]!, {r6, r7}\n\t"
  43823. "and r6, r6, %[m]\n\t"
  43824. "and r7, r7, %[m]\n\t"
  43825. "adds r4, r4, r6\n\t"
  43826. "adcs r5, r5, r7\n\t"
  43827. "stm %[r]!, {r4, r5}\n\t"
  43828. "ldm %[a]!, {r4, r5}\n\t"
  43829. "ldm %[b]!, {r6, r7}\n\t"
  43830. "and r6, r6, %[m]\n\t"
  43831. "and r7, r7, %[m]\n\t"
  43832. "adcs r4, r4, r6\n\t"
  43833. "adcs r5, r5, r7\n\t"
  43834. "stm %[r]!, {r4, r5}\n\t"
  43835. "ldm %[a]!, {r4, r5}\n\t"
  43836. "ldm %[b]!, {r6, r7}\n\t"
  43837. "and r6, r6, %[m]\n\t"
  43838. "and r7, r7, %[m]\n\t"
  43839. "adcs r4, r4, r6\n\t"
  43840. "adcs r5, r5, r7\n\t"
  43841. "stm %[r]!, {r4, r5}\n\t"
  43842. "ldm %[a]!, {r4, r5}\n\t"
  43843. "ldm %[b]!, {r6, r7}\n\t"
  43844. "and r6, r6, %[m]\n\t"
  43845. "and r7, r7, %[m]\n\t"
  43846. "adcs r4, r4, r6\n\t"
  43847. "adcs r5, r5, r7\n\t"
  43848. "stm %[r]!, {r4, r5}\n\t"
  43849. "ldm %[a]!, {r4, r5}\n\t"
  43850. "ldm %[b]!, {r6, r7}\n\t"
  43851. "and r6, r6, %[m]\n\t"
  43852. "and r7, r7, %[m]\n\t"
  43853. "adcs r4, r4, r6\n\t"
  43854. "adcs r5, r5, r7\n\t"
  43855. "stm %[r]!, {r4, r5}\n\t"
  43856. "ldm %[a]!, {r4, r5}\n\t"
  43857. "ldm %[b]!, {r6, r7}\n\t"
  43858. "and r6, r6, %[m]\n\t"
  43859. "and r7, r7, %[m]\n\t"
  43860. "adcs r4, r4, r6\n\t"
  43861. "adcs r5, r5, r7\n\t"
  43862. "stm %[r]!, {r4, r5}\n\t"
  43863. "ldm %[a]!, {r4, r5}\n\t"
  43864. "ldm %[b]!, {r6, r7}\n\t"
  43865. "and r6, r6, %[m]\n\t"
  43866. "and r7, r7, %[m]\n\t"
  43867. "adcs r4, r4, r6\n\t"
  43868. "adcs r5, r5, r7\n\t"
  43869. "stm %[r]!, {r4, r5}\n\t"
  43870. "ldm %[a]!, {r4, r5}\n\t"
  43871. "ldm %[b]!, {r6, r7}\n\t"
  43872. "and r6, r6, %[m]\n\t"
  43873. "and r7, r7, %[m]\n\t"
  43874. "adcs r4, r4, r6\n\t"
  43875. "adcs r5, r5, r7\n\t"
  43876. "stm %[r]!, {r4, r5}\n\t"
  43877. "ldm %[a]!, {r4, r5}\n\t"
  43878. "ldm %[b]!, {r6, r7}\n\t"
  43879. "and r6, r6, %[m]\n\t"
  43880. "and r7, r7, %[m]\n\t"
  43881. "adcs r4, r4, r6\n\t"
  43882. "adcs r5, r5, r7\n\t"
  43883. "stm %[r]!, {r4, r5}\n\t"
  43884. "ldm %[a]!, {r4, r5}\n\t"
  43885. "ldm %[b]!, {r6, r7}\n\t"
  43886. "and r6, r6, %[m]\n\t"
  43887. "and r7, r7, %[m]\n\t"
  43888. "adcs r4, r4, r6\n\t"
  43889. "adcs r5, r5, r7\n\t"
  43890. "stm %[r]!, {r4, r5}\n\t"
  43891. "ldm %[a]!, {r4, r5}\n\t"
  43892. "ldm %[b]!, {r6, r7}\n\t"
  43893. "and r6, r6, %[m]\n\t"
  43894. "and r7, r7, %[m]\n\t"
  43895. "adcs r4, r4, r6\n\t"
  43896. "adcs r5, r5, r7\n\t"
  43897. "stm %[r]!, {r4, r5}\n\t"
  43898. "ldm %[a]!, {r4, r5}\n\t"
  43899. "ldm %[b]!, {r6, r7}\n\t"
  43900. "and r6, r6, %[m]\n\t"
  43901. "and r7, r7, %[m]\n\t"
  43902. "adcs r4, r4, r6\n\t"
  43903. "adcs r5, r5, r7\n\t"
  43904. "stm %[r]!, {r4, r5}\n\t"
  43905. "ldm %[a]!, {r4, r5}\n\t"
  43906. "ldm %[b]!, {r6, r7}\n\t"
  43907. "and r6, r6, %[m]\n\t"
  43908. "and r7, r7, %[m]\n\t"
  43909. "adcs r4, r4, r6\n\t"
  43910. "adcs r5, r5, r7\n\t"
  43911. "stm %[r]!, {r4, r5}\n\t"
  43912. "ldm %[a]!, {r4, r5}\n\t"
  43913. "ldm %[b]!, {r6, r7}\n\t"
  43914. "and r6, r6, %[m]\n\t"
  43915. "and r7, r7, %[m]\n\t"
  43916. "adcs r4, r4, r6\n\t"
  43917. "adcs r5, r5, r7\n\t"
  43918. "stm %[r]!, {r4, r5}\n\t"
  43919. "ldm %[a]!, {r4, r5}\n\t"
  43920. "ldm %[b]!, {r6, r7}\n\t"
  43921. "and r6, r6, %[m]\n\t"
  43922. "and r7, r7, %[m]\n\t"
  43923. "adcs r4, r4, r6\n\t"
  43924. "adcs r5, r5, r7\n\t"
  43925. "stm %[r]!, {r4, r5}\n\t"
  43926. "ldm %[a]!, {r4, r5}\n\t"
  43927. "ldm %[b]!, {r6, r7}\n\t"
  43928. "and r6, r6, %[m]\n\t"
  43929. "and r7, r7, %[m]\n\t"
  43930. "adcs r4, r4, r6\n\t"
  43931. "adcs r5, r5, r7\n\t"
  43932. "stm %[r]!, {r4, r5}\n\t"
  43933. "ldm %[a]!, {r4, r5}\n\t"
  43934. "ldm %[b]!, {r6, r7}\n\t"
  43935. "and r6, r6, %[m]\n\t"
  43936. "and r7, r7, %[m]\n\t"
  43937. "adcs r4, r4, r6\n\t"
  43938. "adcs r5, r5, r7\n\t"
  43939. "stm %[r]!, {r4, r5}\n\t"
  43940. "ldm %[a]!, {r4, r5}\n\t"
  43941. "ldm %[b]!, {r6, r7}\n\t"
  43942. "and r6, r6, %[m]\n\t"
  43943. "and r7, r7, %[m]\n\t"
  43944. "adcs r4, r4, r6\n\t"
  43945. "adcs r5, r5, r7\n\t"
  43946. "stm %[r]!, {r4, r5}\n\t"
  43947. "ldm %[a]!, {r4, r5}\n\t"
  43948. "ldm %[b]!, {r6, r7}\n\t"
  43949. "and r6, r6, %[m]\n\t"
  43950. "and r7, r7, %[m]\n\t"
  43951. "adcs r4, r4, r6\n\t"
  43952. "adcs r5, r5, r7\n\t"
  43953. "stm %[r]!, {r4, r5}\n\t"
  43954. "ldm %[a]!, {r4, r5}\n\t"
  43955. "ldm %[b]!, {r6, r7}\n\t"
  43956. "and r6, r6, %[m]\n\t"
  43957. "and r7, r7, %[m]\n\t"
  43958. "adcs r4, r4, r6\n\t"
  43959. "adcs r5, r5, r7\n\t"
  43960. "stm %[r]!, {r4, r5}\n\t"
  43961. "ldm %[a]!, {r4, r5}\n\t"
  43962. "ldm %[b]!, {r6, r7}\n\t"
  43963. "and r6, r6, %[m]\n\t"
  43964. "and r7, r7, %[m]\n\t"
  43965. "adcs r4, r4, r6\n\t"
  43966. "adcs r5, r5, r7\n\t"
  43967. "stm %[r]!, {r4, r5}\n\t"
  43968. "ldm %[a]!, {r4, r5}\n\t"
  43969. "ldm %[b]!, {r6, r7}\n\t"
  43970. "and r6, r6, %[m]\n\t"
  43971. "and r7, r7, %[m]\n\t"
  43972. "adcs r4, r4, r6\n\t"
  43973. "adcs r5, r5, r7\n\t"
  43974. "stm %[r]!, {r4, r5}\n\t"
  43975. "ldm %[a]!, {r4, r5}\n\t"
  43976. "ldm %[b]!, {r6, r7}\n\t"
  43977. "and r6, r6, %[m]\n\t"
  43978. "and r7, r7, %[m]\n\t"
  43979. "adcs r4, r4, r6\n\t"
  43980. "adcs r5, r5, r7\n\t"
  43981. "stm %[r]!, {r4, r5}\n\t"
  43982. "ldm %[a]!, {r4, r5}\n\t"
  43983. "ldm %[b]!, {r6, r7}\n\t"
  43984. "and r6, r6, %[m]\n\t"
  43985. "and r7, r7, %[m]\n\t"
  43986. "adcs r4, r4, r6\n\t"
  43987. "adcs r5, r5, r7\n\t"
  43988. "stm %[r]!, {r4, r5}\n\t"
  43989. "adc %[r], r8, r8\n\t"
  43990. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  43991. :
  43992. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  43993. );
  43994. return (uint32_t)(size_t)r;
  43995. }
  43996. #endif /* WOLFSSL_SP_SMALL */
  43997. /* RSA private key operation.
  43998. *
  43999. * in Array of bytes representing the number to exponentiate, base.
  44000. * inLen Number of bytes in base.
  44001. * dm Private exponent.
  44002. * pm First prime.
  44003. * qm Second prime.
  44004. * dpm First prime's CRT exponent.
  44005. * dqm Second prime's CRT exponent.
  44006. * qim Inverse of second prime mod p.
  44007. * mm Modulus.
  44008. * out Buffer to hold big-endian bytes of exponentiation result.
  44009. * Must be at least 384 bytes long.
  44010. * outLen Number of bytes in result.
  44011. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  44012. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  44013. */
  44014. int sp_RsaPrivate_3072(const byte* in, word32 inLen, const mp_int* dm,
  44015. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  44016. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  44017. {
  44018. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  44019. #ifdef WOLFSSL_SP_SMALL_STACK
  44020. sp_digit* d = NULL;
  44021. #else
  44022. sp_digit d[96 * 4];
  44023. #endif
  44024. sp_digit* a = NULL;
  44025. sp_digit* m = NULL;
  44026. sp_digit* r = NULL;
  44027. int err = MP_OKAY;
  44028. (void)pm;
  44029. (void)qm;
  44030. (void)dpm;
  44031. (void)dqm;
  44032. (void)qim;
  44033. if (*outLen < 384U) {
  44034. err = MP_TO_E;
  44035. }
  44036. if (err == MP_OKAY) {
  44037. if (mp_count_bits(dm) > 3072) {
  44038. err = MP_READ_E;
  44039. }
  44040. else if (inLen > 384) {
  44041. err = MP_READ_E;
  44042. }
  44043. else if (mp_count_bits(mm) != 3072) {
  44044. err = MP_READ_E;
  44045. }
  44046. else if (mp_iseven(mm)) {
  44047. err = MP_VAL;
  44048. }
  44049. }
  44050. #ifdef WOLFSSL_SP_SMALL_STACK
  44051. if (err == MP_OKAY) {
  44052. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL,
  44053. DYNAMIC_TYPE_RSA);
  44054. if (d == NULL)
  44055. err = MEMORY_E;
  44056. }
  44057. #endif
  44058. if (err == MP_OKAY) {
  44059. a = d + 96;
  44060. m = a + 192;
  44061. r = a;
  44062. sp_3072_from_bin(a, 96, in, inLen);
  44063. sp_3072_from_mp(d, 96, dm);
  44064. sp_3072_from_mp(m, 96, mm);
  44065. err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0);
  44066. }
  44067. if (err == MP_OKAY) {
  44068. sp_3072_to_bin_96(r, out);
  44069. *outLen = 384;
  44070. }
  44071. #ifdef WOLFSSL_SP_SMALL_STACK
  44072. if (d != NULL)
  44073. #endif
  44074. {
  44075. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  44076. if (a != NULL)
  44077. ForceZero(a, sizeof(sp_digit) * 96);
  44078. #ifdef WOLFSSL_SP_SMALL_STACK
  44079. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  44080. #endif
  44081. }
  44082. return err;
  44083. #else
  44084. #ifdef WOLFSSL_SP_SMALL_STACK
  44085. sp_digit* a = NULL;
  44086. #else
  44087. sp_digit a[48 * 11];
  44088. #endif
  44089. sp_digit* p = NULL;
  44090. sp_digit* q = NULL;
  44091. sp_digit* dp = NULL;
  44092. sp_digit* tmpa = NULL;
  44093. sp_digit* tmpb = NULL;
  44094. sp_digit* r = NULL;
  44095. sp_digit* qi = NULL;
  44096. sp_digit* dq = NULL;
  44097. sp_digit c;
  44098. int err = MP_OKAY;
  44099. (void)dm;
  44100. (void)mm;
  44101. if (*outLen < 384) {
  44102. err = MP_TO_E;
  44103. }
  44104. else if (inLen > 384 || mp_count_bits(mm) != 3072) {
  44105. err = MP_READ_E;
  44106. }
  44107. else if (mp_iseven(mm)) {
  44108. err = MP_VAL;
  44109. }
  44110. else if (mp_iseven(pm)) {
  44111. err = MP_VAL;
  44112. }
  44113. else if (mp_iseven(qm)) {
  44114. err = MP_VAL;
  44115. }
  44116. #ifdef WOLFSSL_SP_SMALL_STACK
  44117. if (err == MP_OKAY) {
  44118. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 11, NULL,
  44119. DYNAMIC_TYPE_RSA);
  44120. if (a == NULL)
  44121. err = MEMORY_E;
  44122. }
  44123. #endif
  44124. if (err == MP_OKAY) {
  44125. p = a + 96 * 2;
  44126. q = p + 48;
  44127. qi = dq = dp = q + 48;
  44128. tmpa = qi + 48;
  44129. tmpb = tmpa + 96;
  44130. r = a;
  44131. sp_3072_from_bin(a, 96, in, inLen);
  44132. sp_3072_from_mp(p, 48, pm);
  44133. sp_3072_from_mp(q, 48, qm);
  44134. sp_3072_from_mp(dp, 48, dpm);
  44135. err = sp_3072_mod_exp_48(tmpa, a, dp, 1536, p, 1);
  44136. }
  44137. if (err == MP_OKAY) {
  44138. sp_3072_from_mp(dq, 48, dqm);
  44139. err = sp_3072_mod_exp_48(tmpb, a, dq, 1536, q, 1);
  44140. }
  44141. if (err == MP_OKAY) {
  44142. c = sp_3072_sub_in_place_48(tmpa, tmpb);
  44143. c += sp_3072_cond_add_48(tmpa, tmpa, p, c);
  44144. sp_3072_cond_add_48(tmpa, tmpa, p, c);
  44145. sp_3072_from_mp(qi, 48, qim);
  44146. sp_3072_mul_48(tmpa, tmpa, qi);
  44147. err = sp_3072_mod_48(tmpa, tmpa, p);
  44148. }
  44149. if (err == MP_OKAY) {
  44150. sp_3072_mul_48(tmpa, q, tmpa);
  44151. XMEMSET(&tmpb[48], 0, sizeof(sp_digit) * 48);
  44152. sp_3072_add_96(r, tmpb, tmpa);
  44153. sp_3072_to_bin_96(r, out);
  44154. *outLen = 384;
  44155. }
  44156. #ifdef WOLFSSL_SP_SMALL_STACK
  44157. if (a != NULL)
  44158. #endif
  44159. {
  44160. ForceZero(a, sizeof(sp_digit) * 48 * 11);
  44161. #ifdef WOLFSSL_SP_SMALL_STACK
  44162. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  44163. #endif
  44164. }
  44165. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  44166. return err;
  44167. }
  44168. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  44169. #endif /* WOLFSSL_HAVE_SP_RSA */
  44170. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  44171. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  44172. /* Convert an array of sp_digit to an mp_int.
  44173. *
  44174. * a A single precision integer.
  44175. * r A multi-precision integer.
  44176. */
  44177. static int sp_3072_to_mp(const sp_digit* a, mp_int* r)
  44178. {
  44179. int err;
  44180. err = mp_grow(r, (3072 + DIGIT_BIT - 1) / DIGIT_BIT);
  44181. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  44182. #if DIGIT_BIT == 32
  44183. XMEMCPY(r->dp, a, sizeof(sp_digit) * 96);
  44184. r->used = 96;
  44185. mp_clamp(r);
  44186. #elif DIGIT_BIT < 32
  44187. int i;
  44188. int j = 0;
  44189. int s = 0;
  44190. r->dp[0] = 0;
  44191. for (i = 0; i < 96; i++) {
  44192. r->dp[j] |= (mp_digit)(a[i] << s);
  44193. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  44194. s = DIGIT_BIT - s;
  44195. r->dp[++j] = (mp_digit)(a[i] >> s);
  44196. while (s + DIGIT_BIT <= 32) {
  44197. s += DIGIT_BIT;
  44198. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  44199. if (s == SP_WORD_SIZE) {
  44200. r->dp[j] = 0;
  44201. }
  44202. else {
  44203. r->dp[j] = (mp_digit)(a[i] >> s);
  44204. }
  44205. }
  44206. s = 32 - s;
  44207. }
  44208. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  44209. mp_clamp(r);
  44210. #else
  44211. int i;
  44212. int j = 0;
  44213. int s = 0;
  44214. r->dp[0] = 0;
  44215. for (i = 0; i < 96; i++) {
  44216. r->dp[j] |= ((mp_digit)a[i]) << s;
  44217. if (s + 32 >= DIGIT_BIT) {
  44218. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  44219. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  44220. #endif
  44221. s = DIGIT_BIT - s;
  44222. r->dp[++j] = a[i] >> s;
  44223. s = 32 - s;
  44224. }
  44225. else {
  44226. s += 32;
  44227. }
  44228. }
  44229. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  44230. mp_clamp(r);
  44231. #endif
  44232. }
  44233. return err;
  44234. }
  44235. /* Perform the modular exponentiation for Diffie-Hellman.
  44236. *
  44237. * base Base. MP integer.
  44238. * exp Exponent. MP integer.
  44239. * mod Modulus. MP integer.
  44240. * res Result. MP integer.
  44241. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  44242. * and MEMORY_E if memory allocation fails.
  44243. */
  44244. int sp_ModExp_3072(const mp_int* base, const mp_int* exp, const mp_int* mod,
  44245. mp_int* res)
  44246. {
  44247. int err = MP_OKAY;
  44248. sp_digit b[192];
  44249. sp_digit e[96];
  44250. sp_digit m[96];
  44251. sp_digit* r = b;
  44252. int expBits = mp_count_bits(exp);
  44253. if (mp_count_bits(base) > 3072) {
  44254. err = MP_READ_E;
  44255. }
  44256. else if (expBits > 3072) {
  44257. err = MP_READ_E;
  44258. }
  44259. else if (mp_count_bits(mod) != 3072) {
  44260. err = MP_READ_E;
  44261. }
  44262. else if (mp_iseven(mod)) {
  44263. err = MP_VAL;
  44264. }
  44265. if (err == MP_OKAY) {
  44266. sp_3072_from_mp(b, 96, base);
  44267. sp_3072_from_mp(e, 96, exp);
  44268. sp_3072_from_mp(m, 96, mod);
  44269. err = sp_3072_mod_exp_96(r, b, e, expBits, m, 0);
  44270. }
  44271. if (err == MP_OKAY) {
  44272. err = sp_3072_to_mp(r, res);
  44273. }
  44274. XMEMSET(e, 0, sizeof(e));
  44275. return err;
  44276. }
  44277. #ifdef WOLFSSL_HAVE_SP_DH
  44278. #ifdef HAVE_FFDHE_3072
  44279. static void sp_3072_lshift_96(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  44280. {
  44281. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  44282. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  44283. register byte n asm ("r2") = (byte)n_p;
  44284. __asm__ __volatile__ (
  44285. "rsb r12, %[n], #31\n\t"
  44286. "ldr r5, [%[a], #380]\n\t"
  44287. "lsr r6, r5, #1\n\t"
  44288. "lsl r5, r5, %[n]\n\t"
  44289. "lsr r6, r6, r12\n\t"
  44290. "ldr r4, [%[a], #376]\n\t"
  44291. "str r6, [%[r], #384]\n\t"
  44292. "lsr r3, r4, #1\n\t"
  44293. "lsl r4, r4, %[n]\n\t"
  44294. "lsr r3, r3, r12\n\t"
  44295. "orr r5, r5, r3\n\t"
  44296. "ldr r6, [%[a], #372]\n\t"
  44297. "str r5, [%[r], #380]\n\t"
  44298. "lsr r3, r6, #1\n\t"
  44299. "lsl r6, r6, %[n]\n\t"
  44300. "lsr r3, r3, r12\n\t"
  44301. "orr r4, r4, r3\n\t"
  44302. "ldr r5, [%[a], #368]\n\t"
  44303. "str r4, [%[r], #376]\n\t"
  44304. "lsr r3, r5, #1\n\t"
  44305. "lsl r5, r5, %[n]\n\t"
  44306. "lsr r3, r3, r12\n\t"
  44307. "orr r6, r6, r3\n\t"
  44308. "ldr r4, [%[a], #364]\n\t"
  44309. "str r6, [%[r], #372]\n\t"
  44310. "lsr r3, r4, #1\n\t"
  44311. "lsl r4, r4, %[n]\n\t"
  44312. "lsr r3, r3, r12\n\t"
  44313. "orr r5, r5, r3\n\t"
  44314. "ldr r6, [%[a], #360]\n\t"
  44315. "str r5, [%[r], #368]\n\t"
  44316. "lsr r3, r6, #1\n\t"
  44317. "lsl r6, r6, %[n]\n\t"
  44318. "lsr r3, r3, r12\n\t"
  44319. "orr r4, r4, r3\n\t"
  44320. "ldr r5, [%[a], #356]\n\t"
  44321. "str r4, [%[r], #364]\n\t"
  44322. "lsr r3, r5, #1\n\t"
  44323. "lsl r5, r5, %[n]\n\t"
  44324. "lsr r3, r3, r12\n\t"
  44325. "orr r6, r6, r3\n\t"
  44326. "ldr r4, [%[a], #352]\n\t"
  44327. "str r6, [%[r], #360]\n\t"
  44328. "lsr r3, r4, #1\n\t"
  44329. "lsl r4, r4, %[n]\n\t"
  44330. "lsr r3, r3, r12\n\t"
  44331. "orr r5, r5, r3\n\t"
  44332. "ldr r6, [%[a], #348]\n\t"
  44333. "str r5, [%[r], #356]\n\t"
  44334. "lsr r3, r6, #1\n\t"
  44335. "lsl r6, r6, %[n]\n\t"
  44336. "lsr r3, r3, r12\n\t"
  44337. "orr r4, r4, r3\n\t"
  44338. "ldr r5, [%[a], #344]\n\t"
  44339. "str r4, [%[r], #352]\n\t"
  44340. "lsr r3, r5, #1\n\t"
  44341. "lsl r5, r5, %[n]\n\t"
  44342. "lsr r3, r3, r12\n\t"
  44343. "orr r6, r6, r3\n\t"
  44344. "ldr r4, [%[a], #340]\n\t"
  44345. "str r6, [%[r], #348]\n\t"
  44346. "lsr r3, r4, #1\n\t"
  44347. "lsl r4, r4, %[n]\n\t"
  44348. "lsr r3, r3, r12\n\t"
  44349. "orr r5, r5, r3\n\t"
  44350. "ldr r6, [%[a], #336]\n\t"
  44351. "str r5, [%[r], #344]\n\t"
  44352. "lsr r3, r6, #1\n\t"
  44353. "lsl r6, r6, %[n]\n\t"
  44354. "lsr r3, r3, r12\n\t"
  44355. "orr r4, r4, r3\n\t"
  44356. "ldr r5, [%[a], #332]\n\t"
  44357. "str r4, [%[r], #340]\n\t"
  44358. "lsr r3, r5, #1\n\t"
  44359. "lsl r5, r5, %[n]\n\t"
  44360. "lsr r3, r3, r12\n\t"
  44361. "orr r6, r6, r3\n\t"
  44362. "ldr r4, [%[a], #328]\n\t"
  44363. "str r6, [%[r], #336]\n\t"
  44364. "lsr r3, r4, #1\n\t"
  44365. "lsl r4, r4, %[n]\n\t"
  44366. "lsr r3, r3, r12\n\t"
  44367. "orr r5, r5, r3\n\t"
  44368. "ldr r6, [%[a], #324]\n\t"
  44369. "str r5, [%[r], #332]\n\t"
  44370. "lsr r3, r6, #1\n\t"
  44371. "lsl r6, r6, %[n]\n\t"
  44372. "lsr r3, r3, r12\n\t"
  44373. "orr r4, r4, r3\n\t"
  44374. "ldr r5, [%[a], #320]\n\t"
  44375. "str r4, [%[r], #328]\n\t"
  44376. "lsr r3, r5, #1\n\t"
  44377. "lsl r5, r5, %[n]\n\t"
  44378. "lsr r3, r3, r12\n\t"
  44379. "orr r6, r6, r3\n\t"
  44380. "ldr r4, [%[a], #316]\n\t"
  44381. "str r6, [%[r], #324]\n\t"
  44382. "lsr r3, r4, #1\n\t"
  44383. "lsl r4, r4, %[n]\n\t"
  44384. "lsr r3, r3, r12\n\t"
  44385. "orr r5, r5, r3\n\t"
  44386. "ldr r6, [%[a], #312]\n\t"
  44387. "str r5, [%[r], #320]\n\t"
  44388. "lsr r3, r6, #1\n\t"
  44389. "lsl r6, r6, %[n]\n\t"
  44390. "lsr r3, r3, r12\n\t"
  44391. "orr r4, r4, r3\n\t"
  44392. "ldr r5, [%[a], #308]\n\t"
  44393. "str r4, [%[r], #316]\n\t"
  44394. "lsr r3, r5, #1\n\t"
  44395. "lsl r5, r5, %[n]\n\t"
  44396. "lsr r3, r3, r12\n\t"
  44397. "orr r6, r6, r3\n\t"
  44398. "ldr r4, [%[a], #304]\n\t"
  44399. "str r6, [%[r], #312]\n\t"
  44400. "lsr r3, r4, #1\n\t"
  44401. "lsl r4, r4, %[n]\n\t"
  44402. "lsr r3, r3, r12\n\t"
  44403. "orr r5, r5, r3\n\t"
  44404. "ldr r6, [%[a], #300]\n\t"
  44405. "str r5, [%[r], #308]\n\t"
  44406. "lsr r3, r6, #1\n\t"
  44407. "lsl r6, r6, %[n]\n\t"
  44408. "lsr r3, r3, r12\n\t"
  44409. "orr r4, r4, r3\n\t"
  44410. "ldr r5, [%[a], #296]\n\t"
  44411. "str r4, [%[r], #304]\n\t"
  44412. "lsr r3, r5, #1\n\t"
  44413. "lsl r5, r5, %[n]\n\t"
  44414. "lsr r3, r3, r12\n\t"
  44415. "orr r6, r6, r3\n\t"
  44416. "ldr r4, [%[a], #292]\n\t"
  44417. "str r6, [%[r], #300]\n\t"
  44418. "lsr r3, r4, #1\n\t"
  44419. "lsl r4, r4, %[n]\n\t"
  44420. "lsr r3, r3, r12\n\t"
  44421. "orr r5, r5, r3\n\t"
  44422. "ldr r6, [%[a], #288]\n\t"
  44423. "str r5, [%[r], #296]\n\t"
  44424. "lsr r3, r6, #1\n\t"
  44425. "lsl r6, r6, %[n]\n\t"
  44426. "lsr r3, r3, r12\n\t"
  44427. "orr r4, r4, r3\n\t"
  44428. "ldr r5, [%[a], #284]\n\t"
  44429. "str r4, [%[r], #292]\n\t"
  44430. "lsr r3, r5, #1\n\t"
  44431. "lsl r5, r5, %[n]\n\t"
  44432. "lsr r3, r3, r12\n\t"
  44433. "orr r6, r6, r3\n\t"
  44434. "ldr r4, [%[a], #280]\n\t"
  44435. "str r6, [%[r], #288]\n\t"
  44436. "lsr r3, r4, #1\n\t"
  44437. "lsl r4, r4, %[n]\n\t"
  44438. "lsr r3, r3, r12\n\t"
  44439. "orr r5, r5, r3\n\t"
  44440. "ldr r6, [%[a], #276]\n\t"
  44441. "str r5, [%[r], #284]\n\t"
  44442. "lsr r3, r6, #1\n\t"
  44443. "lsl r6, r6, %[n]\n\t"
  44444. "lsr r3, r3, r12\n\t"
  44445. "orr r4, r4, r3\n\t"
  44446. "ldr r5, [%[a], #272]\n\t"
  44447. "str r4, [%[r], #280]\n\t"
  44448. "lsr r3, r5, #1\n\t"
  44449. "lsl r5, r5, %[n]\n\t"
  44450. "lsr r3, r3, r12\n\t"
  44451. "orr r6, r6, r3\n\t"
  44452. "ldr r4, [%[a], #268]\n\t"
  44453. "str r6, [%[r], #276]\n\t"
  44454. "lsr r3, r4, #1\n\t"
  44455. "lsl r4, r4, %[n]\n\t"
  44456. "lsr r3, r3, r12\n\t"
  44457. "orr r5, r5, r3\n\t"
  44458. "ldr r6, [%[a], #264]\n\t"
  44459. "str r5, [%[r], #272]\n\t"
  44460. "lsr r3, r6, #1\n\t"
  44461. "lsl r6, r6, %[n]\n\t"
  44462. "lsr r3, r3, r12\n\t"
  44463. "orr r4, r4, r3\n\t"
  44464. "ldr r5, [%[a], #260]\n\t"
  44465. "str r4, [%[r], #268]\n\t"
  44466. "lsr r3, r5, #1\n\t"
  44467. "lsl r5, r5, %[n]\n\t"
  44468. "lsr r3, r3, r12\n\t"
  44469. "orr r6, r6, r3\n\t"
  44470. "ldr r4, [%[a], #256]\n\t"
  44471. "str r6, [%[r], #264]\n\t"
  44472. "lsr r3, r4, #1\n\t"
  44473. "lsl r4, r4, %[n]\n\t"
  44474. "lsr r3, r3, r12\n\t"
  44475. "orr r5, r5, r3\n\t"
  44476. "ldr r6, [%[a], #252]\n\t"
  44477. "str r5, [%[r], #260]\n\t"
  44478. "lsr r3, r6, #1\n\t"
  44479. "lsl r6, r6, %[n]\n\t"
  44480. "lsr r3, r3, r12\n\t"
  44481. "orr r4, r4, r3\n\t"
  44482. "ldr r5, [%[a], #248]\n\t"
  44483. "str r4, [%[r], #256]\n\t"
  44484. "lsr r3, r5, #1\n\t"
  44485. "lsl r5, r5, %[n]\n\t"
  44486. "lsr r3, r3, r12\n\t"
  44487. "orr r6, r6, r3\n\t"
  44488. "ldr r4, [%[a], #244]\n\t"
  44489. "str r6, [%[r], #252]\n\t"
  44490. "lsr r3, r4, #1\n\t"
  44491. "lsl r4, r4, %[n]\n\t"
  44492. "lsr r3, r3, r12\n\t"
  44493. "orr r5, r5, r3\n\t"
  44494. "ldr r6, [%[a], #240]\n\t"
  44495. "str r5, [%[r], #248]\n\t"
  44496. "lsr r3, r6, #1\n\t"
  44497. "lsl r6, r6, %[n]\n\t"
  44498. "lsr r3, r3, r12\n\t"
  44499. "orr r4, r4, r3\n\t"
  44500. "ldr r5, [%[a], #236]\n\t"
  44501. "str r4, [%[r], #244]\n\t"
  44502. "lsr r3, r5, #1\n\t"
  44503. "lsl r5, r5, %[n]\n\t"
  44504. "lsr r3, r3, r12\n\t"
  44505. "orr r6, r6, r3\n\t"
  44506. "ldr r4, [%[a], #232]\n\t"
  44507. "str r6, [%[r], #240]\n\t"
  44508. "lsr r3, r4, #1\n\t"
  44509. "lsl r4, r4, %[n]\n\t"
  44510. "lsr r3, r3, r12\n\t"
  44511. "orr r5, r5, r3\n\t"
  44512. "ldr r6, [%[a], #228]\n\t"
  44513. "str r5, [%[r], #236]\n\t"
  44514. "lsr r3, r6, #1\n\t"
  44515. "lsl r6, r6, %[n]\n\t"
  44516. "lsr r3, r3, r12\n\t"
  44517. "orr r4, r4, r3\n\t"
  44518. "ldr r5, [%[a], #224]\n\t"
  44519. "str r4, [%[r], #232]\n\t"
  44520. "lsr r3, r5, #1\n\t"
  44521. "lsl r5, r5, %[n]\n\t"
  44522. "lsr r3, r3, r12\n\t"
  44523. "orr r6, r6, r3\n\t"
  44524. "ldr r4, [%[a], #220]\n\t"
  44525. "str r6, [%[r], #228]\n\t"
  44526. "lsr r3, r4, #1\n\t"
  44527. "lsl r4, r4, %[n]\n\t"
  44528. "lsr r3, r3, r12\n\t"
  44529. "orr r5, r5, r3\n\t"
  44530. "ldr r6, [%[a], #216]\n\t"
  44531. "str r5, [%[r], #224]\n\t"
  44532. "lsr r3, r6, #1\n\t"
  44533. "lsl r6, r6, %[n]\n\t"
  44534. "lsr r3, r3, r12\n\t"
  44535. "orr r4, r4, r3\n\t"
  44536. "ldr r5, [%[a], #212]\n\t"
  44537. "str r4, [%[r], #220]\n\t"
  44538. "lsr r3, r5, #1\n\t"
  44539. "lsl r5, r5, %[n]\n\t"
  44540. "lsr r3, r3, r12\n\t"
  44541. "orr r6, r6, r3\n\t"
  44542. "ldr r4, [%[a], #208]\n\t"
  44543. "str r6, [%[r], #216]\n\t"
  44544. "lsr r3, r4, #1\n\t"
  44545. "lsl r4, r4, %[n]\n\t"
  44546. "lsr r3, r3, r12\n\t"
  44547. "orr r5, r5, r3\n\t"
  44548. "ldr r6, [%[a], #204]\n\t"
  44549. "str r5, [%[r], #212]\n\t"
  44550. "lsr r3, r6, #1\n\t"
  44551. "lsl r6, r6, %[n]\n\t"
  44552. "lsr r3, r3, r12\n\t"
  44553. "orr r4, r4, r3\n\t"
  44554. "ldr r5, [%[a], #200]\n\t"
  44555. "str r4, [%[r], #208]\n\t"
  44556. "lsr r3, r5, #1\n\t"
  44557. "lsl r5, r5, %[n]\n\t"
  44558. "lsr r3, r3, r12\n\t"
  44559. "orr r6, r6, r3\n\t"
  44560. "ldr r4, [%[a], #196]\n\t"
  44561. "str r6, [%[r], #204]\n\t"
  44562. "lsr r3, r4, #1\n\t"
  44563. "lsl r4, r4, %[n]\n\t"
  44564. "lsr r3, r3, r12\n\t"
  44565. "orr r5, r5, r3\n\t"
  44566. "ldr r6, [%[a], #192]\n\t"
  44567. "str r5, [%[r], #200]\n\t"
  44568. "lsr r3, r6, #1\n\t"
  44569. "lsl r6, r6, %[n]\n\t"
  44570. "lsr r3, r3, r12\n\t"
  44571. "orr r4, r4, r3\n\t"
  44572. "ldr r5, [%[a], #188]\n\t"
  44573. "str r4, [%[r], #196]\n\t"
  44574. "lsr r3, r5, #1\n\t"
  44575. "lsl r5, r5, %[n]\n\t"
  44576. "lsr r3, r3, r12\n\t"
  44577. "orr r6, r6, r3\n\t"
  44578. "ldr r4, [%[a], #184]\n\t"
  44579. "str r6, [%[r], #192]\n\t"
  44580. "lsr r3, r4, #1\n\t"
  44581. "lsl r4, r4, %[n]\n\t"
  44582. "lsr r3, r3, r12\n\t"
  44583. "orr r5, r5, r3\n\t"
  44584. "ldr r6, [%[a], #180]\n\t"
  44585. "str r5, [%[r], #188]\n\t"
  44586. "lsr r3, r6, #1\n\t"
  44587. "lsl r6, r6, %[n]\n\t"
  44588. "lsr r3, r3, r12\n\t"
  44589. "orr r4, r4, r3\n\t"
  44590. "ldr r5, [%[a], #176]\n\t"
  44591. "str r4, [%[r], #184]\n\t"
  44592. "lsr r3, r5, #1\n\t"
  44593. "lsl r5, r5, %[n]\n\t"
  44594. "lsr r3, r3, r12\n\t"
  44595. "orr r6, r6, r3\n\t"
  44596. "ldr r4, [%[a], #172]\n\t"
  44597. "str r6, [%[r], #180]\n\t"
  44598. "lsr r3, r4, #1\n\t"
  44599. "lsl r4, r4, %[n]\n\t"
  44600. "lsr r3, r3, r12\n\t"
  44601. "orr r5, r5, r3\n\t"
  44602. "ldr r6, [%[a], #168]\n\t"
  44603. "str r5, [%[r], #176]\n\t"
  44604. "lsr r3, r6, #1\n\t"
  44605. "lsl r6, r6, %[n]\n\t"
  44606. "lsr r3, r3, r12\n\t"
  44607. "orr r4, r4, r3\n\t"
  44608. "ldr r5, [%[a], #164]\n\t"
  44609. "str r4, [%[r], #172]\n\t"
  44610. "lsr r3, r5, #1\n\t"
  44611. "lsl r5, r5, %[n]\n\t"
  44612. "lsr r3, r3, r12\n\t"
  44613. "orr r6, r6, r3\n\t"
  44614. "ldr r4, [%[a], #160]\n\t"
  44615. "str r6, [%[r], #168]\n\t"
  44616. "lsr r3, r4, #1\n\t"
  44617. "lsl r4, r4, %[n]\n\t"
  44618. "lsr r3, r3, r12\n\t"
  44619. "orr r5, r5, r3\n\t"
  44620. "ldr r6, [%[a], #156]\n\t"
  44621. "str r5, [%[r], #164]\n\t"
  44622. "lsr r3, r6, #1\n\t"
  44623. "lsl r6, r6, %[n]\n\t"
  44624. "lsr r3, r3, r12\n\t"
  44625. "orr r4, r4, r3\n\t"
  44626. "ldr r5, [%[a], #152]\n\t"
  44627. "str r4, [%[r], #160]\n\t"
  44628. "lsr r3, r5, #1\n\t"
  44629. "lsl r5, r5, %[n]\n\t"
  44630. "lsr r3, r3, r12\n\t"
  44631. "orr r6, r6, r3\n\t"
  44632. "ldr r4, [%[a], #148]\n\t"
  44633. "str r6, [%[r], #156]\n\t"
  44634. "lsr r3, r4, #1\n\t"
  44635. "lsl r4, r4, %[n]\n\t"
  44636. "lsr r3, r3, r12\n\t"
  44637. "orr r5, r5, r3\n\t"
  44638. "ldr r6, [%[a], #144]\n\t"
  44639. "str r5, [%[r], #152]\n\t"
  44640. "lsr r3, r6, #1\n\t"
  44641. "lsl r6, r6, %[n]\n\t"
  44642. "lsr r3, r3, r12\n\t"
  44643. "orr r4, r4, r3\n\t"
  44644. "ldr r5, [%[a], #140]\n\t"
  44645. "str r4, [%[r], #148]\n\t"
  44646. "lsr r3, r5, #1\n\t"
  44647. "lsl r5, r5, %[n]\n\t"
  44648. "lsr r3, r3, r12\n\t"
  44649. "orr r6, r6, r3\n\t"
  44650. "ldr r4, [%[a], #136]\n\t"
  44651. "str r6, [%[r], #144]\n\t"
  44652. "lsr r3, r4, #1\n\t"
  44653. "lsl r4, r4, %[n]\n\t"
  44654. "lsr r3, r3, r12\n\t"
  44655. "orr r5, r5, r3\n\t"
  44656. "ldr r6, [%[a], #132]\n\t"
  44657. "str r5, [%[r], #140]\n\t"
  44658. "lsr r3, r6, #1\n\t"
  44659. "lsl r6, r6, %[n]\n\t"
  44660. "lsr r3, r3, r12\n\t"
  44661. "orr r4, r4, r3\n\t"
  44662. "ldr r5, [%[a], #128]\n\t"
  44663. "str r4, [%[r], #136]\n\t"
  44664. "lsr r3, r5, #1\n\t"
  44665. "lsl r5, r5, %[n]\n\t"
  44666. "lsr r3, r3, r12\n\t"
  44667. "orr r6, r6, r3\n\t"
  44668. "ldr r4, [%[a], #124]\n\t"
  44669. "str r6, [%[r], #132]\n\t"
  44670. "lsr r3, r4, #1\n\t"
  44671. "lsl r4, r4, %[n]\n\t"
  44672. "lsr r3, r3, r12\n\t"
  44673. "orr r5, r5, r3\n\t"
  44674. "ldr r6, [%[a], #120]\n\t"
  44675. "str r5, [%[r], #128]\n\t"
  44676. "lsr r3, r6, #1\n\t"
  44677. "lsl r6, r6, %[n]\n\t"
  44678. "lsr r3, r3, r12\n\t"
  44679. "orr r4, r4, r3\n\t"
  44680. "ldr r5, [%[a], #116]\n\t"
  44681. "str r4, [%[r], #124]\n\t"
  44682. "lsr r3, r5, #1\n\t"
  44683. "lsl r5, r5, %[n]\n\t"
  44684. "lsr r3, r3, r12\n\t"
  44685. "orr r6, r6, r3\n\t"
  44686. "ldr r4, [%[a], #112]\n\t"
  44687. "str r6, [%[r], #120]\n\t"
  44688. "lsr r3, r4, #1\n\t"
  44689. "lsl r4, r4, %[n]\n\t"
  44690. "lsr r3, r3, r12\n\t"
  44691. "orr r5, r5, r3\n\t"
  44692. "ldr r6, [%[a], #108]\n\t"
  44693. "str r5, [%[r], #116]\n\t"
  44694. "lsr r3, r6, #1\n\t"
  44695. "lsl r6, r6, %[n]\n\t"
  44696. "lsr r3, r3, r12\n\t"
  44697. "orr r4, r4, r3\n\t"
  44698. "ldr r5, [%[a], #104]\n\t"
  44699. "str r4, [%[r], #112]\n\t"
  44700. "lsr r3, r5, #1\n\t"
  44701. "lsl r5, r5, %[n]\n\t"
  44702. "lsr r3, r3, r12\n\t"
  44703. "orr r6, r6, r3\n\t"
  44704. "ldr r4, [%[a], #100]\n\t"
  44705. "str r6, [%[r], #108]\n\t"
  44706. "lsr r3, r4, #1\n\t"
  44707. "lsl r4, r4, %[n]\n\t"
  44708. "lsr r3, r3, r12\n\t"
  44709. "orr r5, r5, r3\n\t"
  44710. "ldr r6, [%[a], #96]\n\t"
  44711. "str r5, [%[r], #104]\n\t"
  44712. "lsr r3, r6, #1\n\t"
  44713. "lsl r6, r6, %[n]\n\t"
  44714. "lsr r3, r3, r12\n\t"
  44715. "orr r4, r4, r3\n\t"
  44716. "ldr r5, [%[a], #92]\n\t"
  44717. "str r4, [%[r], #100]\n\t"
  44718. "lsr r3, r5, #1\n\t"
  44719. "lsl r5, r5, %[n]\n\t"
  44720. "lsr r3, r3, r12\n\t"
  44721. "orr r6, r6, r3\n\t"
  44722. "ldr r4, [%[a], #88]\n\t"
  44723. "str r6, [%[r], #96]\n\t"
  44724. "lsr r3, r4, #1\n\t"
  44725. "lsl r4, r4, %[n]\n\t"
  44726. "lsr r3, r3, r12\n\t"
  44727. "orr r5, r5, r3\n\t"
  44728. "ldr r6, [%[a], #84]\n\t"
  44729. "str r5, [%[r], #92]\n\t"
  44730. "lsr r3, r6, #1\n\t"
  44731. "lsl r6, r6, %[n]\n\t"
  44732. "lsr r3, r3, r12\n\t"
  44733. "orr r4, r4, r3\n\t"
  44734. "ldr r5, [%[a], #80]\n\t"
  44735. "str r4, [%[r], #88]\n\t"
  44736. "lsr r3, r5, #1\n\t"
  44737. "lsl r5, r5, %[n]\n\t"
  44738. "lsr r3, r3, r12\n\t"
  44739. "orr r6, r6, r3\n\t"
  44740. "ldr r4, [%[a], #76]\n\t"
  44741. "str r6, [%[r], #84]\n\t"
  44742. "lsr r3, r4, #1\n\t"
  44743. "lsl r4, r4, %[n]\n\t"
  44744. "lsr r3, r3, r12\n\t"
  44745. "orr r5, r5, r3\n\t"
  44746. "ldr r6, [%[a], #72]\n\t"
  44747. "str r5, [%[r], #80]\n\t"
  44748. "lsr r3, r6, #1\n\t"
  44749. "lsl r6, r6, %[n]\n\t"
  44750. "lsr r3, r3, r12\n\t"
  44751. "orr r4, r4, r3\n\t"
  44752. "ldr r5, [%[a], #68]\n\t"
  44753. "str r4, [%[r], #76]\n\t"
  44754. "lsr r3, r5, #1\n\t"
  44755. "lsl r5, r5, %[n]\n\t"
  44756. "lsr r3, r3, r12\n\t"
  44757. "orr r6, r6, r3\n\t"
  44758. "ldr r4, [%[a], #64]\n\t"
  44759. "str r6, [%[r], #72]\n\t"
  44760. "lsr r3, r4, #1\n\t"
  44761. "lsl r4, r4, %[n]\n\t"
  44762. "lsr r3, r3, r12\n\t"
  44763. "orr r5, r5, r3\n\t"
  44764. "ldr r6, [%[a], #60]\n\t"
  44765. "str r5, [%[r], #68]\n\t"
  44766. "lsr r3, r6, #1\n\t"
  44767. "lsl r6, r6, %[n]\n\t"
  44768. "lsr r3, r3, r12\n\t"
  44769. "orr r4, r4, r3\n\t"
  44770. "ldr r5, [%[a], #56]\n\t"
  44771. "str r4, [%[r], #64]\n\t"
  44772. "lsr r3, r5, #1\n\t"
  44773. "lsl r5, r5, %[n]\n\t"
  44774. "lsr r3, r3, r12\n\t"
  44775. "orr r6, r6, r3\n\t"
  44776. "ldr r4, [%[a], #52]\n\t"
  44777. "str r6, [%[r], #60]\n\t"
  44778. "lsr r3, r4, #1\n\t"
  44779. "lsl r4, r4, %[n]\n\t"
  44780. "lsr r3, r3, r12\n\t"
  44781. "orr r5, r5, r3\n\t"
  44782. "ldr r6, [%[a], #48]\n\t"
  44783. "str r5, [%[r], #56]\n\t"
  44784. "lsr r3, r6, #1\n\t"
  44785. "lsl r6, r6, %[n]\n\t"
  44786. "lsr r3, r3, r12\n\t"
  44787. "orr r4, r4, r3\n\t"
  44788. "ldr r5, [%[a], #44]\n\t"
  44789. "str r4, [%[r], #52]\n\t"
  44790. "lsr r3, r5, #1\n\t"
  44791. "lsl r5, r5, %[n]\n\t"
  44792. "lsr r3, r3, r12\n\t"
  44793. "orr r6, r6, r3\n\t"
  44794. "ldr r4, [%[a], #40]\n\t"
  44795. "str r6, [%[r], #48]\n\t"
  44796. "lsr r3, r4, #1\n\t"
  44797. "lsl r4, r4, %[n]\n\t"
  44798. "lsr r3, r3, r12\n\t"
  44799. "orr r5, r5, r3\n\t"
  44800. "ldr r6, [%[a], #36]\n\t"
  44801. "str r5, [%[r], #44]\n\t"
  44802. "lsr r3, r6, #1\n\t"
  44803. "lsl r6, r6, %[n]\n\t"
  44804. "lsr r3, r3, r12\n\t"
  44805. "orr r4, r4, r3\n\t"
  44806. "ldr r5, [%[a], #32]\n\t"
  44807. "str r4, [%[r], #40]\n\t"
  44808. "lsr r3, r5, #1\n\t"
  44809. "lsl r5, r5, %[n]\n\t"
  44810. "lsr r3, r3, r12\n\t"
  44811. "orr r6, r6, r3\n\t"
  44812. "ldr r4, [%[a], #28]\n\t"
  44813. "str r6, [%[r], #36]\n\t"
  44814. "lsr r3, r4, #1\n\t"
  44815. "lsl r4, r4, %[n]\n\t"
  44816. "lsr r3, r3, r12\n\t"
  44817. "orr r5, r5, r3\n\t"
  44818. "ldr r6, [%[a], #24]\n\t"
  44819. "str r5, [%[r], #32]\n\t"
  44820. "lsr r3, r6, #1\n\t"
  44821. "lsl r6, r6, %[n]\n\t"
  44822. "lsr r3, r3, r12\n\t"
  44823. "orr r4, r4, r3\n\t"
  44824. "ldr r5, [%[a], #20]\n\t"
  44825. "str r4, [%[r], #28]\n\t"
  44826. "lsr r3, r5, #1\n\t"
  44827. "lsl r5, r5, %[n]\n\t"
  44828. "lsr r3, r3, r12\n\t"
  44829. "orr r6, r6, r3\n\t"
  44830. "ldr r4, [%[a], #16]\n\t"
  44831. "str r6, [%[r], #24]\n\t"
  44832. "lsr r3, r4, #1\n\t"
  44833. "lsl r4, r4, %[n]\n\t"
  44834. "lsr r3, r3, r12\n\t"
  44835. "orr r5, r5, r3\n\t"
  44836. "ldr r6, [%[a], #12]\n\t"
  44837. "str r5, [%[r], #20]\n\t"
  44838. "lsr r3, r6, #1\n\t"
  44839. "lsl r6, r6, %[n]\n\t"
  44840. "lsr r3, r3, r12\n\t"
  44841. "orr r4, r4, r3\n\t"
  44842. "ldr r5, [%[a], #8]\n\t"
  44843. "str r4, [%[r], #16]\n\t"
  44844. "lsr r3, r5, #1\n\t"
  44845. "lsl r5, r5, %[n]\n\t"
  44846. "lsr r3, r3, r12\n\t"
  44847. "orr r6, r6, r3\n\t"
  44848. "ldr r4, [%[a], #4]\n\t"
  44849. "str r6, [%[r], #12]\n\t"
  44850. "lsr r3, r4, #1\n\t"
  44851. "lsl r4, r4, %[n]\n\t"
  44852. "lsr r3, r3, r12\n\t"
  44853. "orr r5, r5, r3\n\t"
  44854. "ldr r6, [%[a]]\n\t"
  44855. "str r5, [%[r], #8]\n\t"
  44856. "lsr r3, r6, #1\n\t"
  44857. "lsl r6, r6, %[n]\n\t"
  44858. "lsr r3, r3, r12\n\t"
  44859. "orr r4, r4, r3\n\t"
  44860. "str r6, [%[r]]\n\t"
  44861. "str r4, [%[r], #4]\n\t"
  44862. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  44863. :
  44864. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  44865. );
  44866. }
  44867. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  44868. *
  44869. * r A single precision number that is the result of the operation.
  44870. * e A single precision number that is the exponent.
  44871. * bits The number of bits in the exponent.
  44872. * m A single precision number that is the modulus.
  44873. * returns 0 on success.
  44874. * returns MEMORY_E on dynamic memory allocation failure.
  44875. * returns MP_VAL when base is even.
  44876. */
  44877. static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits,
  44878. const sp_digit* m)
  44879. {
  44880. #ifdef WOLFSSL_SP_SMALL_STACK
  44881. sp_digit* td = NULL;
  44882. #else
  44883. sp_digit td[289];
  44884. #endif
  44885. sp_digit* norm = NULL;
  44886. sp_digit* tmp = NULL;
  44887. sp_digit mp = 1;
  44888. sp_digit n;
  44889. sp_digit o;
  44890. sp_digit mask;
  44891. int i;
  44892. int c;
  44893. byte y;
  44894. int err = MP_OKAY;
  44895. if (bits == 0) {
  44896. err = MP_VAL;
  44897. }
  44898. #ifdef WOLFSSL_SP_SMALL_STACK
  44899. if (err == MP_OKAY) {
  44900. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 289, NULL,
  44901. DYNAMIC_TYPE_TMP_BUFFER);
  44902. if (td == NULL)
  44903. err = MEMORY_E;
  44904. }
  44905. #endif
  44906. if (err == MP_OKAY) {
  44907. norm = td;
  44908. tmp = td + 192;
  44909. sp_3072_mont_setup(m, &mp);
  44910. sp_3072_mont_norm_96(norm, m);
  44911. i = (bits - 1) / 32;
  44912. n = e[i--];
  44913. c = bits & 31;
  44914. if (c == 0) {
  44915. c = 32;
  44916. }
  44917. c -= bits % 5;
  44918. if (c == 32) {
  44919. c = 27;
  44920. }
  44921. if (c < 0) {
  44922. /* Number of bits in top word is less than number needed. */
  44923. c = -c;
  44924. y = (byte)(n << c);
  44925. n = e[i--];
  44926. y |= (byte)(n >> (64 - c));
  44927. n <<= c;
  44928. c = 64 - c;
  44929. }
  44930. else if (c == 0) {
  44931. /* All bits in top word used. */
  44932. y = (byte)n;
  44933. }
  44934. else {
  44935. y = (byte)(n >> c);
  44936. n <<= 32 - c;
  44937. }
  44938. sp_3072_lshift_96(r, norm, y);
  44939. for (; i>=0 || c>=5; ) {
  44940. if (c == 0) {
  44941. n = e[i--];
  44942. y = (byte)(n >> 27);
  44943. n <<= 5;
  44944. c = 27;
  44945. }
  44946. else if (c < 5) {
  44947. y = (byte)(n >> 27);
  44948. n = e[i--];
  44949. c = 5 - c;
  44950. y |= (byte)(n >> (32 - c));
  44951. n <<= c;
  44952. c = 32 - c;
  44953. }
  44954. else {
  44955. y = (byte)((n >> 27) & 0x1f);
  44956. n <<= 5;
  44957. c -= 5;
  44958. }
  44959. sp_3072_mont_sqr_96(r, r, m, mp);
  44960. sp_3072_mont_sqr_96(r, r, m, mp);
  44961. sp_3072_mont_sqr_96(r, r, m, mp);
  44962. sp_3072_mont_sqr_96(r, r, m, mp);
  44963. sp_3072_mont_sqr_96(r, r, m, mp);
  44964. sp_3072_lshift_96(r, r, y);
  44965. sp_3072_mul_d_96(tmp, norm, r[96]);
  44966. r[96] = 0;
  44967. o = sp_3072_add_96(r, r, tmp);
  44968. sp_3072_cond_sub_96(r, r, m, (sp_digit)0 - o);
  44969. }
  44970. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  44971. sp_3072_mont_reduce_96(r, m, mp);
  44972. mask = (sp_digit)0 - (sp_3072_cmp_96(r, m) >= 0);
  44973. sp_3072_cond_sub_96(r, r, m, mask);
  44974. }
  44975. #ifdef WOLFSSL_SP_SMALL_STACK
  44976. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44977. #endif
  44978. return err;
  44979. }
  44980. #endif /* HAVE_FFDHE_3072 */
  44981. /* Perform the modular exponentiation for Diffie-Hellman.
  44982. *
  44983. * base Base.
  44984. * exp Array of bytes that is the exponent.
  44985. * expLen Length of data, in bytes, in exponent.
  44986. * mod Modulus.
  44987. * out Buffer to hold big-endian bytes of exponentiation result.
  44988. * Must be at least 384 bytes long.
  44989. * outLen Length, in bytes, of exponentiation result.
  44990. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  44991. * and MEMORY_E if memory allocation fails.
  44992. */
  44993. int sp_DhExp_3072(const mp_int* base, const byte* exp, word32 expLen,
  44994. const mp_int* mod, byte* out, word32* outLen)
  44995. {
  44996. int err = MP_OKAY;
  44997. sp_digit b[192];
  44998. sp_digit e[96];
  44999. sp_digit m[96];
  45000. sp_digit* r = b;
  45001. word32 i;
  45002. if (mp_count_bits(base) > 3072) {
  45003. err = MP_READ_E;
  45004. }
  45005. else if (expLen > 384) {
  45006. err = MP_READ_E;
  45007. }
  45008. else if (mp_count_bits(mod) != 3072) {
  45009. err = MP_READ_E;
  45010. }
  45011. else if (mp_iseven(mod)) {
  45012. err = MP_VAL;
  45013. }
  45014. if (err == MP_OKAY) {
  45015. sp_3072_from_mp(b, 96, base);
  45016. sp_3072_from_bin(e, 96, exp, expLen);
  45017. sp_3072_from_mp(m, 96, mod);
  45018. #ifdef HAVE_FFDHE_3072
  45019. if (base->used == 1 && base->dp[0] == 2 && m[95] == (sp_digit)-1)
  45020. err = sp_3072_mod_exp_2_96(r, e, expLen * 8, m);
  45021. else
  45022. #endif
  45023. err = sp_3072_mod_exp_96(r, b, e, expLen * 8, m, 0);
  45024. }
  45025. if (err == MP_OKAY) {
  45026. sp_3072_to_bin_96(r, out);
  45027. *outLen = 384;
  45028. for (i=0; i<384 && out[i] == 0; i++) {
  45029. /* Search for first non-zero. */
  45030. }
  45031. *outLen -= i;
  45032. XMEMMOVE(out, out + i, *outLen);
  45033. }
  45034. XMEMSET(e, 0, sizeof(e));
  45035. return err;
  45036. }
  45037. #endif /* WOLFSSL_HAVE_SP_DH */
  45038. /* Perform the modular exponentiation for Diffie-Hellman.
  45039. *
  45040. * base Base. MP integer.
  45041. * exp Exponent. MP integer.
  45042. * mod Modulus. MP integer.
  45043. * res Result. MP integer.
  45044. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  45045. * and MEMORY_E if memory allocation fails.
  45046. */
  45047. int sp_ModExp_1536(const mp_int* base, const mp_int* exp, const mp_int* mod,
  45048. mp_int* res)
  45049. {
  45050. int err = MP_OKAY;
  45051. sp_digit b[96];
  45052. sp_digit e[48];
  45053. sp_digit m[48];
  45054. sp_digit* r = b;
  45055. int expBits = mp_count_bits(exp);
  45056. if (mp_count_bits(base) > 1536) {
  45057. err = MP_READ_E;
  45058. }
  45059. else if (expBits > 1536) {
  45060. err = MP_READ_E;
  45061. }
  45062. else if (mp_count_bits(mod) != 1536) {
  45063. err = MP_READ_E;
  45064. }
  45065. else if (mp_iseven(mod)) {
  45066. err = MP_VAL;
  45067. }
  45068. if (err == MP_OKAY) {
  45069. sp_3072_from_mp(b, 48, base);
  45070. sp_3072_from_mp(e, 48, exp);
  45071. sp_3072_from_mp(m, 48, mod);
  45072. err = sp_3072_mod_exp_48(r, b, e, expBits, m, 0);
  45073. }
  45074. if (err == MP_OKAY) {
  45075. XMEMSET(r + 48, 0, sizeof(*r) * 48U);
  45076. err = sp_3072_to_mp(r, res);
  45077. res->used = mod->used;
  45078. mp_clamp(res);
  45079. }
  45080. XMEMSET(e, 0, sizeof(e));
  45081. return err;
  45082. }
  45083. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  45084. #endif /* !WOLFSSL_SP_NO_3072 */
  45085. #ifdef WOLFSSL_SP_4096
  45086. /* Read big endian unsigned byte array into r.
  45087. *
  45088. * r A single precision integer.
  45089. * size Maximum number of bytes to convert
  45090. * a Byte array.
  45091. * n Number of bytes in array to read.
  45092. */
  45093. static void sp_4096_from_bin(sp_digit* r, int size, const byte* a, int n)
  45094. {
  45095. int i;
  45096. int j;
  45097. byte* d;
  45098. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  45099. r[j] = ((sp_digit)a[i - 0] << 0) |
  45100. ((sp_digit)a[i - 1] << 8) |
  45101. ((sp_digit)a[i - 2] << 16) |
  45102. ((sp_digit)a[i - 3] << 24);
  45103. j++;
  45104. }
  45105. if (i >= 0) {
  45106. r[j] = 0;
  45107. d = (byte*)r;
  45108. switch (i) {
  45109. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  45110. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  45111. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  45112. }
  45113. j++;
  45114. }
  45115. for (; j < size; j++) {
  45116. r[j] = 0;
  45117. }
  45118. }
  45119. /* Convert an mp_int to an array of sp_digit.
  45120. *
  45121. * r A single precision integer.
  45122. * size Maximum number of bytes to convert
  45123. * a A multi-precision integer.
  45124. */
  45125. static void sp_4096_from_mp(sp_digit* r, int size, const mp_int* a)
  45126. {
  45127. #if DIGIT_BIT == 32
  45128. int i;
  45129. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  45130. int o = 0;
  45131. for (i = 0; i < size; i++) {
  45132. sp_digit mask = (sp_digit)0 - (j >> 31);
  45133. r[i] = a->dp[o] & mask;
  45134. j++;
  45135. o += (int)(j >> 31);
  45136. }
  45137. #elif DIGIT_BIT > 32
  45138. unsigned int i;
  45139. int j = 0;
  45140. word32 s = 0;
  45141. r[0] = 0;
  45142. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  45143. r[j] |= ((sp_digit)a->dp[i] << s);
  45144. r[j] &= 0xffffffff;
  45145. s = 32U - s;
  45146. if (j + 1 >= size) {
  45147. break;
  45148. }
  45149. /* lint allow cast of mismatch word32 and mp_digit */
  45150. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  45151. while ((s + 32U) <= (word32)DIGIT_BIT) {
  45152. s += 32U;
  45153. r[j] &= 0xffffffff;
  45154. if (j + 1 >= size) {
  45155. break;
  45156. }
  45157. if (s < (word32)DIGIT_BIT) {
  45158. /* lint allow cast of mismatch word32 and mp_digit */
  45159. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  45160. }
  45161. else {
  45162. r[++j] = (sp_digit)0;
  45163. }
  45164. }
  45165. s = (word32)DIGIT_BIT - s;
  45166. }
  45167. for (j++; j < size; j++) {
  45168. r[j] = 0;
  45169. }
  45170. #else
  45171. unsigned int i;
  45172. int j = 0;
  45173. int s = 0;
  45174. r[0] = 0;
  45175. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  45176. r[j] |= ((sp_digit)a->dp[i]) << s;
  45177. if (s + DIGIT_BIT >= 32) {
  45178. r[j] &= 0xffffffff;
  45179. if (j + 1 >= size) {
  45180. break;
  45181. }
  45182. s = 32 - s;
  45183. if (s == DIGIT_BIT) {
  45184. r[++j] = 0;
  45185. s = 0;
  45186. }
  45187. else {
  45188. r[++j] = a->dp[i] >> s;
  45189. s = DIGIT_BIT - s;
  45190. }
  45191. }
  45192. else {
  45193. s += DIGIT_BIT;
  45194. }
  45195. }
  45196. for (j++; j < size; j++) {
  45197. r[j] = 0;
  45198. }
  45199. #endif
  45200. }
  45201. /* Write r as big endian to byte array.
  45202. * Fixed length number of bytes written: 512
  45203. *
  45204. * r A single precision integer.
  45205. * a Byte array.
  45206. */
  45207. static void sp_4096_to_bin_128(sp_digit* r, byte* a)
  45208. {
  45209. int i;
  45210. int j = 0;
  45211. for (i = 127; i >= 0; i--) {
  45212. a[j++] = r[i] >> 24;
  45213. a[j++] = r[i] >> 16;
  45214. a[j++] = r[i] >> 8;
  45215. a[j++] = r[i] >> 0;
  45216. }
  45217. }
  45218. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  45219. /* Normalize the values in each word to 32.
  45220. *
  45221. * a Array of sp_digit to normalize.
  45222. */
  45223. #define sp_4096_norm_128(a)
  45224. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  45225. /* Normalize the values in each word to 32.
  45226. *
  45227. * a Array of sp_digit to normalize.
  45228. */
  45229. #define sp_4096_norm_128(a)
  45230. #ifndef WOLFSSL_SP_SMALL
  45231. /* Sub b from a into a. (a -= b)
  45232. *
  45233. * a A single precision integer and result.
  45234. * b A single precision integer.
  45235. */
  45236. static sp_digit sp_4096_sub_in_place_128(sp_digit* a_p, const sp_digit* b_p)
  45237. {
  45238. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  45239. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  45240. __asm__ __volatile__ (
  45241. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45242. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45243. "subs r2, r2, r6\n\t"
  45244. "sbcs r3, r3, r7\n\t"
  45245. "sbcs r4, r4, r8\n\t"
  45246. "sbcs r5, r5, r9\n\t"
  45247. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45248. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45249. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45250. "sbcs r2, r2, r6\n\t"
  45251. "sbcs r3, r3, r7\n\t"
  45252. "sbcs r4, r4, r8\n\t"
  45253. "sbcs r5, r5, r9\n\t"
  45254. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45255. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45256. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45257. "sbcs r2, r2, r6\n\t"
  45258. "sbcs r3, r3, r7\n\t"
  45259. "sbcs r4, r4, r8\n\t"
  45260. "sbcs r5, r5, r9\n\t"
  45261. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45262. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45263. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45264. "sbcs r2, r2, r6\n\t"
  45265. "sbcs r3, r3, r7\n\t"
  45266. "sbcs r4, r4, r8\n\t"
  45267. "sbcs r5, r5, r9\n\t"
  45268. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45269. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45270. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45271. "sbcs r2, r2, r6\n\t"
  45272. "sbcs r3, r3, r7\n\t"
  45273. "sbcs r4, r4, r8\n\t"
  45274. "sbcs r5, r5, r9\n\t"
  45275. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45276. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45277. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45278. "sbcs r2, r2, r6\n\t"
  45279. "sbcs r3, r3, r7\n\t"
  45280. "sbcs r4, r4, r8\n\t"
  45281. "sbcs r5, r5, r9\n\t"
  45282. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45283. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45284. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45285. "sbcs r2, r2, r6\n\t"
  45286. "sbcs r3, r3, r7\n\t"
  45287. "sbcs r4, r4, r8\n\t"
  45288. "sbcs r5, r5, r9\n\t"
  45289. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45290. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45291. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45292. "sbcs r2, r2, r6\n\t"
  45293. "sbcs r3, r3, r7\n\t"
  45294. "sbcs r4, r4, r8\n\t"
  45295. "sbcs r5, r5, r9\n\t"
  45296. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45297. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45298. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45299. "sbcs r2, r2, r6\n\t"
  45300. "sbcs r3, r3, r7\n\t"
  45301. "sbcs r4, r4, r8\n\t"
  45302. "sbcs r5, r5, r9\n\t"
  45303. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45304. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45305. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45306. "sbcs r2, r2, r6\n\t"
  45307. "sbcs r3, r3, r7\n\t"
  45308. "sbcs r4, r4, r8\n\t"
  45309. "sbcs r5, r5, r9\n\t"
  45310. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45311. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45312. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45313. "sbcs r2, r2, r6\n\t"
  45314. "sbcs r3, r3, r7\n\t"
  45315. "sbcs r4, r4, r8\n\t"
  45316. "sbcs r5, r5, r9\n\t"
  45317. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45318. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45319. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45320. "sbcs r2, r2, r6\n\t"
  45321. "sbcs r3, r3, r7\n\t"
  45322. "sbcs r4, r4, r8\n\t"
  45323. "sbcs r5, r5, r9\n\t"
  45324. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45325. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45326. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45327. "sbcs r2, r2, r6\n\t"
  45328. "sbcs r3, r3, r7\n\t"
  45329. "sbcs r4, r4, r8\n\t"
  45330. "sbcs r5, r5, r9\n\t"
  45331. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45332. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45333. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45334. "sbcs r2, r2, r6\n\t"
  45335. "sbcs r3, r3, r7\n\t"
  45336. "sbcs r4, r4, r8\n\t"
  45337. "sbcs r5, r5, r9\n\t"
  45338. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45339. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45340. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45341. "sbcs r2, r2, r6\n\t"
  45342. "sbcs r3, r3, r7\n\t"
  45343. "sbcs r4, r4, r8\n\t"
  45344. "sbcs r5, r5, r9\n\t"
  45345. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45346. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45347. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45348. "sbcs r2, r2, r6\n\t"
  45349. "sbcs r3, r3, r7\n\t"
  45350. "sbcs r4, r4, r8\n\t"
  45351. "sbcs r5, r5, r9\n\t"
  45352. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45353. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45354. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45355. "sbcs r2, r2, r6\n\t"
  45356. "sbcs r3, r3, r7\n\t"
  45357. "sbcs r4, r4, r8\n\t"
  45358. "sbcs r5, r5, r9\n\t"
  45359. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45360. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45361. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45362. "sbcs r2, r2, r6\n\t"
  45363. "sbcs r3, r3, r7\n\t"
  45364. "sbcs r4, r4, r8\n\t"
  45365. "sbcs r5, r5, r9\n\t"
  45366. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45367. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45368. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45369. "sbcs r2, r2, r6\n\t"
  45370. "sbcs r3, r3, r7\n\t"
  45371. "sbcs r4, r4, r8\n\t"
  45372. "sbcs r5, r5, r9\n\t"
  45373. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45374. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45375. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45376. "sbcs r2, r2, r6\n\t"
  45377. "sbcs r3, r3, r7\n\t"
  45378. "sbcs r4, r4, r8\n\t"
  45379. "sbcs r5, r5, r9\n\t"
  45380. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45381. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45382. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45383. "sbcs r2, r2, r6\n\t"
  45384. "sbcs r3, r3, r7\n\t"
  45385. "sbcs r4, r4, r8\n\t"
  45386. "sbcs r5, r5, r9\n\t"
  45387. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45388. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45389. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45390. "sbcs r2, r2, r6\n\t"
  45391. "sbcs r3, r3, r7\n\t"
  45392. "sbcs r4, r4, r8\n\t"
  45393. "sbcs r5, r5, r9\n\t"
  45394. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45395. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45396. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45397. "sbcs r2, r2, r6\n\t"
  45398. "sbcs r3, r3, r7\n\t"
  45399. "sbcs r4, r4, r8\n\t"
  45400. "sbcs r5, r5, r9\n\t"
  45401. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45402. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45403. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45404. "sbcs r2, r2, r6\n\t"
  45405. "sbcs r3, r3, r7\n\t"
  45406. "sbcs r4, r4, r8\n\t"
  45407. "sbcs r5, r5, r9\n\t"
  45408. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45409. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45410. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45411. "sbcs r2, r2, r6\n\t"
  45412. "sbcs r3, r3, r7\n\t"
  45413. "sbcs r4, r4, r8\n\t"
  45414. "sbcs r5, r5, r9\n\t"
  45415. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45416. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45417. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45418. "sbcs r2, r2, r6\n\t"
  45419. "sbcs r3, r3, r7\n\t"
  45420. "sbcs r4, r4, r8\n\t"
  45421. "sbcs r5, r5, r9\n\t"
  45422. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45423. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45424. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45425. "sbcs r2, r2, r6\n\t"
  45426. "sbcs r3, r3, r7\n\t"
  45427. "sbcs r4, r4, r8\n\t"
  45428. "sbcs r5, r5, r9\n\t"
  45429. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45430. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45431. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45432. "sbcs r2, r2, r6\n\t"
  45433. "sbcs r3, r3, r7\n\t"
  45434. "sbcs r4, r4, r8\n\t"
  45435. "sbcs r5, r5, r9\n\t"
  45436. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45437. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45438. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45439. "sbcs r2, r2, r6\n\t"
  45440. "sbcs r3, r3, r7\n\t"
  45441. "sbcs r4, r4, r8\n\t"
  45442. "sbcs r5, r5, r9\n\t"
  45443. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45444. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45445. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45446. "sbcs r2, r2, r6\n\t"
  45447. "sbcs r3, r3, r7\n\t"
  45448. "sbcs r4, r4, r8\n\t"
  45449. "sbcs r5, r5, r9\n\t"
  45450. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45451. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45452. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45453. "sbcs r2, r2, r6\n\t"
  45454. "sbcs r3, r3, r7\n\t"
  45455. "sbcs r4, r4, r8\n\t"
  45456. "sbcs r5, r5, r9\n\t"
  45457. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45458. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45459. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45460. "sbcs r2, r2, r6\n\t"
  45461. "sbcs r3, r3, r7\n\t"
  45462. "sbcs r4, r4, r8\n\t"
  45463. "sbcs r5, r5, r9\n\t"
  45464. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45465. "sbc %[a], r9, r9\n\t"
  45466. : [a] "+r" (a), [b] "+r" (b)
  45467. :
  45468. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  45469. );
  45470. return (uint32_t)(size_t)a;
  45471. }
  45472. /* Add b to a into r. (r = a + b)
  45473. *
  45474. * r A single precision integer.
  45475. * a A single precision integer.
  45476. * b A single precision integer.
  45477. */
  45478. static sp_digit sp_4096_add_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  45479. {
  45480. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  45481. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  45482. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  45483. __asm__ __volatile__ (
  45484. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45485. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45486. "adds r3, r3, r7\n\t"
  45487. "adcs r4, r4, r8\n\t"
  45488. "adcs r5, r5, r9\n\t"
  45489. "adcs r6, r6, r10\n\t"
  45490. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45491. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45492. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45493. "adcs r3, r3, r7\n\t"
  45494. "adcs r4, r4, r8\n\t"
  45495. "adcs r5, r5, r9\n\t"
  45496. "adcs r6, r6, r10\n\t"
  45497. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45498. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45499. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45500. "adcs r3, r3, r7\n\t"
  45501. "adcs r4, r4, r8\n\t"
  45502. "adcs r5, r5, r9\n\t"
  45503. "adcs r6, r6, r10\n\t"
  45504. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45505. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45506. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45507. "adcs r3, r3, r7\n\t"
  45508. "adcs r4, r4, r8\n\t"
  45509. "adcs r5, r5, r9\n\t"
  45510. "adcs r6, r6, r10\n\t"
  45511. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45512. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45513. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45514. "adcs r3, r3, r7\n\t"
  45515. "adcs r4, r4, r8\n\t"
  45516. "adcs r5, r5, r9\n\t"
  45517. "adcs r6, r6, r10\n\t"
  45518. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45519. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45520. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45521. "adcs r3, r3, r7\n\t"
  45522. "adcs r4, r4, r8\n\t"
  45523. "adcs r5, r5, r9\n\t"
  45524. "adcs r6, r6, r10\n\t"
  45525. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45526. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45527. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45528. "adcs r3, r3, r7\n\t"
  45529. "adcs r4, r4, r8\n\t"
  45530. "adcs r5, r5, r9\n\t"
  45531. "adcs r6, r6, r10\n\t"
  45532. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45533. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45534. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45535. "adcs r3, r3, r7\n\t"
  45536. "adcs r4, r4, r8\n\t"
  45537. "adcs r5, r5, r9\n\t"
  45538. "adcs r6, r6, r10\n\t"
  45539. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45540. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45541. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45542. "adcs r3, r3, r7\n\t"
  45543. "adcs r4, r4, r8\n\t"
  45544. "adcs r5, r5, r9\n\t"
  45545. "adcs r6, r6, r10\n\t"
  45546. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45547. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45548. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45549. "adcs r3, r3, r7\n\t"
  45550. "adcs r4, r4, r8\n\t"
  45551. "adcs r5, r5, r9\n\t"
  45552. "adcs r6, r6, r10\n\t"
  45553. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45554. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45555. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45556. "adcs r3, r3, r7\n\t"
  45557. "adcs r4, r4, r8\n\t"
  45558. "adcs r5, r5, r9\n\t"
  45559. "adcs r6, r6, r10\n\t"
  45560. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45561. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45562. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45563. "adcs r3, r3, r7\n\t"
  45564. "adcs r4, r4, r8\n\t"
  45565. "adcs r5, r5, r9\n\t"
  45566. "adcs r6, r6, r10\n\t"
  45567. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45568. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45569. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45570. "adcs r3, r3, r7\n\t"
  45571. "adcs r4, r4, r8\n\t"
  45572. "adcs r5, r5, r9\n\t"
  45573. "adcs r6, r6, r10\n\t"
  45574. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45575. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45576. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45577. "adcs r3, r3, r7\n\t"
  45578. "adcs r4, r4, r8\n\t"
  45579. "adcs r5, r5, r9\n\t"
  45580. "adcs r6, r6, r10\n\t"
  45581. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45582. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45583. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45584. "adcs r3, r3, r7\n\t"
  45585. "adcs r4, r4, r8\n\t"
  45586. "adcs r5, r5, r9\n\t"
  45587. "adcs r6, r6, r10\n\t"
  45588. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45589. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45590. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45591. "adcs r3, r3, r7\n\t"
  45592. "adcs r4, r4, r8\n\t"
  45593. "adcs r5, r5, r9\n\t"
  45594. "adcs r6, r6, r10\n\t"
  45595. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45596. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45597. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45598. "adcs r3, r3, r7\n\t"
  45599. "adcs r4, r4, r8\n\t"
  45600. "adcs r5, r5, r9\n\t"
  45601. "adcs r6, r6, r10\n\t"
  45602. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45603. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45604. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45605. "adcs r3, r3, r7\n\t"
  45606. "adcs r4, r4, r8\n\t"
  45607. "adcs r5, r5, r9\n\t"
  45608. "adcs r6, r6, r10\n\t"
  45609. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45610. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45611. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45612. "adcs r3, r3, r7\n\t"
  45613. "adcs r4, r4, r8\n\t"
  45614. "adcs r5, r5, r9\n\t"
  45615. "adcs r6, r6, r10\n\t"
  45616. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45617. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45618. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45619. "adcs r3, r3, r7\n\t"
  45620. "adcs r4, r4, r8\n\t"
  45621. "adcs r5, r5, r9\n\t"
  45622. "adcs r6, r6, r10\n\t"
  45623. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45624. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45625. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45626. "adcs r3, r3, r7\n\t"
  45627. "adcs r4, r4, r8\n\t"
  45628. "adcs r5, r5, r9\n\t"
  45629. "adcs r6, r6, r10\n\t"
  45630. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45631. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45632. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45633. "adcs r3, r3, r7\n\t"
  45634. "adcs r4, r4, r8\n\t"
  45635. "adcs r5, r5, r9\n\t"
  45636. "adcs r6, r6, r10\n\t"
  45637. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45638. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45639. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45640. "adcs r3, r3, r7\n\t"
  45641. "adcs r4, r4, r8\n\t"
  45642. "adcs r5, r5, r9\n\t"
  45643. "adcs r6, r6, r10\n\t"
  45644. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45645. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45646. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45647. "adcs r3, r3, r7\n\t"
  45648. "adcs r4, r4, r8\n\t"
  45649. "adcs r5, r5, r9\n\t"
  45650. "adcs r6, r6, r10\n\t"
  45651. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45652. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45653. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45654. "adcs r3, r3, r7\n\t"
  45655. "adcs r4, r4, r8\n\t"
  45656. "adcs r5, r5, r9\n\t"
  45657. "adcs r6, r6, r10\n\t"
  45658. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45659. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45660. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45661. "adcs r3, r3, r7\n\t"
  45662. "adcs r4, r4, r8\n\t"
  45663. "adcs r5, r5, r9\n\t"
  45664. "adcs r6, r6, r10\n\t"
  45665. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45666. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45667. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45668. "adcs r3, r3, r7\n\t"
  45669. "adcs r4, r4, r8\n\t"
  45670. "adcs r5, r5, r9\n\t"
  45671. "adcs r6, r6, r10\n\t"
  45672. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45673. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45674. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45675. "adcs r3, r3, r7\n\t"
  45676. "adcs r4, r4, r8\n\t"
  45677. "adcs r5, r5, r9\n\t"
  45678. "adcs r6, r6, r10\n\t"
  45679. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45680. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45681. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45682. "adcs r3, r3, r7\n\t"
  45683. "adcs r4, r4, r8\n\t"
  45684. "adcs r5, r5, r9\n\t"
  45685. "adcs r6, r6, r10\n\t"
  45686. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45687. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45688. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45689. "adcs r3, r3, r7\n\t"
  45690. "adcs r4, r4, r8\n\t"
  45691. "adcs r5, r5, r9\n\t"
  45692. "adcs r6, r6, r10\n\t"
  45693. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45694. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45695. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45696. "adcs r3, r3, r7\n\t"
  45697. "adcs r4, r4, r8\n\t"
  45698. "adcs r5, r5, r9\n\t"
  45699. "adcs r6, r6, r10\n\t"
  45700. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45701. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  45702. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  45703. "adcs r3, r3, r7\n\t"
  45704. "adcs r4, r4, r8\n\t"
  45705. "adcs r5, r5, r9\n\t"
  45706. "adcs r6, r6, r10\n\t"
  45707. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  45708. "mov %[r], #0\n\t"
  45709. "adc %[r], %[r], #0\n\t"
  45710. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  45711. :
  45712. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  45713. );
  45714. return (uint32_t)(size_t)r;
  45715. }
  45716. /* Multiply a and b into r. (r = a * b)
  45717. *
  45718. * r A single precision integer.
  45719. * a A single precision integer.
  45720. * b A single precision integer.
  45721. */
  45722. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  45723. const sp_digit* b)
  45724. {
  45725. sp_digit* z0 = r;
  45726. sp_digit z1[128];
  45727. sp_digit a1[64];
  45728. sp_digit b1[64];
  45729. sp_digit* z2 = r + 128;
  45730. sp_digit u;
  45731. sp_digit ca;
  45732. sp_digit cb;
  45733. ca = sp_2048_add_64(a1, a, &a[64]);
  45734. cb = sp_2048_add_64(b1, b, &b[64]);
  45735. u = ca & cb;
  45736. sp_2048_mul_64(z2, &a[64], &b[64]);
  45737. sp_2048_mul_64(z0, a, b);
  45738. sp_2048_mul_64(z1, a1, b1);
  45739. u += sp_4096_sub_in_place_128(z1, z0);
  45740. u += sp_4096_sub_in_place_128(z1, z2);
  45741. sp_2048_mask_64(a1, a1, 0 - cb);
  45742. u += sp_2048_add_64(z1 + 64, z1 + 64, a1);
  45743. sp_2048_mask_64(b1, b1, 0 - ca);
  45744. u += sp_2048_add_64(z1 + 64, z1 + 64, b1);
  45745. u += sp_4096_add_128(r + 64, r + 64, z1);
  45746. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (64 - 1));
  45747. a1[0] = u;
  45748. (void)sp_2048_add_64(r + 192, r + 192, a1);
  45749. }
  45750. /* Square a and put result in r. (r = a * a)
  45751. *
  45752. * r A single precision integer.
  45753. * a A single precision integer.
  45754. */
  45755. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  45756. {
  45757. sp_digit* z0 = r;
  45758. sp_digit* z2 = r + 128;
  45759. sp_digit z1[128];
  45760. sp_digit* a1 = z1;
  45761. sp_digit zero[64];
  45762. sp_digit u;
  45763. sp_digit mask;
  45764. sp_digit* p1;
  45765. sp_digit* p2;
  45766. XMEMSET(zero, 0, sizeof(sp_digit) * 64);
  45767. mask = sp_2048_sub_64(a1, a, &a[64]);
  45768. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  45769. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  45770. (void)sp_2048_sub_64(a1, p1, p2);
  45771. sp_2048_sqr_64(z2, &a[64]);
  45772. sp_2048_sqr_64(z0, a);
  45773. sp_2048_sqr_64(z1, a1);
  45774. u = 0;
  45775. u -= sp_4096_sub_in_place_128(z1, z2);
  45776. u -= sp_4096_sub_in_place_128(z1, z0);
  45777. u += sp_4096_sub_in_place_128(r + 64, z1);
  45778. zero[0] = u;
  45779. (void)sp_2048_add_64(r + 192, r + 192, zero);
  45780. }
  45781. #endif /* !WOLFSSL_SP_SMALL */
  45782. #ifdef WOLFSSL_SP_SMALL
  45783. /* Add b to a into r. (r = a + b)
  45784. *
  45785. * r A single precision integer.
  45786. * a A single precision integer.
  45787. * b A single precision integer.
  45788. */
  45789. static sp_digit sp_4096_add_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  45790. {
  45791. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  45792. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  45793. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  45794. __asm__ __volatile__ (
  45795. "mov r3, #0\n\t"
  45796. "add r12, %[a], #0x200\n\t"
  45797. "\n"
  45798. "L_sp_4096_add_128_word_%=: \n\t"
  45799. "adds r3, r3, #-1\n\t"
  45800. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  45801. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  45802. "adcs r4, r4, r8\n\t"
  45803. "adcs r5, r5, r9\n\t"
  45804. "adcs r6, r6, r10\n\t"
  45805. "adcs r7, r7, r11\n\t"
  45806. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  45807. "mov r4, #0\n\t"
  45808. "adc r3, r4, #0\n\t"
  45809. "cmp %[a], r12\n\t"
  45810. "bne L_sp_4096_add_128_word_%=\n\t"
  45811. "mov %[r], r3\n\t"
  45812. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  45813. :
  45814. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  45815. );
  45816. return (uint32_t)(size_t)r;
  45817. }
  45818. #endif /* WOLFSSL_SP_SMALL */
  45819. #ifdef WOLFSSL_SP_SMALL
  45820. /* Sub b from a into a. (a -= b)
  45821. *
  45822. * a A single precision integer.
  45823. * b A single precision integer.
  45824. */
  45825. static sp_digit sp_4096_sub_in_place_128(sp_digit* a_p, const sp_digit* b_p)
  45826. {
  45827. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  45828. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  45829. __asm__ __volatile__ (
  45830. "mov r12, #0\n\t"
  45831. "add lr, %[a], #0x200\n\t"
  45832. "\n"
  45833. "L_sp_4096_sub_in_pkace_128_word_%=: \n\t"
  45834. "rsbs r12, r12, #0\n\t"
  45835. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45836. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45837. "sbcs r2, r2, r6\n\t"
  45838. "sbcs r3, r3, r7\n\t"
  45839. "sbcs r4, r4, r8\n\t"
  45840. "sbcs r5, r5, r9\n\t"
  45841. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45842. "sbc r12, r12, r12\n\t"
  45843. "cmp %[a], lr\n\t"
  45844. "bne L_sp_4096_sub_in_pkace_128_word_%=\n\t"
  45845. "mov %[a], r12\n\t"
  45846. : [a] "+r" (a), [b] "+r" (b)
  45847. :
  45848. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  45849. );
  45850. return (uint32_t)(size_t)a;
  45851. }
  45852. #endif /* WOLFSSL_SP_SMALL */
  45853. #ifdef WOLFSSL_SP_SMALL
  45854. /* Multiply a and b into r. (r = a * b)
  45855. *
  45856. * r A single precision integer.
  45857. * a A single precision integer.
  45858. * b A single precision integer.
  45859. */
  45860. static void sp_4096_mul_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  45861. {
  45862. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  45863. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  45864. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  45865. __asm__ __volatile__ (
  45866. "sub sp, sp, #0x400\n\t"
  45867. "ldr lr, [%[a]]\n\t"
  45868. "ldr r11, [%[b]]\n\t"
  45869. "umull r8, r6, lr, r11\n\t"
  45870. "str r8, [sp]\n\t"
  45871. "mov r7, #0\n\t"
  45872. "mov r8, #0\n\t"
  45873. "mov r5, #4\n\t"
  45874. "\n"
  45875. "L_sp_4096_mul_128_outer_%=: \n\t"
  45876. "subs r3, r5, #0x1fc\n\t"
  45877. "it cc\n\t"
  45878. "movcc r3, #0\n\t"
  45879. "sub r4, r5, r3\n\t"
  45880. "\n"
  45881. "L_sp_4096_mul_128_inner_%=: \n\t"
  45882. "ldr lr, [%[a], r3]\n\t"
  45883. "ldr r11, [%[b], r4]\n\t"
  45884. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  45885. "lsl r9, lr, #16\n\t"
  45886. "lsl r10, r11, #16\n\t"
  45887. "lsr r9, r9, #16\n\t"
  45888. "lsr r10, r10, #16\n\t"
  45889. "mul r10, r9, r10\n\t"
  45890. "adds r6, r6, r10\n\t"
  45891. "adcs r7, r7, #0\n\t"
  45892. "adc r8, r8, #0\n\t"
  45893. "lsr r10, r11, #16\n\t"
  45894. "mul r9, r10, r9\n\t"
  45895. "lsr r10, r9, #16\n\t"
  45896. "lsl r9, r9, #16\n\t"
  45897. "adds r6, r6, r9\n\t"
  45898. "adcs r7, r7, r10\n\t"
  45899. "adc r8, r8, #0\n\t"
  45900. "lsr r9, lr, #16\n\t"
  45901. "lsr r10, r11, #16\n\t"
  45902. "mul r10, r9, r10\n\t"
  45903. "adds r7, r7, r10\n\t"
  45904. "adc r8, r8, #0\n\t"
  45905. "lsl r10, r11, #16\n\t"
  45906. "lsr r10, r10, #16\n\t"
  45907. "mul r9, r10, r9\n\t"
  45908. "lsr r10, r9, #16\n\t"
  45909. "lsl r9, r9, #16\n\t"
  45910. "adds r6, r6, r9\n\t"
  45911. "adcs r7, r7, r10\n\t"
  45912. "adc r8, r8, #0\n\t"
  45913. #else
  45914. "umull r9, r10, lr, r11\n\t"
  45915. "adds r6, r6, r9\n\t"
  45916. "adcs r7, r7, r10\n\t"
  45917. "adc r8, r8, #0\n\t"
  45918. #endif
  45919. "ldr lr, [%[a], r4]\n\t"
  45920. "ldr r11, [%[b], r3]\n\t"
  45921. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  45922. "lsl r9, lr, #16\n\t"
  45923. "lsl r10, r11, #16\n\t"
  45924. "lsr r9, r9, #16\n\t"
  45925. "lsr r10, r10, #16\n\t"
  45926. "mul r10, r9, r10\n\t"
  45927. "adds r6, r6, r10\n\t"
  45928. "adcs r7, r7, #0\n\t"
  45929. "adc r8, r8, #0\n\t"
  45930. "lsr r10, r11, #16\n\t"
  45931. "mul r9, r10, r9\n\t"
  45932. "lsr r10, r9, #16\n\t"
  45933. "lsl r9, r9, #16\n\t"
  45934. "adds r6, r6, r9\n\t"
  45935. "adcs r7, r7, r10\n\t"
  45936. "adc r8, r8, #0\n\t"
  45937. "lsr r9, lr, #16\n\t"
  45938. "lsr r10, r11, #16\n\t"
  45939. "mul r10, r9, r10\n\t"
  45940. "adds r7, r7, r10\n\t"
  45941. "adc r8, r8, #0\n\t"
  45942. "lsl r10, r11, #16\n\t"
  45943. "lsr r10, r10, #16\n\t"
  45944. "mul r9, r10, r9\n\t"
  45945. "lsr r10, r9, #16\n\t"
  45946. "lsl r9, r9, #16\n\t"
  45947. "adds r6, r6, r9\n\t"
  45948. "adcs r7, r7, r10\n\t"
  45949. "adc r8, r8, #0\n\t"
  45950. #else
  45951. "umull r9, r10, lr, r11\n\t"
  45952. "adds r6, r6, r9\n\t"
  45953. "adcs r7, r7, r10\n\t"
  45954. "adc r8, r8, #0\n\t"
  45955. #endif
  45956. "add r3, r3, #4\n\t"
  45957. "sub r4, r4, #4\n\t"
  45958. "cmp r3, r4\n\t"
  45959. "bgt L_sp_4096_mul_128_inner_done_%=\n\t"
  45960. "blt L_sp_4096_mul_128_inner_%=\n\t"
  45961. "ldr lr, [%[a], r3]\n\t"
  45962. "ldr r11, [%[b], r3]\n\t"
  45963. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  45964. "lsl r9, lr, #16\n\t"
  45965. "lsl r10, r11, #16\n\t"
  45966. "lsr r9, r9, #16\n\t"
  45967. "lsr r10, r10, #16\n\t"
  45968. "mul r10, r9, r10\n\t"
  45969. "adds r6, r6, r10\n\t"
  45970. "adcs r7, r7, #0\n\t"
  45971. "adc r8, r8, #0\n\t"
  45972. "lsr r10, r11, #16\n\t"
  45973. "mul r9, r10, r9\n\t"
  45974. "lsr r10, r9, #16\n\t"
  45975. "lsl r9, r9, #16\n\t"
  45976. "adds r6, r6, r9\n\t"
  45977. "adcs r7, r7, r10\n\t"
  45978. "adc r8, r8, #0\n\t"
  45979. "lsr r9, lr, #16\n\t"
  45980. "lsr r10, r11, #16\n\t"
  45981. "mul r10, r9, r10\n\t"
  45982. "adds r7, r7, r10\n\t"
  45983. "adc r8, r8, #0\n\t"
  45984. "lsl r10, r11, #16\n\t"
  45985. "lsr r10, r10, #16\n\t"
  45986. "mul r9, r10, r9\n\t"
  45987. "lsr r10, r9, #16\n\t"
  45988. "lsl r9, r9, #16\n\t"
  45989. "adds r6, r6, r9\n\t"
  45990. "adcs r7, r7, r10\n\t"
  45991. "adc r8, r8, #0\n\t"
  45992. #else
  45993. "umull r9, r10, lr, r11\n\t"
  45994. "adds r6, r6, r9\n\t"
  45995. "adcs r7, r7, r10\n\t"
  45996. "adc r8, r8, #0\n\t"
  45997. #endif
  45998. "\n"
  45999. "L_sp_4096_mul_128_inner_done_%=: \n\t"
  46000. "str r6, [sp, r5]\n\t"
  46001. "mov r6, r7\n\t"
  46002. "mov r7, r8\n\t"
  46003. "mov r8, #0\n\t"
  46004. "add r5, r5, #4\n\t"
  46005. "cmp r5, #0x3f4\n\t"
  46006. "ble L_sp_4096_mul_128_outer_%=\n\t"
  46007. "ldr lr, [%[a], #508]\n\t"
  46008. "ldr r11, [%[b], #508]\n\t"
  46009. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46010. "lsl r9, lr, #16\n\t"
  46011. "lsl r10, r11, #16\n\t"
  46012. "lsr r9, r9, #16\n\t"
  46013. "lsr r10, r10, #16\n\t"
  46014. "mul r10, r9, r10\n\t"
  46015. "adds r6, r6, r10\n\t"
  46016. "adc r7, r7, #0\n\t"
  46017. "lsr r10, r11, #16\n\t"
  46018. "mul r9, r10, r9\n\t"
  46019. "lsr r10, r9, #16\n\t"
  46020. "lsl r9, r9, #16\n\t"
  46021. "adds r6, r6, r9\n\t"
  46022. "adc r7, r7, r10\n\t"
  46023. "lsr r9, lr, #16\n\t"
  46024. "lsr r10, r11, #16\n\t"
  46025. "mul r10, r9, r10\n\t"
  46026. "add r7, r7, r10\n\t"
  46027. "lsl r10, r11, #16\n\t"
  46028. "lsr r10, r10, #16\n\t"
  46029. "mul r9, r10, r9\n\t"
  46030. "lsr r10, r9, #16\n\t"
  46031. "lsl r9, r9, #16\n\t"
  46032. "adds r6, r6, r9\n\t"
  46033. "adc r7, r7, r10\n\t"
  46034. #else
  46035. "umlal r6, r7, lr, r11\n\t"
  46036. #endif
  46037. "str r6, [sp, r5]\n\t"
  46038. "add r5, r5, #4\n\t"
  46039. "str r7, [sp, r5]\n\t"
  46040. "\n"
  46041. "L_sp_4096_mul_128_store_%=: \n\t"
  46042. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  46043. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  46044. "subs r5, r5, #32\n\t"
  46045. "bgt L_sp_4096_mul_128_store_%=\n\t"
  46046. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  46047. :
  46048. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  46049. );
  46050. }
  46051. /* Square a and put result in r. (r = a * a)
  46052. *
  46053. * r A single precision integer.
  46054. * a A single precision integer.
  46055. */
  46056. static void sp_4096_sqr_128(sp_digit* r_p, const sp_digit* a_p)
  46057. {
  46058. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  46059. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  46060. __asm__ __volatile__ (
  46061. "sub sp, sp, #0x400\n\t"
  46062. "ldr lr, [%[a]]\n\t"
  46063. "umull r8, r6, lr, lr\n\t"
  46064. "str r8, [sp]\n\t"
  46065. "mov r7, #0\n\t"
  46066. "mov r8, #0\n\t"
  46067. "mov r5, #4\n\t"
  46068. "\n"
  46069. "L_sp_4096_sqr_128_outer_%=: \n\t"
  46070. "subs r3, r5, #0x1fc\n\t"
  46071. "it cc\n\t"
  46072. "movcc r3, #0\n\t"
  46073. "sub r4, r5, r3\n\t"
  46074. "\n"
  46075. "L_sp_4096_sqr_128_inner_%=: \n\t"
  46076. "ldr lr, [%[a], r3]\n\t"
  46077. "ldr r11, [%[a], r4]\n\t"
  46078. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46079. "lsl r9, lr, #16\n\t"
  46080. "lsl r10, r11, #16\n\t"
  46081. "lsr r9, r9, #16\n\t"
  46082. "lsr r10, r10, #16\n\t"
  46083. "mul r10, r9, r10\n\t"
  46084. "adds r6, r6, r10\n\t"
  46085. "adcs r7, r7, #0\n\t"
  46086. "adc r8, r8, #0\n\t"
  46087. "adds r6, r6, r10\n\t"
  46088. "adcs r7, r7, #0\n\t"
  46089. "adc r8, r8, #0\n\t"
  46090. "lsr r10, r11, #16\n\t"
  46091. "mul r9, r10, r9\n\t"
  46092. "lsr r10, r9, #16\n\t"
  46093. "lsl r9, r9, #16\n\t"
  46094. "adds r6, r6, r9\n\t"
  46095. "adcs r7, r7, r10\n\t"
  46096. "adc r8, r8, #0\n\t"
  46097. "adds r6, r6, r9\n\t"
  46098. "adcs r7, r7, r10\n\t"
  46099. "adc r8, r8, #0\n\t"
  46100. "lsr r9, lr, #16\n\t"
  46101. "lsr r10, r11, #16\n\t"
  46102. "mul r10, r9, r10\n\t"
  46103. "adds r7, r7, r10\n\t"
  46104. "adc r8, r8, #0\n\t"
  46105. "adds r7, r7, r10\n\t"
  46106. "adc r8, r8, #0\n\t"
  46107. "lsl r10, r11, #16\n\t"
  46108. "lsr r10, r10, #16\n\t"
  46109. "mul r9, r10, r9\n\t"
  46110. "lsr r10, r9, #16\n\t"
  46111. "lsl r9, r9, #16\n\t"
  46112. "adds r6, r6, r9\n\t"
  46113. "adcs r7, r7, r10\n\t"
  46114. "adc r8, r8, #0\n\t"
  46115. "adds r6, r6, r9\n\t"
  46116. "adcs r7, r7, r10\n\t"
  46117. "adc r8, r8, #0\n\t"
  46118. #else
  46119. "umull r9, r10, lr, r11\n\t"
  46120. "adds r6, r6, r9\n\t"
  46121. "adcs r7, r7, r10\n\t"
  46122. "adc r8, r8, #0\n\t"
  46123. "adds r6, r6, r9\n\t"
  46124. "adcs r7, r7, r10\n\t"
  46125. "adc r8, r8, #0\n\t"
  46126. #endif
  46127. "add r3, r3, #4\n\t"
  46128. "sub r4, r4, #4\n\t"
  46129. "cmp r3, r4\n\t"
  46130. "bgt L_sp_4096_sqr_128_inner_done_%=\n\t"
  46131. "blt L_sp_4096_sqr_128_inner_%=\n\t"
  46132. "ldr lr, [%[a], r3]\n\t"
  46133. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46134. "lsl r9, lr, #16\n\t"
  46135. "lsr r10, lr, #16\n\t"
  46136. "lsr r9, r9, #16\n\t"
  46137. "mov r11, r9\n\t"
  46138. "mul r9, r11, r9\n\t"
  46139. "mov r11, r10\n\t"
  46140. "mul r10, r11, r10\n\t"
  46141. "adds r6, r6, r9\n\t"
  46142. "adcs r7, r7, r10\n\t"
  46143. "adc r8, r8, #0\n\t"
  46144. "lsr r10, lr, #16\n\t"
  46145. "lsl r9, lr, #16\n\t"
  46146. "lsr r9, r9, #16\n\t"
  46147. "mul r9, r10, r9\n\t"
  46148. "lsr r10, r9, #15\n\t"
  46149. "lsl r9, r9, #17\n\t"
  46150. "adds r6, r6, r9\n\t"
  46151. "adcs r7, r7, r10\n\t"
  46152. "adc r8, r8, #0\n\t"
  46153. #else
  46154. "umull r9, r10, lr, lr\n\t"
  46155. "adds r6, r6, r9\n\t"
  46156. "adcs r7, r7, r10\n\t"
  46157. "adc r8, r8, #0\n\t"
  46158. #endif
  46159. "\n"
  46160. "L_sp_4096_sqr_128_inner_done_%=: \n\t"
  46161. "str r6, [sp, r5]\n\t"
  46162. "mov r6, r7\n\t"
  46163. "mov r7, r8\n\t"
  46164. "mov r8, #0\n\t"
  46165. "add r5, r5, #4\n\t"
  46166. "cmp r5, #0x3f4\n\t"
  46167. "ble L_sp_4096_sqr_128_outer_%=\n\t"
  46168. "ldr lr, [%[a], #508]\n\t"
  46169. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46170. "lsl r9, lr, #16\n\t"
  46171. "lsr r10, lr, #16\n\t"
  46172. "lsr r9, r9, #16\n\t"
  46173. "mov r11, r9\n\t"
  46174. "mul r9, r11, r9\n\t"
  46175. "mov r11, r10\n\t"
  46176. "mul r10, r11, r10\n\t"
  46177. "adds r6, r6, r9\n\t"
  46178. "adc r7, r7, r10\n\t"
  46179. "lsr r10, lr, #16\n\t"
  46180. "lsl r9, lr, #16\n\t"
  46181. "lsr r9, r9, #16\n\t"
  46182. "mul r9, r10, r9\n\t"
  46183. "lsr r10, r9, #15\n\t"
  46184. "lsl r9, r9, #17\n\t"
  46185. "adds r6, r6, r9\n\t"
  46186. "adc r7, r7, r10\n\t"
  46187. #else
  46188. "umull r9, r10, lr, lr\n\t"
  46189. "adds r6, r6, r9\n\t"
  46190. "adc r7, r7, r10\n\t"
  46191. #endif
  46192. "str r6, [sp, r5]\n\t"
  46193. "add r5, r5, #4\n\t"
  46194. "str r7, [sp, r5]\n\t"
  46195. "\n"
  46196. "L_sp_4096_sqr_128_store_%=: \n\t"
  46197. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  46198. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  46199. "subs r5, r5, #32\n\t"
  46200. "bgt L_sp_4096_sqr_128_store_%=\n\t"
  46201. : [r] "+r" (r), [a] "+r" (a)
  46202. :
  46203. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  46204. );
  46205. }
  46206. #endif /* WOLFSSL_SP_SMALL */
  46207. /* Calculate the bottom digit of -1/a mod 2^n.
  46208. *
  46209. * a A single precision number.
  46210. * rho Bottom word of inverse.
  46211. */
  46212. static void sp_4096_mont_setup(const sp_digit* a, sp_digit* rho)
  46213. {
  46214. sp_digit x;
  46215. sp_digit b;
  46216. b = a[0];
  46217. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  46218. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  46219. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  46220. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  46221. /* rho = -1/m mod b */
  46222. *rho = (sp_digit)0 - x;
  46223. }
  46224. #ifdef WOLFSSL_SP_SMALL
  46225. /* Mul a by digit b into r. (r = a * b)
  46226. *
  46227. * r A single precision integer.
  46228. * a A single precision integer.
  46229. * b A single precision digit.
  46230. */
  46231. static void sp_4096_mul_d_128(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  46232. {
  46233. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  46234. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  46235. register sp_digit b asm ("r2") = (sp_digit)b_p;
  46236. __asm__ __volatile__ (
  46237. /* A[0] * B */
  46238. "ldr r8, [%[a]]\n\t"
  46239. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46240. "lsl r6, %[b], #16\n\t"
  46241. "lsl r5, r8, #16\n\t"
  46242. "lsr r6, r6, #16\n\t"
  46243. "lsr r5, r5, #16\n\t"
  46244. "mul r5, r6, r5\n\t"
  46245. "lsr r7, r8, #16\n\t"
  46246. "mul r6, r7, r6\n\t"
  46247. "lsr r3, r6, #16\n\t"
  46248. "lsl r6, r6, #16\n\t"
  46249. "adds r5, r5, r6\n\t"
  46250. "adc r3, r3, #0\n\t"
  46251. "lsr r6, %[b], #16\n\t"
  46252. "mul r7, r6, r7\n\t"
  46253. "add r3, r3, r7\n\t"
  46254. "lsl r7, r8, #16\n\t"
  46255. "lsr r7, r7, #16\n\t"
  46256. "mul r6, r7, r6\n\t"
  46257. "lsr r7, r6, #16\n\t"
  46258. "lsl r6, r6, #16\n\t"
  46259. "adds r5, r5, r6\n\t"
  46260. "adc r3, r3, r7\n\t"
  46261. #else
  46262. "umull r5, r3, %[b], r8\n\t"
  46263. #endif
  46264. "mov r4, #0\n\t"
  46265. "str r5, [%[r]]\n\t"
  46266. "mov r5, #0\n\t"
  46267. "mov r9, #4\n\t"
  46268. "\n"
  46269. "L_sp_4096_mul_d_128_word_%=: \n\t"
  46270. /* A[i] * B */
  46271. "ldr r8, [%[a], r9]\n\t"
  46272. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46273. "lsl r6, %[b], #16\n\t"
  46274. "lsl r7, r8, #16\n\t"
  46275. "lsr r6, r6, #16\n\t"
  46276. "lsr r7, r7, #16\n\t"
  46277. "mul r7, r6, r7\n\t"
  46278. "adds r3, r3, r7\n\t"
  46279. "adcs r4, r4, #0\n\t"
  46280. "adc r5, r5, #0\n\t"
  46281. "lsr r7, r8, #16\n\t"
  46282. "mul r6, r7, r6\n\t"
  46283. "lsr r7, r6, #16\n\t"
  46284. "lsl r6, r6, #16\n\t"
  46285. "adds r3, r3, r6\n\t"
  46286. "adcs r4, r4, r7\n\t"
  46287. "adc r5, r5, #0\n\t"
  46288. "lsr r6, %[b], #16\n\t"
  46289. "lsr r7, r8, #16\n\t"
  46290. "mul r7, r6, r7\n\t"
  46291. "adds r4, r4, r7\n\t"
  46292. "adc r5, r5, #0\n\t"
  46293. "lsl r7, r8, #16\n\t"
  46294. "lsr r7, r7, #16\n\t"
  46295. "mul r6, r7, r6\n\t"
  46296. "lsr r7, r6, #16\n\t"
  46297. "lsl r6, r6, #16\n\t"
  46298. "adds r3, r3, r6\n\t"
  46299. "adcs r4, r4, r7\n\t"
  46300. "adc r5, r5, #0\n\t"
  46301. #else
  46302. "umull r6, r7, %[b], r8\n\t"
  46303. "adds r3, r3, r6\n\t"
  46304. "adcs r4, r4, r7\n\t"
  46305. "adc r5, r5, #0\n\t"
  46306. #endif
  46307. "str r3, [%[r], r9]\n\t"
  46308. "mov r3, r4\n\t"
  46309. "mov r4, r5\n\t"
  46310. "mov r5, #0\n\t"
  46311. "add r9, r9, #4\n\t"
  46312. "cmp r9, #0x200\n\t"
  46313. "blt L_sp_4096_mul_d_128_word_%=\n\t"
  46314. "str r3, [%[r], #512]\n\t"
  46315. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  46316. :
  46317. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  46318. );
  46319. }
  46320. #else
  46321. /* Mul a by digit b into r. (r = a * b)
  46322. *
  46323. * r A single precision integer.
  46324. * a A single precision integer.
  46325. * b A single precision digit.
  46326. */
  46327. static void sp_4096_mul_d_128(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  46328. {
  46329. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  46330. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  46331. register sp_digit b asm ("r2") = (sp_digit)b_p;
  46332. __asm__ __volatile__ (
  46333. /* A[0] * B */
  46334. "ldm %[a]!, {r8}\n\t"
  46335. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46336. "lsl r6, %[b], #16\n\t"
  46337. "lsl r3, r8, #16\n\t"
  46338. "lsr r6, r6, #16\n\t"
  46339. "lsr r3, r3, #16\n\t"
  46340. "mul r3, r6, r3\n\t"
  46341. "lsr r7, r8, #16\n\t"
  46342. "mul r6, r7, r6\n\t"
  46343. "lsr r4, r6, #16\n\t"
  46344. "lsl r6, r6, #16\n\t"
  46345. "adds r3, r3, r6\n\t"
  46346. "adc r4, r4, #0\n\t"
  46347. "lsr r6, %[b], #16\n\t"
  46348. "mul r7, r6, r7\n\t"
  46349. "add r4, r4, r7\n\t"
  46350. "lsl r7, r8, #16\n\t"
  46351. "lsr r7, r7, #16\n\t"
  46352. "mul r6, r7, r6\n\t"
  46353. "lsr r7, r6, #16\n\t"
  46354. "lsl r6, r6, #16\n\t"
  46355. "adds r3, r3, r6\n\t"
  46356. "adc r4, r4, r7\n\t"
  46357. #else
  46358. "umull r3, r4, %[b], r8\n\t"
  46359. #endif
  46360. "stm %[r]!, {r3}\n\t"
  46361. "mov r5, #0\n\t"
  46362. /* A[1] * B */
  46363. "ldm %[a]!, {r8}\n\t"
  46364. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46365. "lsl r6, %[b], #16\n\t"
  46366. "lsl r7, r8, #16\n\t"
  46367. "lsr r6, r6, #16\n\t"
  46368. "lsr r7, r7, #16\n\t"
  46369. "mul r7, r6, r7\n\t"
  46370. "adds r4, r4, r7\n\t"
  46371. "adc r5, r5, #0\n\t"
  46372. "lsr r7, r8, #16\n\t"
  46373. "mul r6, r7, r6\n\t"
  46374. "lsr r7, r6, #16\n\t"
  46375. "lsl r6, r6, #16\n\t"
  46376. "adds r4, r4, r6\n\t"
  46377. "adc r5, r5, r7\n\t"
  46378. "lsr r6, %[b], #16\n\t"
  46379. "lsr r7, r8, #16\n\t"
  46380. "mul r7, r6, r7\n\t"
  46381. "add r5, r5, r7\n\t"
  46382. "lsl r7, r8, #16\n\t"
  46383. "lsr r7, r7, #16\n\t"
  46384. "mul r6, r7, r6\n\t"
  46385. "lsr r7, r6, #16\n\t"
  46386. "lsl r6, r6, #16\n\t"
  46387. "adds r4, r4, r6\n\t"
  46388. "adc r5, r5, r7\n\t"
  46389. #else
  46390. "umlal r4, r5, %[b], r8\n\t"
  46391. #endif
  46392. "stm %[r]!, {r4}\n\t"
  46393. "mov r3, #0\n\t"
  46394. /* A[2] * B */
  46395. "ldm %[a]!, {r8}\n\t"
  46396. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46397. "lsl r6, %[b], #16\n\t"
  46398. "lsl r7, r8, #16\n\t"
  46399. "lsr r6, r6, #16\n\t"
  46400. "lsr r7, r7, #16\n\t"
  46401. "mul r7, r6, r7\n\t"
  46402. "adds r5, r5, r7\n\t"
  46403. "adc r3, r3, #0\n\t"
  46404. "lsr r7, r8, #16\n\t"
  46405. "mul r6, r7, r6\n\t"
  46406. "lsr r7, r6, #16\n\t"
  46407. "lsl r6, r6, #16\n\t"
  46408. "adds r5, r5, r6\n\t"
  46409. "adc r3, r3, r7\n\t"
  46410. "lsr r6, %[b], #16\n\t"
  46411. "lsr r7, r8, #16\n\t"
  46412. "mul r7, r6, r7\n\t"
  46413. "add r3, r3, r7\n\t"
  46414. "lsl r7, r8, #16\n\t"
  46415. "lsr r7, r7, #16\n\t"
  46416. "mul r6, r7, r6\n\t"
  46417. "lsr r7, r6, #16\n\t"
  46418. "lsl r6, r6, #16\n\t"
  46419. "adds r5, r5, r6\n\t"
  46420. "adc r3, r3, r7\n\t"
  46421. #else
  46422. "umlal r5, r3, %[b], r8\n\t"
  46423. #endif
  46424. "stm %[r]!, {r5}\n\t"
  46425. "mov r4, #0\n\t"
  46426. /* A[3] * B */
  46427. "ldm %[a]!, {r8}\n\t"
  46428. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46429. "lsl r6, %[b], #16\n\t"
  46430. "lsl r7, r8, #16\n\t"
  46431. "lsr r6, r6, #16\n\t"
  46432. "lsr r7, r7, #16\n\t"
  46433. "mul r7, r6, r7\n\t"
  46434. "adds r3, r3, r7\n\t"
  46435. "adc r4, r4, #0\n\t"
  46436. "lsr r7, r8, #16\n\t"
  46437. "mul r6, r7, r6\n\t"
  46438. "lsr r7, r6, #16\n\t"
  46439. "lsl r6, r6, #16\n\t"
  46440. "adds r3, r3, r6\n\t"
  46441. "adc r4, r4, r7\n\t"
  46442. "lsr r6, %[b], #16\n\t"
  46443. "lsr r7, r8, #16\n\t"
  46444. "mul r7, r6, r7\n\t"
  46445. "add r4, r4, r7\n\t"
  46446. "lsl r7, r8, #16\n\t"
  46447. "lsr r7, r7, #16\n\t"
  46448. "mul r6, r7, r6\n\t"
  46449. "lsr r7, r6, #16\n\t"
  46450. "lsl r6, r6, #16\n\t"
  46451. "adds r3, r3, r6\n\t"
  46452. "adc r4, r4, r7\n\t"
  46453. #else
  46454. "umlal r3, r4, %[b], r8\n\t"
  46455. #endif
  46456. "stm %[r]!, {r3}\n\t"
  46457. "mov r5, #0\n\t"
  46458. /* A[4] * B */
  46459. "ldm %[a]!, {r8}\n\t"
  46460. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46461. "lsl r6, %[b], #16\n\t"
  46462. "lsl r7, r8, #16\n\t"
  46463. "lsr r6, r6, #16\n\t"
  46464. "lsr r7, r7, #16\n\t"
  46465. "mul r7, r6, r7\n\t"
  46466. "adds r4, r4, r7\n\t"
  46467. "adc r5, r5, #0\n\t"
  46468. "lsr r7, r8, #16\n\t"
  46469. "mul r6, r7, r6\n\t"
  46470. "lsr r7, r6, #16\n\t"
  46471. "lsl r6, r6, #16\n\t"
  46472. "adds r4, r4, r6\n\t"
  46473. "adc r5, r5, r7\n\t"
  46474. "lsr r6, %[b], #16\n\t"
  46475. "lsr r7, r8, #16\n\t"
  46476. "mul r7, r6, r7\n\t"
  46477. "add r5, r5, r7\n\t"
  46478. "lsl r7, r8, #16\n\t"
  46479. "lsr r7, r7, #16\n\t"
  46480. "mul r6, r7, r6\n\t"
  46481. "lsr r7, r6, #16\n\t"
  46482. "lsl r6, r6, #16\n\t"
  46483. "adds r4, r4, r6\n\t"
  46484. "adc r5, r5, r7\n\t"
  46485. #else
  46486. "umlal r4, r5, %[b], r8\n\t"
  46487. #endif
  46488. "stm %[r]!, {r4}\n\t"
  46489. "mov r3, #0\n\t"
  46490. /* A[5] * B */
  46491. "ldm %[a]!, {r8}\n\t"
  46492. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46493. "lsl r6, %[b], #16\n\t"
  46494. "lsl r7, r8, #16\n\t"
  46495. "lsr r6, r6, #16\n\t"
  46496. "lsr r7, r7, #16\n\t"
  46497. "mul r7, r6, r7\n\t"
  46498. "adds r5, r5, r7\n\t"
  46499. "adc r3, r3, #0\n\t"
  46500. "lsr r7, r8, #16\n\t"
  46501. "mul r6, r7, r6\n\t"
  46502. "lsr r7, r6, #16\n\t"
  46503. "lsl r6, r6, #16\n\t"
  46504. "adds r5, r5, r6\n\t"
  46505. "adc r3, r3, r7\n\t"
  46506. "lsr r6, %[b], #16\n\t"
  46507. "lsr r7, r8, #16\n\t"
  46508. "mul r7, r6, r7\n\t"
  46509. "add r3, r3, r7\n\t"
  46510. "lsl r7, r8, #16\n\t"
  46511. "lsr r7, r7, #16\n\t"
  46512. "mul r6, r7, r6\n\t"
  46513. "lsr r7, r6, #16\n\t"
  46514. "lsl r6, r6, #16\n\t"
  46515. "adds r5, r5, r6\n\t"
  46516. "adc r3, r3, r7\n\t"
  46517. #else
  46518. "umlal r5, r3, %[b], r8\n\t"
  46519. #endif
  46520. "stm %[r]!, {r5}\n\t"
  46521. "mov r4, #0\n\t"
  46522. /* A[6] * B */
  46523. "ldm %[a]!, {r8}\n\t"
  46524. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46525. "lsl r6, %[b], #16\n\t"
  46526. "lsl r7, r8, #16\n\t"
  46527. "lsr r6, r6, #16\n\t"
  46528. "lsr r7, r7, #16\n\t"
  46529. "mul r7, r6, r7\n\t"
  46530. "adds r3, r3, r7\n\t"
  46531. "adc r4, r4, #0\n\t"
  46532. "lsr r7, r8, #16\n\t"
  46533. "mul r6, r7, r6\n\t"
  46534. "lsr r7, r6, #16\n\t"
  46535. "lsl r6, r6, #16\n\t"
  46536. "adds r3, r3, r6\n\t"
  46537. "adc r4, r4, r7\n\t"
  46538. "lsr r6, %[b], #16\n\t"
  46539. "lsr r7, r8, #16\n\t"
  46540. "mul r7, r6, r7\n\t"
  46541. "add r4, r4, r7\n\t"
  46542. "lsl r7, r8, #16\n\t"
  46543. "lsr r7, r7, #16\n\t"
  46544. "mul r6, r7, r6\n\t"
  46545. "lsr r7, r6, #16\n\t"
  46546. "lsl r6, r6, #16\n\t"
  46547. "adds r3, r3, r6\n\t"
  46548. "adc r4, r4, r7\n\t"
  46549. #else
  46550. "umlal r3, r4, %[b], r8\n\t"
  46551. #endif
  46552. "stm %[r]!, {r3}\n\t"
  46553. "mov r5, #0\n\t"
  46554. /* A[7] * B */
  46555. "ldm %[a]!, {r8}\n\t"
  46556. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46557. "lsl r6, %[b], #16\n\t"
  46558. "lsl r7, r8, #16\n\t"
  46559. "lsr r6, r6, #16\n\t"
  46560. "lsr r7, r7, #16\n\t"
  46561. "mul r7, r6, r7\n\t"
  46562. "adds r4, r4, r7\n\t"
  46563. "adc r5, r5, #0\n\t"
  46564. "lsr r7, r8, #16\n\t"
  46565. "mul r6, r7, r6\n\t"
  46566. "lsr r7, r6, #16\n\t"
  46567. "lsl r6, r6, #16\n\t"
  46568. "adds r4, r4, r6\n\t"
  46569. "adc r5, r5, r7\n\t"
  46570. "lsr r6, %[b], #16\n\t"
  46571. "lsr r7, r8, #16\n\t"
  46572. "mul r7, r6, r7\n\t"
  46573. "add r5, r5, r7\n\t"
  46574. "lsl r7, r8, #16\n\t"
  46575. "lsr r7, r7, #16\n\t"
  46576. "mul r6, r7, r6\n\t"
  46577. "lsr r7, r6, #16\n\t"
  46578. "lsl r6, r6, #16\n\t"
  46579. "adds r4, r4, r6\n\t"
  46580. "adc r5, r5, r7\n\t"
  46581. #else
  46582. "umlal r4, r5, %[b], r8\n\t"
  46583. #endif
  46584. "stm %[r]!, {r4}\n\t"
  46585. "mov r3, #0\n\t"
  46586. /* A[8] * B */
  46587. "ldm %[a]!, {r8}\n\t"
  46588. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46589. "lsl r6, %[b], #16\n\t"
  46590. "lsl r7, r8, #16\n\t"
  46591. "lsr r6, r6, #16\n\t"
  46592. "lsr r7, r7, #16\n\t"
  46593. "mul r7, r6, r7\n\t"
  46594. "adds r5, r5, r7\n\t"
  46595. "adc r3, r3, #0\n\t"
  46596. "lsr r7, r8, #16\n\t"
  46597. "mul r6, r7, r6\n\t"
  46598. "lsr r7, r6, #16\n\t"
  46599. "lsl r6, r6, #16\n\t"
  46600. "adds r5, r5, r6\n\t"
  46601. "adc r3, r3, r7\n\t"
  46602. "lsr r6, %[b], #16\n\t"
  46603. "lsr r7, r8, #16\n\t"
  46604. "mul r7, r6, r7\n\t"
  46605. "add r3, r3, r7\n\t"
  46606. "lsl r7, r8, #16\n\t"
  46607. "lsr r7, r7, #16\n\t"
  46608. "mul r6, r7, r6\n\t"
  46609. "lsr r7, r6, #16\n\t"
  46610. "lsl r6, r6, #16\n\t"
  46611. "adds r5, r5, r6\n\t"
  46612. "adc r3, r3, r7\n\t"
  46613. #else
  46614. "umlal r5, r3, %[b], r8\n\t"
  46615. #endif
  46616. "stm %[r]!, {r5}\n\t"
  46617. "mov r4, #0\n\t"
  46618. /* A[9] * B */
  46619. "ldm %[a]!, {r8}\n\t"
  46620. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46621. "lsl r6, %[b], #16\n\t"
  46622. "lsl r7, r8, #16\n\t"
  46623. "lsr r6, r6, #16\n\t"
  46624. "lsr r7, r7, #16\n\t"
  46625. "mul r7, r6, r7\n\t"
  46626. "adds r3, r3, r7\n\t"
  46627. "adc r4, r4, #0\n\t"
  46628. "lsr r7, r8, #16\n\t"
  46629. "mul r6, r7, r6\n\t"
  46630. "lsr r7, r6, #16\n\t"
  46631. "lsl r6, r6, #16\n\t"
  46632. "adds r3, r3, r6\n\t"
  46633. "adc r4, r4, r7\n\t"
  46634. "lsr r6, %[b], #16\n\t"
  46635. "lsr r7, r8, #16\n\t"
  46636. "mul r7, r6, r7\n\t"
  46637. "add r4, r4, r7\n\t"
  46638. "lsl r7, r8, #16\n\t"
  46639. "lsr r7, r7, #16\n\t"
  46640. "mul r6, r7, r6\n\t"
  46641. "lsr r7, r6, #16\n\t"
  46642. "lsl r6, r6, #16\n\t"
  46643. "adds r3, r3, r6\n\t"
  46644. "adc r4, r4, r7\n\t"
  46645. #else
  46646. "umlal r3, r4, %[b], r8\n\t"
  46647. #endif
  46648. "stm %[r]!, {r3}\n\t"
  46649. "mov r5, #0\n\t"
  46650. /* A[10] * B */
  46651. "ldm %[a]!, {r8}\n\t"
  46652. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46653. "lsl r6, %[b], #16\n\t"
  46654. "lsl r7, r8, #16\n\t"
  46655. "lsr r6, r6, #16\n\t"
  46656. "lsr r7, r7, #16\n\t"
  46657. "mul r7, r6, r7\n\t"
  46658. "adds r4, r4, r7\n\t"
  46659. "adc r5, r5, #0\n\t"
  46660. "lsr r7, r8, #16\n\t"
  46661. "mul r6, r7, r6\n\t"
  46662. "lsr r7, r6, #16\n\t"
  46663. "lsl r6, r6, #16\n\t"
  46664. "adds r4, r4, r6\n\t"
  46665. "adc r5, r5, r7\n\t"
  46666. "lsr r6, %[b], #16\n\t"
  46667. "lsr r7, r8, #16\n\t"
  46668. "mul r7, r6, r7\n\t"
  46669. "add r5, r5, r7\n\t"
  46670. "lsl r7, r8, #16\n\t"
  46671. "lsr r7, r7, #16\n\t"
  46672. "mul r6, r7, r6\n\t"
  46673. "lsr r7, r6, #16\n\t"
  46674. "lsl r6, r6, #16\n\t"
  46675. "adds r4, r4, r6\n\t"
  46676. "adc r5, r5, r7\n\t"
  46677. #else
  46678. "umlal r4, r5, %[b], r8\n\t"
  46679. #endif
  46680. "stm %[r]!, {r4}\n\t"
  46681. "mov r3, #0\n\t"
  46682. /* A[11] * B */
  46683. "ldm %[a]!, {r8}\n\t"
  46684. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46685. "lsl r6, %[b], #16\n\t"
  46686. "lsl r7, r8, #16\n\t"
  46687. "lsr r6, r6, #16\n\t"
  46688. "lsr r7, r7, #16\n\t"
  46689. "mul r7, r6, r7\n\t"
  46690. "adds r5, r5, r7\n\t"
  46691. "adc r3, r3, #0\n\t"
  46692. "lsr r7, r8, #16\n\t"
  46693. "mul r6, r7, r6\n\t"
  46694. "lsr r7, r6, #16\n\t"
  46695. "lsl r6, r6, #16\n\t"
  46696. "adds r5, r5, r6\n\t"
  46697. "adc r3, r3, r7\n\t"
  46698. "lsr r6, %[b], #16\n\t"
  46699. "lsr r7, r8, #16\n\t"
  46700. "mul r7, r6, r7\n\t"
  46701. "add r3, r3, r7\n\t"
  46702. "lsl r7, r8, #16\n\t"
  46703. "lsr r7, r7, #16\n\t"
  46704. "mul r6, r7, r6\n\t"
  46705. "lsr r7, r6, #16\n\t"
  46706. "lsl r6, r6, #16\n\t"
  46707. "adds r5, r5, r6\n\t"
  46708. "adc r3, r3, r7\n\t"
  46709. #else
  46710. "umlal r5, r3, %[b], r8\n\t"
  46711. #endif
  46712. "stm %[r]!, {r5}\n\t"
  46713. "mov r4, #0\n\t"
  46714. /* A[12] * B */
  46715. "ldm %[a]!, {r8}\n\t"
  46716. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46717. "lsl r6, %[b], #16\n\t"
  46718. "lsl r7, r8, #16\n\t"
  46719. "lsr r6, r6, #16\n\t"
  46720. "lsr r7, r7, #16\n\t"
  46721. "mul r7, r6, r7\n\t"
  46722. "adds r3, r3, r7\n\t"
  46723. "adc r4, r4, #0\n\t"
  46724. "lsr r7, r8, #16\n\t"
  46725. "mul r6, r7, r6\n\t"
  46726. "lsr r7, r6, #16\n\t"
  46727. "lsl r6, r6, #16\n\t"
  46728. "adds r3, r3, r6\n\t"
  46729. "adc r4, r4, r7\n\t"
  46730. "lsr r6, %[b], #16\n\t"
  46731. "lsr r7, r8, #16\n\t"
  46732. "mul r7, r6, r7\n\t"
  46733. "add r4, r4, r7\n\t"
  46734. "lsl r7, r8, #16\n\t"
  46735. "lsr r7, r7, #16\n\t"
  46736. "mul r6, r7, r6\n\t"
  46737. "lsr r7, r6, #16\n\t"
  46738. "lsl r6, r6, #16\n\t"
  46739. "adds r3, r3, r6\n\t"
  46740. "adc r4, r4, r7\n\t"
  46741. #else
  46742. "umlal r3, r4, %[b], r8\n\t"
  46743. #endif
  46744. "stm %[r]!, {r3}\n\t"
  46745. "mov r5, #0\n\t"
  46746. /* A[13] * B */
  46747. "ldm %[a]!, {r8}\n\t"
  46748. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46749. "lsl r6, %[b], #16\n\t"
  46750. "lsl r7, r8, #16\n\t"
  46751. "lsr r6, r6, #16\n\t"
  46752. "lsr r7, r7, #16\n\t"
  46753. "mul r7, r6, r7\n\t"
  46754. "adds r4, r4, r7\n\t"
  46755. "adc r5, r5, #0\n\t"
  46756. "lsr r7, r8, #16\n\t"
  46757. "mul r6, r7, r6\n\t"
  46758. "lsr r7, r6, #16\n\t"
  46759. "lsl r6, r6, #16\n\t"
  46760. "adds r4, r4, r6\n\t"
  46761. "adc r5, r5, r7\n\t"
  46762. "lsr r6, %[b], #16\n\t"
  46763. "lsr r7, r8, #16\n\t"
  46764. "mul r7, r6, r7\n\t"
  46765. "add r5, r5, r7\n\t"
  46766. "lsl r7, r8, #16\n\t"
  46767. "lsr r7, r7, #16\n\t"
  46768. "mul r6, r7, r6\n\t"
  46769. "lsr r7, r6, #16\n\t"
  46770. "lsl r6, r6, #16\n\t"
  46771. "adds r4, r4, r6\n\t"
  46772. "adc r5, r5, r7\n\t"
  46773. #else
  46774. "umlal r4, r5, %[b], r8\n\t"
  46775. #endif
  46776. "stm %[r]!, {r4}\n\t"
  46777. "mov r3, #0\n\t"
  46778. /* A[14] * B */
  46779. "ldm %[a]!, {r8}\n\t"
  46780. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46781. "lsl r6, %[b], #16\n\t"
  46782. "lsl r7, r8, #16\n\t"
  46783. "lsr r6, r6, #16\n\t"
  46784. "lsr r7, r7, #16\n\t"
  46785. "mul r7, r6, r7\n\t"
  46786. "adds r5, r5, r7\n\t"
  46787. "adc r3, r3, #0\n\t"
  46788. "lsr r7, r8, #16\n\t"
  46789. "mul r6, r7, r6\n\t"
  46790. "lsr r7, r6, #16\n\t"
  46791. "lsl r6, r6, #16\n\t"
  46792. "adds r5, r5, r6\n\t"
  46793. "adc r3, r3, r7\n\t"
  46794. "lsr r6, %[b], #16\n\t"
  46795. "lsr r7, r8, #16\n\t"
  46796. "mul r7, r6, r7\n\t"
  46797. "add r3, r3, r7\n\t"
  46798. "lsl r7, r8, #16\n\t"
  46799. "lsr r7, r7, #16\n\t"
  46800. "mul r6, r7, r6\n\t"
  46801. "lsr r7, r6, #16\n\t"
  46802. "lsl r6, r6, #16\n\t"
  46803. "adds r5, r5, r6\n\t"
  46804. "adc r3, r3, r7\n\t"
  46805. #else
  46806. "umlal r5, r3, %[b], r8\n\t"
  46807. #endif
  46808. "stm %[r]!, {r5}\n\t"
  46809. "mov r4, #0\n\t"
  46810. /* A[15] * B */
  46811. "ldm %[a]!, {r8}\n\t"
  46812. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46813. "lsl r6, %[b], #16\n\t"
  46814. "lsl r7, r8, #16\n\t"
  46815. "lsr r6, r6, #16\n\t"
  46816. "lsr r7, r7, #16\n\t"
  46817. "mul r7, r6, r7\n\t"
  46818. "adds r3, r3, r7\n\t"
  46819. "adc r4, r4, #0\n\t"
  46820. "lsr r7, r8, #16\n\t"
  46821. "mul r6, r7, r6\n\t"
  46822. "lsr r7, r6, #16\n\t"
  46823. "lsl r6, r6, #16\n\t"
  46824. "adds r3, r3, r6\n\t"
  46825. "adc r4, r4, r7\n\t"
  46826. "lsr r6, %[b], #16\n\t"
  46827. "lsr r7, r8, #16\n\t"
  46828. "mul r7, r6, r7\n\t"
  46829. "add r4, r4, r7\n\t"
  46830. "lsl r7, r8, #16\n\t"
  46831. "lsr r7, r7, #16\n\t"
  46832. "mul r6, r7, r6\n\t"
  46833. "lsr r7, r6, #16\n\t"
  46834. "lsl r6, r6, #16\n\t"
  46835. "adds r3, r3, r6\n\t"
  46836. "adc r4, r4, r7\n\t"
  46837. #else
  46838. "umlal r3, r4, %[b], r8\n\t"
  46839. #endif
  46840. "stm %[r]!, {r3}\n\t"
  46841. "mov r5, #0\n\t"
  46842. /* A[16] * B */
  46843. "ldm %[a]!, {r8}\n\t"
  46844. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46845. "lsl r6, %[b], #16\n\t"
  46846. "lsl r7, r8, #16\n\t"
  46847. "lsr r6, r6, #16\n\t"
  46848. "lsr r7, r7, #16\n\t"
  46849. "mul r7, r6, r7\n\t"
  46850. "adds r4, r4, r7\n\t"
  46851. "adc r5, r5, #0\n\t"
  46852. "lsr r7, r8, #16\n\t"
  46853. "mul r6, r7, r6\n\t"
  46854. "lsr r7, r6, #16\n\t"
  46855. "lsl r6, r6, #16\n\t"
  46856. "adds r4, r4, r6\n\t"
  46857. "adc r5, r5, r7\n\t"
  46858. "lsr r6, %[b], #16\n\t"
  46859. "lsr r7, r8, #16\n\t"
  46860. "mul r7, r6, r7\n\t"
  46861. "add r5, r5, r7\n\t"
  46862. "lsl r7, r8, #16\n\t"
  46863. "lsr r7, r7, #16\n\t"
  46864. "mul r6, r7, r6\n\t"
  46865. "lsr r7, r6, #16\n\t"
  46866. "lsl r6, r6, #16\n\t"
  46867. "adds r4, r4, r6\n\t"
  46868. "adc r5, r5, r7\n\t"
  46869. #else
  46870. "umlal r4, r5, %[b], r8\n\t"
  46871. #endif
  46872. "stm %[r]!, {r4}\n\t"
  46873. "mov r3, #0\n\t"
  46874. /* A[17] * B */
  46875. "ldm %[a]!, {r8}\n\t"
  46876. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46877. "lsl r6, %[b], #16\n\t"
  46878. "lsl r7, r8, #16\n\t"
  46879. "lsr r6, r6, #16\n\t"
  46880. "lsr r7, r7, #16\n\t"
  46881. "mul r7, r6, r7\n\t"
  46882. "adds r5, r5, r7\n\t"
  46883. "adc r3, r3, #0\n\t"
  46884. "lsr r7, r8, #16\n\t"
  46885. "mul r6, r7, r6\n\t"
  46886. "lsr r7, r6, #16\n\t"
  46887. "lsl r6, r6, #16\n\t"
  46888. "adds r5, r5, r6\n\t"
  46889. "adc r3, r3, r7\n\t"
  46890. "lsr r6, %[b], #16\n\t"
  46891. "lsr r7, r8, #16\n\t"
  46892. "mul r7, r6, r7\n\t"
  46893. "add r3, r3, r7\n\t"
  46894. "lsl r7, r8, #16\n\t"
  46895. "lsr r7, r7, #16\n\t"
  46896. "mul r6, r7, r6\n\t"
  46897. "lsr r7, r6, #16\n\t"
  46898. "lsl r6, r6, #16\n\t"
  46899. "adds r5, r5, r6\n\t"
  46900. "adc r3, r3, r7\n\t"
  46901. #else
  46902. "umlal r5, r3, %[b], r8\n\t"
  46903. #endif
  46904. "stm %[r]!, {r5}\n\t"
  46905. "mov r4, #0\n\t"
  46906. /* A[18] * B */
  46907. "ldm %[a]!, {r8}\n\t"
  46908. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46909. "lsl r6, %[b], #16\n\t"
  46910. "lsl r7, r8, #16\n\t"
  46911. "lsr r6, r6, #16\n\t"
  46912. "lsr r7, r7, #16\n\t"
  46913. "mul r7, r6, r7\n\t"
  46914. "adds r3, r3, r7\n\t"
  46915. "adc r4, r4, #0\n\t"
  46916. "lsr r7, r8, #16\n\t"
  46917. "mul r6, r7, r6\n\t"
  46918. "lsr r7, r6, #16\n\t"
  46919. "lsl r6, r6, #16\n\t"
  46920. "adds r3, r3, r6\n\t"
  46921. "adc r4, r4, r7\n\t"
  46922. "lsr r6, %[b], #16\n\t"
  46923. "lsr r7, r8, #16\n\t"
  46924. "mul r7, r6, r7\n\t"
  46925. "add r4, r4, r7\n\t"
  46926. "lsl r7, r8, #16\n\t"
  46927. "lsr r7, r7, #16\n\t"
  46928. "mul r6, r7, r6\n\t"
  46929. "lsr r7, r6, #16\n\t"
  46930. "lsl r6, r6, #16\n\t"
  46931. "adds r3, r3, r6\n\t"
  46932. "adc r4, r4, r7\n\t"
  46933. #else
  46934. "umlal r3, r4, %[b], r8\n\t"
  46935. #endif
  46936. "stm %[r]!, {r3}\n\t"
  46937. "mov r5, #0\n\t"
  46938. /* A[19] * B */
  46939. "ldm %[a]!, {r8}\n\t"
  46940. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46941. "lsl r6, %[b], #16\n\t"
  46942. "lsl r7, r8, #16\n\t"
  46943. "lsr r6, r6, #16\n\t"
  46944. "lsr r7, r7, #16\n\t"
  46945. "mul r7, r6, r7\n\t"
  46946. "adds r4, r4, r7\n\t"
  46947. "adc r5, r5, #0\n\t"
  46948. "lsr r7, r8, #16\n\t"
  46949. "mul r6, r7, r6\n\t"
  46950. "lsr r7, r6, #16\n\t"
  46951. "lsl r6, r6, #16\n\t"
  46952. "adds r4, r4, r6\n\t"
  46953. "adc r5, r5, r7\n\t"
  46954. "lsr r6, %[b], #16\n\t"
  46955. "lsr r7, r8, #16\n\t"
  46956. "mul r7, r6, r7\n\t"
  46957. "add r5, r5, r7\n\t"
  46958. "lsl r7, r8, #16\n\t"
  46959. "lsr r7, r7, #16\n\t"
  46960. "mul r6, r7, r6\n\t"
  46961. "lsr r7, r6, #16\n\t"
  46962. "lsl r6, r6, #16\n\t"
  46963. "adds r4, r4, r6\n\t"
  46964. "adc r5, r5, r7\n\t"
  46965. #else
  46966. "umlal r4, r5, %[b], r8\n\t"
  46967. #endif
  46968. "stm %[r]!, {r4}\n\t"
  46969. "mov r3, #0\n\t"
  46970. /* A[20] * B */
  46971. "ldm %[a]!, {r8}\n\t"
  46972. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  46973. "lsl r6, %[b], #16\n\t"
  46974. "lsl r7, r8, #16\n\t"
  46975. "lsr r6, r6, #16\n\t"
  46976. "lsr r7, r7, #16\n\t"
  46977. "mul r7, r6, r7\n\t"
  46978. "adds r5, r5, r7\n\t"
  46979. "adc r3, r3, #0\n\t"
  46980. "lsr r7, r8, #16\n\t"
  46981. "mul r6, r7, r6\n\t"
  46982. "lsr r7, r6, #16\n\t"
  46983. "lsl r6, r6, #16\n\t"
  46984. "adds r5, r5, r6\n\t"
  46985. "adc r3, r3, r7\n\t"
  46986. "lsr r6, %[b], #16\n\t"
  46987. "lsr r7, r8, #16\n\t"
  46988. "mul r7, r6, r7\n\t"
  46989. "add r3, r3, r7\n\t"
  46990. "lsl r7, r8, #16\n\t"
  46991. "lsr r7, r7, #16\n\t"
  46992. "mul r6, r7, r6\n\t"
  46993. "lsr r7, r6, #16\n\t"
  46994. "lsl r6, r6, #16\n\t"
  46995. "adds r5, r5, r6\n\t"
  46996. "adc r3, r3, r7\n\t"
  46997. #else
  46998. "umlal r5, r3, %[b], r8\n\t"
  46999. #endif
  47000. "stm %[r]!, {r5}\n\t"
  47001. "mov r4, #0\n\t"
  47002. /* A[21] * B */
  47003. "ldm %[a]!, {r8}\n\t"
  47004. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47005. "lsl r6, %[b], #16\n\t"
  47006. "lsl r7, r8, #16\n\t"
  47007. "lsr r6, r6, #16\n\t"
  47008. "lsr r7, r7, #16\n\t"
  47009. "mul r7, r6, r7\n\t"
  47010. "adds r3, r3, r7\n\t"
  47011. "adc r4, r4, #0\n\t"
  47012. "lsr r7, r8, #16\n\t"
  47013. "mul r6, r7, r6\n\t"
  47014. "lsr r7, r6, #16\n\t"
  47015. "lsl r6, r6, #16\n\t"
  47016. "adds r3, r3, r6\n\t"
  47017. "adc r4, r4, r7\n\t"
  47018. "lsr r6, %[b], #16\n\t"
  47019. "lsr r7, r8, #16\n\t"
  47020. "mul r7, r6, r7\n\t"
  47021. "add r4, r4, r7\n\t"
  47022. "lsl r7, r8, #16\n\t"
  47023. "lsr r7, r7, #16\n\t"
  47024. "mul r6, r7, r6\n\t"
  47025. "lsr r7, r6, #16\n\t"
  47026. "lsl r6, r6, #16\n\t"
  47027. "adds r3, r3, r6\n\t"
  47028. "adc r4, r4, r7\n\t"
  47029. #else
  47030. "umlal r3, r4, %[b], r8\n\t"
  47031. #endif
  47032. "stm %[r]!, {r3}\n\t"
  47033. "mov r5, #0\n\t"
  47034. /* A[22] * B */
  47035. "ldm %[a]!, {r8}\n\t"
  47036. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47037. "lsl r6, %[b], #16\n\t"
  47038. "lsl r7, r8, #16\n\t"
  47039. "lsr r6, r6, #16\n\t"
  47040. "lsr r7, r7, #16\n\t"
  47041. "mul r7, r6, r7\n\t"
  47042. "adds r4, r4, r7\n\t"
  47043. "adc r5, r5, #0\n\t"
  47044. "lsr r7, r8, #16\n\t"
  47045. "mul r6, r7, r6\n\t"
  47046. "lsr r7, r6, #16\n\t"
  47047. "lsl r6, r6, #16\n\t"
  47048. "adds r4, r4, r6\n\t"
  47049. "adc r5, r5, r7\n\t"
  47050. "lsr r6, %[b], #16\n\t"
  47051. "lsr r7, r8, #16\n\t"
  47052. "mul r7, r6, r7\n\t"
  47053. "add r5, r5, r7\n\t"
  47054. "lsl r7, r8, #16\n\t"
  47055. "lsr r7, r7, #16\n\t"
  47056. "mul r6, r7, r6\n\t"
  47057. "lsr r7, r6, #16\n\t"
  47058. "lsl r6, r6, #16\n\t"
  47059. "adds r4, r4, r6\n\t"
  47060. "adc r5, r5, r7\n\t"
  47061. #else
  47062. "umlal r4, r5, %[b], r8\n\t"
  47063. #endif
  47064. "stm %[r]!, {r4}\n\t"
  47065. "mov r3, #0\n\t"
  47066. /* A[23] * B */
  47067. "ldm %[a]!, {r8}\n\t"
  47068. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47069. "lsl r6, %[b], #16\n\t"
  47070. "lsl r7, r8, #16\n\t"
  47071. "lsr r6, r6, #16\n\t"
  47072. "lsr r7, r7, #16\n\t"
  47073. "mul r7, r6, r7\n\t"
  47074. "adds r5, r5, r7\n\t"
  47075. "adc r3, r3, #0\n\t"
  47076. "lsr r7, r8, #16\n\t"
  47077. "mul r6, r7, r6\n\t"
  47078. "lsr r7, r6, #16\n\t"
  47079. "lsl r6, r6, #16\n\t"
  47080. "adds r5, r5, r6\n\t"
  47081. "adc r3, r3, r7\n\t"
  47082. "lsr r6, %[b], #16\n\t"
  47083. "lsr r7, r8, #16\n\t"
  47084. "mul r7, r6, r7\n\t"
  47085. "add r3, r3, r7\n\t"
  47086. "lsl r7, r8, #16\n\t"
  47087. "lsr r7, r7, #16\n\t"
  47088. "mul r6, r7, r6\n\t"
  47089. "lsr r7, r6, #16\n\t"
  47090. "lsl r6, r6, #16\n\t"
  47091. "adds r5, r5, r6\n\t"
  47092. "adc r3, r3, r7\n\t"
  47093. #else
  47094. "umlal r5, r3, %[b], r8\n\t"
  47095. #endif
  47096. "stm %[r]!, {r5}\n\t"
  47097. "mov r4, #0\n\t"
  47098. /* A[24] * B */
  47099. "ldm %[a]!, {r8}\n\t"
  47100. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47101. "lsl r6, %[b], #16\n\t"
  47102. "lsl r7, r8, #16\n\t"
  47103. "lsr r6, r6, #16\n\t"
  47104. "lsr r7, r7, #16\n\t"
  47105. "mul r7, r6, r7\n\t"
  47106. "adds r3, r3, r7\n\t"
  47107. "adc r4, r4, #0\n\t"
  47108. "lsr r7, r8, #16\n\t"
  47109. "mul r6, r7, r6\n\t"
  47110. "lsr r7, r6, #16\n\t"
  47111. "lsl r6, r6, #16\n\t"
  47112. "adds r3, r3, r6\n\t"
  47113. "adc r4, r4, r7\n\t"
  47114. "lsr r6, %[b], #16\n\t"
  47115. "lsr r7, r8, #16\n\t"
  47116. "mul r7, r6, r7\n\t"
  47117. "add r4, r4, r7\n\t"
  47118. "lsl r7, r8, #16\n\t"
  47119. "lsr r7, r7, #16\n\t"
  47120. "mul r6, r7, r6\n\t"
  47121. "lsr r7, r6, #16\n\t"
  47122. "lsl r6, r6, #16\n\t"
  47123. "adds r3, r3, r6\n\t"
  47124. "adc r4, r4, r7\n\t"
  47125. #else
  47126. "umlal r3, r4, %[b], r8\n\t"
  47127. #endif
  47128. "stm %[r]!, {r3}\n\t"
  47129. "mov r5, #0\n\t"
  47130. /* A[25] * B */
  47131. "ldm %[a]!, {r8}\n\t"
  47132. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47133. "lsl r6, %[b], #16\n\t"
  47134. "lsl r7, r8, #16\n\t"
  47135. "lsr r6, r6, #16\n\t"
  47136. "lsr r7, r7, #16\n\t"
  47137. "mul r7, r6, r7\n\t"
  47138. "adds r4, r4, r7\n\t"
  47139. "adc r5, r5, #0\n\t"
  47140. "lsr r7, r8, #16\n\t"
  47141. "mul r6, r7, r6\n\t"
  47142. "lsr r7, r6, #16\n\t"
  47143. "lsl r6, r6, #16\n\t"
  47144. "adds r4, r4, r6\n\t"
  47145. "adc r5, r5, r7\n\t"
  47146. "lsr r6, %[b], #16\n\t"
  47147. "lsr r7, r8, #16\n\t"
  47148. "mul r7, r6, r7\n\t"
  47149. "add r5, r5, r7\n\t"
  47150. "lsl r7, r8, #16\n\t"
  47151. "lsr r7, r7, #16\n\t"
  47152. "mul r6, r7, r6\n\t"
  47153. "lsr r7, r6, #16\n\t"
  47154. "lsl r6, r6, #16\n\t"
  47155. "adds r4, r4, r6\n\t"
  47156. "adc r5, r5, r7\n\t"
  47157. #else
  47158. "umlal r4, r5, %[b], r8\n\t"
  47159. #endif
  47160. "stm %[r]!, {r4}\n\t"
  47161. "mov r3, #0\n\t"
  47162. /* A[26] * B */
  47163. "ldm %[a]!, {r8}\n\t"
  47164. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47165. "lsl r6, %[b], #16\n\t"
  47166. "lsl r7, r8, #16\n\t"
  47167. "lsr r6, r6, #16\n\t"
  47168. "lsr r7, r7, #16\n\t"
  47169. "mul r7, r6, r7\n\t"
  47170. "adds r5, r5, r7\n\t"
  47171. "adc r3, r3, #0\n\t"
  47172. "lsr r7, r8, #16\n\t"
  47173. "mul r6, r7, r6\n\t"
  47174. "lsr r7, r6, #16\n\t"
  47175. "lsl r6, r6, #16\n\t"
  47176. "adds r5, r5, r6\n\t"
  47177. "adc r3, r3, r7\n\t"
  47178. "lsr r6, %[b], #16\n\t"
  47179. "lsr r7, r8, #16\n\t"
  47180. "mul r7, r6, r7\n\t"
  47181. "add r3, r3, r7\n\t"
  47182. "lsl r7, r8, #16\n\t"
  47183. "lsr r7, r7, #16\n\t"
  47184. "mul r6, r7, r6\n\t"
  47185. "lsr r7, r6, #16\n\t"
  47186. "lsl r6, r6, #16\n\t"
  47187. "adds r5, r5, r6\n\t"
  47188. "adc r3, r3, r7\n\t"
  47189. #else
  47190. "umlal r5, r3, %[b], r8\n\t"
  47191. #endif
  47192. "stm %[r]!, {r5}\n\t"
  47193. "mov r4, #0\n\t"
  47194. /* A[27] * B */
  47195. "ldm %[a]!, {r8}\n\t"
  47196. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47197. "lsl r6, %[b], #16\n\t"
  47198. "lsl r7, r8, #16\n\t"
  47199. "lsr r6, r6, #16\n\t"
  47200. "lsr r7, r7, #16\n\t"
  47201. "mul r7, r6, r7\n\t"
  47202. "adds r3, r3, r7\n\t"
  47203. "adc r4, r4, #0\n\t"
  47204. "lsr r7, r8, #16\n\t"
  47205. "mul r6, r7, r6\n\t"
  47206. "lsr r7, r6, #16\n\t"
  47207. "lsl r6, r6, #16\n\t"
  47208. "adds r3, r3, r6\n\t"
  47209. "adc r4, r4, r7\n\t"
  47210. "lsr r6, %[b], #16\n\t"
  47211. "lsr r7, r8, #16\n\t"
  47212. "mul r7, r6, r7\n\t"
  47213. "add r4, r4, r7\n\t"
  47214. "lsl r7, r8, #16\n\t"
  47215. "lsr r7, r7, #16\n\t"
  47216. "mul r6, r7, r6\n\t"
  47217. "lsr r7, r6, #16\n\t"
  47218. "lsl r6, r6, #16\n\t"
  47219. "adds r3, r3, r6\n\t"
  47220. "adc r4, r4, r7\n\t"
  47221. #else
  47222. "umlal r3, r4, %[b], r8\n\t"
  47223. #endif
  47224. "stm %[r]!, {r3}\n\t"
  47225. "mov r5, #0\n\t"
  47226. /* A[28] * B */
  47227. "ldm %[a]!, {r8}\n\t"
  47228. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47229. "lsl r6, %[b], #16\n\t"
  47230. "lsl r7, r8, #16\n\t"
  47231. "lsr r6, r6, #16\n\t"
  47232. "lsr r7, r7, #16\n\t"
  47233. "mul r7, r6, r7\n\t"
  47234. "adds r4, r4, r7\n\t"
  47235. "adc r5, r5, #0\n\t"
  47236. "lsr r7, r8, #16\n\t"
  47237. "mul r6, r7, r6\n\t"
  47238. "lsr r7, r6, #16\n\t"
  47239. "lsl r6, r6, #16\n\t"
  47240. "adds r4, r4, r6\n\t"
  47241. "adc r5, r5, r7\n\t"
  47242. "lsr r6, %[b], #16\n\t"
  47243. "lsr r7, r8, #16\n\t"
  47244. "mul r7, r6, r7\n\t"
  47245. "add r5, r5, r7\n\t"
  47246. "lsl r7, r8, #16\n\t"
  47247. "lsr r7, r7, #16\n\t"
  47248. "mul r6, r7, r6\n\t"
  47249. "lsr r7, r6, #16\n\t"
  47250. "lsl r6, r6, #16\n\t"
  47251. "adds r4, r4, r6\n\t"
  47252. "adc r5, r5, r7\n\t"
  47253. #else
  47254. "umlal r4, r5, %[b], r8\n\t"
  47255. #endif
  47256. "stm %[r]!, {r4}\n\t"
  47257. "mov r3, #0\n\t"
  47258. /* A[29] * B */
  47259. "ldm %[a]!, {r8}\n\t"
  47260. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47261. "lsl r6, %[b], #16\n\t"
  47262. "lsl r7, r8, #16\n\t"
  47263. "lsr r6, r6, #16\n\t"
  47264. "lsr r7, r7, #16\n\t"
  47265. "mul r7, r6, r7\n\t"
  47266. "adds r5, r5, r7\n\t"
  47267. "adc r3, r3, #0\n\t"
  47268. "lsr r7, r8, #16\n\t"
  47269. "mul r6, r7, r6\n\t"
  47270. "lsr r7, r6, #16\n\t"
  47271. "lsl r6, r6, #16\n\t"
  47272. "adds r5, r5, r6\n\t"
  47273. "adc r3, r3, r7\n\t"
  47274. "lsr r6, %[b], #16\n\t"
  47275. "lsr r7, r8, #16\n\t"
  47276. "mul r7, r6, r7\n\t"
  47277. "add r3, r3, r7\n\t"
  47278. "lsl r7, r8, #16\n\t"
  47279. "lsr r7, r7, #16\n\t"
  47280. "mul r6, r7, r6\n\t"
  47281. "lsr r7, r6, #16\n\t"
  47282. "lsl r6, r6, #16\n\t"
  47283. "adds r5, r5, r6\n\t"
  47284. "adc r3, r3, r7\n\t"
  47285. #else
  47286. "umlal r5, r3, %[b], r8\n\t"
  47287. #endif
  47288. "stm %[r]!, {r5}\n\t"
  47289. "mov r4, #0\n\t"
  47290. /* A[30] * B */
  47291. "ldm %[a]!, {r8}\n\t"
  47292. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47293. "lsl r6, %[b], #16\n\t"
  47294. "lsl r7, r8, #16\n\t"
  47295. "lsr r6, r6, #16\n\t"
  47296. "lsr r7, r7, #16\n\t"
  47297. "mul r7, r6, r7\n\t"
  47298. "adds r3, r3, r7\n\t"
  47299. "adc r4, r4, #0\n\t"
  47300. "lsr r7, r8, #16\n\t"
  47301. "mul r6, r7, r6\n\t"
  47302. "lsr r7, r6, #16\n\t"
  47303. "lsl r6, r6, #16\n\t"
  47304. "adds r3, r3, r6\n\t"
  47305. "adc r4, r4, r7\n\t"
  47306. "lsr r6, %[b], #16\n\t"
  47307. "lsr r7, r8, #16\n\t"
  47308. "mul r7, r6, r7\n\t"
  47309. "add r4, r4, r7\n\t"
  47310. "lsl r7, r8, #16\n\t"
  47311. "lsr r7, r7, #16\n\t"
  47312. "mul r6, r7, r6\n\t"
  47313. "lsr r7, r6, #16\n\t"
  47314. "lsl r6, r6, #16\n\t"
  47315. "adds r3, r3, r6\n\t"
  47316. "adc r4, r4, r7\n\t"
  47317. #else
  47318. "umlal r3, r4, %[b], r8\n\t"
  47319. #endif
  47320. "stm %[r]!, {r3}\n\t"
  47321. "mov r5, #0\n\t"
  47322. /* A[31] * B */
  47323. "ldm %[a]!, {r8}\n\t"
  47324. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47325. "lsl r6, %[b], #16\n\t"
  47326. "lsl r7, r8, #16\n\t"
  47327. "lsr r6, r6, #16\n\t"
  47328. "lsr r7, r7, #16\n\t"
  47329. "mul r7, r6, r7\n\t"
  47330. "adds r4, r4, r7\n\t"
  47331. "adc r5, r5, #0\n\t"
  47332. "lsr r7, r8, #16\n\t"
  47333. "mul r6, r7, r6\n\t"
  47334. "lsr r7, r6, #16\n\t"
  47335. "lsl r6, r6, #16\n\t"
  47336. "adds r4, r4, r6\n\t"
  47337. "adc r5, r5, r7\n\t"
  47338. "lsr r6, %[b], #16\n\t"
  47339. "lsr r7, r8, #16\n\t"
  47340. "mul r7, r6, r7\n\t"
  47341. "add r5, r5, r7\n\t"
  47342. "lsl r7, r8, #16\n\t"
  47343. "lsr r7, r7, #16\n\t"
  47344. "mul r6, r7, r6\n\t"
  47345. "lsr r7, r6, #16\n\t"
  47346. "lsl r6, r6, #16\n\t"
  47347. "adds r4, r4, r6\n\t"
  47348. "adc r5, r5, r7\n\t"
  47349. #else
  47350. "umlal r4, r5, %[b], r8\n\t"
  47351. #endif
  47352. "stm %[r]!, {r4}\n\t"
  47353. "mov r3, #0\n\t"
  47354. /* A[32] * B */
  47355. "ldm %[a]!, {r8}\n\t"
  47356. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47357. "lsl r6, %[b], #16\n\t"
  47358. "lsl r7, r8, #16\n\t"
  47359. "lsr r6, r6, #16\n\t"
  47360. "lsr r7, r7, #16\n\t"
  47361. "mul r7, r6, r7\n\t"
  47362. "adds r5, r5, r7\n\t"
  47363. "adc r3, r3, #0\n\t"
  47364. "lsr r7, r8, #16\n\t"
  47365. "mul r6, r7, r6\n\t"
  47366. "lsr r7, r6, #16\n\t"
  47367. "lsl r6, r6, #16\n\t"
  47368. "adds r5, r5, r6\n\t"
  47369. "adc r3, r3, r7\n\t"
  47370. "lsr r6, %[b], #16\n\t"
  47371. "lsr r7, r8, #16\n\t"
  47372. "mul r7, r6, r7\n\t"
  47373. "add r3, r3, r7\n\t"
  47374. "lsl r7, r8, #16\n\t"
  47375. "lsr r7, r7, #16\n\t"
  47376. "mul r6, r7, r6\n\t"
  47377. "lsr r7, r6, #16\n\t"
  47378. "lsl r6, r6, #16\n\t"
  47379. "adds r5, r5, r6\n\t"
  47380. "adc r3, r3, r7\n\t"
  47381. #else
  47382. "umlal r5, r3, %[b], r8\n\t"
  47383. #endif
  47384. "stm %[r]!, {r5}\n\t"
  47385. "mov r4, #0\n\t"
  47386. /* A[33] * B */
  47387. "ldm %[a]!, {r8}\n\t"
  47388. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47389. "lsl r6, %[b], #16\n\t"
  47390. "lsl r7, r8, #16\n\t"
  47391. "lsr r6, r6, #16\n\t"
  47392. "lsr r7, r7, #16\n\t"
  47393. "mul r7, r6, r7\n\t"
  47394. "adds r3, r3, r7\n\t"
  47395. "adc r4, r4, #0\n\t"
  47396. "lsr r7, r8, #16\n\t"
  47397. "mul r6, r7, r6\n\t"
  47398. "lsr r7, r6, #16\n\t"
  47399. "lsl r6, r6, #16\n\t"
  47400. "adds r3, r3, r6\n\t"
  47401. "adc r4, r4, r7\n\t"
  47402. "lsr r6, %[b], #16\n\t"
  47403. "lsr r7, r8, #16\n\t"
  47404. "mul r7, r6, r7\n\t"
  47405. "add r4, r4, r7\n\t"
  47406. "lsl r7, r8, #16\n\t"
  47407. "lsr r7, r7, #16\n\t"
  47408. "mul r6, r7, r6\n\t"
  47409. "lsr r7, r6, #16\n\t"
  47410. "lsl r6, r6, #16\n\t"
  47411. "adds r3, r3, r6\n\t"
  47412. "adc r4, r4, r7\n\t"
  47413. #else
  47414. "umlal r3, r4, %[b], r8\n\t"
  47415. #endif
  47416. "stm %[r]!, {r3}\n\t"
  47417. "mov r5, #0\n\t"
  47418. /* A[34] * B */
  47419. "ldm %[a]!, {r8}\n\t"
  47420. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47421. "lsl r6, %[b], #16\n\t"
  47422. "lsl r7, r8, #16\n\t"
  47423. "lsr r6, r6, #16\n\t"
  47424. "lsr r7, r7, #16\n\t"
  47425. "mul r7, r6, r7\n\t"
  47426. "adds r4, r4, r7\n\t"
  47427. "adc r5, r5, #0\n\t"
  47428. "lsr r7, r8, #16\n\t"
  47429. "mul r6, r7, r6\n\t"
  47430. "lsr r7, r6, #16\n\t"
  47431. "lsl r6, r6, #16\n\t"
  47432. "adds r4, r4, r6\n\t"
  47433. "adc r5, r5, r7\n\t"
  47434. "lsr r6, %[b], #16\n\t"
  47435. "lsr r7, r8, #16\n\t"
  47436. "mul r7, r6, r7\n\t"
  47437. "add r5, r5, r7\n\t"
  47438. "lsl r7, r8, #16\n\t"
  47439. "lsr r7, r7, #16\n\t"
  47440. "mul r6, r7, r6\n\t"
  47441. "lsr r7, r6, #16\n\t"
  47442. "lsl r6, r6, #16\n\t"
  47443. "adds r4, r4, r6\n\t"
  47444. "adc r5, r5, r7\n\t"
  47445. #else
  47446. "umlal r4, r5, %[b], r8\n\t"
  47447. #endif
  47448. "stm %[r]!, {r4}\n\t"
  47449. "mov r3, #0\n\t"
  47450. /* A[35] * B */
  47451. "ldm %[a]!, {r8}\n\t"
  47452. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47453. "lsl r6, %[b], #16\n\t"
  47454. "lsl r7, r8, #16\n\t"
  47455. "lsr r6, r6, #16\n\t"
  47456. "lsr r7, r7, #16\n\t"
  47457. "mul r7, r6, r7\n\t"
  47458. "adds r5, r5, r7\n\t"
  47459. "adc r3, r3, #0\n\t"
  47460. "lsr r7, r8, #16\n\t"
  47461. "mul r6, r7, r6\n\t"
  47462. "lsr r7, r6, #16\n\t"
  47463. "lsl r6, r6, #16\n\t"
  47464. "adds r5, r5, r6\n\t"
  47465. "adc r3, r3, r7\n\t"
  47466. "lsr r6, %[b], #16\n\t"
  47467. "lsr r7, r8, #16\n\t"
  47468. "mul r7, r6, r7\n\t"
  47469. "add r3, r3, r7\n\t"
  47470. "lsl r7, r8, #16\n\t"
  47471. "lsr r7, r7, #16\n\t"
  47472. "mul r6, r7, r6\n\t"
  47473. "lsr r7, r6, #16\n\t"
  47474. "lsl r6, r6, #16\n\t"
  47475. "adds r5, r5, r6\n\t"
  47476. "adc r3, r3, r7\n\t"
  47477. #else
  47478. "umlal r5, r3, %[b], r8\n\t"
  47479. #endif
  47480. "stm %[r]!, {r5}\n\t"
  47481. "mov r4, #0\n\t"
  47482. /* A[36] * B */
  47483. "ldm %[a]!, {r8}\n\t"
  47484. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47485. "lsl r6, %[b], #16\n\t"
  47486. "lsl r7, r8, #16\n\t"
  47487. "lsr r6, r6, #16\n\t"
  47488. "lsr r7, r7, #16\n\t"
  47489. "mul r7, r6, r7\n\t"
  47490. "adds r3, r3, r7\n\t"
  47491. "adc r4, r4, #0\n\t"
  47492. "lsr r7, r8, #16\n\t"
  47493. "mul r6, r7, r6\n\t"
  47494. "lsr r7, r6, #16\n\t"
  47495. "lsl r6, r6, #16\n\t"
  47496. "adds r3, r3, r6\n\t"
  47497. "adc r4, r4, r7\n\t"
  47498. "lsr r6, %[b], #16\n\t"
  47499. "lsr r7, r8, #16\n\t"
  47500. "mul r7, r6, r7\n\t"
  47501. "add r4, r4, r7\n\t"
  47502. "lsl r7, r8, #16\n\t"
  47503. "lsr r7, r7, #16\n\t"
  47504. "mul r6, r7, r6\n\t"
  47505. "lsr r7, r6, #16\n\t"
  47506. "lsl r6, r6, #16\n\t"
  47507. "adds r3, r3, r6\n\t"
  47508. "adc r4, r4, r7\n\t"
  47509. #else
  47510. "umlal r3, r4, %[b], r8\n\t"
  47511. #endif
  47512. "stm %[r]!, {r3}\n\t"
  47513. "mov r5, #0\n\t"
  47514. /* A[37] * B */
  47515. "ldm %[a]!, {r8}\n\t"
  47516. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47517. "lsl r6, %[b], #16\n\t"
  47518. "lsl r7, r8, #16\n\t"
  47519. "lsr r6, r6, #16\n\t"
  47520. "lsr r7, r7, #16\n\t"
  47521. "mul r7, r6, r7\n\t"
  47522. "adds r4, r4, r7\n\t"
  47523. "adc r5, r5, #0\n\t"
  47524. "lsr r7, r8, #16\n\t"
  47525. "mul r6, r7, r6\n\t"
  47526. "lsr r7, r6, #16\n\t"
  47527. "lsl r6, r6, #16\n\t"
  47528. "adds r4, r4, r6\n\t"
  47529. "adc r5, r5, r7\n\t"
  47530. "lsr r6, %[b], #16\n\t"
  47531. "lsr r7, r8, #16\n\t"
  47532. "mul r7, r6, r7\n\t"
  47533. "add r5, r5, r7\n\t"
  47534. "lsl r7, r8, #16\n\t"
  47535. "lsr r7, r7, #16\n\t"
  47536. "mul r6, r7, r6\n\t"
  47537. "lsr r7, r6, #16\n\t"
  47538. "lsl r6, r6, #16\n\t"
  47539. "adds r4, r4, r6\n\t"
  47540. "adc r5, r5, r7\n\t"
  47541. #else
  47542. "umlal r4, r5, %[b], r8\n\t"
  47543. #endif
  47544. "stm %[r]!, {r4}\n\t"
  47545. "mov r3, #0\n\t"
  47546. /* A[38] * B */
  47547. "ldm %[a]!, {r8}\n\t"
  47548. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47549. "lsl r6, %[b], #16\n\t"
  47550. "lsl r7, r8, #16\n\t"
  47551. "lsr r6, r6, #16\n\t"
  47552. "lsr r7, r7, #16\n\t"
  47553. "mul r7, r6, r7\n\t"
  47554. "adds r5, r5, r7\n\t"
  47555. "adc r3, r3, #0\n\t"
  47556. "lsr r7, r8, #16\n\t"
  47557. "mul r6, r7, r6\n\t"
  47558. "lsr r7, r6, #16\n\t"
  47559. "lsl r6, r6, #16\n\t"
  47560. "adds r5, r5, r6\n\t"
  47561. "adc r3, r3, r7\n\t"
  47562. "lsr r6, %[b], #16\n\t"
  47563. "lsr r7, r8, #16\n\t"
  47564. "mul r7, r6, r7\n\t"
  47565. "add r3, r3, r7\n\t"
  47566. "lsl r7, r8, #16\n\t"
  47567. "lsr r7, r7, #16\n\t"
  47568. "mul r6, r7, r6\n\t"
  47569. "lsr r7, r6, #16\n\t"
  47570. "lsl r6, r6, #16\n\t"
  47571. "adds r5, r5, r6\n\t"
  47572. "adc r3, r3, r7\n\t"
  47573. #else
  47574. "umlal r5, r3, %[b], r8\n\t"
  47575. #endif
  47576. "stm %[r]!, {r5}\n\t"
  47577. "mov r4, #0\n\t"
  47578. /* A[39] * B */
  47579. "ldm %[a]!, {r8}\n\t"
  47580. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47581. "lsl r6, %[b], #16\n\t"
  47582. "lsl r7, r8, #16\n\t"
  47583. "lsr r6, r6, #16\n\t"
  47584. "lsr r7, r7, #16\n\t"
  47585. "mul r7, r6, r7\n\t"
  47586. "adds r3, r3, r7\n\t"
  47587. "adc r4, r4, #0\n\t"
  47588. "lsr r7, r8, #16\n\t"
  47589. "mul r6, r7, r6\n\t"
  47590. "lsr r7, r6, #16\n\t"
  47591. "lsl r6, r6, #16\n\t"
  47592. "adds r3, r3, r6\n\t"
  47593. "adc r4, r4, r7\n\t"
  47594. "lsr r6, %[b], #16\n\t"
  47595. "lsr r7, r8, #16\n\t"
  47596. "mul r7, r6, r7\n\t"
  47597. "add r4, r4, r7\n\t"
  47598. "lsl r7, r8, #16\n\t"
  47599. "lsr r7, r7, #16\n\t"
  47600. "mul r6, r7, r6\n\t"
  47601. "lsr r7, r6, #16\n\t"
  47602. "lsl r6, r6, #16\n\t"
  47603. "adds r3, r3, r6\n\t"
  47604. "adc r4, r4, r7\n\t"
  47605. #else
  47606. "umlal r3, r4, %[b], r8\n\t"
  47607. #endif
  47608. "stm %[r]!, {r3}\n\t"
  47609. "mov r5, #0\n\t"
  47610. /* A[40] * B */
  47611. "ldm %[a]!, {r8}\n\t"
  47612. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47613. "lsl r6, %[b], #16\n\t"
  47614. "lsl r7, r8, #16\n\t"
  47615. "lsr r6, r6, #16\n\t"
  47616. "lsr r7, r7, #16\n\t"
  47617. "mul r7, r6, r7\n\t"
  47618. "adds r4, r4, r7\n\t"
  47619. "adc r5, r5, #0\n\t"
  47620. "lsr r7, r8, #16\n\t"
  47621. "mul r6, r7, r6\n\t"
  47622. "lsr r7, r6, #16\n\t"
  47623. "lsl r6, r6, #16\n\t"
  47624. "adds r4, r4, r6\n\t"
  47625. "adc r5, r5, r7\n\t"
  47626. "lsr r6, %[b], #16\n\t"
  47627. "lsr r7, r8, #16\n\t"
  47628. "mul r7, r6, r7\n\t"
  47629. "add r5, r5, r7\n\t"
  47630. "lsl r7, r8, #16\n\t"
  47631. "lsr r7, r7, #16\n\t"
  47632. "mul r6, r7, r6\n\t"
  47633. "lsr r7, r6, #16\n\t"
  47634. "lsl r6, r6, #16\n\t"
  47635. "adds r4, r4, r6\n\t"
  47636. "adc r5, r5, r7\n\t"
  47637. #else
  47638. "umlal r4, r5, %[b], r8\n\t"
  47639. #endif
  47640. "stm %[r]!, {r4}\n\t"
  47641. "mov r3, #0\n\t"
  47642. /* A[41] * B */
  47643. "ldm %[a]!, {r8}\n\t"
  47644. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47645. "lsl r6, %[b], #16\n\t"
  47646. "lsl r7, r8, #16\n\t"
  47647. "lsr r6, r6, #16\n\t"
  47648. "lsr r7, r7, #16\n\t"
  47649. "mul r7, r6, r7\n\t"
  47650. "adds r5, r5, r7\n\t"
  47651. "adc r3, r3, #0\n\t"
  47652. "lsr r7, r8, #16\n\t"
  47653. "mul r6, r7, r6\n\t"
  47654. "lsr r7, r6, #16\n\t"
  47655. "lsl r6, r6, #16\n\t"
  47656. "adds r5, r5, r6\n\t"
  47657. "adc r3, r3, r7\n\t"
  47658. "lsr r6, %[b], #16\n\t"
  47659. "lsr r7, r8, #16\n\t"
  47660. "mul r7, r6, r7\n\t"
  47661. "add r3, r3, r7\n\t"
  47662. "lsl r7, r8, #16\n\t"
  47663. "lsr r7, r7, #16\n\t"
  47664. "mul r6, r7, r6\n\t"
  47665. "lsr r7, r6, #16\n\t"
  47666. "lsl r6, r6, #16\n\t"
  47667. "adds r5, r5, r6\n\t"
  47668. "adc r3, r3, r7\n\t"
  47669. #else
  47670. "umlal r5, r3, %[b], r8\n\t"
  47671. #endif
  47672. "stm %[r]!, {r5}\n\t"
  47673. "mov r4, #0\n\t"
  47674. /* A[42] * B */
  47675. "ldm %[a]!, {r8}\n\t"
  47676. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47677. "lsl r6, %[b], #16\n\t"
  47678. "lsl r7, r8, #16\n\t"
  47679. "lsr r6, r6, #16\n\t"
  47680. "lsr r7, r7, #16\n\t"
  47681. "mul r7, r6, r7\n\t"
  47682. "adds r3, r3, r7\n\t"
  47683. "adc r4, r4, #0\n\t"
  47684. "lsr r7, r8, #16\n\t"
  47685. "mul r6, r7, r6\n\t"
  47686. "lsr r7, r6, #16\n\t"
  47687. "lsl r6, r6, #16\n\t"
  47688. "adds r3, r3, r6\n\t"
  47689. "adc r4, r4, r7\n\t"
  47690. "lsr r6, %[b], #16\n\t"
  47691. "lsr r7, r8, #16\n\t"
  47692. "mul r7, r6, r7\n\t"
  47693. "add r4, r4, r7\n\t"
  47694. "lsl r7, r8, #16\n\t"
  47695. "lsr r7, r7, #16\n\t"
  47696. "mul r6, r7, r6\n\t"
  47697. "lsr r7, r6, #16\n\t"
  47698. "lsl r6, r6, #16\n\t"
  47699. "adds r3, r3, r6\n\t"
  47700. "adc r4, r4, r7\n\t"
  47701. #else
  47702. "umlal r3, r4, %[b], r8\n\t"
  47703. #endif
  47704. "stm %[r]!, {r3}\n\t"
  47705. "mov r5, #0\n\t"
  47706. /* A[43] * B */
  47707. "ldm %[a]!, {r8}\n\t"
  47708. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47709. "lsl r6, %[b], #16\n\t"
  47710. "lsl r7, r8, #16\n\t"
  47711. "lsr r6, r6, #16\n\t"
  47712. "lsr r7, r7, #16\n\t"
  47713. "mul r7, r6, r7\n\t"
  47714. "adds r4, r4, r7\n\t"
  47715. "adc r5, r5, #0\n\t"
  47716. "lsr r7, r8, #16\n\t"
  47717. "mul r6, r7, r6\n\t"
  47718. "lsr r7, r6, #16\n\t"
  47719. "lsl r6, r6, #16\n\t"
  47720. "adds r4, r4, r6\n\t"
  47721. "adc r5, r5, r7\n\t"
  47722. "lsr r6, %[b], #16\n\t"
  47723. "lsr r7, r8, #16\n\t"
  47724. "mul r7, r6, r7\n\t"
  47725. "add r5, r5, r7\n\t"
  47726. "lsl r7, r8, #16\n\t"
  47727. "lsr r7, r7, #16\n\t"
  47728. "mul r6, r7, r6\n\t"
  47729. "lsr r7, r6, #16\n\t"
  47730. "lsl r6, r6, #16\n\t"
  47731. "adds r4, r4, r6\n\t"
  47732. "adc r5, r5, r7\n\t"
  47733. #else
  47734. "umlal r4, r5, %[b], r8\n\t"
  47735. #endif
  47736. "stm %[r]!, {r4}\n\t"
  47737. "mov r3, #0\n\t"
  47738. /* A[44] * B */
  47739. "ldm %[a]!, {r8}\n\t"
  47740. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47741. "lsl r6, %[b], #16\n\t"
  47742. "lsl r7, r8, #16\n\t"
  47743. "lsr r6, r6, #16\n\t"
  47744. "lsr r7, r7, #16\n\t"
  47745. "mul r7, r6, r7\n\t"
  47746. "adds r5, r5, r7\n\t"
  47747. "adc r3, r3, #0\n\t"
  47748. "lsr r7, r8, #16\n\t"
  47749. "mul r6, r7, r6\n\t"
  47750. "lsr r7, r6, #16\n\t"
  47751. "lsl r6, r6, #16\n\t"
  47752. "adds r5, r5, r6\n\t"
  47753. "adc r3, r3, r7\n\t"
  47754. "lsr r6, %[b], #16\n\t"
  47755. "lsr r7, r8, #16\n\t"
  47756. "mul r7, r6, r7\n\t"
  47757. "add r3, r3, r7\n\t"
  47758. "lsl r7, r8, #16\n\t"
  47759. "lsr r7, r7, #16\n\t"
  47760. "mul r6, r7, r6\n\t"
  47761. "lsr r7, r6, #16\n\t"
  47762. "lsl r6, r6, #16\n\t"
  47763. "adds r5, r5, r6\n\t"
  47764. "adc r3, r3, r7\n\t"
  47765. #else
  47766. "umlal r5, r3, %[b], r8\n\t"
  47767. #endif
  47768. "stm %[r]!, {r5}\n\t"
  47769. "mov r4, #0\n\t"
  47770. /* A[45] * B */
  47771. "ldm %[a]!, {r8}\n\t"
  47772. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47773. "lsl r6, %[b], #16\n\t"
  47774. "lsl r7, r8, #16\n\t"
  47775. "lsr r6, r6, #16\n\t"
  47776. "lsr r7, r7, #16\n\t"
  47777. "mul r7, r6, r7\n\t"
  47778. "adds r3, r3, r7\n\t"
  47779. "adc r4, r4, #0\n\t"
  47780. "lsr r7, r8, #16\n\t"
  47781. "mul r6, r7, r6\n\t"
  47782. "lsr r7, r6, #16\n\t"
  47783. "lsl r6, r6, #16\n\t"
  47784. "adds r3, r3, r6\n\t"
  47785. "adc r4, r4, r7\n\t"
  47786. "lsr r6, %[b], #16\n\t"
  47787. "lsr r7, r8, #16\n\t"
  47788. "mul r7, r6, r7\n\t"
  47789. "add r4, r4, r7\n\t"
  47790. "lsl r7, r8, #16\n\t"
  47791. "lsr r7, r7, #16\n\t"
  47792. "mul r6, r7, r6\n\t"
  47793. "lsr r7, r6, #16\n\t"
  47794. "lsl r6, r6, #16\n\t"
  47795. "adds r3, r3, r6\n\t"
  47796. "adc r4, r4, r7\n\t"
  47797. #else
  47798. "umlal r3, r4, %[b], r8\n\t"
  47799. #endif
  47800. "stm %[r]!, {r3}\n\t"
  47801. "mov r5, #0\n\t"
  47802. /* A[46] * B */
  47803. "ldm %[a]!, {r8}\n\t"
  47804. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47805. "lsl r6, %[b], #16\n\t"
  47806. "lsl r7, r8, #16\n\t"
  47807. "lsr r6, r6, #16\n\t"
  47808. "lsr r7, r7, #16\n\t"
  47809. "mul r7, r6, r7\n\t"
  47810. "adds r4, r4, r7\n\t"
  47811. "adc r5, r5, #0\n\t"
  47812. "lsr r7, r8, #16\n\t"
  47813. "mul r6, r7, r6\n\t"
  47814. "lsr r7, r6, #16\n\t"
  47815. "lsl r6, r6, #16\n\t"
  47816. "adds r4, r4, r6\n\t"
  47817. "adc r5, r5, r7\n\t"
  47818. "lsr r6, %[b], #16\n\t"
  47819. "lsr r7, r8, #16\n\t"
  47820. "mul r7, r6, r7\n\t"
  47821. "add r5, r5, r7\n\t"
  47822. "lsl r7, r8, #16\n\t"
  47823. "lsr r7, r7, #16\n\t"
  47824. "mul r6, r7, r6\n\t"
  47825. "lsr r7, r6, #16\n\t"
  47826. "lsl r6, r6, #16\n\t"
  47827. "adds r4, r4, r6\n\t"
  47828. "adc r5, r5, r7\n\t"
  47829. #else
  47830. "umlal r4, r5, %[b], r8\n\t"
  47831. #endif
  47832. "stm %[r]!, {r4}\n\t"
  47833. "mov r3, #0\n\t"
  47834. /* A[47] * B */
  47835. "ldm %[a]!, {r8}\n\t"
  47836. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47837. "lsl r6, %[b], #16\n\t"
  47838. "lsl r7, r8, #16\n\t"
  47839. "lsr r6, r6, #16\n\t"
  47840. "lsr r7, r7, #16\n\t"
  47841. "mul r7, r6, r7\n\t"
  47842. "adds r5, r5, r7\n\t"
  47843. "adc r3, r3, #0\n\t"
  47844. "lsr r7, r8, #16\n\t"
  47845. "mul r6, r7, r6\n\t"
  47846. "lsr r7, r6, #16\n\t"
  47847. "lsl r6, r6, #16\n\t"
  47848. "adds r5, r5, r6\n\t"
  47849. "adc r3, r3, r7\n\t"
  47850. "lsr r6, %[b], #16\n\t"
  47851. "lsr r7, r8, #16\n\t"
  47852. "mul r7, r6, r7\n\t"
  47853. "add r3, r3, r7\n\t"
  47854. "lsl r7, r8, #16\n\t"
  47855. "lsr r7, r7, #16\n\t"
  47856. "mul r6, r7, r6\n\t"
  47857. "lsr r7, r6, #16\n\t"
  47858. "lsl r6, r6, #16\n\t"
  47859. "adds r5, r5, r6\n\t"
  47860. "adc r3, r3, r7\n\t"
  47861. #else
  47862. "umlal r5, r3, %[b], r8\n\t"
  47863. #endif
  47864. "stm %[r]!, {r5}\n\t"
  47865. "mov r4, #0\n\t"
  47866. /* A[48] * B */
  47867. "ldm %[a]!, {r8}\n\t"
  47868. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47869. "lsl r6, %[b], #16\n\t"
  47870. "lsl r7, r8, #16\n\t"
  47871. "lsr r6, r6, #16\n\t"
  47872. "lsr r7, r7, #16\n\t"
  47873. "mul r7, r6, r7\n\t"
  47874. "adds r3, r3, r7\n\t"
  47875. "adc r4, r4, #0\n\t"
  47876. "lsr r7, r8, #16\n\t"
  47877. "mul r6, r7, r6\n\t"
  47878. "lsr r7, r6, #16\n\t"
  47879. "lsl r6, r6, #16\n\t"
  47880. "adds r3, r3, r6\n\t"
  47881. "adc r4, r4, r7\n\t"
  47882. "lsr r6, %[b], #16\n\t"
  47883. "lsr r7, r8, #16\n\t"
  47884. "mul r7, r6, r7\n\t"
  47885. "add r4, r4, r7\n\t"
  47886. "lsl r7, r8, #16\n\t"
  47887. "lsr r7, r7, #16\n\t"
  47888. "mul r6, r7, r6\n\t"
  47889. "lsr r7, r6, #16\n\t"
  47890. "lsl r6, r6, #16\n\t"
  47891. "adds r3, r3, r6\n\t"
  47892. "adc r4, r4, r7\n\t"
  47893. #else
  47894. "umlal r3, r4, %[b], r8\n\t"
  47895. #endif
  47896. "stm %[r]!, {r3}\n\t"
  47897. "mov r5, #0\n\t"
  47898. /* A[49] * B */
  47899. "ldm %[a]!, {r8}\n\t"
  47900. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47901. "lsl r6, %[b], #16\n\t"
  47902. "lsl r7, r8, #16\n\t"
  47903. "lsr r6, r6, #16\n\t"
  47904. "lsr r7, r7, #16\n\t"
  47905. "mul r7, r6, r7\n\t"
  47906. "adds r4, r4, r7\n\t"
  47907. "adc r5, r5, #0\n\t"
  47908. "lsr r7, r8, #16\n\t"
  47909. "mul r6, r7, r6\n\t"
  47910. "lsr r7, r6, #16\n\t"
  47911. "lsl r6, r6, #16\n\t"
  47912. "adds r4, r4, r6\n\t"
  47913. "adc r5, r5, r7\n\t"
  47914. "lsr r6, %[b], #16\n\t"
  47915. "lsr r7, r8, #16\n\t"
  47916. "mul r7, r6, r7\n\t"
  47917. "add r5, r5, r7\n\t"
  47918. "lsl r7, r8, #16\n\t"
  47919. "lsr r7, r7, #16\n\t"
  47920. "mul r6, r7, r6\n\t"
  47921. "lsr r7, r6, #16\n\t"
  47922. "lsl r6, r6, #16\n\t"
  47923. "adds r4, r4, r6\n\t"
  47924. "adc r5, r5, r7\n\t"
  47925. #else
  47926. "umlal r4, r5, %[b], r8\n\t"
  47927. #endif
  47928. "stm %[r]!, {r4}\n\t"
  47929. "mov r3, #0\n\t"
  47930. /* A[50] * B */
  47931. "ldm %[a]!, {r8}\n\t"
  47932. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47933. "lsl r6, %[b], #16\n\t"
  47934. "lsl r7, r8, #16\n\t"
  47935. "lsr r6, r6, #16\n\t"
  47936. "lsr r7, r7, #16\n\t"
  47937. "mul r7, r6, r7\n\t"
  47938. "adds r5, r5, r7\n\t"
  47939. "adc r3, r3, #0\n\t"
  47940. "lsr r7, r8, #16\n\t"
  47941. "mul r6, r7, r6\n\t"
  47942. "lsr r7, r6, #16\n\t"
  47943. "lsl r6, r6, #16\n\t"
  47944. "adds r5, r5, r6\n\t"
  47945. "adc r3, r3, r7\n\t"
  47946. "lsr r6, %[b], #16\n\t"
  47947. "lsr r7, r8, #16\n\t"
  47948. "mul r7, r6, r7\n\t"
  47949. "add r3, r3, r7\n\t"
  47950. "lsl r7, r8, #16\n\t"
  47951. "lsr r7, r7, #16\n\t"
  47952. "mul r6, r7, r6\n\t"
  47953. "lsr r7, r6, #16\n\t"
  47954. "lsl r6, r6, #16\n\t"
  47955. "adds r5, r5, r6\n\t"
  47956. "adc r3, r3, r7\n\t"
  47957. #else
  47958. "umlal r5, r3, %[b], r8\n\t"
  47959. #endif
  47960. "stm %[r]!, {r5}\n\t"
  47961. "mov r4, #0\n\t"
  47962. /* A[51] * B */
  47963. "ldm %[a]!, {r8}\n\t"
  47964. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47965. "lsl r6, %[b], #16\n\t"
  47966. "lsl r7, r8, #16\n\t"
  47967. "lsr r6, r6, #16\n\t"
  47968. "lsr r7, r7, #16\n\t"
  47969. "mul r7, r6, r7\n\t"
  47970. "adds r3, r3, r7\n\t"
  47971. "adc r4, r4, #0\n\t"
  47972. "lsr r7, r8, #16\n\t"
  47973. "mul r6, r7, r6\n\t"
  47974. "lsr r7, r6, #16\n\t"
  47975. "lsl r6, r6, #16\n\t"
  47976. "adds r3, r3, r6\n\t"
  47977. "adc r4, r4, r7\n\t"
  47978. "lsr r6, %[b], #16\n\t"
  47979. "lsr r7, r8, #16\n\t"
  47980. "mul r7, r6, r7\n\t"
  47981. "add r4, r4, r7\n\t"
  47982. "lsl r7, r8, #16\n\t"
  47983. "lsr r7, r7, #16\n\t"
  47984. "mul r6, r7, r6\n\t"
  47985. "lsr r7, r6, #16\n\t"
  47986. "lsl r6, r6, #16\n\t"
  47987. "adds r3, r3, r6\n\t"
  47988. "adc r4, r4, r7\n\t"
  47989. #else
  47990. "umlal r3, r4, %[b], r8\n\t"
  47991. #endif
  47992. "stm %[r]!, {r3}\n\t"
  47993. "mov r5, #0\n\t"
  47994. /* A[52] * B */
  47995. "ldm %[a]!, {r8}\n\t"
  47996. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  47997. "lsl r6, %[b], #16\n\t"
  47998. "lsl r7, r8, #16\n\t"
  47999. "lsr r6, r6, #16\n\t"
  48000. "lsr r7, r7, #16\n\t"
  48001. "mul r7, r6, r7\n\t"
  48002. "adds r4, r4, r7\n\t"
  48003. "adc r5, r5, #0\n\t"
  48004. "lsr r7, r8, #16\n\t"
  48005. "mul r6, r7, r6\n\t"
  48006. "lsr r7, r6, #16\n\t"
  48007. "lsl r6, r6, #16\n\t"
  48008. "adds r4, r4, r6\n\t"
  48009. "adc r5, r5, r7\n\t"
  48010. "lsr r6, %[b], #16\n\t"
  48011. "lsr r7, r8, #16\n\t"
  48012. "mul r7, r6, r7\n\t"
  48013. "add r5, r5, r7\n\t"
  48014. "lsl r7, r8, #16\n\t"
  48015. "lsr r7, r7, #16\n\t"
  48016. "mul r6, r7, r6\n\t"
  48017. "lsr r7, r6, #16\n\t"
  48018. "lsl r6, r6, #16\n\t"
  48019. "adds r4, r4, r6\n\t"
  48020. "adc r5, r5, r7\n\t"
  48021. #else
  48022. "umlal r4, r5, %[b], r8\n\t"
  48023. #endif
  48024. "stm %[r]!, {r4}\n\t"
  48025. "mov r3, #0\n\t"
  48026. /* A[53] * B */
  48027. "ldm %[a]!, {r8}\n\t"
  48028. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48029. "lsl r6, %[b], #16\n\t"
  48030. "lsl r7, r8, #16\n\t"
  48031. "lsr r6, r6, #16\n\t"
  48032. "lsr r7, r7, #16\n\t"
  48033. "mul r7, r6, r7\n\t"
  48034. "adds r5, r5, r7\n\t"
  48035. "adc r3, r3, #0\n\t"
  48036. "lsr r7, r8, #16\n\t"
  48037. "mul r6, r7, r6\n\t"
  48038. "lsr r7, r6, #16\n\t"
  48039. "lsl r6, r6, #16\n\t"
  48040. "adds r5, r5, r6\n\t"
  48041. "adc r3, r3, r7\n\t"
  48042. "lsr r6, %[b], #16\n\t"
  48043. "lsr r7, r8, #16\n\t"
  48044. "mul r7, r6, r7\n\t"
  48045. "add r3, r3, r7\n\t"
  48046. "lsl r7, r8, #16\n\t"
  48047. "lsr r7, r7, #16\n\t"
  48048. "mul r6, r7, r6\n\t"
  48049. "lsr r7, r6, #16\n\t"
  48050. "lsl r6, r6, #16\n\t"
  48051. "adds r5, r5, r6\n\t"
  48052. "adc r3, r3, r7\n\t"
  48053. #else
  48054. "umlal r5, r3, %[b], r8\n\t"
  48055. #endif
  48056. "stm %[r]!, {r5}\n\t"
  48057. "mov r4, #0\n\t"
  48058. /* A[54] * B */
  48059. "ldm %[a]!, {r8}\n\t"
  48060. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48061. "lsl r6, %[b], #16\n\t"
  48062. "lsl r7, r8, #16\n\t"
  48063. "lsr r6, r6, #16\n\t"
  48064. "lsr r7, r7, #16\n\t"
  48065. "mul r7, r6, r7\n\t"
  48066. "adds r3, r3, r7\n\t"
  48067. "adc r4, r4, #0\n\t"
  48068. "lsr r7, r8, #16\n\t"
  48069. "mul r6, r7, r6\n\t"
  48070. "lsr r7, r6, #16\n\t"
  48071. "lsl r6, r6, #16\n\t"
  48072. "adds r3, r3, r6\n\t"
  48073. "adc r4, r4, r7\n\t"
  48074. "lsr r6, %[b], #16\n\t"
  48075. "lsr r7, r8, #16\n\t"
  48076. "mul r7, r6, r7\n\t"
  48077. "add r4, r4, r7\n\t"
  48078. "lsl r7, r8, #16\n\t"
  48079. "lsr r7, r7, #16\n\t"
  48080. "mul r6, r7, r6\n\t"
  48081. "lsr r7, r6, #16\n\t"
  48082. "lsl r6, r6, #16\n\t"
  48083. "adds r3, r3, r6\n\t"
  48084. "adc r4, r4, r7\n\t"
  48085. #else
  48086. "umlal r3, r4, %[b], r8\n\t"
  48087. #endif
  48088. "stm %[r]!, {r3}\n\t"
  48089. "mov r5, #0\n\t"
  48090. /* A[55] * B */
  48091. "ldm %[a]!, {r8}\n\t"
  48092. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48093. "lsl r6, %[b], #16\n\t"
  48094. "lsl r7, r8, #16\n\t"
  48095. "lsr r6, r6, #16\n\t"
  48096. "lsr r7, r7, #16\n\t"
  48097. "mul r7, r6, r7\n\t"
  48098. "adds r4, r4, r7\n\t"
  48099. "adc r5, r5, #0\n\t"
  48100. "lsr r7, r8, #16\n\t"
  48101. "mul r6, r7, r6\n\t"
  48102. "lsr r7, r6, #16\n\t"
  48103. "lsl r6, r6, #16\n\t"
  48104. "adds r4, r4, r6\n\t"
  48105. "adc r5, r5, r7\n\t"
  48106. "lsr r6, %[b], #16\n\t"
  48107. "lsr r7, r8, #16\n\t"
  48108. "mul r7, r6, r7\n\t"
  48109. "add r5, r5, r7\n\t"
  48110. "lsl r7, r8, #16\n\t"
  48111. "lsr r7, r7, #16\n\t"
  48112. "mul r6, r7, r6\n\t"
  48113. "lsr r7, r6, #16\n\t"
  48114. "lsl r6, r6, #16\n\t"
  48115. "adds r4, r4, r6\n\t"
  48116. "adc r5, r5, r7\n\t"
  48117. #else
  48118. "umlal r4, r5, %[b], r8\n\t"
  48119. #endif
  48120. "stm %[r]!, {r4}\n\t"
  48121. "mov r3, #0\n\t"
  48122. /* A[56] * B */
  48123. "ldm %[a]!, {r8}\n\t"
  48124. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48125. "lsl r6, %[b], #16\n\t"
  48126. "lsl r7, r8, #16\n\t"
  48127. "lsr r6, r6, #16\n\t"
  48128. "lsr r7, r7, #16\n\t"
  48129. "mul r7, r6, r7\n\t"
  48130. "adds r5, r5, r7\n\t"
  48131. "adc r3, r3, #0\n\t"
  48132. "lsr r7, r8, #16\n\t"
  48133. "mul r6, r7, r6\n\t"
  48134. "lsr r7, r6, #16\n\t"
  48135. "lsl r6, r6, #16\n\t"
  48136. "adds r5, r5, r6\n\t"
  48137. "adc r3, r3, r7\n\t"
  48138. "lsr r6, %[b], #16\n\t"
  48139. "lsr r7, r8, #16\n\t"
  48140. "mul r7, r6, r7\n\t"
  48141. "add r3, r3, r7\n\t"
  48142. "lsl r7, r8, #16\n\t"
  48143. "lsr r7, r7, #16\n\t"
  48144. "mul r6, r7, r6\n\t"
  48145. "lsr r7, r6, #16\n\t"
  48146. "lsl r6, r6, #16\n\t"
  48147. "adds r5, r5, r6\n\t"
  48148. "adc r3, r3, r7\n\t"
  48149. #else
  48150. "umlal r5, r3, %[b], r8\n\t"
  48151. #endif
  48152. "stm %[r]!, {r5}\n\t"
  48153. "mov r4, #0\n\t"
  48154. /* A[57] * B */
  48155. "ldm %[a]!, {r8}\n\t"
  48156. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48157. "lsl r6, %[b], #16\n\t"
  48158. "lsl r7, r8, #16\n\t"
  48159. "lsr r6, r6, #16\n\t"
  48160. "lsr r7, r7, #16\n\t"
  48161. "mul r7, r6, r7\n\t"
  48162. "adds r3, r3, r7\n\t"
  48163. "adc r4, r4, #0\n\t"
  48164. "lsr r7, r8, #16\n\t"
  48165. "mul r6, r7, r6\n\t"
  48166. "lsr r7, r6, #16\n\t"
  48167. "lsl r6, r6, #16\n\t"
  48168. "adds r3, r3, r6\n\t"
  48169. "adc r4, r4, r7\n\t"
  48170. "lsr r6, %[b], #16\n\t"
  48171. "lsr r7, r8, #16\n\t"
  48172. "mul r7, r6, r7\n\t"
  48173. "add r4, r4, r7\n\t"
  48174. "lsl r7, r8, #16\n\t"
  48175. "lsr r7, r7, #16\n\t"
  48176. "mul r6, r7, r6\n\t"
  48177. "lsr r7, r6, #16\n\t"
  48178. "lsl r6, r6, #16\n\t"
  48179. "adds r3, r3, r6\n\t"
  48180. "adc r4, r4, r7\n\t"
  48181. #else
  48182. "umlal r3, r4, %[b], r8\n\t"
  48183. #endif
  48184. "stm %[r]!, {r3}\n\t"
  48185. "mov r5, #0\n\t"
  48186. /* A[58] * B */
  48187. "ldm %[a]!, {r8}\n\t"
  48188. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48189. "lsl r6, %[b], #16\n\t"
  48190. "lsl r7, r8, #16\n\t"
  48191. "lsr r6, r6, #16\n\t"
  48192. "lsr r7, r7, #16\n\t"
  48193. "mul r7, r6, r7\n\t"
  48194. "adds r4, r4, r7\n\t"
  48195. "adc r5, r5, #0\n\t"
  48196. "lsr r7, r8, #16\n\t"
  48197. "mul r6, r7, r6\n\t"
  48198. "lsr r7, r6, #16\n\t"
  48199. "lsl r6, r6, #16\n\t"
  48200. "adds r4, r4, r6\n\t"
  48201. "adc r5, r5, r7\n\t"
  48202. "lsr r6, %[b], #16\n\t"
  48203. "lsr r7, r8, #16\n\t"
  48204. "mul r7, r6, r7\n\t"
  48205. "add r5, r5, r7\n\t"
  48206. "lsl r7, r8, #16\n\t"
  48207. "lsr r7, r7, #16\n\t"
  48208. "mul r6, r7, r6\n\t"
  48209. "lsr r7, r6, #16\n\t"
  48210. "lsl r6, r6, #16\n\t"
  48211. "adds r4, r4, r6\n\t"
  48212. "adc r5, r5, r7\n\t"
  48213. #else
  48214. "umlal r4, r5, %[b], r8\n\t"
  48215. #endif
  48216. "stm %[r]!, {r4}\n\t"
  48217. "mov r3, #0\n\t"
  48218. /* A[59] * B */
  48219. "ldm %[a]!, {r8}\n\t"
  48220. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48221. "lsl r6, %[b], #16\n\t"
  48222. "lsl r7, r8, #16\n\t"
  48223. "lsr r6, r6, #16\n\t"
  48224. "lsr r7, r7, #16\n\t"
  48225. "mul r7, r6, r7\n\t"
  48226. "adds r5, r5, r7\n\t"
  48227. "adc r3, r3, #0\n\t"
  48228. "lsr r7, r8, #16\n\t"
  48229. "mul r6, r7, r6\n\t"
  48230. "lsr r7, r6, #16\n\t"
  48231. "lsl r6, r6, #16\n\t"
  48232. "adds r5, r5, r6\n\t"
  48233. "adc r3, r3, r7\n\t"
  48234. "lsr r6, %[b], #16\n\t"
  48235. "lsr r7, r8, #16\n\t"
  48236. "mul r7, r6, r7\n\t"
  48237. "add r3, r3, r7\n\t"
  48238. "lsl r7, r8, #16\n\t"
  48239. "lsr r7, r7, #16\n\t"
  48240. "mul r6, r7, r6\n\t"
  48241. "lsr r7, r6, #16\n\t"
  48242. "lsl r6, r6, #16\n\t"
  48243. "adds r5, r5, r6\n\t"
  48244. "adc r3, r3, r7\n\t"
  48245. #else
  48246. "umlal r5, r3, %[b], r8\n\t"
  48247. #endif
  48248. "stm %[r]!, {r5}\n\t"
  48249. "mov r4, #0\n\t"
  48250. /* A[60] * B */
  48251. "ldm %[a]!, {r8}\n\t"
  48252. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48253. "lsl r6, %[b], #16\n\t"
  48254. "lsl r7, r8, #16\n\t"
  48255. "lsr r6, r6, #16\n\t"
  48256. "lsr r7, r7, #16\n\t"
  48257. "mul r7, r6, r7\n\t"
  48258. "adds r3, r3, r7\n\t"
  48259. "adc r4, r4, #0\n\t"
  48260. "lsr r7, r8, #16\n\t"
  48261. "mul r6, r7, r6\n\t"
  48262. "lsr r7, r6, #16\n\t"
  48263. "lsl r6, r6, #16\n\t"
  48264. "adds r3, r3, r6\n\t"
  48265. "adc r4, r4, r7\n\t"
  48266. "lsr r6, %[b], #16\n\t"
  48267. "lsr r7, r8, #16\n\t"
  48268. "mul r7, r6, r7\n\t"
  48269. "add r4, r4, r7\n\t"
  48270. "lsl r7, r8, #16\n\t"
  48271. "lsr r7, r7, #16\n\t"
  48272. "mul r6, r7, r6\n\t"
  48273. "lsr r7, r6, #16\n\t"
  48274. "lsl r6, r6, #16\n\t"
  48275. "adds r3, r3, r6\n\t"
  48276. "adc r4, r4, r7\n\t"
  48277. #else
  48278. "umlal r3, r4, %[b], r8\n\t"
  48279. #endif
  48280. "stm %[r]!, {r3}\n\t"
  48281. "mov r5, #0\n\t"
  48282. /* A[61] * B */
  48283. "ldm %[a]!, {r8}\n\t"
  48284. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48285. "lsl r6, %[b], #16\n\t"
  48286. "lsl r7, r8, #16\n\t"
  48287. "lsr r6, r6, #16\n\t"
  48288. "lsr r7, r7, #16\n\t"
  48289. "mul r7, r6, r7\n\t"
  48290. "adds r4, r4, r7\n\t"
  48291. "adc r5, r5, #0\n\t"
  48292. "lsr r7, r8, #16\n\t"
  48293. "mul r6, r7, r6\n\t"
  48294. "lsr r7, r6, #16\n\t"
  48295. "lsl r6, r6, #16\n\t"
  48296. "adds r4, r4, r6\n\t"
  48297. "adc r5, r5, r7\n\t"
  48298. "lsr r6, %[b], #16\n\t"
  48299. "lsr r7, r8, #16\n\t"
  48300. "mul r7, r6, r7\n\t"
  48301. "add r5, r5, r7\n\t"
  48302. "lsl r7, r8, #16\n\t"
  48303. "lsr r7, r7, #16\n\t"
  48304. "mul r6, r7, r6\n\t"
  48305. "lsr r7, r6, #16\n\t"
  48306. "lsl r6, r6, #16\n\t"
  48307. "adds r4, r4, r6\n\t"
  48308. "adc r5, r5, r7\n\t"
  48309. #else
  48310. "umlal r4, r5, %[b], r8\n\t"
  48311. #endif
  48312. "stm %[r]!, {r4}\n\t"
  48313. "mov r3, #0\n\t"
  48314. /* A[62] * B */
  48315. "ldm %[a]!, {r8}\n\t"
  48316. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48317. "lsl r6, %[b], #16\n\t"
  48318. "lsl r7, r8, #16\n\t"
  48319. "lsr r6, r6, #16\n\t"
  48320. "lsr r7, r7, #16\n\t"
  48321. "mul r7, r6, r7\n\t"
  48322. "adds r5, r5, r7\n\t"
  48323. "adc r3, r3, #0\n\t"
  48324. "lsr r7, r8, #16\n\t"
  48325. "mul r6, r7, r6\n\t"
  48326. "lsr r7, r6, #16\n\t"
  48327. "lsl r6, r6, #16\n\t"
  48328. "adds r5, r5, r6\n\t"
  48329. "adc r3, r3, r7\n\t"
  48330. "lsr r6, %[b], #16\n\t"
  48331. "lsr r7, r8, #16\n\t"
  48332. "mul r7, r6, r7\n\t"
  48333. "add r3, r3, r7\n\t"
  48334. "lsl r7, r8, #16\n\t"
  48335. "lsr r7, r7, #16\n\t"
  48336. "mul r6, r7, r6\n\t"
  48337. "lsr r7, r6, #16\n\t"
  48338. "lsl r6, r6, #16\n\t"
  48339. "adds r5, r5, r6\n\t"
  48340. "adc r3, r3, r7\n\t"
  48341. #else
  48342. "umlal r5, r3, %[b], r8\n\t"
  48343. #endif
  48344. "stm %[r]!, {r5}\n\t"
  48345. "mov r4, #0\n\t"
  48346. /* A[63] * B */
  48347. "ldm %[a]!, {r8}\n\t"
  48348. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48349. "lsl r6, %[b], #16\n\t"
  48350. "lsl r7, r8, #16\n\t"
  48351. "lsr r6, r6, #16\n\t"
  48352. "lsr r7, r7, #16\n\t"
  48353. "mul r7, r6, r7\n\t"
  48354. "adds r3, r3, r7\n\t"
  48355. "adc r4, r4, #0\n\t"
  48356. "lsr r7, r8, #16\n\t"
  48357. "mul r6, r7, r6\n\t"
  48358. "lsr r7, r6, #16\n\t"
  48359. "lsl r6, r6, #16\n\t"
  48360. "adds r3, r3, r6\n\t"
  48361. "adc r4, r4, r7\n\t"
  48362. "lsr r6, %[b], #16\n\t"
  48363. "lsr r7, r8, #16\n\t"
  48364. "mul r7, r6, r7\n\t"
  48365. "add r4, r4, r7\n\t"
  48366. "lsl r7, r8, #16\n\t"
  48367. "lsr r7, r7, #16\n\t"
  48368. "mul r6, r7, r6\n\t"
  48369. "lsr r7, r6, #16\n\t"
  48370. "lsl r6, r6, #16\n\t"
  48371. "adds r3, r3, r6\n\t"
  48372. "adc r4, r4, r7\n\t"
  48373. #else
  48374. "umlal r3, r4, %[b], r8\n\t"
  48375. #endif
  48376. "stm %[r]!, {r3}\n\t"
  48377. "mov r5, #0\n\t"
  48378. /* A[64] * B */
  48379. "ldm %[a]!, {r8}\n\t"
  48380. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48381. "lsl r6, %[b], #16\n\t"
  48382. "lsl r7, r8, #16\n\t"
  48383. "lsr r6, r6, #16\n\t"
  48384. "lsr r7, r7, #16\n\t"
  48385. "mul r7, r6, r7\n\t"
  48386. "adds r4, r4, r7\n\t"
  48387. "adc r5, r5, #0\n\t"
  48388. "lsr r7, r8, #16\n\t"
  48389. "mul r6, r7, r6\n\t"
  48390. "lsr r7, r6, #16\n\t"
  48391. "lsl r6, r6, #16\n\t"
  48392. "adds r4, r4, r6\n\t"
  48393. "adc r5, r5, r7\n\t"
  48394. "lsr r6, %[b], #16\n\t"
  48395. "lsr r7, r8, #16\n\t"
  48396. "mul r7, r6, r7\n\t"
  48397. "add r5, r5, r7\n\t"
  48398. "lsl r7, r8, #16\n\t"
  48399. "lsr r7, r7, #16\n\t"
  48400. "mul r6, r7, r6\n\t"
  48401. "lsr r7, r6, #16\n\t"
  48402. "lsl r6, r6, #16\n\t"
  48403. "adds r4, r4, r6\n\t"
  48404. "adc r5, r5, r7\n\t"
  48405. #else
  48406. "umlal r4, r5, %[b], r8\n\t"
  48407. #endif
  48408. "stm %[r]!, {r4}\n\t"
  48409. "mov r3, #0\n\t"
  48410. /* A[65] * B */
  48411. "ldm %[a]!, {r8}\n\t"
  48412. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48413. "lsl r6, %[b], #16\n\t"
  48414. "lsl r7, r8, #16\n\t"
  48415. "lsr r6, r6, #16\n\t"
  48416. "lsr r7, r7, #16\n\t"
  48417. "mul r7, r6, r7\n\t"
  48418. "adds r5, r5, r7\n\t"
  48419. "adc r3, r3, #0\n\t"
  48420. "lsr r7, r8, #16\n\t"
  48421. "mul r6, r7, r6\n\t"
  48422. "lsr r7, r6, #16\n\t"
  48423. "lsl r6, r6, #16\n\t"
  48424. "adds r5, r5, r6\n\t"
  48425. "adc r3, r3, r7\n\t"
  48426. "lsr r6, %[b], #16\n\t"
  48427. "lsr r7, r8, #16\n\t"
  48428. "mul r7, r6, r7\n\t"
  48429. "add r3, r3, r7\n\t"
  48430. "lsl r7, r8, #16\n\t"
  48431. "lsr r7, r7, #16\n\t"
  48432. "mul r6, r7, r6\n\t"
  48433. "lsr r7, r6, #16\n\t"
  48434. "lsl r6, r6, #16\n\t"
  48435. "adds r5, r5, r6\n\t"
  48436. "adc r3, r3, r7\n\t"
  48437. #else
  48438. "umlal r5, r3, %[b], r8\n\t"
  48439. #endif
  48440. "stm %[r]!, {r5}\n\t"
  48441. "mov r4, #0\n\t"
  48442. /* A[66] * B */
  48443. "ldm %[a]!, {r8}\n\t"
  48444. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48445. "lsl r6, %[b], #16\n\t"
  48446. "lsl r7, r8, #16\n\t"
  48447. "lsr r6, r6, #16\n\t"
  48448. "lsr r7, r7, #16\n\t"
  48449. "mul r7, r6, r7\n\t"
  48450. "adds r3, r3, r7\n\t"
  48451. "adc r4, r4, #0\n\t"
  48452. "lsr r7, r8, #16\n\t"
  48453. "mul r6, r7, r6\n\t"
  48454. "lsr r7, r6, #16\n\t"
  48455. "lsl r6, r6, #16\n\t"
  48456. "adds r3, r3, r6\n\t"
  48457. "adc r4, r4, r7\n\t"
  48458. "lsr r6, %[b], #16\n\t"
  48459. "lsr r7, r8, #16\n\t"
  48460. "mul r7, r6, r7\n\t"
  48461. "add r4, r4, r7\n\t"
  48462. "lsl r7, r8, #16\n\t"
  48463. "lsr r7, r7, #16\n\t"
  48464. "mul r6, r7, r6\n\t"
  48465. "lsr r7, r6, #16\n\t"
  48466. "lsl r6, r6, #16\n\t"
  48467. "adds r3, r3, r6\n\t"
  48468. "adc r4, r4, r7\n\t"
  48469. #else
  48470. "umlal r3, r4, %[b], r8\n\t"
  48471. #endif
  48472. "stm %[r]!, {r3}\n\t"
  48473. "mov r5, #0\n\t"
  48474. /* A[67] * B */
  48475. "ldm %[a]!, {r8}\n\t"
  48476. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48477. "lsl r6, %[b], #16\n\t"
  48478. "lsl r7, r8, #16\n\t"
  48479. "lsr r6, r6, #16\n\t"
  48480. "lsr r7, r7, #16\n\t"
  48481. "mul r7, r6, r7\n\t"
  48482. "adds r4, r4, r7\n\t"
  48483. "adc r5, r5, #0\n\t"
  48484. "lsr r7, r8, #16\n\t"
  48485. "mul r6, r7, r6\n\t"
  48486. "lsr r7, r6, #16\n\t"
  48487. "lsl r6, r6, #16\n\t"
  48488. "adds r4, r4, r6\n\t"
  48489. "adc r5, r5, r7\n\t"
  48490. "lsr r6, %[b], #16\n\t"
  48491. "lsr r7, r8, #16\n\t"
  48492. "mul r7, r6, r7\n\t"
  48493. "add r5, r5, r7\n\t"
  48494. "lsl r7, r8, #16\n\t"
  48495. "lsr r7, r7, #16\n\t"
  48496. "mul r6, r7, r6\n\t"
  48497. "lsr r7, r6, #16\n\t"
  48498. "lsl r6, r6, #16\n\t"
  48499. "adds r4, r4, r6\n\t"
  48500. "adc r5, r5, r7\n\t"
  48501. #else
  48502. "umlal r4, r5, %[b], r8\n\t"
  48503. #endif
  48504. "stm %[r]!, {r4}\n\t"
  48505. "mov r3, #0\n\t"
  48506. /* A[68] * B */
  48507. "ldm %[a]!, {r8}\n\t"
  48508. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48509. "lsl r6, %[b], #16\n\t"
  48510. "lsl r7, r8, #16\n\t"
  48511. "lsr r6, r6, #16\n\t"
  48512. "lsr r7, r7, #16\n\t"
  48513. "mul r7, r6, r7\n\t"
  48514. "adds r5, r5, r7\n\t"
  48515. "adc r3, r3, #0\n\t"
  48516. "lsr r7, r8, #16\n\t"
  48517. "mul r6, r7, r6\n\t"
  48518. "lsr r7, r6, #16\n\t"
  48519. "lsl r6, r6, #16\n\t"
  48520. "adds r5, r5, r6\n\t"
  48521. "adc r3, r3, r7\n\t"
  48522. "lsr r6, %[b], #16\n\t"
  48523. "lsr r7, r8, #16\n\t"
  48524. "mul r7, r6, r7\n\t"
  48525. "add r3, r3, r7\n\t"
  48526. "lsl r7, r8, #16\n\t"
  48527. "lsr r7, r7, #16\n\t"
  48528. "mul r6, r7, r6\n\t"
  48529. "lsr r7, r6, #16\n\t"
  48530. "lsl r6, r6, #16\n\t"
  48531. "adds r5, r5, r6\n\t"
  48532. "adc r3, r3, r7\n\t"
  48533. #else
  48534. "umlal r5, r3, %[b], r8\n\t"
  48535. #endif
  48536. "stm %[r]!, {r5}\n\t"
  48537. "mov r4, #0\n\t"
  48538. /* A[69] * B */
  48539. "ldm %[a]!, {r8}\n\t"
  48540. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48541. "lsl r6, %[b], #16\n\t"
  48542. "lsl r7, r8, #16\n\t"
  48543. "lsr r6, r6, #16\n\t"
  48544. "lsr r7, r7, #16\n\t"
  48545. "mul r7, r6, r7\n\t"
  48546. "adds r3, r3, r7\n\t"
  48547. "adc r4, r4, #0\n\t"
  48548. "lsr r7, r8, #16\n\t"
  48549. "mul r6, r7, r6\n\t"
  48550. "lsr r7, r6, #16\n\t"
  48551. "lsl r6, r6, #16\n\t"
  48552. "adds r3, r3, r6\n\t"
  48553. "adc r4, r4, r7\n\t"
  48554. "lsr r6, %[b], #16\n\t"
  48555. "lsr r7, r8, #16\n\t"
  48556. "mul r7, r6, r7\n\t"
  48557. "add r4, r4, r7\n\t"
  48558. "lsl r7, r8, #16\n\t"
  48559. "lsr r7, r7, #16\n\t"
  48560. "mul r6, r7, r6\n\t"
  48561. "lsr r7, r6, #16\n\t"
  48562. "lsl r6, r6, #16\n\t"
  48563. "adds r3, r3, r6\n\t"
  48564. "adc r4, r4, r7\n\t"
  48565. #else
  48566. "umlal r3, r4, %[b], r8\n\t"
  48567. #endif
  48568. "stm %[r]!, {r3}\n\t"
  48569. "mov r5, #0\n\t"
  48570. /* A[70] * B */
  48571. "ldm %[a]!, {r8}\n\t"
  48572. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48573. "lsl r6, %[b], #16\n\t"
  48574. "lsl r7, r8, #16\n\t"
  48575. "lsr r6, r6, #16\n\t"
  48576. "lsr r7, r7, #16\n\t"
  48577. "mul r7, r6, r7\n\t"
  48578. "adds r4, r4, r7\n\t"
  48579. "adc r5, r5, #0\n\t"
  48580. "lsr r7, r8, #16\n\t"
  48581. "mul r6, r7, r6\n\t"
  48582. "lsr r7, r6, #16\n\t"
  48583. "lsl r6, r6, #16\n\t"
  48584. "adds r4, r4, r6\n\t"
  48585. "adc r5, r5, r7\n\t"
  48586. "lsr r6, %[b], #16\n\t"
  48587. "lsr r7, r8, #16\n\t"
  48588. "mul r7, r6, r7\n\t"
  48589. "add r5, r5, r7\n\t"
  48590. "lsl r7, r8, #16\n\t"
  48591. "lsr r7, r7, #16\n\t"
  48592. "mul r6, r7, r6\n\t"
  48593. "lsr r7, r6, #16\n\t"
  48594. "lsl r6, r6, #16\n\t"
  48595. "adds r4, r4, r6\n\t"
  48596. "adc r5, r5, r7\n\t"
  48597. #else
  48598. "umlal r4, r5, %[b], r8\n\t"
  48599. #endif
  48600. "stm %[r]!, {r4}\n\t"
  48601. "mov r3, #0\n\t"
  48602. /* A[71] * B */
  48603. "ldm %[a]!, {r8}\n\t"
  48604. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48605. "lsl r6, %[b], #16\n\t"
  48606. "lsl r7, r8, #16\n\t"
  48607. "lsr r6, r6, #16\n\t"
  48608. "lsr r7, r7, #16\n\t"
  48609. "mul r7, r6, r7\n\t"
  48610. "adds r5, r5, r7\n\t"
  48611. "adc r3, r3, #0\n\t"
  48612. "lsr r7, r8, #16\n\t"
  48613. "mul r6, r7, r6\n\t"
  48614. "lsr r7, r6, #16\n\t"
  48615. "lsl r6, r6, #16\n\t"
  48616. "adds r5, r5, r6\n\t"
  48617. "adc r3, r3, r7\n\t"
  48618. "lsr r6, %[b], #16\n\t"
  48619. "lsr r7, r8, #16\n\t"
  48620. "mul r7, r6, r7\n\t"
  48621. "add r3, r3, r7\n\t"
  48622. "lsl r7, r8, #16\n\t"
  48623. "lsr r7, r7, #16\n\t"
  48624. "mul r6, r7, r6\n\t"
  48625. "lsr r7, r6, #16\n\t"
  48626. "lsl r6, r6, #16\n\t"
  48627. "adds r5, r5, r6\n\t"
  48628. "adc r3, r3, r7\n\t"
  48629. #else
  48630. "umlal r5, r3, %[b], r8\n\t"
  48631. #endif
  48632. "stm %[r]!, {r5}\n\t"
  48633. "mov r4, #0\n\t"
  48634. /* A[72] * B */
  48635. "ldm %[a]!, {r8}\n\t"
  48636. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48637. "lsl r6, %[b], #16\n\t"
  48638. "lsl r7, r8, #16\n\t"
  48639. "lsr r6, r6, #16\n\t"
  48640. "lsr r7, r7, #16\n\t"
  48641. "mul r7, r6, r7\n\t"
  48642. "adds r3, r3, r7\n\t"
  48643. "adc r4, r4, #0\n\t"
  48644. "lsr r7, r8, #16\n\t"
  48645. "mul r6, r7, r6\n\t"
  48646. "lsr r7, r6, #16\n\t"
  48647. "lsl r6, r6, #16\n\t"
  48648. "adds r3, r3, r6\n\t"
  48649. "adc r4, r4, r7\n\t"
  48650. "lsr r6, %[b], #16\n\t"
  48651. "lsr r7, r8, #16\n\t"
  48652. "mul r7, r6, r7\n\t"
  48653. "add r4, r4, r7\n\t"
  48654. "lsl r7, r8, #16\n\t"
  48655. "lsr r7, r7, #16\n\t"
  48656. "mul r6, r7, r6\n\t"
  48657. "lsr r7, r6, #16\n\t"
  48658. "lsl r6, r6, #16\n\t"
  48659. "adds r3, r3, r6\n\t"
  48660. "adc r4, r4, r7\n\t"
  48661. #else
  48662. "umlal r3, r4, %[b], r8\n\t"
  48663. #endif
  48664. "stm %[r]!, {r3}\n\t"
  48665. "mov r5, #0\n\t"
  48666. /* A[73] * B */
  48667. "ldm %[a]!, {r8}\n\t"
  48668. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48669. "lsl r6, %[b], #16\n\t"
  48670. "lsl r7, r8, #16\n\t"
  48671. "lsr r6, r6, #16\n\t"
  48672. "lsr r7, r7, #16\n\t"
  48673. "mul r7, r6, r7\n\t"
  48674. "adds r4, r4, r7\n\t"
  48675. "adc r5, r5, #0\n\t"
  48676. "lsr r7, r8, #16\n\t"
  48677. "mul r6, r7, r6\n\t"
  48678. "lsr r7, r6, #16\n\t"
  48679. "lsl r6, r6, #16\n\t"
  48680. "adds r4, r4, r6\n\t"
  48681. "adc r5, r5, r7\n\t"
  48682. "lsr r6, %[b], #16\n\t"
  48683. "lsr r7, r8, #16\n\t"
  48684. "mul r7, r6, r7\n\t"
  48685. "add r5, r5, r7\n\t"
  48686. "lsl r7, r8, #16\n\t"
  48687. "lsr r7, r7, #16\n\t"
  48688. "mul r6, r7, r6\n\t"
  48689. "lsr r7, r6, #16\n\t"
  48690. "lsl r6, r6, #16\n\t"
  48691. "adds r4, r4, r6\n\t"
  48692. "adc r5, r5, r7\n\t"
  48693. #else
  48694. "umlal r4, r5, %[b], r8\n\t"
  48695. #endif
  48696. "stm %[r]!, {r4}\n\t"
  48697. "mov r3, #0\n\t"
  48698. /* A[74] * B */
  48699. "ldm %[a]!, {r8}\n\t"
  48700. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48701. "lsl r6, %[b], #16\n\t"
  48702. "lsl r7, r8, #16\n\t"
  48703. "lsr r6, r6, #16\n\t"
  48704. "lsr r7, r7, #16\n\t"
  48705. "mul r7, r6, r7\n\t"
  48706. "adds r5, r5, r7\n\t"
  48707. "adc r3, r3, #0\n\t"
  48708. "lsr r7, r8, #16\n\t"
  48709. "mul r6, r7, r6\n\t"
  48710. "lsr r7, r6, #16\n\t"
  48711. "lsl r6, r6, #16\n\t"
  48712. "adds r5, r5, r6\n\t"
  48713. "adc r3, r3, r7\n\t"
  48714. "lsr r6, %[b], #16\n\t"
  48715. "lsr r7, r8, #16\n\t"
  48716. "mul r7, r6, r7\n\t"
  48717. "add r3, r3, r7\n\t"
  48718. "lsl r7, r8, #16\n\t"
  48719. "lsr r7, r7, #16\n\t"
  48720. "mul r6, r7, r6\n\t"
  48721. "lsr r7, r6, #16\n\t"
  48722. "lsl r6, r6, #16\n\t"
  48723. "adds r5, r5, r6\n\t"
  48724. "adc r3, r3, r7\n\t"
  48725. #else
  48726. "umlal r5, r3, %[b], r8\n\t"
  48727. #endif
  48728. "stm %[r]!, {r5}\n\t"
  48729. "mov r4, #0\n\t"
  48730. /* A[75] * B */
  48731. "ldm %[a]!, {r8}\n\t"
  48732. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48733. "lsl r6, %[b], #16\n\t"
  48734. "lsl r7, r8, #16\n\t"
  48735. "lsr r6, r6, #16\n\t"
  48736. "lsr r7, r7, #16\n\t"
  48737. "mul r7, r6, r7\n\t"
  48738. "adds r3, r3, r7\n\t"
  48739. "adc r4, r4, #0\n\t"
  48740. "lsr r7, r8, #16\n\t"
  48741. "mul r6, r7, r6\n\t"
  48742. "lsr r7, r6, #16\n\t"
  48743. "lsl r6, r6, #16\n\t"
  48744. "adds r3, r3, r6\n\t"
  48745. "adc r4, r4, r7\n\t"
  48746. "lsr r6, %[b], #16\n\t"
  48747. "lsr r7, r8, #16\n\t"
  48748. "mul r7, r6, r7\n\t"
  48749. "add r4, r4, r7\n\t"
  48750. "lsl r7, r8, #16\n\t"
  48751. "lsr r7, r7, #16\n\t"
  48752. "mul r6, r7, r6\n\t"
  48753. "lsr r7, r6, #16\n\t"
  48754. "lsl r6, r6, #16\n\t"
  48755. "adds r3, r3, r6\n\t"
  48756. "adc r4, r4, r7\n\t"
  48757. #else
  48758. "umlal r3, r4, %[b], r8\n\t"
  48759. #endif
  48760. "stm %[r]!, {r3}\n\t"
  48761. "mov r5, #0\n\t"
  48762. /* A[76] * B */
  48763. "ldm %[a]!, {r8}\n\t"
  48764. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48765. "lsl r6, %[b], #16\n\t"
  48766. "lsl r7, r8, #16\n\t"
  48767. "lsr r6, r6, #16\n\t"
  48768. "lsr r7, r7, #16\n\t"
  48769. "mul r7, r6, r7\n\t"
  48770. "adds r4, r4, r7\n\t"
  48771. "adc r5, r5, #0\n\t"
  48772. "lsr r7, r8, #16\n\t"
  48773. "mul r6, r7, r6\n\t"
  48774. "lsr r7, r6, #16\n\t"
  48775. "lsl r6, r6, #16\n\t"
  48776. "adds r4, r4, r6\n\t"
  48777. "adc r5, r5, r7\n\t"
  48778. "lsr r6, %[b], #16\n\t"
  48779. "lsr r7, r8, #16\n\t"
  48780. "mul r7, r6, r7\n\t"
  48781. "add r5, r5, r7\n\t"
  48782. "lsl r7, r8, #16\n\t"
  48783. "lsr r7, r7, #16\n\t"
  48784. "mul r6, r7, r6\n\t"
  48785. "lsr r7, r6, #16\n\t"
  48786. "lsl r6, r6, #16\n\t"
  48787. "adds r4, r4, r6\n\t"
  48788. "adc r5, r5, r7\n\t"
  48789. #else
  48790. "umlal r4, r5, %[b], r8\n\t"
  48791. #endif
  48792. "stm %[r]!, {r4}\n\t"
  48793. "mov r3, #0\n\t"
  48794. /* A[77] * B */
  48795. "ldm %[a]!, {r8}\n\t"
  48796. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48797. "lsl r6, %[b], #16\n\t"
  48798. "lsl r7, r8, #16\n\t"
  48799. "lsr r6, r6, #16\n\t"
  48800. "lsr r7, r7, #16\n\t"
  48801. "mul r7, r6, r7\n\t"
  48802. "adds r5, r5, r7\n\t"
  48803. "adc r3, r3, #0\n\t"
  48804. "lsr r7, r8, #16\n\t"
  48805. "mul r6, r7, r6\n\t"
  48806. "lsr r7, r6, #16\n\t"
  48807. "lsl r6, r6, #16\n\t"
  48808. "adds r5, r5, r6\n\t"
  48809. "adc r3, r3, r7\n\t"
  48810. "lsr r6, %[b], #16\n\t"
  48811. "lsr r7, r8, #16\n\t"
  48812. "mul r7, r6, r7\n\t"
  48813. "add r3, r3, r7\n\t"
  48814. "lsl r7, r8, #16\n\t"
  48815. "lsr r7, r7, #16\n\t"
  48816. "mul r6, r7, r6\n\t"
  48817. "lsr r7, r6, #16\n\t"
  48818. "lsl r6, r6, #16\n\t"
  48819. "adds r5, r5, r6\n\t"
  48820. "adc r3, r3, r7\n\t"
  48821. #else
  48822. "umlal r5, r3, %[b], r8\n\t"
  48823. #endif
  48824. "stm %[r]!, {r5}\n\t"
  48825. "mov r4, #0\n\t"
  48826. /* A[78] * B */
  48827. "ldm %[a]!, {r8}\n\t"
  48828. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48829. "lsl r6, %[b], #16\n\t"
  48830. "lsl r7, r8, #16\n\t"
  48831. "lsr r6, r6, #16\n\t"
  48832. "lsr r7, r7, #16\n\t"
  48833. "mul r7, r6, r7\n\t"
  48834. "adds r3, r3, r7\n\t"
  48835. "adc r4, r4, #0\n\t"
  48836. "lsr r7, r8, #16\n\t"
  48837. "mul r6, r7, r6\n\t"
  48838. "lsr r7, r6, #16\n\t"
  48839. "lsl r6, r6, #16\n\t"
  48840. "adds r3, r3, r6\n\t"
  48841. "adc r4, r4, r7\n\t"
  48842. "lsr r6, %[b], #16\n\t"
  48843. "lsr r7, r8, #16\n\t"
  48844. "mul r7, r6, r7\n\t"
  48845. "add r4, r4, r7\n\t"
  48846. "lsl r7, r8, #16\n\t"
  48847. "lsr r7, r7, #16\n\t"
  48848. "mul r6, r7, r6\n\t"
  48849. "lsr r7, r6, #16\n\t"
  48850. "lsl r6, r6, #16\n\t"
  48851. "adds r3, r3, r6\n\t"
  48852. "adc r4, r4, r7\n\t"
  48853. #else
  48854. "umlal r3, r4, %[b], r8\n\t"
  48855. #endif
  48856. "stm %[r]!, {r3}\n\t"
  48857. "mov r5, #0\n\t"
  48858. /* A[79] * B */
  48859. "ldm %[a]!, {r8}\n\t"
  48860. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48861. "lsl r6, %[b], #16\n\t"
  48862. "lsl r7, r8, #16\n\t"
  48863. "lsr r6, r6, #16\n\t"
  48864. "lsr r7, r7, #16\n\t"
  48865. "mul r7, r6, r7\n\t"
  48866. "adds r4, r4, r7\n\t"
  48867. "adc r5, r5, #0\n\t"
  48868. "lsr r7, r8, #16\n\t"
  48869. "mul r6, r7, r6\n\t"
  48870. "lsr r7, r6, #16\n\t"
  48871. "lsl r6, r6, #16\n\t"
  48872. "adds r4, r4, r6\n\t"
  48873. "adc r5, r5, r7\n\t"
  48874. "lsr r6, %[b], #16\n\t"
  48875. "lsr r7, r8, #16\n\t"
  48876. "mul r7, r6, r7\n\t"
  48877. "add r5, r5, r7\n\t"
  48878. "lsl r7, r8, #16\n\t"
  48879. "lsr r7, r7, #16\n\t"
  48880. "mul r6, r7, r6\n\t"
  48881. "lsr r7, r6, #16\n\t"
  48882. "lsl r6, r6, #16\n\t"
  48883. "adds r4, r4, r6\n\t"
  48884. "adc r5, r5, r7\n\t"
  48885. #else
  48886. "umlal r4, r5, %[b], r8\n\t"
  48887. #endif
  48888. "stm %[r]!, {r4}\n\t"
  48889. "mov r3, #0\n\t"
  48890. /* A[80] * B */
  48891. "ldm %[a]!, {r8}\n\t"
  48892. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48893. "lsl r6, %[b], #16\n\t"
  48894. "lsl r7, r8, #16\n\t"
  48895. "lsr r6, r6, #16\n\t"
  48896. "lsr r7, r7, #16\n\t"
  48897. "mul r7, r6, r7\n\t"
  48898. "adds r5, r5, r7\n\t"
  48899. "adc r3, r3, #0\n\t"
  48900. "lsr r7, r8, #16\n\t"
  48901. "mul r6, r7, r6\n\t"
  48902. "lsr r7, r6, #16\n\t"
  48903. "lsl r6, r6, #16\n\t"
  48904. "adds r5, r5, r6\n\t"
  48905. "adc r3, r3, r7\n\t"
  48906. "lsr r6, %[b], #16\n\t"
  48907. "lsr r7, r8, #16\n\t"
  48908. "mul r7, r6, r7\n\t"
  48909. "add r3, r3, r7\n\t"
  48910. "lsl r7, r8, #16\n\t"
  48911. "lsr r7, r7, #16\n\t"
  48912. "mul r6, r7, r6\n\t"
  48913. "lsr r7, r6, #16\n\t"
  48914. "lsl r6, r6, #16\n\t"
  48915. "adds r5, r5, r6\n\t"
  48916. "adc r3, r3, r7\n\t"
  48917. #else
  48918. "umlal r5, r3, %[b], r8\n\t"
  48919. #endif
  48920. "stm %[r]!, {r5}\n\t"
  48921. "mov r4, #0\n\t"
  48922. /* A[81] * B */
  48923. "ldm %[a]!, {r8}\n\t"
  48924. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48925. "lsl r6, %[b], #16\n\t"
  48926. "lsl r7, r8, #16\n\t"
  48927. "lsr r6, r6, #16\n\t"
  48928. "lsr r7, r7, #16\n\t"
  48929. "mul r7, r6, r7\n\t"
  48930. "adds r3, r3, r7\n\t"
  48931. "adc r4, r4, #0\n\t"
  48932. "lsr r7, r8, #16\n\t"
  48933. "mul r6, r7, r6\n\t"
  48934. "lsr r7, r6, #16\n\t"
  48935. "lsl r6, r6, #16\n\t"
  48936. "adds r3, r3, r6\n\t"
  48937. "adc r4, r4, r7\n\t"
  48938. "lsr r6, %[b], #16\n\t"
  48939. "lsr r7, r8, #16\n\t"
  48940. "mul r7, r6, r7\n\t"
  48941. "add r4, r4, r7\n\t"
  48942. "lsl r7, r8, #16\n\t"
  48943. "lsr r7, r7, #16\n\t"
  48944. "mul r6, r7, r6\n\t"
  48945. "lsr r7, r6, #16\n\t"
  48946. "lsl r6, r6, #16\n\t"
  48947. "adds r3, r3, r6\n\t"
  48948. "adc r4, r4, r7\n\t"
  48949. #else
  48950. "umlal r3, r4, %[b], r8\n\t"
  48951. #endif
  48952. "stm %[r]!, {r3}\n\t"
  48953. "mov r5, #0\n\t"
  48954. /* A[82] * B */
  48955. "ldm %[a]!, {r8}\n\t"
  48956. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48957. "lsl r6, %[b], #16\n\t"
  48958. "lsl r7, r8, #16\n\t"
  48959. "lsr r6, r6, #16\n\t"
  48960. "lsr r7, r7, #16\n\t"
  48961. "mul r7, r6, r7\n\t"
  48962. "adds r4, r4, r7\n\t"
  48963. "adc r5, r5, #0\n\t"
  48964. "lsr r7, r8, #16\n\t"
  48965. "mul r6, r7, r6\n\t"
  48966. "lsr r7, r6, #16\n\t"
  48967. "lsl r6, r6, #16\n\t"
  48968. "adds r4, r4, r6\n\t"
  48969. "adc r5, r5, r7\n\t"
  48970. "lsr r6, %[b], #16\n\t"
  48971. "lsr r7, r8, #16\n\t"
  48972. "mul r7, r6, r7\n\t"
  48973. "add r5, r5, r7\n\t"
  48974. "lsl r7, r8, #16\n\t"
  48975. "lsr r7, r7, #16\n\t"
  48976. "mul r6, r7, r6\n\t"
  48977. "lsr r7, r6, #16\n\t"
  48978. "lsl r6, r6, #16\n\t"
  48979. "adds r4, r4, r6\n\t"
  48980. "adc r5, r5, r7\n\t"
  48981. #else
  48982. "umlal r4, r5, %[b], r8\n\t"
  48983. #endif
  48984. "stm %[r]!, {r4}\n\t"
  48985. "mov r3, #0\n\t"
  48986. /* A[83] * B */
  48987. "ldm %[a]!, {r8}\n\t"
  48988. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  48989. "lsl r6, %[b], #16\n\t"
  48990. "lsl r7, r8, #16\n\t"
  48991. "lsr r6, r6, #16\n\t"
  48992. "lsr r7, r7, #16\n\t"
  48993. "mul r7, r6, r7\n\t"
  48994. "adds r5, r5, r7\n\t"
  48995. "adc r3, r3, #0\n\t"
  48996. "lsr r7, r8, #16\n\t"
  48997. "mul r6, r7, r6\n\t"
  48998. "lsr r7, r6, #16\n\t"
  48999. "lsl r6, r6, #16\n\t"
  49000. "adds r5, r5, r6\n\t"
  49001. "adc r3, r3, r7\n\t"
  49002. "lsr r6, %[b], #16\n\t"
  49003. "lsr r7, r8, #16\n\t"
  49004. "mul r7, r6, r7\n\t"
  49005. "add r3, r3, r7\n\t"
  49006. "lsl r7, r8, #16\n\t"
  49007. "lsr r7, r7, #16\n\t"
  49008. "mul r6, r7, r6\n\t"
  49009. "lsr r7, r6, #16\n\t"
  49010. "lsl r6, r6, #16\n\t"
  49011. "adds r5, r5, r6\n\t"
  49012. "adc r3, r3, r7\n\t"
  49013. #else
  49014. "umlal r5, r3, %[b], r8\n\t"
  49015. #endif
  49016. "stm %[r]!, {r5}\n\t"
  49017. "mov r4, #0\n\t"
  49018. /* A[84] * B */
  49019. "ldm %[a]!, {r8}\n\t"
  49020. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49021. "lsl r6, %[b], #16\n\t"
  49022. "lsl r7, r8, #16\n\t"
  49023. "lsr r6, r6, #16\n\t"
  49024. "lsr r7, r7, #16\n\t"
  49025. "mul r7, r6, r7\n\t"
  49026. "adds r3, r3, r7\n\t"
  49027. "adc r4, r4, #0\n\t"
  49028. "lsr r7, r8, #16\n\t"
  49029. "mul r6, r7, r6\n\t"
  49030. "lsr r7, r6, #16\n\t"
  49031. "lsl r6, r6, #16\n\t"
  49032. "adds r3, r3, r6\n\t"
  49033. "adc r4, r4, r7\n\t"
  49034. "lsr r6, %[b], #16\n\t"
  49035. "lsr r7, r8, #16\n\t"
  49036. "mul r7, r6, r7\n\t"
  49037. "add r4, r4, r7\n\t"
  49038. "lsl r7, r8, #16\n\t"
  49039. "lsr r7, r7, #16\n\t"
  49040. "mul r6, r7, r6\n\t"
  49041. "lsr r7, r6, #16\n\t"
  49042. "lsl r6, r6, #16\n\t"
  49043. "adds r3, r3, r6\n\t"
  49044. "adc r4, r4, r7\n\t"
  49045. #else
  49046. "umlal r3, r4, %[b], r8\n\t"
  49047. #endif
  49048. "stm %[r]!, {r3}\n\t"
  49049. "mov r5, #0\n\t"
  49050. /* A[85] * B */
  49051. "ldm %[a]!, {r8}\n\t"
  49052. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49053. "lsl r6, %[b], #16\n\t"
  49054. "lsl r7, r8, #16\n\t"
  49055. "lsr r6, r6, #16\n\t"
  49056. "lsr r7, r7, #16\n\t"
  49057. "mul r7, r6, r7\n\t"
  49058. "adds r4, r4, r7\n\t"
  49059. "adc r5, r5, #0\n\t"
  49060. "lsr r7, r8, #16\n\t"
  49061. "mul r6, r7, r6\n\t"
  49062. "lsr r7, r6, #16\n\t"
  49063. "lsl r6, r6, #16\n\t"
  49064. "adds r4, r4, r6\n\t"
  49065. "adc r5, r5, r7\n\t"
  49066. "lsr r6, %[b], #16\n\t"
  49067. "lsr r7, r8, #16\n\t"
  49068. "mul r7, r6, r7\n\t"
  49069. "add r5, r5, r7\n\t"
  49070. "lsl r7, r8, #16\n\t"
  49071. "lsr r7, r7, #16\n\t"
  49072. "mul r6, r7, r6\n\t"
  49073. "lsr r7, r6, #16\n\t"
  49074. "lsl r6, r6, #16\n\t"
  49075. "adds r4, r4, r6\n\t"
  49076. "adc r5, r5, r7\n\t"
  49077. #else
  49078. "umlal r4, r5, %[b], r8\n\t"
  49079. #endif
  49080. "stm %[r]!, {r4}\n\t"
  49081. "mov r3, #0\n\t"
  49082. /* A[86] * B */
  49083. "ldm %[a]!, {r8}\n\t"
  49084. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49085. "lsl r6, %[b], #16\n\t"
  49086. "lsl r7, r8, #16\n\t"
  49087. "lsr r6, r6, #16\n\t"
  49088. "lsr r7, r7, #16\n\t"
  49089. "mul r7, r6, r7\n\t"
  49090. "adds r5, r5, r7\n\t"
  49091. "adc r3, r3, #0\n\t"
  49092. "lsr r7, r8, #16\n\t"
  49093. "mul r6, r7, r6\n\t"
  49094. "lsr r7, r6, #16\n\t"
  49095. "lsl r6, r6, #16\n\t"
  49096. "adds r5, r5, r6\n\t"
  49097. "adc r3, r3, r7\n\t"
  49098. "lsr r6, %[b], #16\n\t"
  49099. "lsr r7, r8, #16\n\t"
  49100. "mul r7, r6, r7\n\t"
  49101. "add r3, r3, r7\n\t"
  49102. "lsl r7, r8, #16\n\t"
  49103. "lsr r7, r7, #16\n\t"
  49104. "mul r6, r7, r6\n\t"
  49105. "lsr r7, r6, #16\n\t"
  49106. "lsl r6, r6, #16\n\t"
  49107. "adds r5, r5, r6\n\t"
  49108. "adc r3, r3, r7\n\t"
  49109. #else
  49110. "umlal r5, r3, %[b], r8\n\t"
  49111. #endif
  49112. "stm %[r]!, {r5}\n\t"
  49113. "mov r4, #0\n\t"
  49114. /* A[87] * B */
  49115. "ldm %[a]!, {r8}\n\t"
  49116. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49117. "lsl r6, %[b], #16\n\t"
  49118. "lsl r7, r8, #16\n\t"
  49119. "lsr r6, r6, #16\n\t"
  49120. "lsr r7, r7, #16\n\t"
  49121. "mul r7, r6, r7\n\t"
  49122. "adds r3, r3, r7\n\t"
  49123. "adc r4, r4, #0\n\t"
  49124. "lsr r7, r8, #16\n\t"
  49125. "mul r6, r7, r6\n\t"
  49126. "lsr r7, r6, #16\n\t"
  49127. "lsl r6, r6, #16\n\t"
  49128. "adds r3, r3, r6\n\t"
  49129. "adc r4, r4, r7\n\t"
  49130. "lsr r6, %[b], #16\n\t"
  49131. "lsr r7, r8, #16\n\t"
  49132. "mul r7, r6, r7\n\t"
  49133. "add r4, r4, r7\n\t"
  49134. "lsl r7, r8, #16\n\t"
  49135. "lsr r7, r7, #16\n\t"
  49136. "mul r6, r7, r6\n\t"
  49137. "lsr r7, r6, #16\n\t"
  49138. "lsl r6, r6, #16\n\t"
  49139. "adds r3, r3, r6\n\t"
  49140. "adc r4, r4, r7\n\t"
  49141. #else
  49142. "umlal r3, r4, %[b], r8\n\t"
  49143. #endif
  49144. "stm %[r]!, {r3}\n\t"
  49145. "mov r5, #0\n\t"
  49146. /* A[88] * B */
  49147. "ldm %[a]!, {r8}\n\t"
  49148. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49149. "lsl r6, %[b], #16\n\t"
  49150. "lsl r7, r8, #16\n\t"
  49151. "lsr r6, r6, #16\n\t"
  49152. "lsr r7, r7, #16\n\t"
  49153. "mul r7, r6, r7\n\t"
  49154. "adds r4, r4, r7\n\t"
  49155. "adc r5, r5, #0\n\t"
  49156. "lsr r7, r8, #16\n\t"
  49157. "mul r6, r7, r6\n\t"
  49158. "lsr r7, r6, #16\n\t"
  49159. "lsl r6, r6, #16\n\t"
  49160. "adds r4, r4, r6\n\t"
  49161. "adc r5, r5, r7\n\t"
  49162. "lsr r6, %[b], #16\n\t"
  49163. "lsr r7, r8, #16\n\t"
  49164. "mul r7, r6, r7\n\t"
  49165. "add r5, r5, r7\n\t"
  49166. "lsl r7, r8, #16\n\t"
  49167. "lsr r7, r7, #16\n\t"
  49168. "mul r6, r7, r6\n\t"
  49169. "lsr r7, r6, #16\n\t"
  49170. "lsl r6, r6, #16\n\t"
  49171. "adds r4, r4, r6\n\t"
  49172. "adc r5, r5, r7\n\t"
  49173. #else
  49174. "umlal r4, r5, %[b], r8\n\t"
  49175. #endif
  49176. "stm %[r]!, {r4}\n\t"
  49177. "mov r3, #0\n\t"
  49178. /* A[89] * B */
  49179. "ldm %[a]!, {r8}\n\t"
  49180. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49181. "lsl r6, %[b], #16\n\t"
  49182. "lsl r7, r8, #16\n\t"
  49183. "lsr r6, r6, #16\n\t"
  49184. "lsr r7, r7, #16\n\t"
  49185. "mul r7, r6, r7\n\t"
  49186. "adds r5, r5, r7\n\t"
  49187. "adc r3, r3, #0\n\t"
  49188. "lsr r7, r8, #16\n\t"
  49189. "mul r6, r7, r6\n\t"
  49190. "lsr r7, r6, #16\n\t"
  49191. "lsl r6, r6, #16\n\t"
  49192. "adds r5, r5, r6\n\t"
  49193. "adc r3, r3, r7\n\t"
  49194. "lsr r6, %[b], #16\n\t"
  49195. "lsr r7, r8, #16\n\t"
  49196. "mul r7, r6, r7\n\t"
  49197. "add r3, r3, r7\n\t"
  49198. "lsl r7, r8, #16\n\t"
  49199. "lsr r7, r7, #16\n\t"
  49200. "mul r6, r7, r6\n\t"
  49201. "lsr r7, r6, #16\n\t"
  49202. "lsl r6, r6, #16\n\t"
  49203. "adds r5, r5, r6\n\t"
  49204. "adc r3, r3, r7\n\t"
  49205. #else
  49206. "umlal r5, r3, %[b], r8\n\t"
  49207. #endif
  49208. "stm %[r]!, {r5}\n\t"
  49209. "mov r4, #0\n\t"
  49210. /* A[90] * B */
  49211. "ldm %[a]!, {r8}\n\t"
  49212. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49213. "lsl r6, %[b], #16\n\t"
  49214. "lsl r7, r8, #16\n\t"
  49215. "lsr r6, r6, #16\n\t"
  49216. "lsr r7, r7, #16\n\t"
  49217. "mul r7, r6, r7\n\t"
  49218. "adds r3, r3, r7\n\t"
  49219. "adc r4, r4, #0\n\t"
  49220. "lsr r7, r8, #16\n\t"
  49221. "mul r6, r7, r6\n\t"
  49222. "lsr r7, r6, #16\n\t"
  49223. "lsl r6, r6, #16\n\t"
  49224. "adds r3, r3, r6\n\t"
  49225. "adc r4, r4, r7\n\t"
  49226. "lsr r6, %[b], #16\n\t"
  49227. "lsr r7, r8, #16\n\t"
  49228. "mul r7, r6, r7\n\t"
  49229. "add r4, r4, r7\n\t"
  49230. "lsl r7, r8, #16\n\t"
  49231. "lsr r7, r7, #16\n\t"
  49232. "mul r6, r7, r6\n\t"
  49233. "lsr r7, r6, #16\n\t"
  49234. "lsl r6, r6, #16\n\t"
  49235. "adds r3, r3, r6\n\t"
  49236. "adc r4, r4, r7\n\t"
  49237. #else
  49238. "umlal r3, r4, %[b], r8\n\t"
  49239. #endif
  49240. "stm %[r]!, {r3}\n\t"
  49241. "mov r5, #0\n\t"
  49242. /* A[91] * B */
  49243. "ldm %[a]!, {r8}\n\t"
  49244. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49245. "lsl r6, %[b], #16\n\t"
  49246. "lsl r7, r8, #16\n\t"
  49247. "lsr r6, r6, #16\n\t"
  49248. "lsr r7, r7, #16\n\t"
  49249. "mul r7, r6, r7\n\t"
  49250. "adds r4, r4, r7\n\t"
  49251. "adc r5, r5, #0\n\t"
  49252. "lsr r7, r8, #16\n\t"
  49253. "mul r6, r7, r6\n\t"
  49254. "lsr r7, r6, #16\n\t"
  49255. "lsl r6, r6, #16\n\t"
  49256. "adds r4, r4, r6\n\t"
  49257. "adc r5, r5, r7\n\t"
  49258. "lsr r6, %[b], #16\n\t"
  49259. "lsr r7, r8, #16\n\t"
  49260. "mul r7, r6, r7\n\t"
  49261. "add r5, r5, r7\n\t"
  49262. "lsl r7, r8, #16\n\t"
  49263. "lsr r7, r7, #16\n\t"
  49264. "mul r6, r7, r6\n\t"
  49265. "lsr r7, r6, #16\n\t"
  49266. "lsl r6, r6, #16\n\t"
  49267. "adds r4, r4, r6\n\t"
  49268. "adc r5, r5, r7\n\t"
  49269. #else
  49270. "umlal r4, r5, %[b], r8\n\t"
  49271. #endif
  49272. "stm %[r]!, {r4}\n\t"
  49273. "mov r3, #0\n\t"
  49274. /* A[92] * B */
  49275. "ldm %[a]!, {r8}\n\t"
  49276. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49277. "lsl r6, %[b], #16\n\t"
  49278. "lsl r7, r8, #16\n\t"
  49279. "lsr r6, r6, #16\n\t"
  49280. "lsr r7, r7, #16\n\t"
  49281. "mul r7, r6, r7\n\t"
  49282. "adds r5, r5, r7\n\t"
  49283. "adc r3, r3, #0\n\t"
  49284. "lsr r7, r8, #16\n\t"
  49285. "mul r6, r7, r6\n\t"
  49286. "lsr r7, r6, #16\n\t"
  49287. "lsl r6, r6, #16\n\t"
  49288. "adds r5, r5, r6\n\t"
  49289. "adc r3, r3, r7\n\t"
  49290. "lsr r6, %[b], #16\n\t"
  49291. "lsr r7, r8, #16\n\t"
  49292. "mul r7, r6, r7\n\t"
  49293. "add r3, r3, r7\n\t"
  49294. "lsl r7, r8, #16\n\t"
  49295. "lsr r7, r7, #16\n\t"
  49296. "mul r6, r7, r6\n\t"
  49297. "lsr r7, r6, #16\n\t"
  49298. "lsl r6, r6, #16\n\t"
  49299. "adds r5, r5, r6\n\t"
  49300. "adc r3, r3, r7\n\t"
  49301. #else
  49302. "umlal r5, r3, %[b], r8\n\t"
  49303. #endif
  49304. "stm %[r]!, {r5}\n\t"
  49305. "mov r4, #0\n\t"
  49306. /* A[93] * B */
  49307. "ldm %[a]!, {r8}\n\t"
  49308. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49309. "lsl r6, %[b], #16\n\t"
  49310. "lsl r7, r8, #16\n\t"
  49311. "lsr r6, r6, #16\n\t"
  49312. "lsr r7, r7, #16\n\t"
  49313. "mul r7, r6, r7\n\t"
  49314. "adds r3, r3, r7\n\t"
  49315. "adc r4, r4, #0\n\t"
  49316. "lsr r7, r8, #16\n\t"
  49317. "mul r6, r7, r6\n\t"
  49318. "lsr r7, r6, #16\n\t"
  49319. "lsl r6, r6, #16\n\t"
  49320. "adds r3, r3, r6\n\t"
  49321. "adc r4, r4, r7\n\t"
  49322. "lsr r6, %[b], #16\n\t"
  49323. "lsr r7, r8, #16\n\t"
  49324. "mul r7, r6, r7\n\t"
  49325. "add r4, r4, r7\n\t"
  49326. "lsl r7, r8, #16\n\t"
  49327. "lsr r7, r7, #16\n\t"
  49328. "mul r6, r7, r6\n\t"
  49329. "lsr r7, r6, #16\n\t"
  49330. "lsl r6, r6, #16\n\t"
  49331. "adds r3, r3, r6\n\t"
  49332. "adc r4, r4, r7\n\t"
  49333. #else
  49334. "umlal r3, r4, %[b], r8\n\t"
  49335. #endif
  49336. "stm %[r]!, {r3}\n\t"
  49337. "mov r5, #0\n\t"
  49338. /* A[94] * B */
  49339. "ldm %[a]!, {r8}\n\t"
  49340. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49341. "lsl r6, %[b], #16\n\t"
  49342. "lsl r7, r8, #16\n\t"
  49343. "lsr r6, r6, #16\n\t"
  49344. "lsr r7, r7, #16\n\t"
  49345. "mul r7, r6, r7\n\t"
  49346. "adds r4, r4, r7\n\t"
  49347. "adc r5, r5, #0\n\t"
  49348. "lsr r7, r8, #16\n\t"
  49349. "mul r6, r7, r6\n\t"
  49350. "lsr r7, r6, #16\n\t"
  49351. "lsl r6, r6, #16\n\t"
  49352. "adds r4, r4, r6\n\t"
  49353. "adc r5, r5, r7\n\t"
  49354. "lsr r6, %[b], #16\n\t"
  49355. "lsr r7, r8, #16\n\t"
  49356. "mul r7, r6, r7\n\t"
  49357. "add r5, r5, r7\n\t"
  49358. "lsl r7, r8, #16\n\t"
  49359. "lsr r7, r7, #16\n\t"
  49360. "mul r6, r7, r6\n\t"
  49361. "lsr r7, r6, #16\n\t"
  49362. "lsl r6, r6, #16\n\t"
  49363. "adds r4, r4, r6\n\t"
  49364. "adc r5, r5, r7\n\t"
  49365. #else
  49366. "umlal r4, r5, %[b], r8\n\t"
  49367. #endif
  49368. "stm %[r]!, {r4}\n\t"
  49369. "mov r3, #0\n\t"
  49370. /* A[95] * B */
  49371. "ldm %[a]!, {r8}\n\t"
  49372. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49373. "lsl r6, %[b], #16\n\t"
  49374. "lsl r7, r8, #16\n\t"
  49375. "lsr r6, r6, #16\n\t"
  49376. "lsr r7, r7, #16\n\t"
  49377. "mul r7, r6, r7\n\t"
  49378. "adds r5, r5, r7\n\t"
  49379. "adc r3, r3, #0\n\t"
  49380. "lsr r7, r8, #16\n\t"
  49381. "mul r6, r7, r6\n\t"
  49382. "lsr r7, r6, #16\n\t"
  49383. "lsl r6, r6, #16\n\t"
  49384. "adds r5, r5, r6\n\t"
  49385. "adc r3, r3, r7\n\t"
  49386. "lsr r6, %[b], #16\n\t"
  49387. "lsr r7, r8, #16\n\t"
  49388. "mul r7, r6, r7\n\t"
  49389. "add r3, r3, r7\n\t"
  49390. "lsl r7, r8, #16\n\t"
  49391. "lsr r7, r7, #16\n\t"
  49392. "mul r6, r7, r6\n\t"
  49393. "lsr r7, r6, #16\n\t"
  49394. "lsl r6, r6, #16\n\t"
  49395. "adds r5, r5, r6\n\t"
  49396. "adc r3, r3, r7\n\t"
  49397. #else
  49398. "umlal r5, r3, %[b], r8\n\t"
  49399. #endif
  49400. "stm %[r]!, {r5}\n\t"
  49401. "mov r4, #0\n\t"
  49402. /* A[96] * B */
  49403. "ldm %[a]!, {r8}\n\t"
  49404. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49405. "lsl r6, %[b], #16\n\t"
  49406. "lsl r7, r8, #16\n\t"
  49407. "lsr r6, r6, #16\n\t"
  49408. "lsr r7, r7, #16\n\t"
  49409. "mul r7, r6, r7\n\t"
  49410. "adds r3, r3, r7\n\t"
  49411. "adc r4, r4, #0\n\t"
  49412. "lsr r7, r8, #16\n\t"
  49413. "mul r6, r7, r6\n\t"
  49414. "lsr r7, r6, #16\n\t"
  49415. "lsl r6, r6, #16\n\t"
  49416. "adds r3, r3, r6\n\t"
  49417. "adc r4, r4, r7\n\t"
  49418. "lsr r6, %[b], #16\n\t"
  49419. "lsr r7, r8, #16\n\t"
  49420. "mul r7, r6, r7\n\t"
  49421. "add r4, r4, r7\n\t"
  49422. "lsl r7, r8, #16\n\t"
  49423. "lsr r7, r7, #16\n\t"
  49424. "mul r6, r7, r6\n\t"
  49425. "lsr r7, r6, #16\n\t"
  49426. "lsl r6, r6, #16\n\t"
  49427. "adds r3, r3, r6\n\t"
  49428. "adc r4, r4, r7\n\t"
  49429. #else
  49430. "umlal r3, r4, %[b], r8\n\t"
  49431. #endif
  49432. "stm %[r]!, {r3}\n\t"
  49433. "mov r5, #0\n\t"
  49434. /* A[97] * B */
  49435. "ldm %[a]!, {r8}\n\t"
  49436. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49437. "lsl r6, %[b], #16\n\t"
  49438. "lsl r7, r8, #16\n\t"
  49439. "lsr r6, r6, #16\n\t"
  49440. "lsr r7, r7, #16\n\t"
  49441. "mul r7, r6, r7\n\t"
  49442. "adds r4, r4, r7\n\t"
  49443. "adc r5, r5, #0\n\t"
  49444. "lsr r7, r8, #16\n\t"
  49445. "mul r6, r7, r6\n\t"
  49446. "lsr r7, r6, #16\n\t"
  49447. "lsl r6, r6, #16\n\t"
  49448. "adds r4, r4, r6\n\t"
  49449. "adc r5, r5, r7\n\t"
  49450. "lsr r6, %[b], #16\n\t"
  49451. "lsr r7, r8, #16\n\t"
  49452. "mul r7, r6, r7\n\t"
  49453. "add r5, r5, r7\n\t"
  49454. "lsl r7, r8, #16\n\t"
  49455. "lsr r7, r7, #16\n\t"
  49456. "mul r6, r7, r6\n\t"
  49457. "lsr r7, r6, #16\n\t"
  49458. "lsl r6, r6, #16\n\t"
  49459. "adds r4, r4, r6\n\t"
  49460. "adc r5, r5, r7\n\t"
  49461. #else
  49462. "umlal r4, r5, %[b], r8\n\t"
  49463. #endif
  49464. "stm %[r]!, {r4}\n\t"
  49465. "mov r3, #0\n\t"
  49466. /* A[98] * B */
  49467. "ldm %[a]!, {r8}\n\t"
  49468. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49469. "lsl r6, %[b], #16\n\t"
  49470. "lsl r7, r8, #16\n\t"
  49471. "lsr r6, r6, #16\n\t"
  49472. "lsr r7, r7, #16\n\t"
  49473. "mul r7, r6, r7\n\t"
  49474. "adds r5, r5, r7\n\t"
  49475. "adc r3, r3, #0\n\t"
  49476. "lsr r7, r8, #16\n\t"
  49477. "mul r6, r7, r6\n\t"
  49478. "lsr r7, r6, #16\n\t"
  49479. "lsl r6, r6, #16\n\t"
  49480. "adds r5, r5, r6\n\t"
  49481. "adc r3, r3, r7\n\t"
  49482. "lsr r6, %[b], #16\n\t"
  49483. "lsr r7, r8, #16\n\t"
  49484. "mul r7, r6, r7\n\t"
  49485. "add r3, r3, r7\n\t"
  49486. "lsl r7, r8, #16\n\t"
  49487. "lsr r7, r7, #16\n\t"
  49488. "mul r6, r7, r6\n\t"
  49489. "lsr r7, r6, #16\n\t"
  49490. "lsl r6, r6, #16\n\t"
  49491. "adds r5, r5, r6\n\t"
  49492. "adc r3, r3, r7\n\t"
  49493. #else
  49494. "umlal r5, r3, %[b], r8\n\t"
  49495. #endif
  49496. "stm %[r]!, {r5}\n\t"
  49497. "mov r4, #0\n\t"
  49498. /* A[99] * B */
  49499. "ldm %[a]!, {r8}\n\t"
  49500. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49501. "lsl r6, %[b], #16\n\t"
  49502. "lsl r7, r8, #16\n\t"
  49503. "lsr r6, r6, #16\n\t"
  49504. "lsr r7, r7, #16\n\t"
  49505. "mul r7, r6, r7\n\t"
  49506. "adds r3, r3, r7\n\t"
  49507. "adc r4, r4, #0\n\t"
  49508. "lsr r7, r8, #16\n\t"
  49509. "mul r6, r7, r6\n\t"
  49510. "lsr r7, r6, #16\n\t"
  49511. "lsl r6, r6, #16\n\t"
  49512. "adds r3, r3, r6\n\t"
  49513. "adc r4, r4, r7\n\t"
  49514. "lsr r6, %[b], #16\n\t"
  49515. "lsr r7, r8, #16\n\t"
  49516. "mul r7, r6, r7\n\t"
  49517. "add r4, r4, r7\n\t"
  49518. "lsl r7, r8, #16\n\t"
  49519. "lsr r7, r7, #16\n\t"
  49520. "mul r6, r7, r6\n\t"
  49521. "lsr r7, r6, #16\n\t"
  49522. "lsl r6, r6, #16\n\t"
  49523. "adds r3, r3, r6\n\t"
  49524. "adc r4, r4, r7\n\t"
  49525. #else
  49526. "umlal r3, r4, %[b], r8\n\t"
  49527. #endif
  49528. "stm %[r]!, {r3}\n\t"
  49529. "mov r5, #0\n\t"
  49530. /* A[100] * B */
  49531. "ldm %[a]!, {r8}\n\t"
  49532. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49533. "lsl r6, %[b], #16\n\t"
  49534. "lsl r7, r8, #16\n\t"
  49535. "lsr r6, r6, #16\n\t"
  49536. "lsr r7, r7, #16\n\t"
  49537. "mul r7, r6, r7\n\t"
  49538. "adds r4, r4, r7\n\t"
  49539. "adc r5, r5, #0\n\t"
  49540. "lsr r7, r8, #16\n\t"
  49541. "mul r6, r7, r6\n\t"
  49542. "lsr r7, r6, #16\n\t"
  49543. "lsl r6, r6, #16\n\t"
  49544. "adds r4, r4, r6\n\t"
  49545. "adc r5, r5, r7\n\t"
  49546. "lsr r6, %[b], #16\n\t"
  49547. "lsr r7, r8, #16\n\t"
  49548. "mul r7, r6, r7\n\t"
  49549. "add r5, r5, r7\n\t"
  49550. "lsl r7, r8, #16\n\t"
  49551. "lsr r7, r7, #16\n\t"
  49552. "mul r6, r7, r6\n\t"
  49553. "lsr r7, r6, #16\n\t"
  49554. "lsl r6, r6, #16\n\t"
  49555. "adds r4, r4, r6\n\t"
  49556. "adc r5, r5, r7\n\t"
  49557. #else
  49558. "umlal r4, r5, %[b], r8\n\t"
  49559. #endif
  49560. "stm %[r]!, {r4}\n\t"
  49561. "mov r3, #0\n\t"
  49562. /* A[101] * B */
  49563. "ldm %[a]!, {r8}\n\t"
  49564. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49565. "lsl r6, %[b], #16\n\t"
  49566. "lsl r7, r8, #16\n\t"
  49567. "lsr r6, r6, #16\n\t"
  49568. "lsr r7, r7, #16\n\t"
  49569. "mul r7, r6, r7\n\t"
  49570. "adds r5, r5, r7\n\t"
  49571. "adc r3, r3, #0\n\t"
  49572. "lsr r7, r8, #16\n\t"
  49573. "mul r6, r7, r6\n\t"
  49574. "lsr r7, r6, #16\n\t"
  49575. "lsl r6, r6, #16\n\t"
  49576. "adds r5, r5, r6\n\t"
  49577. "adc r3, r3, r7\n\t"
  49578. "lsr r6, %[b], #16\n\t"
  49579. "lsr r7, r8, #16\n\t"
  49580. "mul r7, r6, r7\n\t"
  49581. "add r3, r3, r7\n\t"
  49582. "lsl r7, r8, #16\n\t"
  49583. "lsr r7, r7, #16\n\t"
  49584. "mul r6, r7, r6\n\t"
  49585. "lsr r7, r6, #16\n\t"
  49586. "lsl r6, r6, #16\n\t"
  49587. "adds r5, r5, r6\n\t"
  49588. "adc r3, r3, r7\n\t"
  49589. #else
  49590. "umlal r5, r3, %[b], r8\n\t"
  49591. #endif
  49592. "stm %[r]!, {r5}\n\t"
  49593. "mov r4, #0\n\t"
  49594. /* A[102] * B */
  49595. "ldm %[a]!, {r8}\n\t"
  49596. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49597. "lsl r6, %[b], #16\n\t"
  49598. "lsl r7, r8, #16\n\t"
  49599. "lsr r6, r6, #16\n\t"
  49600. "lsr r7, r7, #16\n\t"
  49601. "mul r7, r6, r7\n\t"
  49602. "adds r3, r3, r7\n\t"
  49603. "adc r4, r4, #0\n\t"
  49604. "lsr r7, r8, #16\n\t"
  49605. "mul r6, r7, r6\n\t"
  49606. "lsr r7, r6, #16\n\t"
  49607. "lsl r6, r6, #16\n\t"
  49608. "adds r3, r3, r6\n\t"
  49609. "adc r4, r4, r7\n\t"
  49610. "lsr r6, %[b], #16\n\t"
  49611. "lsr r7, r8, #16\n\t"
  49612. "mul r7, r6, r7\n\t"
  49613. "add r4, r4, r7\n\t"
  49614. "lsl r7, r8, #16\n\t"
  49615. "lsr r7, r7, #16\n\t"
  49616. "mul r6, r7, r6\n\t"
  49617. "lsr r7, r6, #16\n\t"
  49618. "lsl r6, r6, #16\n\t"
  49619. "adds r3, r3, r6\n\t"
  49620. "adc r4, r4, r7\n\t"
  49621. #else
  49622. "umlal r3, r4, %[b], r8\n\t"
  49623. #endif
  49624. "stm %[r]!, {r3}\n\t"
  49625. "mov r5, #0\n\t"
  49626. /* A[103] * B */
  49627. "ldm %[a]!, {r8}\n\t"
  49628. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49629. "lsl r6, %[b], #16\n\t"
  49630. "lsl r7, r8, #16\n\t"
  49631. "lsr r6, r6, #16\n\t"
  49632. "lsr r7, r7, #16\n\t"
  49633. "mul r7, r6, r7\n\t"
  49634. "adds r4, r4, r7\n\t"
  49635. "adc r5, r5, #0\n\t"
  49636. "lsr r7, r8, #16\n\t"
  49637. "mul r6, r7, r6\n\t"
  49638. "lsr r7, r6, #16\n\t"
  49639. "lsl r6, r6, #16\n\t"
  49640. "adds r4, r4, r6\n\t"
  49641. "adc r5, r5, r7\n\t"
  49642. "lsr r6, %[b], #16\n\t"
  49643. "lsr r7, r8, #16\n\t"
  49644. "mul r7, r6, r7\n\t"
  49645. "add r5, r5, r7\n\t"
  49646. "lsl r7, r8, #16\n\t"
  49647. "lsr r7, r7, #16\n\t"
  49648. "mul r6, r7, r6\n\t"
  49649. "lsr r7, r6, #16\n\t"
  49650. "lsl r6, r6, #16\n\t"
  49651. "adds r4, r4, r6\n\t"
  49652. "adc r5, r5, r7\n\t"
  49653. #else
  49654. "umlal r4, r5, %[b], r8\n\t"
  49655. #endif
  49656. "stm %[r]!, {r4}\n\t"
  49657. "mov r3, #0\n\t"
  49658. /* A[104] * B */
  49659. "ldm %[a]!, {r8}\n\t"
  49660. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49661. "lsl r6, %[b], #16\n\t"
  49662. "lsl r7, r8, #16\n\t"
  49663. "lsr r6, r6, #16\n\t"
  49664. "lsr r7, r7, #16\n\t"
  49665. "mul r7, r6, r7\n\t"
  49666. "adds r5, r5, r7\n\t"
  49667. "adc r3, r3, #0\n\t"
  49668. "lsr r7, r8, #16\n\t"
  49669. "mul r6, r7, r6\n\t"
  49670. "lsr r7, r6, #16\n\t"
  49671. "lsl r6, r6, #16\n\t"
  49672. "adds r5, r5, r6\n\t"
  49673. "adc r3, r3, r7\n\t"
  49674. "lsr r6, %[b], #16\n\t"
  49675. "lsr r7, r8, #16\n\t"
  49676. "mul r7, r6, r7\n\t"
  49677. "add r3, r3, r7\n\t"
  49678. "lsl r7, r8, #16\n\t"
  49679. "lsr r7, r7, #16\n\t"
  49680. "mul r6, r7, r6\n\t"
  49681. "lsr r7, r6, #16\n\t"
  49682. "lsl r6, r6, #16\n\t"
  49683. "adds r5, r5, r6\n\t"
  49684. "adc r3, r3, r7\n\t"
  49685. #else
  49686. "umlal r5, r3, %[b], r8\n\t"
  49687. #endif
  49688. "stm %[r]!, {r5}\n\t"
  49689. "mov r4, #0\n\t"
  49690. /* A[105] * B */
  49691. "ldm %[a]!, {r8}\n\t"
  49692. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49693. "lsl r6, %[b], #16\n\t"
  49694. "lsl r7, r8, #16\n\t"
  49695. "lsr r6, r6, #16\n\t"
  49696. "lsr r7, r7, #16\n\t"
  49697. "mul r7, r6, r7\n\t"
  49698. "adds r3, r3, r7\n\t"
  49699. "adc r4, r4, #0\n\t"
  49700. "lsr r7, r8, #16\n\t"
  49701. "mul r6, r7, r6\n\t"
  49702. "lsr r7, r6, #16\n\t"
  49703. "lsl r6, r6, #16\n\t"
  49704. "adds r3, r3, r6\n\t"
  49705. "adc r4, r4, r7\n\t"
  49706. "lsr r6, %[b], #16\n\t"
  49707. "lsr r7, r8, #16\n\t"
  49708. "mul r7, r6, r7\n\t"
  49709. "add r4, r4, r7\n\t"
  49710. "lsl r7, r8, #16\n\t"
  49711. "lsr r7, r7, #16\n\t"
  49712. "mul r6, r7, r6\n\t"
  49713. "lsr r7, r6, #16\n\t"
  49714. "lsl r6, r6, #16\n\t"
  49715. "adds r3, r3, r6\n\t"
  49716. "adc r4, r4, r7\n\t"
  49717. #else
  49718. "umlal r3, r4, %[b], r8\n\t"
  49719. #endif
  49720. "stm %[r]!, {r3}\n\t"
  49721. "mov r5, #0\n\t"
  49722. /* A[106] * B */
  49723. "ldm %[a]!, {r8}\n\t"
  49724. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49725. "lsl r6, %[b], #16\n\t"
  49726. "lsl r7, r8, #16\n\t"
  49727. "lsr r6, r6, #16\n\t"
  49728. "lsr r7, r7, #16\n\t"
  49729. "mul r7, r6, r7\n\t"
  49730. "adds r4, r4, r7\n\t"
  49731. "adc r5, r5, #0\n\t"
  49732. "lsr r7, r8, #16\n\t"
  49733. "mul r6, r7, r6\n\t"
  49734. "lsr r7, r6, #16\n\t"
  49735. "lsl r6, r6, #16\n\t"
  49736. "adds r4, r4, r6\n\t"
  49737. "adc r5, r5, r7\n\t"
  49738. "lsr r6, %[b], #16\n\t"
  49739. "lsr r7, r8, #16\n\t"
  49740. "mul r7, r6, r7\n\t"
  49741. "add r5, r5, r7\n\t"
  49742. "lsl r7, r8, #16\n\t"
  49743. "lsr r7, r7, #16\n\t"
  49744. "mul r6, r7, r6\n\t"
  49745. "lsr r7, r6, #16\n\t"
  49746. "lsl r6, r6, #16\n\t"
  49747. "adds r4, r4, r6\n\t"
  49748. "adc r5, r5, r7\n\t"
  49749. #else
  49750. "umlal r4, r5, %[b], r8\n\t"
  49751. #endif
  49752. "stm %[r]!, {r4}\n\t"
  49753. "mov r3, #0\n\t"
  49754. /* A[107] * B */
  49755. "ldm %[a]!, {r8}\n\t"
  49756. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49757. "lsl r6, %[b], #16\n\t"
  49758. "lsl r7, r8, #16\n\t"
  49759. "lsr r6, r6, #16\n\t"
  49760. "lsr r7, r7, #16\n\t"
  49761. "mul r7, r6, r7\n\t"
  49762. "adds r5, r5, r7\n\t"
  49763. "adc r3, r3, #0\n\t"
  49764. "lsr r7, r8, #16\n\t"
  49765. "mul r6, r7, r6\n\t"
  49766. "lsr r7, r6, #16\n\t"
  49767. "lsl r6, r6, #16\n\t"
  49768. "adds r5, r5, r6\n\t"
  49769. "adc r3, r3, r7\n\t"
  49770. "lsr r6, %[b], #16\n\t"
  49771. "lsr r7, r8, #16\n\t"
  49772. "mul r7, r6, r7\n\t"
  49773. "add r3, r3, r7\n\t"
  49774. "lsl r7, r8, #16\n\t"
  49775. "lsr r7, r7, #16\n\t"
  49776. "mul r6, r7, r6\n\t"
  49777. "lsr r7, r6, #16\n\t"
  49778. "lsl r6, r6, #16\n\t"
  49779. "adds r5, r5, r6\n\t"
  49780. "adc r3, r3, r7\n\t"
  49781. #else
  49782. "umlal r5, r3, %[b], r8\n\t"
  49783. #endif
  49784. "stm %[r]!, {r5}\n\t"
  49785. "mov r4, #0\n\t"
  49786. /* A[108] * B */
  49787. "ldm %[a]!, {r8}\n\t"
  49788. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49789. "lsl r6, %[b], #16\n\t"
  49790. "lsl r7, r8, #16\n\t"
  49791. "lsr r6, r6, #16\n\t"
  49792. "lsr r7, r7, #16\n\t"
  49793. "mul r7, r6, r7\n\t"
  49794. "adds r3, r3, r7\n\t"
  49795. "adc r4, r4, #0\n\t"
  49796. "lsr r7, r8, #16\n\t"
  49797. "mul r6, r7, r6\n\t"
  49798. "lsr r7, r6, #16\n\t"
  49799. "lsl r6, r6, #16\n\t"
  49800. "adds r3, r3, r6\n\t"
  49801. "adc r4, r4, r7\n\t"
  49802. "lsr r6, %[b], #16\n\t"
  49803. "lsr r7, r8, #16\n\t"
  49804. "mul r7, r6, r7\n\t"
  49805. "add r4, r4, r7\n\t"
  49806. "lsl r7, r8, #16\n\t"
  49807. "lsr r7, r7, #16\n\t"
  49808. "mul r6, r7, r6\n\t"
  49809. "lsr r7, r6, #16\n\t"
  49810. "lsl r6, r6, #16\n\t"
  49811. "adds r3, r3, r6\n\t"
  49812. "adc r4, r4, r7\n\t"
  49813. #else
  49814. "umlal r3, r4, %[b], r8\n\t"
  49815. #endif
  49816. "stm %[r]!, {r3}\n\t"
  49817. "mov r5, #0\n\t"
  49818. /* A[109] * B */
  49819. "ldm %[a]!, {r8}\n\t"
  49820. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49821. "lsl r6, %[b], #16\n\t"
  49822. "lsl r7, r8, #16\n\t"
  49823. "lsr r6, r6, #16\n\t"
  49824. "lsr r7, r7, #16\n\t"
  49825. "mul r7, r6, r7\n\t"
  49826. "adds r4, r4, r7\n\t"
  49827. "adc r5, r5, #0\n\t"
  49828. "lsr r7, r8, #16\n\t"
  49829. "mul r6, r7, r6\n\t"
  49830. "lsr r7, r6, #16\n\t"
  49831. "lsl r6, r6, #16\n\t"
  49832. "adds r4, r4, r6\n\t"
  49833. "adc r5, r5, r7\n\t"
  49834. "lsr r6, %[b], #16\n\t"
  49835. "lsr r7, r8, #16\n\t"
  49836. "mul r7, r6, r7\n\t"
  49837. "add r5, r5, r7\n\t"
  49838. "lsl r7, r8, #16\n\t"
  49839. "lsr r7, r7, #16\n\t"
  49840. "mul r6, r7, r6\n\t"
  49841. "lsr r7, r6, #16\n\t"
  49842. "lsl r6, r6, #16\n\t"
  49843. "adds r4, r4, r6\n\t"
  49844. "adc r5, r5, r7\n\t"
  49845. #else
  49846. "umlal r4, r5, %[b], r8\n\t"
  49847. #endif
  49848. "stm %[r]!, {r4}\n\t"
  49849. "mov r3, #0\n\t"
  49850. /* A[110] * B */
  49851. "ldm %[a]!, {r8}\n\t"
  49852. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49853. "lsl r6, %[b], #16\n\t"
  49854. "lsl r7, r8, #16\n\t"
  49855. "lsr r6, r6, #16\n\t"
  49856. "lsr r7, r7, #16\n\t"
  49857. "mul r7, r6, r7\n\t"
  49858. "adds r5, r5, r7\n\t"
  49859. "adc r3, r3, #0\n\t"
  49860. "lsr r7, r8, #16\n\t"
  49861. "mul r6, r7, r6\n\t"
  49862. "lsr r7, r6, #16\n\t"
  49863. "lsl r6, r6, #16\n\t"
  49864. "adds r5, r5, r6\n\t"
  49865. "adc r3, r3, r7\n\t"
  49866. "lsr r6, %[b], #16\n\t"
  49867. "lsr r7, r8, #16\n\t"
  49868. "mul r7, r6, r7\n\t"
  49869. "add r3, r3, r7\n\t"
  49870. "lsl r7, r8, #16\n\t"
  49871. "lsr r7, r7, #16\n\t"
  49872. "mul r6, r7, r6\n\t"
  49873. "lsr r7, r6, #16\n\t"
  49874. "lsl r6, r6, #16\n\t"
  49875. "adds r5, r5, r6\n\t"
  49876. "adc r3, r3, r7\n\t"
  49877. #else
  49878. "umlal r5, r3, %[b], r8\n\t"
  49879. #endif
  49880. "stm %[r]!, {r5}\n\t"
  49881. "mov r4, #0\n\t"
  49882. /* A[111] * B */
  49883. "ldm %[a]!, {r8}\n\t"
  49884. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49885. "lsl r6, %[b], #16\n\t"
  49886. "lsl r7, r8, #16\n\t"
  49887. "lsr r6, r6, #16\n\t"
  49888. "lsr r7, r7, #16\n\t"
  49889. "mul r7, r6, r7\n\t"
  49890. "adds r3, r3, r7\n\t"
  49891. "adc r4, r4, #0\n\t"
  49892. "lsr r7, r8, #16\n\t"
  49893. "mul r6, r7, r6\n\t"
  49894. "lsr r7, r6, #16\n\t"
  49895. "lsl r6, r6, #16\n\t"
  49896. "adds r3, r3, r6\n\t"
  49897. "adc r4, r4, r7\n\t"
  49898. "lsr r6, %[b], #16\n\t"
  49899. "lsr r7, r8, #16\n\t"
  49900. "mul r7, r6, r7\n\t"
  49901. "add r4, r4, r7\n\t"
  49902. "lsl r7, r8, #16\n\t"
  49903. "lsr r7, r7, #16\n\t"
  49904. "mul r6, r7, r6\n\t"
  49905. "lsr r7, r6, #16\n\t"
  49906. "lsl r6, r6, #16\n\t"
  49907. "adds r3, r3, r6\n\t"
  49908. "adc r4, r4, r7\n\t"
  49909. #else
  49910. "umlal r3, r4, %[b], r8\n\t"
  49911. #endif
  49912. "stm %[r]!, {r3}\n\t"
  49913. "mov r5, #0\n\t"
  49914. /* A[112] * B */
  49915. "ldm %[a]!, {r8}\n\t"
  49916. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49917. "lsl r6, %[b], #16\n\t"
  49918. "lsl r7, r8, #16\n\t"
  49919. "lsr r6, r6, #16\n\t"
  49920. "lsr r7, r7, #16\n\t"
  49921. "mul r7, r6, r7\n\t"
  49922. "adds r4, r4, r7\n\t"
  49923. "adc r5, r5, #0\n\t"
  49924. "lsr r7, r8, #16\n\t"
  49925. "mul r6, r7, r6\n\t"
  49926. "lsr r7, r6, #16\n\t"
  49927. "lsl r6, r6, #16\n\t"
  49928. "adds r4, r4, r6\n\t"
  49929. "adc r5, r5, r7\n\t"
  49930. "lsr r6, %[b], #16\n\t"
  49931. "lsr r7, r8, #16\n\t"
  49932. "mul r7, r6, r7\n\t"
  49933. "add r5, r5, r7\n\t"
  49934. "lsl r7, r8, #16\n\t"
  49935. "lsr r7, r7, #16\n\t"
  49936. "mul r6, r7, r6\n\t"
  49937. "lsr r7, r6, #16\n\t"
  49938. "lsl r6, r6, #16\n\t"
  49939. "adds r4, r4, r6\n\t"
  49940. "adc r5, r5, r7\n\t"
  49941. #else
  49942. "umlal r4, r5, %[b], r8\n\t"
  49943. #endif
  49944. "stm %[r]!, {r4}\n\t"
  49945. "mov r3, #0\n\t"
  49946. /* A[113] * B */
  49947. "ldm %[a]!, {r8}\n\t"
  49948. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49949. "lsl r6, %[b], #16\n\t"
  49950. "lsl r7, r8, #16\n\t"
  49951. "lsr r6, r6, #16\n\t"
  49952. "lsr r7, r7, #16\n\t"
  49953. "mul r7, r6, r7\n\t"
  49954. "adds r5, r5, r7\n\t"
  49955. "adc r3, r3, #0\n\t"
  49956. "lsr r7, r8, #16\n\t"
  49957. "mul r6, r7, r6\n\t"
  49958. "lsr r7, r6, #16\n\t"
  49959. "lsl r6, r6, #16\n\t"
  49960. "adds r5, r5, r6\n\t"
  49961. "adc r3, r3, r7\n\t"
  49962. "lsr r6, %[b], #16\n\t"
  49963. "lsr r7, r8, #16\n\t"
  49964. "mul r7, r6, r7\n\t"
  49965. "add r3, r3, r7\n\t"
  49966. "lsl r7, r8, #16\n\t"
  49967. "lsr r7, r7, #16\n\t"
  49968. "mul r6, r7, r6\n\t"
  49969. "lsr r7, r6, #16\n\t"
  49970. "lsl r6, r6, #16\n\t"
  49971. "adds r5, r5, r6\n\t"
  49972. "adc r3, r3, r7\n\t"
  49973. #else
  49974. "umlal r5, r3, %[b], r8\n\t"
  49975. #endif
  49976. "stm %[r]!, {r5}\n\t"
  49977. "mov r4, #0\n\t"
  49978. /* A[114] * B */
  49979. "ldm %[a]!, {r8}\n\t"
  49980. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  49981. "lsl r6, %[b], #16\n\t"
  49982. "lsl r7, r8, #16\n\t"
  49983. "lsr r6, r6, #16\n\t"
  49984. "lsr r7, r7, #16\n\t"
  49985. "mul r7, r6, r7\n\t"
  49986. "adds r3, r3, r7\n\t"
  49987. "adc r4, r4, #0\n\t"
  49988. "lsr r7, r8, #16\n\t"
  49989. "mul r6, r7, r6\n\t"
  49990. "lsr r7, r6, #16\n\t"
  49991. "lsl r6, r6, #16\n\t"
  49992. "adds r3, r3, r6\n\t"
  49993. "adc r4, r4, r7\n\t"
  49994. "lsr r6, %[b], #16\n\t"
  49995. "lsr r7, r8, #16\n\t"
  49996. "mul r7, r6, r7\n\t"
  49997. "add r4, r4, r7\n\t"
  49998. "lsl r7, r8, #16\n\t"
  49999. "lsr r7, r7, #16\n\t"
  50000. "mul r6, r7, r6\n\t"
  50001. "lsr r7, r6, #16\n\t"
  50002. "lsl r6, r6, #16\n\t"
  50003. "adds r3, r3, r6\n\t"
  50004. "adc r4, r4, r7\n\t"
  50005. #else
  50006. "umlal r3, r4, %[b], r8\n\t"
  50007. #endif
  50008. "stm %[r]!, {r3}\n\t"
  50009. "mov r5, #0\n\t"
  50010. /* A[115] * B */
  50011. "ldm %[a]!, {r8}\n\t"
  50012. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50013. "lsl r6, %[b], #16\n\t"
  50014. "lsl r7, r8, #16\n\t"
  50015. "lsr r6, r6, #16\n\t"
  50016. "lsr r7, r7, #16\n\t"
  50017. "mul r7, r6, r7\n\t"
  50018. "adds r4, r4, r7\n\t"
  50019. "adc r5, r5, #0\n\t"
  50020. "lsr r7, r8, #16\n\t"
  50021. "mul r6, r7, r6\n\t"
  50022. "lsr r7, r6, #16\n\t"
  50023. "lsl r6, r6, #16\n\t"
  50024. "adds r4, r4, r6\n\t"
  50025. "adc r5, r5, r7\n\t"
  50026. "lsr r6, %[b], #16\n\t"
  50027. "lsr r7, r8, #16\n\t"
  50028. "mul r7, r6, r7\n\t"
  50029. "add r5, r5, r7\n\t"
  50030. "lsl r7, r8, #16\n\t"
  50031. "lsr r7, r7, #16\n\t"
  50032. "mul r6, r7, r6\n\t"
  50033. "lsr r7, r6, #16\n\t"
  50034. "lsl r6, r6, #16\n\t"
  50035. "adds r4, r4, r6\n\t"
  50036. "adc r5, r5, r7\n\t"
  50037. #else
  50038. "umlal r4, r5, %[b], r8\n\t"
  50039. #endif
  50040. "stm %[r]!, {r4}\n\t"
  50041. "mov r3, #0\n\t"
  50042. /* A[116] * B */
  50043. "ldm %[a]!, {r8}\n\t"
  50044. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50045. "lsl r6, %[b], #16\n\t"
  50046. "lsl r7, r8, #16\n\t"
  50047. "lsr r6, r6, #16\n\t"
  50048. "lsr r7, r7, #16\n\t"
  50049. "mul r7, r6, r7\n\t"
  50050. "adds r5, r5, r7\n\t"
  50051. "adc r3, r3, #0\n\t"
  50052. "lsr r7, r8, #16\n\t"
  50053. "mul r6, r7, r6\n\t"
  50054. "lsr r7, r6, #16\n\t"
  50055. "lsl r6, r6, #16\n\t"
  50056. "adds r5, r5, r6\n\t"
  50057. "adc r3, r3, r7\n\t"
  50058. "lsr r6, %[b], #16\n\t"
  50059. "lsr r7, r8, #16\n\t"
  50060. "mul r7, r6, r7\n\t"
  50061. "add r3, r3, r7\n\t"
  50062. "lsl r7, r8, #16\n\t"
  50063. "lsr r7, r7, #16\n\t"
  50064. "mul r6, r7, r6\n\t"
  50065. "lsr r7, r6, #16\n\t"
  50066. "lsl r6, r6, #16\n\t"
  50067. "adds r5, r5, r6\n\t"
  50068. "adc r3, r3, r7\n\t"
  50069. #else
  50070. "umlal r5, r3, %[b], r8\n\t"
  50071. #endif
  50072. "stm %[r]!, {r5}\n\t"
  50073. "mov r4, #0\n\t"
  50074. /* A[117] * B */
  50075. "ldm %[a]!, {r8}\n\t"
  50076. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50077. "lsl r6, %[b], #16\n\t"
  50078. "lsl r7, r8, #16\n\t"
  50079. "lsr r6, r6, #16\n\t"
  50080. "lsr r7, r7, #16\n\t"
  50081. "mul r7, r6, r7\n\t"
  50082. "adds r3, r3, r7\n\t"
  50083. "adc r4, r4, #0\n\t"
  50084. "lsr r7, r8, #16\n\t"
  50085. "mul r6, r7, r6\n\t"
  50086. "lsr r7, r6, #16\n\t"
  50087. "lsl r6, r6, #16\n\t"
  50088. "adds r3, r3, r6\n\t"
  50089. "adc r4, r4, r7\n\t"
  50090. "lsr r6, %[b], #16\n\t"
  50091. "lsr r7, r8, #16\n\t"
  50092. "mul r7, r6, r7\n\t"
  50093. "add r4, r4, r7\n\t"
  50094. "lsl r7, r8, #16\n\t"
  50095. "lsr r7, r7, #16\n\t"
  50096. "mul r6, r7, r6\n\t"
  50097. "lsr r7, r6, #16\n\t"
  50098. "lsl r6, r6, #16\n\t"
  50099. "adds r3, r3, r6\n\t"
  50100. "adc r4, r4, r7\n\t"
  50101. #else
  50102. "umlal r3, r4, %[b], r8\n\t"
  50103. #endif
  50104. "stm %[r]!, {r3}\n\t"
  50105. "mov r5, #0\n\t"
  50106. /* A[118] * B */
  50107. "ldm %[a]!, {r8}\n\t"
  50108. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50109. "lsl r6, %[b], #16\n\t"
  50110. "lsl r7, r8, #16\n\t"
  50111. "lsr r6, r6, #16\n\t"
  50112. "lsr r7, r7, #16\n\t"
  50113. "mul r7, r6, r7\n\t"
  50114. "adds r4, r4, r7\n\t"
  50115. "adc r5, r5, #0\n\t"
  50116. "lsr r7, r8, #16\n\t"
  50117. "mul r6, r7, r6\n\t"
  50118. "lsr r7, r6, #16\n\t"
  50119. "lsl r6, r6, #16\n\t"
  50120. "adds r4, r4, r6\n\t"
  50121. "adc r5, r5, r7\n\t"
  50122. "lsr r6, %[b], #16\n\t"
  50123. "lsr r7, r8, #16\n\t"
  50124. "mul r7, r6, r7\n\t"
  50125. "add r5, r5, r7\n\t"
  50126. "lsl r7, r8, #16\n\t"
  50127. "lsr r7, r7, #16\n\t"
  50128. "mul r6, r7, r6\n\t"
  50129. "lsr r7, r6, #16\n\t"
  50130. "lsl r6, r6, #16\n\t"
  50131. "adds r4, r4, r6\n\t"
  50132. "adc r5, r5, r7\n\t"
  50133. #else
  50134. "umlal r4, r5, %[b], r8\n\t"
  50135. #endif
  50136. "stm %[r]!, {r4}\n\t"
  50137. "mov r3, #0\n\t"
  50138. /* A[119] * B */
  50139. "ldm %[a]!, {r8}\n\t"
  50140. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50141. "lsl r6, %[b], #16\n\t"
  50142. "lsl r7, r8, #16\n\t"
  50143. "lsr r6, r6, #16\n\t"
  50144. "lsr r7, r7, #16\n\t"
  50145. "mul r7, r6, r7\n\t"
  50146. "adds r5, r5, r7\n\t"
  50147. "adc r3, r3, #0\n\t"
  50148. "lsr r7, r8, #16\n\t"
  50149. "mul r6, r7, r6\n\t"
  50150. "lsr r7, r6, #16\n\t"
  50151. "lsl r6, r6, #16\n\t"
  50152. "adds r5, r5, r6\n\t"
  50153. "adc r3, r3, r7\n\t"
  50154. "lsr r6, %[b], #16\n\t"
  50155. "lsr r7, r8, #16\n\t"
  50156. "mul r7, r6, r7\n\t"
  50157. "add r3, r3, r7\n\t"
  50158. "lsl r7, r8, #16\n\t"
  50159. "lsr r7, r7, #16\n\t"
  50160. "mul r6, r7, r6\n\t"
  50161. "lsr r7, r6, #16\n\t"
  50162. "lsl r6, r6, #16\n\t"
  50163. "adds r5, r5, r6\n\t"
  50164. "adc r3, r3, r7\n\t"
  50165. #else
  50166. "umlal r5, r3, %[b], r8\n\t"
  50167. #endif
  50168. "stm %[r]!, {r5}\n\t"
  50169. "mov r4, #0\n\t"
  50170. /* A[120] * B */
  50171. "ldm %[a]!, {r8}\n\t"
  50172. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50173. "lsl r6, %[b], #16\n\t"
  50174. "lsl r7, r8, #16\n\t"
  50175. "lsr r6, r6, #16\n\t"
  50176. "lsr r7, r7, #16\n\t"
  50177. "mul r7, r6, r7\n\t"
  50178. "adds r3, r3, r7\n\t"
  50179. "adc r4, r4, #0\n\t"
  50180. "lsr r7, r8, #16\n\t"
  50181. "mul r6, r7, r6\n\t"
  50182. "lsr r7, r6, #16\n\t"
  50183. "lsl r6, r6, #16\n\t"
  50184. "adds r3, r3, r6\n\t"
  50185. "adc r4, r4, r7\n\t"
  50186. "lsr r6, %[b], #16\n\t"
  50187. "lsr r7, r8, #16\n\t"
  50188. "mul r7, r6, r7\n\t"
  50189. "add r4, r4, r7\n\t"
  50190. "lsl r7, r8, #16\n\t"
  50191. "lsr r7, r7, #16\n\t"
  50192. "mul r6, r7, r6\n\t"
  50193. "lsr r7, r6, #16\n\t"
  50194. "lsl r6, r6, #16\n\t"
  50195. "adds r3, r3, r6\n\t"
  50196. "adc r4, r4, r7\n\t"
  50197. #else
  50198. "umlal r3, r4, %[b], r8\n\t"
  50199. #endif
  50200. "stm %[r]!, {r3}\n\t"
  50201. "mov r5, #0\n\t"
  50202. /* A[121] * B */
  50203. "ldm %[a]!, {r8}\n\t"
  50204. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50205. "lsl r6, %[b], #16\n\t"
  50206. "lsl r7, r8, #16\n\t"
  50207. "lsr r6, r6, #16\n\t"
  50208. "lsr r7, r7, #16\n\t"
  50209. "mul r7, r6, r7\n\t"
  50210. "adds r4, r4, r7\n\t"
  50211. "adc r5, r5, #0\n\t"
  50212. "lsr r7, r8, #16\n\t"
  50213. "mul r6, r7, r6\n\t"
  50214. "lsr r7, r6, #16\n\t"
  50215. "lsl r6, r6, #16\n\t"
  50216. "adds r4, r4, r6\n\t"
  50217. "adc r5, r5, r7\n\t"
  50218. "lsr r6, %[b], #16\n\t"
  50219. "lsr r7, r8, #16\n\t"
  50220. "mul r7, r6, r7\n\t"
  50221. "add r5, r5, r7\n\t"
  50222. "lsl r7, r8, #16\n\t"
  50223. "lsr r7, r7, #16\n\t"
  50224. "mul r6, r7, r6\n\t"
  50225. "lsr r7, r6, #16\n\t"
  50226. "lsl r6, r6, #16\n\t"
  50227. "adds r4, r4, r6\n\t"
  50228. "adc r5, r5, r7\n\t"
  50229. #else
  50230. "umlal r4, r5, %[b], r8\n\t"
  50231. #endif
  50232. "stm %[r]!, {r4}\n\t"
  50233. "mov r3, #0\n\t"
  50234. /* A[122] * B */
  50235. "ldm %[a]!, {r8}\n\t"
  50236. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50237. "lsl r6, %[b], #16\n\t"
  50238. "lsl r7, r8, #16\n\t"
  50239. "lsr r6, r6, #16\n\t"
  50240. "lsr r7, r7, #16\n\t"
  50241. "mul r7, r6, r7\n\t"
  50242. "adds r5, r5, r7\n\t"
  50243. "adc r3, r3, #0\n\t"
  50244. "lsr r7, r8, #16\n\t"
  50245. "mul r6, r7, r6\n\t"
  50246. "lsr r7, r6, #16\n\t"
  50247. "lsl r6, r6, #16\n\t"
  50248. "adds r5, r5, r6\n\t"
  50249. "adc r3, r3, r7\n\t"
  50250. "lsr r6, %[b], #16\n\t"
  50251. "lsr r7, r8, #16\n\t"
  50252. "mul r7, r6, r7\n\t"
  50253. "add r3, r3, r7\n\t"
  50254. "lsl r7, r8, #16\n\t"
  50255. "lsr r7, r7, #16\n\t"
  50256. "mul r6, r7, r6\n\t"
  50257. "lsr r7, r6, #16\n\t"
  50258. "lsl r6, r6, #16\n\t"
  50259. "adds r5, r5, r6\n\t"
  50260. "adc r3, r3, r7\n\t"
  50261. #else
  50262. "umlal r5, r3, %[b], r8\n\t"
  50263. #endif
  50264. "stm %[r]!, {r5}\n\t"
  50265. "mov r4, #0\n\t"
  50266. /* A[123] * B */
  50267. "ldm %[a]!, {r8}\n\t"
  50268. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50269. "lsl r6, %[b], #16\n\t"
  50270. "lsl r7, r8, #16\n\t"
  50271. "lsr r6, r6, #16\n\t"
  50272. "lsr r7, r7, #16\n\t"
  50273. "mul r7, r6, r7\n\t"
  50274. "adds r3, r3, r7\n\t"
  50275. "adc r4, r4, #0\n\t"
  50276. "lsr r7, r8, #16\n\t"
  50277. "mul r6, r7, r6\n\t"
  50278. "lsr r7, r6, #16\n\t"
  50279. "lsl r6, r6, #16\n\t"
  50280. "adds r3, r3, r6\n\t"
  50281. "adc r4, r4, r7\n\t"
  50282. "lsr r6, %[b], #16\n\t"
  50283. "lsr r7, r8, #16\n\t"
  50284. "mul r7, r6, r7\n\t"
  50285. "add r4, r4, r7\n\t"
  50286. "lsl r7, r8, #16\n\t"
  50287. "lsr r7, r7, #16\n\t"
  50288. "mul r6, r7, r6\n\t"
  50289. "lsr r7, r6, #16\n\t"
  50290. "lsl r6, r6, #16\n\t"
  50291. "adds r3, r3, r6\n\t"
  50292. "adc r4, r4, r7\n\t"
  50293. #else
  50294. "umlal r3, r4, %[b], r8\n\t"
  50295. #endif
  50296. "stm %[r]!, {r3}\n\t"
  50297. "mov r5, #0\n\t"
  50298. /* A[124] * B */
  50299. "ldm %[a]!, {r8}\n\t"
  50300. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50301. "lsl r6, %[b], #16\n\t"
  50302. "lsl r7, r8, #16\n\t"
  50303. "lsr r6, r6, #16\n\t"
  50304. "lsr r7, r7, #16\n\t"
  50305. "mul r7, r6, r7\n\t"
  50306. "adds r4, r4, r7\n\t"
  50307. "adc r5, r5, #0\n\t"
  50308. "lsr r7, r8, #16\n\t"
  50309. "mul r6, r7, r6\n\t"
  50310. "lsr r7, r6, #16\n\t"
  50311. "lsl r6, r6, #16\n\t"
  50312. "adds r4, r4, r6\n\t"
  50313. "adc r5, r5, r7\n\t"
  50314. "lsr r6, %[b], #16\n\t"
  50315. "lsr r7, r8, #16\n\t"
  50316. "mul r7, r6, r7\n\t"
  50317. "add r5, r5, r7\n\t"
  50318. "lsl r7, r8, #16\n\t"
  50319. "lsr r7, r7, #16\n\t"
  50320. "mul r6, r7, r6\n\t"
  50321. "lsr r7, r6, #16\n\t"
  50322. "lsl r6, r6, #16\n\t"
  50323. "adds r4, r4, r6\n\t"
  50324. "adc r5, r5, r7\n\t"
  50325. #else
  50326. "umlal r4, r5, %[b], r8\n\t"
  50327. #endif
  50328. "stm %[r]!, {r4}\n\t"
  50329. "mov r3, #0\n\t"
  50330. /* A[125] * B */
  50331. "ldm %[a]!, {r8}\n\t"
  50332. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50333. "lsl r6, %[b], #16\n\t"
  50334. "lsl r7, r8, #16\n\t"
  50335. "lsr r6, r6, #16\n\t"
  50336. "lsr r7, r7, #16\n\t"
  50337. "mul r7, r6, r7\n\t"
  50338. "adds r5, r5, r7\n\t"
  50339. "adc r3, r3, #0\n\t"
  50340. "lsr r7, r8, #16\n\t"
  50341. "mul r6, r7, r6\n\t"
  50342. "lsr r7, r6, #16\n\t"
  50343. "lsl r6, r6, #16\n\t"
  50344. "adds r5, r5, r6\n\t"
  50345. "adc r3, r3, r7\n\t"
  50346. "lsr r6, %[b], #16\n\t"
  50347. "lsr r7, r8, #16\n\t"
  50348. "mul r7, r6, r7\n\t"
  50349. "add r3, r3, r7\n\t"
  50350. "lsl r7, r8, #16\n\t"
  50351. "lsr r7, r7, #16\n\t"
  50352. "mul r6, r7, r6\n\t"
  50353. "lsr r7, r6, #16\n\t"
  50354. "lsl r6, r6, #16\n\t"
  50355. "adds r5, r5, r6\n\t"
  50356. "adc r3, r3, r7\n\t"
  50357. #else
  50358. "umlal r5, r3, %[b], r8\n\t"
  50359. #endif
  50360. "stm %[r]!, {r5}\n\t"
  50361. "mov r4, #0\n\t"
  50362. /* A[126] * B */
  50363. "ldm %[a]!, {r8}\n\t"
  50364. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50365. "lsl r6, %[b], #16\n\t"
  50366. "lsl r7, r8, #16\n\t"
  50367. "lsr r6, r6, #16\n\t"
  50368. "lsr r7, r7, #16\n\t"
  50369. "mul r7, r6, r7\n\t"
  50370. "adds r3, r3, r7\n\t"
  50371. "adc r4, r4, #0\n\t"
  50372. "lsr r7, r8, #16\n\t"
  50373. "mul r6, r7, r6\n\t"
  50374. "lsr r7, r6, #16\n\t"
  50375. "lsl r6, r6, #16\n\t"
  50376. "adds r3, r3, r6\n\t"
  50377. "adc r4, r4, r7\n\t"
  50378. "lsr r6, %[b], #16\n\t"
  50379. "lsr r7, r8, #16\n\t"
  50380. "mul r7, r6, r7\n\t"
  50381. "add r4, r4, r7\n\t"
  50382. "lsl r7, r8, #16\n\t"
  50383. "lsr r7, r7, #16\n\t"
  50384. "mul r6, r7, r6\n\t"
  50385. "lsr r7, r6, #16\n\t"
  50386. "lsl r6, r6, #16\n\t"
  50387. "adds r3, r3, r6\n\t"
  50388. "adc r4, r4, r7\n\t"
  50389. #else
  50390. "umlal r3, r4, %[b], r8\n\t"
  50391. #endif
  50392. "stm %[r]!, {r3}\n\t"
  50393. "mov r5, #0\n\t"
  50394. /* A[127] * B */
  50395. "ldm %[a]!, {r8}\n\t"
  50396. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50397. "lsl r6, %[b], #16\n\t"
  50398. "lsl r7, r8, #16\n\t"
  50399. "lsr r6, r6, #16\n\t"
  50400. "lsr r7, r7, #16\n\t"
  50401. "mul r7, r6, r7\n\t"
  50402. "adds r4, r4, r7\n\t"
  50403. "adc r5, r5, #0\n\t"
  50404. "lsr r7, r8, #16\n\t"
  50405. "mul r6, r7, r6\n\t"
  50406. "lsr r7, r6, #16\n\t"
  50407. "lsl r6, r6, #16\n\t"
  50408. "adds r4, r4, r6\n\t"
  50409. "adc r5, r5, r7\n\t"
  50410. "lsr r6, %[b], #16\n\t"
  50411. "lsr r7, r8, #16\n\t"
  50412. "mul r7, r6, r7\n\t"
  50413. "add r5, r5, r7\n\t"
  50414. "lsl r7, r8, #16\n\t"
  50415. "lsr r7, r7, #16\n\t"
  50416. "mul r6, r7, r6\n\t"
  50417. "lsr r7, r6, #16\n\t"
  50418. "lsl r6, r6, #16\n\t"
  50419. "adds r4, r4, r6\n\t"
  50420. "adc r5, r5, r7\n\t"
  50421. #else
  50422. "umlal r4, r5, %[b], r8\n\t"
  50423. #endif
  50424. "stm %[r]!, {r4}\n\t"
  50425. "str r5, [%[r]]\n\t"
  50426. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  50427. :
  50428. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  50429. );
  50430. }
  50431. #endif /* WOLFSSL_SP_SMALL */
  50432. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  50433. /* r = 2^n mod m where n is the number of bits to reduce by.
  50434. * Given m must be 4096 bits, just need to subtract.
  50435. *
  50436. * r A single precision number.
  50437. * m A single precision number.
  50438. */
  50439. static void sp_4096_mont_norm_128(sp_digit* r, const sp_digit* m)
  50440. {
  50441. XMEMSET(r, 0, sizeof(sp_digit) * 128);
  50442. /* r = 2^n mod m */
  50443. sp_4096_sub_in_place_128(r, m);
  50444. }
  50445. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  50446. #ifdef WOLFSSL_SP_SMALL
  50447. /* Conditionally subtract b from a using the mask m.
  50448. * m is -1 to subtract and 0 when not copying.
  50449. *
  50450. * r A single precision number representing condition subtract result.
  50451. * a A single precision number to subtract from.
  50452. * b A single precision number to subtract.
  50453. * m Mask value to apply.
  50454. */
  50455. 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)
  50456. {
  50457. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  50458. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  50459. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  50460. register sp_digit m asm ("r3") = (sp_digit)m_p;
  50461. __asm__ __volatile__ (
  50462. "mov r6, #0\n\t"
  50463. "mov r12, #0\n\t"
  50464. "mov lr, #0\n\t"
  50465. "\n"
  50466. "L_sp_4096_cond_sub_128_words_%=: \n\t"
  50467. "subs r12, r6, r12\n\t"
  50468. "ldr r4, [%[a], lr]\n\t"
  50469. "ldr r5, [%[b], lr]\n\t"
  50470. "and r5, r5, %[m]\n\t"
  50471. "sbcs r4, r4, r5\n\t"
  50472. "sbc r12, r6, r6\n\t"
  50473. "str r4, [%[r], lr]\n\t"
  50474. "add lr, lr, #4\n\t"
  50475. "cmp lr, #0x200\n\t"
  50476. "blt L_sp_4096_cond_sub_128_words_%=\n\t"
  50477. "mov %[r], r12\n\t"
  50478. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  50479. :
  50480. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  50481. );
  50482. return (uint32_t)(size_t)r;
  50483. }
  50484. #else
  50485. /* Conditionally subtract b from a using the mask m.
  50486. * m is -1 to subtract and 0 when not copying.
  50487. *
  50488. * r A single precision number representing condition subtract result.
  50489. * a A single precision number to subtract from.
  50490. * b A single precision number to subtract.
  50491. * m Mask value to apply.
  50492. */
  50493. 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)
  50494. {
  50495. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  50496. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  50497. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  50498. register sp_digit m asm ("r3") = (sp_digit)m_p;
  50499. __asm__ __volatile__ (
  50500. "mov lr, #0\n\t"
  50501. "ldm %[a]!, {r4, r5}\n\t"
  50502. "ldm %[b]!, {r6, r7}\n\t"
  50503. "and r6, r6, %[m]\n\t"
  50504. "and r7, r7, %[m]\n\t"
  50505. "subs r4, r4, r6\n\t"
  50506. "sbcs r5, r5, r7\n\t"
  50507. "stm %[r]!, {r4, r5}\n\t"
  50508. "ldm %[a]!, {r4, r5}\n\t"
  50509. "ldm %[b]!, {r6, r7}\n\t"
  50510. "and r6, r6, %[m]\n\t"
  50511. "and r7, r7, %[m]\n\t"
  50512. "sbcs r4, r4, r6\n\t"
  50513. "sbcs r5, r5, r7\n\t"
  50514. "stm %[r]!, {r4, r5}\n\t"
  50515. "ldm %[a]!, {r4, r5}\n\t"
  50516. "ldm %[b]!, {r6, r7}\n\t"
  50517. "and r6, r6, %[m]\n\t"
  50518. "and r7, r7, %[m]\n\t"
  50519. "sbcs r4, r4, r6\n\t"
  50520. "sbcs r5, r5, r7\n\t"
  50521. "stm %[r]!, {r4, r5}\n\t"
  50522. "ldm %[a]!, {r4, r5}\n\t"
  50523. "ldm %[b]!, {r6, r7}\n\t"
  50524. "and r6, r6, %[m]\n\t"
  50525. "and r7, r7, %[m]\n\t"
  50526. "sbcs r4, r4, r6\n\t"
  50527. "sbcs r5, r5, r7\n\t"
  50528. "stm %[r]!, {r4, r5}\n\t"
  50529. "ldm %[a]!, {r4, r5}\n\t"
  50530. "ldm %[b]!, {r6, r7}\n\t"
  50531. "and r6, r6, %[m]\n\t"
  50532. "and r7, r7, %[m]\n\t"
  50533. "sbcs r4, r4, r6\n\t"
  50534. "sbcs r5, r5, r7\n\t"
  50535. "stm %[r]!, {r4, r5}\n\t"
  50536. "ldm %[a]!, {r4, r5}\n\t"
  50537. "ldm %[b]!, {r6, r7}\n\t"
  50538. "and r6, r6, %[m]\n\t"
  50539. "and r7, r7, %[m]\n\t"
  50540. "sbcs r4, r4, r6\n\t"
  50541. "sbcs r5, r5, r7\n\t"
  50542. "stm %[r]!, {r4, r5}\n\t"
  50543. "ldm %[a]!, {r4, r5}\n\t"
  50544. "ldm %[b]!, {r6, r7}\n\t"
  50545. "and r6, r6, %[m]\n\t"
  50546. "and r7, r7, %[m]\n\t"
  50547. "sbcs r4, r4, r6\n\t"
  50548. "sbcs r5, r5, r7\n\t"
  50549. "stm %[r]!, {r4, r5}\n\t"
  50550. "ldm %[a]!, {r4, r5}\n\t"
  50551. "ldm %[b]!, {r6, r7}\n\t"
  50552. "and r6, r6, %[m]\n\t"
  50553. "and r7, r7, %[m]\n\t"
  50554. "sbcs r4, r4, r6\n\t"
  50555. "sbcs r5, r5, r7\n\t"
  50556. "stm %[r]!, {r4, r5}\n\t"
  50557. "ldm %[a]!, {r4, r5}\n\t"
  50558. "ldm %[b]!, {r6, r7}\n\t"
  50559. "and r6, r6, %[m]\n\t"
  50560. "and r7, r7, %[m]\n\t"
  50561. "sbcs r4, r4, r6\n\t"
  50562. "sbcs r5, r5, r7\n\t"
  50563. "stm %[r]!, {r4, r5}\n\t"
  50564. "ldm %[a]!, {r4, r5}\n\t"
  50565. "ldm %[b]!, {r6, r7}\n\t"
  50566. "and r6, r6, %[m]\n\t"
  50567. "and r7, r7, %[m]\n\t"
  50568. "sbcs r4, r4, r6\n\t"
  50569. "sbcs r5, r5, r7\n\t"
  50570. "stm %[r]!, {r4, r5}\n\t"
  50571. "ldm %[a]!, {r4, r5}\n\t"
  50572. "ldm %[b]!, {r6, r7}\n\t"
  50573. "and r6, r6, %[m]\n\t"
  50574. "and r7, r7, %[m]\n\t"
  50575. "sbcs r4, r4, r6\n\t"
  50576. "sbcs r5, r5, r7\n\t"
  50577. "stm %[r]!, {r4, r5}\n\t"
  50578. "ldm %[a]!, {r4, r5}\n\t"
  50579. "ldm %[b]!, {r6, r7}\n\t"
  50580. "and r6, r6, %[m]\n\t"
  50581. "and r7, r7, %[m]\n\t"
  50582. "sbcs r4, r4, r6\n\t"
  50583. "sbcs r5, r5, r7\n\t"
  50584. "stm %[r]!, {r4, r5}\n\t"
  50585. "ldm %[a]!, {r4, r5}\n\t"
  50586. "ldm %[b]!, {r6, r7}\n\t"
  50587. "and r6, r6, %[m]\n\t"
  50588. "and r7, r7, %[m]\n\t"
  50589. "sbcs r4, r4, r6\n\t"
  50590. "sbcs r5, r5, r7\n\t"
  50591. "stm %[r]!, {r4, r5}\n\t"
  50592. "ldm %[a]!, {r4, r5}\n\t"
  50593. "ldm %[b]!, {r6, r7}\n\t"
  50594. "and r6, r6, %[m]\n\t"
  50595. "and r7, r7, %[m]\n\t"
  50596. "sbcs r4, r4, r6\n\t"
  50597. "sbcs r5, r5, r7\n\t"
  50598. "stm %[r]!, {r4, r5}\n\t"
  50599. "ldm %[a]!, {r4, r5}\n\t"
  50600. "ldm %[b]!, {r6, r7}\n\t"
  50601. "and r6, r6, %[m]\n\t"
  50602. "and r7, r7, %[m]\n\t"
  50603. "sbcs r4, r4, r6\n\t"
  50604. "sbcs r5, r5, r7\n\t"
  50605. "stm %[r]!, {r4, r5}\n\t"
  50606. "ldm %[a]!, {r4, r5}\n\t"
  50607. "ldm %[b]!, {r6, r7}\n\t"
  50608. "and r6, r6, %[m]\n\t"
  50609. "and r7, r7, %[m]\n\t"
  50610. "sbcs r4, r4, r6\n\t"
  50611. "sbcs r5, r5, r7\n\t"
  50612. "stm %[r]!, {r4, r5}\n\t"
  50613. "ldm %[a]!, {r4, r5}\n\t"
  50614. "ldm %[b]!, {r6, r7}\n\t"
  50615. "and r6, r6, %[m]\n\t"
  50616. "and r7, r7, %[m]\n\t"
  50617. "sbcs r4, r4, r6\n\t"
  50618. "sbcs r5, r5, r7\n\t"
  50619. "stm %[r]!, {r4, r5}\n\t"
  50620. "ldm %[a]!, {r4, r5}\n\t"
  50621. "ldm %[b]!, {r6, r7}\n\t"
  50622. "and r6, r6, %[m]\n\t"
  50623. "and r7, r7, %[m]\n\t"
  50624. "sbcs r4, r4, r6\n\t"
  50625. "sbcs r5, r5, r7\n\t"
  50626. "stm %[r]!, {r4, r5}\n\t"
  50627. "ldm %[a]!, {r4, r5}\n\t"
  50628. "ldm %[b]!, {r6, r7}\n\t"
  50629. "and r6, r6, %[m]\n\t"
  50630. "and r7, r7, %[m]\n\t"
  50631. "sbcs r4, r4, r6\n\t"
  50632. "sbcs r5, r5, r7\n\t"
  50633. "stm %[r]!, {r4, r5}\n\t"
  50634. "ldm %[a]!, {r4, r5}\n\t"
  50635. "ldm %[b]!, {r6, r7}\n\t"
  50636. "and r6, r6, %[m]\n\t"
  50637. "and r7, r7, %[m]\n\t"
  50638. "sbcs r4, r4, r6\n\t"
  50639. "sbcs r5, r5, r7\n\t"
  50640. "stm %[r]!, {r4, r5}\n\t"
  50641. "ldm %[a]!, {r4, r5}\n\t"
  50642. "ldm %[b]!, {r6, r7}\n\t"
  50643. "and r6, r6, %[m]\n\t"
  50644. "and r7, r7, %[m]\n\t"
  50645. "sbcs r4, r4, r6\n\t"
  50646. "sbcs r5, r5, r7\n\t"
  50647. "stm %[r]!, {r4, r5}\n\t"
  50648. "ldm %[a]!, {r4, r5}\n\t"
  50649. "ldm %[b]!, {r6, r7}\n\t"
  50650. "and r6, r6, %[m]\n\t"
  50651. "and r7, r7, %[m]\n\t"
  50652. "sbcs r4, r4, r6\n\t"
  50653. "sbcs r5, r5, r7\n\t"
  50654. "stm %[r]!, {r4, r5}\n\t"
  50655. "ldm %[a]!, {r4, r5}\n\t"
  50656. "ldm %[b]!, {r6, r7}\n\t"
  50657. "and r6, r6, %[m]\n\t"
  50658. "and r7, r7, %[m]\n\t"
  50659. "sbcs r4, r4, r6\n\t"
  50660. "sbcs r5, r5, r7\n\t"
  50661. "stm %[r]!, {r4, r5}\n\t"
  50662. "ldm %[a]!, {r4, r5}\n\t"
  50663. "ldm %[b]!, {r6, r7}\n\t"
  50664. "and r6, r6, %[m]\n\t"
  50665. "and r7, r7, %[m]\n\t"
  50666. "sbcs r4, r4, r6\n\t"
  50667. "sbcs r5, r5, r7\n\t"
  50668. "stm %[r]!, {r4, r5}\n\t"
  50669. "ldm %[a]!, {r4, r5}\n\t"
  50670. "ldm %[b]!, {r6, r7}\n\t"
  50671. "and r6, r6, %[m]\n\t"
  50672. "and r7, r7, %[m]\n\t"
  50673. "sbcs r4, r4, r6\n\t"
  50674. "sbcs r5, r5, r7\n\t"
  50675. "stm %[r]!, {r4, r5}\n\t"
  50676. "ldm %[a]!, {r4, r5}\n\t"
  50677. "ldm %[b]!, {r6, r7}\n\t"
  50678. "and r6, r6, %[m]\n\t"
  50679. "and r7, r7, %[m]\n\t"
  50680. "sbcs r4, r4, r6\n\t"
  50681. "sbcs r5, r5, r7\n\t"
  50682. "stm %[r]!, {r4, r5}\n\t"
  50683. "ldm %[a]!, {r4, r5}\n\t"
  50684. "ldm %[b]!, {r6, r7}\n\t"
  50685. "and r6, r6, %[m]\n\t"
  50686. "and r7, r7, %[m]\n\t"
  50687. "sbcs r4, r4, r6\n\t"
  50688. "sbcs r5, r5, r7\n\t"
  50689. "stm %[r]!, {r4, r5}\n\t"
  50690. "ldm %[a]!, {r4, r5}\n\t"
  50691. "ldm %[b]!, {r6, r7}\n\t"
  50692. "and r6, r6, %[m]\n\t"
  50693. "and r7, r7, %[m]\n\t"
  50694. "sbcs r4, r4, r6\n\t"
  50695. "sbcs r5, r5, r7\n\t"
  50696. "stm %[r]!, {r4, r5}\n\t"
  50697. "ldm %[a]!, {r4, r5}\n\t"
  50698. "ldm %[b]!, {r6, r7}\n\t"
  50699. "and r6, r6, %[m]\n\t"
  50700. "and r7, r7, %[m]\n\t"
  50701. "sbcs r4, r4, r6\n\t"
  50702. "sbcs r5, r5, r7\n\t"
  50703. "stm %[r]!, {r4, r5}\n\t"
  50704. "ldm %[a]!, {r4, r5}\n\t"
  50705. "ldm %[b]!, {r6, r7}\n\t"
  50706. "and r6, r6, %[m]\n\t"
  50707. "and r7, r7, %[m]\n\t"
  50708. "sbcs r4, r4, r6\n\t"
  50709. "sbcs r5, r5, r7\n\t"
  50710. "stm %[r]!, {r4, r5}\n\t"
  50711. "ldm %[a]!, {r4, r5}\n\t"
  50712. "ldm %[b]!, {r6, r7}\n\t"
  50713. "and r6, r6, %[m]\n\t"
  50714. "and r7, r7, %[m]\n\t"
  50715. "sbcs r4, r4, r6\n\t"
  50716. "sbcs r5, r5, r7\n\t"
  50717. "stm %[r]!, {r4, r5}\n\t"
  50718. "ldm %[a]!, {r4, r5}\n\t"
  50719. "ldm %[b]!, {r6, r7}\n\t"
  50720. "and r6, r6, %[m]\n\t"
  50721. "and r7, r7, %[m]\n\t"
  50722. "sbcs r4, r4, r6\n\t"
  50723. "sbcs r5, r5, r7\n\t"
  50724. "stm %[r]!, {r4, r5}\n\t"
  50725. "ldm %[a]!, {r4, r5}\n\t"
  50726. "ldm %[b]!, {r6, r7}\n\t"
  50727. "and r6, r6, %[m]\n\t"
  50728. "and r7, r7, %[m]\n\t"
  50729. "sbcs r4, r4, r6\n\t"
  50730. "sbcs r5, r5, r7\n\t"
  50731. "stm %[r]!, {r4, r5}\n\t"
  50732. "ldm %[a]!, {r4, r5}\n\t"
  50733. "ldm %[b]!, {r6, r7}\n\t"
  50734. "and r6, r6, %[m]\n\t"
  50735. "and r7, r7, %[m]\n\t"
  50736. "sbcs r4, r4, r6\n\t"
  50737. "sbcs r5, r5, r7\n\t"
  50738. "stm %[r]!, {r4, r5}\n\t"
  50739. "ldm %[a]!, {r4, r5}\n\t"
  50740. "ldm %[b]!, {r6, r7}\n\t"
  50741. "and r6, r6, %[m]\n\t"
  50742. "and r7, r7, %[m]\n\t"
  50743. "sbcs r4, r4, r6\n\t"
  50744. "sbcs r5, r5, r7\n\t"
  50745. "stm %[r]!, {r4, r5}\n\t"
  50746. "ldm %[a]!, {r4, r5}\n\t"
  50747. "ldm %[b]!, {r6, r7}\n\t"
  50748. "and r6, r6, %[m]\n\t"
  50749. "and r7, r7, %[m]\n\t"
  50750. "sbcs r4, r4, r6\n\t"
  50751. "sbcs r5, r5, r7\n\t"
  50752. "stm %[r]!, {r4, r5}\n\t"
  50753. "ldm %[a]!, {r4, r5}\n\t"
  50754. "ldm %[b]!, {r6, r7}\n\t"
  50755. "and r6, r6, %[m]\n\t"
  50756. "and r7, r7, %[m]\n\t"
  50757. "sbcs r4, r4, r6\n\t"
  50758. "sbcs r5, r5, r7\n\t"
  50759. "stm %[r]!, {r4, r5}\n\t"
  50760. "ldm %[a]!, {r4, r5}\n\t"
  50761. "ldm %[b]!, {r6, r7}\n\t"
  50762. "and r6, r6, %[m]\n\t"
  50763. "and r7, r7, %[m]\n\t"
  50764. "sbcs r4, r4, r6\n\t"
  50765. "sbcs r5, r5, r7\n\t"
  50766. "stm %[r]!, {r4, r5}\n\t"
  50767. "ldm %[a]!, {r4, r5}\n\t"
  50768. "ldm %[b]!, {r6, r7}\n\t"
  50769. "and r6, r6, %[m]\n\t"
  50770. "and r7, r7, %[m]\n\t"
  50771. "sbcs r4, r4, r6\n\t"
  50772. "sbcs r5, r5, r7\n\t"
  50773. "stm %[r]!, {r4, r5}\n\t"
  50774. "ldm %[a]!, {r4, r5}\n\t"
  50775. "ldm %[b]!, {r6, r7}\n\t"
  50776. "and r6, r6, %[m]\n\t"
  50777. "and r7, r7, %[m]\n\t"
  50778. "sbcs r4, r4, r6\n\t"
  50779. "sbcs r5, r5, r7\n\t"
  50780. "stm %[r]!, {r4, r5}\n\t"
  50781. "ldm %[a]!, {r4, r5}\n\t"
  50782. "ldm %[b]!, {r6, r7}\n\t"
  50783. "and r6, r6, %[m]\n\t"
  50784. "and r7, r7, %[m]\n\t"
  50785. "sbcs r4, r4, r6\n\t"
  50786. "sbcs r5, r5, r7\n\t"
  50787. "stm %[r]!, {r4, r5}\n\t"
  50788. "ldm %[a]!, {r4, r5}\n\t"
  50789. "ldm %[b]!, {r6, r7}\n\t"
  50790. "and r6, r6, %[m]\n\t"
  50791. "and r7, r7, %[m]\n\t"
  50792. "sbcs r4, r4, r6\n\t"
  50793. "sbcs r5, r5, r7\n\t"
  50794. "stm %[r]!, {r4, r5}\n\t"
  50795. "ldm %[a]!, {r4, r5}\n\t"
  50796. "ldm %[b]!, {r6, r7}\n\t"
  50797. "and r6, r6, %[m]\n\t"
  50798. "and r7, r7, %[m]\n\t"
  50799. "sbcs r4, r4, r6\n\t"
  50800. "sbcs r5, r5, r7\n\t"
  50801. "stm %[r]!, {r4, r5}\n\t"
  50802. "ldm %[a]!, {r4, r5}\n\t"
  50803. "ldm %[b]!, {r6, r7}\n\t"
  50804. "and r6, r6, %[m]\n\t"
  50805. "and r7, r7, %[m]\n\t"
  50806. "sbcs r4, r4, r6\n\t"
  50807. "sbcs r5, r5, r7\n\t"
  50808. "stm %[r]!, {r4, r5}\n\t"
  50809. "ldm %[a]!, {r4, r5}\n\t"
  50810. "ldm %[b]!, {r6, r7}\n\t"
  50811. "and r6, r6, %[m]\n\t"
  50812. "and r7, r7, %[m]\n\t"
  50813. "sbcs r4, r4, r6\n\t"
  50814. "sbcs r5, r5, r7\n\t"
  50815. "stm %[r]!, {r4, r5}\n\t"
  50816. "ldm %[a]!, {r4, r5}\n\t"
  50817. "ldm %[b]!, {r6, r7}\n\t"
  50818. "and r6, r6, %[m]\n\t"
  50819. "and r7, r7, %[m]\n\t"
  50820. "sbcs r4, r4, r6\n\t"
  50821. "sbcs r5, r5, r7\n\t"
  50822. "stm %[r]!, {r4, r5}\n\t"
  50823. "ldm %[a]!, {r4, r5}\n\t"
  50824. "ldm %[b]!, {r6, r7}\n\t"
  50825. "and r6, r6, %[m]\n\t"
  50826. "and r7, r7, %[m]\n\t"
  50827. "sbcs r4, r4, r6\n\t"
  50828. "sbcs r5, r5, r7\n\t"
  50829. "stm %[r]!, {r4, r5}\n\t"
  50830. "ldm %[a]!, {r4, r5}\n\t"
  50831. "ldm %[b]!, {r6, r7}\n\t"
  50832. "and r6, r6, %[m]\n\t"
  50833. "and r7, r7, %[m]\n\t"
  50834. "sbcs r4, r4, r6\n\t"
  50835. "sbcs r5, r5, r7\n\t"
  50836. "stm %[r]!, {r4, r5}\n\t"
  50837. "ldm %[a]!, {r4, r5}\n\t"
  50838. "ldm %[b]!, {r6, r7}\n\t"
  50839. "and r6, r6, %[m]\n\t"
  50840. "and r7, r7, %[m]\n\t"
  50841. "sbcs r4, r4, r6\n\t"
  50842. "sbcs r5, r5, r7\n\t"
  50843. "stm %[r]!, {r4, r5}\n\t"
  50844. "ldm %[a]!, {r4, r5}\n\t"
  50845. "ldm %[b]!, {r6, r7}\n\t"
  50846. "and r6, r6, %[m]\n\t"
  50847. "and r7, r7, %[m]\n\t"
  50848. "sbcs r4, r4, r6\n\t"
  50849. "sbcs r5, r5, r7\n\t"
  50850. "stm %[r]!, {r4, r5}\n\t"
  50851. "ldm %[a]!, {r4, r5}\n\t"
  50852. "ldm %[b]!, {r6, r7}\n\t"
  50853. "and r6, r6, %[m]\n\t"
  50854. "and r7, r7, %[m]\n\t"
  50855. "sbcs r4, r4, r6\n\t"
  50856. "sbcs r5, r5, r7\n\t"
  50857. "stm %[r]!, {r4, r5}\n\t"
  50858. "ldm %[a]!, {r4, r5}\n\t"
  50859. "ldm %[b]!, {r6, r7}\n\t"
  50860. "and r6, r6, %[m]\n\t"
  50861. "and r7, r7, %[m]\n\t"
  50862. "sbcs r4, r4, r6\n\t"
  50863. "sbcs r5, r5, r7\n\t"
  50864. "stm %[r]!, {r4, r5}\n\t"
  50865. "ldm %[a]!, {r4, r5}\n\t"
  50866. "ldm %[b]!, {r6, r7}\n\t"
  50867. "and r6, r6, %[m]\n\t"
  50868. "and r7, r7, %[m]\n\t"
  50869. "sbcs r4, r4, r6\n\t"
  50870. "sbcs r5, r5, r7\n\t"
  50871. "stm %[r]!, {r4, r5}\n\t"
  50872. "ldm %[a]!, {r4, r5}\n\t"
  50873. "ldm %[b]!, {r6, r7}\n\t"
  50874. "and r6, r6, %[m]\n\t"
  50875. "and r7, r7, %[m]\n\t"
  50876. "sbcs r4, r4, r6\n\t"
  50877. "sbcs r5, r5, r7\n\t"
  50878. "stm %[r]!, {r4, r5}\n\t"
  50879. "ldm %[a]!, {r4, r5}\n\t"
  50880. "ldm %[b]!, {r6, r7}\n\t"
  50881. "and r6, r6, %[m]\n\t"
  50882. "and r7, r7, %[m]\n\t"
  50883. "sbcs r4, r4, r6\n\t"
  50884. "sbcs r5, r5, r7\n\t"
  50885. "stm %[r]!, {r4, r5}\n\t"
  50886. "ldm %[a]!, {r4, r5}\n\t"
  50887. "ldm %[b]!, {r6, r7}\n\t"
  50888. "and r6, r6, %[m]\n\t"
  50889. "and r7, r7, %[m]\n\t"
  50890. "sbcs r4, r4, r6\n\t"
  50891. "sbcs r5, r5, r7\n\t"
  50892. "stm %[r]!, {r4, r5}\n\t"
  50893. "ldm %[a]!, {r4, r5}\n\t"
  50894. "ldm %[b]!, {r6, r7}\n\t"
  50895. "and r6, r6, %[m]\n\t"
  50896. "and r7, r7, %[m]\n\t"
  50897. "sbcs r4, r4, r6\n\t"
  50898. "sbcs r5, r5, r7\n\t"
  50899. "stm %[r]!, {r4, r5}\n\t"
  50900. "ldm %[a]!, {r4, r5}\n\t"
  50901. "ldm %[b]!, {r6, r7}\n\t"
  50902. "and r6, r6, %[m]\n\t"
  50903. "and r7, r7, %[m]\n\t"
  50904. "sbcs r4, r4, r6\n\t"
  50905. "sbcs r5, r5, r7\n\t"
  50906. "stm %[r]!, {r4, r5}\n\t"
  50907. "ldm %[a]!, {r4, r5}\n\t"
  50908. "ldm %[b]!, {r6, r7}\n\t"
  50909. "and r6, r6, %[m]\n\t"
  50910. "and r7, r7, %[m]\n\t"
  50911. "sbcs r4, r4, r6\n\t"
  50912. "sbcs r5, r5, r7\n\t"
  50913. "stm %[r]!, {r4, r5}\n\t"
  50914. "ldm %[a]!, {r4, r5}\n\t"
  50915. "ldm %[b]!, {r6, r7}\n\t"
  50916. "and r6, r6, %[m]\n\t"
  50917. "and r7, r7, %[m]\n\t"
  50918. "sbcs r4, r4, r6\n\t"
  50919. "sbcs r5, r5, r7\n\t"
  50920. "stm %[r]!, {r4, r5}\n\t"
  50921. "ldm %[a]!, {r4, r5}\n\t"
  50922. "ldm %[b]!, {r6, r7}\n\t"
  50923. "and r6, r6, %[m]\n\t"
  50924. "and r7, r7, %[m]\n\t"
  50925. "sbcs r4, r4, r6\n\t"
  50926. "sbcs r5, r5, r7\n\t"
  50927. "stm %[r]!, {r4, r5}\n\t"
  50928. "ldm %[a]!, {r4, r5}\n\t"
  50929. "ldm %[b]!, {r6, r7}\n\t"
  50930. "and r6, r6, %[m]\n\t"
  50931. "and r7, r7, %[m]\n\t"
  50932. "sbcs r4, r4, r6\n\t"
  50933. "sbcs r5, r5, r7\n\t"
  50934. "stm %[r]!, {r4, r5}\n\t"
  50935. "ldm %[a]!, {r4, r5}\n\t"
  50936. "ldm %[b]!, {r6, r7}\n\t"
  50937. "and r6, r6, %[m]\n\t"
  50938. "and r7, r7, %[m]\n\t"
  50939. "sbcs r4, r4, r6\n\t"
  50940. "sbcs r5, r5, r7\n\t"
  50941. "stm %[r]!, {r4, r5}\n\t"
  50942. "ldm %[a]!, {r4, r5}\n\t"
  50943. "ldm %[b]!, {r6, r7}\n\t"
  50944. "and r6, r6, %[m]\n\t"
  50945. "and r7, r7, %[m]\n\t"
  50946. "sbcs r4, r4, r6\n\t"
  50947. "sbcs r5, r5, r7\n\t"
  50948. "stm %[r]!, {r4, r5}\n\t"
  50949. "sbc %[r], lr, lr\n\t"
  50950. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  50951. :
  50952. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  50953. );
  50954. return (uint32_t)(size_t)r;
  50955. }
  50956. #endif /* WOLFSSL_SP_SMALL */
  50957. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50958. /* Reduce the number back to 4096 bits using Montgomery reduction.
  50959. *
  50960. * a A single precision number to reduce in place.
  50961. * m The single precision number representing the modulus.
  50962. * mp The digit representing the negative inverse of m mod 2^n.
  50963. */
  50964. static SP_NOINLINE void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  50965. {
  50966. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  50967. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  50968. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  50969. __asm__ __volatile__ (
  50970. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  50971. "ldr r11, [%[m]]\n\t"
  50972. #endif
  50973. /* i = 0 */
  50974. "mov r9, #0\n\t"
  50975. "mov r3, #0\n\t"
  50976. "ldr r12, [%[a]]\n\t"
  50977. "ldr lr, [%[a], #4]\n\t"
  50978. "\n"
  50979. "L_sp_4096_mont_reduce_128_word_%=: \n\t"
  50980. /* mu = a[i] * mp */
  50981. "mul r8, %[mp], r12\n\t"
  50982. /* a[i+0] += m[0] * mu */
  50983. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  50984. "ldr r11, [%[m]]\n\t"
  50985. #endif
  50986. "lsr r7, r11, #16\n\t"
  50987. "lsr r6, r8, #16\n\t"
  50988. "mul r5, r6, r7\n\t"
  50989. "lsl r7, r11, #16\n\t"
  50990. "lsr r7, r7, #16\n\t"
  50991. "mul r6, r7, r6\n\t"
  50992. "lsr r7, r6, #16\n\t"
  50993. "lsl r6, r6, #16\n\t"
  50994. "adds r12, r12, r6\n\t"
  50995. "adc r5, r5, r7\n\t"
  50996. "lsl r6, r8, #16\n\t"
  50997. "lsl r7, r11, #16\n\t"
  50998. "lsr r6, r6, #16\n\t"
  50999. "lsr r7, r7, #16\n\t"
  51000. "mul r7, r6, r7\n\t"
  51001. "adds r12, r12, r7\n\t"
  51002. "adc r5, r5, #0\n\t"
  51003. "lsr r7, r11, #16\n\t"
  51004. "mul r6, r7, r6\n\t"
  51005. "lsr r7, r6, #16\n\t"
  51006. "lsl r6, r6, #16\n\t"
  51007. "adds r12, r12, r6\n\t"
  51008. "adc r5, r5, r7\n\t"
  51009. /* a[i+1] += m[1] * mu */
  51010. "ldr r7, [%[m], #4]\n\t"
  51011. "lsr r10, r7, #16\n\t"
  51012. "lsr r6, r8, #16\n\t"
  51013. "mul r4, r6, r10\n\t"
  51014. "lsl r10, r7, #16\n\t"
  51015. "lsr r10, r10, #16\n\t"
  51016. "mul r6, r10, r6\n\t"
  51017. "lsr r10, r6, #16\n\t"
  51018. "lsl r6, r6, #16\n\t"
  51019. "adds lr, lr, r6\n\t"
  51020. "adc r4, r4, r10\n\t"
  51021. "lsl r6, r8, #16\n\t"
  51022. "lsl r10, r7, #16\n\t"
  51023. "lsr r6, r6, #16\n\t"
  51024. "lsr r10, r10, #16\n\t"
  51025. "mul r10, r6, r10\n\t"
  51026. "adds lr, lr, r10\n\t"
  51027. "adc r4, r4, #0\n\t"
  51028. "lsr r10, r7, #16\n\t"
  51029. "mul r6, r10, r6\n\t"
  51030. "lsr r10, r6, #16\n\t"
  51031. "lsl r6, r6, #16\n\t"
  51032. "adds lr, lr, r6\n\t"
  51033. "adc r4, r4, r10\n\t"
  51034. "mov r12, lr\n\t"
  51035. "adds r12, r12, r5\n\t"
  51036. "adc r4, r4, #0\n\t"
  51037. /* a[i+2] += m[2] * mu */
  51038. "ldr r7, [%[m], #8]\n\t"
  51039. "ldr lr, [%[a], #8]\n\t"
  51040. "lsr r10, r7, #16\n\t"
  51041. "lsr r6, r8, #16\n\t"
  51042. "mul r5, r6, r10\n\t"
  51043. "lsl r10, r7, #16\n\t"
  51044. "lsr r10, r10, #16\n\t"
  51045. "mul r6, r10, r6\n\t"
  51046. "lsr r10, r6, #16\n\t"
  51047. "lsl r6, r6, #16\n\t"
  51048. "adds lr, lr, r6\n\t"
  51049. "adc r5, r5, r10\n\t"
  51050. "lsl r6, r8, #16\n\t"
  51051. "lsl r10, r7, #16\n\t"
  51052. "lsr r6, r6, #16\n\t"
  51053. "lsr r10, r10, #16\n\t"
  51054. "mul r10, r6, r10\n\t"
  51055. "adds lr, lr, r10\n\t"
  51056. "adc r5, r5, #0\n\t"
  51057. "lsr r10, r7, #16\n\t"
  51058. "mul r6, r10, r6\n\t"
  51059. "lsr r10, r6, #16\n\t"
  51060. "lsl r6, r6, #16\n\t"
  51061. "adds lr, lr, r6\n\t"
  51062. "adc r5, r5, r10\n\t"
  51063. "adds lr, lr, r4\n\t"
  51064. "adc r5, r5, #0\n\t"
  51065. /* a[i+3] += m[3] * mu */
  51066. "ldr r7, [%[m], #12]\n\t"
  51067. "ldr r10, [%[a], #12]\n\t"
  51068. "lsr r11, r7, #16\n\t"
  51069. "lsr r6, r8, #16\n\t"
  51070. "mul r4, r6, r11\n\t"
  51071. "lsl r11, r7, #16\n\t"
  51072. "lsr r11, r11, #16\n\t"
  51073. "mul r6, r11, r6\n\t"
  51074. "lsr r11, r6, #16\n\t"
  51075. "lsl r6, r6, #16\n\t"
  51076. "adds r10, r10, r6\n\t"
  51077. "adc r4, r4, r11\n\t"
  51078. "lsl r6, r8, #16\n\t"
  51079. "lsl r11, r7, #16\n\t"
  51080. "lsr r6, r6, #16\n\t"
  51081. "lsr r11, r11, #16\n\t"
  51082. "mul r11, r6, r11\n\t"
  51083. "adds r10, r10, r11\n\t"
  51084. "adc r4, r4, #0\n\t"
  51085. "lsr r11, r7, #16\n\t"
  51086. "mul r6, r11, r6\n\t"
  51087. "lsr r11, r6, #16\n\t"
  51088. "lsl r6, r6, #16\n\t"
  51089. "adds r10, r10, r6\n\t"
  51090. "adc r4, r4, r11\n\t"
  51091. "adds r10, r10, r5\n\t"
  51092. "str r10, [%[a], #12]\n\t"
  51093. "adc r4, r4, #0\n\t"
  51094. /* a[i+4] += m[4] * mu */
  51095. "ldr r7, [%[m], #16]\n\t"
  51096. "ldr r10, [%[a], #16]\n\t"
  51097. "lsr r11, r7, #16\n\t"
  51098. "lsr r6, r8, #16\n\t"
  51099. "mul r5, r6, r11\n\t"
  51100. "lsl r11, r7, #16\n\t"
  51101. "lsr r11, r11, #16\n\t"
  51102. "mul r6, r11, r6\n\t"
  51103. "lsr r11, r6, #16\n\t"
  51104. "lsl r6, r6, #16\n\t"
  51105. "adds r10, r10, r6\n\t"
  51106. "adc r5, r5, r11\n\t"
  51107. "lsl r6, r8, #16\n\t"
  51108. "lsl r11, r7, #16\n\t"
  51109. "lsr r6, r6, #16\n\t"
  51110. "lsr r11, r11, #16\n\t"
  51111. "mul r11, r6, r11\n\t"
  51112. "adds r10, r10, r11\n\t"
  51113. "adc r5, r5, #0\n\t"
  51114. "lsr r11, r7, #16\n\t"
  51115. "mul r6, r11, r6\n\t"
  51116. "lsr r11, r6, #16\n\t"
  51117. "lsl r6, r6, #16\n\t"
  51118. "adds r10, r10, r6\n\t"
  51119. "adc r5, r5, r11\n\t"
  51120. "adds r10, r10, r4\n\t"
  51121. "str r10, [%[a], #16]\n\t"
  51122. "adc r5, r5, #0\n\t"
  51123. /* a[i+5] += m[5] * mu */
  51124. "ldr r7, [%[m], #20]\n\t"
  51125. "ldr r10, [%[a], #20]\n\t"
  51126. "lsr r11, r7, #16\n\t"
  51127. "lsr r6, r8, #16\n\t"
  51128. "mul r4, r6, r11\n\t"
  51129. "lsl r11, r7, #16\n\t"
  51130. "lsr r11, r11, #16\n\t"
  51131. "mul r6, r11, r6\n\t"
  51132. "lsr r11, r6, #16\n\t"
  51133. "lsl r6, r6, #16\n\t"
  51134. "adds r10, r10, r6\n\t"
  51135. "adc r4, r4, r11\n\t"
  51136. "lsl r6, r8, #16\n\t"
  51137. "lsl r11, r7, #16\n\t"
  51138. "lsr r6, r6, #16\n\t"
  51139. "lsr r11, r11, #16\n\t"
  51140. "mul r11, r6, r11\n\t"
  51141. "adds r10, r10, r11\n\t"
  51142. "adc r4, r4, #0\n\t"
  51143. "lsr r11, r7, #16\n\t"
  51144. "mul r6, r11, r6\n\t"
  51145. "lsr r11, r6, #16\n\t"
  51146. "lsl r6, r6, #16\n\t"
  51147. "adds r10, r10, r6\n\t"
  51148. "adc r4, r4, r11\n\t"
  51149. "adds r10, r10, r5\n\t"
  51150. "str r10, [%[a], #20]\n\t"
  51151. "adc r4, r4, #0\n\t"
  51152. /* a[i+6] += m[6] * mu */
  51153. "ldr r7, [%[m], #24]\n\t"
  51154. "ldr r10, [%[a], #24]\n\t"
  51155. "lsr r11, r7, #16\n\t"
  51156. "lsr r6, r8, #16\n\t"
  51157. "mul r5, r6, r11\n\t"
  51158. "lsl r11, r7, #16\n\t"
  51159. "lsr r11, r11, #16\n\t"
  51160. "mul r6, r11, r6\n\t"
  51161. "lsr r11, r6, #16\n\t"
  51162. "lsl r6, r6, #16\n\t"
  51163. "adds r10, r10, r6\n\t"
  51164. "adc r5, r5, r11\n\t"
  51165. "lsl r6, r8, #16\n\t"
  51166. "lsl r11, r7, #16\n\t"
  51167. "lsr r6, r6, #16\n\t"
  51168. "lsr r11, r11, #16\n\t"
  51169. "mul r11, r6, r11\n\t"
  51170. "adds r10, r10, r11\n\t"
  51171. "adc r5, r5, #0\n\t"
  51172. "lsr r11, r7, #16\n\t"
  51173. "mul r6, r11, r6\n\t"
  51174. "lsr r11, r6, #16\n\t"
  51175. "lsl r6, r6, #16\n\t"
  51176. "adds r10, r10, r6\n\t"
  51177. "adc r5, r5, r11\n\t"
  51178. "adds r10, r10, r4\n\t"
  51179. "str r10, [%[a], #24]\n\t"
  51180. "adc r5, r5, #0\n\t"
  51181. /* a[i+7] += m[7] * mu */
  51182. "ldr r7, [%[m], #28]\n\t"
  51183. "ldr r10, [%[a], #28]\n\t"
  51184. "lsr r11, r7, #16\n\t"
  51185. "lsr r6, r8, #16\n\t"
  51186. "mul r4, r6, r11\n\t"
  51187. "lsl r11, r7, #16\n\t"
  51188. "lsr r11, r11, #16\n\t"
  51189. "mul r6, r11, r6\n\t"
  51190. "lsr r11, r6, #16\n\t"
  51191. "lsl r6, r6, #16\n\t"
  51192. "adds r10, r10, r6\n\t"
  51193. "adc r4, r4, r11\n\t"
  51194. "lsl r6, r8, #16\n\t"
  51195. "lsl r11, r7, #16\n\t"
  51196. "lsr r6, r6, #16\n\t"
  51197. "lsr r11, r11, #16\n\t"
  51198. "mul r11, r6, r11\n\t"
  51199. "adds r10, r10, r11\n\t"
  51200. "adc r4, r4, #0\n\t"
  51201. "lsr r11, r7, #16\n\t"
  51202. "mul r6, r11, r6\n\t"
  51203. "lsr r11, r6, #16\n\t"
  51204. "lsl r6, r6, #16\n\t"
  51205. "adds r10, r10, r6\n\t"
  51206. "adc r4, r4, r11\n\t"
  51207. "adds r10, r10, r5\n\t"
  51208. "str r10, [%[a], #28]\n\t"
  51209. "adc r4, r4, #0\n\t"
  51210. /* a[i+8] += m[8] * mu */
  51211. "ldr r7, [%[m], #32]\n\t"
  51212. "ldr r10, [%[a], #32]\n\t"
  51213. "lsr r11, r7, #16\n\t"
  51214. "lsr r6, r8, #16\n\t"
  51215. "mul r5, r6, r11\n\t"
  51216. "lsl r11, r7, #16\n\t"
  51217. "lsr r11, r11, #16\n\t"
  51218. "mul r6, r11, r6\n\t"
  51219. "lsr r11, r6, #16\n\t"
  51220. "lsl r6, r6, #16\n\t"
  51221. "adds r10, r10, r6\n\t"
  51222. "adc r5, r5, r11\n\t"
  51223. "lsl r6, r8, #16\n\t"
  51224. "lsl r11, r7, #16\n\t"
  51225. "lsr r6, r6, #16\n\t"
  51226. "lsr r11, r11, #16\n\t"
  51227. "mul r11, r6, r11\n\t"
  51228. "adds r10, r10, r11\n\t"
  51229. "adc r5, r5, #0\n\t"
  51230. "lsr r11, r7, #16\n\t"
  51231. "mul r6, r11, r6\n\t"
  51232. "lsr r11, r6, #16\n\t"
  51233. "lsl r6, r6, #16\n\t"
  51234. "adds r10, r10, r6\n\t"
  51235. "adc r5, r5, r11\n\t"
  51236. "adds r10, r10, r4\n\t"
  51237. "str r10, [%[a], #32]\n\t"
  51238. "adc r5, r5, #0\n\t"
  51239. /* a[i+9] += m[9] * mu */
  51240. "ldr r7, [%[m], #36]\n\t"
  51241. "ldr r10, [%[a], #36]\n\t"
  51242. "lsr r11, r7, #16\n\t"
  51243. "lsr r6, r8, #16\n\t"
  51244. "mul r4, r6, r11\n\t"
  51245. "lsl r11, r7, #16\n\t"
  51246. "lsr r11, r11, #16\n\t"
  51247. "mul r6, r11, r6\n\t"
  51248. "lsr r11, r6, #16\n\t"
  51249. "lsl r6, r6, #16\n\t"
  51250. "adds r10, r10, r6\n\t"
  51251. "adc r4, r4, r11\n\t"
  51252. "lsl r6, r8, #16\n\t"
  51253. "lsl r11, r7, #16\n\t"
  51254. "lsr r6, r6, #16\n\t"
  51255. "lsr r11, r11, #16\n\t"
  51256. "mul r11, r6, r11\n\t"
  51257. "adds r10, r10, r11\n\t"
  51258. "adc r4, r4, #0\n\t"
  51259. "lsr r11, r7, #16\n\t"
  51260. "mul r6, r11, r6\n\t"
  51261. "lsr r11, r6, #16\n\t"
  51262. "lsl r6, r6, #16\n\t"
  51263. "adds r10, r10, r6\n\t"
  51264. "adc r4, r4, r11\n\t"
  51265. "adds r10, r10, r5\n\t"
  51266. "str r10, [%[a], #36]\n\t"
  51267. "adc r4, r4, #0\n\t"
  51268. /* a[i+10] += m[10] * mu */
  51269. "ldr r7, [%[m], #40]\n\t"
  51270. "ldr r10, [%[a], #40]\n\t"
  51271. "lsr r11, r7, #16\n\t"
  51272. "lsr r6, r8, #16\n\t"
  51273. "mul r5, r6, r11\n\t"
  51274. "lsl r11, r7, #16\n\t"
  51275. "lsr r11, r11, #16\n\t"
  51276. "mul r6, r11, r6\n\t"
  51277. "lsr r11, r6, #16\n\t"
  51278. "lsl r6, r6, #16\n\t"
  51279. "adds r10, r10, r6\n\t"
  51280. "adc r5, r5, r11\n\t"
  51281. "lsl r6, r8, #16\n\t"
  51282. "lsl r11, r7, #16\n\t"
  51283. "lsr r6, r6, #16\n\t"
  51284. "lsr r11, r11, #16\n\t"
  51285. "mul r11, r6, r11\n\t"
  51286. "adds r10, r10, r11\n\t"
  51287. "adc r5, r5, #0\n\t"
  51288. "lsr r11, r7, #16\n\t"
  51289. "mul r6, r11, r6\n\t"
  51290. "lsr r11, r6, #16\n\t"
  51291. "lsl r6, r6, #16\n\t"
  51292. "adds r10, r10, r6\n\t"
  51293. "adc r5, r5, r11\n\t"
  51294. "adds r10, r10, r4\n\t"
  51295. "str r10, [%[a], #40]\n\t"
  51296. "adc r5, r5, #0\n\t"
  51297. /* a[i+11] += m[11] * mu */
  51298. "ldr r7, [%[m], #44]\n\t"
  51299. "ldr r10, [%[a], #44]\n\t"
  51300. "lsr r11, r7, #16\n\t"
  51301. "lsr r6, r8, #16\n\t"
  51302. "mul r4, r6, r11\n\t"
  51303. "lsl r11, r7, #16\n\t"
  51304. "lsr r11, r11, #16\n\t"
  51305. "mul r6, r11, r6\n\t"
  51306. "lsr r11, r6, #16\n\t"
  51307. "lsl r6, r6, #16\n\t"
  51308. "adds r10, r10, r6\n\t"
  51309. "adc r4, r4, r11\n\t"
  51310. "lsl r6, r8, #16\n\t"
  51311. "lsl r11, r7, #16\n\t"
  51312. "lsr r6, r6, #16\n\t"
  51313. "lsr r11, r11, #16\n\t"
  51314. "mul r11, r6, r11\n\t"
  51315. "adds r10, r10, r11\n\t"
  51316. "adc r4, r4, #0\n\t"
  51317. "lsr r11, r7, #16\n\t"
  51318. "mul r6, r11, r6\n\t"
  51319. "lsr r11, r6, #16\n\t"
  51320. "lsl r6, r6, #16\n\t"
  51321. "adds r10, r10, r6\n\t"
  51322. "adc r4, r4, r11\n\t"
  51323. "adds r10, r10, r5\n\t"
  51324. "str r10, [%[a], #44]\n\t"
  51325. "adc r4, r4, #0\n\t"
  51326. /* a[i+12] += m[12] * mu */
  51327. "ldr r7, [%[m], #48]\n\t"
  51328. "ldr r10, [%[a], #48]\n\t"
  51329. "lsr r11, r7, #16\n\t"
  51330. "lsr r6, r8, #16\n\t"
  51331. "mul r5, r6, r11\n\t"
  51332. "lsl r11, r7, #16\n\t"
  51333. "lsr r11, r11, #16\n\t"
  51334. "mul r6, r11, r6\n\t"
  51335. "lsr r11, r6, #16\n\t"
  51336. "lsl r6, r6, #16\n\t"
  51337. "adds r10, r10, r6\n\t"
  51338. "adc r5, r5, r11\n\t"
  51339. "lsl r6, r8, #16\n\t"
  51340. "lsl r11, r7, #16\n\t"
  51341. "lsr r6, r6, #16\n\t"
  51342. "lsr r11, r11, #16\n\t"
  51343. "mul r11, r6, r11\n\t"
  51344. "adds r10, r10, r11\n\t"
  51345. "adc r5, r5, #0\n\t"
  51346. "lsr r11, r7, #16\n\t"
  51347. "mul r6, r11, r6\n\t"
  51348. "lsr r11, r6, #16\n\t"
  51349. "lsl r6, r6, #16\n\t"
  51350. "adds r10, r10, r6\n\t"
  51351. "adc r5, r5, r11\n\t"
  51352. "adds r10, r10, r4\n\t"
  51353. "str r10, [%[a], #48]\n\t"
  51354. "adc r5, r5, #0\n\t"
  51355. /* a[i+13] += m[13] * mu */
  51356. "ldr r7, [%[m], #52]\n\t"
  51357. "ldr r10, [%[a], #52]\n\t"
  51358. "lsr r11, r7, #16\n\t"
  51359. "lsr r6, r8, #16\n\t"
  51360. "mul r4, r6, r11\n\t"
  51361. "lsl r11, r7, #16\n\t"
  51362. "lsr r11, r11, #16\n\t"
  51363. "mul r6, r11, r6\n\t"
  51364. "lsr r11, r6, #16\n\t"
  51365. "lsl r6, r6, #16\n\t"
  51366. "adds r10, r10, r6\n\t"
  51367. "adc r4, r4, r11\n\t"
  51368. "lsl r6, r8, #16\n\t"
  51369. "lsl r11, r7, #16\n\t"
  51370. "lsr r6, r6, #16\n\t"
  51371. "lsr r11, r11, #16\n\t"
  51372. "mul r11, r6, r11\n\t"
  51373. "adds r10, r10, r11\n\t"
  51374. "adc r4, r4, #0\n\t"
  51375. "lsr r11, r7, #16\n\t"
  51376. "mul r6, r11, r6\n\t"
  51377. "lsr r11, r6, #16\n\t"
  51378. "lsl r6, r6, #16\n\t"
  51379. "adds r10, r10, r6\n\t"
  51380. "adc r4, r4, r11\n\t"
  51381. "adds r10, r10, r5\n\t"
  51382. "str r10, [%[a], #52]\n\t"
  51383. "adc r4, r4, #0\n\t"
  51384. /* a[i+14] += m[14] * mu */
  51385. "ldr r7, [%[m], #56]\n\t"
  51386. "ldr r10, [%[a], #56]\n\t"
  51387. "lsr r11, r7, #16\n\t"
  51388. "lsr r6, r8, #16\n\t"
  51389. "mul r5, r6, r11\n\t"
  51390. "lsl r11, r7, #16\n\t"
  51391. "lsr r11, r11, #16\n\t"
  51392. "mul r6, r11, r6\n\t"
  51393. "lsr r11, r6, #16\n\t"
  51394. "lsl r6, r6, #16\n\t"
  51395. "adds r10, r10, r6\n\t"
  51396. "adc r5, r5, r11\n\t"
  51397. "lsl r6, r8, #16\n\t"
  51398. "lsl r11, r7, #16\n\t"
  51399. "lsr r6, r6, #16\n\t"
  51400. "lsr r11, r11, #16\n\t"
  51401. "mul r11, r6, r11\n\t"
  51402. "adds r10, r10, r11\n\t"
  51403. "adc r5, r5, #0\n\t"
  51404. "lsr r11, r7, #16\n\t"
  51405. "mul r6, r11, r6\n\t"
  51406. "lsr r11, r6, #16\n\t"
  51407. "lsl r6, r6, #16\n\t"
  51408. "adds r10, r10, r6\n\t"
  51409. "adc r5, r5, r11\n\t"
  51410. "adds r10, r10, r4\n\t"
  51411. "str r10, [%[a], #56]\n\t"
  51412. "adc r5, r5, #0\n\t"
  51413. /* a[i+15] += m[15] * mu */
  51414. "ldr r7, [%[m], #60]\n\t"
  51415. "ldr r10, [%[a], #60]\n\t"
  51416. "lsr r11, r7, #16\n\t"
  51417. "lsr r6, r8, #16\n\t"
  51418. "mul r4, r6, r11\n\t"
  51419. "lsl r11, r7, #16\n\t"
  51420. "lsr r11, r11, #16\n\t"
  51421. "mul r6, r11, r6\n\t"
  51422. "lsr r11, r6, #16\n\t"
  51423. "lsl r6, r6, #16\n\t"
  51424. "adds r10, r10, r6\n\t"
  51425. "adc r4, r4, r11\n\t"
  51426. "lsl r6, r8, #16\n\t"
  51427. "lsl r11, r7, #16\n\t"
  51428. "lsr r6, r6, #16\n\t"
  51429. "lsr r11, r11, #16\n\t"
  51430. "mul r11, r6, r11\n\t"
  51431. "adds r10, r10, r11\n\t"
  51432. "adc r4, r4, #0\n\t"
  51433. "lsr r11, r7, #16\n\t"
  51434. "mul r6, r11, r6\n\t"
  51435. "lsr r11, r6, #16\n\t"
  51436. "lsl r6, r6, #16\n\t"
  51437. "adds r10, r10, r6\n\t"
  51438. "adc r4, r4, r11\n\t"
  51439. "adds r10, r10, r5\n\t"
  51440. "str r10, [%[a], #60]\n\t"
  51441. "adc r4, r4, #0\n\t"
  51442. /* a[i+16] += m[16] * mu */
  51443. "ldr r7, [%[m], #64]\n\t"
  51444. "ldr r10, [%[a], #64]\n\t"
  51445. "lsr r11, r7, #16\n\t"
  51446. "lsr r6, r8, #16\n\t"
  51447. "mul r5, r6, r11\n\t"
  51448. "lsl r11, r7, #16\n\t"
  51449. "lsr r11, r11, #16\n\t"
  51450. "mul r6, r11, r6\n\t"
  51451. "lsr r11, r6, #16\n\t"
  51452. "lsl r6, r6, #16\n\t"
  51453. "adds r10, r10, r6\n\t"
  51454. "adc r5, r5, r11\n\t"
  51455. "lsl r6, r8, #16\n\t"
  51456. "lsl r11, r7, #16\n\t"
  51457. "lsr r6, r6, #16\n\t"
  51458. "lsr r11, r11, #16\n\t"
  51459. "mul r11, r6, r11\n\t"
  51460. "adds r10, r10, r11\n\t"
  51461. "adc r5, r5, #0\n\t"
  51462. "lsr r11, r7, #16\n\t"
  51463. "mul r6, r11, r6\n\t"
  51464. "lsr r11, r6, #16\n\t"
  51465. "lsl r6, r6, #16\n\t"
  51466. "adds r10, r10, r6\n\t"
  51467. "adc r5, r5, r11\n\t"
  51468. "adds r10, r10, r4\n\t"
  51469. "str r10, [%[a], #64]\n\t"
  51470. "adc r5, r5, #0\n\t"
  51471. /* a[i+17] += m[17] * mu */
  51472. "ldr r7, [%[m], #68]\n\t"
  51473. "ldr r10, [%[a], #68]\n\t"
  51474. "lsr r11, r7, #16\n\t"
  51475. "lsr r6, r8, #16\n\t"
  51476. "mul r4, r6, r11\n\t"
  51477. "lsl r11, r7, #16\n\t"
  51478. "lsr r11, r11, #16\n\t"
  51479. "mul r6, r11, r6\n\t"
  51480. "lsr r11, r6, #16\n\t"
  51481. "lsl r6, r6, #16\n\t"
  51482. "adds r10, r10, r6\n\t"
  51483. "adc r4, r4, r11\n\t"
  51484. "lsl r6, r8, #16\n\t"
  51485. "lsl r11, r7, #16\n\t"
  51486. "lsr r6, r6, #16\n\t"
  51487. "lsr r11, r11, #16\n\t"
  51488. "mul r11, r6, r11\n\t"
  51489. "adds r10, r10, r11\n\t"
  51490. "adc r4, r4, #0\n\t"
  51491. "lsr r11, r7, #16\n\t"
  51492. "mul r6, r11, r6\n\t"
  51493. "lsr r11, r6, #16\n\t"
  51494. "lsl r6, r6, #16\n\t"
  51495. "adds r10, r10, r6\n\t"
  51496. "adc r4, r4, r11\n\t"
  51497. "adds r10, r10, r5\n\t"
  51498. "str r10, [%[a], #68]\n\t"
  51499. "adc r4, r4, #0\n\t"
  51500. /* a[i+18] += m[18] * mu */
  51501. "ldr r7, [%[m], #72]\n\t"
  51502. "ldr r10, [%[a], #72]\n\t"
  51503. "lsr r11, r7, #16\n\t"
  51504. "lsr r6, r8, #16\n\t"
  51505. "mul r5, r6, r11\n\t"
  51506. "lsl r11, r7, #16\n\t"
  51507. "lsr r11, r11, #16\n\t"
  51508. "mul r6, r11, r6\n\t"
  51509. "lsr r11, r6, #16\n\t"
  51510. "lsl r6, r6, #16\n\t"
  51511. "adds r10, r10, r6\n\t"
  51512. "adc r5, r5, r11\n\t"
  51513. "lsl r6, r8, #16\n\t"
  51514. "lsl r11, r7, #16\n\t"
  51515. "lsr r6, r6, #16\n\t"
  51516. "lsr r11, r11, #16\n\t"
  51517. "mul r11, r6, r11\n\t"
  51518. "adds r10, r10, r11\n\t"
  51519. "adc r5, r5, #0\n\t"
  51520. "lsr r11, r7, #16\n\t"
  51521. "mul r6, r11, r6\n\t"
  51522. "lsr r11, r6, #16\n\t"
  51523. "lsl r6, r6, #16\n\t"
  51524. "adds r10, r10, r6\n\t"
  51525. "adc r5, r5, r11\n\t"
  51526. "adds r10, r10, r4\n\t"
  51527. "str r10, [%[a], #72]\n\t"
  51528. "adc r5, r5, #0\n\t"
  51529. /* a[i+19] += m[19] * mu */
  51530. "ldr r7, [%[m], #76]\n\t"
  51531. "ldr r10, [%[a], #76]\n\t"
  51532. "lsr r11, r7, #16\n\t"
  51533. "lsr r6, r8, #16\n\t"
  51534. "mul r4, r6, r11\n\t"
  51535. "lsl r11, r7, #16\n\t"
  51536. "lsr r11, r11, #16\n\t"
  51537. "mul r6, r11, r6\n\t"
  51538. "lsr r11, r6, #16\n\t"
  51539. "lsl r6, r6, #16\n\t"
  51540. "adds r10, r10, r6\n\t"
  51541. "adc r4, r4, r11\n\t"
  51542. "lsl r6, r8, #16\n\t"
  51543. "lsl r11, r7, #16\n\t"
  51544. "lsr r6, r6, #16\n\t"
  51545. "lsr r11, r11, #16\n\t"
  51546. "mul r11, r6, r11\n\t"
  51547. "adds r10, r10, r11\n\t"
  51548. "adc r4, r4, #0\n\t"
  51549. "lsr r11, r7, #16\n\t"
  51550. "mul r6, r11, r6\n\t"
  51551. "lsr r11, r6, #16\n\t"
  51552. "lsl r6, r6, #16\n\t"
  51553. "adds r10, r10, r6\n\t"
  51554. "adc r4, r4, r11\n\t"
  51555. "adds r10, r10, r5\n\t"
  51556. "str r10, [%[a], #76]\n\t"
  51557. "adc r4, r4, #0\n\t"
  51558. /* a[i+20] += m[20] * mu */
  51559. "ldr r7, [%[m], #80]\n\t"
  51560. "ldr r10, [%[a], #80]\n\t"
  51561. "lsr r11, r7, #16\n\t"
  51562. "lsr r6, r8, #16\n\t"
  51563. "mul r5, r6, r11\n\t"
  51564. "lsl r11, r7, #16\n\t"
  51565. "lsr r11, r11, #16\n\t"
  51566. "mul r6, r11, r6\n\t"
  51567. "lsr r11, r6, #16\n\t"
  51568. "lsl r6, r6, #16\n\t"
  51569. "adds r10, r10, r6\n\t"
  51570. "adc r5, r5, r11\n\t"
  51571. "lsl r6, r8, #16\n\t"
  51572. "lsl r11, r7, #16\n\t"
  51573. "lsr r6, r6, #16\n\t"
  51574. "lsr r11, r11, #16\n\t"
  51575. "mul r11, r6, r11\n\t"
  51576. "adds r10, r10, r11\n\t"
  51577. "adc r5, r5, #0\n\t"
  51578. "lsr r11, r7, #16\n\t"
  51579. "mul r6, r11, r6\n\t"
  51580. "lsr r11, r6, #16\n\t"
  51581. "lsl r6, r6, #16\n\t"
  51582. "adds r10, r10, r6\n\t"
  51583. "adc r5, r5, r11\n\t"
  51584. "adds r10, r10, r4\n\t"
  51585. "str r10, [%[a], #80]\n\t"
  51586. "adc r5, r5, #0\n\t"
  51587. /* a[i+21] += m[21] * mu */
  51588. "ldr r7, [%[m], #84]\n\t"
  51589. "ldr r10, [%[a], #84]\n\t"
  51590. "lsr r11, r7, #16\n\t"
  51591. "lsr r6, r8, #16\n\t"
  51592. "mul r4, r6, r11\n\t"
  51593. "lsl r11, r7, #16\n\t"
  51594. "lsr r11, r11, #16\n\t"
  51595. "mul r6, r11, r6\n\t"
  51596. "lsr r11, r6, #16\n\t"
  51597. "lsl r6, r6, #16\n\t"
  51598. "adds r10, r10, r6\n\t"
  51599. "adc r4, r4, r11\n\t"
  51600. "lsl r6, r8, #16\n\t"
  51601. "lsl r11, r7, #16\n\t"
  51602. "lsr r6, r6, #16\n\t"
  51603. "lsr r11, r11, #16\n\t"
  51604. "mul r11, r6, r11\n\t"
  51605. "adds r10, r10, r11\n\t"
  51606. "adc r4, r4, #0\n\t"
  51607. "lsr r11, r7, #16\n\t"
  51608. "mul r6, r11, r6\n\t"
  51609. "lsr r11, r6, #16\n\t"
  51610. "lsl r6, r6, #16\n\t"
  51611. "adds r10, r10, r6\n\t"
  51612. "adc r4, r4, r11\n\t"
  51613. "adds r10, r10, r5\n\t"
  51614. "str r10, [%[a], #84]\n\t"
  51615. "adc r4, r4, #0\n\t"
  51616. /* a[i+22] += m[22] * mu */
  51617. "ldr r7, [%[m], #88]\n\t"
  51618. "ldr r10, [%[a], #88]\n\t"
  51619. "lsr r11, r7, #16\n\t"
  51620. "lsr r6, r8, #16\n\t"
  51621. "mul r5, r6, r11\n\t"
  51622. "lsl r11, r7, #16\n\t"
  51623. "lsr r11, r11, #16\n\t"
  51624. "mul r6, r11, r6\n\t"
  51625. "lsr r11, r6, #16\n\t"
  51626. "lsl r6, r6, #16\n\t"
  51627. "adds r10, r10, r6\n\t"
  51628. "adc r5, r5, r11\n\t"
  51629. "lsl r6, r8, #16\n\t"
  51630. "lsl r11, r7, #16\n\t"
  51631. "lsr r6, r6, #16\n\t"
  51632. "lsr r11, r11, #16\n\t"
  51633. "mul r11, r6, r11\n\t"
  51634. "adds r10, r10, r11\n\t"
  51635. "adc r5, r5, #0\n\t"
  51636. "lsr r11, r7, #16\n\t"
  51637. "mul r6, r11, r6\n\t"
  51638. "lsr r11, r6, #16\n\t"
  51639. "lsl r6, r6, #16\n\t"
  51640. "adds r10, r10, r6\n\t"
  51641. "adc r5, r5, r11\n\t"
  51642. "adds r10, r10, r4\n\t"
  51643. "str r10, [%[a], #88]\n\t"
  51644. "adc r5, r5, #0\n\t"
  51645. /* a[i+23] += m[23] * mu */
  51646. "ldr r7, [%[m], #92]\n\t"
  51647. "ldr r10, [%[a], #92]\n\t"
  51648. "lsr r11, r7, #16\n\t"
  51649. "lsr r6, r8, #16\n\t"
  51650. "mul r4, r6, r11\n\t"
  51651. "lsl r11, r7, #16\n\t"
  51652. "lsr r11, r11, #16\n\t"
  51653. "mul r6, r11, r6\n\t"
  51654. "lsr r11, r6, #16\n\t"
  51655. "lsl r6, r6, #16\n\t"
  51656. "adds r10, r10, r6\n\t"
  51657. "adc r4, r4, r11\n\t"
  51658. "lsl r6, r8, #16\n\t"
  51659. "lsl r11, r7, #16\n\t"
  51660. "lsr r6, r6, #16\n\t"
  51661. "lsr r11, r11, #16\n\t"
  51662. "mul r11, r6, r11\n\t"
  51663. "adds r10, r10, r11\n\t"
  51664. "adc r4, r4, #0\n\t"
  51665. "lsr r11, r7, #16\n\t"
  51666. "mul r6, r11, r6\n\t"
  51667. "lsr r11, r6, #16\n\t"
  51668. "lsl r6, r6, #16\n\t"
  51669. "adds r10, r10, r6\n\t"
  51670. "adc r4, r4, r11\n\t"
  51671. "adds r10, r10, r5\n\t"
  51672. "str r10, [%[a], #92]\n\t"
  51673. "adc r4, r4, #0\n\t"
  51674. /* a[i+24] += m[24] * mu */
  51675. "ldr r7, [%[m], #96]\n\t"
  51676. "ldr r10, [%[a], #96]\n\t"
  51677. "lsr r11, r7, #16\n\t"
  51678. "lsr r6, r8, #16\n\t"
  51679. "mul r5, r6, r11\n\t"
  51680. "lsl r11, r7, #16\n\t"
  51681. "lsr r11, r11, #16\n\t"
  51682. "mul r6, r11, r6\n\t"
  51683. "lsr r11, r6, #16\n\t"
  51684. "lsl r6, r6, #16\n\t"
  51685. "adds r10, r10, r6\n\t"
  51686. "adc r5, r5, r11\n\t"
  51687. "lsl r6, r8, #16\n\t"
  51688. "lsl r11, r7, #16\n\t"
  51689. "lsr r6, r6, #16\n\t"
  51690. "lsr r11, r11, #16\n\t"
  51691. "mul r11, r6, r11\n\t"
  51692. "adds r10, r10, r11\n\t"
  51693. "adc r5, r5, #0\n\t"
  51694. "lsr r11, r7, #16\n\t"
  51695. "mul r6, r11, r6\n\t"
  51696. "lsr r11, r6, #16\n\t"
  51697. "lsl r6, r6, #16\n\t"
  51698. "adds r10, r10, r6\n\t"
  51699. "adc r5, r5, r11\n\t"
  51700. "adds r10, r10, r4\n\t"
  51701. "str r10, [%[a], #96]\n\t"
  51702. "adc r5, r5, #0\n\t"
  51703. /* a[i+25] += m[25] * mu */
  51704. "ldr r7, [%[m], #100]\n\t"
  51705. "ldr r10, [%[a], #100]\n\t"
  51706. "lsr r11, r7, #16\n\t"
  51707. "lsr r6, r8, #16\n\t"
  51708. "mul r4, r6, r11\n\t"
  51709. "lsl r11, r7, #16\n\t"
  51710. "lsr r11, r11, #16\n\t"
  51711. "mul r6, r11, r6\n\t"
  51712. "lsr r11, r6, #16\n\t"
  51713. "lsl r6, r6, #16\n\t"
  51714. "adds r10, r10, r6\n\t"
  51715. "adc r4, r4, r11\n\t"
  51716. "lsl r6, r8, #16\n\t"
  51717. "lsl r11, r7, #16\n\t"
  51718. "lsr r6, r6, #16\n\t"
  51719. "lsr r11, r11, #16\n\t"
  51720. "mul r11, r6, r11\n\t"
  51721. "adds r10, r10, r11\n\t"
  51722. "adc r4, r4, #0\n\t"
  51723. "lsr r11, r7, #16\n\t"
  51724. "mul r6, r11, r6\n\t"
  51725. "lsr r11, r6, #16\n\t"
  51726. "lsl r6, r6, #16\n\t"
  51727. "adds r10, r10, r6\n\t"
  51728. "adc r4, r4, r11\n\t"
  51729. "adds r10, r10, r5\n\t"
  51730. "str r10, [%[a], #100]\n\t"
  51731. "adc r4, r4, #0\n\t"
  51732. /* a[i+26] += m[26] * mu */
  51733. "ldr r7, [%[m], #104]\n\t"
  51734. "ldr r10, [%[a], #104]\n\t"
  51735. "lsr r11, r7, #16\n\t"
  51736. "lsr r6, r8, #16\n\t"
  51737. "mul r5, r6, r11\n\t"
  51738. "lsl r11, r7, #16\n\t"
  51739. "lsr r11, r11, #16\n\t"
  51740. "mul r6, r11, r6\n\t"
  51741. "lsr r11, r6, #16\n\t"
  51742. "lsl r6, r6, #16\n\t"
  51743. "adds r10, r10, r6\n\t"
  51744. "adc r5, r5, r11\n\t"
  51745. "lsl r6, r8, #16\n\t"
  51746. "lsl r11, r7, #16\n\t"
  51747. "lsr r6, r6, #16\n\t"
  51748. "lsr r11, r11, #16\n\t"
  51749. "mul r11, r6, r11\n\t"
  51750. "adds r10, r10, r11\n\t"
  51751. "adc r5, r5, #0\n\t"
  51752. "lsr r11, r7, #16\n\t"
  51753. "mul r6, r11, r6\n\t"
  51754. "lsr r11, r6, #16\n\t"
  51755. "lsl r6, r6, #16\n\t"
  51756. "adds r10, r10, r6\n\t"
  51757. "adc r5, r5, r11\n\t"
  51758. "adds r10, r10, r4\n\t"
  51759. "str r10, [%[a], #104]\n\t"
  51760. "adc r5, r5, #0\n\t"
  51761. /* a[i+27] += m[27] * mu */
  51762. "ldr r7, [%[m], #108]\n\t"
  51763. "ldr r10, [%[a], #108]\n\t"
  51764. "lsr r11, r7, #16\n\t"
  51765. "lsr r6, r8, #16\n\t"
  51766. "mul r4, r6, r11\n\t"
  51767. "lsl r11, r7, #16\n\t"
  51768. "lsr r11, r11, #16\n\t"
  51769. "mul r6, r11, r6\n\t"
  51770. "lsr r11, r6, #16\n\t"
  51771. "lsl r6, r6, #16\n\t"
  51772. "adds r10, r10, r6\n\t"
  51773. "adc r4, r4, r11\n\t"
  51774. "lsl r6, r8, #16\n\t"
  51775. "lsl r11, r7, #16\n\t"
  51776. "lsr r6, r6, #16\n\t"
  51777. "lsr r11, r11, #16\n\t"
  51778. "mul r11, r6, r11\n\t"
  51779. "adds r10, r10, r11\n\t"
  51780. "adc r4, r4, #0\n\t"
  51781. "lsr r11, r7, #16\n\t"
  51782. "mul r6, r11, r6\n\t"
  51783. "lsr r11, r6, #16\n\t"
  51784. "lsl r6, r6, #16\n\t"
  51785. "adds r10, r10, r6\n\t"
  51786. "adc r4, r4, r11\n\t"
  51787. "adds r10, r10, r5\n\t"
  51788. "str r10, [%[a], #108]\n\t"
  51789. "adc r4, r4, #0\n\t"
  51790. /* a[i+28] += m[28] * mu */
  51791. "ldr r7, [%[m], #112]\n\t"
  51792. "ldr r10, [%[a], #112]\n\t"
  51793. "lsr r11, r7, #16\n\t"
  51794. "lsr r6, r8, #16\n\t"
  51795. "mul r5, r6, r11\n\t"
  51796. "lsl r11, r7, #16\n\t"
  51797. "lsr r11, r11, #16\n\t"
  51798. "mul r6, r11, r6\n\t"
  51799. "lsr r11, r6, #16\n\t"
  51800. "lsl r6, r6, #16\n\t"
  51801. "adds r10, r10, r6\n\t"
  51802. "adc r5, r5, r11\n\t"
  51803. "lsl r6, r8, #16\n\t"
  51804. "lsl r11, r7, #16\n\t"
  51805. "lsr r6, r6, #16\n\t"
  51806. "lsr r11, r11, #16\n\t"
  51807. "mul r11, r6, r11\n\t"
  51808. "adds r10, r10, r11\n\t"
  51809. "adc r5, r5, #0\n\t"
  51810. "lsr r11, r7, #16\n\t"
  51811. "mul r6, r11, r6\n\t"
  51812. "lsr r11, r6, #16\n\t"
  51813. "lsl r6, r6, #16\n\t"
  51814. "adds r10, r10, r6\n\t"
  51815. "adc r5, r5, r11\n\t"
  51816. "adds r10, r10, r4\n\t"
  51817. "str r10, [%[a], #112]\n\t"
  51818. "adc r5, r5, #0\n\t"
  51819. /* a[i+29] += m[29] * mu */
  51820. "ldr r7, [%[m], #116]\n\t"
  51821. "ldr r10, [%[a], #116]\n\t"
  51822. "lsr r11, r7, #16\n\t"
  51823. "lsr r6, r8, #16\n\t"
  51824. "mul r4, r6, r11\n\t"
  51825. "lsl r11, r7, #16\n\t"
  51826. "lsr r11, r11, #16\n\t"
  51827. "mul r6, r11, r6\n\t"
  51828. "lsr r11, r6, #16\n\t"
  51829. "lsl r6, r6, #16\n\t"
  51830. "adds r10, r10, r6\n\t"
  51831. "adc r4, r4, r11\n\t"
  51832. "lsl r6, r8, #16\n\t"
  51833. "lsl r11, r7, #16\n\t"
  51834. "lsr r6, r6, #16\n\t"
  51835. "lsr r11, r11, #16\n\t"
  51836. "mul r11, r6, r11\n\t"
  51837. "adds r10, r10, r11\n\t"
  51838. "adc r4, r4, #0\n\t"
  51839. "lsr r11, r7, #16\n\t"
  51840. "mul r6, r11, r6\n\t"
  51841. "lsr r11, r6, #16\n\t"
  51842. "lsl r6, r6, #16\n\t"
  51843. "adds r10, r10, r6\n\t"
  51844. "adc r4, r4, r11\n\t"
  51845. "adds r10, r10, r5\n\t"
  51846. "str r10, [%[a], #116]\n\t"
  51847. "adc r4, r4, #0\n\t"
  51848. /* a[i+30] += m[30] * mu */
  51849. "ldr r7, [%[m], #120]\n\t"
  51850. "ldr r10, [%[a], #120]\n\t"
  51851. "lsr r11, r7, #16\n\t"
  51852. "lsr r6, r8, #16\n\t"
  51853. "mul r5, r6, r11\n\t"
  51854. "lsl r11, r7, #16\n\t"
  51855. "lsr r11, r11, #16\n\t"
  51856. "mul r6, r11, r6\n\t"
  51857. "lsr r11, r6, #16\n\t"
  51858. "lsl r6, r6, #16\n\t"
  51859. "adds r10, r10, r6\n\t"
  51860. "adc r5, r5, r11\n\t"
  51861. "lsl r6, r8, #16\n\t"
  51862. "lsl r11, r7, #16\n\t"
  51863. "lsr r6, r6, #16\n\t"
  51864. "lsr r11, r11, #16\n\t"
  51865. "mul r11, r6, r11\n\t"
  51866. "adds r10, r10, r11\n\t"
  51867. "adc r5, r5, #0\n\t"
  51868. "lsr r11, r7, #16\n\t"
  51869. "mul r6, r11, r6\n\t"
  51870. "lsr r11, r6, #16\n\t"
  51871. "lsl r6, r6, #16\n\t"
  51872. "adds r10, r10, r6\n\t"
  51873. "adc r5, r5, r11\n\t"
  51874. "adds r10, r10, r4\n\t"
  51875. "str r10, [%[a], #120]\n\t"
  51876. "adc r5, r5, #0\n\t"
  51877. /* a[i+31] += m[31] * mu */
  51878. "ldr r7, [%[m], #124]\n\t"
  51879. "ldr r10, [%[a], #124]\n\t"
  51880. "lsr r11, r7, #16\n\t"
  51881. "lsr r6, r8, #16\n\t"
  51882. "mul r4, r6, r11\n\t"
  51883. "lsl r11, r7, #16\n\t"
  51884. "lsr r11, r11, #16\n\t"
  51885. "mul r6, r11, r6\n\t"
  51886. "lsr r11, r6, #16\n\t"
  51887. "lsl r6, r6, #16\n\t"
  51888. "adds r10, r10, r6\n\t"
  51889. "adc r4, r4, r11\n\t"
  51890. "lsl r6, r8, #16\n\t"
  51891. "lsl r11, r7, #16\n\t"
  51892. "lsr r6, r6, #16\n\t"
  51893. "lsr r11, r11, #16\n\t"
  51894. "mul r11, r6, r11\n\t"
  51895. "adds r10, r10, r11\n\t"
  51896. "adc r4, r4, #0\n\t"
  51897. "lsr r11, r7, #16\n\t"
  51898. "mul r6, r11, r6\n\t"
  51899. "lsr r11, r6, #16\n\t"
  51900. "lsl r6, r6, #16\n\t"
  51901. "adds r10, r10, r6\n\t"
  51902. "adc r4, r4, r11\n\t"
  51903. "adds r10, r10, r5\n\t"
  51904. "str r10, [%[a], #124]\n\t"
  51905. "adc r4, r4, #0\n\t"
  51906. /* a[i+32] += m[32] * mu */
  51907. "ldr r7, [%[m], #128]\n\t"
  51908. "ldr r10, [%[a], #128]\n\t"
  51909. "lsr r11, r7, #16\n\t"
  51910. "lsr r6, r8, #16\n\t"
  51911. "mul r5, r6, r11\n\t"
  51912. "lsl r11, r7, #16\n\t"
  51913. "lsr r11, r11, #16\n\t"
  51914. "mul r6, r11, r6\n\t"
  51915. "lsr r11, r6, #16\n\t"
  51916. "lsl r6, r6, #16\n\t"
  51917. "adds r10, r10, r6\n\t"
  51918. "adc r5, r5, r11\n\t"
  51919. "lsl r6, r8, #16\n\t"
  51920. "lsl r11, r7, #16\n\t"
  51921. "lsr r6, r6, #16\n\t"
  51922. "lsr r11, r11, #16\n\t"
  51923. "mul r11, r6, r11\n\t"
  51924. "adds r10, r10, r11\n\t"
  51925. "adc r5, r5, #0\n\t"
  51926. "lsr r11, r7, #16\n\t"
  51927. "mul r6, r11, r6\n\t"
  51928. "lsr r11, r6, #16\n\t"
  51929. "lsl r6, r6, #16\n\t"
  51930. "adds r10, r10, r6\n\t"
  51931. "adc r5, r5, r11\n\t"
  51932. "adds r10, r10, r4\n\t"
  51933. "str r10, [%[a], #128]\n\t"
  51934. "adc r5, r5, #0\n\t"
  51935. /* a[i+33] += m[33] * mu */
  51936. "ldr r7, [%[m], #132]\n\t"
  51937. "ldr r10, [%[a], #132]\n\t"
  51938. "lsr r11, r7, #16\n\t"
  51939. "lsr r6, r8, #16\n\t"
  51940. "mul r4, r6, r11\n\t"
  51941. "lsl r11, r7, #16\n\t"
  51942. "lsr r11, r11, #16\n\t"
  51943. "mul r6, r11, r6\n\t"
  51944. "lsr r11, r6, #16\n\t"
  51945. "lsl r6, r6, #16\n\t"
  51946. "adds r10, r10, r6\n\t"
  51947. "adc r4, r4, r11\n\t"
  51948. "lsl r6, r8, #16\n\t"
  51949. "lsl r11, r7, #16\n\t"
  51950. "lsr r6, r6, #16\n\t"
  51951. "lsr r11, r11, #16\n\t"
  51952. "mul r11, r6, r11\n\t"
  51953. "adds r10, r10, r11\n\t"
  51954. "adc r4, r4, #0\n\t"
  51955. "lsr r11, r7, #16\n\t"
  51956. "mul r6, r11, r6\n\t"
  51957. "lsr r11, r6, #16\n\t"
  51958. "lsl r6, r6, #16\n\t"
  51959. "adds r10, r10, r6\n\t"
  51960. "adc r4, r4, r11\n\t"
  51961. "adds r10, r10, r5\n\t"
  51962. "str r10, [%[a], #132]\n\t"
  51963. "adc r4, r4, #0\n\t"
  51964. /* a[i+34] += m[34] * mu */
  51965. "ldr r7, [%[m], #136]\n\t"
  51966. "ldr r10, [%[a], #136]\n\t"
  51967. "lsr r11, r7, #16\n\t"
  51968. "lsr r6, r8, #16\n\t"
  51969. "mul r5, r6, r11\n\t"
  51970. "lsl r11, r7, #16\n\t"
  51971. "lsr r11, r11, #16\n\t"
  51972. "mul r6, r11, r6\n\t"
  51973. "lsr r11, r6, #16\n\t"
  51974. "lsl r6, r6, #16\n\t"
  51975. "adds r10, r10, r6\n\t"
  51976. "adc r5, r5, r11\n\t"
  51977. "lsl r6, r8, #16\n\t"
  51978. "lsl r11, r7, #16\n\t"
  51979. "lsr r6, r6, #16\n\t"
  51980. "lsr r11, r11, #16\n\t"
  51981. "mul r11, r6, r11\n\t"
  51982. "adds r10, r10, r11\n\t"
  51983. "adc r5, r5, #0\n\t"
  51984. "lsr r11, r7, #16\n\t"
  51985. "mul r6, r11, r6\n\t"
  51986. "lsr r11, r6, #16\n\t"
  51987. "lsl r6, r6, #16\n\t"
  51988. "adds r10, r10, r6\n\t"
  51989. "adc r5, r5, r11\n\t"
  51990. "adds r10, r10, r4\n\t"
  51991. "str r10, [%[a], #136]\n\t"
  51992. "adc r5, r5, #0\n\t"
  51993. /* a[i+35] += m[35] * mu */
  51994. "ldr r7, [%[m], #140]\n\t"
  51995. "ldr r10, [%[a], #140]\n\t"
  51996. "lsr r11, r7, #16\n\t"
  51997. "lsr r6, r8, #16\n\t"
  51998. "mul r4, r6, r11\n\t"
  51999. "lsl r11, r7, #16\n\t"
  52000. "lsr r11, r11, #16\n\t"
  52001. "mul r6, r11, r6\n\t"
  52002. "lsr r11, r6, #16\n\t"
  52003. "lsl r6, r6, #16\n\t"
  52004. "adds r10, r10, r6\n\t"
  52005. "adc r4, r4, r11\n\t"
  52006. "lsl r6, r8, #16\n\t"
  52007. "lsl r11, r7, #16\n\t"
  52008. "lsr r6, r6, #16\n\t"
  52009. "lsr r11, r11, #16\n\t"
  52010. "mul r11, r6, r11\n\t"
  52011. "adds r10, r10, r11\n\t"
  52012. "adc r4, r4, #0\n\t"
  52013. "lsr r11, r7, #16\n\t"
  52014. "mul r6, r11, r6\n\t"
  52015. "lsr r11, r6, #16\n\t"
  52016. "lsl r6, r6, #16\n\t"
  52017. "adds r10, r10, r6\n\t"
  52018. "adc r4, r4, r11\n\t"
  52019. "adds r10, r10, r5\n\t"
  52020. "str r10, [%[a], #140]\n\t"
  52021. "adc r4, r4, #0\n\t"
  52022. /* a[i+36] += m[36] * mu */
  52023. "ldr r7, [%[m], #144]\n\t"
  52024. "ldr r10, [%[a], #144]\n\t"
  52025. "lsr r11, r7, #16\n\t"
  52026. "lsr r6, r8, #16\n\t"
  52027. "mul r5, r6, r11\n\t"
  52028. "lsl r11, r7, #16\n\t"
  52029. "lsr r11, r11, #16\n\t"
  52030. "mul r6, r11, r6\n\t"
  52031. "lsr r11, r6, #16\n\t"
  52032. "lsl r6, r6, #16\n\t"
  52033. "adds r10, r10, r6\n\t"
  52034. "adc r5, r5, r11\n\t"
  52035. "lsl r6, r8, #16\n\t"
  52036. "lsl r11, r7, #16\n\t"
  52037. "lsr r6, r6, #16\n\t"
  52038. "lsr r11, r11, #16\n\t"
  52039. "mul r11, r6, r11\n\t"
  52040. "adds r10, r10, r11\n\t"
  52041. "adc r5, r5, #0\n\t"
  52042. "lsr r11, r7, #16\n\t"
  52043. "mul r6, r11, r6\n\t"
  52044. "lsr r11, r6, #16\n\t"
  52045. "lsl r6, r6, #16\n\t"
  52046. "adds r10, r10, r6\n\t"
  52047. "adc r5, r5, r11\n\t"
  52048. "adds r10, r10, r4\n\t"
  52049. "str r10, [%[a], #144]\n\t"
  52050. "adc r5, r5, #0\n\t"
  52051. /* a[i+37] += m[37] * mu */
  52052. "ldr r7, [%[m], #148]\n\t"
  52053. "ldr r10, [%[a], #148]\n\t"
  52054. "lsr r11, r7, #16\n\t"
  52055. "lsr r6, r8, #16\n\t"
  52056. "mul r4, r6, r11\n\t"
  52057. "lsl r11, r7, #16\n\t"
  52058. "lsr r11, r11, #16\n\t"
  52059. "mul r6, r11, r6\n\t"
  52060. "lsr r11, r6, #16\n\t"
  52061. "lsl r6, r6, #16\n\t"
  52062. "adds r10, r10, r6\n\t"
  52063. "adc r4, r4, r11\n\t"
  52064. "lsl r6, r8, #16\n\t"
  52065. "lsl r11, r7, #16\n\t"
  52066. "lsr r6, r6, #16\n\t"
  52067. "lsr r11, r11, #16\n\t"
  52068. "mul r11, r6, r11\n\t"
  52069. "adds r10, r10, r11\n\t"
  52070. "adc r4, r4, #0\n\t"
  52071. "lsr r11, r7, #16\n\t"
  52072. "mul r6, r11, r6\n\t"
  52073. "lsr r11, r6, #16\n\t"
  52074. "lsl r6, r6, #16\n\t"
  52075. "adds r10, r10, r6\n\t"
  52076. "adc r4, r4, r11\n\t"
  52077. "adds r10, r10, r5\n\t"
  52078. "str r10, [%[a], #148]\n\t"
  52079. "adc r4, r4, #0\n\t"
  52080. /* a[i+38] += m[38] * mu */
  52081. "ldr r7, [%[m], #152]\n\t"
  52082. "ldr r10, [%[a], #152]\n\t"
  52083. "lsr r11, r7, #16\n\t"
  52084. "lsr r6, r8, #16\n\t"
  52085. "mul r5, r6, r11\n\t"
  52086. "lsl r11, r7, #16\n\t"
  52087. "lsr r11, r11, #16\n\t"
  52088. "mul r6, r11, r6\n\t"
  52089. "lsr r11, r6, #16\n\t"
  52090. "lsl r6, r6, #16\n\t"
  52091. "adds r10, r10, r6\n\t"
  52092. "adc r5, r5, r11\n\t"
  52093. "lsl r6, r8, #16\n\t"
  52094. "lsl r11, r7, #16\n\t"
  52095. "lsr r6, r6, #16\n\t"
  52096. "lsr r11, r11, #16\n\t"
  52097. "mul r11, r6, r11\n\t"
  52098. "adds r10, r10, r11\n\t"
  52099. "adc r5, r5, #0\n\t"
  52100. "lsr r11, r7, #16\n\t"
  52101. "mul r6, r11, r6\n\t"
  52102. "lsr r11, r6, #16\n\t"
  52103. "lsl r6, r6, #16\n\t"
  52104. "adds r10, r10, r6\n\t"
  52105. "adc r5, r5, r11\n\t"
  52106. "adds r10, r10, r4\n\t"
  52107. "str r10, [%[a], #152]\n\t"
  52108. "adc r5, r5, #0\n\t"
  52109. /* a[i+39] += m[39] * mu */
  52110. "ldr r7, [%[m], #156]\n\t"
  52111. "ldr r10, [%[a], #156]\n\t"
  52112. "lsr r11, r7, #16\n\t"
  52113. "lsr r6, r8, #16\n\t"
  52114. "mul r4, r6, r11\n\t"
  52115. "lsl r11, r7, #16\n\t"
  52116. "lsr r11, r11, #16\n\t"
  52117. "mul r6, r11, r6\n\t"
  52118. "lsr r11, r6, #16\n\t"
  52119. "lsl r6, r6, #16\n\t"
  52120. "adds r10, r10, r6\n\t"
  52121. "adc r4, r4, r11\n\t"
  52122. "lsl r6, r8, #16\n\t"
  52123. "lsl r11, r7, #16\n\t"
  52124. "lsr r6, r6, #16\n\t"
  52125. "lsr r11, r11, #16\n\t"
  52126. "mul r11, r6, r11\n\t"
  52127. "adds r10, r10, r11\n\t"
  52128. "adc r4, r4, #0\n\t"
  52129. "lsr r11, r7, #16\n\t"
  52130. "mul r6, r11, r6\n\t"
  52131. "lsr r11, r6, #16\n\t"
  52132. "lsl r6, r6, #16\n\t"
  52133. "adds r10, r10, r6\n\t"
  52134. "adc r4, r4, r11\n\t"
  52135. "adds r10, r10, r5\n\t"
  52136. "str r10, [%[a], #156]\n\t"
  52137. "adc r4, r4, #0\n\t"
  52138. /* a[i+40] += m[40] * mu */
  52139. "ldr r7, [%[m], #160]\n\t"
  52140. "ldr r10, [%[a], #160]\n\t"
  52141. "lsr r11, r7, #16\n\t"
  52142. "lsr r6, r8, #16\n\t"
  52143. "mul r5, r6, r11\n\t"
  52144. "lsl r11, r7, #16\n\t"
  52145. "lsr r11, r11, #16\n\t"
  52146. "mul r6, r11, r6\n\t"
  52147. "lsr r11, r6, #16\n\t"
  52148. "lsl r6, r6, #16\n\t"
  52149. "adds r10, r10, r6\n\t"
  52150. "adc r5, r5, r11\n\t"
  52151. "lsl r6, r8, #16\n\t"
  52152. "lsl r11, r7, #16\n\t"
  52153. "lsr r6, r6, #16\n\t"
  52154. "lsr r11, r11, #16\n\t"
  52155. "mul r11, r6, r11\n\t"
  52156. "adds r10, r10, r11\n\t"
  52157. "adc r5, r5, #0\n\t"
  52158. "lsr r11, r7, #16\n\t"
  52159. "mul r6, r11, r6\n\t"
  52160. "lsr r11, r6, #16\n\t"
  52161. "lsl r6, r6, #16\n\t"
  52162. "adds r10, r10, r6\n\t"
  52163. "adc r5, r5, r11\n\t"
  52164. "adds r10, r10, r4\n\t"
  52165. "str r10, [%[a], #160]\n\t"
  52166. "adc r5, r5, #0\n\t"
  52167. /* a[i+41] += m[41] * mu */
  52168. "ldr r7, [%[m], #164]\n\t"
  52169. "ldr r10, [%[a], #164]\n\t"
  52170. "lsr r11, r7, #16\n\t"
  52171. "lsr r6, r8, #16\n\t"
  52172. "mul r4, r6, r11\n\t"
  52173. "lsl r11, r7, #16\n\t"
  52174. "lsr r11, r11, #16\n\t"
  52175. "mul r6, r11, r6\n\t"
  52176. "lsr r11, r6, #16\n\t"
  52177. "lsl r6, r6, #16\n\t"
  52178. "adds r10, r10, r6\n\t"
  52179. "adc r4, r4, r11\n\t"
  52180. "lsl r6, r8, #16\n\t"
  52181. "lsl r11, r7, #16\n\t"
  52182. "lsr r6, r6, #16\n\t"
  52183. "lsr r11, r11, #16\n\t"
  52184. "mul r11, r6, r11\n\t"
  52185. "adds r10, r10, r11\n\t"
  52186. "adc r4, r4, #0\n\t"
  52187. "lsr r11, r7, #16\n\t"
  52188. "mul r6, r11, r6\n\t"
  52189. "lsr r11, r6, #16\n\t"
  52190. "lsl r6, r6, #16\n\t"
  52191. "adds r10, r10, r6\n\t"
  52192. "adc r4, r4, r11\n\t"
  52193. "adds r10, r10, r5\n\t"
  52194. "str r10, [%[a], #164]\n\t"
  52195. "adc r4, r4, #0\n\t"
  52196. /* a[i+42] += m[42] * mu */
  52197. "ldr r7, [%[m], #168]\n\t"
  52198. "ldr r10, [%[a], #168]\n\t"
  52199. "lsr r11, r7, #16\n\t"
  52200. "lsr r6, r8, #16\n\t"
  52201. "mul r5, r6, r11\n\t"
  52202. "lsl r11, r7, #16\n\t"
  52203. "lsr r11, r11, #16\n\t"
  52204. "mul r6, r11, r6\n\t"
  52205. "lsr r11, r6, #16\n\t"
  52206. "lsl r6, r6, #16\n\t"
  52207. "adds r10, r10, r6\n\t"
  52208. "adc r5, r5, r11\n\t"
  52209. "lsl r6, r8, #16\n\t"
  52210. "lsl r11, r7, #16\n\t"
  52211. "lsr r6, r6, #16\n\t"
  52212. "lsr r11, r11, #16\n\t"
  52213. "mul r11, r6, r11\n\t"
  52214. "adds r10, r10, r11\n\t"
  52215. "adc r5, r5, #0\n\t"
  52216. "lsr r11, r7, #16\n\t"
  52217. "mul r6, r11, r6\n\t"
  52218. "lsr r11, r6, #16\n\t"
  52219. "lsl r6, r6, #16\n\t"
  52220. "adds r10, r10, r6\n\t"
  52221. "adc r5, r5, r11\n\t"
  52222. "adds r10, r10, r4\n\t"
  52223. "str r10, [%[a], #168]\n\t"
  52224. "adc r5, r5, #0\n\t"
  52225. /* a[i+43] += m[43] * mu */
  52226. "ldr r7, [%[m], #172]\n\t"
  52227. "ldr r10, [%[a], #172]\n\t"
  52228. "lsr r11, r7, #16\n\t"
  52229. "lsr r6, r8, #16\n\t"
  52230. "mul r4, r6, r11\n\t"
  52231. "lsl r11, r7, #16\n\t"
  52232. "lsr r11, r11, #16\n\t"
  52233. "mul r6, r11, r6\n\t"
  52234. "lsr r11, r6, #16\n\t"
  52235. "lsl r6, r6, #16\n\t"
  52236. "adds r10, r10, r6\n\t"
  52237. "adc r4, r4, r11\n\t"
  52238. "lsl r6, r8, #16\n\t"
  52239. "lsl r11, r7, #16\n\t"
  52240. "lsr r6, r6, #16\n\t"
  52241. "lsr r11, r11, #16\n\t"
  52242. "mul r11, r6, r11\n\t"
  52243. "adds r10, r10, r11\n\t"
  52244. "adc r4, r4, #0\n\t"
  52245. "lsr r11, r7, #16\n\t"
  52246. "mul r6, r11, r6\n\t"
  52247. "lsr r11, r6, #16\n\t"
  52248. "lsl r6, r6, #16\n\t"
  52249. "adds r10, r10, r6\n\t"
  52250. "adc r4, r4, r11\n\t"
  52251. "adds r10, r10, r5\n\t"
  52252. "str r10, [%[a], #172]\n\t"
  52253. "adc r4, r4, #0\n\t"
  52254. /* a[i+44] += m[44] * mu */
  52255. "ldr r7, [%[m], #176]\n\t"
  52256. "ldr r10, [%[a], #176]\n\t"
  52257. "lsr r11, r7, #16\n\t"
  52258. "lsr r6, r8, #16\n\t"
  52259. "mul r5, r6, r11\n\t"
  52260. "lsl r11, r7, #16\n\t"
  52261. "lsr r11, r11, #16\n\t"
  52262. "mul r6, r11, r6\n\t"
  52263. "lsr r11, r6, #16\n\t"
  52264. "lsl r6, r6, #16\n\t"
  52265. "adds r10, r10, r6\n\t"
  52266. "adc r5, r5, r11\n\t"
  52267. "lsl r6, r8, #16\n\t"
  52268. "lsl r11, r7, #16\n\t"
  52269. "lsr r6, r6, #16\n\t"
  52270. "lsr r11, r11, #16\n\t"
  52271. "mul r11, r6, r11\n\t"
  52272. "adds r10, r10, r11\n\t"
  52273. "adc r5, r5, #0\n\t"
  52274. "lsr r11, r7, #16\n\t"
  52275. "mul r6, r11, r6\n\t"
  52276. "lsr r11, r6, #16\n\t"
  52277. "lsl r6, r6, #16\n\t"
  52278. "adds r10, r10, r6\n\t"
  52279. "adc r5, r5, r11\n\t"
  52280. "adds r10, r10, r4\n\t"
  52281. "str r10, [%[a], #176]\n\t"
  52282. "adc r5, r5, #0\n\t"
  52283. /* a[i+45] += m[45] * mu */
  52284. "ldr r7, [%[m], #180]\n\t"
  52285. "ldr r10, [%[a], #180]\n\t"
  52286. "lsr r11, r7, #16\n\t"
  52287. "lsr r6, r8, #16\n\t"
  52288. "mul r4, r6, r11\n\t"
  52289. "lsl r11, r7, #16\n\t"
  52290. "lsr r11, r11, #16\n\t"
  52291. "mul r6, r11, r6\n\t"
  52292. "lsr r11, r6, #16\n\t"
  52293. "lsl r6, r6, #16\n\t"
  52294. "adds r10, r10, r6\n\t"
  52295. "adc r4, r4, r11\n\t"
  52296. "lsl r6, r8, #16\n\t"
  52297. "lsl r11, r7, #16\n\t"
  52298. "lsr r6, r6, #16\n\t"
  52299. "lsr r11, r11, #16\n\t"
  52300. "mul r11, r6, r11\n\t"
  52301. "adds r10, r10, r11\n\t"
  52302. "adc r4, r4, #0\n\t"
  52303. "lsr r11, r7, #16\n\t"
  52304. "mul r6, r11, r6\n\t"
  52305. "lsr r11, r6, #16\n\t"
  52306. "lsl r6, r6, #16\n\t"
  52307. "adds r10, r10, r6\n\t"
  52308. "adc r4, r4, r11\n\t"
  52309. "adds r10, r10, r5\n\t"
  52310. "str r10, [%[a], #180]\n\t"
  52311. "adc r4, r4, #0\n\t"
  52312. /* a[i+46] += m[46] * mu */
  52313. "ldr r7, [%[m], #184]\n\t"
  52314. "ldr r10, [%[a], #184]\n\t"
  52315. "lsr r11, r7, #16\n\t"
  52316. "lsr r6, r8, #16\n\t"
  52317. "mul r5, r6, r11\n\t"
  52318. "lsl r11, r7, #16\n\t"
  52319. "lsr r11, r11, #16\n\t"
  52320. "mul r6, r11, r6\n\t"
  52321. "lsr r11, r6, #16\n\t"
  52322. "lsl r6, r6, #16\n\t"
  52323. "adds r10, r10, r6\n\t"
  52324. "adc r5, r5, r11\n\t"
  52325. "lsl r6, r8, #16\n\t"
  52326. "lsl r11, r7, #16\n\t"
  52327. "lsr r6, r6, #16\n\t"
  52328. "lsr r11, r11, #16\n\t"
  52329. "mul r11, r6, r11\n\t"
  52330. "adds r10, r10, r11\n\t"
  52331. "adc r5, r5, #0\n\t"
  52332. "lsr r11, r7, #16\n\t"
  52333. "mul r6, r11, r6\n\t"
  52334. "lsr r11, r6, #16\n\t"
  52335. "lsl r6, r6, #16\n\t"
  52336. "adds r10, r10, r6\n\t"
  52337. "adc r5, r5, r11\n\t"
  52338. "adds r10, r10, r4\n\t"
  52339. "str r10, [%[a], #184]\n\t"
  52340. "adc r5, r5, #0\n\t"
  52341. /* a[i+47] += m[47] * mu */
  52342. "ldr r7, [%[m], #188]\n\t"
  52343. "ldr r10, [%[a], #188]\n\t"
  52344. "lsr r11, r7, #16\n\t"
  52345. "lsr r6, r8, #16\n\t"
  52346. "mul r4, r6, r11\n\t"
  52347. "lsl r11, r7, #16\n\t"
  52348. "lsr r11, r11, #16\n\t"
  52349. "mul r6, r11, r6\n\t"
  52350. "lsr r11, r6, #16\n\t"
  52351. "lsl r6, r6, #16\n\t"
  52352. "adds r10, r10, r6\n\t"
  52353. "adc r4, r4, r11\n\t"
  52354. "lsl r6, r8, #16\n\t"
  52355. "lsl r11, r7, #16\n\t"
  52356. "lsr r6, r6, #16\n\t"
  52357. "lsr r11, r11, #16\n\t"
  52358. "mul r11, r6, r11\n\t"
  52359. "adds r10, r10, r11\n\t"
  52360. "adc r4, r4, #0\n\t"
  52361. "lsr r11, r7, #16\n\t"
  52362. "mul r6, r11, r6\n\t"
  52363. "lsr r11, r6, #16\n\t"
  52364. "lsl r6, r6, #16\n\t"
  52365. "adds r10, r10, r6\n\t"
  52366. "adc r4, r4, r11\n\t"
  52367. "adds r10, r10, r5\n\t"
  52368. "str r10, [%[a], #188]\n\t"
  52369. "adc r4, r4, #0\n\t"
  52370. /* a[i+48] += m[48] * mu */
  52371. "ldr r7, [%[m], #192]\n\t"
  52372. "ldr r10, [%[a], #192]\n\t"
  52373. "lsr r11, r7, #16\n\t"
  52374. "lsr r6, r8, #16\n\t"
  52375. "mul r5, r6, r11\n\t"
  52376. "lsl r11, r7, #16\n\t"
  52377. "lsr r11, r11, #16\n\t"
  52378. "mul r6, r11, r6\n\t"
  52379. "lsr r11, r6, #16\n\t"
  52380. "lsl r6, r6, #16\n\t"
  52381. "adds r10, r10, r6\n\t"
  52382. "adc r5, r5, r11\n\t"
  52383. "lsl r6, r8, #16\n\t"
  52384. "lsl r11, r7, #16\n\t"
  52385. "lsr r6, r6, #16\n\t"
  52386. "lsr r11, r11, #16\n\t"
  52387. "mul r11, r6, r11\n\t"
  52388. "adds r10, r10, r11\n\t"
  52389. "adc r5, r5, #0\n\t"
  52390. "lsr r11, r7, #16\n\t"
  52391. "mul r6, r11, r6\n\t"
  52392. "lsr r11, r6, #16\n\t"
  52393. "lsl r6, r6, #16\n\t"
  52394. "adds r10, r10, r6\n\t"
  52395. "adc r5, r5, r11\n\t"
  52396. "adds r10, r10, r4\n\t"
  52397. "str r10, [%[a], #192]\n\t"
  52398. "adc r5, r5, #0\n\t"
  52399. /* a[i+49] += m[49] * mu */
  52400. "ldr r7, [%[m], #196]\n\t"
  52401. "ldr r10, [%[a], #196]\n\t"
  52402. "lsr r11, r7, #16\n\t"
  52403. "lsr r6, r8, #16\n\t"
  52404. "mul r4, r6, r11\n\t"
  52405. "lsl r11, r7, #16\n\t"
  52406. "lsr r11, r11, #16\n\t"
  52407. "mul r6, r11, r6\n\t"
  52408. "lsr r11, r6, #16\n\t"
  52409. "lsl r6, r6, #16\n\t"
  52410. "adds r10, r10, r6\n\t"
  52411. "adc r4, r4, r11\n\t"
  52412. "lsl r6, r8, #16\n\t"
  52413. "lsl r11, r7, #16\n\t"
  52414. "lsr r6, r6, #16\n\t"
  52415. "lsr r11, r11, #16\n\t"
  52416. "mul r11, r6, r11\n\t"
  52417. "adds r10, r10, r11\n\t"
  52418. "adc r4, r4, #0\n\t"
  52419. "lsr r11, r7, #16\n\t"
  52420. "mul r6, r11, r6\n\t"
  52421. "lsr r11, r6, #16\n\t"
  52422. "lsl r6, r6, #16\n\t"
  52423. "adds r10, r10, r6\n\t"
  52424. "adc r4, r4, r11\n\t"
  52425. "adds r10, r10, r5\n\t"
  52426. "str r10, [%[a], #196]\n\t"
  52427. "adc r4, r4, #0\n\t"
  52428. /* a[i+50] += m[50] * mu */
  52429. "ldr r7, [%[m], #200]\n\t"
  52430. "ldr r10, [%[a], #200]\n\t"
  52431. "lsr r11, r7, #16\n\t"
  52432. "lsr r6, r8, #16\n\t"
  52433. "mul r5, r6, r11\n\t"
  52434. "lsl r11, r7, #16\n\t"
  52435. "lsr r11, r11, #16\n\t"
  52436. "mul r6, r11, r6\n\t"
  52437. "lsr r11, r6, #16\n\t"
  52438. "lsl r6, r6, #16\n\t"
  52439. "adds r10, r10, r6\n\t"
  52440. "adc r5, r5, r11\n\t"
  52441. "lsl r6, r8, #16\n\t"
  52442. "lsl r11, r7, #16\n\t"
  52443. "lsr r6, r6, #16\n\t"
  52444. "lsr r11, r11, #16\n\t"
  52445. "mul r11, r6, r11\n\t"
  52446. "adds r10, r10, r11\n\t"
  52447. "adc r5, r5, #0\n\t"
  52448. "lsr r11, r7, #16\n\t"
  52449. "mul r6, r11, r6\n\t"
  52450. "lsr r11, r6, #16\n\t"
  52451. "lsl r6, r6, #16\n\t"
  52452. "adds r10, r10, r6\n\t"
  52453. "adc r5, r5, r11\n\t"
  52454. "adds r10, r10, r4\n\t"
  52455. "str r10, [%[a], #200]\n\t"
  52456. "adc r5, r5, #0\n\t"
  52457. /* a[i+51] += m[51] * mu */
  52458. "ldr r7, [%[m], #204]\n\t"
  52459. "ldr r10, [%[a], #204]\n\t"
  52460. "lsr r11, r7, #16\n\t"
  52461. "lsr r6, r8, #16\n\t"
  52462. "mul r4, r6, r11\n\t"
  52463. "lsl r11, r7, #16\n\t"
  52464. "lsr r11, r11, #16\n\t"
  52465. "mul r6, r11, r6\n\t"
  52466. "lsr r11, r6, #16\n\t"
  52467. "lsl r6, r6, #16\n\t"
  52468. "adds r10, r10, r6\n\t"
  52469. "adc r4, r4, r11\n\t"
  52470. "lsl r6, r8, #16\n\t"
  52471. "lsl r11, r7, #16\n\t"
  52472. "lsr r6, r6, #16\n\t"
  52473. "lsr r11, r11, #16\n\t"
  52474. "mul r11, r6, r11\n\t"
  52475. "adds r10, r10, r11\n\t"
  52476. "adc r4, r4, #0\n\t"
  52477. "lsr r11, r7, #16\n\t"
  52478. "mul r6, r11, r6\n\t"
  52479. "lsr r11, r6, #16\n\t"
  52480. "lsl r6, r6, #16\n\t"
  52481. "adds r10, r10, r6\n\t"
  52482. "adc r4, r4, r11\n\t"
  52483. "adds r10, r10, r5\n\t"
  52484. "str r10, [%[a], #204]\n\t"
  52485. "adc r4, r4, #0\n\t"
  52486. /* a[i+52] += m[52] * mu */
  52487. "ldr r7, [%[m], #208]\n\t"
  52488. "ldr r10, [%[a], #208]\n\t"
  52489. "lsr r11, r7, #16\n\t"
  52490. "lsr r6, r8, #16\n\t"
  52491. "mul r5, r6, r11\n\t"
  52492. "lsl r11, r7, #16\n\t"
  52493. "lsr r11, r11, #16\n\t"
  52494. "mul r6, r11, r6\n\t"
  52495. "lsr r11, r6, #16\n\t"
  52496. "lsl r6, r6, #16\n\t"
  52497. "adds r10, r10, r6\n\t"
  52498. "adc r5, r5, r11\n\t"
  52499. "lsl r6, r8, #16\n\t"
  52500. "lsl r11, r7, #16\n\t"
  52501. "lsr r6, r6, #16\n\t"
  52502. "lsr r11, r11, #16\n\t"
  52503. "mul r11, r6, r11\n\t"
  52504. "adds r10, r10, r11\n\t"
  52505. "adc r5, r5, #0\n\t"
  52506. "lsr r11, r7, #16\n\t"
  52507. "mul r6, r11, r6\n\t"
  52508. "lsr r11, r6, #16\n\t"
  52509. "lsl r6, r6, #16\n\t"
  52510. "adds r10, r10, r6\n\t"
  52511. "adc r5, r5, r11\n\t"
  52512. "adds r10, r10, r4\n\t"
  52513. "str r10, [%[a], #208]\n\t"
  52514. "adc r5, r5, #0\n\t"
  52515. /* a[i+53] += m[53] * mu */
  52516. "ldr r7, [%[m], #212]\n\t"
  52517. "ldr r10, [%[a], #212]\n\t"
  52518. "lsr r11, r7, #16\n\t"
  52519. "lsr r6, r8, #16\n\t"
  52520. "mul r4, r6, r11\n\t"
  52521. "lsl r11, r7, #16\n\t"
  52522. "lsr r11, r11, #16\n\t"
  52523. "mul r6, r11, r6\n\t"
  52524. "lsr r11, r6, #16\n\t"
  52525. "lsl r6, r6, #16\n\t"
  52526. "adds r10, r10, r6\n\t"
  52527. "adc r4, r4, r11\n\t"
  52528. "lsl r6, r8, #16\n\t"
  52529. "lsl r11, r7, #16\n\t"
  52530. "lsr r6, r6, #16\n\t"
  52531. "lsr r11, r11, #16\n\t"
  52532. "mul r11, r6, r11\n\t"
  52533. "adds r10, r10, r11\n\t"
  52534. "adc r4, r4, #0\n\t"
  52535. "lsr r11, r7, #16\n\t"
  52536. "mul r6, r11, r6\n\t"
  52537. "lsr r11, r6, #16\n\t"
  52538. "lsl r6, r6, #16\n\t"
  52539. "adds r10, r10, r6\n\t"
  52540. "adc r4, r4, r11\n\t"
  52541. "adds r10, r10, r5\n\t"
  52542. "str r10, [%[a], #212]\n\t"
  52543. "adc r4, r4, #0\n\t"
  52544. /* a[i+54] += m[54] * mu */
  52545. "ldr r7, [%[m], #216]\n\t"
  52546. "ldr r10, [%[a], #216]\n\t"
  52547. "lsr r11, r7, #16\n\t"
  52548. "lsr r6, r8, #16\n\t"
  52549. "mul r5, r6, r11\n\t"
  52550. "lsl r11, r7, #16\n\t"
  52551. "lsr r11, r11, #16\n\t"
  52552. "mul r6, r11, r6\n\t"
  52553. "lsr r11, r6, #16\n\t"
  52554. "lsl r6, r6, #16\n\t"
  52555. "adds r10, r10, r6\n\t"
  52556. "adc r5, r5, r11\n\t"
  52557. "lsl r6, r8, #16\n\t"
  52558. "lsl r11, r7, #16\n\t"
  52559. "lsr r6, r6, #16\n\t"
  52560. "lsr r11, r11, #16\n\t"
  52561. "mul r11, r6, r11\n\t"
  52562. "adds r10, r10, r11\n\t"
  52563. "adc r5, r5, #0\n\t"
  52564. "lsr r11, r7, #16\n\t"
  52565. "mul r6, r11, r6\n\t"
  52566. "lsr r11, r6, #16\n\t"
  52567. "lsl r6, r6, #16\n\t"
  52568. "adds r10, r10, r6\n\t"
  52569. "adc r5, r5, r11\n\t"
  52570. "adds r10, r10, r4\n\t"
  52571. "str r10, [%[a], #216]\n\t"
  52572. "adc r5, r5, #0\n\t"
  52573. /* a[i+55] += m[55] * mu */
  52574. "ldr r7, [%[m], #220]\n\t"
  52575. "ldr r10, [%[a], #220]\n\t"
  52576. "lsr r11, r7, #16\n\t"
  52577. "lsr r6, r8, #16\n\t"
  52578. "mul r4, r6, r11\n\t"
  52579. "lsl r11, r7, #16\n\t"
  52580. "lsr r11, r11, #16\n\t"
  52581. "mul r6, r11, r6\n\t"
  52582. "lsr r11, r6, #16\n\t"
  52583. "lsl r6, r6, #16\n\t"
  52584. "adds r10, r10, r6\n\t"
  52585. "adc r4, r4, r11\n\t"
  52586. "lsl r6, r8, #16\n\t"
  52587. "lsl r11, r7, #16\n\t"
  52588. "lsr r6, r6, #16\n\t"
  52589. "lsr r11, r11, #16\n\t"
  52590. "mul r11, r6, r11\n\t"
  52591. "adds r10, r10, r11\n\t"
  52592. "adc r4, r4, #0\n\t"
  52593. "lsr r11, r7, #16\n\t"
  52594. "mul r6, r11, r6\n\t"
  52595. "lsr r11, r6, #16\n\t"
  52596. "lsl r6, r6, #16\n\t"
  52597. "adds r10, r10, r6\n\t"
  52598. "adc r4, r4, r11\n\t"
  52599. "adds r10, r10, r5\n\t"
  52600. "str r10, [%[a], #220]\n\t"
  52601. "adc r4, r4, #0\n\t"
  52602. /* a[i+56] += m[56] * mu */
  52603. "ldr r7, [%[m], #224]\n\t"
  52604. "ldr r10, [%[a], #224]\n\t"
  52605. "lsr r11, r7, #16\n\t"
  52606. "lsr r6, r8, #16\n\t"
  52607. "mul r5, r6, r11\n\t"
  52608. "lsl r11, r7, #16\n\t"
  52609. "lsr r11, r11, #16\n\t"
  52610. "mul r6, r11, r6\n\t"
  52611. "lsr r11, r6, #16\n\t"
  52612. "lsl r6, r6, #16\n\t"
  52613. "adds r10, r10, r6\n\t"
  52614. "adc r5, r5, r11\n\t"
  52615. "lsl r6, r8, #16\n\t"
  52616. "lsl r11, r7, #16\n\t"
  52617. "lsr r6, r6, #16\n\t"
  52618. "lsr r11, r11, #16\n\t"
  52619. "mul r11, r6, r11\n\t"
  52620. "adds r10, r10, r11\n\t"
  52621. "adc r5, r5, #0\n\t"
  52622. "lsr r11, r7, #16\n\t"
  52623. "mul r6, r11, r6\n\t"
  52624. "lsr r11, r6, #16\n\t"
  52625. "lsl r6, r6, #16\n\t"
  52626. "adds r10, r10, r6\n\t"
  52627. "adc r5, r5, r11\n\t"
  52628. "adds r10, r10, r4\n\t"
  52629. "str r10, [%[a], #224]\n\t"
  52630. "adc r5, r5, #0\n\t"
  52631. /* a[i+57] += m[57] * mu */
  52632. "ldr r7, [%[m], #228]\n\t"
  52633. "ldr r10, [%[a], #228]\n\t"
  52634. "lsr r11, r7, #16\n\t"
  52635. "lsr r6, r8, #16\n\t"
  52636. "mul r4, r6, r11\n\t"
  52637. "lsl r11, r7, #16\n\t"
  52638. "lsr r11, r11, #16\n\t"
  52639. "mul r6, r11, r6\n\t"
  52640. "lsr r11, r6, #16\n\t"
  52641. "lsl r6, r6, #16\n\t"
  52642. "adds r10, r10, r6\n\t"
  52643. "adc r4, r4, r11\n\t"
  52644. "lsl r6, r8, #16\n\t"
  52645. "lsl r11, r7, #16\n\t"
  52646. "lsr r6, r6, #16\n\t"
  52647. "lsr r11, r11, #16\n\t"
  52648. "mul r11, r6, r11\n\t"
  52649. "adds r10, r10, r11\n\t"
  52650. "adc r4, r4, #0\n\t"
  52651. "lsr r11, r7, #16\n\t"
  52652. "mul r6, r11, r6\n\t"
  52653. "lsr r11, r6, #16\n\t"
  52654. "lsl r6, r6, #16\n\t"
  52655. "adds r10, r10, r6\n\t"
  52656. "adc r4, r4, r11\n\t"
  52657. "adds r10, r10, r5\n\t"
  52658. "str r10, [%[a], #228]\n\t"
  52659. "adc r4, r4, #0\n\t"
  52660. /* a[i+58] += m[58] * mu */
  52661. "ldr r7, [%[m], #232]\n\t"
  52662. "ldr r10, [%[a], #232]\n\t"
  52663. "lsr r11, r7, #16\n\t"
  52664. "lsr r6, r8, #16\n\t"
  52665. "mul r5, r6, r11\n\t"
  52666. "lsl r11, r7, #16\n\t"
  52667. "lsr r11, r11, #16\n\t"
  52668. "mul r6, r11, r6\n\t"
  52669. "lsr r11, r6, #16\n\t"
  52670. "lsl r6, r6, #16\n\t"
  52671. "adds r10, r10, r6\n\t"
  52672. "adc r5, r5, r11\n\t"
  52673. "lsl r6, r8, #16\n\t"
  52674. "lsl r11, r7, #16\n\t"
  52675. "lsr r6, r6, #16\n\t"
  52676. "lsr r11, r11, #16\n\t"
  52677. "mul r11, r6, r11\n\t"
  52678. "adds r10, r10, r11\n\t"
  52679. "adc r5, r5, #0\n\t"
  52680. "lsr r11, r7, #16\n\t"
  52681. "mul r6, r11, r6\n\t"
  52682. "lsr r11, r6, #16\n\t"
  52683. "lsl r6, r6, #16\n\t"
  52684. "adds r10, r10, r6\n\t"
  52685. "adc r5, r5, r11\n\t"
  52686. "adds r10, r10, r4\n\t"
  52687. "str r10, [%[a], #232]\n\t"
  52688. "adc r5, r5, #0\n\t"
  52689. /* a[i+59] += m[59] * mu */
  52690. "ldr r7, [%[m], #236]\n\t"
  52691. "ldr r10, [%[a], #236]\n\t"
  52692. "lsr r11, r7, #16\n\t"
  52693. "lsr r6, r8, #16\n\t"
  52694. "mul r4, r6, r11\n\t"
  52695. "lsl r11, r7, #16\n\t"
  52696. "lsr r11, r11, #16\n\t"
  52697. "mul r6, r11, r6\n\t"
  52698. "lsr r11, r6, #16\n\t"
  52699. "lsl r6, r6, #16\n\t"
  52700. "adds r10, r10, r6\n\t"
  52701. "adc r4, r4, r11\n\t"
  52702. "lsl r6, r8, #16\n\t"
  52703. "lsl r11, r7, #16\n\t"
  52704. "lsr r6, r6, #16\n\t"
  52705. "lsr r11, r11, #16\n\t"
  52706. "mul r11, r6, r11\n\t"
  52707. "adds r10, r10, r11\n\t"
  52708. "adc r4, r4, #0\n\t"
  52709. "lsr r11, r7, #16\n\t"
  52710. "mul r6, r11, r6\n\t"
  52711. "lsr r11, r6, #16\n\t"
  52712. "lsl r6, r6, #16\n\t"
  52713. "adds r10, r10, r6\n\t"
  52714. "adc r4, r4, r11\n\t"
  52715. "adds r10, r10, r5\n\t"
  52716. "str r10, [%[a], #236]\n\t"
  52717. "adc r4, r4, #0\n\t"
  52718. /* a[i+60] += m[60] * mu */
  52719. "ldr r7, [%[m], #240]\n\t"
  52720. "ldr r10, [%[a], #240]\n\t"
  52721. "lsr r11, r7, #16\n\t"
  52722. "lsr r6, r8, #16\n\t"
  52723. "mul r5, r6, r11\n\t"
  52724. "lsl r11, r7, #16\n\t"
  52725. "lsr r11, r11, #16\n\t"
  52726. "mul r6, r11, r6\n\t"
  52727. "lsr r11, r6, #16\n\t"
  52728. "lsl r6, r6, #16\n\t"
  52729. "adds r10, r10, r6\n\t"
  52730. "adc r5, r5, r11\n\t"
  52731. "lsl r6, r8, #16\n\t"
  52732. "lsl r11, r7, #16\n\t"
  52733. "lsr r6, r6, #16\n\t"
  52734. "lsr r11, r11, #16\n\t"
  52735. "mul r11, r6, r11\n\t"
  52736. "adds r10, r10, r11\n\t"
  52737. "adc r5, r5, #0\n\t"
  52738. "lsr r11, r7, #16\n\t"
  52739. "mul r6, r11, r6\n\t"
  52740. "lsr r11, r6, #16\n\t"
  52741. "lsl r6, r6, #16\n\t"
  52742. "adds r10, r10, r6\n\t"
  52743. "adc r5, r5, r11\n\t"
  52744. "adds r10, r10, r4\n\t"
  52745. "str r10, [%[a], #240]\n\t"
  52746. "adc r5, r5, #0\n\t"
  52747. /* a[i+61] += m[61] * mu */
  52748. "ldr r7, [%[m], #244]\n\t"
  52749. "ldr r10, [%[a], #244]\n\t"
  52750. "lsr r11, r7, #16\n\t"
  52751. "lsr r6, r8, #16\n\t"
  52752. "mul r4, r6, r11\n\t"
  52753. "lsl r11, r7, #16\n\t"
  52754. "lsr r11, r11, #16\n\t"
  52755. "mul r6, r11, r6\n\t"
  52756. "lsr r11, r6, #16\n\t"
  52757. "lsl r6, r6, #16\n\t"
  52758. "adds r10, r10, r6\n\t"
  52759. "adc r4, r4, r11\n\t"
  52760. "lsl r6, r8, #16\n\t"
  52761. "lsl r11, r7, #16\n\t"
  52762. "lsr r6, r6, #16\n\t"
  52763. "lsr r11, r11, #16\n\t"
  52764. "mul r11, r6, r11\n\t"
  52765. "adds r10, r10, r11\n\t"
  52766. "adc r4, r4, #0\n\t"
  52767. "lsr r11, r7, #16\n\t"
  52768. "mul r6, r11, r6\n\t"
  52769. "lsr r11, r6, #16\n\t"
  52770. "lsl r6, r6, #16\n\t"
  52771. "adds r10, r10, r6\n\t"
  52772. "adc r4, r4, r11\n\t"
  52773. "adds r10, r10, r5\n\t"
  52774. "str r10, [%[a], #244]\n\t"
  52775. "adc r4, r4, #0\n\t"
  52776. /* a[i+62] += m[62] * mu */
  52777. "ldr r7, [%[m], #248]\n\t"
  52778. "ldr r10, [%[a], #248]\n\t"
  52779. "lsr r11, r7, #16\n\t"
  52780. "lsr r6, r8, #16\n\t"
  52781. "mul r5, r6, r11\n\t"
  52782. "lsl r11, r7, #16\n\t"
  52783. "lsr r11, r11, #16\n\t"
  52784. "mul r6, r11, r6\n\t"
  52785. "lsr r11, r6, #16\n\t"
  52786. "lsl r6, r6, #16\n\t"
  52787. "adds r10, r10, r6\n\t"
  52788. "adc r5, r5, r11\n\t"
  52789. "lsl r6, r8, #16\n\t"
  52790. "lsl r11, r7, #16\n\t"
  52791. "lsr r6, r6, #16\n\t"
  52792. "lsr r11, r11, #16\n\t"
  52793. "mul r11, r6, r11\n\t"
  52794. "adds r10, r10, r11\n\t"
  52795. "adc r5, r5, #0\n\t"
  52796. "lsr r11, r7, #16\n\t"
  52797. "mul r6, r11, r6\n\t"
  52798. "lsr r11, r6, #16\n\t"
  52799. "lsl r6, r6, #16\n\t"
  52800. "adds r10, r10, r6\n\t"
  52801. "adc r5, r5, r11\n\t"
  52802. "adds r10, r10, r4\n\t"
  52803. "str r10, [%[a], #248]\n\t"
  52804. "adc r5, r5, #0\n\t"
  52805. /* a[i+63] += m[63] * mu */
  52806. "ldr r7, [%[m], #252]\n\t"
  52807. "ldr r10, [%[a], #252]\n\t"
  52808. "lsr r11, r7, #16\n\t"
  52809. "lsr r6, r8, #16\n\t"
  52810. "mul r4, r6, r11\n\t"
  52811. "lsl r11, r7, #16\n\t"
  52812. "lsr r11, r11, #16\n\t"
  52813. "mul r6, r11, r6\n\t"
  52814. "lsr r11, r6, #16\n\t"
  52815. "lsl r6, r6, #16\n\t"
  52816. "adds r10, r10, r6\n\t"
  52817. "adc r4, r4, r11\n\t"
  52818. "lsl r6, r8, #16\n\t"
  52819. "lsl r11, r7, #16\n\t"
  52820. "lsr r6, r6, #16\n\t"
  52821. "lsr r11, r11, #16\n\t"
  52822. "mul r11, r6, r11\n\t"
  52823. "adds r10, r10, r11\n\t"
  52824. "adc r4, r4, #0\n\t"
  52825. "lsr r11, r7, #16\n\t"
  52826. "mul r6, r11, r6\n\t"
  52827. "lsr r11, r6, #16\n\t"
  52828. "lsl r6, r6, #16\n\t"
  52829. "adds r10, r10, r6\n\t"
  52830. "adc r4, r4, r11\n\t"
  52831. "adds r10, r10, r5\n\t"
  52832. "str r10, [%[a], #252]\n\t"
  52833. "adc r4, r4, #0\n\t"
  52834. /* a[i+64] += m[64] * mu */
  52835. "ldr r7, [%[m], #256]\n\t"
  52836. "ldr r10, [%[a], #256]\n\t"
  52837. "lsr r11, r7, #16\n\t"
  52838. "lsr r6, r8, #16\n\t"
  52839. "mul r5, r6, r11\n\t"
  52840. "lsl r11, r7, #16\n\t"
  52841. "lsr r11, r11, #16\n\t"
  52842. "mul r6, r11, r6\n\t"
  52843. "lsr r11, r6, #16\n\t"
  52844. "lsl r6, r6, #16\n\t"
  52845. "adds r10, r10, r6\n\t"
  52846. "adc r5, r5, r11\n\t"
  52847. "lsl r6, r8, #16\n\t"
  52848. "lsl r11, r7, #16\n\t"
  52849. "lsr r6, r6, #16\n\t"
  52850. "lsr r11, r11, #16\n\t"
  52851. "mul r11, r6, r11\n\t"
  52852. "adds r10, r10, r11\n\t"
  52853. "adc r5, r5, #0\n\t"
  52854. "lsr r11, r7, #16\n\t"
  52855. "mul r6, r11, r6\n\t"
  52856. "lsr r11, r6, #16\n\t"
  52857. "lsl r6, r6, #16\n\t"
  52858. "adds r10, r10, r6\n\t"
  52859. "adc r5, r5, r11\n\t"
  52860. "adds r10, r10, r4\n\t"
  52861. "str r10, [%[a], #256]\n\t"
  52862. "adc r5, r5, #0\n\t"
  52863. /* a[i+65] += m[65] * mu */
  52864. "ldr r7, [%[m], #260]\n\t"
  52865. "ldr r10, [%[a], #260]\n\t"
  52866. "lsr r11, r7, #16\n\t"
  52867. "lsr r6, r8, #16\n\t"
  52868. "mul r4, r6, r11\n\t"
  52869. "lsl r11, r7, #16\n\t"
  52870. "lsr r11, r11, #16\n\t"
  52871. "mul r6, r11, r6\n\t"
  52872. "lsr r11, r6, #16\n\t"
  52873. "lsl r6, r6, #16\n\t"
  52874. "adds r10, r10, r6\n\t"
  52875. "adc r4, r4, r11\n\t"
  52876. "lsl r6, r8, #16\n\t"
  52877. "lsl r11, r7, #16\n\t"
  52878. "lsr r6, r6, #16\n\t"
  52879. "lsr r11, r11, #16\n\t"
  52880. "mul r11, r6, r11\n\t"
  52881. "adds r10, r10, r11\n\t"
  52882. "adc r4, r4, #0\n\t"
  52883. "lsr r11, r7, #16\n\t"
  52884. "mul r6, r11, r6\n\t"
  52885. "lsr r11, r6, #16\n\t"
  52886. "lsl r6, r6, #16\n\t"
  52887. "adds r10, r10, r6\n\t"
  52888. "adc r4, r4, r11\n\t"
  52889. "adds r10, r10, r5\n\t"
  52890. "str r10, [%[a], #260]\n\t"
  52891. "adc r4, r4, #0\n\t"
  52892. /* a[i+66] += m[66] * mu */
  52893. "ldr r7, [%[m], #264]\n\t"
  52894. "ldr r10, [%[a], #264]\n\t"
  52895. "lsr r11, r7, #16\n\t"
  52896. "lsr r6, r8, #16\n\t"
  52897. "mul r5, r6, r11\n\t"
  52898. "lsl r11, r7, #16\n\t"
  52899. "lsr r11, r11, #16\n\t"
  52900. "mul r6, r11, r6\n\t"
  52901. "lsr r11, r6, #16\n\t"
  52902. "lsl r6, r6, #16\n\t"
  52903. "adds r10, r10, r6\n\t"
  52904. "adc r5, r5, r11\n\t"
  52905. "lsl r6, r8, #16\n\t"
  52906. "lsl r11, r7, #16\n\t"
  52907. "lsr r6, r6, #16\n\t"
  52908. "lsr r11, r11, #16\n\t"
  52909. "mul r11, r6, r11\n\t"
  52910. "adds r10, r10, r11\n\t"
  52911. "adc r5, r5, #0\n\t"
  52912. "lsr r11, r7, #16\n\t"
  52913. "mul r6, r11, r6\n\t"
  52914. "lsr r11, r6, #16\n\t"
  52915. "lsl r6, r6, #16\n\t"
  52916. "adds r10, r10, r6\n\t"
  52917. "adc r5, r5, r11\n\t"
  52918. "adds r10, r10, r4\n\t"
  52919. "str r10, [%[a], #264]\n\t"
  52920. "adc r5, r5, #0\n\t"
  52921. /* a[i+67] += m[67] * mu */
  52922. "ldr r7, [%[m], #268]\n\t"
  52923. "ldr r10, [%[a], #268]\n\t"
  52924. "lsr r11, r7, #16\n\t"
  52925. "lsr r6, r8, #16\n\t"
  52926. "mul r4, r6, r11\n\t"
  52927. "lsl r11, r7, #16\n\t"
  52928. "lsr r11, r11, #16\n\t"
  52929. "mul r6, r11, r6\n\t"
  52930. "lsr r11, r6, #16\n\t"
  52931. "lsl r6, r6, #16\n\t"
  52932. "adds r10, r10, r6\n\t"
  52933. "adc r4, r4, r11\n\t"
  52934. "lsl r6, r8, #16\n\t"
  52935. "lsl r11, r7, #16\n\t"
  52936. "lsr r6, r6, #16\n\t"
  52937. "lsr r11, r11, #16\n\t"
  52938. "mul r11, r6, r11\n\t"
  52939. "adds r10, r10, r11\n\t"
  52940. "adc r4, r4, #0\n\t"
  52941. "lsr r11, r7, #16\n\t"
  52942. "mul r6, r11, r6\n\t"
  52943. "lsr r11, r6, #16\n\t"
  52944. "lsl r6, r6, #16\n\t"
  52945. "adds r10, r10, r6\n\t"
  52946. "adc r4, r4, r11\n\t"
  52947. "adds r10, r10, r5\n\t"
  52948. "str r10, [%[a], #268]\n\t"
  52949. "adc r4, r4, #0\n\t"
  52950. /* a[i+68] += m[68] * mu */
  52951. "ldr r7, [%[m], #272]\n\t"
  52952. "ldr r10, [%[a], #272]\n\t"
  52953. "lsr r11, r7, #16\n\t"
  52954. "lsr r6, r8, #16\n\t"
  52955. "mul r5, r6, r11\n\t"
  52956. "lsl r11, r7, #16\n\t"
  52957. "lsr r11, r11, #16\n\t"
  52958. "mul r6, r11, r6\n\t"
  52959. "lsr r11, r6, #16\n\t"
  52960. "lsl r6, r6, #16\n\t"
  52961. "adds r10, r10, r6\n\t"
  52962. "adc r5, r5, r11\n\t"
  52963. "lsl r6, r8, #16\n\t"
  52964. "lsl r11, r7, #16\n\t"
  52965. "lsr r6, r6, #16\n\t"
  52966. "lsr r11, r11, #16\n\t"
  52967. "mul r11, r6, r11\n\t"
  52968. "adds r10, r10, r11\n\t"
  52969. "adc r5, r5, #0\n\t"
  52970. "lsr r11, r7, #16\n\t"
  52971. "mul r6, r11, r6\n\t"
  52972. "lsr r11, r6, #16\n\t"
  52973. "lsl r6, r6, #16\n\t"
  52974. "adds r10, r10, r6\n\t"
  52975. "adc r5, r5, r11\n\t"
  52976. "adds r10, r10, r4\n\t"
  52977. "str r10, [%[a], #272]\n\t"
  52978. "adc r5, r5, #0\n\t"
  52979. /* a[i+69] += m[69] * mu */
  52980. "ldr r7, [%[m], #276]\n\t"
  52981. "ldr r10, [%[a], #276]\n\t"
  52982. "lsr r11, r7, #16\n\t"
  52983. "lsr r6, r8, #16\n\t"
  52984. "mul r4, r6, r11\n\t"
  52985. "lsl r11, r7, #16\n\t"
  52986. "lsr r11, r11, #16\n\t"
  52987. "mul r6, r11, r6\n\t"
  52988. "lsr r11, r6, #16\n\t"
  52989. "lsl r6, r6, #16\n\t"
  52990. "adds r10, r10, r6\n\t"
  52991. "adc r4, r4, r11\n\t"
  52992. "lsl r6, r8, #16\n\t"
  52993. "lsl r11, r7, #16\n\t"
  52994. "lsr r6, r6, #16\n\t"
  52995. "lsr r11, r11, #16\n\t"
  52996. "mul r11, r6, r11\n\t"
  52997. "adds r10, r10, r11\n\t"
  52998. "adc r4, r4, #0\n\t"
  52999. "lsr r11, r7, #16\n\t"
  53000. "mul r6, r11, r6\n\t"
  53001. "lsr r11, r6, #16\n\t"
  53002. "lsl r6, r6, #16\n\t"
  53003. "adds r10, r10, r6\n\t"
  53004. "adc r4, r4, r11\n\t"
  53005. "adds r10, r10, r5\n\t"
  53006. "str r10, [%[a], #276]\n\t"
  53007. "adc r4, r4, #0\n\t"
  53008. /* a[i+70] += m[70] * mu */
  53009. "ldr r7, [%[m], #280]\n\t"
  53010. "ldr r10, [%[a], #280]\n\t"
  53011. "lsr r11, r7, #16\n\t"
  53012. "lsr r6, r8, #16\n\t"
  53013. "mul r5, r6, r11\n\t"
  53014. "lsl r11, r7, #16\n\t"
  53015. "lsr r11, r11, #16\n\t"
  53016. "mul r6, r11, r6\n\t"
  53017. "lsr r11, r6, #16\n\t"
  53018. "lsl r6, r6, #16\n\t"
  53019. "adds r10, r10, r6\n\t"
  53020. "adc r5, r5, r11\n\t"
  53021. "lsl r6, r8, #16\n\t"
  53022. "lsl r11, r7, #16\n\t"
  53023. "lsr r6, r6, #16\n\t"
  53024. "lsr r11, r11, #16\n\t"
  53025. "mul r11, r6, r11\n\t"
  53026. "adds r10, r10, r11\n\t"
  53027. "adc r5, r5, #0\n\t"
  53028. "lsr r11, r7, #16\n\t"
  53029. "mul r6, r11, r6\n\t"
  53030. "lsr r11, r6, #16\n\t"
  53031. "lsl r6, r6, #16\n\t"
  53032. "adds r10, r10, r6\n\t"
  53033. "adc r5, r5, r11\n\t"
  53034. "adds r10, r10, r4\n\t"
  53035. "str r10, [%[a], #280]\n\t"
  53036. "adc r5, r5, #0\n\t"
  53037. /* a[i+71] += m[71] * mu */
  53038. "ldr r7, [%[m], #284]\n\t"
  53039. "ldr r10, [%[a], #284]\n\t"
  53040. "lsr r11, r7, #16\n\t"
  53041. "lsr r6, r8, #16\n\t"
  53042. "mul r4, r6, r11\n\t"
  53043. "lsl r11, r7, #16\n\t"
  53044. "lsr r11, r11, #16\n\t"
  53045. "mul r6, r11, r6\n\t"
  53046. "lsr r11, r6, #16\n\t"
  53047. "lsl r6, r6, #16\n\t"
  53048. "adds r10, r10, r6\n\t"
  53049. "adc r4, r4, r11\n\t"
  53050. "lsl r6, r8, #16\n\t"
  53051. "lsl r11, r7, #16\n\t"
  53052. "lsr r6, r6, #16\n\t"
  53053. "lsr r11, r11, #16\n\t"
  53054. "mul r11, r6, r11\n\t"
  53055. "adds r10, r10, r11\n\t"
  53056. "adc r4, r4, #0\n\t"
  53057. "lsr r11, r7, #16\n\t"
  53058. "mul r6, r11, r6\n\t"
  53059. "lsr r11, r6, #16\n\t"
  53060. "lsl r6, r6, #16\n\t"
  53061. "adds r10, r10, r6\n\t"
  53062. "adc r4, r4, r11\n\t"
  53063. "adds r10, r10, r5\n\t"
  53064. "str r10, [%[a], #284]\n\t"
  53065. "adc r4, r4, #0\n\t"
  53066. /* a[i+72] += m[72] * mu */
  53067. "ldr r7, [%[m], #288]\n\t"
  53068. "ldr r10, [%[a], #288]\n\t"
  53069. "lsr r11, r7, #16\n\t"
  53070. "lsr r6, r8, #16\n\t"
  53071. "mul r5, r6, r11\n\t"
  53072. "lsl r11, r7, #16\n\t"
  53073. "lsr r11, r11, #16\n\t"
  53074. "mul r6, r11, r6\n\t"
  53075. "lsr r11, r6, #16\n\t"
  53076. "lsl r6, r6, #16\n\t"
  53077. "adds r10, r10, r6\n\t"
  53078. "adc r5, r5, r11\n\t"
  53079. "lsl r6, r8, #16\n\t"
  53080. "lsl r11, r7, #16\n\t"
  53081. "lsr r6, r6, #16\n\t"
  53082. "lsr r11, r11, #16\n\t"
  53083. "mul r11, r6, r11\n\t"
  53084. "adds r10, r10, r11\n\t"
  53085. "adc r5, r5, #0\n\t"
  53086. "lsr r11, r7, #16\n\t"
  53087. "mul r6, r11, r6\n\t"
  53088. "lsr r11, r6, #16\n\t"
  53089. "lsl r6, r6, #16\n\t"
  53090. "adds r10, r10, r6\n\t"
  53091. "adc r5, r5, r11\n\t"
  53092. "adds r10, r10, r4\n\t"
  53093. "str r10, [%[a], #288]\n\t"
  53094. "adc r5, r5, #0\n\t"
  53095. /* a[i+73] += m[73] * mu */
  53096. "ldr r7, [%[m], #292]\n\t"
  53097. "ldr r10, [%[a], #292]\n\t"
  53098. "lsr r11, r7, #16\n\t"
  53099. "lsr r6, r8, #16\n\t"
  53100. "mul r4, r6, r11\n\t"
  53101. "lsl r11, r7, #16\n\t"
  53102. "lsr r11, r11, #16\n\t"
  53103. "mul r6, r11, r6\n\t"
  53104. "lsr r11, r6, #16\n\t"
  53105. "lsl r6, r6, #16\n\t"
  53106. "adds r10, r10, r6\n\t"
  53107. "adc r4, r4, r11\n\t"
  53108. "lsl r6, r8, #16\n\t"
  53109. "lsl r11, r7, #16\n\t"
  53110. "lsr r6, r6, #16\n\t"
  53111. "lsr r11, r11, #16\n\t"
  53112. "mul r11, r6, r11\n\t"
  53113. "adds r10, r10, r11\n\t"
  53114. "adc r4, r4, #0\n\t"
  53115. "lsr r11, r7, #16\n\t"
  53116. "mul r6, r11, r6\n\t"
  53117. "lsr r11, r6, #16\n\t"
  53118. "lsl r6, r6, #16\n\t"
  53119. "adds r10, r10, r6\n\t"
  53120. "adc r4, r4, r11\n\t"
  53121. "adds r10, r10, r5\n\t"
  53122. "str r10, [%[a], #292]\n\t"
  53123. "adc r4, r4, #0\n\t"
  53124. /* a[i+74] += m[74] * mu */
  53125. "ldr r7, [%[m], #296]\n\t"
  53126. "ldr r10, [%[a], #296]\n\t"
  53127. "lsr r11, r7, #16\n\t"
  53128. "lsr r6, r8, #16\n\t"
  53129. "mul r5, r6, r11\n\t"
  53130. "lsl r11, r7, #16\n\t"
  53131. "lsr r11, r11, #16\n\t"
  53132. "mul r6, r11, r6\n\t"
  53133. "lsr r11, r6, #16\n\t"
  53134. "lsl r6, r6, #16\n\t"
  53135. "adds r10, r10, r6\n\t"
  53136. "adc r5, r5, r11\n\t"
  53137. "lsl r6, r8, #16\n\t"
  53138. "lsl r11, r7, #16\n\t"
  53139. "lsr r6, r6, #16\n\t"
  53140. "lsr r11, r11, #16\n\t"
  53141. "mul r11, r6, r11\n\t"
  53142. "adds r10, r10, r11\n\t"
  53143. "adc r5, r5, #0\n\t"
  53144. "lsr r11, r7, #16\n\t"
  53145. "mul r6, r11, r6\n\t"
  53146. "lsr r11, r6, #16\n\t"
  53147. "lsl r6, r6, #16\n\t"
  53148. "adds r10, r10, r6\n\t"
  53149. "adc r5, r5, r11\n\t"
  53150. "adds r10, r10, r4\n\t"
  53151. "str r10, [%[a], #296]\n\t"
  53152. "adc r5, r5, #0\n\t"
  53153. /* a[i+75] += m[75] * mu */
  53154. "ldr r7, [%[m], #300]\n\t"
  53155. "ldr r10, [%[a], #300]\n\t"
  53156. "lsr r11, r7, #16\n\t"
  53157. "lsr r6, r8, #16\n\t"
  53158. "mul r4, r6, r11\n\t"
  53159. "lsl r11, r7, #16\n\t"
  53160. "lsr r11, r11, #16\n\t"
  53161. "mul r6, r11, r6\n\t"
  53162. "lsr r11, r6, #16\n\t"
  53163. "lsl r6, r6, #16\n\t"
  53164. "adds r10, r10, r6\n\t"
  53165. "adc r4, r4, r11\n\t"
  53166. "lsl r6, r8, #16\n\t"
  53167. "lsl r11, r7, #16\n\t"
  53168. "lsr r6, r6, #16\n\t"
  53169. "lsr r11, r11, #16\n\t"
  53170. "mul r11, r6, r11\n\t"
  53171. "adds r10, r10, r11\n\t"
  53172. "adc r4, r4, #0\n\t"
  53173. "lsr r11, r7, #16\n\t"
  53174. "mul r6, r11, r6\n\t"
  53175. "lsr r11, r6, #16\n\t"
  53176. "lsl r6, r6, #16\n\t"
  53177. "adds r10, r10, r6\n\t"
  53178. "adc r4, r4, r11\n\t"
  53179. "adds r10, r10, r5\n\t"
  53180. "str r10, [%[a], #300]\n\t"
  53181. "adc r4, r4, #0\n\t"
  53182. /* a[i+76] += m[76] * mu */
  53183. "ldr r7, [%[m], #304]\n\t"
  53184. "ldr r10, [%[a], #304]\n\t"
  53185. "lsr r11, r7, #16\n\t"
  53186. "lsr r6, r8, #16\n\t"
  53187. "mul r5, r6, r11\n\t"
  53188. "lsl r11, r7, #16\n\t"
  53189. "lsr r11, r11, #16\n\t"
  53190. "mul r6, r11, r6\n\t"
  53191. "lsr r11, r6, #16\n\t"
  53192. "lsl r6, r6, #16\n\t"
  53193. "adds r10, r10, r6\n\t"
  53194. "adc r5, r5, r11\n\t"
  53195. "lsl r6, r8, #16\n\t"
  53196. "lsl r11, r7, #16\n\t"
  53197. "lsr r6, r6, #16\n\t"
  53198. "lsr r11, r11, #16\n\t"
  53199. "mul r11, r6, r11\n\t"
  53200. "adds r10, r10, r11\n\t"
  53201. "adc r5, r5, #0\n\t"
  53202. "lsr r11, r7, #16\n\t"
  53203. "mul r6, r11, r6\n\t"
  53204. "lsr r11, r6, #16\n\t"
  53205. "lsl r6, r6, #16\n\t"
  53206. "adds r10, r10, r6\n\t"
  53207. "adc r5, r5, r11\n\t"
  53208. "adds r10, r10, r4\n\t"
  53209. "str r10, [%[a], #304]\n\t"
  53210. "adc r5, r5, #0\n\t"
  53211. /* a[i+77] += m[77] * mu */
  53212. "ldr r7, [%[m], #308]\n\t"
  53213. "ldr r10, [%[a], #308]\n\t"
  53214. "lsr r11, r7, #16\n\t"
  53215. "lsr r6, r8, #16\n\t"
  53216. "mul r4, r6, r11\n\t"
  53217. "lsl r11, r7, #16\n\t"
  53218. "lsr r11, r11, #16\n\t"
  53219. "mul r6, r11, r6\n\t"
  53220. "lsr r11, r6, #16\n\t"
  53221. "lsl r6, r6, #16\n\t"
  53222. "adds r10, r10, r6\n\t"
  53223. "adc r4, r4, r11\n\t"
  53224. "lsl r6, r8, #16\n\t"
  53225. "lsl r11, r7, #16\n\t"
  53226. "lsr r6, r6, #16\n\t"
  53227. "lsr r11, r11, #16\n\t"
  53228. "mul r11, r6, r11\n\t"
  53229. "adds r10, r10, r11\n\t"
  53230. "adc r4, r4, #0\n\t"
  53231. "lsr r11, r7, #16\n\t"
  53232. "mul r6, r11, r6\n\t"
  53233. "lsr r11, r6, #16\n\t"
  53234. "lsl r6, r6, #16\n\t"
  53235. "adds r10, r10, r6\n\t"
  53236. "adc r4, r4, r11\n\t"
  53237. "adds r10, r10, r5\n\t"
  53238. "str r10, [%[a], #308]\n\t"
  53239. "adc r4, r4, #0\n\t"
  53240. /* a[i+78] += m[78] * mu */
  53241. "ldr r7, [%[m], #312]\n\t"
  53242. "ldr r10, [%[a], #312]\n\t"
  53243. "lsr r11, r7, #16\n\t"
  53244. "lsr r6, r8, #16\n\t"
  53245. "mul r5, r6, r11\n\t"
  53246. "lsl r11, r7, #16\n\t"
  53247. "lsr r11, r11, #16\n\t"
  53248. "mul r6, r11, r6\n\t"
  53249. "lsr r11, r6, #16\n\t"
  53250. "lsl r6, r6, #16\n\t"
  53251. "adds r10, r10, r6\n\t"
  53252. "adc r5, r5, r11\n\t"
  53253. "lsl r6, r8, #16\n\t"
  53254. "lsl r11, r7, #16\n\t"
  53255. "lsr r6, r6, #16\n\t"
  53256. "lsr r11, r11, #16\n\t"
  53257. "mul r11, r6, r11\n\t"
  53258. "adds r10, r10, r11\n\t"
  53259. "adc r5, r5, #0\n\t"
  53260. "lsr r11, r7, #16\n\t"
  53261. "mul r6, r11, r6\n\t"
  53262. "lsr r11, r6, #16\n\t"
  53263. "lsl r6, r6, #16\n\t"
  53264. "adds r10, r10, r6\n\t"
  53265. "adc r5, r5, r11\n\t"
  53266. "adds r10, r10, r4\n\t"
  53267. "str r10, [%[a], #312]\n\t"
  53268. "adc r5, r5, #0\n\t"
  53269. /* a[i+79] += m[79] * mu */
  53270. "ldr r7, [%[m], #316]\n\t"
  53271. "ldr r10, [%[a], #316]\n\t"
  53272. "lsr r11, r7, #16\n\t"
  53273. "lsr r6, r8, #16\n\t"
  53274. "mul r4, r6, r11\n\t"
  53275. "lsl r11, r7, #16\n\t"
  53276. "lsr r11, r11, #16\n\t"
  53277. "mul r6, r11, r6\n\t"
  53278. "lsr r11, r6, #16\n\t"
  53279. "lsl r6, r6, #16\n\t"
  53280. "adds r10, r10, r6\n\t"
  53281. "adc r4, r4, r11\n\t"
  53282. "lsl r6, r8, #16\n\t"
  53283. "lsl r11, r7, #16\n\t"
  53284. "lsr r6, r6, #16\n\t"
  53285. "lsr r11, r11, #16\n\t"
  53286. "mul r11, r6, r11\n\t"
  53287. "adds r10, r10, r11\n\t"
  53288. "adc r4, r4, #0\n\t"
  53289. "lsr r11, r7, #16\n\t"
  53290. "mul r6, r11, r6\n\t"
  53291. "lsr r11, r6, #16\n\t"
  53292. "lsl r6, r6, #16\n\t"
  53293. "adds r10, r10, r6\n\t"
  53294. "adc r4, r4, r11\n\t"
  53295. "adds r10, r10, r5\n\t"
  53296. "str r10, [%[a], #316]\n\t"
  53297. "adc r4, r4, #0\n\t"
  53298. /* a[i+80] += m[80] * mu */
  53299. "ldr r7, [%[m], #320]\n\t"
  53300. "ldr r10, [%[a], #320]\n\t"
  53301. "lsr r11, r7, #16\n\t"
  53302. "lsr r6, r8, #16\n\t"
  53303. "mul r5, r6, r11\n\t"
  53304. "lsl r11, r7, #16\n\t"
  53305. "lsr r11, r11, #16\n\t"
  53306. "mul r6, r11, r6\n\t"
  53307. "lsr r11, r6, #16\n\t"
  53308. "lsl r6, r6, #16\n\t"
  53309. "adds r10, r10, r6\n\t"
  53310. "adc r5, r5, r11\n\t"
  53311. "lsl r6, r8, #16\n\t"
  53312. "lsl r11, r7, #16\n\t"
  53313. "lsr r6, r6, #16\n\t"
  53314. "lsr r11, r11, #16\n\t"
  53315. "mul r11, r6, r11\n\t"
  53316. "adds r10, r10, r11\n\t"
  53317. "adc r5, r5, #0\n\t"
  53318. "lsr r11, r7, #16\n\t"
  53319. "mul r6, r11, r6\n\t"
  53320. "lsr r11, r6, #16\n\t"
  53321. "lsl r6, r6, #16\n\t"
  53322. "adds r10, r10, r6\n\t"
  53323. "adc r5, r5, r11\n\t"
  53324. "adds r10, r10, r4\n\t"
  53325. "str r10, [%[a], #320]\n\t"
  53326. "adc r5, r5, #0\n\t"
  53327. /* a[i+81] += m[81] * mu */
  53328. "ldr r7, [%[m], #324]\n\t"
  53329. "ldr r10, [%[a], #324]\n\t"
  53330. "lsr r11, r7, #16\n\t"
  53331. "lsr r6, r8, #16\n\t"
  53332. "mul r4, r6, r11\n\t"
  53333. "lsl r11, r7, #16\n\t"
  53334. "lsr r11, r11, #16\n\t"
  53335. "mul r6, r11, r6\n\t"
  53336. "lsr r11, r6, #16\n\t"
  53337. "lsl r6, r6, #16\n\t"
  53338. "adds r10, r10, r6\n\t"
  53339. "adc r4, r4, r11\n\t"
  53340. "lsl r6, r8, #16\n\t"
  53341. "lsl r11, r7, #16\n\t"
  53342. "lsr r6, r6, #16\n\t"
  53343. "lsr r11, r11, #16\n\t"
  53344. "mul r11, r6, r11\n\t"
  53345. "adds r10, r10, r11\n\t"
  53346. "adc r4, r4, #0\n\t"
  53347. "lsr r11, r7, #16\n\t"
  53348. "mul r6, r11, r6\n\t"
  53349. "lsr r11, r6, #16\n\t"
  53350. "lsl r6, r6, #16\n\t"
  53351. "adds r10, r10, r6\n\t"
  53352. "adc r4, r4, r11\n\t"
  53353. "adds r10, r10, r5\n\t"
  53354. "str r10, [%[a], #324]\n\t"
  53355. "adc r4, r4, #0\n\t"
  53356. /* a[i+82] += m[82] * mu */
  53357. "ldr r7, [%[m], #328]\n\t"
  53358. "ldr r10, [%[a], #328]\n\t"
  53359. "lsr r11, r7, #16\n\t"
  53360. "lsr r6, r8, #16\n\t"
  53361. "mul r5, r6, r11\n\t"
  53362. "lsl r11, r7, #16\n\t"
  53363. "lsr r11, r11, #16\n\t"
  53364. "mul r6, r11, r6\n\t"
  53365. "lsr r11, r6, #16\n\t"
  53366. "lsl r6, r6, #16\n\t"
  53367. "adds r10, r10, r6\n\t"
  53368. "adc r5, r5, r11\n\t"
  53369. "lsl r6, r8, #16\n\t"
  53370. "lsl r11, r7, #16\n\t"
  53371. "lsr r6, r6, #16\n\t"
  53372. "lsr r11, r11, #16\n\t"
  53373. "mul r11, r6, r11\n\t"
  53374. "adds r10, r10, r11\n\t"
  53375. "adc r5, r5, #0\n\t"
  53376. "lsr r11, r7, #16\n\t"
  53377. "mul r6, r11, r6\n\t"
  53378. "lsr r11, r6, #16\n\t"
  53379. "lsl r6, r6, #16\n\t"
  53380. "adds r10, r10, r6\n\t"
  53381. "adc r5, r5, r11\n\t"
  53382. "adds r10, r10, r4\n\t"
  53383. "str r10, [%[a], #328]\n\t"
  53384. "adc r5, r5, #0\n\t"
  53385. /* a[i+83] += m[83] * mu */
  53386. "ldr r7, [%[m], #332]\n\t"
  53387. "ldr r10, [%[a], #332]\n\t"
  53388. "lsr r11, r7, #16\n\t"
  53389. "lsr r6, r8, #16\n\t"
  53390. "mul r4, r6, r11\n\t"
  53391. "lsl r11, r7, #16\n\t"
  53392. "lsr r11, r11, #16\n\t"
  53393. "mul r6, r11, r6\n\t"
  53394. "lsr r11, r6, #16\n\t"
  53395. "lsl r6, r6, #16\n\t"
  53396. "adds r10, r10, r6\n\t"
  53397. "adc r4, r4, r11\n\t"
  53398. "lsl r6, r8, #16\n\t"
  53399. "lsl r11, r7, #16\n\t"
  53400. "lsr r6, r6, #16\n\t"
  53401. "lsr r11, r11, #16\n\t"
  53402. "mul r11, r6, r11\n\t"
  53403. "adds r10, r10, r11\n\t"
  53404. "adc r4, r4, #0\n\t"
  53405. "lsr r11, r7, #16\n\t"
  53406. "mul r6, r11, r6\n\t"
  53407. "lsr r11, r6, #16\n\t"
  53408. "lsl r6, r6, #16\n\t"
  53409. "adds r10, r10, r6\n\t"
  53410. "adc r4, r4, r11\n\t"
  53411. "adds r10, r10, r5\n\t"
  53412. "str r10, [%[a], #332]\n\t"
  53413. "adc r4, r4, #0\n\t"
  53414. /* a[i+84] += m[84] * mu */
  53415. "ldr r7, [%[m], #336]\n\t"
  53416. "ldr r10, [%[a], #336]\n\t"
  53417. "lsr r11, r7, #16\n\t"
  53418. "lsr r6, r8, #16\n\t"
  53419. "mul r5, r6, r11\n\t"
  53420. "lsl r11, r7, #16\n\t"
  53421. "lsr r11, r11, #16\n\t"
  53422. "mul r6, r11, r6\n\t"
  53423. "lsr r11, r6, #16\n\t"
  53424. "lsl r6, r6, #16\n\t"
  53425. "adds r10, r10, r6\n\t"
  53426. "adc r5, r5, r11\n\t"
  53427. "lsl r6, r8, #16\n\t"
  53428. "lsl r11, r7, #16\n\t"
  53429. "lsr r6, r6, #16\n\t"
  53430. "lsr r11, r11, #16\n\t"
  53431. "mul r11, r6, r11\n\t"
  53432. "adds r10, r10, r11\n\t"
  53433. "adc r5, r5, #0\n\t"
  53434. "lsr r11, r7, #16\n\t"
  53435. "mul r6, r11, r6\n\t"
  53436. "lsr r11, r6, #16\n\t"
  53437. "lsl r6, r6, #16\n\t"
  53438. "adds r10, r10, r6\n\t"
  53439. "adc r5, r5, r11\n\t"
  53440. "adds r10, r10, r4\n\t"
  53441. "str r10, [%[a], #336]\n\t"
  53442. "adc r5, r5, #0\n\t"
  53443. /* a[i+85] += m[85] * mu */
  53444. "ldr r7, [%[m], #340]\n\t"
  53445. "ldr r10, [%[a], #340]\n\t"
  53446. "lsr r11, r7, #16\n\t"
  53447. "lsr r6, r8, #16\n\t"
  53448. "mul r4, r6, r11\n\t"
  53449. "lsl r11, r7, #16\n\t"
  53450. "lsr r11, r11, #16\n\t"
  53451. "mul r6, r11, r6\n\t"
  53452. "lsr r11, r6, #16\n\t"
  53453. "lsl r6, r6, #16\n\t"
  53454. "adds r10, r10, r6\n\t"
  53455. "adc r4, r4, r11\n\t"
  53456. "lsl r6, r8, #16\n\t"
  53457. "lsl r11, r7, #16\n\t"
  53458. "lsr r6, r6, #16\n\t"
  53459. "lsr r11, r11, #16\n\t"
  53460. "mul r11, r6, r11\n\t"
  53461. "adds r10, r10, r11\n\t"
  53462. "adc r4, r4, #0\n\t"
  53463. "lsr r11, r7, #16\n\t"
  53464. "mul r6, r11, r6\n\t"
  53465. "lsr r11, r6, #16\n\t"
  53466. "lsl r6, r6, #16\n\t"
  53467. "adds r10, r10, r6\n\t"
  53468. "adc r4, r4, r11\n\t"
  53469. "adds r10, r10, r5\n\t"
  53470. "str r10, [%[a], #340]\n\t"
  53471. "adc r4, r4, #0\n\t"
  53472. /* a[i+86] += m[86] * mu */
  53473. "ldr r7, [%[m], #344]\n\t"
  53474. "ldr r10, [%[a], #344]\n\t"
  53475. "lsr r11, r7, #16\n\t"
  53476. "lsr r6, r8, #16\n\t"
  53477. "mul r5, r6, r11\n\t"
  53478. "lsl r11, r7, #16\n\t"
  53479. "lsr r11, r11, #16\n\t"
  53480. "mul r6, r11, r6\n\t"
  53481. "lsr r11, r6, #16\n\t"
  53482. "lsl r6, r6, #16\n\t"
  53483. "adds r10, r10, r6\n\t"
  53484. "adc r5, r5, r11\n\t"
  53485. "lsl r6, r8, #16\n\t"
  53486. "lsl r11, r7, #16\n\t"
  53487. "lsr r6, r6, #16\n\t"
  53488. "lsr r11, r11, #16\n\t"
  53489. "mul r11, r6, r11\n\t"
  53490. "adds r10, r10, r11\n\t"
  53491. "adc r5, r5, #0\n\t"
  53492. "lsr r11, r7, #16\n\t"
  53493. "mul r6, r11, r6\n\t"
  53494. "lsr r11, r6, #16\n\t"
  53495. "lsl r6, r6, #16\n\t"
  53496. "adds r10, r10, r6\n\t"
  53497. "adc r5, r5, r11\n\t"
  53498. "adds r10, r10, r4\n\t"
  53499. "str r10, [%[a], #344]\n\t"
  53500. "adc r5, r5, #0\n\t"
  53501. /* a[i+87] += m[87] * mu */
  53502. "ldr r7, [%[m], #348]\n\t"
  53503. "ldr r10, [%[a], #348]\n\t"
  53504. "lsr r11, r7, #16\n\t"
  53505. "lsr r6, r8, #16\n\t"
  53506. "mul r4, r6, r11\n\t"
  53507. "lsl r11, r7, #16\n\t"
  53508. "lsr r11, r11, #16\n\t"
  53509. "mul r6, r11, r6\n\t"
  53510. "lsr r11, r6, #16\n\t"
  53511. "lsl r6, r6, #16\n\t"
  53512. "adds r10, r10, r6\n\t"
  53513. "adc r4, r4, r11\n\t"
  53514. "lsl r6, r8, #16\n\t"
  53515. "lsl r11, r7, #16\n\t"
  53516. "lsr r6, r6, #16\n\t"
  53517. "lsr r11, r11, #16\n\t"
  53518. "mul r11, r6, r11\n\t"
  53519. "adds r10, r10, r11\n\t"
  53520. "adc r4, r4, #0\n\t"
  53521. "lsr r11, r7, #16\n\t"
  53522. "mul r6, r11, r6\n\t"
  53523. "lsr r11, r6, #16\n\t"
  53524. "lsl r6, r6, #16\n\t"
  53525. "adds r10, r10, r6\n\t"
  53526. "adc r4, r4, r11\n\t"
  53527. "adds r10, r10, r5\n\t"
  53528. "str r10, [%[a], #348]\n\t"
  53529. "adc r4, r4, #0\n\t"
  53530. /* a[i+88] += m[88] * mu */
  53531. "ldr r7, [%[m], #352]\n\t"
  53532. "ldr r10, [%[a], #352]\n\t"
  53533. "lsr r11, r7, #16\n\t"
  53534. "lsr r6, r8, #16\n\t"
  53535. "mul r5, r6, r11\n\t"
  53536. "lsl r11, r7, #16\n\t"
  53537. "lsr r11, r11, #16\n\t"
  53538. "mul r6, r11, r6\n\t"
  53539. "lsr r11, r6, #16\n\t"
  53540. "lsl r6, r6, #16\n\t"
  53541. "adds r10, r10, r6\n\t"
  53542. "adc r5, r5, r11\n\t"
  53543. "lsl r6, r8, #16\n\t"
  53544. "lsl r11, r7, #16\n\t"
  53545. "lsr r6, r6, #16\n\t"
  53546. "lsr r11, r11, #16\n\t"
  53547. "mul r11, r6, r11\n\t"
  53548. "adds r10, r10, r11\n\t"
  53549. "adc r5, r5, #0\n\t"
  53550. "lsr r11, r7, #16\n\t"
  53551. "mul r6, r11, r6\n\t"
  53552. "lsr r11, r6, #16\n\t"
  53553. "lsl r6, r6, #16\n\t"
  53554. "adds r10, r10, r6\n\t"
  53555. "adc r5, r5, r11\n\t"
  53556. "adds r10, r10, r4\n\t"
  53557. "str r10, [%[a], #352]\n\t"
  53558. "adc r5, r5, #0\n\t"
  53559. /* a[i+89] += m[89] * mu */
  53560. "ldr r7, [%[m], #356]\n\t"
  53561. "ldr r10, [%[a], #356]\n\t"
  53562. "lsr r11, r7, #16\n\t"
  53563. "lsr r6, r8, #16\n\t"
  53564. "mul r4, r6, r11\n\t"
  53565. "lsl r11, r7, #16\n\t"
  53566. "lsr r11, r11, #16\n\t"
  53567. "mul r6, r11, r6\n\t"
  53568. "lsr r11, r6, #16\n\t"
  53569. "lsl r6, r6, #16\n\t"
  53570. "adds r10, r10, r6\n\t"
  53571. "adc r4, r4, r11\n\t"
  53572. "lsl r6, r8, #16\n\t"
  53573. "lsl r11, r7, #16\n\t"
  53574. "lsr r6, r6, #16\n\t"
  53575. "lsr r11, r11, #16\n\t"
  53576. "mul r11, r6, r11\n\t"
  53577. "adds r10, r10, r11\n\t"
  53578. "adc r4, r4, #0\n\t"
  53579. "lsr r11, r7, #16\n\t"
  53580. "mul r6, r11, r6\n\t"
  53581. "lsr r11, r6, #16\n\t"
  53582. "lsl r6, r6, #16\n\t"
  53583. "adds r10, r10, r6\n\t"
  53584. "adc r4, r4, r11\n\t"
  53585. "adds r10, r10, r5\n\t"
  53586. "str r10, [%[a], #356]\n\t"
  53587. "adc r4, r4, #0\n\t"
  53588. /* a[i+90] += m[90] * mu */
  53589. "ldr r7, [%[m], #360]\n\t"
  53590. "ldr r10, [%[a], #360]\n\t"
  53591. "lsr r11, r7, #16\n\t"
  53592. "lsr r6, r8, #16\n\t"
  53593. "mul r5, r6, r11\n\t"
  53594. "lsl r11, r7, #16\n\t"
  53595. "lsr r11, r11, #16\n\t"
  53596. "mul r6, r11, r6\n\t"
  53597. "lsr r11, r6, #16\n\t"
  53598. "lsl r6, r6, #16\n\t"
  53599. "adds r10, r10, r6\n\t"
  53600. "adc r5, r5, r11\n\t"
  53601. "lsl r6, r8, #16\n\t"
  53602. "lsl r11, r7, #16\n\t"
  53603. "lsr r6, r6, #16\n\t"
  53604. "lsr r11, r11, #16\n\t"
  53605. "mul r11, r6, r11\n\t"
  53606. "adds r10, r10, r11\n\t"
  53607. "adc r5, r5, #0\n\t"
  53608. "lsr r11, r7, #16\n\t"
  53609. "mul r6, r11, r6\n\t"
  53610. "lsr r11, r6, #16\n\t"
  53611. "lsl r6, r6, #16\n\t"
  53612. "adds r10, r10, r6\n\t"
  53613. "adc r5, r5, r11\n\t"
  53614. "adds r10, r10, r4\n\t"
  53615. "str r10, [%[a], #360]\n\t"
  53616. "adc r5, r5, #0\n\t"
  53617. /* a[i+91] += m[91] * mu */
  53618. "ldr r7, [%[m], #364]\n\t"
  53619. "ldr r10, [%[a], #364]\n\t"
  53620. "lsr r11, r7, #16\n\t"
  53621. "lsr r6, r8, #16\n\t"
  53622. "mul r4, r6, r11\n\t"
  53623. "lsl r11, r7, #16\n\t"
  53624. "lsr r11, r11, #16\n\t"
  53625. "mul r6, r11, r6\n\t"
  53626. "lsr r11, r6, #16\n\t"
  53627. "lsl r6, r6, #16\n\t"
  53628. "adds r10, r10, r6\n\t"
  53629. "adc r4, r4, r11\n\t"
  53630. "lsl r6, r8, #16\n\t"
  53631. "lsl r11, r7, #16\n\t"
  53632. "lsr r6, r6, #16\n\t"
  53633. "lsr r11, r11, #16\n\t"
  53634. "mul r11, r6, r11\n\t"
  53635. "adds r10, r10, r11\n\t"
  53636. "adc r4, r4, #0\n\t"
  53637. "lsr r11, r7, #16\n\t"
  53638. "mul r6, r11, r6\n\t"
  53639. "lsr r11, r6, #16\n\t"
  53640. "lsl r6, r6, #16\n\t"
  53641. "adds r10, r10, r6\n\t"
  53642. "adc r4, r4, r11\n\t"
  53643. "adds r10, r10, r5\n\t"
  53644. "str r10, [%[a], #364]\n\t"
  53645. "adc r4, r4, #0\n\t"
  53646. /* a[i+92] += m[92] * mu */
  53647. "ldr r7, [%[m], #368]\n\t"
  53648. "ldr r10, [%[a], #368]\n\t"
  53649. "lsr r11, r7, #16\n\t"
  53650. "lsr r6, r8, #16\n\t"
  53651. "mul r5, r6, r11\n\t"
  53652. "lsl r11, r7, #16\n\t"
  53653. "lsr r11, r11, #16\n\t"
  53654. "mul r6, r11, r6\n\t"
  53655. "lsr r11, r6, #16\n\t"
  53656. "lsl r6, r6, #16\n\t"
  53657. "adds r10, r10, r6\n\t"
  53658. "adc r5, r5, r11\n\t"
  53659. "lsl r6, r8, #16\n\t"
  53660. "lsl r11, r7, #16\n\t"
  53661. "lsr r6, r6, #16\n\t"
  53662. "lsr r11, r11, #16\n\t"
  53663. "mul r11, r6, r11\n\t"
  53664. "adds r10, r10, r11\n\t"
  53665. "adc r5, r5, #0\n\t"
  53666. "lsr r11, r7, #16\n\t"
  53667. "mul r6, r11, r6\n\t"
  53668. "lsr r11, r6, #16\n\t"
  53669. "lsl r6, r6, #16\n\t"
  53670. "adds r10, r10, r6\n\t"
  53671. "adc r5, r5, r11\n\t"
  53672. "adds r10, r10, r4\n\t"
  53673. "str r10, [%[a], #368]\n\t"
  53674. "adc r5, r5, #0\n\t"
  53675. /* a[i+93] += m[93] * mu */
  53676. "ldr r7, [%[m], #372]\n\t"
  53677. "ldr r10, [%[a], #372]\n\t"
  53678. "lsr r11, r7, #16\n\t"
  53679. "lsr r6, r8, #16\n\t"
  53680. "mul r4, r6, r11\n\t"
  53681. "lsl r11, r7, #16\n\t"
  53682. "lsr r11, r11, #16\n\t"
  53683. "mul r6, r11, r6\n\t"
  53684. "lsr r11, r6, #16\n\t"
  53685. "lsl r6, r6, #16\n\t"
  53686. "adds r10, r10, r6\n\t"
  53687. "adc r4, r4, r11\n\t"
  53688. "lsl r6, r8, #16\n\t"
  53689. "lsl r11, r7, #16\n\t"
  53690. "lsr r6, r6, #16\n\t"
  53691. "lsr r11, r11, #16\n\t"
  53692. "mul r11, r6, r11\n\t"
  53693. "adds r10, r10, r11\n\t"
  53694. "adc r4, r4, #0\n\t"
  53695. "lsr r11, r7, #16\n\t"
  53696. "mul r6, r11, r6\n\t"
  53697. "lsr r11, r6, #16\n\t"
  53698. "lsl r6, r6, #16\n\t"
  53699. "adds r10, r10, r6\n\t"
  53700. "adc r4, r4, r11\n\t"
  53701. "adds r10, r10, r5\n\t"
  53702. "str r10, [%[a], #372]\n\t"
  53703. "adc r4, r4, #0\n\t"
  53704. /* a[i+94] += m[94] * mu */
  53705. "ldr r7, [%[m], #376]\n\t"
  53706. "ldr r10, [%[a], #376]\n\t"
  53707. "lsr r11, r7, #16\n\t"
  53708. "lsr r6, r8, #16\n\t"
  53709. "mul r5, r6, r11\n\t"
  53710. "lsl r11, r7, #16\n\t"
  53711. "lsr r11, r11, #16\n\t"
  53712. "mul r6, r11, r6\n\t"
  53713. "lsr r11, r6, #16\n\t"
  53714. "lsl r6, r6, #16\n\t"
  53715. "adds r10, r10, r6\n\t"
  53716. "adc r5, r5, r11\n\t"
  53717. "lsl r6, r8, #16\n\t"
  53718. "lsl r11, r7, #16\n\t"
  53719. "lsr r6, r6, #16\n\t"
  53720. "lsr r11, r11, #16\n\t"
  53721. "mul r11, r6, r11\n\t"
  53722. "adds r10, r10, r11\n\t"
  53723. "adc r5, r5, #0\n\t"
  53724. "lsr r11, r7, #16\n\t"
  53725. "mul r6, r11, r6\n\t"
  53726. "lsr r11, r6, #16\n\t"
  53727. "lsl r6, r6, #16\n\t"
  53728. "adds r10, r10, r6\n\t"
  53729. "adc r5, r5, r11\n\t"
  53730. "adds r10, r10, r4\n\t"
  53731. "str r10, [%[a], #376]\n\t"
  53732. "adc r5, r5, #0\n\t"
  53733. /* a[i+95] += m[95] * mu */
  53734. "ldr r7, [%[m], #380]\n\t"
  53735. "ldr r10, [%[a], #380]\n\t"
  53736. "lsr r11, r7, #16\n\t"
  53737. "lsr r6, r8, #16\n\t"
  53738. "mul r4, r6, r11\n\t"
  53739. "lsl r11, r7, #16\n\t"
  53740. "lsr r11, r11, #16\n\t"
  53741. "mul r6, r11, r6\n\t"
  53742. "lsr r11, r6, #16\n\t"
  53743. "lsl r6, r6, #16\n\t"
  53744. "adds r10, r10, r6\n\t"
  53745. "adc r4, r4, r11\n\t"
  53746. "lsl r6, r8, #16\n\t"
  53747. "lsl r11, r7, #16\n\t"
  53748. "lsr r6, r6, #16\n\t"
  53749. "lsr r11, r11, #16\n\t"
  53750. "mul r11, r6, r11\n\t"
  53751. "adds r10, r10, r11\n\t"
  53752. "adc r4, r4, #0\n\t"
  53753. "lsr r11, r7, #16\n\t"
  53754. "mul r6, r11, r6\n\t"
  53755. "lsr r11, r6, #16\n\t"
  53756. "lsl r6, r6, #16\n\t"
  53757. "adds r10, r10, r6\n\t"
  53758. "adc r4, r4, r11\n\t"
  53759. "adds r10, r10, r5\n\t"
  53760. "str r10, [%[a], #380]\n\t"
  53761. "adc r4, r4, #0\n\t"
  53762. /* a[i+96] += m[96] * mu */
  53763. "ldr r7, [%[m], #384]\n\t"
  53764. "ldr r10, [%[a], #384]\n\t"
  53765. "lsr r11, r7, #16\n\t"
  53766. "lsr r6, r8, #16\n\t"
  53767. "mul r5, r6, r11\n\t"
  53768. "lsl r11, r7, #16\n\t"
  53769. "lsr r11, r11, #16\n\t"
  53770. "mul r6, r11, r6\n\t"
  53771. "lsr r11, r6, #16\n\t"
  53772. "lsl r6, r6, #16\n\t"
  53773. "adds r10, r10, r6\n\t"
  53774. "adc r5, r5, r11\n\t"
  53775. "lsl r6, r8, #16\n\t"
  53776. "lsl r11, r7, #16\n\t"
  53777. "lsr r6, r6, #16\n\t"
  53778. "lsr r11, r11, #16\n\t"
  53779. "mul r11, r6, r11\n\t"
  53780. "adds r10, r10, r11\n\t"
  53781. "adc r5, r5, #0\n\t"
  53782. "lsr r11, r7, #16\n\t"
  53783. "mul r6, r11, r6\n\t"
  53784. "lsr r11, r6, #16\n\t"
  53785. "lsl r6, r6, #16\n\t"
  53786. "adds r10, r10, r6\n\t"
  53787. "adc r5, r5, r11\n\t"
  53788. "adds r10, r10, r4\n\t"
  53789. "str r10, [%[a], #384]\n\t"
  53790. "adc r5, r5, #0\n\t"
  53791. /* a[i+97] += m[97] * mu */
  53792. "ldr r7, [%[m], #388]\n\t"
  53793. "ldr r10, [%[a], #388]\n\t"
  53794. "lsr r11, r7, #16\n\t"
  53795. "lsr r6, r8, #16\n\t"
  53796. "mul r4, r6, r11\n\t"
  53797. "lsl r11, r7, #16\n\t"
  53798. "lsr r11, r11, #16\n\t"
  53799. "mul r6, r11, r6\n\t"
  53800. "lsr r11, r6, #16\n\t"
  53801. "lsl r6, r6, #16\n\t"
  53802. "adds r10, r10, r6\n\t"
  53803. "adc r4, r4, r11\n\t"
  53804. "lsl r6, r8, #16\n\t"
  53805. "lsl r11, r7, #16\n\t"
  53806. "lsr r6, r6, #16\n\t"
  53807. "lsr r11, r11, #16\n\t"
  53808. "mul r11, r6, r11\n\t"
  53809. "adds r10, r10, r11\n\t"
  53810. "adc r4, r4, #0\n\t"
  53811. "lsr r11, r7, #16\n\t"
  53812. "mul r6, r11, r6\n\t"
  53813. "lsr r11, r6, #16\n\t"
  53814. "lsl r6, r6, #16\n\t"
  53815. "adds r10, r10, r6\n\t"
  53816. "adc r4, r4, r11\n\t"
  53817. "adds r10, r10, r5\n\t"
  53818. "str r10, [%[a], #388]\n\t"
  53819. "adc r4, r4, #0\n\t"
  53820. /* a[i+98] += m[98] * mu */
  53821. "ldr r7, [%[m], #392]\n\t"
  53822. "ldr r10, [%[a], #392]\n\t"
  53823. "lsr r11, r7, #16\n\t"
  53824. "lsr r6, r8, #16\n\t"
  53825. "mul r5, r6, r11\n\t"
  53826. "lsl r11, r7, #16\n\t"
  53827. "lsr r11, r11, #16\n\t"
  53828. "mul r6, r11, r6\n\t"
  53829. "lsr r11, r6, #16\n\t"
  53830. "lsl r6, r6, #16\n\t"
  53831. "adds r10, r10, r6\n\t"
  53832. "adc r5, r5, r11\n\t"
  53833. "lsl r6, r8, #16\n\t"
  53834. "lsl r11, r7, #16\n\t"
  53835. "lsr r6, r6, #16\n\t"
  53836. "lsr r11, r11, #16\n\t"
  53837. "mul r11, r6, r11\n\t"
  53838. "adds r10, r10, r11\n\t"
  53839. "adc r5, r5, #0\n\t"
  53840. "lsr r11, r7, #16\n\t"
  53841. "mul r6, r11, r6\n\t"
  53842. "lsr r11, r6, #16\n\t"
  53843. "lsl r6, r6, #16\n\t"
  53844. "adds r10, r10, r6\n\t"
  53845. "adc r5, r5, r11\n\t"
  53846. "adds r10, r10, r4\n\t"
  53847. "str r10, [%[a], #392]\n\t"
  53848. "adc r5, r5, #0\n\t"
  53849. /* a[i+99] += m[99] * mu */
  53850. "ldr r7, [%[m], #396]\n\t"
  53851. "ldr r10, [%[a], #396]\n\t"
  53852. "lsr r11, r7, #16\n\t"
  53853. "lsr r6, r8, #16\n\t"
  53854. "mul r4, r6, r11\n\t"
  53855. "lsl r11, r7, #16\n\t"
  53856. "lsr r11, r11, #16\n\t"
  53857. "mul r6, r11, r6\n\t"
  53858. "lsr r11, r6, #16\n\t"
  53859. "lsl r6, r6, #16\n\t"
  53860. "adds r10, r10, r6\n\t"
  53861. "adc r4, r4, r11\n\t"
  53862. "lsl r6, r8, #16\n\t"
  53863. "lsl r11, r7, #16\n\t"
  53864. "lsr r6, r6, #16\n\t"
  53865. "lsr r11, r11, #16\n\t"
  53866. "mul r11, r6, r11\n\t"
  53867. "adds r10, r10, r11\n\t"
  53868. "adc r4, r4, #0\n\t"
  53869. "lsr r11, r7, #16\n\t"
  53870. "mul r6, r11, r6\n\t"
  53871. "lsr r11, r6, #16\n\t"
  53872. "lsl r6, r6, #16\n\t"
  53873. "adds r10, r10, r6\n\t"
  53874. "adc r4, r4, r11\n\t"
  53875. "adds r10, r10, r5\n\t"
  53876. "str r10, [%[a], #396]\n\t"
  53877. "adc r4, r4, #0\n\t"
  53878. /* a[i+100] += m[100] * mu */
  53879. "ldr r7, [%[m], #400]\n\t"
  53880. "ldr r10, [%[a], #400]\n\t"
  53881. "lsr r11, r7, #16\n\t"
  53882. "lsr r6, r8, #16\n\t"
  53883. "mul r5, r6, r11\n\t"
  53884. "lsl r11, r7, #16\n\t"
  53885. "lsr r11, r11, #16\n\t"
  53886. "mul r6, r11, r6\n\t"
  53887. "lsr r11, r6, #16\n\t"
  53888. "lsl r6, r6, #16\n\t"
  53889. "adds r10, r10, r6\n\t"
  53890. "adc r5, r5, r11\n\t"
  53891. "lsl r6, r8, #16\n\t"
  53892. "lsl r11, r7, #16\n\t"
  53893. "lsr r6, r6, #16\n\t"
  53894. "lsr r11, r11, #16\n\t"
  53895. "mul r11, r6, r11\n\t"
  53896. "adds r10, r10, r11\n\t"
  53897. "adc r5, r5, #0\n\t"
  53898. "lsr r11, r7, #16\n\t"
  53899. "mul r6, r11, r6\n\t"
  53900. "lsr r11, r6, #16\n\t"
  53901. "lsl r6, r6, #16\n\t"
  53902. "adds r10, r10, r6\n\t"
  53903. "adc r5, r5, r11\n\t"
  53904. "adds r10, r10, r4\n\t"
  53905. "str r10, [%[a], #400]\n\t"
  53906. "adc r5, r5, #0\n\t"
  53907. /* a[i+101] += m[101] * mu */
  53908. "ldr r7, [%[m], #404]\n\t"
  53909. "ldr r10, [%[a], #404]\n\t"
  53910. "lsr r11, r7, #16\n\t"
  53911. "lsr r6, r8, #16\n\t"
  53912. "mul r4, r6, r11\n\t"
  53913. "lsl r11, r7, #16\n\t"
  53914. "lsr r11, r11, #16\n\t"
  53915. "mul r6, r11, r6\n\t"
  53916. "lsr r11, r6, #16\n\t"
  53917. "lsl r6, r6, #16\n\t"
  53918. "adds r10, r10, r6\n\t"
  53919. "adc r4, r4, r11\n\t"
  53920. "lsl r6, r8, #16\n\t"
  53921. "lsl r11, r7, #16\n\t"
  53922. "lsr r6, r6, #16\n\t"
  53923. "lsr r11, r11, #16\n\t"
  53924. "mul r11, r6, r11\n\t"
  53925. "adds r10, r10, r11\n\t"
  53926. "adc r4, r4, #0\n\t"
  53927. "lsr r11, r7, #16\n\t"
  53928. "mul r6, r11, r6\n\t"
  53929. "lsr r11, r6, #16\n\t"
  53930. "lsl r6, r6, #16\n\t"
  53931. "adds r10, r10, r6\n\t"
  53932. "adc r4, r4, r11\n\t"
  53933. "adds r10, r10, r5\n\t"
  53934. "str r10, [%[a], #404]\n\t"
  53935. "adc r4, r4, #0\n\t"
  53936. /* a[i+102] += m[102] * mu */
  53937. "ldr r7, [%[m], #408]\n\t"
  53938. "ldr r10, [%[a], #408]\n\t"
  53939. "lsr r11, r7, #16\n\t"
  53940. "lsr r6, r8, #16\n\t"
  53941. "mul r5, r6, r11\n\t"
  53942. "lsl r11, r7, #16\n\t"
  53943. "lsr r11, r11, #16\n\t"
  53944. "mul r6, r11, r6\n\t"
  53945. "lsr r11, r6, #16\n\t"
  53946. "lsl r6, r6, #16\n\t"
  53947. "adds r10, r10, r6\n\t"
  53948. "adc r5, r5, r11\n\t"
  53949. "lsl r6, r8, #16\n\t"
  53950. "lsl r11, r7, #16\n\t"
  53951. "lsr r6, r6, #16\n\t"
  53952. "lsr r11, r11, #16\n\t"
  53953. "mul r11, r6, r11\n\t"
  53954. "adds r10, r10, r11\n\t"
  53955. "adc r5, r5, #0\n\t"
  53956. "lsr r11, r7, #16\n\t"
  53957. "mul r6, r11, r6\n\t"
  53958. "lsr r11, r6, #16\n\t"
  53959. "lsl r6, r6, #16\n\t"
  53960. "adds r10, r10, r6\n\t"
  53961. "adc r5, r5, r11\n\t"
  53962. "adds r10, r10, r4\n\t"
  53963. "str r10, [%[a], #408]\n\t"
  53964. "adc r5, r5, #0\n\t"
  53965. /* a[i+103] += m[103] * mu */
  53966. "ldr r7, [%[m], #412]\n\t"
  53967. "ldr r10, [%[a], #412]\n\t"
  53968. "lsr r11, r7, #16\n\t"
  53969. "lsr r6, r8, #16\n\t"
  53970. "mul r4, r6, r11\n\t"
  53971. "lsl r11, r7, #16\n\t"
  53972. "lsr r11, r11, #16\n\t"
  53973. "mul r6, r11, r6\n\t"
  53974. "lsr r11, r6, #16\n\t"
  53975. "lsl r6, r6, #16\n\t"
  53976. "adds r10, r10, r6\n\t"
  53977. "adc r4, r4, r11\n\t"
  53978. "lsl r6, r8, #16\n\t"
  53979. "lsl r11, r7, #16\n\t"
  53980. "lsr r6, r6, #16\n\t"
  53981. "lsr r11, r11, #16\n\t"
  53982. "mul r11, r6, r11\n\t"
  53983. "adds r10, r10, r11\n\t"
  53984. "adc r4, r4, #0\n\t"
  53985. "lsr r11, r7, #16\n\t"
  53986. "mul r6, r11, r6\n\t"
  53987. "lsr r11, r6, #16\n\t"
  53988. "lsl r6, r6, #16\n\t"
  53989. "adds r10, r10, r6\n\t"
  53990. "adc r4, r4, r11\n\t"
  53991. "adds r10, r10, r5\n\t"
  53992. "str r10, [%[a], #412]\n\t"
  53993. "adc r4, r4, #0\n\t"
  53994. /* a[i+104] += m[104] * mu */
  53995. "ldr r7, [%[m], #416]\n\t"
  53996. "ldr r10, [%[a], #416]\n\t"
  53997. "lsr r11, r7, #16\n\t"
  53998. "lsr r6, r8, #16\n\t"
  53999. "mul r5, r6, r11\n\t"
  54000. "lsl r11, r7, #16\n\t"
  54001. "lsr r11, r11, #16\n\t"
  54002. "mul r6, r11, r6\n\t"
  54003. "lsr r11, r6, #16\n\t"
  54004. "lsl r6, r6, #16\n\t"
  54005. "adds r10, r10, r6\n\t"
  54006. "adc r5, r5, r11\n\t"
  54007. "lsl r6, r8, #16\n\t"
  54008. "lsl r11, r7, #16\n\t"
  54009. "lsr r6, r6, #16\n\t"
  54010. "lsr r11, r11, #16\n\t"
  54011. "mul r11, r6, r11\n\t"
  54012. "adds r10, r10, r11\n\t"
  54013. "adc r5, r5, #0\n\t"
  54014. "lsr r11, r7, #16\n\t"
  54015. "mul r6, r11, r6\n\t"
  54016. "lsr r11, r6, #16\n\t"
  54017. "lsl r6, r6, #16\n\t"
  54018. "adds r10, r10, r6\n\t"
  54019. "adc r5, r5, r11\n\t"
  54020. "adds r10, r10, r4\n\t"
  54021. "str r10, [%[a], #416]\n\t"
  54022. "adc r5, r5, #0\n\t"
  54023. /* a[i+105] += m[105] * mu */
  54024. "ldr r7, [%[m], #420]\n\t"
  54025. "ldr r10, [%[a], #420]\n\t"
  54026. "lsr r11, r7, #16\n\t"
  54027. "lsr r6, r8, #16\n\t"
  54028. "mul r4, r6, r11\n\t"
  54029. "lsl r11, r7, #16\n\t"
  54030. "lsr r11, r11, #16\n\t"
  54031. "mul r6, r11, r6\n\t"
  54032. "lsr r11, r6, #16\n\t"
  54033. "lsl r6, r6, #16\n\t"
  54034. "adds r10, r10, r6\n\t"
  54035. "adc r4, r4, r11\n\t"
  54036. "lsl r6, r8, #16\n\t"
  54037. "lsl r11, r7, #16\n\t"
  54038. "lsr r6, r6, #16\n\t"
  54039. "lsr r11, r11, #16\n\t"
  54040. "mul r11, r6, r11\n\t"
  54041. "adds r10, r10, r11\n\t"
  54042. "adc r4, r4, #0\n\t"
  54043. "lsr r11, r7, #16\n\t"
  54044. "mul r6, r11, r6\n\t"
  54045. "lsr r11, r6, #16\n\t"
  54046. "lsl r6, r6, #16\n\t"
  54047. "adds r10, r10, r6\n\t"
  54048. "adc r4, r4, r11\n\t"
  54049. "adds r10, r10, r5\n\t"
  54050. "str r10, [%[a], #420]\n\t"
  54051. "adc r4, r4, #0\n\t"
  54052. /* a[i+106] += m[106] * mu */
  54053. "ldr r7, [%[m], #424]\n\t"
  54054. "ldr r10, [%[a], #424]\n\t"
  54055. "lsr r11, r7, #16\n\t"
  54056. "lsr r6, r8, #16\n\t"
  54057. "mul r5, r6, r11\n\t"
  54058. "lsl r11, r7, #16\n\t"
  54059. "lsr r11, r11, #16\n\t"
  54060. "mul r6, r11, r6\n\t"
  54061. "lsr r11, r6, #16\n\t"
  54062. "lsl r6, r6, #16\n\t"
  54063. "adds r10, r10, r6\n\t"
  54064. "adc r5, r5, r11\n\t"
  54065. "lsl r6, r8, #16\n\t"
  54066. "lsl r11, r7, #16\n\t"
  54067. "lsr r6, r6, #16\n\t"
  54068. "lsr r11, r11, #16\n\t"
  54069. "mul r11, r6, r11\n\t"
  54070. "adds r10, r10, r11\n\t"
  54071. "adc r5, r5, #0\n\t"
  54072. "lsr r11, r7, #16\n\t"
  54073. "mul r6, r11, r6\n\t"
  54074. "lsr r11, r6, #16\n\t"
  54075. "lsl r6, r6, #16\n\t"
  54076. "adds r10, r10, r6\n\t"
  54077. "adc r5, r5, r11\n\t"
  54078. "adds r10, r10, r4\n\t"
  54079. "str r10, [%[a], #424]\n\t"
  54080. "adc r5, r5, #0\n\t"
  54081. /* a[i+107] += m[107] * mu */
  54082. "ldr r7, [%[m], #428]\n\t"
  54083. "ldr r10, [%[a], #428]\n\t"
  54084. "lsr r11, r7, #16\n\t"
  54085. "lsr r6, r8, #16\n\t"
  54086. "mul r4, r6, r11\n\t"
  54087. "lsl r11, r7, #16\n\t"
  54088. "lsr r11, r11, #16\n\t"
  54089. "mul r6, r11, r6\n\t"
  54090. "lsr r11, r6, #16\n\t"
  54091. "lsl r6, r6, #16\n\t"
  54092. "adds r10, r10, r6\n\t"
  54093. "adc r4, r4, r11\n\t"
  54094. "lsl r6, r8, #16\n\t"
  54095. "lsl r11, r7, #16\n\t"
  54096. "lsr r6, r6, #16\n\t"
  54097. "lsr r11, r11, #16\n\t"
  54098. "mul r11, r6, r11\n\t"
  54099. "adds r10, r10, r11\n\t"
  54100. "adc r4, r4, #0\n\t"
  54101. "lsr r11, r7, #16\n\t"
  54102. "mul r6, r11, r6\n\t"
  54103. "lsr r11, r6, #16\n\t"
  54104. "lsl r6, r6, #16\n\t"
  54105. "adds r10, r10, r6\n\t"
  54106. "adc r4, r4, r11\n\t"
  54107. "adds r10, r10, r5\n\t"
  54108. "str r10, [%[a], #428]\n\t"
  54109. "adc r4, r4, #0\n\t"
  54110. /* a[i+108] += m[108] * mu */
  54111. "ldr r7, [%[m], #432]\n\t"
  54112. "ldr r10, [%[a], #432]\n\t"
  54113. "lsr r11, r7, #16\n\t"
  54114. "lsr r6, r8, #16\n\t"
  54115. "mul r5, r6, r11\n\t"
  54116. "lsl r11, r7, #16\n\t"
  54117. "lsr r11, r11, #16\n\t"
  54118. "mul r6, r11, r6\n\t"
  54119. "lsr r11, r6, #16\n\t"
  54120. "lsl r6, r6, #16\n\t"
  54121. "adds r10, r10, r6\n\t"
  54122. "adc r5, r5, r11\n\t"
  54123. "lsl r6, r8, #16\n\t"
  54124. "lsl r11, r7, #16\n\t"
  54125. "lsr r6, r6, #16\n\t"
  54126. "lsr r11, r11, #16\n\t"
  54127. "mul r11, r6, r11\n\t"
  54128. "adds r10, r10, r11\n\t"
  54129. "adc r5, r5, #0\n\t"
  54130. "lsr r11, r7, #16\n\t"
  54131. "mul r6, r11, r6\n\t"
  54132. "lsr r11, r6, #16\n\t"
  54133. "lsl r6, r6, #16\n\t"
  54134. "adds r10, r10, r6\n\t"
  54135. "adc r5, r5, r11\n\t"
  54136. "adds r10, r10, r4\n\t"
  54137. "str r10, [%[a], #432]\n\t"
  54138. "adc r5, r5, #0\n\t"
  54139. /* a[i+109] += m[109] * mu */
  54140. "ldr r7, [%[m], #436]\n\t"
  54141. "ldr r10, [%[a], #436]\n\t"
  54142. "lsr r11, r7, #16\n\t"
  54143. "lsr r6, r8, #16\n\t"
  54144. "mul r4, r6, r11\n\t"
  54145. "lsl r11, r7, #16\n\t"
  54146. "lsr r11, r11, #16\n\t"
  54147. "mul r6, r11, r6\n\t"
  54148. "lsr r11, r6, #16\n\t"
  54149. "lsl r6, r6, #16\n\t"
  54150. "adds r10, r10, r6\n\t"
  54151. "adc r4, r4, r11\n\t"
  54152. "lsl r6, r8, #16\n\t"
  54153. "lsl r11, r7, #16\n\t"
  54154. "lsr r6, r6, #16\n\t"
  54155. "lsr r11, r11, #16\n\t"
  54156. "mul r11, r6, r11\n\t"
  54157. "adds r10, r10, r11\n\t"
  54158. "adc r4, r4, #0\n\t"
  54159. "lsr r11, r7, #16\n\t"
  54160. "mul r6, r11, r6\n\t"
  54161. "lsr r11, r6, #16\n\t"
  54162. "lsl r6, r6, #16\n\t"
  54163. "adds r10, r10, r6\n\t"
  54164. "adc r4, r4, r11\n\t"
  54165. "adds r10, r10, r5\n\t"
  54166. "str r10, [%[a], #436]\n\t"
  54167. "adc r4, r4, #0\n\t"
  54168. /* a[i+110] += m[110] * mu */
  54169. "ldr r7, [%[m], #440]\n\t"
  54170. "ldr r10, [%[a], #440]\n\t"
  54171. "lsr r11, r7, #16\n\t"
  54172. "lsr r6, r8, #16\n\t"
  54173. "mul r5, r6, r11\n\t"
  54174. "lsl r11, r7, #16\n\t"
  54175. "lsr r11, r11, #16\n\t"
  54176. "mul r6, r11, r6\n\t"
  54177. "lsr r11, r6, #16\n\t"
  54178. "lsl r6, r6, #16\n\t"
  54179. "adds r10, r10, r6\n\t"
  54180. "adc r5, r5, r11\n\t"
  54181. "lsl r6, r8, #16\n\t"
  54182. "lsl r11, r7, #16\n\t"
  54183. "lsr r6, r6, #16\n\t"
  54184. "lsr r11, r11, #16\n\t"
  54185. "mul r11, r6, r11\n\t"
  54186. "adds r10, r10, r11\n\t"
  54187. "adc r5, r5, #0\n\t"
  54188. "lsr r11, r7, #16\n\t"
  54189. "mul r6, r11, r6\n\t"
  54190. "lsr r11, r6, #16\n\t"
  54191. "lsl r6, r6, #16\n\t"
  54192. "adds r10, r10, r6\n\t"
  54193. "adc r5, r5, r11\n\t"
  54194. "adds r10, r10, r4\n\t"
  54195. "str r10, [%[a], #440]\n\t"
  54196. "adc r5, r5, #0\n\t"
  54197. /* a[i+111] += m[111] * mu */
  54198. "ldr r7, [%[m], #444]\n\t"
  54199. "ldr r10, [%[a], #444]\n\t"
  54200. "lsr r11, r7, #16\n\t"
  54201. "lsr r6, r8, #16\n\t"
  54202. "mul r4, r6, r11\n\t"
  54203. "lsl r11, r7, #16\n\t"
  54204. "lsr r11, r11, #16\n\t"
  54205. "mul r6, r11, r6\n\t"
  54206. "lsr r11, r6, #16\n\t"
  54207. "lsl r6, r6, #16\n\t"
  54208. "adds r10, r10, r6\n\t"
  54209. "adc r4, r4, r11\n\t"
  54210. "lsl r6, r8, #16\n\t"
  54211. "lsl r11, r7, #16\n\t"
  54212. "lsr r6, r6, #16\n\t"
  54213. "lsr r11, r11, #16\n\t"
  54214. "mul r11, r6, r11\n\t"
  54215. "adds r10, r10, r11\n\t"
  54216. "adc r4, r4, #0\n\t"
  54217. "lsr r11, r7, #16\n\t"
  54218. "mul r6, r11, r6\n\t"
  54219. "lsr r11, r6, #16\n\t"
  54220. "lsl r6, r6, #16\n\t"
  54221. "adds r10, r10, r6\n\t"
  54222. "adc r4, r4, r11\n\t"
  54223. "adds r10, r10, r5\n\t"
  54224. "str r10, [%[a], #444]\n\t"
  54225. "adc r4, r4, #0\n\t"
  54226. /* a[i+112] += m[112] * mu */
  54227. "ldr r7, [%[m], #448]\n\t"
  54228. "ldr r10, [%[a], #448]\n\t"
  54229. "lsr r11, r7, #16\n\t"
  54230. "lsr r6, r8, #16\n\t"
  54231. "mul r5, r6, r11\n\t"
  54232. "lsl r11, r7, #16\n\t"
  54233. "lsr r11, r11, #16\n\t"
  54234. "mul r6, r11, r6\n\t"
  54235. "lsr r11, r6, #16\n\t"
  54236. "lsl r6, r6, #16\n\t"
  54237. "adds r10, r10, r6\n\t"
  54238. "adc r5, r5, r11\n\t"
  54239. "lsl r6, r8, #16\n\t"
  54240. "lsl r11, r7, #16\n\t"
  54241. "lsr r6, r6, #16\n\t"
  54242. "lsr r11, r11, #16\n\t"
  54243. "mul r11, r6, r11\n\t"
  54244. "adds r10, r10, r11\n\t"
  54245. "adc r5, r5, #0\n\t"
  54246. "lsr r11, r7, #16\n\t"
  54247. "mul r6, r11, r6\n\t"
  54248. "lsr r11, r6, #16\n\t"
  54249. "lsl r6, r6, #16\n\t"
  54250. "adds r10, r10, r6\n\t"
  54251. "adc r5, r5, r11\n\t"
  54252. "adds r10, r10, r4\n\t"
  54253. "str r10, [%[a], #448]\n\t"
  54254. "adc r5, r5, #0\n\t"
  54255. /* a[i+113] += m[113] * mu */
  54256. "ldr r7, [%[m], #452]\n\t"
  54257. "ldr r10, [%[a], #452]\n\t"
  54258. "lsr r11, r7, #16\n\t"
  54259. "lsr r6, r8, #16\n\t"
  54260. "mul r4, r6, r11\n\t"
  54261. "lsl r11, r7, #16\n\t"
  54262. "lsr r11, r11, #16\n\t"
  54263. "mul r6, r11, r6\n\t"
  54264. "lsr r11, r6, #16\n\t"
  54265. "lsl r6, r6, #16\n\t"
  54266. "adds r10, r10, r6\n\t"
  54267. "adc r4, r4, r11\n\t"
  54268. "lsl r6, r8, #16\n\t"
  54269. "lsl r11, r7, #16\n\t"
  54270. "lsr r6, r6, #16\n\t"
  54271. "lsr r11, r11, #16\n\t"
  54272. "mul r11, r6, r11\n\t"
  54273. "adds r10, r10, r11\n\t"
  54274. "adc r4, r4, #0\n\t"
  54275. "lsr r11, r7, #16\n\t"
  54276. "mul r6, r11, r6\n\t"
  54277. "lsr r11, r6, #16\n\t"
  54278. "lsl r6, r6, #16\n\t"
  54279. "adds r10, r10, r6\n\t"
  54280. "adc r4, r4, r11\n\t"
  54281. "adds r10, r10, r5\n\t"
  54282. "str r10, [%[a], #452]\n\t"
  54283. "adc r4, r4, #0\n\t"
  54284. /* a[i+114] += m[114] * mu */
  54285. "ldr r7, [%[m], #456]\n\t"
  54286. "ldr r10, [%[a], #456]\n\t"
  54287. "lsr r11, r7, #16\n\t"
  54288. "lsr r6, r8, #16\n\t"
  54289. "mul r5, r6, r11\n\t"
  54290. "lsl r11, r7, #16\n\t"
  54291. "lsr r11, r11, #16\n\t"
  54292. "mul r6, r11, r6\n\t"
  54293. "lsr r11, r6, #16\n\t"
  54294. "lsl r6, r6, #16\n\t"
  54295. "adds r10, r10, r6\n\t"
  54296. "adc r5, r5, r11\n\t"
  54297. "lsl r6, r8, #16\n\t"
  54298. "lsl r11, r7, #16\n\t"
  54299. "lsr r6, r6, #16\n\t"
  54300. "lsr r11, r11, #16\n\t"
  54301. "mul r11, r6, r11\n\t"
  54302. "adds r10, r10, r11\n\t"
  54303. "adc r5, r5, #0\n\t"
  54304. "lsr r11, r7, #16\n\t"
  54305. "mul r6, r11, r6\n\t"
  54306. "lsr r11, r6, #16\n\t"
  54307. "lsl r6, r6, #16\n\t"
  54308. "adds r10, r10, r6\n\t"
  54309. "adc r5, r5, r11\n\t"
  54310. "adds r10, r10, r4\n\t"
  54311. "str r10, [%[a], #456]\n\t"
  54312. "adc r5, r5, #0\n\t"
  54313. /* a[i+115] += m[115] * mu */
  54314. "ldr r7, [%[m], #460]\n\t"
  54315. "ldr r10, [%[a], #460]\n\t"
  54316. "lsr r11, r7, #16\n\t"
  54317. "lsr r6, r8, #16\n\t"
  54318. "mul r4, r6, r11\n\t"
  54319. "lsl r11, r7, #16\n\t"
  54320. "lsr r11, r11, #16\n\t"
  54321. "mul r6, r11, r6\n\t"
  54322. "lsr r11, r6, #16\n\t"
  54323. "lsl r6, r6, #16\n\t"
  54324. "adds r10, r10, r6\n\t"
  54325. "adc r4, r4, r11\n\t"
  54326. "lsl r6, r8, #16\n\t"
  54327. "lsl r11, r7, #16\n\t"
  54328. "lsr r6, r6, #16\n\t"
  54329. "lsr r11, r11, #16\n\t"
  54330. "mul r11, r6, r11\n\t"
  54331. "adds r10, r10, r11\n\t"
  54332. "adc r4, r4, #0\n\t"
  54333. "lsr r11, r7, #16\n\t"
  54334. "mul r6, r11, r6\n\t"
  54335. "lsr r11, r6, #16\n\t"
  54336. "lsl r6, r6, #16\n\t"
  54337. "adds r10, r10, r6\n\t"
  54338. "adc r4, r4, r11\n\t"
  54339. "adds r10, r10, r5\n\t"
  54340. "str r10, [%[a], #460]\n\t"
  54341. "adc r4, r4, #0\n\t"
  54342. /* a[i+116] += m[116] * mu */
  54343. "ldr r7, [%[m], #464]\n\t"
  54344. "ldr r10, [%[a], #464]\n\t"
  54345. "lsr r11, r7, #16\n\t"
  54346. "lsr r6, r8, #16\n\t"
  54347. "mul r5, r6, r11\n\t"
  54348. "lsl r11, r7, #16\n\t"
  54349. "lsr r11, r11, #16\n\t"
  54350. "mul r6, r11, r6\n\t"
  54351. "lsr r11, r6, #16\n\t"
  54352. "lsl r6, r6, #16\n\t"
  54353. "adds r10, r10, r6\n\t"
  54354. "adc r5, r5, r11\n\t"
  54355. "lsl r6, r8, #16\n\t"
  54356. "lsl r11, r7, #16\n\t"
  54357. "lsr r6, r6, #16\n\t"
  54358. "lsr r11, r11, #16\n\t"
  54359. "mul r11, r6, r11\n\t"
  54360. "adds r10, r10, r11\n\t"
  54361. "adc r5, r5, #0\n\t"
  54362. "lsr r11, r7, #16\n\t"
  54363. "mul r6, r11, r6\n\t"
  54364. "lsr r11, r6, #16\n\t"
  54365. "lsl r6, r6, #16\n\t"
  54366. "adds r10, r10, r6\n\t"
  54367. "adc r5, r5, r11\n\t"
  54368. "adds r10, r10, r4\n\t"
  54369. "str r10, [%[a], #464]\n\t"
  54370. "adc r5, r5, #0\n\t"
  54371. /* a[i+117] += m[117] * mu */
  54372. "ldr r7, [%[m], #468]\n\t"
  54373. "ldr r10, [%[a], #468]\n\t"
  54374. "lsr r11, r7, #16\n\t"
  54375. "lsr r6, r8, #16\n\t"
  54376. "mul r4, r6, r11\n\t"
  54377. "lsl r11, r7, #16\n\t"
  54378. "lsr r11, r11, #16\n\t"
  54379. "mul r6, r11, r6\n\t"
  54380. "lsr r11, r6, #16\n\t"
  54381. "lsl r6, r6, #16\n\t"
  54382. "adds r10, r10, r6\n\t"
  54383. "adc r4, r4, r11\n\t"
  54384. "lsl r6, r8, #16\n\t"
  54385. "lsl r11, r7, #16\n\t"
  54386. "lsr r6, r6, #16\n\t"
  54387. "lsr r11, r11, #16\n\t"
  54388. "mul r11, r6, r11\n\t"
  54389. "adds r10, r10, r11\n\t"
  54390. "adc r4, r4, #0\n\t"
  54391. "lsr r11, r7, #16\n\t"
  54392. "mul r6, r11, r6\n\t"
  54393. "lsr r11, r6, #16\n\t"
  54394. "lsl r6, r6, #16\n\t"
  54395. "adds r10, r10, r6\n\t"
  54396. "adc r4, r4, r11\n\t"
  54397. "adds r10, r10, r5\n\t"
  54398. "str r10, [%[a], #468]\n\t"
  54399. "adc r4, r4, #0\n\t"
  54400. /* a[i+118] += m[118] * mu */
  54401. "ldr r7, [%[m], #472]\n\t"
  54402. "ldr r10, [%[a], #472]\n\t"
  54403. "lsr r11, r7, #16\n\t"
  54404. "lsr r6, r8, #16\n\t"
  54405. "mul r5, r6, r11\n\t"
  54406. "lsl r11, r7, #16\n\t"
  54407. "lsr r11, r11, #16\n\t"
  54408. "mul r6, r11, r6\n\t"
  54409. "lsr r11, r6, #16\n\t"
  54410. "lsl r6, r6, #16\n\t"
  54411. "adds r10, r10, r6\n\t"
  54412. "adc r5, r5, r11\n\t"
  54413. "lsl r6, r8, #16\n\t"
  54414. "lsl r11, r7, #16\n\t"
  54415. "lsr r6, r6, #16\n\t"
  54416. "lsr r11, r11, #16\n\t"
  54417. "mul r11, r6, r11\n\t"
  54418. "adds r10, r10, r11\n\t"
  54419. "adc r5, r5, #0\n\t"
  54420. "lsr r11, r7, #16\n\t"
  54421. "mul r6, r11, r6\n\t"
  54422. "lsr r11, r6, #16\n\t"
  54423. "lsl r6, r6, #16\n\t"
  54424. "adds r10, r10, r6\n\t"
  54425. "adc r5, r5, r11\n\t"
  54426. "adds r10, r10, r4\n\t"
  54427. "str r10, [%[a], #472]\n\t"
  54428. "adc r5, r5, #0\n\t"
  54429. /* a[i+119] += m[119] * mu */
  54430. "ldr r7, [%[m], #476]\n\t"
  54431. "ldr r10, [%[a], #476]\n\t"
  54432. "lsr r11, r7, #16\n\t"
  54433. "lsr r6, r8, #16\n\t"
  54434. "mul r4, r6, r11\n\t"
  54435. "lsl r11, r7, #16\n\t"
  54436. "lsr r11, r11, #16\n\t"
  54437. "mul r6, r11, r6\n\t"
  54438. "lsr r11, r6, #16\n\t"
  54439. "lsl r6, r6, #16\n\t"
  54440. "adds r10, r10, r6\n\t"
  54441. "adc r4, r4, r11\n\t"
  54442. "lsl r6, r8, #16\n\t"
  54443. "lsl r11, r7, #16\n\t"
  54444. "lsr r6, r6, #16\n\t"
  54445. "lsr r11, r11, #16\n\t"
  54446. "mul r11, r6, r11\n\t"
  54447. "adds r10, r10, r11\n\t"
  54448. "adc r4, r4, #0\n\t"
  54449. "lsr r11, r7, #16\n\t"
  54450. "mul r6, r11, r6\n\t"
  54451. "lsr r11, r6, #16\n\t"
  54452. "lsl r6, r6, #16\n\t"
  54453. "adds r10, r10, r6\n\t"
  54454. "adc r4, r4, r11\n\t"
  54455. "adds r10, r10, r5\n\t"
  54456. "str r10, [%[a], #476]\n\t"
  54457. "adc r4, r4, #0\n\t"
  54458. /* a[i+120] += m[120] * mu */
  54459. "ldr r7, [%[m], #480]\n\t"
  54460. "ldr r10, [%[a], #480]\n\t"
  54461. "lsr r11, r7, #16\n\t"
  54462. "lsr r6, r8, #16\n\t"
  54463. "mul r5, r6, r11\n\t"
  54464. "lsl r11, r7, #16\n\t"
  54465. "lsr r11, r11, #16\n\t"
  54466. "mul r6, r11, r6\n\t"
  54467. "lsr r11, r6, #16\n\t"
  54468. "lsl r6, r6, #16\n\t"
  54469. "adds r10, r10, r6\n\t"
  54470. "adc r5, r5, r11\n\t"
  54471. "lsl r6, r8, #16\n\t"
  54472. "lsl r11, r7, #16\n\t"
  54473. "lsr r6, r6, #16\n\t"
  54474. "lsr r11, r11, #16\n\t"
  54475. "mul r11, r6, r11\n\t"
  54476. "adds r10, r10, r11\n\t"
  54477. "adc r5, r5, #0\n\t"
  54478. "lsr r11, r7, #16\n\t"
  54479. "mul r6, r11, r6\n\t"
  54480. "lsr r11, r6, #16\n\t"
  54481. "lsl r6, r6, #16\n\t"
  54482. "adds r10, r10, r6\n\t"
  54483. "adc r5, r5, r11\n\t"
  54484. "adds r10, r10, r4\n\t"
  54485. "str r10, [%[a], #480]\n\t"
  54486. "adc r5, r5, #0\n\t"
  54487. /* a[i+121] += m[121] * mu */
  54488. "ldr r7, [%[m], #484]\n\t"
  54489. "ldr r10, [%[a], #484]\n\t"
  54490. "lsr r11, r7, #16\n\t"
  54491. "lsr r6, r8, #16\n\t"
  54492. "mul r4, r6, r11\n\t"
  54493. "lsl r11, r7, #16\n\t"
  54494. "lsr r11, r11, #16\n\t"
  54495. "mul r6, r11, r6\n\t"
  54496. "lsr r11, r6, #16\n\t"
  54497. "lsl r6, r6, #16\n\t"
  54498. "adds r10, r10, r6\n\t"
  54499. "adc r4, r4, r11\n\t"
  54500. "lsl r6, r8, #16\n\t"
  54501. "lsl r11, r7, #16\n\t"
  54502. "lsr r6, r6, #16\n\t"
  54503. "lsr r11, r11, #16\n\t"
  54504. "mul r11, r6, r11\n\t"
  54505. "adds r10, r10, r11\n\t"
  54506. "adc r4, r4, #0\n\t"
  54507. "lsr r11, r7, #16\n\t"
  54508. "mul r6, r11, r6\n\t"
  54509. "lsr r11, r6, #16\n\t"
  54510. "lsl r6, r6, #16\n\t"
  54511. "adds r10, r10, r6\n\t"
  54512. "adc r4, r4, r11\n\t"
  54513. "adds r10, r10, r5\n\t"
  54514. "str r10, [%[a], #484]\n\t"
  54515. "adc r4, r4, #0\n\t"
  54516. /* a[i+122] += m[122] * mu */
  54517. "ldr r7, [%[m], #488]\n\t"
  54518. "ldr r10, [%[a], #488]\n\t"
  54519. "lsr r11, r7, #16\n\t"
  54520. "lsr r6, r8, #16\n\t"
  54521. "mul r5, r6, r11\n\t"
  54522. "lsl r11, r7, #16\n\t"
  54523. "lsr r11, r11, #16\n\t"
  54524. "mul r6, r11, r6\n\t"
  54525. "lsr r11, r6, #16\n\t"
  54526. "lsl r6, r6, #16\n\t"
  54527. "adds r10, r10, r6\n\t"
  54528. "adc r5, r5, r11\n\t"
  54529. "lsl r6, r8, #16\n\t"
  54530. "lsl r11, r7, #16\n\t"
  54531. "lsr r6, r6, #16\n\t"
  54532. "lsr r11, r11, #16\n\t"
  54533. "mul r11, r6, r11\n\t"
  54534. "adds r10, r10, r11\n\t"
  54535. "adc r5, r5, #0\n\t"
  54536. "lsr r11, r7, #16\n\t"
  54537. "mul r6, r11, r6\n\t"
  54538. "lsr r11, r6, #16\n\t"
  54539. "lsl r6, r6, #16\n\t"
  54540. "adds r10, r10, r6\n\t"
  54541. "adc r5, r5, r11\n\t"
  54542. "adds r10, r10, r4\n\t"
  54543. "str r10, [%[a], #488]\n\t"
  54544. "adc r5, r5, #0\n\t"
  54545. /* a[i+123] += m[123] * mu */
  54546. "ldr r7, [%[m], #492]\n\t"
  54547. "ldr r10, [%[a], #492]\n\t"
  54548. "lsr r11, r7, #16\n\t"
  54549. "lsr r6, r8, #16\n\t"
  54550. "mul r4, r6, r11\n\t"
  54551. "lsl r11, r7, #16\n\t"
  54552. "lsr r11, r11, #16\n\t"
  54553. "mul r6, r11, r6\n\t"
  54554. "lsr r11, r6, #16\n\t"
  54555. "lsl r6, r6, #16\n\t"
  54556. "adds r10, r10, r6\n\t"
  54557. "adc r4, r4, r11\n\t"
  54558. "lsl r6, r8, #16\n\t"
  54559. "lsl r11, r7, #16\n\t"
  54560. "lsr r6, r6, #16\n\t"
  54561. "lsr r11, r11, #16\n\t"
  54562. "mul r11, r6, r11\n\t"
  54563. "adds r10, r10, r11\n\t"
  54564. "adc r4, r4, #0\n\t"
  54565. "lsr r11, r7, #16\n\t"
  54566. "mul r6, r11, r6\n\t"
  54567. "lsr r11, r6, #16\n\t"
  54568. "lsl r6, r6, #16\n\t"
  54569. "adds r10, r10, r6\n\t"
  54570. "adc r4, r4, r11\n\t"
  54571. "adds r10, r10, r5\n\t"
  54572. "str r10, [%[a], #492]\n\t"
  54573. "adc r4, r4, #0\n\t"
  54574. /* a[i+124] += m[124] * mu */
  54575. "ldr r7, [%[m], #496]\n\t"
  54576. "ldr r10, [%[a], #496]\n\t"
  54577. "lsr r11, r7, #16\n\t"
  54578. "lsr r6, r8, #16\n\t"
  54579. "mul r5, r6, r11\n\t"
  54580. "lsl r11, r7, #16\n\t"
  54581. "lsr r11, r11, #16\n\t"
  54582. "mul r6, r11, r6\n\t"
  54583. "lsr r11, r6, #16\n\t"
  54584. "lsl r6, r6, #16\n\t"
  54585. "adds r10, r10, r6\n\t"
  54586. "adc r5, r5, r11\n\t"
  54587. "lsl r6, r8, #16\n\t"
  54588. "lsl r11, r7, #16\n\t"
  54589. "lsr r6, r6, #16\n\t"
  54590. "lsr r11, r11, #16\n\t"
  54591. "mul r11, r6, r11\n\t"
  54592. "adds r10, r10, r11\n\t"
  54593. "adc r5, r5, #0\n\t"
  54594. "lsr r11, r7, #16\n\t"
  54595. "mul r6, r11, r6\n\t"
  54596. "lsr r11, r6, #16\n\t"
  54597. "lsl r6, r6, #16\n\t"
  54598. "adds r10, r10, r6\n\t"
  54599. "adc r5, r5, r11\n\t"
  54600. "adds r10, r10, r4\n\t"
  54601. "str r10, [%[a], #496]\n\t"
  54602. "adc r5, r5, #0\n\t"
  54603. /* a[i+125] += m[125] * mu */
  54604. "ldr r7, [%[m], #500]\n\t"
  54605. "ldr r10, [%[a], #500]\n\t"
  54606. "lsr r11, r7, #16\n\t"
  54607. "lsr r6, r8, #16\n\t"
  54608. "mul r4, r6, r11\n\t"
  54609. "lsl r11, r7, #16\n\t"
  54610. "lsr r11, r11, #16\n\t"
  54611. "mul r6, r11, r6\n\t"
  54612. "lsr r11, r6, #16\n\t"
  54613. "lsl r6, r6, #16\n\t"
  54614. "adds r10, r10, r6\n\t"
  54615. "adc r4, r4, r11\n\t"
  54616. "lsl r6, r8, #16\n\t"
  54617. "lsl r11, r7, #16\n\t"
  54618. "lsr r6, r6, #16\n\t"
  54619. "lsr r11, r11, #16\n\t"
  54620. "mul r11, r6, r11\n\t"
  54621. "adds r10, r10, r11\n\t"
  54622. "adc r4, r4, #0\n\t"
  54623. "lsr r11, r7, #16\n\t"
  54624. "mul r6, r11, r6\n\t"
  54625. "lsr r11, r6, #16\n\t"
  54626. "lsl r6, r6, #16\n\t"
  54627. "adds r10, r10, r6\n\t"
  54628. "adc r4, r4, r11\n\t"
  54629. "adds r10, r10, r5\n\t"
  54630. "str r10, [%[a], #500]\n\t"
  54631. "adc r4, r4, #0\n\t"
  54632. /* a[i+126] += m[126] * mu */
  54633. "ldr r7, [%[m], #504]\n\t"
  54634. "ldr r10, [%[a], #504]\n\t"
  54635. "lsr r11, r7, #16\n\t"
  54636. "lsr r6, r8, #16\n\t"
  54637. "mul r5, r6, r11\n\t"
  54638. "lsl r11, r7, #16\n\t"
  54639. "lsr r11, r11, #16\n\t"
  54640. "mul r6, r11, r6\n\t"
  54641. "lsr r11, r6, #16\n\t"
  54642. "lsl r6, r6, #16\n\t"
  54643. "adds r10, r10, r6\n\t"
  54644. "adc r5, r5, r11\n\t"
  54645. "lsl r6, r8, #16\n\t"
  54646. "lsl r11, r7, #16\n\t"
  54647. "lsr r6, r6, #16\n\t"
  54648. "lsr r11, r11, #16\n\t"
  54649. "mul r11, r6, r11\n\t"
  54650. "adds r10, r10, r11\n\t"
  54651. "adc r5, r5, #0\n\t"
  54652. "lsr r11, r7, #16\n\t"
  54653. "mul r6, r11, r6\n\t"
  54654. "lsr r11, r6, #16\n\t"
  54655. "lsl r6, r6, #16\n\t"
  54656. "adds r10, r10, r6\n\t"
  54657. "adc r5, r5, r11\n\t"
  54658. "adds r10, r10, r4\n\t"
  54659. "str r10, [%[a], #504]\n\t"
  54660. "adc r5, r5, #0\n\t"
  54661. /* a[i+127] += m[127] * mu */
  54662. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  54663. "ldr r11, [%[m], #508]\n\t"
  54664. #else
  54665. "ldr r7, [%[m], #508]\n\t"
  54666. #endif
  54667. "ldr r10, [%[a], #508]\n\t"
  54668. "lsl r6, r8, #16\n\t"
  54669. "lsl r7, r11, #16\n\t"
  54670. "lsr r6, r6, #16\n\t"
  54671. "lsr r7, r7, #16\n\t"
  54672. "mul r7, r6, r7\n\t"
  54673. "adds r5, r5, r7\n\t"
  54674. "adcs r4, r3, #0\n\t"
  54675. "mov r3, #0\n\t"
  54676. "adc r3, r3, r3\n\t"
  54677. "lsr r7, r11, #16\n\t"
  54678. "mul r6, r7, r6\n\t"
  54679. "lsr r7, r6, #16\n\t"
  54680. "lsl r6, r6, #16\n\t"
  54681. "adds r5, r5, r6\n\t"
  54682. "adcs r4, r4, r7\n\t"
  54683. "adc r3, r3, #0\n\t"
  54684. "mov r6, r8\n\t"
  54685. "lsr r7, r11, #16\n\t"
  54686. "lsr r6, r6, #16\n\t"
  54687. "mul r7, r6, r7\n\t"
  54688. "adds r4, r4, r7\n\t"
  54689. "lsl r7, r11, #16\n\t"
  54690. "adc r3, r3, #0\n\t"
  54691. "lsr r7, r7, #16\n\t"
  54692. "mul r6, r7, r6\n\t"
  54693. "lsr r7, r6, #16\n\t"
  54694. "lsl r6, r6, #16\n\t"
  54695. "adds r5, r5, r6\n\t"
  54696. "adcs r4, r4, r7\n\t"
  54697. "adc r3, r3, #0\n\t"
  54698. "adds r10, r10, r5\n\t"
  54699. "str r10, [%[a], #508]\n\t"
  54700. "ldr r10, [%[a], #512]\n\t"
  54701. "adcs r10, r10, r4\n\t"
  54702. "str r10, [%[a], #512]\n\t"
  54703. "adc r3, r3, #0\n\t"
  54704. /* i += 1 */
  54705. "add r9, r9, #4\n\t"
  54706. "add %[a], %[a], #4\n\t"
  54707. "cmp r9, #0x200\n\t"
  54708. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  54709. /* Loop Done */
  54710. "str r12, [%[a]]\n\t"
  54711. "str lr, [%[a], #4]\n\t"
  54712. "mov %[mp], r3\n\t"
  54713. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  54714. :
  54715. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  54716. );
  54717. sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp);
  54718. }
  54719. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  54720. /* Reduce the number back to 4096 bits using Montgomery reduction.
  54721. *
  54722. * a A single precision number to reduce in place.
  54723. * m The single precision number representing the modulus.
  54724. * mp The digit representing the negative inverse of m mod 2^n.
  54725. */
  54726. static SP_NOINLINE void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  54727. {
  54728. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  54729. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  54730. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  54731. __asm__ __volatile__ (
  54732. "ldr r11, [%[m]]\n\t"
  54733. /* i = 0 */
  54734. "mov r9, #0\n\t"
  54735. "mov r3, #0\n\t"
  54736. "ldr r12, [%[a]]\n\t"
  54737. "ldr lr, [%[a], #4]\n\t"
  54738. "\n"
  54739. "L_sp_4096_mont_reduce_128_word_%=: \n\t"
  54740. /* mu = a[i] * mp */
  54741. "mul r8, %[mp], r12\n\t"
  54742. /* a[i+0] += m[0] * mu */
  54743. "mov r5, #0\n\t"
  54744. "umlal r12, r5, r8, r11\n\t"
  54745. /* a[i+1] += m[1] * mu */
  54746. "ldr r7, [%[m], #4]\n\t"
  54747. "mov r4, #0\n\t"
  54748. "umlal lr, r4, r8, r7\n\t"
  54749. "mov r12, lr\n\t"
  54750. "adds r12, r12, r5\n\t"
  54751. "adc r4, r4, #0\n\t"
  54752. /* a[i+2] += m[2] * mu */
  54753. "ldr r7, [%[m], #8]\n\t"
  54754. "ldr lr, [%[a], #8]\n\t"
  54755. "mov r5, #0\n\t"
  54756. "umlal lr, r5, r8, r7\n\t"
  54757. "adds lr, lr, r4\n\t"
  54758. "adc r5, r5, #0\n\t"
  54759. /* a[i+3] += m[3] * mu */
  54760. "ldr r7, [%[m], #12]\n\t"
  54761. "ldr r10, [%[a], #12]\n\t"
  54762. "mov r4, #0\n\t"
  54763. "umlal r10, r4, r8, r7\n\t"
  54764. "adds r10, r10, r5\n\t"
  54765. "str r10, [%[a], #12]\n\t"
  54766. "adc r4, r4, #0\n\t"
  54767. /* a[i+4] += m[4] * mu */
  54768. "ldr r7, [%[m], #16]\n\t"
  54769. "ldr r10, [%[a], #16]\n\t"
  54770. "mov r5, #0\n\t"
  54771. "umlal r10, r5, r8, r7\n\t"
  54772. "adds r10, r10, r4\n\t"
  54773. "str r10, [%[a], #16]\n\t"
  54774. "adc r5, r5, #0\n\t"
  54775. /* a[i+5] += m[5] * mu */
  54776. "ldr r7, [%[m], #20]\n\t"
  54777. "ldr r10, [%[a], #20]\n\t"
  54778. "mov r4, #0\n\t"
  54779. "umlal r10, r4, r8, r7\n\t"
  54780. "adds r10, r10, r5\n\t"
  54781. "str r10, [%[a], #20]\n\t"
  54782. "adc r4, r4, #0\n\t"
  54783. /* a[i+6] += m[6] * mu */
  54784. "ldr r7, [%[m], #24]\n\t"
  54785. "ldr r10, [%[a], #24]\n\t"
  54786. "mov r5, #0\n\t"
  54787. "umlal r10, r5, r8, r7\n\t"
  54788. "adds r10, r10, r4\n\t"
  54789. "str r10, [%[a], #24]\n\t"
  54790. "adc r5, r5, #0\n\t"
  54791. /* a[i+7] += m[7] * mu */
  54792. "ldr r7, [%[m], #28]\n\t"
  54793. "ldr r10, [%[a], #28]\n\t"
  54794. "mov r4, #0\n\t"
  54795. "umlal r10, r4, r8, r7\n\t"
  54796. "adds r10, r10, r5\n\t"
  54797. "str r10, [%[a], #28]\n\t"
  54798. "adc r4, r4, #0\n\t"
  54799. /* a[i+8] += m[8] * mu */
  54800. "ldr r7, [%[m], #32]\n\t"
  54801. "ldr r10, [%[a], #32]\n\t"
  54802. "mov r5, #0\n\t"
  54803. "umlal r10, r5, r8, r7\n\t"
  54804. "adds r10, r10, r4\n\t"
  54805. "str r10, [%[a], #32]\n\t"
  54806. "adc r5, r5, #0\n\t"
  54807. /* a[i+9] += m[9] * mu */
  54808. "ldr r7, [%[m], #36]\n\t"
  54809. "ldr r10, [%[a], #36]\n\t"
  54810. "mov r4, #0\n\t"
  54811. "umlal r10, r4, r8, r7\n\t"
  54812. "adds r10, r10, r5\n\t"
  54813. "str r10, [%[a], #36]\n\t"
  54814. "adc r4, r4, #0\n\t"
  54815. /* a[i+10] += m[10] * mu */
  54816. "ldr r7, [%[m], #40]\n\t"
  54817. "ldr r10, [%[a], #40]\n\t"
  54818. "mov r5, #0\n\t"
  54819. "umlal r10, r5, r8, r7\n\t"
  54820. "adds r10, r10, r4\n\t"
  54821. "str r10, [%[a], #40]\n\t"
  54822. "adc r5, r5, #0\n\t"
  54823. /* a[i+11] += m[11] * mu */
  54824. "ldr r7, [%[m], #44]\n\t"
  54825. "ldr r10, [%[a], #44]\n\t"
  54826. "mov r4, #0\n\t"
  54827. "umlal r10, r4, r8, r7\n\t"
  54828. "adds r10, r10, r5\n\t"
  54829. "str r10, [%[a], #44]\n\t"
  54830. "adc r4, r4, #0\n\t"
  54831. /* a[i+12] += m[12] * mu */
  54832. "ldr r7, [%[m], #48]\n\t"
  54833. "ldr r10, [%[a], #48]\n\t"
  54834. "mov r5, #0\n\t"
  54835. "umlal r10, r5, r8, r7\n\t"
  54836. "adds r10, r10, r4\n\t"
  54837. "str r10, [%[a], #48]\n\t"
  54838. "adc r5, r5, #0\n\t"
  54839. /* a[i+13] += m[13] * mu */
  54840. "ldr r7, [%[m], #52]\n\t"
  54841. "ldr r10, [%[a], #52]\n\t"
  54842. "mov r4, #0\n\t"
  54843. "umlal r10, r4, r8, r7\n\t"
  54844. "adds r10, r10, r5\n\t"
  54845. "str r10, [%[a], #52]\n\t"
  54846. "adc r4, r4, #0\n\t"
  54847. /* a[i+14] += m[14] * mu */
  54848. "ldr r7, [%[m], #56]\n\t"
  54849. "ldr r10, [%[a], #56]\n\t"
  54850. "mov r5, #0\n\t"
  54851. "umlal r10, r5, r8, r7\n\t"
  54852. "adds r10, r10, r4\n\t"
  54853. "str r10, [%[a], #56]\n\t"
  54854. "adc r5, r5, #0\n\t"
  54855. /* a[i+15] += m[15] * mu */
  54856. "ldr r7, [%[m], #60]\n\t"
  54857. "ldr r10, [%[a], #60]\n\t"
  54858. "mov r4, #0\n\t"
  54859. "umlal r10, r4, r8, r7\n\t"
  54860. "adds r10, r10, r5\n\t"
  54861. "str r10, [%[a], #60]\n\t"
  54862. "adc r4, r4, #0\n\t"
  54863. /* a[i+16] += m[16] * mu */
  54864. "ldr r7, [%[m], #64]\n\t"
  54865. "ldr r10, [%[a], #64]\n\t"
  54866. "mov r5, #0\n\t"
  54867. "umlal r10, r5, r8, r7\n\t"
  54868. "adds r10, r10, r4\n\t"
  54869. "str r10, [%[a], #64]\n\t"
  54870. "adc r5, r5, #0\n\t"
  54871. /* a[i+17] += m[17] * mu */
  54872. "ldr r7, [%[m], #68]\n\t"
  54873. "ldr r10, [%[a], #68]\n\t"
  54874. "mov r4, #0\n\t"
  54875. "umlal r10, r4, r8, r7\n\t"
  54876. "adds r10, r10, r5\n\t"
  54877. "str r10, [%[a], #68]\n\t"
  54878. "adc r4, r4, #0\n\t"
  54879. /* a[i+18] += m[18] * mu */
  54880. "ldr r7, [%[m], #72]\n\t"
  54881. "ldr r10, [%[a], #72]\n\t"
  54882. "mov r5, #0\n\t"
  54883. "umlal r10, r5, r8, r7\n\t"
  54884. "adds r10, r10, r4\n\t"
  54885. "str r10, [%[a], #72]\n\t"
  54886. "adc r5, r5, #0\n\t"
  54887. /* a[i+19] += m[19] * mu */
  54888. "ldr r7, [%[m], #76]\n\t"
  54889. "ldr r10, [%[a], #76]\n\t"
  54890. "mov r4, #0\n\t"
  54891. "umlal r10, r4, r8, r7\n\t"
  54892. "adds r10, r10, r5\n\t"
  54893. "str r10, [%[a], #76]\n\t"
  54894. "adc r4, r4, #0\n\t"
  54895. /* a[i+20] += m[20] * mu */
  54896. "ldr r7, [%[m], #80]\n\t"
  54897. "ldr r10, [%[a], #80]\n\t"
  54898. "mov r5, #0\n\t"
  54899. "umlal r10, r5, r8, r7\n\t"
  54900. "adds r10, r10, r4\n\t"
  54901. "str r10, [%[a], #80]\n\t"
  54902. "adc r5, r5, #0\n\t"
  54903. /* a[i+21] += m[21] * mu */
  54904. "ldr r7, [%[m], #84]\n\t"
  54905. "ldr r10, [%[a], #84]\n\t"
  54906. "mov r4, #0\n\t"
  54907. "umlal r10, r4, r8, r7\n\t"
  54908. "adds r10, r10, r5\n\t"
  54909. "str r10, [%[a], #84]\n\t"
  54910. "adc r4, r4, #0\n\t"
  54911. /* a[i+22] += m[22] * mu */
  54912. "ldr r7, [%[m], #88]\n\t"
  54913. "ldr r10, [%[a], #88]\n\t"
  54914. "mov r5, #0\n\t"
  54915. "umlal r10, r5, r8, r7\n\t"
  54916. "adds r10, r10, r4\n\t"
  54917. "str r10, [%[a], #88]\n\t"
  54918. "adc r5, r5, #0\n\t"
  54919. /* a[i+23] += m[23] * mu */
  54920. "ldr r7, [%[m], #92]\n\t"
  54921. "ldr r10, [%[a], #92]\n\t"
  54922. "mov r4, #0\n\t"
  54923. "umlal r10, r4, r8, r7\n\t"
  54924. "adds r10, r10, r5\n\t"
  54925. "str r10, [%[a], #92]\n\t"
  54926. "adc r4, r4, #0\n\t"
  54927. /* a[i+24] += m[24] * mu */
  54928. "ldr r7, [%[m], #96]\n\t"
  54929. "ldr r10, [%[a], #96]\n\t"
  54930. "mov r5, #0\n\t"
  54931. "umlal r10, r5, r8, r7\n\t"
  54932. "adds r10, r10, r4\n\t"
  54933. "str r10, [%[a], #96]\n\t"
  54934. "adc r5, r5, #0\n\t"
  54935. /* a[i+25] += m[25] * mu */
  54936. "ldr r7, [%[m], #100]\n\t"
  54937. "ldr r10, [%[a], #100]\n\t"
  54938. "mov r4, #0\n\t"
  54939. "umlal r10, r4, r8, r7\n\t"
  54940. "adds r10, r10, r5\n\t"
  54941. "str r10, [%[a], #100]\n\t"
  54942. "adc r4, r4, #0\n\t"
  54943. /* a[i+26] += m[26] * mu */
  54944. "ldr r7, [%[m], #104]\n\t"
  54945. "ldr r10, [%[a], #104]\n\t"
  54946. "mov r5, #0\n\t"
  54947. "umlal r10, r5, r8, r7\n\t"
  54948. "adds r10, r10, r4\n\t"
  54949. "str r10, [%[a], #104]\n\t"
  54950. "adc r5, r5, #0\n\t"
  54951. /* a[i+27] += m[27] * mu */
  54952. "ldr r7, [%[m], #108]\n\t"
  54953. "ldr r10, [%[a], #108]\n\t"
  54954. "mov r4, #0\n\t"
  54955. "umlal r10, r4, r8, r7\n\t"
  54956. "adds r10, r10, r5\n\t"
  54957. "str r10, [%[a], #108]\n\t"
  54958. "adc r4, r4, #0\n\t"
  54959. /* a[i+28] += m[28] * mu */
  54960. "ldr r7, [%[m], #112]\n\t"
  54961. "ldr r10, [%[a], #112]\n\t"
  54962. "mov r5, #0\n\t"
  54963. "umlal r10, r5, r8, r7\n\t"
  54964. "adds r10, r10, r4\n\t"
  54965. "str r10, [%[a], #112]\n\t"
  54966. "adc r5, r5, #0\n\t"
  54967. /* a[i+29] += m[29] * mu */
  54968. "ldr r7, [%[m], #116]\n\t"
  54969. "ldr r10, [%[a], #116]\n\t"
  54970. "mov r4, #0\n\t"
  54971. "umlal r10, r4, r8, r7\n\t"
  54972. "adds r10, r10, r5\n\t"
  54973. "str r10, [%[a], #116]\n\t"
  54974. "adc r4, r4, #0\n\t"
  54975. /* a[i+30] += m[30] * mu */
  54976. "ldr r7, [%[m], #120]\n\t"
  54977. "ldr r10, [%[a], #120]\n\t"
  54978. "mov r5, #0\n\t"
  54979. "umlal r10, r5, r8, r7\n\t"
  54980. "adds r10, r10, r4\n\t"
  54981. "str r10, [%[a], #120]\n\t"
  54982. "adc r5, r5, #0\n\t"
  54983. /* a[i+31] += m[31] * mu */
  54984. "ldr r7, [%[m], #124]\n\t"
  54985. "ldr r10, [%[a], #124]\n\t"
  54986. "mov r4, #0\n\t"
  54987. "umlal r10, r4, r8, r7\n\t"
  54988. "adds r10, r10, r5\n\t"
  54989. "str r10, [%[a], #124]\n\t"
  54990. "adc r4, r4, #0\n\t"
  54991. /* a[i+32] += m[32] * mu */
  54992. "ldr r7, [%[m], #128]\n\t"
  54993. "ldr r10, [%[a], #128]\n\t"
  54994. "mov r5, #0\n\t"
  54995. "umlal r10, r5, r8, r7\n\t"
  54996. "adds r10, r10, r4\n\t"
  54997. "str r10, [%[a], #128]\n\t"
  54998. "adc r5, r5, #0\n\t"
  54999. /* a[i+33] += m[33] * mu */
  55000. "ldr r7, [%[m], #132]\n\t"
  55001. "ldr r10, [%[a], #132]\n\t"
  55002. "mov r4, #0\n\t"
  55003. "umlal r10, r4, r8, r7\n\t"
  55004. "adds r10, r10, r5\n\t"
  55005. "str r10, [%[a], #132]\n\t"
  55006. "adc r4, r4, #0\n\t"
  55007. /* a[i+34] += m[34] * mu */
  55008. "ldr r7, [%[m], #136]\n\t"
  55009. "ldr r10, [%[a], #136]\n\t"
  55010. "mov r5, #0\n\t"
  55011. "umlal r10, r5, r8, r7\n\t"
  55012. "adds r10, r10, r4\n\t"
  55013. "str r10, [%[a], #136]\n\t"
  55014. "adc r5, r5, #0\n\t"
  55015. /* a[i+35] += m[35] * mu */
  55016. "ldr r7, [%[m], #140]\n\t"
  55017. "ldr r10, [%[a], #140]\n\t"
  55018. "mov r4, #0\n\t"
  55019. "umlal r10, r4, r8, r7\n\t"
  55020. "adds r10, r10, r5\n\t"
  55021. "str r10, [%[a], #140]\n\t"
  55022. "adc r4, r4, #0\n\t"
  55023. /* a[i+36] += m[36] * mu */
  55024. "ldr r7, [%[m], #144]\n\t"
  55025. "ldr r10, [%[a], #144]\n\t"
  55026. "mov r5, #0\n\t"
  55027. "umlal r10, r5, r8, r7\n\t"
  55028. "adds r10, r10, r4\n\t"
  55029. "str r10, [%[a], #144]\n\t"
  55030. "adc r5, r5, #0\n\t"
  55031. /* a[i+37] += m[37] * mu */
  55032. "ldr r7, [%[m], #148]\n\t"
  55033. "ldr r10, [%[a], #148]\n\t"
  55034. "mov r4, #0\n\t"
  55035. "umlal r10, r4, r8, r7\n\t"
  55036. "adds r10, r10, r5\n\t"
  55037. "str r10, [%[a], #148]\n\t"
  55038. "adc r4, r4, #0\n\t"
  55039. /* a[i+38] += m[38] * mu */
  55040. "ldr r7, [%[m], #152]\n\t"
  55041. "ldr r10, [%[a], #152]\n\t"
  55042. "mov r5, #0\n\t"
  55043. "umlal r10, r5, r8, r7\n\t"
  55044. "adds r10, r10, r4\n\t"
  55045. "str r10, [%[a], #152]\n\t"
  55046. "adc r5, r5, #0\n\t"
  55047. /* a[i+39] += m[39] * mu */
  55048. "ldr r7, [%[m], #156]\n\t"
  55049. "ldr r10, [%[a], #156]\n\t"
  55050. "mov r4, #0\n\t"
  55051. "umlal r10, r4, r8, r7\n\t"
  55052. "adds r10, r10, r5\n\t"
  55053. "str r10, [%[a], #156]\n\t"
  55054. "adc r4, r4, #0\n\t"
  55055. /* a[i+40] += m[40] * mu */
  55056. "ldr r7, [%[m], #160]\n\t"
  55057. "ldr r10, [%[a], #160]\n\t"
  55058. "mov r5, #0\n\t"
  55059. "umlal r10, r5, r8, r7\n\t"
  55060. "adds r10, r10, r4\n\t"
  55061. "str r10, [%[a], #160]\n\t"
  55062. "adc r5, r5, #0\n\t"
  55063. /* a[i+41] += m[41] * mu */
  55064. "ldr r7, [%[m], #164]\n\t"
  55065. "ldr r10, [%[a], #164]\n\t"
  55066. "mov r4, #0\n\t"
  55067. "umlal r10, r4, r8, r7\n\t"
  55068. "adds r10, r10, r5\n\t"
  55069. "str r10, [%[a], #164]\n\t"
  55070. "adc r4, r4, #0\n\t"
  55071. /* a[i+42] += m[42] * mu */
  55072. "ldr r7, [%[m], #168]\n\t"
  55073. "ldr r10, [%[a], #168]\n\t"
  55074. "mov r5, #0\n\t"
  55075. "umlal r10, r5, r8, r7\n\t"
  55076. "adds r10, r10, r4\n\t"
  55077. "str r10, [%[a], #168]\n\t"
  55078. "adc r5, r5, #0\n\t"
  55079. /* a[i+43] += m[43] * mu */
  55080. "ldr r7, [%[m], #172]\n\t"
  55081. "ldr r10, [%[a], #172]\n\t"
  55082. "mov r4, #0\n\t"
  55083. "umlal r10, r4, r8, r7\n\t"
  55084. "adds r10, r10, r5\n\t"
  55085. "str r10, [%[a], #172]\n\t"
  55086. "adc r4, r4, #0\n\t"
  55087. /* a[i+44] += m[44] * mu */
  55088. "ldr r7, [%[m], #176]\n\t"
  55089. "ldr r10, [%[a], #176]\n\t"
  55090. "mov r5, #0\n\t"
  55091. "umlal r10, r5, r8, r7\n\t"
  55092. "adds r10, r10, r4\n\t"
  55093. "str r10, [%[a], #176]\n\t"
  55094. "adc r5, r5, #0\n\t"
  55095. /* a[i+45] += m[45] * mu */
  55096. "ldr r7, [%[m], #180]\n\t"
  55097. "ldr r10, [%[a], #180]\n\t"
  55098. "mov r4, #0\n\t"
  55099. "umlal r10, r4, r8, r7\n\t"
  55100. "adds r10, r10, r5\n\t"
  55101. "str r10, [%[a], #180]\n\t"
  55102. "adc r4, r4, #0\n\t"
  55103. /* a[i+46] += m[46] * mu */
  55104. "ldr r7, [%[m], #184]\n\t"
  55105. "ldr r10, [%[a], #184]\n\t"
  55106. "mov r5, #0\n\t"
  55107. "umlal r10, r5, r8, r7\n\t"
  55108. "adds r10, r10, r4\n\t"
  55109. "str r10, [%[a], #184]\n\t"
  55110. "adc r5, r5, #0\n\t"
  55111. /* a[i+47] += m[47] * mu */
  55112. "ldr r7, [%[m], #188]\n\t"
  55113. "ldr r10, [%[a], #188]\n\t"
  55114. "mov r4, #0\n\t"
  55115. "umlal r10, r4, r8, r7\n\t"
  55116. "adds r10, r10, r5\n\t"
  55117. "str r10, [%[a], #188]\n\t"
  55118. "adc r4, r4, #0\n\t"
  55119. /* a[i+48] += m[48] * mu */
  55120. "ldr r7, [%[m], #192]\n\t"
  55121. "ldr r10, [%[a], #192]\n\t"
  55122. "mov r5, #0\n\t"
  55123. "umlal r10, r5, r8, r7\n\t"
  55124. "adds r10, r10, r4\n\t"
  55125. "str r10, [%[a], #192]\n\t"
  55126. "adc r5, r5, #0\n\t"
  55127. /* a[i+49] += m[49] * mu */
  55128. "ldr r7, [%[m], #196]\n\t"
  55129. "ldr r10, [%[a], #196]\n\t"
  55130. "mov r4, #0\n\t"
  55131. "umlal r10, r4, r8, r7\n\t"
  55132. "adds r10, r10, r5\n\t"
  55133. "str r10, [%[a], #196]\n\t"
  55134. "adc r4, r4, #0\n\t"
  55135. /* a[i+50] += m[50] * mu */
  55136. "ldr r7, [%[m], #200]\n\t"
  55137. "ldr r10, [%[a], #200]\n\t"
  55138. "mov r5, #0\n\t"
  55139. "umlal r10, r5, r8, r7\n\t"
  55140. "adds r10, r10, r4\n\t"
  55141. "str r10, [%[a], #200]\n\t"
  55142. "adc r5, r5, #0\n\t"
  55143. /* a[i+51] += m[51] * mu */
  55144. "ldr r7, [%[m], #204]\n\t"
  55145. "ldr r10, [%[a], #204]\n\t"
  55146. "mov r4, #0\n\t"
  55147. "umlal r10, r4, r8, r7\n\t"
  55148. "adds r10, r10, r5\n\t"
  55149. "str r10, [%[a], #204]\n\t"
  55150. "adc r4, r4, #0\n\t"
  55151. /* a[i+52] += m[52] * mu */
  55152. "ldr r7, [%[m], #208]\n\t"
  55153. "ldr r10, [%[a], #208]\n\t"
  55154. "mov r5, #0\n\t"
  55155. "umlal r10, r5, r8, r7\n\t"
  55156. "adds r10, r10, r4\n\t"
  55157. "str r10, [%[a], #208]\n\t"
  55158. "adc r5, r5, #0\n\t"
  55159. /* a[i+53] += m[53] * mu */
  55160. "ldr r7, [%[m], #212]\n\t"
  55161. "ldr r10, [%[a], #212]\n\t"
  55162. "mov r4, #0\n\t"
  55163. "umlal r10, r4, r8, r7\n\t"
  55164. "adds r10, r10, r5\n\t"
  55165. "str r10, [%[a], #212]\n\t"
  55166. "adc r4, r4, #0\n\t"
  55167. /* a[i+54] += m[54] * mu */
  55168. "ldr r7, [%[m], #216]\n\t"
  55169. "ldr r10, [%[a], #216]\n\t"
  55170. "mov r5, #0\n\t"
  55171. "umlal r10, r5, r8, r7\n\t"
  55172. "adds r10, r10, r4\n\t"
  55173. "str r10, [%[a], #216]\n\t"
  55174. "adc r5, r5, #0\n\t"
  55175. /* a[i+55] += m[55] * mu */
  55176. "ldr r7, [%[m], #220]\n\t"
  55177. "ldr r10, [%[a], #220]\n\t"
  55178. "mov r4, #0\n\t"
  55179. "umlal r10, r4, r8, r7\n\t"
  55180. "adds r10, r10, r5\n\t"
  55181. "str r10, [%[a], #220]\n\t"
  55182. "adc r4, r4, #0\n\t"
  55183. /* a[i+56] += m[56] * mu */
  55184. "ldr r7, [%[m], #224]\n\t"
  55185. "ldr r10, [%[a], #224]\n\t"
  55186. "mov r5, #0\n\t"
  55187. "umlal r10, r5, r8, r7\n\t"
  55188. "adds r10, r10, r4\n\t"
  55189. "str r10, [%[a], #224]\n\t"
  55190. "adc r5, r5, #0\n\t"
  55191. /* a[i+57] += m[57] * mu */
  55192. "ldr r7, [%[m], #228]\n\t"
  55193. "ldr r10, [%[a], #228]\n\t"
  55194. "mov r4, #0\n\t"
  55195. "umlal r10, r4, r8, r7\n\t"
  55196. "adds r10, r10, r5\n\t"
  55197. "str r10, [%[a], #228]\n\t"
  55198. "adc r4, r4, #0\n\t"
  55199. /* a[i+58] += m[58] * mu */
  55200. "ldr r7, [%[m], #232]\n\t"
  55201. "ldr r10, [%[a], #232]\n\t"
  55202. "mov r5, #0\n\t"
  55203. "umlal r10, r5, r8, r7\n\t"
  55204. "adds r10, r10, r4\n\t"
  55205. "str r10, [%[a], #232]\n\t"
  55206. "adc r5, r5, #0\n\t"
  55207. /* a[i+59] += m[59] * mu */
  55208. "ldr r7, [%[m], #236]\n\t"
  55209. "ldr r10, [%[a], #236]\n\t"
  55210. "mov r4, #0\n\t"
  55211. "umlal r10, r4, r8, r7\n\t"
  55212. "adds r10, r10, r5\n\t"
  55213. "str r10, [%[a], #236]\n\t"
  55214. "adc r4, r4, #0\n\t"
  55215. /* a[i+60] += m[60] * mu */
  55216. "ldr r7, [%[m], #240]\n\t"
  55217. "ldr r10, [%[a], #240]\n\t"
  55218. "mov r5, #0\n\t"
  55219. "umlal r10, r5, r8, r7\n\t"
  55220. "adds r10, r10, r4\n\t"
  55221. "str r10, [%[a], #240]\n\t"
  55222. "adc r5, r5, #0\n\t"
  55223. /* a[i+61] += m[61] * mu */
  55224. "ldr r7, [%[m], #244]\n\t"
  55225. "ldr r10, [%[a], #244]\n\t"
  55226. "mov r4, #0\n\t"
  55227. "umlal r10, r4, r8, r7\n\t"
  55228. "adds r10, r10, r5\n\t"
  55229. "str r10, [%[a], #244]\n\t"
  55230. "adc r4, r4, #0\n\t"
  55231. /* a[i+62] += m[62] * mu */
  55232. "ldr r7, [%[m], #248]\n\t"
  55233. "ldr r10, [%[a], #248]\n\t"
  55234. "mov r5, #0\n\t"
  55235. "umlal r10, r5, r8, r7\n\t"
  55236. "adds r10, r10, r4\n\t"
  55237. "str r10, [%[a], #248]\n\t"
  55238. "adc r5, r5, #0\n\t"
  55239. /* a[i+63] += m[63] * mu */
  55240. "ldr r7, [%[m], #252]\n\t"
  55241. "ldr r10, [%[a], #252]\n\t"
  55242. "mov r4, #0\n\t"
  55243. "umlal r10, r4, r8, r7\n\t"
  55244. "adds r10, r10, r5\n\t"
  55245. "str r10, [%[a], #252]\n\t"
  55246. "adc r4, r4, #0\n\t"
  55247. /* a[i+64] += m[64] * mu */
  55248. "ldr r7, [%[m], #256]\n\t"
  55249. "ldr r10, [%[a], #256]\n\t"
  55250. "mov r5, #0\n\t"
  55251. "umlal r10, r5, r8, r7\n\t"
  55252. "adds r10, r10, r4\n\t"
  55253. "str r10, [%[a], #256]\n\t"
  55254. "adc r5, r5, #0\n\t"
  55255. /* a[i+65] += m[65] * mu */
  55256. "ldr r7, [%[m], #260]\n\t"
  55257. "ldr r10, [%[a], #260]\n\t"
  55258. "mov r4, #0\n\t"
  55259. "umlal r10, r4, r8, r7\n\t"
  55260. "adds r10, r10, r5\n\t"
  55261. "str r10, [%[a], #260]\n\t"
  55262. "adc r4, r4, #0\n\t"
  55263. /* a[i+66] += m[66] * mu */
  55264. "ldr r7, [%[m], #264]\n\t"
  55265. "ldr r10, [%[a], #264]\n\t"
  55266. "mov r5, #0\n\t"
  55267. "umlal r10, r5, r8, r7\n\t"
  55268. "adds r10, r10, r4\n\t"
  55269. "str r10, [%[a], #264]\n\t"
  55270. "adc r5, r5, #0\n\t"
  55271. /* a[i+67] += m[67] * mu */
  55272. "ldr r7, [%[m], #268]\n\t"
  55273. "ldr r10, [%[a], #268]\n\t"
  55274. "mov r4, #0\n\t"
  55275. "umlal r10, r4, r8, r7\n\t"
  55276. "adds r10, r10, r5\n\t"
  55277. "str r10, [%[a], #268]\n\t"
  55278. "adc r4, r4, #0\n\t"
  55279. /* a[i+68] += m[68] * mu */
  55280. "ldr r7, [%[m], #272]\n\t"
  55281. "ldr r10, [%[a], #272]\n\t"
  55282. "mov r5, #0\n\t"
  55283. "umlal r10, r5, r8, r7\n\t"
  55284. "adds r10, r10, r4\n\t"
  55285. "str r10, [%[a], #272]\n\t"
  55286. "adc r5, r5, #0\n\t"
  55287. /* a[i+69] += m[69] * mu */
  55288. "ldr r7, [%[m], #276]\n\t"
  55289. "ldr r10, [%[a], #276]\n\t"
  55290. "mov r4, #0\n\t"
  55291. "umlal r10, r4, r8, r7\n\t"
  55292. "adds r10, r10, r5\n\t"
  55293. "str r10, [%[a], #276]\n\t"
  55294. "adc r4, r4, #0\n\t"
  55295. /* a[i+70] += m[70] * mu */
  55296. "ldr r7, [%[m], #280]\n\t"
  55297. "ldr r10, [%[a], #280]\n\t"
  55298. "mov r5, #0\n\t"
  55299. "umlal r10, r5, r8, r7\n\t"
  55300. "adds r10, r10, r4\n\t"
  55301. "str r10, [%[a], #280]\n\t"
  55302. "adc r5, r5, #0\n\t"
  55303. /* a[i+71] += m[71] * mu */
  55304. "ldr r7, [%[m], #284]\n\t"
  55305. "ldr r10, [%[a], #284]\n\t"
  55306. "mov r4, #0\n\t"
  55307. "umlal r10, r4, r8, r7\n\t"
  55308. "adds r10, r10, r5\n\t"
  55309. "str r10, [%[a], #284]\n\t"
  55310. "adc r4, r4, #0\n\t"
  55311. /* a[i+72] += m[72] * mu */
  55312. "ldr r7, [%[m], #288]\n\t"
  55313. "ldr r10, [%[a], #288]\n\t"
  55314. "mov r5, #0\n\t"
  55315. "umlal r10, r5, r8, r7\n\t"
  55316. "adds r10, r10, r4\n\t"
  55317. "str r10, [%[a], #288]\n\t"
  55318. "adc r5, r5, #0\n\t"
  55319. /* a[i+73] += m[73] * mu */
  55320. "ldr r7, [%[m], #292]\n\t"
  55321. "ldr r10, [%[a], #292]\n\t"
  55322. "mov r4, #0\n\t"
  55323. "umlal r10, r4, r8, r7\n\t"
  55324. "adds r10, r10, r5\n\t"
  55325. "str r10, [%[a], #292]\n\t"
  55326. "adc r4, r4, #0\n\t"
  55327. /* a[i+74] += m[74] * mu */
  55328. "ldr r7, [%[m], #296]\n\t"
  55329. "ldr r10, [%[a], #296]\n\t"
  55330. "mov r5, #0\n\t"
  55331. "umlal r10, r5, r8, r7\n\t"
  55332. "adds r10, r10, r4\n\t"
  55333. "str r10, [%[a], #296]\n\t"
  55334. "adc r5, r5, #0\n\t"
  55335. /* a[i+75] += m[75] * mu */
  55336. "ldr r7, [%[m], #300]\n\t"
  55337. "ldr r10, [%[a], #300]\n\t"
  55338. "mov r4, #0\n\t"
  55339. "umlal r10, r4, r8, r7\n\t"
  55340. "adds r10, r10, r5\n\t"
  55341. "str r10, [%[a], #300]\n\t"
  55342. "adc r4, r4, #0\n\t"
  55343. /* a[i+76] += m[76] * mu */
  55344. "ldr r7, [%[m], #304]\n\t"
  55345. "ldr r10, [%[a], #304]\n\t"
  55346. "mov r5, #0\n\t"
  55347. "umlal r10, r5, r8, r7\n\t"
  55348. "adds r10, r10, r4\n\t"
  55349. "str r10, [%[a], #304]\n\t"
  55350. "adc r5, r5, #0\n\t"
  55351. /* a[i+77] += m[77] * mu */
  55352. "ldr r7, [%[m], #308]\n\t"
  55353. "ldr r10, [%[a], #308]\n\t"
  55354. "mov r4, #0\n\t"
  55355. "umlal r10, r4, r8, r7\n\t"
  55356. "adds r10, r10, r5\n\t"
  55357. "str r10, [%[a], #308]\n\t"
  55358. "adc r4, r4, #0\n\t"
  55359. /* a[i+78] += m[78] * mu */
  55360. "ldr r7, [%[m], #312]\n\t"
  55361. "ldr r10, [%[a], #312]\n\t"
  55362. "mov r5, #0\n\t"
  55363. "umlal r10, r5, r8, r7\n\t"
  55364. "adds r10, r10, r4\n\t"
  55365. "str r10, [%[a], #312]\n\t"
  55366. "adc r5, r5, #0\n\t"
  55367. /* a[i+79] += m[79] * mu */
  55368. "ldr r7, [%[m], #316]\n\t"
  55369. "ldr r10, [%[a], #316]\n\t"
  55370. "mov r4, #0\n\t"
  55371. "umlal r10, r4, r8, r7\n\t"
  55372. "adds r10, r10, r5\n\t"
  55373. "str r10, [%[a], #316]\n\t"
  55374. "adc r4, r4, #0\n\t"
  55375. /* a[i+80] += m[80] * mu */
  55376. "ldr r7, [%[m], #320]\n\t"
  55377. "ldr r10, [%[a], #320]\n\t"
  55378. "mov r5, #0\n\t"
  55379. "umlal r10, r5, r8, r7\n\t"
  55380. "adds r10, r10, r4\n\t"
  55381. "str r10, [%[a], #320]\n\t"
  55382. "adc r5, r5, #0\n\t"
  55383. /* a[i+81] += m[81] * mu */
  55384. "ldr r7, [%[m], #324]\n\t"
  55385. "ldr r10, [%[a], #324]\n\t"
  55386. "mov r4, #0\n\t"
  55387. "umlal r10, r4, r8, r7\n\t"
  55388. "adds r10, r10, r5\n\t"
  55389. "str r10, [%[a], #324]\n\t"
  55390. "adc r4, r4, #0\n\t"
  55391. /* a[i+82] += m[82] * mu */
  55392. "ldr r7, [%[m], #328]\n\t"
  55393. "ldr r10, [%[a], #328]\n\t"
  55394. "mov r5, #0\n\t"
  55395. "umlal r10, r5, r8, r7\n\t"
  55396. "adds r10, r10, r4\n\t"
  55397. "str r10, [%[a], #328]\n\t"
  55398. "adc r5, r5, #0\n\t"
  55399. /* a[i+83] += m[83] * mu */
  55400. "ldr r7, [%[m], #332]\n\t"
  55401. "ldr r10, [%[a], #332]\n\t"
  55402. "mov r4, #0\n\t"
  55403. "umlal r10, r4, r8, r7\n\t"
  55404. "adds r10, r10, r5\n\t"
  55405. "str r10, [%[a], #332]\n\t"
  55406. "adc r4, r4, #0\n\t"
  55407. /* a[i+84] += m[84] * mu */
  55408. "ldr r7, [%[m], #336]\n\t"
  55409. "ldr r10, [%[a], #336]\n\t"
  55410. "mov r5, #0\n\t"
  55411. "umlal r10, r5, r8, r7\n\t"
  55412. "adds r10, r10, r4\n\t"
  55413. "str r10, [%[a], #336]\n\t"
  55414. "adc r5, r5, #0\n\t"
  55415. /* a[i+85] += m[85] * mu */
  55416. "ldr r7, [%[m], #340]\n\t"
  55417. "ldr r10, [%[a], #340]\n\t"
  55418. "mov r4, #0\n\t"
  55419. "umlal r10, r4, r8, r7\n\t"
  55420. "adds r10, r10, r5\n\t"
  55421. "str r10, [%[a], #340]\n\t"
  55422. "adc r4, r4, #0\n\t"
  55423. /* a[i+86] += m[86] * mu */
  55424. "ldr r7, [%[m], #344]\n\t"
  55425. "ldr r10, [%[a], #344]\n\t"
  55426. "mov r5, #0\n\t"
  55427. "umlal r10, r5, r8, r7\n\t"
  55428. "adds r10, r10, r4\n\t"
  55429. "str r10, [%[a], #344]\n\t"
  55430. "adc r5, r5, #0\n\t"
  55431. /* a[i+87] += m[87] * mu */
  55432. "ldr r7, [%[m], #348]\n\t"
  55433. "ldr r10, [%[a], #348]\n\t"
  55434. "mov r4, #0\n\t"
  55435. "umlal r10, r4, r8, r7\n\t"
  55436. "adds r10, r10, r5\n\t"
  55437. "str r10, [%[a], #348]\n\t"
  55438. "adc r4, r4, #0\n\t"
  55439. /* a[i+88] += m[88] * mu */
  55440. "ldr r7, [%[m], #352]\n\t"
  55441. "ldr r10, [%[a], #352]\n\t"
  55442. "mov r5, #0\n\t"
  55443. "umlal r10, r5, r8, r7\n\t"
  55444. "adds r10, r10, r4\n\t"
  55445. "str r10, [%[a], #352]\n\t"
  55446. "adc r5, r5, #0\n\t"
  55447. /* a[i+89] += m[89] * mu */
  55448. "ldr r7, [%[m], #356]\n\t"
  55449. "ldr r10, [%[a], #356]\n\t"
  55450. "mov r4, #0\n\t"
  55451. "umlal r10, r4, r8, r7\n\t"
  55452. "adds r10, r10, r5\n\t"
  55453. "str r10, [%[a], #356]\n\t"
  55454. "adc r4, r4, #0\n\t"
  55455. /* a[i+90] += m[90] * mu */
  55456. "ldr r7, [%[m], #360]\n\t"
  55457. "ldr r10, [%[a], #360]\n\t"
  55458. "mov r5, #0\n\t"
  55459. "umlal r10, r5, r8, r7\n\t"
  55460. "adds r10, r10, r4\n\t"
  55461. "str r10, [%[a], #360]\n\t"
  55462. "adc r5, r5, #0\n\t"
  55463. /* a[i+91] += m[91] * mu */
  55464. "ldr r7, [%[m], #364]\n\t"
  55465. "ldr r10, [%[a], #364]\n\t"
  55466. "mov r4, #0\n\t"
  55467. "umlal r10, r4, r8, r7\n\t"
  55468. "adds r10, r10, r5\n\t"
  55469. "str r10, [%[a], #364]\n\t"
  55470. "adc r4, r4, #0\n\t"
  55471. /* a[i+92] += m[92] * mu */
  55472. "ldr r7, [%[m], #368]\n\t"
  55473. "ldr r10, [%[a], #368]\n\t"
  55474. "mov r5, #0\n\t"
  55475. "umlal r10, r5, r8, r7\n\t"
  55476. "adds r10, r10, r4\n\t"
  55477. "str r10, [%[a], #368]\n\t"
  55478. "adc r5, r5, #0\n\t"
  55479. /* a[i+93] += m[93] * mu */
  55480. "ldr r7, [%[m], #372]\n\t"
  55481. "ldr r10, [%[a], #372]\n\t"
  55482. "mov r4, #0\n\t"
  55483. "umlal r10, r4, r8, r7\n\t"
  55484. "adds r10, r10, r5\n\t"
  55485. "str r10, [%[a], #372]\n\t"
  55486. "adc r4, r4, #0\n\t"
  55487. /* a[i+94] += m[94] * mu */
  55488. "ldr r7, [%[m], #376]\n\t"
  55489. "ldr r10, [%[a], #376]\n\t"
  55490. "mov r5, #0\n\t"
  55491. "umlal r10, r5, r8, r7\n\t"
  55492. "adds r10, r10, r4\n\t"
  55493. "str r10, [%[a], #376]\n\t"
  55494. "adc r5, r5, #0\n\t"
  55495. /* a[i+95] += m[95] * mu */
  55496. "ldr r7, [%[m], #380]\n\t"
  55497. "ldr r10, [%[a], #380]\n\t"
  55498. "mov r4, #0\n\t"
  55499. "umlal r10, r4, r8, r7\n\t"
  55500. "adds r10, r10, r5\n\t"
  55501. "str r10, [%[a], #380]\n\t"
  55502. "adc r4, r4, #0\n\t"
  55503. /* a[i+96] += m[96] * mu */
  55504. "ldr r7, [%[m], #384]\n\t"
  55505. "ldr r10, [%[a], #384]\n\t"
  55506. "mov r5, #0\n\t"
  55507. "umlal r10, r5, r8, r7\n\t"
  55508. "adds r10, r10, r4\n\t"
  55509. "str r10, [%[a], #384]\n\t"
  55510. "adc r5, r5, #0\n\t"
  55511. /* a[i+97] += m[97] * mu */
  55512. "ldr r7, [%[m], #388]\n\t"
  55513. "ldr r10, [%[a], #388]\n\t"
  55514. "mov r4, #0\n\t"
  55515. "umlal r10, r4, r8, r7\n\t"
  55516. "adds r10, r10, r5\n\t"
  55517. "str r10, [%[a], #388]\n\t"
  55518. "adc r4, r4, #0\n\t"
  55519. /* a[i+98] += m[98] * mu */
  55520. "ldr r7, [%[m], #392]\n\t"
  55521. "ldr r10, [%[a], #392]\n\t"
  55522. "mov r5, #0\n\t"
  55523. "umlal r10, r5, r8, r7\n\t"
  55524. "adds r10, r10, r4\n\t"
  55525. "str r10, [%[a], #392]\n\t"
  55526. "adc r5, r5, #0\n\t"
  55527. /* a[i+99] += m[99] * mu */
  55528. "ldr r7, [%[m], #396]\n\t"
  55529. "ldr r10, [%[a], #396]\n\t"
  55530. "mov r4, #0\n\t"
  55531. "umlal r10, r4, r8, r7\n\t"
  55532. "adds r10, r10, r5\n\t"
  55533. "str r10, [%[a], #396]\n\t"
  55534. "adc r4, r4, #0\n\t"
  55535. /* a[i+100] += m[100] * mu */
  55536. "ldr r7, [%[m], #400]\n\t"
  55537. "ldr r10, [%[a], #400]\n\t"
  55538. "mov r5, #0\n\t"
  55539. "umlal r10, r5, r8, r7\n\t"
  55540. "adds r10, r10, r4\n\t"
  55541. "str r10, [%[a], #400]\n\t"
  55542. "adc r5, r5, #0\n\t"
  55543. /* a[i+101] += m[101] * mu */
  55544. "ldr r7, [%[m], #404]\n\t"
  55545. "ldr r10, [%[a], #404]\n\t"
  55546. "mov r4, #0\n\t"
  55547. "umlal r10, r4, r8, r7\n\t"
  55548. "adds r10, r10, r5\n\t"
  55549. "str r10, [%[a], #404]\n\t"
  55550. "adc r4, r4, #0\n\t"
  55551. /* a[i+102] += m[102] * mu */
  55552. "ldr r7, [%[m], #408]\n\t"
  55553. "ldr r10, [%[a], #408]\n\t"
  55554. "mov r5, #0\n\t"
  55555. "umlal r10, r5, r8, r7\n\t"
  55556. "adds r10, r10, r4\n\t"
  55557. "str r10, [%[a], #408]\n\t"
  55558. "adc r5, r5, #0\n\t"
  55559. /* a[i+103] += m[103] * mu */
  55560. "ldr r7, [%[m], #412]\n\t"
  55561. "ldr r10, [%[a], #412]\n\t"
  55562. "mov r4, #0\n\t"
  55563. "umlal r10, r4, r8, r7\n\t"
  55564. "adds r10, r10, r5\n\t"
  55565. "str r10, [%[a], #412]\n\t"
  55566. "adc r4, r4, #0\n\t"
  55567. /* a[i+104] += m[104] * mu */
  55568. "ldr r7, [%[m], #416]\n\t"
  55569. "ldr r10, [%[a], #416]\n\t"
  55570. "mov r5, #0\n\t"
  55571. "umlal r10, r5, r8, r7\n\t"
  55572. "adds r10, r10, r4\n\t"
  55573. "str r10, [%[a], #416]\n\t"
  55574. "adc r5, r5, #0\n\t"
  55575. /* a[i+105] += m[105] * mu */
  55576. "ldr r7, [%[m], #420]\n\t"
  55577. "ldr r10, [%[a], #420]\n\t"
  55578. "mov r4, #0\n\t"
  55579. "umlal r10, r4, r8, r7\n\t"
  55580. "adds r10, r10, r5\n\t"
  55581. "str r10, [%[a], #420]\n\t"
  55582. "adc r4, r4, #0\n\t"
  55583. /* a[i+106] += m[106] * mu */
  55584. "ldr r7, [%[m], #424]\n\t"
  55585. "ldr r10, [%[a], #424]\n\t"
  55586. "mov r5, #0\n\t"
  55587. "umlal r10, r5, r8, r7\n\t"
  55588. "adds r10, r10, r4\n\t"
  55589. "str r10, [%[a], #424]\n\t"
  55590. "adc r5, r5, #0\n\t"
  55591. /* a[i+107] += m[107] * mu */
  55592. "ldr r7, [%[m], #428]\n\t"
  55593. "ldr r10, [%[a], #428]\n\t"
  55594. "mov r4, #0\n\t"
  55595. "umlal r10, r4, r8, r7\n\t"
  55596. "adds r10, r10, r5\n\t"
  55597. "str r10, [%[a], #428]\n\t"
  55598. "adc r4, r4, #0\n\t"
  55599. /* a[i+108] += m[108] * mu */
  55600. "ldr r7, [%[m], #432]\n\t"
  55601. "ldr r10, [%[a], #432]\n\t"
  55602. "mov r5, #0\n\t"
  55603. "umlal r10, r5, r8, r7\n\t"
  55604. "adds r10, r10, r4\n\t"
  55605. "str r10, [%[a], #432]\n\t"
  55606. "adc r5, r5, #0\n\t"
  55607. /* a[i+109] += m[109] * mu */
  55608. "ldr r7, [%[m], #436]\n\t"
  55609. "ldr r10, [%[a], #436]\n\t"
  55610. "mov r4, #0\n\t"
  55611. "umlal r10, r4, r8, r7\n\t"
  55612. "adds r10, r10, r5\n\t"
  55613. "str r10, [%[a], #436]\n\t"
  55614. "adc r4, r4, #0\n\t"
  55615. /* a[i+110] += m[110] * mu */
  55616. "ldr r7, [%[m], #440]\n\t"
  55617. "ldr r10, [%[a], #440]\n\t"
  55618. "mov r5, #0\n\t"
  55619. "umlal r10, r5, r8, r7\n\t"
  55620. "adds r10, r10, r4\n\t"
  55621. "str r10, [%[a], #440]\n\t"
  55622. "adc r5, r5, #0\n\t"
  55623. /* a[i+111] += m[111] * mu */
  55624. "ldr r7, [%[m], #444]\n\t"
  55625. "ldr r10, [%[a], #444]\n\t"
  55626. "mov r4, #0\n\t"
  55627. "umlal r10, r4, r8, r7\n\t"
  55628. "adds r10, r10, r5\n\t"
  55629. "str r10, [%[a], #444]\n\t"
  55630. "adc r4, r4, #0\n\t"
  55631. /* a[i+112] += m[112] * mu */
  55632. "ldr r7, [%[m], #448]\n\t"
  55633. "ldr r10, [%[a], #448]\n\t"
  55634. "mov r5, #0\n\t"
  55635. "umlal r10, r5, r8, r7\n\t"
  55636. "adds r10, r10, r4\n\t"
  55637. "str r10, [%[a], #448]\n\t"
  55638. "adc r5, r5, #0\n\t"
  55639. /* a[i+113] += m[113] * mu */
  55640. "ldr r7, [%[m], #452]\n\t"
  55641. "ldr r10, [%[a], #452]\n\t"
  55642. "mov r4, #0\n\t"
  55643. "umlal r10, r4, r8, r7\n\t"
  55644. "adds r10, r10, r5\n\t"
  55645. "str r10, [%[a], #452]\n\t"
  55646. "adc r4, r4, #0\n\t"
  55647. /* a[i+114] += m[114] * mu */
  55648. "ldr r7, [%[m], #456]\n\t"
  55649. "ldr r10, [%[a], #456]\n\t"
  55650. "mov r5, #0\n\t"
  55651. "umlal r10, r5, r8, r7\n\t"
  55652. "adds r10, r10, r4\n\t"
  55653. "str r10, [%[a], #456]\n\t"
  55654. "adc r5, r5, #0\n\t"
  55655. /* a[i+115] += m[115] * mu */
  55656. "ldr r7, [%[m], #460]\n\t"
  55657. "ldr r10, [%[a], #460]\n\t"
  55658. "mov r4, #0\n\t"
  55659. "umlal r10, r4, r8, r7\n\t"
  55660. "adds r10, r10, r5\n\t"
  55661. "str r10, [%[a], #460]\n\t"
  55662. "adc r4, r4, #0\n\t"
  55663. /* a[i+116] += m[116] * mu */
  55664. "ldr r7, [%[m], #464]\n\t"
  55665. "ldr r10, [%[a], #464]\n\t"
  55666. "mov r5, #0\n\t"
  55667. "umlal r10, r5, r8, r7\n\t"
  55668. "adds r10, r10, r4\n\t"
  55669. "str r10, [%[a], #464]\n\t"
  55670. "adc r5, r5, #0\n\t"
  55671. /* a[i+117] += m[117] * mu */
  55672. "ldr r7, [%[m], #468]\n\t"
  55673. "ldr r10, [%[a], #468]\n\t"
  55674. "mov r4, #0\n\t"
  55675. "umlal r10, r4, r8, r7\n\t"
  55676. "adds r10, r10, r5\n\t"
  55677. "str r10, [%[a], #468]\n\t"
  55678. "adc r4, r4, #0\n\t"
  55679. /* a[i+118] += m[118] * mu */
  55680. "ldr r7, [%[m], #472]\n\t"
  55681. "ldr r10, [%[a], #472]\n\t"
  55682. "mov r5, #0\n\t"
  55683. "umlal r10, r5, r8, r7\n\t"
  55684. "adds r10, r10, r4\n\t"
  55685. "str r10, [%[a], #472]\n\t"
  55686. "adc r5, r5, #0\n\t"
  55687. /* a[i+119] += m[119] * mu */
  55688. "ldr r7, [%[m], #476]\n\t"
  55689. "ldr r10, [%[a], #476]\n\t"
  55690. "mov r4, #0\n\t"
  55691. "umlal r10, r4, r8, r7\n\t"
  55692. "adds r10, r10, r5\n\t"
  55693. "str r10, [%[a], #476]\n\t"
  55694. "adc r4, r4, #0\n\t"
  55695. /* a[i+120] += m[120] * mu */
  55696. "ldr r7, [%[m], #480]\n\t"
  55697. "ldr r10, [%[a], #480]\n\t"
  55698. "mov r5, #0\n\t"
  55699. "umlal r10, r5, r8, r7\n\t"
  55700. "adds r10, r10, r4\n\t"
  55701. "str r10, [%[a], #480]\n\t"
  55702. "adc r5, r5, #0\n\t"
  55703. /* a[i+121] += m[121] * mu */
  55704. "ldr r7, [%[m], #484]\n\t"
  55705. "ldr r10, [%[a], #484]\n\t"
  55706. "mov r4, #0\n\t"
  55707. "umlal r10, r4, r8, r7\n\t"
  55708. "adds r10, r10, r5\n\t"
  55709. "str r10, [%[a], #484]\n\t"
  55710. "adc r4, r4, #0\n\t"
  55711. /* a[i+122] += m[122] * mu */
  55712. "ldr r7, [%[m], #488]\n\t"
  55713. "ldr r10, [%[a], #488]\n\t"
  55714. "mov r5, #0\n\t"
  55715. "umlal r10, r5, r8, r7\n\t"
  55716. "adds r10, r10, r4\n\t"
  55717. "str r10, [%[a], #488]\n\t"
  55718. "adc r5, r5, #0\n\t"
  55719. /* a[i+123] += m[123] * mu */
  55720. "ldr r7, [%[m], #492]\n\t"
  55721. "ldr r10, [%[a], #492]\n\t"
  55722. "mov r4, #0\n\t"
  55723. "umlal r10, r4, r8, r7\n\t"
  55724. "adds r10, r10, r5\n\t"
  55725. "str r10, [%[a], #492]\n\t"
  55726. "adc r4, r4, #0\n\t"
  55727. /* a[i+124] += m[124] * mu */
  55728. "ldr r7, [%[m], #496]\n\t"
  55729. "ldr r10, [%[a], #496]\n\t"
  55730. "mov r5, #0\n\t"
  55731. "umlal r10, r5, r8, r7\n\t"
  55732. "adds r10, r10, r4\n\t"
  55733. "str r10, [%[a], #496]\n\t"
  55734. "adc r5, r5, #0\n\t"
  55735. /* a[i+125] += m[125] * mu */
  55736. "ldr r7, [%[m], #500]\n\t"
  55737. "ldr r10, [%[a], #500]\n\t"
  55738. "mov r4, #0\n\t"
  55739. "umlal r10, r4, r8, r7\n\t"
  55740. "adds r10, r10, r5\n\t"
  55741. "str r10, [%[a], #500]\n\t"
  55742. "adc r4, r4, #0\n\t"
  55743. /* a[i+126] += m[126] * mu */
  55744. "ldr r7, [%[m], #504]\n\t"
  55745. "ldr r10, [%[a], #504]\n\t"
  55746. "mov r5, #0\n\t"
  55747. "umlal r10, r5, r8, r7\n\t"
  55748. "adds r10, r10, r4\n\t"
  55749. "str r10, [%[a], #504]\n\t"
  55750. "adc r5, r5, #0\n\t"
  55751. /* a[i+127] += m[127] * mu */
  55752. "ldr r7, [%[m], #508]\n\t"
  55753. "ldr r10, [%[a], #508]\n\t"
  55754. "umull r6, r7, r8, r7\n\t"
  55755. "adds r5, r5, r6\n\t"
  55756. "adcs r4, r7, r3\n\t"
  55757. "mov r3, #0\n\t"
  55758. "adc r3, r3, r3\n\t"
  55759. "adds r10, r10, r5\n\t"
  55760. "str r10, [%[a], #508]\n\t"
  55761. "ldr r10, [%[a], #512]\n\t"
  55762. "adcs r10, r10, r4\n\t"
  55763. "str r10, [%[a], #512]\n\t"
  55764. "adc r3, r3, #0\n\t"
  55765. /* i += 1 */
  55766. "add r9, r9, #4\n\t"
  55767. "add %[a], %[a], #4\n\t"
  55768. "cmp r9, #0x200\n\t"
  55769. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  55770. /* Loop Done */
  55771. "str r12, [%[a]]\n\t"
  55772. "str lr, [%[a], #4]\n\t"
  55773. "mov %[mp], r3\n\t"
  55774. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  55775. :
  55776. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  55777. );
  55778. sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp);
  55779. }
  55780. #else
  55781. /* Reduce the number back to 4096 bits using Montgomery reduction.
  55782. *
  55783. * a A single precision number to reduce in place.
  55784. * m The single precision number representing the modulus.
  55785. * mp The digit representing the negative inverse of m mod 2^n.
  55786. */
  55787. static SP_NOINLINE void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  55788. {
  55789. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  55790. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  55791. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  55792. __asm__ __volatile__ (
  55793. /* i = 0 */
  55794. "mov r12, #0\n\t"
  55795. "mov lr, #0\n\t"
  55796. "ldr r4, [%[a]]\n\t"
  55797. "ldr r5, [%[a], #4]\n\t"
  55798. "ldr r6, [%[a], #8]\n\t"
  55799. "ldr r7, [%[a], #12]\n\t"
  55800. "ldr r8, [%[a], #16]\n\t"
  55801. "\n"
  55802. "L_sp_4096_mont_reduce_128_word_%=: \n\t"
  55803. /* mu = a[i] * mp */
  55804. "mul r11, %[mp], r4\n\t"
  55805. /* a[i+0] += m[0] * mu */
  55806. "ldr r10, [%[m]]\n\t"
  55807. "mov r3, #0\n\t"
  55808. "umaal r4, r3, r11, r10\n\t"
  55809. /* a[i+1] += m[1] * mu */
  55810. "ldr r10, [%[m], #4]\n\t"
  55811. "mov r4, r5\n\t"
  55812. "umaal r4, r3, r11, r10\n\t"
  55813. /* a[i+2] += m[2] * mu */
  55814. "ldr r10, [%[m], #8]\n\t"
  55815. "mov r5, r6\n\t"
  55816. "umaal r5, r3, r11, r10\n\t"
  55817. /* a[i+3] += m[3] * mu */
  55818. "ldr r10, [%[m], #12]\n\t"
  55819. "mov r6, r7\n\t"
  55820. "umaal r6, r3, r11, r10\n\t"
  55821. /* a[i+4] += m[4] * mu */
  55822. "ldr r10, [%[m], #16]\n\t"
  55823. "mov r7, r8\n\t"
  55824. "umaal r7, r3, r11, r10\n\t"
  55825. /* a[i+5] += m[5] * mu */
  55826. "ldr r10, [%[m], #20]\n\t"
  55827. "ldr r8, [%[a], #20]\n\t"
  55828. "umaal r8, r3, r11, r10\n\t"
  55829. /* a[i+6] += m[6] * mu */
  55830. "ldr r10, [%[m], #24]\n\t"
  55831. "ldr r9, [%[a], #24]\n\t"
  55832. "umaal r9, r3, r11, r10\n\t"
  55833. "str r9, [%[a], #24]\n\t"
  55834. /* a[i+7] += m[7] * mu */
  55835. "ldr r10, [%[m], #28]\n\t"
  55836. "ldr r9, [%[a], #28]\n\t"
  55837. "umaal r9, r3, r11, r10\n\t"
  55838. "str r9, [%[a], #28]\n\t"
  55839. /* a[i+8] += m[8] * mu */
  55840. "ldr r10, [%[m], #32]\n\t"
  55841. "ldr r9, [%[a], #32]\n\t"
  55842. "umaal r9, r3, r11, r10\n\t"
  55843. "str r9, [%[a], #32]\n\t"
  55844. /* a[i+9] += m[9] * mu */
  55845. "ldr r10, [%[m], #36]\n\t"
  55846. "ldr r9, [%[a], #36]\n\t"
  55847. "umaal r9, r3, r11, r10\n\t"
  55848. "str r9, [%[a], #36]\n\t"
  55849. /* a[i+10] += m[10] * mu */
  55850. "ldr r10, [%[m], #40]\n\t"
  55851. "ldr r9, [%[a], #40]\n\t"
  55852. "umaal r9, r3, r11, r10\n\t"
  55853. "str r9, [%[a], #40]\n\t"
  55854. /* a[i+11] += m[11] * mu */
  55855. "ldr r10, [%[m], #44]\n\t"
  55856. "ldr r9, [%[a], #44]\n\t"
  55857. "umaal r9, r3, r11, r10\n\t"
  55858. "str r9, [%[a], #44]\n\t"
  55859. /* a[i+12] += m[12] * mu */
  55860. "ldr r10, [%[m], #48]\n\t"
  55861. "ldr r9, [%[a], #48]\n\t"
  55862. "umaal r9, r3, r11, r10\n\t"
  55863. "str r9, [%[a], #48]\n\t"
  55864. /* a[i+13] += m[13] * mu */
  55865. "ldr r10, [%[m], #52]\n\t"
  55866. "ldr r9, [%[a], #52]\n\t"
  55867. "umaal r9, r3, r11, r10\n\t"
  55868. "str r9, [%[a], #52]\n\t"
  55869. /* a[i+14] += m[14] * mu */
  55870. "ldr r10, [%[m], #56]\n\t"
  55871. "ldr r9, [%[a], #56]\n\t"
  55872. "umaal r9, r3, r11, r10\n\t"
  55873. "str r9, [%[a], #56]\n\t"
  55874. /* a[i+15] += m[15] * mu */
  55875. "ldr r10, [%[m], #60]\n\t"
  55876. "ldr r9, [%[a], #60]\n\t"
  55877. "umaal r9, r3, r11, r10\n\t"
  55878. "str r9, [%[a], #60]\n\t"
  55879. /* a[i+16] += m[16] * mu */
  55880. "ldr r10, [%[m], #64]\n\t"
  55881. "ldr r9, [%[a], #64]\n\t"
  55882. "umaal r9, r3, r11, r10\n\t"
  55883. "str r9, [%[a], #64]\n\t"
  55884. /* a[i+17] += m[17] * mu */
  55885. "ldr r10, [%[m], #68]\n\t"
  55886. "ldr r9, [%[a], #68]\n\t"
  55887. "umaal r9, r3, r11, r10\n\t"
  55888. "str r9, [%[a], #68]\n\t"
  55889. /* a[i+18] += m[18] * mu */
  55890. "ldr r10, [%[m], #72]\n\t"
  55891. "ldr r9, [%[a], #72]\n\t"
  55892. "umaal r9, r3, r11, r10\n\t"
  55893. "str r9, [%[a], #72]\n\t"
  55894. /* a[i+19] += m[19] * mu */
  55895. "ldr r10, [%[m], #76]\n\t"
  55896. "ldr r9, [%[a], #76]\n\t"
  55897. "umaal r9, r3, r11, r10\n\t"
  55898. "str r9, [%[a], #76]\n\t"
  55899. /* a[i+20] += m[20] * mu */
  55900. "ldr r10, [%[m], #80]\n\t"
  55901. "ldr r9, [%[a], #80]\n\t"
  55902. "umaal r9, r3, r11, r10\n\t"
  55903. "str r9, [%[a], #80]\n\t"
  55904. /* a[i+21] += m[21] * mu */
  55905. "ldr r10, [%[m], #84]\n\t"
  55906. "ldr r9, [%[a], #84]\n\t"
  55907. "umaal r9, r3, r11, r10\n\t"
  55908. "str r9, [%[a], #84]\n\t"
  55909. /* a[i+22] += m[22] * mu */
  55910. "ldr r10, [%[m], #88]\n\t"
  55911. "ldr r9, [%[a], #88]\n\t"
  55912. "umaal r9, r3, r11, r10\n\t"
  55913. "str r9, [%[a], #88]\n\t"
  55914. /* a[i+23] += m[23] * mu */
  55915. "ldr r10, [%[m], #92]\n\t"
  55916. "ldr r9, [%[a], #92]\n\t"
  55917. "umaal r9, r3, r11, r10\n\t"
  55918. "str r9, [%[a], #92]\n\t"
  55919. /* a[i+24] += m[24] * mu */
  55920. "ldr r10, [%[m], #96]\n\t"
  55921. "ldr r9, [%[a], #96]\n\t"
  55922. "umaal r9, r3, r11, r10\n\t"
  55923. "str r9, [%[a], #96]\n\t"
  55924. /* a[i+25] += m[25] * mu */
  55925. "ldr r10, [%[m], #100]\n\t"
  55926. "ldr r9, [%[a], #100]\n\t"
  55927. "umaal r9, r3, r11, r10\n\t"
  55928. "str r9, [%[a], #100]\n\t"
  55929. /* a[i+26] += m[26] * mu */
  55930. "ldr r10, [%[m], #104]\n\t"
  55931. "ldr r9, [%[a], #104]\n\t"
  55932. "umaal r9, r3, r11, r10\n\t"
  55933. "str r9, [%[a], #104]\n\t"
  55934. /* a[i+27] += m[27] * mu */
  55935. "ldr r10, [%[m], #108]\n\t"
  55936. "ldr r9, [%[a], #108]\n\t"
  55937. "umaal r9, r3, r11, r10\n\t"
  55938. "str r9, [%[a], #108]\n\t"
  55939. /* a[i+28] += m[28] * mu */
  55940. "ldr r10, [%[m], #112]\n\t"
  55941. "ldr r9, [%[a], #112]\n\t"
  55942. "umaal r9, r3, r11, r10\n\t"
  55943. "str r9, [%[a], #112]\n\t"
  55944. /* a[i+29] += m[29] * mu */
  55945. "ldr r10, [%[m], #116]\n\t"
  55946. "ldr r9, [%[a], #116]\n\t"
  55947. "umaal r9, r3, r11, r10\n\t"
  55948. "str r9, [%[a], #116]\n\t"
  55949. /* a[i+30] += m[30] * mu */
  55950. "ldr r10, [%[m], #120]\n\t"
  55951. "ldr r9, [%[a], #120]\n\t"
  55952. "umaal r9, r3, r11, r10\n\t"
  55953. "str r9, [%[a], #120]\n\t"
  55954. /* a[i+31] += m[31] * mu */
  55955. "ldr r10, [%[m], #124]\n\t"
  55956. "ldr r9, [%[a], #124]\n\t"
  55957. "umaal r9, r3, r11, r10\n\t"
  55958. "str r9, [%[a], #124]\n\t"
  55959. /* a[i+32] += m[32] * mu */
  55960. "ldr r10, [%[m], #128]\n\t"
  55961. "ldr r9, [%[a], #128]\n\t"
  55962. "umaal r9, r3, r11, r10\n\t"
  55963. "str r9, [%[a], #128]\n\t"
  55964. /* a[i+33] += m[33] * mu */
  55965. "ldr r10, [%[m], #132]\n\t"
  55966. "ldr r9, [%[a], #132]\n\t"
  55967. "umaal r9, r3, r11, r10\n\t"
  55968. "str r9, [%[a], #132]\n\t"
  55969. /* a[i+34] += m[34] * mu */
  55970. "ldr r10, [%[m], #136]\n\t"
  55971. "ldr r9, [%[a], #136]\n\t"
  55972. "umaal r9, r3, r11, r10\n\t"
  55973. "str r9, [%[a], #136]\n\t"
  55974. /* a[i+35] += m[35] * mu */
  55975. "ldr r10, [%[m], #140]\n\t"
  55976. "ldr r9, [%[a], #140]\n\t"
  55977. "umaal r9, r3, r11, r10\n\t"
  55978. "str r9, [%[a], #140]\n\t"
  55979. /* a[i+36] += m[36] * mu */
  55980. "ldr r10, [%[m], #144]\n\t"
  55981. "ldr r9, [%[a], #144]\n\t"
  55982. "umaal r9, r3, r11, r10\n\t"
  55983. "str r9, [%[a], #144]\n\t"
  55984. /* a[i+37] += m[37] * mu */
  55985. "ldr r10, [%[m], #148]\n\t"
  55986. "ldr r9, [%[a], #148]\n\t"
  55987. "umaal r9, r3, r11, r10\n\t"
  55988. "str r9, [%[a], #148]\n\t"
  55989. /* a[i+38] += m[38] * mu */
  55990. "ldr r10, [%[m], #152]\n\t"
  55991. "ldr r9, [%[a], #152]\n\t"
  55992. "umaal r9, r3, r11, r10\n\t"
  55993. "str r9, [%[a], #152]\n\t"
  55994. /* a[i+39] += m[39] * mu */
  55995. "ldr r10, [%[m], #156]\n\t"
  55996. "ldr r9, [%[a], #156]\n\t"
  55997. "umaal r9, r3, r11, r10\n\t"
  55998. "str r9, [%[a], #156]\n\t"
  55999. /* a[i+40] += m[40] * mu */
  56000. "ldr r10, [%[m], #160]\n\t"
  56001. "ldr r9, [%[a], #160]\n\t"
  56002. "umaal r9, r3, r11, r10\n\t"
  56003. "str r9, [%[a], #160]\n\t"
  56004. /* a[i+41] += m[41] * mu */
  56005. "ldr r10, [%[m], #164]\n\t"
  56006. "ldr r9, [%[a], #164]\n\t"
  56007. "umaal r9, r3, r11, r10\n\t"
  56008. "str r9, [%[a], #164]\n\t"
  56009. /* a[i+42] += m[42] * mu */
  56010. "ldr r10, [%[m], #168]\n\t"
  56011. "ldr r9, [%[a], #168]\n\t"
  56012. "umaal r9, r3, r11, r10\n\t"
  56013. "str r9, [%[a], #168]\n\t"
  56014. /* a[i+43] += m[43] * mu */
  56015. "ldr r10, [%[m], #172]\n\t"
  56016. "ldr r9, [%[a], #172]\n\t"
  56017. "umaal r9, r3, r11, r10\n\t"
  56018. "str r9, [%[a], #172]\n\t"
  56019. /* a[i+44] += m[44] * mu */
  56020. "ldr r10, [%[m], #176]\n\t"
  56021. "ldr r9, [%[a], #176]\n\t"
  56022. "umaal r9, r3, r11, r10\n\t"
  56023. "str r9, [%[a], #176]\n\t"
  56024. /* a[i+45] += m[45] * mu */
  56025. "ldr r10, [%[m], #180]\n\t"
  56026. "ldr r9, [%[a], #180]\n\t"
  56027. "umaal r9, r3, r11, r10\n\t"
  56028. "str r9, [%[a], #180]\n\t"
  56029. /* a[i+46] += m[46] * mu */
  56030. "ldr r10, [%[m], #184]\n\t"
  56031. "ldr r9, [%[a], #184]\n\t"
  56032. "umaal r9, r3, r11, r10\n\t"
  56033. "str r9, [%[a], #184]\n\t"
  56034. /* a[i+47] += m[47] * mu */
  56035. "ldr r10, [%[m], #188]\n\t"
  56036. "ldr r9, [%[a], #188]\n\t"
  56037. "umaal r9, r3, r11, r10\n\t"
  56038. "str r9, [%[a], #188]\n\t"
  56039. /* a[i+48] += m[48] * mu */
  56040. "ldr r10, [%[m], #192]\n\t"
  56041. "ldr r9, [%[a], #192]\n\t"
  56042. "umaal r9, r3, r11, r10\n\t"
  56043. "str r9, [%[a], #192]\n\t"
  56044. /* a[i+49] += m[49] * mu */
  56045. "ldr r10, [%[m], #196]\n\t"
  56046. "ldr r9, [%[a], #196]\n\t"
  56047. "umaal r9, r3, r11, r10\n\t"
  56048. "str r9, [%[a], #196]\n\t"
  56049. /* a[i+50] += m[50] * mu */
  56050. "ldr r10, [%[m], #200]\n\t"
  56051. "ldr r9, [%[a], #200]\n\t"
  56052. "umaal r9, r3, r11, r10\n\t"
  56053. "str r9, [%[a], #200]\n\t"
  56054. /* a[i+51] += m[51] * mu */
  56055. "ldr r10, [%[m], #204]\n\t"
  56056. "ldr r9, [%[a], #204]\n\t"
  56057. "umaal r9, r3, r11, r10\n\t"
  56058. "str r9, [%[a], #204]\n\t"
  56059. /* a[i+52] += m[52] * mu */
  56060. "ldr r10, [%[m], #208]\n\t"
  56061. "ldr r9, [%[a], #208]\n\t"
  56062. "umaal r9, r3, r11, r10\n\t"
  56063. "str r9, [%[a], #208]\n\t"
  56064. /* a[i+53] += m[53] * mu */
  56065. "ldr r10, [%[m], #212]\n\t"
  56066. "ldr r9, [%[a], #212]\n\t"
  56067. "umaal r9, r3, r11, r10\n\t"
  56068. "str r9, [%[a], #212]\n\t"
  56069. /* a[i+54] += m[54] * mu */
  56070. "ldr r10, [%[m], #216]\n\t"
  56071. "ldr r9, [%[a], #216]\n\t"
  56072. "umaal r9, r3, r11, r10\n\t"
  56073. "str r9, [%[a], #216]\n\t"
  56074. /* a[i+55] += m[55] * mu */
  56075. "ldr r10, [%[m], #220]\n\t"
  56076. "ldr r9, [%[a], #220]\n\t"
  56077. "umaal r9, r3, r11, r10\n\t"
  56078. "str r9, [%[a], #220]\n\t"
  56079. /* a[i+56] += m[56] * mu */
  56080. "ldr r10, [%[m], #224]\n\t"
  56081. "ldr r9, [%[a], #224]\n\t"
  56082. "umaal r9, r3, r11, r10\n\t"
  56083. "str r9, [%[a], #224]\n\t"
  56084. /* a[i+57] += m[57] * mu */
  56085. "ldr r10, [%[m], #228]\n\t"
  56086. "ldr r9, [%[a], #228]\n\t"
  56087. "umaal r9, r3, r11, r10\n\t"
  56088. "str r9, [%[a], #228]\n\t"
  56089. /* a[i+58] += m[58] * mu */
  56090. "ldr r10, [%[m], #232]\n\t"
  56091. "ldr r9, [%[a], #232]\n\t"
  56092. "umaal r9, r3, r11, r10\n\t"
  56093. "str r9, [%[a], #232]\n\t"
  56094. /* a[i+59] += m[59] * mu */
  56095. "ldr r10, [%[m], #236]\n\t"
  56096. "ldr r9, [%[a], #236]\n\t"
  56097. "umaal r9, r3, r11, r10\n\t"
  56098. "str r9, [%[a], #236]\n\t"
  56099. /* a[i+60] += m[60] * mu */
  56100. "ldr r10, [%[m], #240]\n\t"
  56101. "ldr r9, [%[a], #240]\n\t"
  56102. "umaal r9, r3, r11, r10\n\t"
  56103. "str r9, [%[a], #240]\n\t"
  56104. /* a[i+61] += m[61] * mu */
  56105. "ldr r10, [%[m], #244]\n\t"
  56106. "ldr r9, [%[a], #244]\n\t"
  56107. "umaal r9, r3, r11, r10\n\t"
  56108. "str r9, [%[a], #244]\n\t"
  56109. /* a[i+62] += m[62] * mu */
  56110. "ldr r10, [%[m], #248]\n\t"
  56111. "ldr r9, [%[a], #248]\n\t"
  56112. "umaal r9, r3, r11, r10\n\t"
  56113. "str r9, [%[a], #248]\n\t"
  56114. /* a[i+63] += m[63] * mu */
  56115. "ldr r10, [%[m], #252]\n\t"
  56116. "ldr r9, [%[a], #252]\n\t"
  56117. "umaal r9, r3, r11, r10\n\t"
  56118. "str r9, [%[a], #252]\n\t"
  56119. /* a[i+64] += m[64] * mu */
  56120. "ldr r10, [%[m], #256]\n\t"
  56121. "ldr r9, [%[a], #256]\n\t"
  56122. "umaal r9, r3, r11, r10\n\t"
  56123. "str r9, [%[a], #256]\n\t"
  56124. /* a[i+65] += m[65] * mu */
  56125. "ldr r10, [%[m], #260]\n\t"
  56126. "ldr r9, [%[a], #260]\n\t"
  56127. "umaal r9, r3, r11, r10\n\t"
  56128. "str r9, [%[a], #260]\n\t"
  56129. /* a[i+66] += m[66] * mu */
  56130. "ldr r10, [%[m], #264]\n\t"
  56131. "ldr r9, [%[a], #264]\n\t"
  56132. "umaal r9, r3, r11, r10\n\t"
  56133. "str r9, [%[a], #264]\n\t"
  56134. /* a[i+67] += m[67] * mu */
  56135. "ldr r10, [%[m], #268]\n\t"
  56136. "ldr r9, [%[a], #268]\n\t"
  56137. "umaal r9, r3, r11, r10\n\t"
  56138. "str r9, [%[a], #268]\n\t"
  56139. /* a[i+68] += m[68] * mu */
  56140. "ldr r10, [%[m], #272]\n\t"
  56141. "ldr r9, [%[a], #272]\n\t"
  56142. "umaal r9, r3, r11, r10\n\t"
  56143. "str r9, [%[a], #272]\n\t"
  56144. /* a[i+69] += m[69] * mu */
  56145. "ldr r10, [%[m], #276]\n\t"
  56146. "ldr r9, [%[a], #276]\n\t"
  56147. "umaal r9, r3, r11, r10\n\t"
  56148. "str r9, [%[a], #276]\n\t"
  56149. /* a[i+70] += m[70] * mu */
  56150. "ldr r10, [%[m], #280]\n\t"
  56151. "ldr r9, [%[a], #280]\n\t"
  56152. "umaal r9, r3, r11, r10\n\t"
  56153. "str r9, [%[a], #280]\n\t"
  56154. /* a[i+71] += m[71] * mu */
  56155. "ldr r10, [%[m], #284]\n\t"
  56156. "ldr r9, [%[a], #284]\n\t"
  56157. "umaal r9, r3, r11, r10\n\t"
  56158. "str r9, [%[a], #284]\n\t"
  56159. /* a[i+72] += m[72] * mu */
  56160. "ldr r10, [%[m], #288]\n\t"
  56161. "ldr r9, [%[a], #288]\n\t"
  56162. "umaal r9, r3, r11, r10\n\t"
  56163. "str r9, [%[a], #288]\n\t"
  56164. /* a[i+73] += m[73] * mu */
  56165. "ldr r10, [%[m], #292]\n\t"
  56166. "ldr r9, [%[a], #292]\n\t"
  56167. "umaal r9, r3, r11, r10\n\t"
  56168. "str r9, [%[a], #292]\n\t"
  56169. /* a[i+74] += m[74] * mu */
  56170. "ldr r10, [%[m], #296]\n\t"
  56171. "ldr r9, [%[a], #296]\n\t"
  56172. "umaal r9, r3, r11, r10\n\t"
  56173. "str r9, [%[a], #296]\n\t"
  56174. /* a[i+75] += m[75] * mu */
  56175. "ldr r10, [%[m], #300]\n\t"
  56176. "ldr r9, [%[a], #300]\n\t"
  56177. "umaal r9, r3, r11, r10\n\t"
  56178. "str r9, [%[a], #300]\n\t"
  56179. /* a[i+76] += m[76] * mu */
  56180. "ldr r10, [%[m], #304]\n\t"
  56181. "ldr r9, [%[a], #304]\n\t"
  56182. "umaal r9, r3, r11, r10\n\t"
  56183. "str r9, [%[a], #304]\n\t"
  56184. /* a[i+77] += m[77] * mu */
  56185. "ldr r10, [%[m], #308]\n\t"
  56186. "ldr r9, [%[a], #308]\n\t"
  56187. "umaal r9, r3, r11, r10\n\t"
  56188. "str r9, [%[a], #308]\n\t"
  56189. /* a[i+78] += m[78] * mu */
  56190. "ldr r10, [%[m], #312]\n\t"
  56191. "ldr r9, [%[a], #312]\n\t"
  56192. "umaal r9, r3, r11, r10\n\t"
  56193. "str r9, [%[a], #312]\n\t"
  56194. /* a[i+79] += m[79] * mu */
  56195. "ldr r10, [%[m], #316]\n\t"
  56196. "ldr r9, [%[a], #316]\n\t"
  56197. "umaal r9, r3, r11, r10\n\t"
  56198. "str r9, [%[a], #316]\n\t"
  56199. /* a[i+80] += m[80] * mu */
  56200. "ldr r10, [%[m], #320]\n\t"
  56201. "ldr r9, [%[a], #320]\n\t"
  56202. "umaal r9, r3, r11, r10\n\t"
  56203. "str r9, [%[a], #320]\n\t"
  56204. /* a[i+81] += m[81] * mu */
  56205. "ldr r10, [%[m], #324]\n\t"
  56206. "ldr r9, [%[a], #324]\n\t"
  56207. "umaal r9, r3, r11, r10\n\t"
  56208. "str r9, [%[a], #324]\n\t"
  56209. /* a[i+82] += m[82] * mu */
  56210. "ldr r10, [%[m], #328]\n\t"
  56211. "ldr r9, [%[a], #328]\n\t"
  56212. "umaal r9, r3, r11, r10\n\t"
  56213. "str r9, [%[a], #328]\n\t"
  56214. /* a[i+83] += m[83] * mu */
  56215. "ldr r10, [%[m], #332]\n\t"
  56216. "ldr r9, [%[a], #332]\n\t"
  56217. "umaal r9, r3, r11, r10\n\t"
  56218. "str r9, [%[a], #332]\n\t"
  56219. /* a[i+84] += m[84] * mu */
  56220. "ldr r10, [%[m], #336]\n\t"
  56221. "ldr r9, [%[a], #336]\n\t"
  56222. "umaal r9, r3, r11, r10\n\t"
  56223. "str r9, [%[a], #336]\n\t"
  56224. /* a[i+85] += m[85] * mu */
  56225. "ldr r10, [%[m], #340]\n\t"
  56226. "ldr r9, [%[a], #340]\n\t"
  56227. "umaal r9, r3, r11, r10\n\t"
  56228. "str r9, [%[a], #340]\n\t"
  56229. /* a[i+86] += m[86] * mu */
  56230. "ldr r10, [%[m], #344]\n\t"
  56231. "ldr r9, [%[a], #344]\n\t"
  56232. "umaal r9, r3, r11, r10\n\t"
  56233. "str r9, [%[a], #344]\n\t"
  56234. /* a[i+87] += m[87] * mu */
  56235. "ldr r10, [%[m], #348]\n\t"
  56236. "ldr r9, [%[a], #348]\n\t"
  56237. "umaal r9, r3, r11, r10\n\t"
  56238. "str r9, [%[a], #348]\n\t"
  56239. /* a[i+88] += m[88] * mu */
  56240. "ldr r10, [%[m], #352]\n\t"
  56241. "ldr r9, [%[a], #352]\n\t"
  56242. "umaal r9, r3, r11, r10\n\t"
  56243. "str r9, [%[a], #352]\n\t"
  56244. /* a[i+89] += m[89] * mu */
  56245. "ldr r10, [%[m], #356]\n\t"
  56246. "ldr r9, [%[a], #356]\n\t"
  56247. "umaal r9, r3, r11, r10\n\t"
  56248. "str r9, [%[a], #356]\n\t"
  56249. /* a[i+90] += m[90] * mu */
  56250. "ldr r10, [%[m], #360]\n\t"
  56251. "ldr r9, [%[a], #360]\n\t"
  56252. "umaal r9, r3, r11, r10\n\t"
  56253. "str r9, [%[a], #360]\n\t"
  56254. /* a[i+91] += m[91] * mu */
  56255. "ldr r10, [%[m], #364]\n\t"
  56256. "ldr r9, [%[a], #364]\n\t"
  56257. "umaal r9, r3, r11, r10\n\t"
  56258. "str r9, [%[a], #364]\n\t"
  56259. /* a[i+92] += m[92] * mu */
  56260. "ldr r10, [%[m], #368]\n\t"
  56261. "ldr r9, [%[a], #368]\n\t"
  56262. "umaal r9, r3, r11, r10\n\t"
  56263. "str r9, [%[a], #368]\n\t"
  56264. /* a[i+93] += m[93] * mu */
  56265. "ldr r10, [%[m], #372]\n\t"
  56266. "ldr r9, [%[a], #372]\n\t"
  56267. "umaal r9, r3, r11, r10\n\t"
  56268. "str r9, [%[a], #372]\n\t"
  56269. /* a[i+94] += m[94] * mu */
  56270. "ldr r10, [%[m], #376]\n\t"
  56271. "ldr r9, [%[a], #376]\n\t"
  56272. "umaal r9, r3, r11, r10\n\t"
  56273. "str r9, [%[a], #376]\n\t"
  56274. /* a[i+95] += m[95] * mu */
  56275. "ldr r10, [%[m], #380]\n\t"
  56276. "ldr r9, [%[a], #380]\n\t"
  56277. "umaal r9, r3, r11, r10\n\t"
  56278. "str r9, [%[a], #380]\n\t"
  56279. /* a[i+96] += m[96] * mu */
  56280. "ldr r10, [%[m], #384]\n\t"
  56281. "ldr r9, [%[a], #384]\n\t"
  56282. "umaal r9, r3, r11, r10\n\t"
  56283. "str r9, [%[a], #384]\n\t"
  56284. /* a[i+97] += m[97] * mu */
  56285. "ldr r10, [%[m], #388]\n\t"
  56286. "ldr r9, [%[a], #388]\n\t"
  56287. "umaal r9, r3, r11, r10\n\t"
  56288. "str r9, [%[a], #388]\n\t"
  56289. /* a[i+98] += m[98] * mu */
  56290. "ldr r10, [%[m], #392]\n\t"
  56291. "ldr r9, [%[a], #392]\n\t"
  56292. "umaal r9, r3, r11, r10\n\t"
  56293. "str r9, [%[a], #392]\n\t"
  56294. /* a[i+99] += m[99] * mu */
  56295. "ldr r10, [%[m], #396]\n\t"
  56296. "ldr r9, [%[a], #396]\n\t"
  56297. "umaal r9, r3, r11, r10\n\t"
  56298. "str r9, [%[a], #396]\n\t"
  56299. /* a[i+100] += m[100] * mu */
  56300. "ldr r10, [%[m], #400]\n\t"
  56301. "ldr r9, [%[a], #400]\n\t"
  56302. "umaal r9, r3, r11, r10\n\t"
  56303. "str r9, [%[a], #400]\n\t"
  56304. /* a[i+101] += m[101] * mu */
  56305. "ldr r10, [%[m], #404]\n\t"
  56306. "ldr r9, [%[a], #404]\n\t"
  56307. "umaal r9, r3, r11, r10\n\t"
  56308. "str r9, [%[a], #404]\n\t"
  56309. /* a[i+102] += m[102] * mu */
  56310. "ldr r10, [%[m], #408]\n\t"
  56311. "ldr r9, [%[a], #408]\n\t"
  56312. "umaal r9, r3, r11, r10\n\t"
  56313. "str r9, [%[a], #408]\n\t"
  56314. /* a[i+103] += m[103] * mu */
  56315. "ldr r10, [%[m], #412]\n\t"
  56316. "ldr r9, [%[a], #412]\n\t"
  56317. "umaal r9, r3, r11, r10\n\t"
  56318. "str r9, [%[a], #412]\n\t"
  56319. /* a[i+104] += m[104] * mu */
  56320. "ldr r10, [%[m], #416]\n\t"
  56321. "ldr r9, [%[a], #416]\n\t"
  56322. "umaal r9, r3, r11, r10\n\t"
  56323. "str r9, [%[a], #416]\n\t"
  56324. /* a[i+105] += m[105] * mu */
  56325. "ldr r10, [%[m], #420]\n\t"
  56326. "ldr r9, [%[a], #420]\n\t"
  56327. "umaal r9, r3, r11, r10\n\t"
  56328. "str r9, [%[a], #420]\n\t"
  56329. /* a[i+106] += m[106] * mu */
  56330. "ldr r10, [%[m], #424]\n\t"
  56331. "ldr r9, [%[a], #424]\n\t"
  56332. "umaal r9, r3, r11, r10\n\t"
  56333. "str r9, [%[a], #424]\n\t"
  56334. /* a[i+107] += m[107] * mu */
  56335. "ldr r10, [%[m], #428]\n\t"
  56336. "ldr r9, [%[a], #428]\n\t"
  56337. "umaal r9, r3, r11, r10\n\t"
  56338. "str r9, [%[a], #428]\n\t"
  56339. /* a[i+108] += m[108] * mu */
  56340. "ldr r10, [%[m], #432]\n\t"
  56341. "ldr r9, [%[a], #432]\n\t"
  56342. "umaal r9, r3, r11, r10\n\t"
  56343. "str r9, [%[a], #432]\n\t"
  56344. /* a[i+109] += m[109] * mu */
  56345. "ldr r10, [%[m], #436]\n\t"
  56346. "ldr r9, [%[a], #436]\n\t"
  56347. "umaal r9, r3, r11, r10\n\t"
  56348. "str r9, [%[a], #436]\n\t"
  56349. /* a[i+110] += m[110] * mu */
  56350. "ldr r10, [%[m], #440]\n\t"
  56351. "ldr r9, [%[a], #440]\n\t"
  56352. "umaal r9, r3, r11, r10\n\t"
  56353. "str r9, [%[a], #440]\n\t"
  56354. /* a[i+111] += m[111] * mu */
  56355. "ldr r10, [%[m], #444]\n\t"
  56356. "ldr r9, [%[a], #444]\n\t"
  56357. "umaal r9, r3, r11, r10\n\t"
  56358. "str r9, [%[a], #444]\n\t"
  56359. /* a[i+112] += m[112] * mu */
  56360. "ldr r10, [%[m], #448]\n\t"
  56361. "ldr r9, [%[a], #448]\n\t"
  56362. "umaal r9, r3, r11, r10\n\t"
  56363. "str r9, [%[a], #448]\n\t"
  56364. /* a[i+113] += m[113] * mu */
  56365. "ldr r10, [%[m], #452]\n\t"
  56366. "ldr r9, [%[a], #452]\n\t"
  56367. "umaal r9, r3, r11, r10\n\t"
  56368. "str r9, [%[a], #452]\n\t"
  56369. /* a[i+114] += m[114] * mu */
  56370. "ldr r10, [%[m], #456]\n\t"
  56371. "ldr r9, [%[a], #456]\n\t"
  56372. "umaal r9, r3, r11, r10\n\t"
  56373. "str r9, [%[a], #456]\n\t"
  56374. /* a[i+115] += m[115] * mu */
  56375. "ldr r10, [%[m], #460]\n\t"
  56376. "ldr r9, [%[a], #460]\n\t"
  56377. "umaal r9, r3, r11, r10\n\t"
  56378. "str r9, [%[a], #460]\n\t"
  56379. /* a[i+116] += m[116] * mu */
  56380. "ldr r10, [%[m], #464]\n\t"
  56381. "ldr r9, [%[a], #464]\n\t"
  56382. "umaal r9, r3, r11, r10\n\t"
  56383. "str r9, [%[a], #464]\n\t"
  56384. /* a[i+117] += m[117] * mu */
  56385. "ldr r10, [%[m], #468]\n\t"
  56386. "ldr r9, [%[a], #468]\n\t"
  56387. "umaal r9, r3, r11, r10\n\t"
  56388. "str r9, [%[a], #468]\n\t"
  56389. /* a[i+118] += m[118] * mu */
  56390. "ldr r10, [%[m], #472]\n\t"
  56391. "ldr r9, [%[a], #472]\n\t"
  56392. "umaal r9, r3, r11, r10\n\t"
  56393. "str r9, [%[a], #472]\n\t"
  56394. /* a[i+119] += m[119] * mu */
  56395. "ldr r10, [%[m], #476]\n\t"
  56396. "ldr r9, [%[a], #476]\n\t"
  56397. "umaal r9, r3, r11, r10\n\t"
  56398. "str r9, [%[a], #476]\n\t"
  56399. /* a[i+120] += m[120] * mu */
  56400. "ldr r10, [%[m], #480]\n\t"
  56401. "ldr r9, [%[a], #480]\n\t"
  56402. "umaal r9, r3, r11, r10\n\t"
  56403. "str r9, [%[a], #480]\n\t"
  56404. /* a[i+121] += m[121] * mu */
  56405. "ldr r10, [%[m], #484]\n\t"
  56406. "ldr r9, [%[a], #484]\n\t"
  56407. "umaal r9, r3, r11, r10\n\t"
  56408. "str r9, [%[a], #484]\n\t"
  56409. /* a[i+122] += m[122] * mu */
  56410. "ldr r10, [%[m], #488]\n\t"
  56411. "ldr r9, [%[a], #488]\n\t"
  56412. "umaal r9, r3, r11, r10\n\t"
  56413. "str r9, [%[a], #488]\n\t"
  56414. /* a[i+123] += m[123] * mu */
  56415. "ldr r10, [%[m], #492]\n\t"
  56416. "ldr r9, [%[a], #492]\n\t"
  56417. "umaal r9, r3, r11, r10\n\t"
  56418. "str r9, [%[a], #492]\n\t"
  56419. /* a[i+124] += m[124] * mu */
  56420. "ldr r10, [%[m], #496]\n\t"
  56421. "ldr r9, [%[a], #496]\n\t"
  56422. "umaal r9, r3, r11, r10\n\t"
  56423. "str r9, [%[a], #496]\n\t"
  56424. /* a[i+125] += m[125] * mu */
  56425. "ldr r10, [%[m], #500]\n\t"
  56426. "ldr r9, [%[a], #500]\n\t"
  56427. "umaal r9, r3, r11, r10\n\t"
  56428. "str r9, [%[a], #500]\n\t"
  56429. /* a[i+126] += m[126] * mu */
  56430. "ldr r10, [%[m], #504]\n\t"
  56431. "ldr r9, [%[a], #504]\n\t"
  56432. "umaal r9, r3, r11, r10\n\t"
  56433. "str r9, [%[a], #504]\n\t"
  56434. /* a[i+127] += m[127] * mu */
  56435. "ldr r10, [%[m], #508]\n\t"
  56436. "ldr r9, [%[a], #508]\n\t"
  56437. "umaal r9, r3, r11, r10\n\t"
  56438. "ldr r11, [%[a], #512]\n\t"
  56439. "mov r10, #0\n\t"
  56440. "umaal r3, r11, r10, r10\n\t"
  56441. "str r9, [%[a], #508]\n\t"
  56442. "adds r3, r3, lr\n\t"
  56443. "adc lr, r11, #0\n\t"
  56444. "str r3, [%[a], #512]\n\t"
  56445. /* i += 1 */
  56446. "add r12, r12, #4\n\t"
  56447. "add %[a], %[a], #4\n\t"
  56448. "cmp r12, #0x200\n\t"
  56449. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  56450. /* Loop Done */
  56451. "str r4, [%[a]]\n\t"
  56452. "str r5, [%[a], #4]\n\t"
  56453. "str r6, [%[a], #8]\n\t"
  56454. "str r7, [%[a], #12]\n\t"
  56455. "str r8, [%[a], #16]\n\t"
  56456. "mov %[mp], lr\n\t"
  56457. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  56458. :
  56459. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  56460. );
  56461. sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp);
  56462. }
  56463. #endif
  56464. /* Multiply two Montgomery form numbers mod the modulus (prime).
  56465. * (r = a * b mod m)
  56466. *
  56467. * r Result of multiplication.
  56468. * a First number to multiply in Montgomery form.
  56469. * b Second number to multiply in Montgomery form.
  56470. * m Modulus (prime).
  56471. * mp Montgomery multiplier.
  56472. */
  56473. SP_NOINLINE static void sp_4096_mont_mul_128(sp_digit* r, const sp_digit* a,
  56474. const sp_digit* b, const sp_digit* m, sp_digit mp)
  56475. {
  56476. sp_4096_mul_128(r, a, b);
  56477. sp_4096_mont_reduce_128(r, m, mp);
  56478. }
  56479. /* Square the Montgomery form number. (r = a * a mod m)
  56480. *
  56481. * r Result of squaring.
  56482. * a Number to square in Montgomery form.
  56483. * m Modulus (prime).
  56484. * mp Montgomery multiplier.
  56485. */
  56486. SP_NOINLINE static void sp_4096_mont_sqr_128(sp_digit* r, const sp_digit* a,
  56487. const sp_digit* m, sp_digit mp)
  56488. {
  56489. sp_4096_sqr_128(r, a);
  56490. sp_4096_mont_reduce_128(r, m, mp);
  56491. }
  56492. #ifdef WOLFSSL_SP_SMALL
  56493. /* Sub b from a into r. (r = a - b)
  56494. *
  56495. * r A single precision integer.
  56496. * a A single precision integer.
  56497. * b A single precision integer.
  56498. */
  56499. static sp_digit sp_4096_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  56500. {
  56501. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  56502. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  56503. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  56504. __asm__ __volatile__ (
  56505. "mov r12, #0\n\t"
  56506. "add lr, %[a], #0x200\n\t"
  56507. "\n"
  56508. "L_sp_4096_sub_128_word_%=: \n\t"
  56509. "rsbs r12, r12, #0\n\t"
  56510. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56511. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56512. "sbcs r3, r3, r7\n\t"
  56513. "sbcs r4, r4, r8\n\t"
  56514. "sbcs r5, r5, r9\n\t"
  56515. "sbcs r6, r6, r10\n\t"
  56516. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56517. "sbc r12, r3, r3\n\t"
  56518. "cmp %[a], lr\n\t"
  56519. "bne L_sp_4096_sub_128_word_%=\n\t"
  56520. "mov %[r], r12\n\t"
  56521. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  56522. :
  56523. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  56524. );
  56525. return (uint32_t)(size_t)r;
  56526. }
  56527. #else
  56528. /* Sub b from a into r. (r = a - b)
  56529. *
  56530. * r A single precision integer.
  56531. * a A single precision integer.
  56532. * b A single precision integer.
  56533. */
  56534. static sp_digit sp_4096_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  56535. {
  56536. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  56537. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  56538. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  56539. __asm__ __volatile__ (
  56540. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56541. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56542. "subs r3, r3, r7\n\t"
  56543. "sbcs r4, r4, r8\n\t"
  56544. "sbcs r5, r5, r9\n\t"
  56545. "sbcs r6, r6, r10\n\t"
  56546. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56547. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56548. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56549. "sbcs r3, r3, r7\n\t"
  56550. "sbcs r4, r4, r8\n\t"
  56551. "sbcs r5, r5, r9\n\t"
  56552. "sbcs r6, r6, r10\n\t"
  56553. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56554. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56555. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56556. "sbcs r3, r3, r7\n\t"
  56557. "sbcs r4, r4, r8\n\t"
  56558. "sbcs r5, r5, r9\n\t"
  56559. "sbcs r6, r6, r10\n\t"
  56560. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56561. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56562. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56563. "sbcs r3, r3, r7\n\t"
  56564. "sbcs r4, r4, r8\n\t"
  56565. "sbcs r5, r5, r9\n\t"
  56566. "sbcs r6, r6, r10\n\t"
  56567. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56568. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56569. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56570. "sbcs r3, r3, r7\n\t"
  56571. "sbcs r4, r4, r8\n\t"
  56572. "sbcs r5, r5, r9\n\t"
  56573. "sbcs r6, r6, r10\n\t"
  56574. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56575. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56576. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56577. "sbcs r3, r3, r7\n\t"
  56578. "sbcs r4, r4, r8\n\t"
  56579. "sbcs r5, r5, r9\n\t"
  56580. "sbcs r6, r6, r10\n\t"
  56581. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56582. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56583. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56584. "sbcs r3, r3, r7\n\t"
  56585. "sbcs r4, r4, r8\n\t"
  56586. "sbcs r5, r5, r9\n\t"
  56587. "sbcs r6, r6, r10\n\t"
  56588. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56589. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56590. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56591. "sbcs r3, r3, r7\n\t"
  56592. "sbcs r4, r4, r8\n\t"
  56593. "sbcs r5, r5, r9\n\t"
  56594. "sbcs r6, r6, r10\n\t"
  56595. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56596. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56597. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56598. "sbcs r3, r3, r7\n\t"
  56599. "sbcs r4, r4, r8\n\t"
  56600. "sbcs r5, r5, r9\n\t"
  56601. "sbcs r6, r6, r10\n\t"
  56602. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56603. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56604. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56605. "sbcs r3, r3, r7\n\t"
  56606. "sbcs r4, r4, r8\n\t"
  56607. "sbcs r5, r5, r9\n\t"
  56608. "sbcs r6, r6, r10\n\t"
  56609. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56610. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56611. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56612. "sbcs r3, r3, r7\n\t"
  56613. "sbcs r4, r4, r8\n\t"
  56614. "sbcs r5, r5, r9\n\t"
  56615. "sbcs r6, r6, r10\n\t"
  56616. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56617. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56618. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56619. "sbcs r3, r3, r7\n\t"
  56620. "sbcs r4, r4, r8\n\t"
  56621. "sbcs r5, r5, r9\n\t"
  56622. "sbcs r6, r6, r10\n\t"
  56623. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56624. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56625. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56626. "sbcs r3, r3, r7\n\t"
  56627. "sbcs r4, r4, r8\n\t"
  56628. "sbcs r5, r5, r9\n\t"
  56629. "sbcs r6, r6, r10\n\t"
  56630. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56631. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56632. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56633. "sbcs r3, r3, r7\n\t"
  56634. "sbcs r4, r4, r8\n\t"
  56635. "sbcs r5, r5, r9\n\t"
  56636. "sbcs r6, r6, r10\n\t"
  56637. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56638. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56639. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56640. "sbcs r3, r3, r7\n\t"
  56641. "sbcs r4, r4, r8\n\t"
  56642. "sbcs r5, r5, r9\n\t"
  56643. "sbcs r6, r6, r10\n\t"
  56644. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56645. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56646. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56647. "sbcs r3, r3, r7\n\t"
  56648. "sbcs r4, r4, r8\n\t"
  56649. "sbcs r5, r5, r9\n\t"
  56650. "sbcs r6, r6, r10\n\t"
  56651. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56652. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56653. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56654. "sbcs r3, r3, r7\n\t"
  56655. "sbcs r4, r4, r8\n\t"
  56656. "sbcs r5, r5, r9\n\t"
  56657. "sbcs r6, r6, r10\n\t"
  56658. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56659. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56660. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56661. "sbcs r3, r3, r7\n\t"
  56662. "sbcs r4, r4, r8\n\t"
  56663. "sbcs r5, r5, r9\n\t"
  56664. "sbcs r6, r6, r10\n\t"
  56665. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56666. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56667. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56668. "sbcs r3, r3, r7\n\t"
  56669. "sbcs r4, r4, r8\n\t"
  56670. "sbcs r5, r5, r9\n\t"
  56671. "sbcs r6, r6, r10\n\t"
  56672. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56673. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56674. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56675. "sbcs r3, r3, r7\n\t"
  56676. "sbcs r4, r4, r8\n\t"
  56677. "sbcs r5, r5, r9\n\t"
  56678. "sbcs r6, r6, r10\n\t"
  56679. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56680. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56681. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56682. "sbcs r3, r3, r7\n\t"
  56683. "sbcs r4, r4, r8\n\t"
  56684. "sbcs r5, r5, r9\n\t"
  56685. "sbcs r6, r6, r10\n\t"
  56686. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56687. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56688. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56689. "sbcs r3, r3, r7\n\t"
  56690. "sbcs r4, r4, r8\n\t"
  56691. "sbcs r5, r5, r9\n\t"
  56692. "sbcs r6, r6, r10\n\t"
  56693. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56694. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56695. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56696. "sbcs r3, r3, r7\n\t"
  56697. "sbcs r4, r4, r8\n\t"
  56698. "sbcs r5, r5, r9\n\t"
  56699. "sbcs r6, r6, r10\n\t"
  56700. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56701. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56702. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56703. "sbcs r3, r3, r7\n\t"
  56704. "sbcs r4, r4, r8\n\t"
  56705. "sbcs r5, r5, r9\n\t"
  56706. "sbcs r6, r6, r10\n\t"
  56707. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56708. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56709. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56710. "sbcs r3, r3, r7\n\t"
  56711. "sbcs r4, r4, r8\n\t"
  56712. "sbcs r5, r5, r9\n\t"
  56713. "sbcs r6, r6, r10\n\t"
  56714. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56715. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56716. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56717. "sbcs r3, r3, r7\n\t"
  56718. "sbcs r4, r4, r8\n\t"
  56719. "sbcs r5, r5, r9\n\t"
  56720. "sbcs r6, r6, r10\n\t"
  56721. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56722. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56723. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56724. "sbcs r3, r3, r7\n\t"
  56725. "sbcs r4, r4, r8\n\t"
  56726. "sbcs r5, r5, r9\n\t"
  56727. "sbcs r6, r6, r10\n\t"
  56728. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56729. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56730. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56731. "sbcs r3, r3, r7\n\t"
  56732. "sbcs r4, r4, r8\n\t"
  56733. "sbcs r5, r5, r9\n\t"
  56734. "sbcs r6, r6, r10\n\t"
  56735. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56736. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56737. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56738. "sbcs r3, r3, r7\n\t"
  56739. "sbcs r4, r4, r8\n\t"
  56740. "sbcs r5, r5, r9\n\t"
  56741. "sbcs r6, r6, r10\n\t"
  56742. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56743. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56744. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56745. "sbcs r3, r3, r7\n\t"
  56746. "sbcs r4, r4, r8\n\t"
  56747. "sbcs r5, r5, r9\n\t"
  56748. "sbcs r6, r6, r10\n\t"
  56749. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56750. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56751. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56752. "sbcs r3, r3, r7\n\t"
  56753. "sbcs r4, r4, r8\n\t"
  56754. "sbcs r5, r5, r9\n\t"
  56755. "sbcs r6, r6, r10\n\t"
  56756. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56757. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  56758. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  56759. "sbcs r3, r3, r7\n\t"
  56760. "sbcs r4, r4, r8\n\t"
  56761. "sbcs r5, r5, r9\n\t"
  56762. "sbcs r6, r6, r10\n\t"
  56763. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  56764. "sbc %[r], r6, r6\n\t"
  56765. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  56766. :
  56767. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  56768. );
  56769. return (uint32_t)(size_t)r;
  56770. }
  56771. #endif /* WOLFSSL_SP_SMALL */
  56772. #ifdef WOLFSSL_SP_USE_UDIV
  56773. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  56774. *
  56775. * d1 The high order half of the number to divide.
  56776. * d0 The low order half of the number to divide.
  56777. * div The divisor.
  56778. * returns the result of the division.
  56779. *
  56780. * Note that this is an approximate div. It may give an answer 1 larger.
  56781. */
  56782. static sp_digit div_4096_word_128(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  56783. {
  56784. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  56785. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  56786. register sp_digit div asm ("r2") = (sp_digit)div_p;
  56787. __asm__ __volatile__ (
  56788. "lsr r6, %[div], #16\n\t"
  56789. "add lr, r6, #1\n\t"
  56790. "udiv r4, %[d1], lr\n\t"
  56791. "lsl r5, %[div], #16\n\t"
  56792. "lsl r4, r4, #16\n\t"
  56793. "umull r3, r12, %[div], r4\n\t"
  56794. "subs %[d0], %[d0], r3\n\t"
  56795. "sbc %[d1], %[d1], r12\n\t"
  56796. "subs r3, %[d1], lr\n\t"
  56797. "sbc r7, r7, r7\n\t"
  56798. "add r7, r7, #1\n\t"
  56799. "rsb r8, r7, #0\n\t"
  56800. "lsl r7, r7, #16\n\t"
  56801. "and r5, r5, r8\n\t"
  56802. "and r6, r6, r8\n\t"
  56803. "subs %[d0], %[d0], r5\n\t"
  56804. "add r4, r4, r7\n\t"
  56805. "sbc %[d1], %[d1], r6\n\t"
  56806. "lsl r12, %[d1], #16\n\t"
  56807. "lsr r3, %[d0], #16\n\t"
  56808. "orr r3, r3, r12\n\t"
  56809. "udiv r3, r3, lr\n\t"
  56810. "add r4, r4, r3\n\t"
  56811. "umull r3, r12, %[div], r3\n\t"
  56812. "subs %[d0], %[d0], r3\n\t"
  56813. "sbc %[d1], %[d1], r12\n\t"
  56814. "lsl r12, %[d1], #16\n\t"
  56815. "lsr r3, %[d0], #16\n\t"
  56816. "orr r3, r3, r12\n\t"
  56817. "udiv r3, r3, lr\n\t"
  56818. "add r4, r4, r3\n\t"
  56819. "mul r3, %[div], r3\n\t"
  56820. "sub %[d0], %[d0], r3\n\t"
  56821. "udiv r3, %[d0], %[div]\n\t"
  56822. "add %[d1], r4, r3\n\t"
  56823. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  56824. :
  56825. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  56826. );
  56827. return (uint32_t)(size_t)d1;
  56828. }
  56829. #else
  56830. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  56831. *
  56832. * d1 The high order half of the number to divide.
  56833. * d0 The low order half of the number to divide.
  56834. * div The divisor.
  56835. * returns the result of the division.
  56836. *
  56837. * Note that this is an approximate div. It may give an answer 1 larger.
  56838. */
  56839. static sp_digit div_4096_word_128(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  56840. {
  56841. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  56842. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  56843. register sp_digit div asm ("r2") = (sp_digit)div_p;
  56844. __asm__ __volatile__ (
  56845. "lsr lr, %[div], #1\n\t"
  56846. "add lr, lr, #1\n\t"
  56847. "mov r4, %[d0]\n\t"
  56848. "mov r5, %[d1]\n\t"
  56849. /* Do top 32 */
  56850. "subs r6, lr, r5\n\t"
  56851. "sbc r6, r6, r6\n\t"
  56852. "mov r3, #0\n\t"
  56853. "sub r3, r3, r6\n\t"
  56854. "and r6, r6, lr\n\t"
  56855. "subs r5, r5, r6\n\t"
  56856. /* Next 30 bits */
  56857. "mov r12, #29\n\t"
  56858. "\n"
  56859. "L_div_4096_word_128_bit_%=: \n\t"
  56860. "lsls r4, r4, #1\n\t"
  56861. "adc r5, r5, r5\n\t"
  56862. "subs r6, lr, r5\n\t"
  56863. "sbc r6, r6, r6\n\t"
  56864. "add r3, r3, r3\n\t"
  56865. "sub r3, r3, r6\n\t"
  56866. "and r6, r6, lr\n\t"
  56867. "subs r5, r5, r6\n\t"
  56868. "subs r12, r12, #1\n\t"
  56869. "bpl L_div_4096_word_128_bit_%=\n\t"
  56870. "add r3, r3, r3\n\t"
  56871. "add r3, r3, #1\n\t"
  56872. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  56873. "lsl r7, r3, #16\n\t"
  56874. "lsl r4, %[div], #16\n\t"
  56875. "lsr r7, r7, #16\n\t"
  56876. "lsr r4, r4, #16\n\t"
  56877. "mul r4, r7, r4\n\t"
  56878. "lsr r8, %[div], #16\n\t"
  56879. "mul r7, r8, r7\n\t"
  56880. "lsr r5, r7, #16\n\t"
  56881. "lsl r7, r7, #16\n\t"
  56882. "adds r4, r4, r7\n\t"
  56883. "adc r5, r5, #0\n\t"
  56884. "lsr r7, r3, #16\n\t"
  56885. "mul r8, r7, r8\n\t"
  56886. "add r5, r5, r8\n\t"
  56887. "lsl r8, %[div], #16\n\t"
  56888. "lsr r8, r8, #16\n\t"
  56889. "mul r7, r8, r7\n\t"
  56890. "lsr r8, r7, #16\n\t"
  56891. "lsl r7, r7, #16\n\t"
  56892. "adds r4, r4, r7\n\t"
  56893. "adc r5, r5, r8\n\t"
  56894. #else
  56895. "umull r4, r5, r3, %[div]\n\t"
  56896. #endif
  56897. "subs r7, %[d0], r4\n\t"
  56898. "sbc r8, %[d1], r5\n\t"
  56899. "add r3, r3, r8\n\t"
  56900. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  56901. "lsl r7, r3, #16\n\t"
  56902. "lsl r4, %[div], #16\n\t"
  56903. "lsr r7, r7, #16\n\t"
  56904. "lsr r4, r4, #16\n\t"
  56905. "mul r4, r7, r4\n\t"
  56906. "lsr r8, %[div], #16\n\t"
  56907. "mul r7, r8, r7\n\t"
  56908. "lsr r5, r7, #16\n\t"
  56909. "lsl r7, r7, #16\n\t"
  56910. "adds r4, r4, r7\n\t"
  56911. "adc r5, r5, #0\n\t"
  56912. "lsr r7, r3, #16\n\t"
  56913. "mul r8, r7, r8\n\t"
  56914. "add r5, r5, r8\n\t"
  56915. "lsl r8, %[div], #16\n\t"
  56916. "lsr r8, r8, #16\n\t"
  56917. "mul r7, r8, r7\n\t"
  56918. "lsr r8, r7, #16\n\t"
  56919. "lsl r7, r7, #16\n\t"
  56920. "adds r4, r4, r7\n\t"
  56921. "adc r5, r5, r8\n\t"
  56922. #else
  56923. "umull r4, r5, r3, %[div]\n\t"
  56924. #endif
  56925. "subs r7, %[d0], r4\n\t"
  56926. "sbc r8, %[d1], r5\n\t"
  56927. "add r3, r3, r8\n\t"
  56928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  56929. "lsl r7, r3, #16\n\t"
  56930. "lsl r4, %[div], #16\n\t"
  56931. "lsr r7, r7, #16\n\t"
  56932. "lsr r4, r4, #16\n\t"
  56933. "mul r4, r7, r4\n\t"
  56934. "lsr r8, %[div], #16\n\t"
  56935. "mul r7, r8, r7\n\t"
  56936. "lsr r5, r7, #16\n\t"
  56937. "lsl r7, r7, #16\n\t"
  56938. "adds r4, r4, r7\n\t"
  56939. "adc r5, r5, #0\n\t"
  56940. "lsr r7, r3, #16\n\t"
  56941. "mul r8, r7, r8\n\t"
  56942. "add r5, r5, r8\n\t"
  56943. "lsl r8, %[div], #16\n\t"
  56944. "lsr r8, r8, #16\n\t"
  56945. "mul r7, r8, r7\n\t"
  56946. "lsr r8, r7, #16\n\t"
  56947. "lsl r7, r7, #16\n\t"
  56948. "adds r4, r4, r7\n\t"
  56949. "adc r5, r5, r8\n\t"
  56950. #else
  56951. "umull r4, r5, r3, %[div]\n\t"
  56952. #endif
  56953. "subs r7, %[d0], r4\n\t"
  56954. "sbc r8, %[d1], r5\n\t"
  56955. "add r3, r3, r8\n\t"
  56956. "subs r6, %[div], r7\n\t"
  56957. "sbc r6, r6, r6\n\t"
  56958. "sub %[d1], r3, r6\n\t"
  56959. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  56960. :
  56961. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  56962. );
  56963. return (uint32_t)(size_t)d1;
  56964. }
  56965. #endif
  56966. /* Divide d in a and put remainder into r (m*d + r = a)
  56967. * m is not calculated as it is not needed at this time.
  56968. *
  56969. * a Number to be divided.
  56970. * d Number to divide with.
  56971. * m Multiplier result.
  56972. * r Remainder from the division.
  56973. * returns MP_OKAY indicating success.
  56974. */
  56975. static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d,
  56976. sp_digit* m, sp_digit* r)
  56977. {
  56978. sp_digit t1[256], t2[129];
  56979. sp_digit div, r1;
  56980. int i;
  56981. (void)m;
  56982. div = d[127];
  56983. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  56984. for (i = 127; i > 0; i--) {
  56985. if (t1[i + 128] != d[i])
  56986. break;
  56987. }
  56988. if (t1[i + 128] >= d[i]) {
  56989. sp_4096_sub_in_place_128(&t1[128], d);
  56990. }
  56991. for (i = 127; i >= 0; i--) {
  56992. if (t1[128 + i] == div) {
  56993. r1 = SP_DIGIT_MAX;
  56994. }
  56995. else {
  56996. r1 = div_4096_word_128(t1[128 + i], t1[128 + i - 1], div);
  56997. }
  56998. sp_4096_mul_d_128(t2, d, r1);
  56999. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  57000. t1[128 + i] -= t2[128];
  57001. if (t1[128 + i] != 0) {
  57002. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  57003. if (t1[128 + i] != 0)
  57004. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  57005. }
  57006. }
  57007. for (i = 127; i > 0; i--) {
  57008. if (t1[i] != d[i])
  57009. break;
  57010. }
  57011. if (t1[i] >= d[i]) {
  57012. sp_4096_sub_128(r, t1, d);
  57013. }
  57014. else {
  57015. XMEMCPY(r, t1, sizeof(*t1) * 128);
  57016. }
  57017. return MP_OKAY;
  57018. }
  57019. /* Reduce a modulo m into r. (r = a mod m)
  57020. *
  57021. * r A single precision number that is the reduced result.
  57022. * a A single precision number that is to be reduced.
  57023. * m A single precision number that is the modulus to reduce with.
  57024. * returns MP_OKAY indicating success.
  57025. */
  57026. static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a,
  57027. const sp_digit* m)
  57028. {
  57029. return sp_4096_div_128_cond(a, m, NULL, r);
  57030. }
  57031. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  57032. #if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY)
  57033. /* AND m into each word of a and store in r.
  57034. *
  57035. * r A single precision integer.
  57036. * a A single precision integer.
  57037. * m Mask to AND against each digit.
  57038. */
  57039. static void sp_4096_mask_128(sp_digit* r, const sp_digit* a, sp_digit m)
  57040. {
  57041. #ifdef WOLFSSL_SP_SMALL
  57042. int i;
  57043. for (i=0; i<128; i++) {
  57044. r[i] = a[i] & m;
  57045. }
  57046. #else
  57047. int i;
  57048. for (i = 0; i < 128; i += 8) {
  57049. r[i+0] = a[i+0] & m;
  57050. r[i+1] = a[i+1] & m;
  57051. r[i+2] = a[i+2] & m;
  57052. r[i+3] = a[i+3] & m;
  57053. r[i+4] = a[i+4] & m;
  57054. r[i+5] = a[i+5] & m;
  57055. r[i+6] = a[i+6] & m;
  57056. r[i+7] = a[i+7] & m;
  57057. }
  57058. #endif
  57059. }
  57060. /* Compare a with b in constant time.
  57061. *
  57062. * a A single precision integer.
  57063. * b A single precision integer.
  57064. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  57065. * respectively.
  57066. */
  57067. static sp_int32 sp_4096_cmp_128(const sp_digit* a_p, const sp_digit* b_p)
  57068. {
  57069. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  57070. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  57071. __asm__ __volatile__ (
  57072. "mov r2, #-1\n\t"
  57073. "mov r6, #1\n\t"
  57074. "mov r5, #0\n\t"
  57075. "mov r3, #-1\n\t"
  57076. #ifdef WOLFSSL_SP_SMALL
  57077. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  57078. "mov r4, #0x1\n\t"
  57079. "lsl r4, r4, #8\n\t"
  57080. "add r4, r4, #0xfc\n\t"
  57081. #else
  57082. "mov r4, #0x1fc\n\t"
  57083. #endif
  57084. "\n"
  57085. "L_sp_4096_cmp_128_words_%=: \n\t"
  57086. "ldr r12, [%[a], r4]\n\t"
  57087. "ldr lr, [%[b], r4]\n\t"
  57088. "and r12, r12, r3\n\t"
  57089. "and lr, lr, r3\n\t"
  57090. "subs r12, r12, lr\n\t"
  57091. "it hi\n\t"
  57092. "movhi r2, r6\n\t"
  57093. "it lo\n\t"
  57094. "movlo r2, r3\n\t"
  57095. "it ne\n\t"
  57096. "movne r3, r5\n\t"
  57097. "subs r4, r4, #4\n\t"
  57098. "bcs L_sp_4096_cmp_128_words_%=\n\t"
  57099. "eor r2, r2, r3\n\t"
  57100. #else
  57101. "ldr r12, [%[a], #508]\n\t"
  57102. "ldr lr, [%[b], #508]\n\t"
  57103. "and r12, r12, r3\n\t"
  57104. "and lr, lr, r3\n\t"
  57105. "subs r12, r12, lr\n\t"
  57106. "it hi\n\t"
  57107. "movhi r2, r6\n\t"
  57108. "it lo\n\t"
  57109. "movlo r2, r3\n\t"
  57110. "it ne\n\t"
  57111. "movne r3, r5\n\t"
  57112. "ldr r12, [%[a], #504]\n\t"
  57113. "ldr lr, [%[b], #504]\n\t"
  57114. "and r12, r12, r3\n\t"
  57115. "and lr, lr, r3\n\t"
  57116. "subs r12, r12, lr\n\t"
  57117. "it hi\n\t"
  57118. "movhi r2, r6\n\t"
  57119. "it lo\n\t"
  57120. "movlo r2, r3\n\t"
  57121. "it ne\n\t"
  57122. "movne r3, r5\n\t"
  57123. "ldr r12, [%[a], #500]\n\t"
  57124. "ldr lr, [%[b], #500]\n\t"
  57125. "and r12, r12, r3\n\t"
  57126. "and lr, lr, r3\n\t"
  57127. "subs r12, r12, lr\n\t"
  57128. "it hi\n\t"
  57129. "movhi r2, r6\n\t"
  57130. "it lo\n\t"
  57131. "movlo r2, r3\n\t"
  57132. "it ne\n\t"
  57133. "movne r3, r5\n\t"
  57134. "ldr r12, [%[a], #496]\n\t"
  57135. "ldr lr, [%[b], #496]\n\t"
  57136. "and r12, r12, r3\n\t"
  57137. "and lr, lr, r3\n\t"
  57138. "subs r12, r12, lr\n\t"
  57139. "it hi\n\t"
  57140. "movhi r2, r6\n\t"
  57141. "it lo\n\t"
  57142. "movlo r2, r3\n\t"
  57143. "it ne\n\t"
  57144. "movne r3, r5\n\t"
  57145. "ldr r12, [%[a], #492]\n\t"
  57146. "ldr lr, [%[b], #492]\n\t"
  57147. "and r12, r12, r3\n\t"
  57148. "and lr, lr, r3\n\t"
  57149. "subs r12, r12, lr\n\t"
  57150. "it hi\n\t"
  57151. "movhi r2, r6\n\t"
  57152. "it lo\n\t"
  57153. "movlo r2, r3\n\t"
  57154. "it ne\n\t"
  57155. "movne r3, r5\n\t"
  57156. "ldr r12, [%[a], #488]\n\t"
  57157. "ldr lr, [%[b], #488]\n\t"
  57158. "and r12, r12, r3\n\t"
  57159. "and lr, lr, r3\n\t"
  57160. "subs r12, r12, lr\n\t"
  57161. "it hi\n\t"
  57162. "movhi r2, r6\n\t"
  57163. "it lo\n\t"
  57164. "movlo r2, r3\n\t"
  57165. "it ne\n\t"
  57166. "movne r3, r5\n\t"
  57167. "ldr r12, [%[a], #484]\n\t"
  57168. "ldr lr, [%[b], #484]\n\t"
  57169. "and r12, r12, r3\n\t"
  57170. "and lr, lr, r3\n\t"
  57171. "subs r12, r12, lr\n\t"
  57172. "it hi\n\t"
  57173. "movhi r2, r6\n\t"
  57174. "it lo\n\t"
  57175. "movlo r2, r3\n\t"
  57176. "it ne\n\t"
  57177. "movne r3, r5\n\t"
  57178. "ldr r12, [%[a], #480]\n\t"
  57179. "ldr lr, [%[b], #480]\n\t"
  57180. "and r12, r12, r3\n\t"
  57181. "and lr, lr, r3\n\t"
  57182. "subs r12, r12, lr\n\t"
  57183. "it hi\n\t"
  57184. "movhi r2, r6\n\t"
  57185. "it lo\n\t"
  57186. "movlo r2, r3\n\t"
  57187. "it ne\n\t"
  57188. "movne r3, r5\n\t"
  57189. "ldr r12, [%[a], #476]\n\t"
  57190. "ldr lr, [%[b], #476]\n\t"
  57191. "and r12, r12, r3\n\t"
  57192. "and lr, lr, r3\n\t"
  57193. "subs r12, r12, lr\n\t"
  57194. "it hi\n\t"
  57195. "movhi r2, r6\n\t"
  57196. "it lo\n\t"
  57197. "movlo r2, r3\n\t"
  57198. "it ne\n\t"
  57199. "movne r3, r5\n\t"
  57200. "ldr r12, [%[a], #472]\n\t"
  57201. "ldr lr, [%[b], #472]\n\t"
  57202. "and r12, r12, r3\n\t"
  57203. "and lr, lr, r3\n\t"
  57204. "subs r12, r12, lr\n\t"
  57205. "it hi\n\t"
  57206. "movhi r2, r6\n\t"
  57207. "it lo\n\t"
  57208. "movlo r2, r3\n\t"
  57209. "it ne\n\t"
  57210. "movne r3, r5\n\t"
  57211. "ldr r12, [%[a], #468]\n\t"
  57212. "ldr lr, [%[b], #468]\n\t"
  57213. "and r12, r12, r3\n\t"
  57214. "and lr, lr, r3\n\t"
  57215. "subs r12, r12, lr\n\t"
  57216. "it hi\n\t"
  57217. "movhi r2, r6\n\t"
  57218. "it lo\n\t"
  57219. "movlo r2, r3\n\t"
  57220. "it ne\n\t"
  57221. "movne r3, r5\n\t"
  57222. "ldr r12, [%[a], #464]\n\t"
  57223. "ldr lr, [%[b], #464]\n\t"
  57224. "and r12, r12, r3\n\t"
  57225. "and lr, lr, r3\n\t"
  57226. "subs r12, r12, lr\n\t"
  57227. "it hi\n\t"
  57228. "movhi r2, r6\n\t"
  57229. "it lo\n\t"
  57230. "movlo r2, r3\n\t"
  57231. "it ne\n\t"
  57232. "movne r3, r5\n\t"
  57233. "ldr r12, [%[a], #460]\n\t"
  57234. "ldr lr, [%[b], #460]\n\t"
  57235. "and r12, r12, r3\n\t"
  57236. "and lr, lr, r3\n\t"
  57237. "subs r12, r12, lr\n\t"
  57238. "it hi\n\t"
  57239. "movhi r2, r6\n\t"
  57240. "it lo\n\t"
  57241. "movlo r2, r3\n\t"
  57242. "it ne\n\t"
  57243. "movne r3, r5\n\t"
  57244. "ldr r12, [%[a], #456]\n\t"
  57245. "ldr lr, [%[b], #456]\n\t"
  57246. "and r12, r12, r3\n\t"
  57247. "and lr, lr, r3\n\t"
  57248. "subs r12, r12, lr\n\t"
  57249. "it hi\n\t"
  57250. "movhi r2, r6\n\t"
  57251. "it lo\n\t"
  57252. "movlo r2, r3\n\t"
  57253. "it ne\n\t"
  57254. "movne r3, r5\n\t"
  57255. "ldr r12, [%[a], #452]\n\t"
  57256. "ldr lr, [%[b], #452]\n\t"
  57257. "and r12, r12, r3\n\t"
  57258. "and lr, lr, r3\n\t"
  57259. "subs r12, r12, lr\n\t"
  57260. "it hi\n\t"
  57261. "movhi r2, r6\n\t"
  57262. "it lo\n\t"
  57263. "movlo r2, r3\n\t"
  57264. "it ne\n\t"
  57265. "movne r3, r5\n\t"
  57266. "ldr r12, [%[a], #448]\n\t"
  57267. "ldr lr, [%[b], #448]\n\t"
  57268. "and r12, r12, r3\n\t"
  57269. "and lr, lr, r3\n\t"
  57270. "subs r12, r12, lr\n\t"
  57271. "it hi\n\t"
  57272. "movhi r2, r6\n\t"
  57273. "it lo\n\t"
  57274. "movlo r2, r3\n\t"
  57275. "it ne\n\t"
  57276. "movne r3, r5\n\t"
  57277. "ldr r12, [%[a], #444]\n\t"
  57278. "ldr lr, [%[b], #444]\n\t"
  57279. "and r12, r12, r3\n\t"
  57280. "and lr, lr, r3\n\t"
  57281. "subs r12, r12, lr\n\t"
  57282. "it hi\n\t"
  57283. "movhi r2, r6\n\t"
  57284. "it lo\n\t"
  57285. "movlo r2, r3\n\t"
  57286. "it ne\n\t"
  57287. "movne r3, r5\n\t"
  57288. "ldr r12, [%[a], #440]\n\t"
  57289. "ldr lr, [%[b], #440]\n\t"
  57290. "and r12, r12, r3\n\t"
  57291. "and lr, lr, r3\n\t"
  57292. "subs r12, r12, lr\n\t"
  57293. "it hi\n\t"
  57294. "movhi r2, r6\n\t"
  57295. "it lo\n\t"
  57296. "movlo r2, r3\n\t"
  57297. "it ne\n\t"
  57298. "movne r3, r5\n\t"
  57299. "ldr r12, [%[a], #436]\n\t"
  57300. "ldr lr, [%[b], #436]\n\t"
  57301. "and r12, r12, r3\n\t"
  57302. "and lr, lr, r3\n\t"
  57303. "subs r12, r12, lr\n\t"
  57304. "it hi\n\t"
  57305. "movhi r2, r6\n\t"
  57306. "it lo\n\t"
  57307. "movlo r2, r3\n\t"
  57308. "it ne\n\t"
  57309. "movne r3, r5\n\t"
  57310. "ldr r12, [%[a], #432]\n\t"
  57311. "ldr lr, [%[b], #432]\n\t"
  57312. "and r12, r12, r3\n\t"
  57313. "and lr, lr, r3\n\t"
  57314. "subs r12, r12, lr\n\t"
  57315. "it hi\n\t"
  57316. "movhi r2, r6\n\t"
  57317. "it lo\n\t"
  57318. "movlo r2, r3\n\t"
  57319. "it ne\n\t"
  57320. "movne r3, r5\n\t"
  57321. "ldr r12, [%[a], #428]\n\t"
  57322. "ldr lr, [%[b], #428]\n\t"
  57323. "and r12, r12, r3\n\t"
  57324. "and lr, lr, r3\n\t"
  57325. "subs r12, r12, lr\n\t"
  57326. "it hi\n\t"
  57327. "movhi r2, r6\n\t"
  57328. "it lo\n\t"
  57329. "movlo r2, r3\n\t"
  57330. "it ne\n\t"
  57331. "movne r3, r5\n\t"
  57332. "ldr r12, [%[a], #424]\n\t"
  57333. "ldr lr, [%[b], #424]\n\t"
  57334. "and r12, r12, r3\n\t"
  57335. "and lr, lr, r3\n\t"
  57336. "subs r12, r12, lr\n\t"
  57337. "it hi\n\t"
  57338. "movhi r2, r6\n\t"
  57339. "it lo\n\t"
  57340. "movlo r2, r3\n\t"
  57341. "it ne\n\t"
  57342. "movne r3, r5\n\t"
  57343. "ldr r12, [%[a], #420]\n\t"
  57344. "ldr lr, [%[b], #420]\n\t"
  57345. "and r12, r12, r3\n\t"
  57346. "and lr, lr, r3\n\t"
  57347. "subs r12, r12, lr\n\t"
  57348. "it hi\n\t"
  57349. "movhi r2, r6\n\t"
  57350. "it lo\n\t"
  57351. "movlo r2, r3\n\t"
  57352. "it ne\n\t"
  57353. "movne r3, r5\n\t"
  57354. "ldr r12, [%[a], #416]\n\t"
  57355. "ldr lr, [%[b], #416]\n\t"
  57356. "and r12, r12, r3\n\t"
  57357. "and lr, lr, r3\n\t"
  57358. "subs r12, r12, lr\n\t"
  57359. "it hi\n\t"
  57360. "movhi r2, r6\n\t"
  57361. "it lo\n\t"
  57362. "movlo r2, r3\n\t"
  57363. "it ne\n\t"
  57364. "movne r3, r5\n\t"
  57365. "ldr r12, [%[a], #412]\n\t"
  57366. "ldr lr, [%[b], #412]\n\t"
  57367. "and r12, r12, r3\n\t"
  57368. "and lr, lr, r3\n\t"
  57369. "subs r12, r12, lr\n\t"
  57370. "it hi\n\t"
  57371. "movhi r2, r6\n\t"
  57372. "it lo\n\t"
  57373. "movlo r2, r3\n\t"
  57374. "it ne\n\t"
  57375. "movne r3, r5\n\t"
  57376. "ldr r12, [%[a], #408]\n\t"
  57377. "ldr lr, [%[b], #408]\n\t"
  57378. "and r12, r12, r3\n\t"
  57379. "and lr, lr, r3\n\t"
  57380. "subs r12, r12, lr\n\t"
  57381. "it hi\n\t"
  57382. "movhi r2, r6\n\t"
  57383. "it lo\n\t"
  57384. "movlo r2, r3\n\t"
  57385. "it ne\n\t"
  57386. "movne r3, r5\n\t"
  57387. "ldr r12, [%[a], #404]\n\t"
  57388. "ldr lr, [%[b], #404]\n\t"
  57389. "and r12, r12, r3\n\t"
  57390. "and lr, lr, r3\n\t"
  57391. "subs r12, r12, lr\n\t"
  57392. "it hi\n\t"
  57393. "movhi r2, r6\n\t"
  57394. "it lo\n\t"
  57395. "movlo r2, r3\n\t"
  57396. "it ne\n\t"
  57397. "movne r3, r5\n\t"
  57398. "ldr r12, [%[a], #400]\n\t"
  57399. "ldr lr, [%[b], #400]\n\t"
  57400. "and r12, r12, r3\n\t"
  57401. "and lr, lr, r3\n\t"
  57402. "subs r12, r12, lr\n\t"
  57403. "it hi\n\t"
  57404. "movhi r2, r6\n\t"
  57405. "it lo\n\t"
  57406. "movlo r2, r3\n\t"
  57407. "it ne\n\t"
  57408. "movne r3, r5\n\t"
  57409. "ldr r12, [%[a], #396]\n\t"
  57410. "ldr lr, [%[b], #396]\n\t"
  57411. "and r12, r12, r3\n\t"
  57412. "and lr, lr, r3\n\t"
  57413. "subs r12, r12, lr\n\t"
  57414. "it hi\n\t"
  57415. "movhi r2, r6\n\t"
  57416. "it lo\n\t"
  57417. "movlo r2, r3\n\t"
  57418. "it ne\n\t"
  57419. "movne r3, r5\n\t"
  57420. "ldr r12, [%[a], #392]\n\t"
  57421. "ldr lr, [%[b], #392]\n\t"
  57422. "and r12, r12, r3\n\t"
  57423. "and lr, lr, r3\n\t"
  57424. "subs r12, r12, lr\n\t"
  57425. "it hi\n\t"
  57426. "movhi r2, r6\n\t"
  57427. "it lo\n\t"
  57428. "movlo r2, r3\n\t"
  57429. "it ne\n\t"
  57430. "movne r3, r5\n\t"
  57431. "ldr r12, [%[a], #388]\n\t"
  57432. "ldr lr, [%[b], #388]\n\t"
  57433. "and r12, r12, r3\n\t"
  57434. "and lr, lr, r3\n\t"
  57435. "subs r12, r12, lr\n\t"
  57436. "it hi\n\t"
  57437. "movhi r2, r6\n\t"
  57438. "it lo\n\t"
  57439. "movlo r2, r3\n\t"
  57440. "it ne\n\t"
  57441. "movne r3, r5\n\t"
  57442. "ldr r12, [%[a], #384]\n\t"
  57443. "ldr lr, [%[b], #384]\n\t"
  57444. "and r12, r12, r3\n\t"
  57445. "and lr, lr, r3\n\t"
  57446. "subs r12, r12, lr\n\t"
  57447. "it hi\n\t"
  57448. "movhi r2, r6\n\t"
  57449. "it lo\n\t"
  57450. "movlo r2, r3\n\t"
  57451. "it ne\n\t"
  57452. "movne r3, r5\n\t"
  57453. "ldr r12, [%[a], #380]\n\t"
  57454. "ldr lr, [%[b], #380]\n\t"
  57455. "and r12, r12, r3\n\t"
  57456. "and lr, lr, r3\n\t"
  57457. "subs r12, r12, lr\n\t"
  57458. "it hi\n\t"
  57459. "movhi r2, r6\n\t"
  57460. "it lo\n\t"
  57461. "movlo r2, r3\n\t"
  57462. "it ne\n\t"
  57463. "movne r3, r5\n\t"
  57464. "ldr r12, [%[a], #376]\n\t"
  57465. "ldr lr, [%[b], #376]\n\t"
  57466. "and r12, r12, r3\n\t"
  57467. "and lr, lr, r3\n\t"
  57468. "subs r12, r12, lr\n\t"
  57469. "it hi\n\t"
  57470. "movhi r2, r6\n\t"
  57471. "it lo\n\t"
  57472. "movlo r2, r3\n\t"
  57473. "it ne\n\t"
  57474. "movne r3, r5\n\t"
  57475. "ldr r12, [%[a], #372]\n\t"
  57476. "ldr lr, [%[b], #372]\n\t"
  57477. "and r12, r12, r3\n\t"
  57478. "and lr, lr, r3\n\t"
  57479. "subs r12, r12, lr\n\t"
  57480. "it hi\n\t"
  57481. "movhi r2, r6\n\t"
  57482. "it lo\n\t"
  57483. "movlo r2, r3\n\t"
  57484. "it ne\n\t"
  57485. "movne r3, r5\n\t"
  57486. "ldr r12, [%[a], #368]\n\t"
  57487. "ldr lr, [%[b], #368]\n\t"
  57488. "and r12, r12, r3\n\t"
  57489. "and lr, lr, r3\n\t"
  57490. "subs r12, r12, lr\n\t"
  57491. "it hi\n\t"
  57492. "movhi r2, r6\n\t"
  57493. "it lo\n\t"
  57494. "movlo r2, r3\n\t"
  57495. "it ne\n\t"
  57496. "movne r3, r5\n\t"
  57497. "ldr r12, [%[a], #364]\n\t"
  57498. "ldr lr, [%[b], #364]\n\t"
  57499. "and r12, r12, r3\n\t"
  57500. "and lr, lr, r3\n\t"
  57501. "subs r12, r12, lr\n\t"
  57502. "it hi\n\t"
  57503. "movhi r2, r6\n\t"
  57504. "it lo\n\t"
  57505. "movlo r2, r3\n\t"
  57506. "it ne\n\t"
  57507. "movne r3, r5\n\t"
  57508. "ldr r12, [%[a], #360]\n\t"
  57509. "ldr lr, [%[b], #360]\n\t"
  57510. "and r12, r12, r3\n\t"
  57511. "and lr, lr, r3\n\t"
  57512. "subs r12, r12, lr\n\t"
  57513. "it hi\n\t"
  57514. "movhi r2, r6\n\t"
  57515. "it lo\n\t"
  57516. "movlo r2, r3\n\t"
  57517. "it ne\n\t"
  57518. "movne r3, r5\n\t"
  57519. "ldr r12, [%[a], #356]\n\t"
  57520. "ldr lr, [%[b], #356]\n\t"
  57521. "and r12, r12, r3\n\t"
  57522. "and lr, lr, r3\n\t"
  57523. "subs r12, r12, lr\n\t"
  57524. "it hi\n\t"
  57525. "movhi r2, r6\n\t"
  57526. "it lo\n\t"
  57527. "movlo r2, r3\n\t"
  57528. "it ne\n\t"
  57529. "movne r3, r5\n\t"
  57530. "ldr r12, [%[a], #352]\n\t"
  57531. "ldr lr, [%[b], #352]\n\t"
  57532. "and r12, r12, r3\n\t"
  57533. "and lr, lr, r3\n\t"
  57534. "subs r12, r12, lr\n\t"
  57535. "it hi\n\t"
  57536. "movhi r2, r6\n\t"
  57537. "it lo\n\t"
  57538. "movlo r2, r3\n\t"
  57539. "it ne\n\t"
  57540. "movne r3, r5\n\t"
  57541. "ldr r12, [%[a], #348]\n\t"
  57542. "ldr lr, [%[b], #348]\n\t"
  57543. "and r12, r12, r3\n\t"
  57544. "and lr, lr, r3\n\t"
  57545. "subs r12, r12, lr\n\t"
  57546. "it hi\n\t"
  57547. "movhi r2, r6\n\t"
  57548. "it lo\n\t"
  57549. "movlo r2, r3\n\t"
  57550. "it ne\n\t"
  57551. "movne r3, r5\n\t"
  57552. "ldr r12, [%[a], #344]\n\t"
  57553. "ldr lr, [%[b], #344]\n\t"
  57554. "and r12, r12, r3\n\t"
  57555. "and lr, lr, r3\n\t"
  57556. "subs r12, r12, lr\n\t"
  57557. "it hi\n\t"
  57558. "movhi r2, r6\n\t"
  57559. "it lo\n\t"
  57560. "movlo r2, r3\n\t"
  57561. "it ne\n\t"
  57562. "movne r3, r5\n\t"
  57563. "ldr r12, [%[a], #340]\n\t"
  57564. "ldr lr, [%[b], #340]\n\t"
  57565. "and r12, r12, r3\n\t"
  57566. "and lr, lr, r3\n\t"
  57567. "subs r12, r12, lr\n\t"
  57568. "it hi\n\t"
  57569. "movhi r2, r6\n\t"
  57570. "it lo\n\t"
  57571. "movlo r2, r3\n\t"
  57572. "it ne\n\t"
  57573. "movne r3, r5\n\t"
  57574. "ldr r12, [%[a], #336]\n\t"
  57575. "ldr lr, [%[b], #336]\n\t"
  57576. "and r12, r12, r3\n\t"
  57577. "and lr, lr, r3\n\t"
  57578. "subs r12, r12, lr\n\t"
  57579. "it hi\n\t"
  57580. "movhi r2, r6\n\t"
  57581. "it lo\n\t"
  57582. "movlo r2, r3\n\t"
  57583. "it ne\n\t"
  57584. "movne r3, r5\n\t"
  57585. "ldr r12, [%[a], #332]\n\t"
  57586. "ldr lr, [%[b], #332]\n\t"
  57587. "and r12, r12, r3\n\t"
  57588. "and lr, lr, r3\n\t"
  57589. "subs r12, r12, lr\n\t"
  57590. "it hi\n\t"
  57591. "movhi r2, r6\n\t"
  57592. "it lo\n\t"
  57593. "movlo r2, r3\n\t"
  57594. "it ne\n\t"
  57595. "movne r3, r5\n\t"
  57596. "ldr r12, [%[a], #328]\n\t"
  57597. "ldr lr, [%[b], #328]\n\t"
  57598. "and r12, r12, r3\n\t"
  57599. "and lr, lr, r3\n\t"
  57600. "subs r12, r12, lr\n\t"
  57601. "it hi\n\t"
  57602. "movhi r2, r6\n\t"
  57603. "it lo\n\t"
  57604. "movlo r2, r3\n\t"
  57605. "it ne\n\t"
  57606. "movne r3, r5\n\t"
  57607. "ldr r12, [%[a], #324]\n\t"
  57608. "ldr lr, [%[b], #324]\n\t"
  57609. "and r12, r12, r3\n\t"
  57610. "and lr, lr, r3\n\t"
  57611. "subs r12, r12, lr\n\t"
  57612. "it hi\n\t"
  57613. "movhi r2, r6\n\t"
  57614. "it lo\n\t"
  57615. "movlo r2, r3\n\t"
  57616. "it ne\n\t"
  57617. "movne r3, r5\n\t"
  57618. "ldr r12, [%[a], #320]\n\t"
  57619. "ldr lr, [%[b], #320]\n\t"
  57620. "and r12, r12, r3\n\t"
  57621. "and lr, lr, r3\n\t"
  57622. "subs r12, r12, lr\n\t"
  57623. "it hi\n\t"
  57624. "movhi r2, r6\n\t"
  57625. "it lo\n\t"
  57626. "movlo r2, r3\n\t"
  57627. "it ne\n\t"
  57628. "movne r3, r5\n\t"
  57629. "ldr r12, [%[a], #316]\n\t"
  57630. "ldr lr, [%[b], #316]\n\t"
  57631. "and r12, r12, r3\n\t"
  57632. "and lr, lr, r3\n\t"
  57633. "subs r12, r12, lr\n\t"
  57634. "it hi\n\t"
  57635. "movhi r2, r6\n\t"
  57636. "it lo\n\t"
  57637. "movlo r2, r3\n\t"
  57638. "it ne\n\t"
  57639. "movne r3, r5\n\t"
  57640. "ldr r12, [%[a], #312]\n\t"
  57641. "ldr lr, [%[b], #312]\n\t"
  57642. "and r12, r12, r3\n\t"
  57643. "and lr, lr, r3\n\t"
  57644. "subs r12, r12, lr\n\t"
  57645. "it hi\n\t"
  57646. "movhi r2, r6\n\t"
  57647. "it lo\n\t"
  57648. "movlo r2, r3\n\t"
  57649. "it ne\n\t"
  57650. "movne r3, r5\n\t"
  57651. "ldr r12, [%[a], #308]\n\t"
  57652. "ldr lr, [%[b], #308]\n\t"
  57653. "and r12, r12, r3\n\t"
  57654. "and lr, lr, r3\n\t"
  57655. "subs r12, r12, lr\n\t"
  57656. "it hi\n\t"
  57657. "movhi r2, r6\n\t"
  57658. "it lo\n\t"
  57659. "movlo r2, r3\n\t"
  57660. "it ne\n\t"
  57661. "movne r3, r5\n\t"
  57662. "ldr r12, [%[a], #304]\n\t"
  57663. "ldr lr, [%[b], #304]\n\t"
  57664. "and r12, r12, r3\n\t"
  57665. "and lr, lr, r3\n\t"
  57666. "subs r12, r12, lr\n\t"
  57667. "it hi\n\t"
  57668. "movhi r2, r6\n\t"
  57669. "it lo\n\t"
  57670. "movlo r2, r3\n\t"
  57671. "it ne\n\t"
  57672. "movne r3, r5\n\t"
  57673. "ldr r12, [%[a], #300]\n\t"
  57674. "ldr lr, [%[b], #300]\n\t"
  57675. "and r12, r12, r3\n\t"
  57676. "and lr, lr, r3\n\t"
  57677. "subs r12, r12, lr\n\t"
  57678. "it hi\n\t"
  57679. "movhi r2, r6\n\t"
  57680. "it lo\n\t"
  57681. "movlo r2, r3\n\t"
  57682. "it ne\n\t"
  57683. "movne r3, r5\n\t"
  57684. "ldr r12, [%[a], #296]\n\t"
  57685. "ldr lr, [%[b], #296]\n\t"
  57686. "and r12, r12, r3\n\t"
  57687. "and lr, lr, r3\n\t"
  57688. "subs r12, r12, lr\n\t"
  57689. "it hi\n\t"
  57690. "movhi r2, r6\n\t"
  57691. "it lo\n\t"
  57692. "movlo r2, r3\n\t"
  57693. "it ne\n\t"
  57694. "movne r3, r5\n\t"
  57695. "ldr r12, [%[a], #292]\n\t"
  57696. "ldr lr, [%[b], #292]\n\t"
  57697. "and r12, r12, r3\n\t"
  57698. "and lr, lr, r3\n\t"
  57699. "subs r12, r12, lr\n\t"
  57700. "it hi\n\t"
  57701. "movhi r2, r6\n\t"
  57702. "it lo\n\t"
  57703. "movlo r2, r3\n\t"
  57704. "it ne\n\t"
  57705. "movne r3, r5\n\t"
  57706. "ldr r12, [%[a], #288]\n\t"
  57707. "ldr lr, [%[b], #288]\n\t"
  57708. "and r12, r12, r3\n\t"
  57709. "and lr, lr, r3\n\t"
  57710. "subs r12, r12, lr\n\t"
  57711. "it hi\n\t"
  57712. "movhi r2, r6\n\t"
  57713. "it lo\n\t"
  57714. "movlo r2, r3\n\t"
  57715. "it ne\n\t"
  57716. "movne r3, r5\n\t"
  57717. "ldr r12, [%[a], #284]\n\t"
  57718. "ldr lr, [%[b], #284]\n\t"
  57719. "and r12, r12, r3\n\t"
  57720. "and lr, lr, r3\n\t"
  57721. "subs r12, r12, lr\n\t"
  57722. "it hi\n\t"
  57723. "movhi r2, r6\n\t"
  57724. "it lo\n\t"
  57725. "movlo r2, r3\n\t"
  57726. "it ne\n\t"
  57727. "movne r3, r5\n\t"
  57728. "ldr r12, [%[a], #280]\n\t"
  57729. "ldr lr, [%[b], #280]\n\t"
  57730. "and r12, r12, r3\n\t"
  57731. "and lr, lr, r3\n\t"
  57732. "subs r12, r12, lr\n\t"
  57733. "it hi\n\t"
  57734. "movhi r2, r6\n\t"
  57735. "it lo\n\t"
  57736. "movlo r2, r3\n\t"
  57737. "it ne\n\t"
  57738. "movne r3, r5\n\t"
  57739. "ldr r12, [%[a], #276]\n\t"
  57740. "ldr lr, [%[b], #276]\n\t"
  57741. "and r12, r12, r3\n\t"
  57742. "and lr, lr, r3\n\t"
  57743. "subs r12, r12, lr\n\t"
  57744. "it hi\n\t"
  57745. "movhi r2, r6\n\t"
  57746. "it lo\n\t"
  57747. "movlo r2, r3\n\t"
  57748. "it ne\n\t"
  57749. "movne r3, r5\n\t"
  57750. "ldr r12, [%[a], #272]\n\t"
  57751. "ldr lr, [%[b], #272]\n\t"
  57752. "and r12, r12, r3\n\t"
  57753. "and lr, lr, r3\n\t"
  57754. "subs r12, r12, lr\n\t"
  57755. "it hi\n\t"
  57756. "movhi r2, r6\n\t"
  57757. "it lo\n\t"
  57758. "movlo r2, r3\n\t"
  57759. "it ne\n\t"
  57760. "movne r3, r5\n\t"
  57761. "ldr r12, [%[a], #268]\n\t"
  57762. "ldr lr, [%[b], #268]\n\t"
  57763. "and r12, r12, r3\n\t"
  57764. "and lr, lr, r3\n\t"
  57765. "subs r12, r12, lr\n\t"
  57766. "it hi\n\t"
  57767. "movhi r2, r6\n\t"
  57768. "it lo\n\t"
  57769. "movlo r2, r3\n\t"
  57770. "it ne\n\t"
  57771. "movne r3, r5\n\t"
  57772. "ldr r12, [%[a], #264]\n\t"
  57773. "ldr lr, [%[b], #264]\n\t"
  57774. "and r12, r12, r3\n\t"
  57775. "and lr, lr, r3\n\t"
  57776. "subs r12, r12, lr\n\t"
  57777. "it hi\n\t"
  57778. "movhi r2, r6\n\t"
  57779. "it lo\n\t"
  57780. "movlo r2, r3\n\t"
  57781. "it ne\n\t"
  57782. "movne r3, r5\n\t"
  57783. "ldr r12, [%[a], #260]\n\t"
  57784. "ldr lr, [%[b], #260]\n\t"
  57785. "and r12, r12, r3\n\t"
  57786. "and lr, lr, r3\n\t"
  57787. "subs r12, r12, lr\n\t"
  57788. "it hi\n\t"
  57789. "movhi r2, r6\n\t"
  57790. "it lo\n\t"
  57791. "movlo r2, r3\n\t"
  57792. "it ne\n\t"
  57793. "movne r3, r5\n\t"
  57794. "ldr r12, [%[a], #256]\n\t"
  57795. "ldr lr, [%[b], #256]\n\t"
  57796. "and r12, r12, r3\n\t"
  57797. "and lr, lr, r3\n\t"
  57798. "subs r12, r12, lr\n\t"
  57799. "it hi\n\t"
  57800. "movhi r2, r6\n\t"
  57801. "it lo\n\t"
  57802. "movlo r2, r3\n\t"
  57803. "it ne\n\t"
  57804. "movne r3, r5\n\t"
  57805. "ldr r12, [%[a], #252]\n\t"
  57806. "ldr lr, [%[b], #252]\n\t"
  57807. "and r12, r12, r3\n\t"
  57808. "and lr, lr, r3\n\t"
  57809. "subs r12, r12, lr\n\t"
  57810. "it hi\n\t"
  57811. "movhi r2, r6\n\t"
  57812. "it lo\n\t"
  57813. "movlo r2, r3\n\t"
  57814. "it ne\n\t"
  57815. "movne r3, r5\n\t"
  57816. "ldr r12, [%[a], #248]\n\t"
  57817. "ldr lr, [%[b], #248]\n\t"
  57818. "and r12, r12, r3\n\t"
  57819. "and lr, lr, r3\n\t"
  57820. "subs r12, r12, lr\n\t"
  57821. "it hi\n\t"
  57822. "movhi r2, r6\n\t"
  57823. "it lo\n\t"
  57824. "movlo r2, r3\n\t"
  57825. "it ne\n\t"
  57826. "movne r3, r5\n\t"
  57827. "ldr r12, [%[a], #244]\n\t"
  57828. "ldr lr, [%[b], #244]\n\t"
  57829. "and r12, r12, r3\n\t"
  57830. "and lr, lr, r3\n\t"
  57831. "subs r12, r12, lr\n\t"
  57832. "it hi\n\t"
  57833. "movhi r2, r6\n\t"
  57834. "it lo\n\t"
  57835. "movlo r2, r3\n\t"
  57836. "it ne\n\t"
  57837. "movne r3, r5\n\t"
  57838. "ldr r12, [%[a], #240]\n\t"
  57839. "ldr lr, [%[b], #240]\n\t"
  57840. "and r12, r12, r3\n\t"
  57841. "and lr, lr, r3\n\t"
  57842. "subs r12, r12, lr\n\t"
  57843. "it hi\n\t"
  57844. "movhi r2, r6\n\t"
  57845. "it lo\n\t"
  57846. "movlo r2, r3\n\t"
  57847. "it ne\n\t"
  57848. "movne r3, r5\n\t"
  57849. "ldr r12, [%[a], #236]\n\t"
  57850. "ldr lr, [%[b], #236]\n\t"
  57851. "and r12, r12, r3\n\t"
  57852. "and lr, lr, r3\n\t"
  57853. "subs r12, r12, lr\n\t"
  57854. "it hi\n\t"
  57855. "movhi r2, r6\n\t"
  57856. "it lo\n\t"
  57857. "movlo r2, r3\n\t"
  57858. "it ne\n\t"
  57859. "movne r3, r5\n\t"
  57860. "ldr r12, [%[a], #232]\n\t"
  57861. "ldr lr, [%[b], #232]\n\t"
  57862. "and r12, r12, r3\n\t"
  57863. "and lr, lr, r3\n\t"
  57864. "subs r12, r12, lr\n\t"
  57865. "it hi\n\t"
  57866. "movhi r2, r6\n\t"
  57867. "it lo\n\t"
  57868. "movlo r2, r3\n\t"
  57869. "it ne\n\t"
  57870. "movne r3, r5\n\t"
  57871. "ldr r12, [%[a], #228]\n\t"
  57872. "ldr lr, [%[b], #228]\n\t"
  57873. "and r12, r12, r3\n\t"
  57874. "and lr, lr, r3\n\t"
  57875. "subs r12, r12, lr\n\t"
  57876. "it hi\n\t"
  57877. "movhi r2, r6\n\t"
  57878. "it lo\n\t"
  57879. "movlo r2, r3\n\t"
  57880. "it ne\n\t"
  57881. "movne r3, r5\n\t"
  57882. "ldr r12, [%[a], #224]\n\t"
  57883. "ldr lr, [%[b], #224]\n\t"
  57884. "and r12, r12, r3\n\t"
  57885. "and lr, lr, r3\n\t"
  57886. "subs r12, r12, lr\n\t"
  57887. "it hi\n\t"
  57888. "movhi r2, r6\n\t"
  57889. "it lo\n\t"
  57890. "movlo r2, r3\n\t"
  57891. "it ne\n\t"
  57892. "movne r3, r5\n\t"
  57893. "ldr r12, [%[a], #220]\n\t"
  57894. "ldr lr, [%[b], #220]\n\t"
  57895. "and r12, r12, r3\n\t"
  57896. "and lr, lr, r3\n\t"
  57897. "subs r12, r12, lr\n\t"
  57898. "it hi\n\t"
  57899. "movhi r2, r6\n\t"
  57900. "it lo\n\t"
  57901. "movlo r2, r3\n\t"
  57902. "it ne\n\t"
  57903. "movne r3, r5\n\t"
  57904. "ldr r12, [%[a], #216]\n\t"
  57905. "ldr lr, [%[b], #216]\n\t"
  57906. "and r12, r12, r3\n\t"
  57907. "and lr, lr, r3\n\t"
  57908. "subs r12, r12, lr\n\t"
  57909. "it hi\n\t"
  57910. "movhi r2, r6\n\t"
  57911. "it lo\n\t"
  57912. "movlo r2, r3\n\t"
  57913. "it ne\n\t"
  57914. "movne r3, r5\n\t"
  57915. "ldr r12, [%[a], #212]\n\t"
  57916. "ldr lr, [%[b], #212]\n\t"
  57917. "and r12, r12, r3\n\t"
  57918. "and lr, lr, r3\n\t"
  57919. "subs r12, r12, lr\n\t"
  57920. "it hi\n\t"
  57921. "movhi r2, r6\n\t"
  57922. "it lo\n\t"
  57923. "movlo r2, r3\n\t"
  57924. "it ne\n\t"
  57925. "movne r3, r5\n\t"
  57926. "ldr r12, [%[a], #208]\n\t"
  57927. "ldr lr, [%[b], #208]\n\t"
  57928. "and r12, r12, r3\n\t"
  57929. "and lr, lr, r3\n\t"
  57930. "subs r12, r12, lr\n\t"
  57931. "it hi\n\t"
  57932. "movhi r2, r6\n\t"
  57933. "it lo\n\t"
  57934. "movlo r2, r3\n\t"
  57935. "it ne\n\t"
  57936. "movne r3, r5\n\t"
  57937. "ldr r12, [%[a], #204]\n\t"
  57938. "ldr lr, [%[b], #204]\n\t"
  57939. "and r12, r12, r3\n\t"
  57940. "and lr, lr, r3\n\t"
  57941. "subs r12, r12, lr\n\t"
  57942. "it hi\n\t"
  57943. "movhi r2, r6\n\t"
  57944. "it lo\n\t"
  57945. "movlo r2, r3\n\t"
  57946. "it ne\n\t"
  57947. "movne r3, r5\n\t"
  57948. "ldr r12, [%[a], #200]\n\t"
  57949. "ldr lr, [%[b], #200]\n\t"
  57950. "and r12, r12, r3\n\t"
  57951. "and lr, lr, r3\n\t"
  57952. "subs r12, r12, lr\n\t"
  57953. "it hi\n\t"
  57954. "movhi r2, r6\n\t"
  57955. "it lo\n\t"
  57956. "movlo r2, r3\n\t"
  57957. "it ne\n\t"
  57958. "movne r3, r5\n\t"
  57959. "ldr r12, [%[a], #196]\n\t"
  57960. "ldr lr, [%[b], #196]\n\t"
  57961. "and r12, r12, r3\n\t"
  57962. "and lr, lr, r3\n\t"
  57963. "subs r12, r12, lr\n\t"
  57964. "it hi\n\t"
  57965. "movhi r2, r6\n\t"
  57966. "it lo\n\t"
  57967. "movlo r2, r3\n\t"
  57968. "it ne\n\t"
  57969. "movne r3, r5\n\t"
  57970. "ldr r12, [%[a], #192]\n\t"
  57971. "ldr lr, [%[b], #192]\n\t"
  57972. "and r12, r12, r3\n\t"
  57973. "and lr, lr, r3\n\t"
  57974. "subs r12, r12, lr\n\t"
  57975. "it hi\n\t"
  57976. "movhi r2, r6\n\t"
  57977. "it lo\n\t"
  57978. "movlo r2, r3\n\t"
  57979. "it ne\n\t"
  57980. "movne r3, r5\n\t"
  57981. "ldr r12, [%[a], #188]\n\t"
  57982. "ldr lr, [%[b], #188]\n\t"
  57983. "and r12, r12, r3\n\t"
  57984. "and lr, lr, r3\n\t"
  57985. "subs r12, r12, lr\n\t"
  57986. "it hi\n\t"
  57987. "movhi r2, r6\n\t"
  57988. "it lo\n\t"
  57989. "movlo r2, r3\n\t"
  57990. "it ne\n\t"
  57991. "movne r3, r5\n\t"
  57992. "ldr r12, [%[a], #184]\n\t"
  57993. "ldr lr, [%[b], #184]\n\t"
  57994. "and r12, r12, r3\n\t"
  57995. "and lr, lr, r3\n\t"
  57996. "subs r12, r12, lr\n\t"
  57997. "it hi\n\t"
  57998. "movhi r2, r6\n\t"
  57999. "it lo\n\t"
  58000. "movlo r2, r3\n\t"
  58001. "it ne\n\t"
  58002. "movne r3, r5\n\t"
  58003. "ldr r12, [%[a], #180]\n\t"
  58004. "ldr lr, [%[b], #180]\n\t"
  58005. "and r12, r12, r3\n\t"
  58006. "and lr, lr, r3\n\t"
  58007. "subs r12, r12, lr\n\t"
  58008. "it hi\n\t"
  58009. "movhi r2, r6\n\t"
  58010. "it lo\n\t"
  58011. "movlo r2, r3\n\t"
  58012. "it ne\n\t"
  58013. "movne r3, r5\n\t"
  58014. "ldr r12, [%[a], #176]\n\t"
  58015. "ldr lr, [%[b], #176]\n\t"
  58016. "and r12, r12, r3\n\t"
  58017. "and lr, lr, r3\n\t"
  58018. "subs r12, r12, lr\n\t"
  58019. "it hi\n\t"
  58020. "movhi r2, r6\n\t"
  58021. "it lo\n\t"
  58022. "movlo r2, r3\n\t"
  58023. "it ne\n\t"
  58024. "movne r3, r5\n\t"
  58025. "ldr r12, [%[a], #172]\n\t"
  58026. "ldr lr, [%[b], #172]\n\t"
  58027. "and r12, r12, r3\n\t"
  58028. "and lr, lr, r3\n\t"
  58029. "subs r12, r12, lr\n\t"
  58030. "it hi\n\t"
  58031. "movhi r2, r6\n\t"
  58032. "it lo\n\t"
  58033. "movlo r2, r3\n\t"
  58034. "it ne\n\t"
  58035. "movne r3, r5\n\t"
  58036. "ldr r12, [%[a], #168]\n\t"
  58037. "ldr lr, [%[b], #168]\n\t"
  58038. "and r12, r12, r3\n\t"
  58039. "and lr, lr, r3\n\t"
  58040. "subs r12, r12, lr\n\t"
  58041. "it hi\n\t"
  58042. "movhi r2, r6\n\t"
  58043. "it lo\n\t"
  58044. "movlo r2, r3\n\t"
  58045. "it ne\n\t"
  58046. "movne r3, r5\n\t"
  58047. "ldr r12, [%[a], #164]\n\t"
  58048. "ldr lr, [%[b], #164]\n\t"
  58049. "and r12, r12, r3\n\t"
  58050. "and lr, lr, r3\n\t"
  58051. "subs r12, r12, lr\n\t"
  58052. "it hi\n\t"
  58053. "movhi r2, r6\n\t"
  58054. "it lo\n\t"
  58055. "movlo r2, r3\n\t"
  58056. "it ne\n\t"
  58057. "movne r3, r5\n\t"
  58058. "ldr r12, [%[a], #160]\n\t"
  58059. "ldr lr, [%[b], #160]\n\t"
  58060. "and r12, r12, r3\n\t"
  58061. "and lr, lr, r3\n\t"
  58062. "subs r12, r12, lr\n\t"
  58063. "it hi\n\t"
  58064. "movhi r2, r6\n\t"
  58065. "it lo\n\t"
  58066. "movlo r2, r3\n\t"
  58067. "it ne\n\t"
  58068. "movne r3, r5\n\t"
  58069. "ldr r12, [%[a], #156]\n\t"
  58070. "ldr lr, [%[b], #156]\n\t"
  58071. "and r12, r12, r3\n\t"
  58072. "and lr, lr, r3\n\t"
  58073. "subs r12, r12, lr\n\t"
  58074. "it hi\n\t"
  58075. "movhi r2, r6\n\t"
  58076. "it lo\n\t"
  58077. "movlo r2, r3\n\t"
  58078. "it ne\n\t"
  58079. "movne r3, r5\n\t"
  58080. "ldr r12, [%[a], #152]\n\t"
  58081. "ldr lr, [%[b], #152]\n\t"
  58082. "and r12, r12, r3\n\t"
  58083. "and lr, lr, r3\n\t"
  58084. "subs r12, r12, lr\n\t"
  58085. "it hi\n\t"
  58086. "movhi r2, r6\n\t"
  58087. "it lo\n\t"
  58088. "movlo r2, r3\n\t"
  58089. "it ne\n\t"
  58090. "movne r3, r5\n\t"
  58091. "ldr r12, [%[a], #148]\n\t"
  58092. "ldr lr, [%[b], #148]\n\t"
  58093. "and r12, r12, r3\n\t"
  58094. "and lr, lr, r3\n\t"
  58095. "subs r12, r12, lr\n\t"
  58096. "it hi\n\t"
  58097. "movhi r2, r6\n\t"
  58098. "it lo\n\t"
  58099. "movlo r2, r3\n\t"
  58100. "it ne\n\t"
  58101. "movne r3, r5\n\t"
  58102. "ldr r12, [%[a], #144]\n\t"
  58103. "ldr lr, [%[b], #144]\n\t"
  58104. "and r12, r12, r3\n\t"
  58105. "and lr, lr, r3\n\t"
  58106. "subs r12, r12, lr\n\t"
  58107. "it hi\n\t"
  58108. "movhi r2, r6\n\t"
  58109. "it lo\n\t"
  58110. "movlo r2, r3\n\t"
  58111. "it ne\n\t"
  58112. "movne r3, r5\n\t"
  58113. "ldr r12, [%[a], #140]\n\t"
  58114. "ldr lr, [%[b], #140]\n\t"
  58115. "and r12, r12, r3\n\t"
  58116. "and lr, lr, r3\n\t"
  58117. "subs r12, r12, lr\n\t"
  58118. "it hi\n\t"
  58119. "movhi r2, r6\n\t"
  58120. "it lo\n\t"
  58121. "movlo r2, r3\n\t"
  58122. "it ne\n\t"
  58123. "movne r3, r5\n\t"
  58124. "ldr r12, [%[a], #136]\n\t"
  58125. "ldr lr, [%[b], #136]\n\t"
  58126. "and r12, r12, r3\n\t"
  58127. "and lr, lr, r3\n\t"
  58128. "subs r12, r12, lr\n\t"
  58129. "it hi\n\t"
  58130. "movhi r2, r6\n\t"
  58131. "it lo\n\t"
  58132. "movlo r2, r3\n\t"
  58133. "it ne\n\t"
  58134. "movne r3, r5\n\t"
  58135. "ldr r12, [%[a], #132]\n\t"
  58136. "ldr lr, [%[b], #132]\n\t"
  58137. "and r12, r12, r3\n\t"
  58138. "and lr, lr, r3\n\t"
  58139. "subs r12, r12, lr\n\t"
  58140. "it hi\n\t"
  58141. "movhi r2, r6\n\t"
  58142. "it lo\n\t"
  58143. "movlo r2, r3\n\t"
  58144. "it ne\n\t"
  58145. "movne r3, r5\n\t"
  58146. "ldr r12, [%[a], #128]\n\t"
  58147. "ldr lr, [%[b], #128]\n\t"
  58148. "and r12, r12, r3\n\t"
  58149. "and lr, lr, r3\n\t"
  58150. "subs r12, r12, lr\n\t"
  58151. "it hi\n\t"
  58152. "movhi r2, r6\n\t"
  58153. "it lo\n\t"
  58154. "movlo r2, r3\n\t"
  58155. "it ne\n\t"
  58156. "movne r3, r5\n\t"
  58157. "ldr r12, [%[a], #124]\n\t"
  58158. "ldr lr, [%[b], #124]\n\t"
  58159. "and r12, r12, r3\n\t"
  58160. "and lr, lr, r3\n\t"
  58161. "subs r12, r12, lr\n\t"
  58162. "it hi\n\t"
  58163. "movhi r2, r6\n\t"
  58164. "it lo\n\t"
  58165. "movlo r2, r3\n\t"
  58166. "it ne\n\t"
  58167. "movne r3, r5\n\t"
  58168. "ldr r12, [%[a], #120]\n\t"
  58169. "ldr lr, [%[b], #120]\n\t"
  58170. "and r12, r12, r3\n\t"
  58171. "and lr, lr, r3\n\t"
  58172. "subs r12, r12, lr\n\t"
  58173. "it hi\n\t"
  58174. "movhi r2, r6\n\t"
  58175. "it lo\n\t"
  58176. "movlo r2, r3\n\t"
  58177. "it ne\n\t"
  58178. "movne r3, r5\n\t"
  58179. "ldr r12, [%[a], #116]\n\t"
  58180. "ldr lr, [%[b], #116]\n\t"
  58181. "and r12, r12, r3\n\t"
  58182. "and lr, lr, r3\n\t"
  58183. "subs r12, r12, lr\n\t"
  58184. "it hi\n\t"
  58185. "movhi r2, r6\n\t"
  58186. "it lo\n\t"
  58187. "movlo r2, r3\n\t"
  58188. "it ne\n\t"
  58189. "movne r3, r5\n\t"
  58190. "ldr r12, [%[a], #112]\n\t"
  58191. "ldr lr, [%[b], #112]\n\t"
  58192. "and r12, r12, r3\n\t"
  58193. "and lr, lr, r3\n\t"
  58194. "subs r12, r12, lr\n\t"
  58195. "it hi\n\t"
  58196. "movhi r2, r6\n\t"
  58197. "it lo\n\t"
  58198. "movlo r2, r3\n\t"
  58199. "it ne\n\t"
  58200. "movne r3, r5\n\t"
  58201. "ldr r12, [%[a], #108]\n\t"
  58202. "ldr lr, [%[b], #108]\n\t"
  58203. "and r12, r12, r3\n\t"
  58204. "and lr, lr, r3\n\t"
  58205. "subs r12, r12, lr\n\t"
  58206. "it hi\n\t"
  58207. "movhi r2, r6\n\t"
  58208. "it lo\n\t"
  58209. "movlo r2, r3\n\t"
  58210. "it ne\n\t"
  58211. "movne r3, r5\n\t"
  58212. "ldr r12, [%[a], #104]\n\t"
  58213. "ldr lr, [%[b], #104]\n\t"
  58214. "and r12, r12, r3\n\t"
  58215. "and lr, lr, r3\n\t"
  58216. "subs r12, r12, lr\n\t"
  58217. "it hi\n\t"
  58218. "movhi r2, r6\n\t"
  58219. "it lo\n\t"
  58220. "movlo r2, r3\n\t"
  58221. "it ne\n\t"
  58222. "movne r3, r5\n\t"
  58223. "ldr r12, [%[a], #100]\n\t"
  58224. "ldr lr, [%[b], #100]\n\t"
  58225. "and r12, r12, r3\n\t"
  58226. "and lr, lr, r3\n\t"
  58227. "subs r12, r12, lr\n\t"
  58228. "it hi\n\t"
  58229. "movhi r2, r6\n\t"
  58230. "it lo\n\t"
  58231. "movlo r2, r3\n\t"
  58232. "it ne\n\t"
  58233. "movne r3, r5\n\t"
  58234. "ldr r12, [%[a], #96]\n\t"
  58235. "ldr lr, [%[b], #96]\n\t"
  58236. "and r12, r12, r3\n\t"
  58237. "and lr, lr, r3\n\t"
  58238. "subs r12, r12, lr\n\t"
  58239. "it hi\n\t"
  58240. "movhi r2, r6\n\t"
  58241. "it lo\n\t"
  58242. "movlo r2, r3\n\t"
  58243. "it ne\n\t"
  58244. "movne r3, r5\n\t"
  58245. "ldr r12, [%[a], #92]\n\t"
  58246. "ldr lr, [%[b], #92]\n\t"
  58247. "and r12, r12, r3\n\t"
  58248. "and lr, lr, r3\n\t"
  58249. "subs r12, r12, lr\n\t"
  58250. "it hi\n\t"
  58251. "movhi r2, r6\n\t"
  58252. "it lo\n\t"
  58253. "movlo r2, r3\n\t"
  58254. "it ne\n\t"
  58255. "movne r3, r5\n\t"
  58256. "ldr r12, [%[a], #88]\n\t"
  58257. "ldr lr, [%[b], #88]\n\t"
  58258. "and r12, r12, r3\n\t"
  58259. "and lr, lr, r3\n\t"
  58260. "subs r12, r12, lr\n\t"
  58261. "it hi\n\t"
  58262. "movhi r2, r6\n\t"
  58263. "it lo\n\t"
  58264. "movlo r2, r3\n\t"
  58265. "it ne\n\t"
  58266. "movne r3, r5\n\t"
  58267. "ldr r12, [%[a], #84]\n\t"
  58268. "ldr lr, [%[b], #84]\n\t"
  58269. "and r12, r12, r3\n\t"
  58270. "and lr, lr, r3\n\t"
  58271. "subs r12, r12, lr\n\t"
  58272. "it hi\n\t"
  58273. "movhi r2, r6\n\t"
  58274. "it lo\n\t"
  58275. "movlo r2, r3\n\t"
  58276. "it ne\n\t"
  58277. "movne r3, r5\n\t"
  58278. "ldr r12, [%[a], #80]\n\t"
  58279. "ldr lr, [%[b], #80]\n\t"
  58280. "and r12, r12, r3\n\t"
  58281. "and lr, lr, r3\n\t"
  58282. "subs r12, r12, lr\n\t"
  58283. "it hi\n\t"
  58284. "movhi r2, r6\n\t"
  58285. "it lo\n\t"
  58286. "movlo r2, r3\n\t"
  58287. "it ne\n\t"
  58288. "movne r3, r5\n\t"
  58289. "ldr r12, [%[a], #76]\n\t"
  58290. "ldr lr, [%[b], #76]\n\t"
  58291. "and r12, r12, r3\n\t"
  58292. "and lr, lr, r3\n\t"
  58293. "subs r12, r12, lr\n\t"
  58294. "it hi\n\t"
  58295. "movhi r2, r6\n\t"
  58296. "it lo\n\t"
  58297. "movlo r2, r3\n\t"
  58298. "it ne\n\t"
  58299. "movne r3, r5\n\t"
  58300. "ldr r12, [%[a], #72]\n\t"
  58301. "ldr lr, [%[b], #72]\n\t"
  58302. "and r12, r12, r3\n\t"
  58303. "and lr, lr, r3\n\t"
  58304. "subs r12, r12, lr\n\t"
  58305. "it hi\n\t"
  58306. "movhi r2, r6\n\t"
  58307. "it lo\n\t"
  58308. "movlo r2, r3\n\t"
  58309. "it ne\n\t"
  58310. "movne r3, r5\n\t"
  58311. "ldr r12, [%[a], #68]\n\t"
  58312. "ldr lr, [%[b], #68]\n\t"
  58313. "and r12, r12, r3\n\t"
  58314. "and lr, lr, r3\n\t"
  58315. "subs r12, r12, lr\n\t"
  58316. "it hi\n\t"
  58317. "movhi r2, r6\n\t"
  58318. "it lo\n\t"
  58319. "movlo r2, r3\n\t"
  58320. "it ne\n\t"
  58321. "movne r3, r5\n\t"
  58322. "ldr r12, [%[a], #64]\n\t"
  58323. "ldr lr, [%[b], #64]\n\t"
  58324. "and r12, r12, r3\n\t"
  58325. "and lr, lr, r3\n\t"
  58326. "subs r12, r12, lr\n\t"
  58327. "it hi\n\t"
  58328. "movhi r2, r6\n\t"
  58329. "it lo\n\t"
  58330. "movlo r2, r3\n\t"
  58331. "it ne\n\t"
  58332. "movne r3, r5\n\t"
  58333. "ldr r12, [%[a], #60]\n\t"
  58334. "ldr lr, [%[b], #60]\n\t"
  58335. "and r12, r12, r3\n\t"
  58336. "and lr, lr, r3\n\t"
  58337. "subs r12, r12, lr\n\t"
  58338. "it hi\n\t"
  58339. "movhi r2, r6\n\t"
  58340. "it lo\n\t"
  58341. "movlo r2, r3\n\t"
  58342. "it ne\n\t"
  58343. "movne r3, r5\n\t"
  58344. "ldr r12, [%[a], #56]\n\t"
  58345. "ldr lr, [%[b], #56]\n\t"
  58346. "and r12, r12, r3\n\t"
  58347. "and lr, lr, r3\n\t"
  58348. "subs r12, r12, lr\n\t"
  58349. "it hi\n\t"
  58350. "movhi r2, r6\n\t"
  58351. "it lo\n\t"
  58352. "movlo r2, r3\n\t"
  58353. "it ne\n\t"
  58354. "movne r3, r5\n\t"
  58355. "ldr r12, [%[a], #52]\n\t"
  58356. "ldr lr, [%[b], #52]\n\t"
  58357. "and r12, r12, r3\n\t"
  58358. "and lr, lr, r3\n\t"
  58359. "subs r12, r12, lr\n\t"
  58360. "it hi\n\t"
  58361. "movhi r2, r6\n\t"
  58362. "it lo\n\t"
  58363. "movlo r2, r3\n\t"
  58364. "it ne\n\t"
  58365. "movne r3, r5\n\t"
  58366. "ldr r12, [%[a], #48]\n\t"
  58367. "ldr lr, [%[b], #48]\n\t"
  58368. "and r12, r12, r3\n\t"
  58369. "and lr, lr, r3\n\t"
  58370. "subs r12, r12, lr\n\t"
  58371. "it hi\n\t"
  58372. "movhi r2, r6\n\t"
  58373. "it lo\n\t"
  58374. "movlo r2, r3\n\t"
  58375. "it ne\n\t"
  58376. "movne r3, r5\n\t"
  58377. "ldr r12, [%[a], #44]\n\t"
  58378. "ldr lr, [%[b], #44]\n\t"
  58379. "and r12, r12, r3\n\t"
  58380. "and lr, lr, r3\n\t"
  58381. "subs r12, r12, lr\n\t"
  58382. "it hi\n\t"
  58383. "movhi r2, r6\n\t"
  58384. "it lo\n\t"
  58385. "movlo r2, r3\n\t"
  58386. "it ne\n\t"
  58387. "movne r3, r5\n\t"
  58388. "ldr r12, [%[a], #40]\n\t"
  58389. "ldr lr, [%[b], #40]\n\t"
  58390. "and r12, r12, r3\n\t"
  58391. "and lr, lr, r3\n\t"
  58392. "subs r12, r12, lr\n\t"
  58393. "it hi\n\t"
  58394. "movhi r2, r6\n\t"
  58395. "it lo\n\t"
  58396. "movlo r2, r3\n\t"
  58397. "it ne\n\t"
  58398. "movne r3, r5\n\t"
  58399. "ldr r12, [%[a], #36]\n\t"
  58400. "ldr lr, [%[b], #36]\n\t"
  58401. "and r12, r12, r3\n\t"
  58402. "and lr, lr, r3\n\t"
  58403. "subs r12, r12, lr\n\t"
  58404. "it hi\n\t"
  58405. "movhi r2, r6\n\t"
  58406. "it lo\n\t"
  58407. "movlo r2, r3\n\t"
  58408. "it ne\n\t"
  58409. "movne r3, r5\n\t"
  58410. "ldr r12, [%[a], #32]\n\t"
  58411. "ldr lr, [%[b], #32]\n\t"
  58412. "and r12, r12, r3\n\t"
  58413. "and lr, lr, r3\n\t"
  58414. "subs r12, r12, lr\n\t"
  58415. "it hi\n\t"
  58416. "movhi r2, r6\n\t"
  58417. "it lo\n\t"
  58418. "movlo r2, r3\n\t"
  58419. "it ne\n\t"
  58420. "movne r3, r5\n\t"
  58421. "ldr r12, [%[a], #28]\n\t"
  58422. "ldr lr, [%[b], #28]\n\t"
  58423. "and r12, r12, r3\n\t"
  58424. "and lr, lr, r3\n\t"
  58425. "subs r12, r12, lr\n\t"
  58426. "it hi\n\t"
  58427. "movhi r2, r6\n\t"
  58428. "it lo\n\t"
  58429. "movlo r2, r3\n\t"
  58430. "it ne\n\t"
  58431. "movne r3, r5\n\t"
  58432. "ldr r12, [%[a], #24]\n\t"
  58433. "ldr lr, [%[b], #24]\n\t"
  58434. "and r12, r12, r3\n\t"
  58435. "and lr, lr, r3\n\t"
  58436. "subs r12, r12, lr\n\t"
  58437. "it hi\n\t"
  58438. "movhi r2, r6\n\t"
  58439. "it lo\n\t"
  58440. "movlo r2, r3\n\t"
  58441. "it ne\n\t"
  58442. "movne r3, r5\n\t"
  58443. "ldr r12, [%[a], #20]\n\t"
  58444. "ldr lr, [%[b], #20]\n\t"
  58445. "and r12, r12, r3\n\t"
  58446. "and lr, lr, r3\n\t"
  58447. "subs r12, r12, lr\n\t"
  58448. "it hi\n\t"
  58449. "movhi r2, r6\n\t"
  58450. "it lo\n\t"
  58451. "movlo r2, r3\n\t"
  58452. "it ne\n\t"
  58453. "movne r3, r5\n\t"
  58454. "ldr r12, [%[a], #16]\n\t"
  58455. "ldr lr, [%[b], #16]\n\t"
  58456. "and r12, r12, r3\n\t"
  58457. "and lr, lr, r3\n\t"
  58458. "subs r12, r12, lr\n\t"
  58459. "it hi\n\t"
  58460. "movhi r2, r6\n\t"
  58461. "it lo\n\t"
  58462. "movlo r2, r3\n\t"
  58463. "it ne\n\t"
  58464. "movne r3, r5\n\t"
  58465. "ldr r12, [%[a], #12]\n\t"
  58466. "ldr lr, [%[b], #12]\n\t"
  58467. "and r12, r12, r3\n\t"
  58468. "and lr, lr, r3\n\t"
  58469. "subs r12, r12, lr\n\t"
  58470. "it hi\n\t"
  58471. "movhi r2, r6\n\t"
  58472. "it lo\n\t"
  58473. "movlo r2, r3\n\t"
  58474. "it ne\n\t"
  58475. "movne r3, r5\n\t"
  58476. "ldr r12, [%[a], #8]\n\t"
  58477. "ldr lr, [%[b], #8]\n\t"
  58478. "and r12, r12, r3\n\t"
  58479. "and lr, lr, r3\n\t"
  58480. "subs r12, r12, lr\n\t"
  58481. "it hi\n\t"
  58482. "movhi r2, r6\n\t"
  58483. "it lo\n\t"
  58484. "movlo r2, r3\n\t"
  58485. "it ne\n\t"
  58486. "movne r3, r5\n\t"
  58487. "ldr r12, [%[a], #4]\n\t"
  58488. "ldr lr, [%[b], #4]\n\t"
  58489. "and r12, r12, r3\n\t"
  58490. "and lr, lr, r3\n\t"
  58491. "subs r12, r12, lr\n\t"
  58492. "it hi\n\t"
  58493. "movhi r2, r6\n\t"
  58494. "it lo\n\t"
  58495. "movlo r2, r3\n\t"
  58496. "it ne\n\t"
  58497. "movne r3, r5\n\t"
  58498. "ldr r12, [%[a]]\n\t"
  58499. "ldr lr, [%[b]]\n\t"
  58500. "and r12, r12, r3\n\t"
  58501. "and lr, lr, r3\n\t"
  58502. "subs r12, r12, lr\n\t"
  58503. "it hi\n\t"
  58504. "movhi r2, r6\n\t"
  58505. "it lo\n\t"
  58506. "movlo r2, r3\n\t"
  58507. "it ne\n\t"
  58508. "movne r3, r5\n\t"
  58509. "eor r2, r2, r3\n\t"
  58510. #endif /*WOLFSSL_SP_SMALL */
  58511. "mov %[a], r2\n\t"
  58512. : [a] "+r" (a), [b] "+r" (b)
  58513. :
  58514. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  58515. );
  58516. return (uint32_t)(size_t)a;
  58517. }
  58518. /* Divide d in a and put remainder into r (m*d + r = a)
  58519. * m is not calculated as it is not needed at this time.
  58520. *
  58521. * a Number to be divided.
  58522. * d Number to divide with.
  58523. * m Multiplier result.
  58524. * r Remainder from the division.
  58525. * returns MP_OKAY indicating success.
  58526. */
  58527. static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d,
  58528. sp_digit* m, sp_digit* r)
  58529. {
  58530. sp_digit t1[256], t2[129];
  58531. sp_digit div, r1;
  58532. int i;
  58533. (void)m;
  58534. div = d[127];
  58535. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  58536. r1 = sp_4096_cmp_128(&t1[128], d) >= 0;
  58537. sp_4096_cond_sub_128(&t1[128], &t1[128], d, (sp_digit)0 - r1);
  58538. for (i = 127; i >= 0; i--) {
  58539. volatile sp_digit mask = (sp_digit)0 - (t1[128 + i] == div);
  58540. sp_digit hi = t1[128 + i] + mask;
  58541. r1 = div_4096_word_128(hi, t1[128 + i - 1], div);
  58542. r1 |= mask;
  58543. sp_4096_mul_d_128(t2, d, r1);
  58544. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  58545. t1[128 + i] -= t2[128];
  58546. sp_4096_mask_128(t2, d, t1[128 + i]);
  58547. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  58548. sp_4096_mask_128(t2, d, t1[128 + i]);
  58549. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  58550. }
  58551. r1 = sp_4096_cmp_128(t1, d) >= 0;
  58552. sp_4096_cond_sub_128(r, t1, d, (sp_digit)0 - r1);
  58553. return MP_OKAY;
  58554. }
  58555. /* Reduce a modulo m into r. (r = a mod m)
  58556. *
  58557. * r A single precision number that is the reduced result.
  58558. * a A single precision number that is to be reduced.
  58559. * m A single precision number that is the modulus to reduce with.
  58560. * returns MP_OKAY indicating success.
  58561. */
  58562. static WC_INLINE int sp_4096_mod_128(sp_digit* r, const sp_digit* a,
  58563. const sp_digit* m)
  58564. {
  58565. return sp_4096_div_128(a, m, NULL, r);
  58566. }
  58567. #endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */
  58568. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  58569. defined(WOLFSSL_HAVE_SP_DH)
  58570. #ifdef WOLFSSL_SP_SMALL
  58571. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  58572. *
  58573. * r A single precision number that is the result of the operation.
  58574. * a A single precision number being exponentiated.
  58575. * e A single precision number that is the exponent.
  58576. * bits The number of bits in the exponent.
  58577. * m A single precision number that is the modulus.
  58578. * returns 0 on success.
  58579. * returns MEMORY_E on dynamic memory allocation failure.
  58580. * returns MP_VAL when base is even or exponent is 0.
  58581. */
  58582. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  58583. int bits, const sp_digit* m, int reduceA)
  58584. {
  58585. #ifdef WOLFSSL_SP_SMALL_STACK
  58586. sp_digit* td = NULL;
  58587. #else
  58588. sp_digit td[8 * 256];
  58589. #endif
  58590. sp_digit* t[8];
  58591. sp_digit* norm = NULL;
  58592. sp_digit mp = 1;
  58593. sp_digit n;
  58594. sp_digit mask;
  58595. int i;
  58596. int c;
  58597. byte y;
  58598. int err = MP_OKAY;
  58599. if (bits == 0) {
  58600. err = MP_VAL;
  58601. }
  58602. #ifdef WOLFSSL_SP_SMALL_STACK
  58603. if (err == MP_OKAY) {
  58604. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 256), NULL,
  58605. DYNAMIC_TYPE_TMP_BUFFER);
  58606. if (td == NULL)
  58607. err = MEMORY_E;
  58608. }
  58609. #endif
  58610. if (err == MP_OKAY) {
  58611. norm = td;
  58612. for (i=0; i<8; i++) {
  58613. t[i] = td + i * 256;
  58614. }
  58615. sp_4096_mont_setup(m, &mp);
  58616. sp_4096_mont_norm_128(norm, m);
  58617. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  58618. if (reduceA != 0) {
  58619. err = sp_4096_mod_128(t[1] + 128, a, m);
  58620. if (err == MP_OKAY) {
  58621. err = sp_4096_mod_128(t[1], t[1], m);
  58622. }
  58623. }
  58624. else {
  58625. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  58626. err = sp_4096_mod_128(t[1], t[1], m);
  58627. }
  58628. }
  58629. if (err == MP_OKAY) {
  58630. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  58631. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  58632. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  58633. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  58634. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  58635. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  58636. i = (bits - 1) / 32;
  58637. n = e[i--];
  58638. c = bits & 31;
  58639. if (c == 0) {
  58640. c = 32;
  58641. }
  58642. c -= bits % 3;
  58643. if (c == 32) {
  58644. c = 29;
  58645. }
  58646. if (c < 0) {
  58647. /* Number of bits in top word is less than number needed. */
  58648. c = -c;
  58649. y = (byte)(n << c);
  58650. n = e[i--];
  58651. y |= (byte)(n >> (64 - c));
  58652. n <<= c;
  58653. c = 64 - c;
  58654. }
  58655. else if (c == 0) {
  58656. /* All bits in top word used. */
  58657. y = (byte)n;
  58658. }
  58659. else {
  58660. y = (byte)(n >> c);
  58661. n <<= 32 - c;
  58662. }
  58663. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  58664. for (; i>=0 || c>=3; ) {
  58665. if (c == 0) {
  58666. n = e[i--];
  58667. y = (byte)(n >> 29);
  58668. n <<= 3;
  58669. c = 29;
  58670. }
  58671. else if (c < 3) {
  58672. y = (byte)(n >> 29);
  58673. n = e[i--];
  58674. c = 3 - c;
  58675. y |= (byte)(n >> (32 - c));
  58676. n <<= c;
  58677. c = 32 - c;
  58678. }
  58679. else {
  58680. y = (byte)((n >> 29) & 0x7);
  58681. n <<= 3;
  58682. c -= 3;
  58683. }
  58684. sp_4096_mont_sqr_128(r, r, m, mp);
  58685. sp_4096_mont_sqr_128(r, r, m, mp);
  58686. sp_4096_mont_sqr_128(r, r, m, mp);
  58687. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  58688. }
  58689. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  58690. sp_4096_mont_reduce_128(r, m, mp);
  58691. mask = (sp_digit)0 - (sp_4096_cmp_128(r, m) >= 0);
  58692. sp_4096_cond_sub_128(r, r, m, mask);
  58693. }
  58694. #ifdef WOLFSSL_SP_SMALL_STACK
  58695. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  58696. #endif
  58697. return err;
  58698. }
  58699. #else
  58700. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  58701. *
  58702. * r A single precision number that is the result of the operation.
  58703. * a A single precision number being exponentiated.
  58704. * e A single precision number that is the exponent.
  58705. * bits The number of bits in the exponent.
  58706. * m A single precision number that is the modulus.
  58707. * returns 0 on success.
  58708. * returns MEMORY_E on dynamic memory allocation failure.
  58709. * returns MP_VAL when base is even or exponent is 0.
  58710. */
  58711. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  58712. int bits, const sp_digit* m, int reduceA)
  58713. {
  58714. #ifdef WOLFSSL_SP_SMALL_STACK
  58715. sp_digit* td = NULL;
  58716. #else
  58717. sp_digit td[16 * 256];
  58718. #endif
  58719. sp_digit* t[16];
  58720. sp_digit* norm = NULL;
  58721. sp_digit mp = 1;
  58722. sp_digit n;
  58723. sp_digit mask;
  58724. int i;
  58725. int c;
  58726. byte y;
  58727. int err = MP_OKAY;
  58728. if (bits == 0) {
  58729. err = MP_VAL;
  58730. }
  58731. #ifdef WOLFSSL_SP_SMALL_STACK
  58732. if (err == MP_OKAY) {
  58733. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 256), NULL,
  58734. DYNAMIC_TYPE_TMP_BUFFER);
  58735. if (td == NULL)
  58736. err = MEMORY_E;
  58737. }
  58738. #endif
  58739. if (err == MP_OKAY) {
  58740. norm = td;
  58741. for (i=0; i<16; i++) {
  58742. t[i] = td + i * 256;
  58743. }
  58744. sp_4096_mont_setup(m, &mp);
  58745. sp_4096_mont_norm_128(norm, m);
  58746. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  58747. if (reduceA != 0) {
  58748. err = sp_4096_mod_128(t[1] + 128, a, m);
  58749. if (err == MP_OKAY) {
  58750. err = sp_4096_mod_128(t[1], t[1], m);
  58751. }
  58752. }
  58753. else {
  58754. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  58755. err = sp_4096_mod_128(t[1], t[1], m);
  58756. }
  58757. }
  58758. if (err == MP_OKAY) {
  58759. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  58760. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  58761. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  58762. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  58763. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  58764. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  58765. sp_4096_mont_sqr_128(t[ 8], t[ 4], m, mp);
  58766. sp_4096_mont_mul_128(t[ 9], t[ 5], t[ 4], m, mp);
  58767. sp_4096_mont_sqr_128(t[10], t[ 5], m, mp);
  58768. sp_4096_mont_mul_128(t[11], t[ 6], t[ 5], m, mp);
  58769. sp_4096_mont_sqr_128(t[12], t[ 6], m, mp);
  58770. sp_4096_mont_mul_128(t[13], t[ 7], t[ 6], m, mp);
  58771. sp_4096_mont_sqr_128(t[14], t[ 7], m, mp);
  58772. sp_4096_mont_mul_128(t[15], t[ 8], t[ 7], m, mp);
  58773. i = (bits - 1) / 32;
  58774. n = e[i--];
  58775. c = bits & 31;
  58776. if (c == 0) {
  58777. c = 32;
  58778. }
  58779. c -= bits % 4;
  58780. if (c == 32) {
  58781. c = 28;
  58782. }
  58783. if (c < 0) {
  58784. /* Number of bits in top word is less than number needed. */
  58785. c = -c;
  58786. y = (byte)(n << c);
  58787. n = e[i--];
  58788. y |= (byte)(n >> (64 - c));
  58789. n <<= c;
  58790. c = 64 - c;
  58791. }
  58792. else if (c == 0) {
  58793. /* All bits in top word used. */
  58794. y = (byte)n;
  58795. }
  58796. else {
  58797. y = (byte)(n >> c);
  58798. n <<= 32 - c;
  58799. }
  58800. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  58801. for (; i>=0 || c>=4; ) {
  58802. if (c == 0) {
  58803. n = e[i--];
  58804. y = (byte)(n >> 28);
  58805. n <<= 4;
  58806. c = 28;
  58807. }
  58808. else if (c < 4) {
  58809. y = (byte)(n >> 28);
  58810. n = e[i--];
  58811. c = 4 - c;
  58812. y |= (byte)(n >> (32 - c));
  58813. n <<= c;
  58814. c = 32 - c;
  58815. }
  58816. else {
  58817. y = (byte)((n >> 28) & 0xf);
  58818. n <<= 4;
  58819. c -= 4;
  58820. }
  58821. sp_4096_mont_sqr_128(r, r, m, mp);
  58822. sp_4096_mont_sqr_128(r, r, m, mp);
  58823. sp_4096_mont_sqr_128(r, r, m, mp);
  58824. sp_4096_mont_sqr_128(r, r, m, mp);
  58825. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  58826. }
  58827. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  58828. sp_4096_mont_reduce_128(r, m, mp);
  58829. mask = (sp_digit)0 - (sp_4096_cmp_128(r, m) >= 0);
  58830. sp_4096_cond_sub_128(r, r, m, mask);
  58831. }
  58832. #ifdef WOLFSSL_SP_SMALL_STACK
  58833. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  58834. #endif
  58835. return err;
  58836. }
  58837. #endif /* WOLFSSL_SP_SMALL */
  58838. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  58839. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  58840. #ifdef WOLFSSL_HAVE_SP_RSA
  58841. /* RSA public key operation.
  58842. *
  58843. * in Array of bytes representing the number to exponentiate, base.
  58844. * inLen Number of bytes in base.
  58845. * em Public exponent.
  58846. * mm Modulus.
  58847. * out Buffer to hold big-endian bytes of exponentiation result.
  58848. * Must be at least 512 bytes long.
  58849. * outLen Number of bytes in result.
  58850. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  58851. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  58852. */
  58853. int sp_RsaPublic_4096(const byte* in, word32 inLen, const mp_int* em,
  58854. const mp_int* mm, byte* out, word32* outLen)
  58855. {
  58856. #ifdef WOLFSSL_SP_SMALL_STACK
  58857. sp_digit* a = NULL;
  58858. #else
  58859. sp_digit a[128 * 5];
  58860. #endif
  58861. sp_digit* m = NULL;
  58862. sp_digit* r = NULL;
  58863. sp_digit *ah = NULL;
  58864. sp_digit e[1] = {0};
  58865. int err = MP_OKAY;
  58866. if (*outLen < 512) {
  58867. err = MP_TO_E;
  58868. }
  58869. else if (mp_count_bits(em) > 32 || inLen > 512 ||
  58870. mp_count_bits(mm) != 4096) {
  58871. err = MP_READ_E;
  58872. }
  58873. else if (mp_iseven(mm)) {
  58874. err = MP_VAL;
  58875. }
  58876. #ifdef WOLFSSL_SP_SMALL_STACK
  58877. if (err == MP_OKAY) {
  58878. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 5, NULL,
  58879. DYNAMIC_TYPE_RSA);
  58880. if (a == NULL)
  58881. err = MEMORY_E;
  58882. }
  58883. #endif
  58884. if (err == MP_OKAY) {
  58885. ah = a + 128;
  58886. r = a + 128 * 2;
  58887. m = r + 128 * 2;
  58888. sp_4096_from_bin(ah, 128, in, inLen);
  58889. #if DIGIT_BIT >= 32
  58890. e[0] = em->dp[0];
  58891. #else
  58892. e[0] = em->dp[0];
  58893. if (em->used > 1) {
  58894. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  58895. }
  58896. #endif
  58897. if (e[0] == 0) {
  58898. err = MP_EXPTMOD_E;
  58899. }
  58900. }
  58901. if (err == MP_OKAY) {
  58902. sp_4096_from_mp(m, 128, mm);
  58903. if (e[0] == 0x10001) {
  58904. int i;
  58905. sp_digit mp;
  58906. sp_4096_mont_setup(m, &mp);
  58907. /* Convert to Montgomery form. */
  58908. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  58909. err = sp_4096_mod_128_cond(r, a, m);
  58910. /* Montgomery form: r = a.R mod m */
  58911. if (err == MP_OKAY) {
  58912. /* r = a ^ 0x10000 => r = a squared 16 times */
  58913. for (i = 15; i >= 0; i--) {
  58914. sp_4096_mont_sqr_128(r, r, m, mp);
  58915. }
  58916. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  58917. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  58918. */
  58919. sp_4096_mont_mul_128(r, r, ah, m, mp);
  58920. for (i = 127; i > 0; i--) {
  58921. if (r[i] != m[i]) {
  58922. break;
  58923. }
  58924. }
  58925. if (r[i] >= m[i]) {
  58926. sp_4096_sub_in_place_128(r, m);
  58927. }
  58928. }
  58929. }
  58930. else if (e[0] == 0x3) {
  58931. if (err == MP_OKAY) {
  58932. sp_4096_sqr_128(r, ah);
  58933. err = sp_4096_mod_128_cond(r, r, m);
  58934. }
  58935. if (err == MP_OKAY) {
  58936. sp_4096_mul_128(r, ah, r);
  58937. err = sp_4096_mod_128_cond(r, r, m);
  58938. }
  58939. }
  58940. else {
  58941. int i;
  58942. sp_digit mp;
  58943. sp_4096_mont_setup(m, &mp);
  58944. /* Convert to Montgomery form. */
  58945. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  58946. err = sp_4096_mod_128_cond(a, a, m);
  58947. if (err == MP_OKAY) {
  58948. for (i = 31; i >= 0; i--) {
  58949. if (e[0] >> i) {
  58950. break;
  58951. }
  58952. }
  58953. XMEMCPY(r, a, sizeof(sp_digit) * 128);
  58954. for (i--; i >= 0; i--) {
  58955. sp_4096_mont_sqr_128(r, r, m, mp);
  58956. if (((e[0] >> i) & 1) == 1) {
  58957. sp_4096_mont_mul_128(r, r, a, m, mp);
  58958. }
  58959. }
  58960. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128);
  58961. sp_4096_mont_reduce_128(r, m, mp);
  58962. for (i = 127; i > 0; i--) {
  58963. if (r[i] != m[i]) {
  58964. break;
  58965. }
  58966. }
  58967. if (r[i] >= m[i]) {
  58968. sp_4096_sub_in_place_128(r, m);
  58969. }
  58970. }
  58971. }
  58972. }
  58973. if (err == MP_OKAY) {
  58974. sp_4096_to_bin_128(r, out);
  58975. *outLen = 512;
  58976. }
  58977. #ifdef WOLFSSL_SP_SMALL_STACK
  58978. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  58979. #endif
  58980. return err;
  58981. }
  58982. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  58983. #ifdef WOLFSSL_SP_SMALL
  58984. /* Conditionally add a and b using the mask m.
  58985. * m is -1 to add and 0 when not.
  58986. *
  58987. * r A single precision number representing conditional add result.
  58988. * a A single precision number to add with.
  58989. * b A single precision number to add.
  58990. * m Mask value to apply.
  58991. */
  58992. 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)
  58993. {
  58994. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  58995. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  58996. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  58997. register sp_digit m asm ("r3") = (sp_digit)m_p;
  58998. __asm__ __volatile__ (
  58999. "mov lr, #0\n\t"
  59000. "mov r6, #0\n\t"
  59001. "mov r12, #0\n\t"
  59002. "\n"
  59003. "L_sp_4096_cond_add_64_words_%=: \n\t"
  59004. "adds lr, lr, #-1\n\t"
  59005. "ldr r4, [%[a], r12]\n\t"
  59006. "ldr r5, [%[b], r12]\n\t"
  59007. "and r5, r5, %[m]\n\t"
  59008. "adcs r4, r4, r5\n\t"
  59009. "adc lr, r6, r6\n\t"
  59010. "str r4, [%[r], r12]\n\t"
  59011. "add r12, r12, #4\n\t"
  59012. "cmp r12, #0x100\n\t"
  59013. "blt L_sp_4096_cond_add_64_words_%=\n\t"
  59014. "mov %[r], lr\n\t"
  59015. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  59016. :
  59017. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  59018. );
  59019. return (uint32_t)(size_t)r;
  59020. }
  59021. #else
  59022. /* Conditionally add a and b using the mask m.
  59023. * m is -1 to add and 0 when not.
  59024. *
  59025. * r A single precision number representing conditional add result.
  59026. * a A single precision number to add with.
  59027. * b A single precision number to add.
  59028. * m Mask value to apply.
  59029. */
  59030. 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)
  59031. {
  59032. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  59033. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  59034. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  59035. register sp_digit m asm ("r3") = (sp_digit)m_p;
  59036. __asm__ __volatile__ (
  59037. "mov r8, #0\n\t"
  59038. "ldm %[a]!, {r4, r5}\n\t"
  59039. "ldm %[b]!, {r6, r7}\n\t"
  59040. "and r6, r6, %[m]\n\t"
  59041. "and r7, r7, %[m]\n\t"
  59042. "adds r4, r4, r6\n\t"
  59043. "adcs r5, r5, r7\n\t"
  59044. "stm %[r]!, {r4, r5}\n\t"
  59045. "ldm %[a]!, {r4, r5}\n\t"
  59046. "ldm %[b]!, {r6, r7}\n\t"
  59047. "and r6, r6, %[m]\n\t"
  59048. "and r7, r7, %[m]\n\t"
  59049. "adcs r4, r4, r6\n\t"
  59050. "adcs r5, r5, r7\n\t"
  59051. "stm %[r]!, {r4, r5}\n\t"
  59052. "ldm %[a]!, {r4, r5}\n\t"
  59053. "ldm %[b]!, {r6, r7}\n\t"
  59054. "and r6, r6, %[m]\n\t"
  59055. "and r7, r7, %[m]\n\t"
  59056. "adcs r4, r4, r6\n\t"
  59057. "adcs r5, r5, r7\n\t"
  59058. "stm %[r]!, {r4, r5}\n\t"
  59059. "ldm %[a]!, {r4, r5}\n\t"
  59060. "ldm %[b]!, {r6, r7}\n\t"
  59061. "and r6, r6, %[m]\n\t"
  59062. "and r7, r7, %[m]\n\t"
  59063. "adcs r4, r4, r6\n\t"
  59064. "adcs r5, r5, r7\n\t"
  59065. "stm %[r]!, {r4, r5}\n\t"
  59066. "ldm %[a]!, {r4, r5}\n\t"
  59067. "ldm %[b]!, {r6, r7}\n\t"
  59068. "and r6, r6, %[m]\n\t"
  59069. "and r7, r7, %[m]\n\t"
  59070. "adcs r4, r4, r6\n\t"
  59071. "adcs r5, r5, r7\n\t"
  59072. "stm %[r]!, {r4, r5}\n\t"
  59073. "ldm %[a]!, {r4, r5}\n\t"
  59074. "ldm %[b]!, {r6, r7}\n\t"
  59075. "and r6, r6, %[m]\n\t"
  59076. "and r7, r7, %[m]\n\t"
  59077. "adcs r4, r4, r6\n\t"
  59078. "adcs r5, r5, r7\n\t"
  59079. "stm %[r]!, {r4, r5}\n\t"
  59080. "ldm %[a]!, {r4, r5}\n\t"
  59081. "ldm %[b]!, {r6, r7}\n\t"
  59082. "and r6, r6, %[m]\n\t"
  59083. "and r7, r7, %[m]\n\t"
  59084. "adcs r4, r4, r6\n\t"
  59085. "adcs r5, r5, r7\n\t"
  59086. "stm %[r]!, {r4, r5}\n\t"
  59087. "ldm %[a]!, {r4, r5}\n\t"
  59088. "ldm %[b]!, {r6, r7}\n\t"
  59089. "and r6, r6, %[m]\n\t"
  59090. "and r7, r7, %[m]\n\t"
  59091. "adcs r4, r4, r6\n\t"
  59092. "adcs r5, r5, r7\n\t"
  59093. "stm %[r]!, {r4, r5}\n\t"
  59094. "ldm %[a]!, {r4, r5}\n\t"
  59095. "ldm %[b]!, {r6, r7}\n\t"
  59096. "and r6, r6, %[m]\n\t"
  59097. "and r7, r7, %[m]\n\t"
  59098. "adcs r4, r4, r6\n\t"
  59099. "adcs r5, r5, r7\n\t"
  59100. "stm %[r]!, {r4, r5}\n\t"
  59101. "ldm %[a]!, {r4, r5}\n\t"
  59102. "ldm %[b]!, {r6, r7}\n\t"
  59103. "and r6, r6, %[m]\n\t"
  59104. "and r7, r7, %[m]\n\t"
  59105. "adcs r4, r4, r6\n\t"
  59106. "adcs r5, r5, r7\n\t"
  59107. "stm %[r]!, {r4, r5}\n\t"
  59108. "ldm %[a]!, {r4, r5}\n\t"
  59109. "ldm %[b]!, {r6, r7}\n\t"
  59110. "and r6, r6, %[m]\n\t"
  59111. "and r7, r7, %[m]\n\t"
  59112. "adcs r4, r4, r6\n\t"
  59113. "adcs r5, r5, r7\n\t"
  59114. "stm %[r]!, {r4, r5}\n\t"
  59115. "ldm %[a]!, {r4, r5}\n\t"
  59116. "ldm %[b]!, {r6, r7}\n\t"
  59117. "and r6, r6, %[m]\n\t"
  59118. "and r7, r7, %[m]\n\t"
  59119. "adcs r4, r4, r6\n\t"
  59120. "adcs r5, r5, r7\n\t"
  59121. "stm %[r]!, {r4, r5}\n\t"
  59122. "ldm %[a]!, {r4, r5}\n\t"
  59123. "ldm %[b]!, {r6, r7}\n\t"
  59124. "and r6, r6, %[m]\n\t"
  59125. "and r7, r7, %[m]\n\t"
  59126. "adcs r4, r4, r6\n\t"
  59127. "adcs r5, r5, r7\n\t"
  59128. "stm %[r]!, {r4, r5}\n\t"
  59129. "ldm %[a]!, {r4, r5}\n\t"
  59130. "ldm %[b]!, {r6, r7}\n\t"
  59131. "and r6, r6, %[m]\n\t"
  59132. "and r7, r7, %[m]\n\t"
  59133. "adcs r4, r4, r6\n\t"
  59134. "adcs r5, r5, r7\n\t"
  59135. "stm %[r]!, {r4, r5}\n\t"
  59136. "ldm %[a]!, {r4, r5}\n\t"
  59137. "ldm %[b]!, {r6, r7}\n\t"
  59138. "and r6, r6, %[m]\n\t"
  59139. "and r7, r7, %[m]\n\t"
  59140. "adcs r4, r4, r6\n\t"
  59141. "adcs r5, r5, r7\n\t"
  59142. "stm %[r]!, {r4, r5}\n\t"
  59143. "ldm %[a]!, {r4, r5}\n\t"
  59144. "ldm %[b]!, {r6, r7}\n\t"
  59145. "and r6, r6, %[m]\n\t"
  59146. "and r7, r7, %[m]\n\t"
  59147. "adcs r4, r4, r6\n\t"
  59148. "adcs r5, r5, r7\n\t"
  59149. "stm %[r]!, {r4, r5}\n\t"
  59150. "ldm %[a]!, {r4, r5}\n\t"
  59151. "ldm %[b]!, {r6, r7}\n\t"
  59152. "and r6, r6, %[m]\n\t"
  59153. "and r7, r7, %[m]\n\t"
  59154. "adcs r4, r4, r6\n\t"
  59155. "adcs r5, r5, r7\n\t"
  59156. "stm %[r]!, {r4, r5}\n\t"
  59157. "ldm %[a]!, {r4, r5}\n\t"
  59158. "ldm %[b]!, {r6, r7}\n\t"
  59159. "and r6, r6, %[m]\n\t"
  59160. "and r7, r7, %[m]\n\t"
  59161. "adcs r4, r4, r6\n\t"
  59162. "adcs r5, r5, r7\n\t"
  59163. "stm %[r]!, {r4, r5}\n\t"
  59164. "ldm %[a]!, {r4, r5}\n\t"
  59165. "ldm %[b]!, {r6, r7}\n\t"
  59166. "and r6, r6, %[m]\n\t"
  59167. "and r7, r7, %[m]\n\t"
  59168. "adcs r4, r4, r6\n\t"
  59169. "adcs r5, r5, r7\n\t"
  59170. "stm %[r]!, {r4, r5}\n\t"
  59171. "ldm %[a]!, {r4, r5}\n\t"
  59172. "ldm %[b]!, {r6, r7}\n\t"
  59173. "and r6, r6, %[m]\n\t"
  59174. "and r7, r7, %[m]\n\t"
  59175. "adcs r4, r4, r6\n\t"
  59176. "adcs r5, r5, r7\n\t"
  59177. "stm %[r]!, {r4, r5}\n\t"
  59178. "ldm %[a]!, {r4, r5}\n\t"
  59179. "ldm %[b]!, {r6, r7}\n\t"
  59180. "and r6, r6, %[m]\n\t"
  59181. "and r7, r7, %[m]\n\t"
  59182. "adcs r4, r4, r6\n\t"
  59183. "adcs r5, r5, r7\n\t"
  59184. "stm %[r]!, {r4, r5}\n\t"
  59185. "ldm %[a]!, {r4, r5}\n\t"
  59186. "ldm %[b]!, {r6, r7}\n\t"
  59187. "and r6, r6, %[m]\n\t"
  59188. "and r7, r7, %[m]\n\t"
  59189. "adcs r4, r4, r6\n\t"
  59190. "adcs r5, r5, r7\n\t"
  59191. "stm %[r]!, {r4, r5}\n\t"
  59192. "ldm %[a]!, {r4, r5}\n\t"
  59193. "ldm %[b]!, {r6, r7}\n\t"
  59194. "and r6, r6, %[m]\n\t"
  59195. "and r7, r7, %[m]\n\t"
  59196. "adcs r4, r4, r6\n\t"
  59197. "adcs r5, r5, r7\n\t"
  59198. "stm %[r]!, {r4, r5}\n\t"
  59199. "ldm %[a]!, {r4, r5}\n\t"
  59200. "ldm %[b]!, {r6, r7}\n\t"
  59201. "and r6, r6, %[m]\n\t"
  59202. "and r7, r7, %[m]\n\t"
  59203. "adcs r4, r4, r6\n\t"
  59204. "adcs r5, r5, r7\n\t"
  59205. "stm %[r]!, {r4, r5}\n\t"
  59206. "ldm %[a]!, {r4, r5}\n\t"
  59207. "ldm %[b]!, {r6, r7}\n\t"
  59208. "and r6, r6, %[m]\n\t"
  59209. "and r7, r7, %[m]\n\t"
  59210. "adcs r4, r4, r6\n\t"
  59211. "adcs r5, r5, r7\n\t"
  59212. "stm %[r]!, {r4, r5}\n\t"
  59213. "ldm %[a]!, {r4, r5}\n\t"
  59214. "ldm %[b]!, {r6, r7}\n\t"
  59215. "and r6, r6, %[m]\n\t"
  59216. "and r7, r7, %[m]\n\t"
  59217. "adcs r4, r4, r6\n\t"
  59218. "adcs r5, r5, r7\n\t"
  59219. "stm %[r]!, {r4, r5}\n\t"
  59220. "ldm %[a]!, {r4, r5}\n\t"
  59221. "ldm %[b]!, {r6, r7}\n\t"
  59222. "and r6, r6, %[m]\n\t"
  59223. "and r7, r7, %[m]\n\t"
  59224. "adcs r4, r4, r6\n\t"
  59225. "adcs r5, r5, r7\n\t"
  59226. "stm %[r]!, {r4, r5}\n\t"
  59227. "ldm %[a]!, {r4, r5}\n\t"
  59228. "ldm %[b]!, {r6, r7}\n\t"
  59229. "and r6, r6, %[m]\n\t"
  59230. "and r7, r7, %[m]\n\t"
  59231. "adcs r4, r4, r6\n\t"
  59232. "adcs r5, r5, r7\n\t"
  59233. "stm %[r]!, {r4, r5}\n\t"
  59234. "ldm %[a]!, {r4, r5}\n\t"
  59235. "ldm %[b]!, {r6, r7}\n\t"
  59236. "and r6, r6, %[m]\n\t"
  59237. "and r7, r7, %[m]\n\t"
  59238. "adcs r4, r4, r6\n\t"
  59239. "adcs r5, r5, r7\n\t"
  59240. "stm %[r]!, {r4, r5}\n\t"
  59241. "ldm %[a]!, {r4, r5}\n\t"
  59242. "ldm %[b]!, {r6, r7}\n\t"
  59243. "and r6, r6, %[m]\n\t"
  59244. "and r7, r7, %[m]\n\t"
  59245. "adcs r4, r4, r6\n\t"
  59246. "adcs r5, r5, r7\n\t"
  59247. "stm %[r]!, {r4, r5}\n\t"
  59248. "ldm %[a]!, {r4, r5}\n\t"
  59249. "ldm %[b]!, {r6, r7}\n\t"
  59250. "and r6, r6, %[m]\n\t"
  59251. "and r7, r7, %[m]\n\t"
  59252. "adcs r4, r4, r6\n\t"
  59253. "adcs r5, r5, r7\n\t"
  59254. "stm %[r]!, {r4, r5}\n\t"
  59255. "ldm %[a]!, {r4, r5}\n\t"
  59256. "ldm %[b]!, {r6, r7}\n\t"
  59257. "and r6, r6, %[m]\n\t"
  59258. "and r7, r7, %[m]\n\t"
  59259. "adcs r4, r4, r6\n\t"
  59260. "adcs r5, r5, r7\n\t"
  59261. "stm %[r]!, {r4, r5}\n\t"
  59262. "adc %[r], r8, r8\n\t"
  59263. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  59264. :
  59265. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  59266. );
  59267. return (uint32_t)(size_t)r;
  59268. }
  59269. #endif /* WOLFSSL_SP_SMALL */
  59270. /* RSA private key operation.
  59271. *
  59272. * in Array of bytes representing the number to exponentiate, base.
  59273. * inLen Number of bytes in base.
  59274. * dm Private exponent.
  59275. * pm First prime.
  59276. * qm Second prime.
  59277. * dpm First prime's CRT exponent.
  59278. * dqm Second prime's CRT exponent.
  59279. * qim Inverse of second prime mod p.
  59280. * mm Modulus.
  59281. * out Buffer to hold big-endian bytes of exponentiation result.
  59282. * Must be at least 512 bytes long.
  59283. * outLen Number of bytes in result.
  59284. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  59285. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  59286. */
  59287. int sp_RsaPrivate_4096(const byte* in, word32 inLen, const mp_int* dm,
  59288. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  59289. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  59290. {
  59291. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  59292. #ifdef WOLFSSL_SP_SMALL_STACK
  59293. sp_digit* d = NULL;
  59294. #else
  59295. sp_digit d[128 * 4];
  59296. #endif
  59297. sp_digit* a = NULL;
  59298. sp_digit* m = NULL;
  59299. sp_digit* r = NULL;
  59300. int err = MP_OKAY;
  59301. (void)pm;
  59302. (void)qm;
  59303. (void)dpm;
  59304. (void)dqm;
  59305. (void)qim;
  59306. if (*outLen < 512U) {
  59307. err = MP_TO_E;
  59308. }
  59309. if (err == MP_OKAY) {
  59310. if (mp_count_bits(dm) > 4096) {
  59311. err = MP_READ_E;
  59312. }
  59313. else if (inLen > 512) {
  59314. err = MP_READ_E;
  59315. }
  59316. else if (mp_count_bits(mm) != 4096) {
  59317. err = MP_READ_E;
  59318. }
  59319. else if (mp_iseven(mm)) {
  59320. err = MP_VAL;
  59321. }
  59322. }
  59323. #ifdef WOLFSSL_SP_SMALL_STACK
  59324. if (err == MP_OKAY) {
  59325. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL,
  59326. DYNAMIC_TYPE_RSA);
  59327. if (d == NULL)
  59328. err = MEMORY_E;
  59329. }
  59330. #endif
  59331. if (err == MP_OKAY) {
  59332. a = d + 128;
  59333. m = a + 256;
  59334. r = a;
  59335. sp_4096_from_bin(a, 128, in, inLen);
  59336. sp_4096_from_mp(d, 128, dm);
  59337. sp_4096_from_mp(m, 128, mm);
  59338. err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0);
  59339. }
  59340. if (err == MP_OKAY) {
  59341. sp_4096_to_bin_128(r, out);
  59342. *outLen = 512;
  59343. }
  59344. #ifdef WOLFSSL_SP_SMALL_STACK
  59345. if (d != NULL)
  59346. #endif
  59347. {
  59348. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  59349. if (a != NULL)
  59350. ForceZero(a, sizeof(sp_digit) * 128);
  59351. #ifdef WOLFSSL_SP_SMALL_STACK
  59352. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  59353. #endif
  59354. }
  59355. return err;
  59356. #else
  59357. #ifdef WOLFSSL_SP_SMALL_STACK
  59358. sp_digit* a = NULL;
  59359. #else
  59360. sp_digit a[64 * 11];
  59361. #endif
  59362. sp_digit* p = NULL;
  59363. sp_digit* q = NULL;
  59364. sp_digit* dp = NULL;
  59365. sp_digit* tmpa = NULL;
  59366. sp_digit* tmpb = NULL;
  59367. sp_digit* r = NULL;
  59368. sp_digit* qi = NULL;
  59369. sp_digit* dq = NULL;
  59370. sp_digit c;
  59371. int err = MP_OKAY;
  59372. (void)dm;
  59373. (void)mm;
  59374. if (*outLen < 512) {
  59375. err = MP_TO_E;
  59376. }
  59377. else if (inLen > 512 || mp_count_bits(mm) != 4096) {
  59378. err = MP_READ_E;
  59379. }
  59380. else if (mp_iseven(mm)) {
  59381. err = MP_VAL;
  59382. }
  59383. else if (mp_iseven(pm)) {
  59384. err = MP_VAL;
  59385. }
  59386. else if (mp_iseven(qm)) {
  59387. err = MP_VAL;
  59388. }
  59389. #ifdef WOLFSSL_SP_SMALL_STACK
  59390. if (err == MP_OKAY) {
  59391. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 11, NULL,
  59392. DYNAMIC_TYPE_RSA);
  59393. if (a == NULL)
  59394. err = MEMORY_E;
  59395. }
  59396. #endif
  59397. if (err == MP_OKAY) {
  59398. p = a + 128 * 2;
  59399. q = p + 64;
  59400. qi = dq = dp = q + 64;
  59401. tmpa = qi + 64;
  59402. tmpb = tmpa + 128;
  59403. r = a;
  59404. sp_4096_from_bin(a, 128, in, inLen);
  59405. sp_4096_from_mp(p, 64, pm);
  59406. sp_4096_from_mp(q, 64, qm);
  59407. sp_4096_from_mp(dp, 64, dpm);
  59408. err = sp_2048_mod_exp_64(tmpa, a, dp, 2048, p, 1);
  59409. }
  59410. if (err == MP_OKAY) {
  59411. sp_4096_from_mp(dq, 64, dqm);
  59412. err = sp_2048_mod_exp_64(tmpb, a, dq, 2048, q, 1);
  59413. }
  59414. if (err == MP_OKAY) {
  59415. c = sp_2048_sub_in_place_64(tmpa, tmpb);
  59416. c += sp_4096_cond_add_64(tmpa, tmpa, p, c);
  59417. sp_4096_cond_add_64(tmpa, tmpa, p, c);
  59418. sp_2048_from_mp(qi, 64, qim);
  59419. sp_2048_mul_64(tmpa, tmpa, qi);
  59420. err = sp_2048_mod_64(tmpa, tmpa, p);
  59421. }
  59422. if (err == MP_OKAY) {
  59423. sp_2048_mul_64(tmpa, q, tmpa);
  59424. XMEMSET(&tmpb[64], 0, sizeof(sp_digit) * 64);
  59425. sp_4096_add_128(r, tmpb, tmpa);
  59426. sp_4096_to_bin_128(r, out);
  59427. *outLen = 512;
  59428. }
  59429. #ifdef WOLFSSL_SP_SMALL_STACK
  59430. if (a != NULL)
  59431. #endif
  59432. {
  59433. ForceZero(a, sizeof(sp_digit) * 64 * 11);
  59434. #ifdef WOLFSSL_SP_SMALL_STACK
  59435. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  59436. #endif
  59437. }
  59438. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  59439. return err;
  59440. }
  59441. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  59442. #endif /* WOLFSSL_HAVE_SP_RSA */
  59443. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  59444. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  59445. /* Convert an array of sp_digit to an mp_int.
  59446. *
  59447. * a A single precision integer.
  59448. * r A multi-precision integer.
  59449. */
  59450. static int sp_4096_to_mp(const sp_digit* a, mp_int* r)
  59451. {
  59452. int err;
  59453. err = mp_grow(r, (4096 + DIGIT_BIT - 1) / DIGIT_BIT);
  59454. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  59455. #if DIGIT_BIT == 32
  59456. XMEMCPY(r->dp, a, sizeof(sp_digit) * 128);
  59457. r->used = 128;
  59458. mp_clamp(r);
  59459. #elif DIGIT_BIT < 32
  59460. int i;
  59461. int j = 0;
  59462. int s = 0;
  59463. r->dp[0] = 0;
  59464. for (i = 0; i < 128; i++) {
  59465. r->dp[j] |= (mp_digit)(a[i] << s);
  59466. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  59467. s = DIGIT_BIT - s;
  59468. r->dp[++j] = (mp_digit)(a[i] >> s);
  59469. while (s + DIGIT_BIT <= 32) {
  59470. s += DIGIT_BIT;
  59471. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  59472. if (s == SP_WORD_SIZE) {
  59473. r->dp[j] = 0;
  59474. }
  59475. else {
  59476. r->dp[j] = (mp_digit)(a[i] >> s);
  59477. }
  59478. }
  59479. s = 32 - s;
  59480. }
  59481. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  59482. mp_clamp(r);
  59483. #else
  59484. int i;
  59485. int j = 0;
  59486. int s = 0;
  59487. r->dp[0] = 0;
  59488. for (i = 0; i < 128; i++) {
  59489. r->dp[j] |= ((mp_digit)a[i]) << s;
  59490. if (s + 32 >= DIGIT_BIT) {
  59491. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  59492. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  59493. #endif
  59494. s = DIGIT_BIT - s;
  59495. r->dp[++j] = a[i] >> s;
  59496. s = 32 - s;
  59497. }
  59498. else {
  59499. s += 32;
  59500. }
  59501. }
  59502. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  59503. mp_clamp(r);
  59504. #endif
  59505. }
  59506. return err;
  59507. }
  59508. /* Perform the modular exponentiation for Diffie-Hellman.
  59509. *
  59510. * base Base. MP integer.
  59511. * exp Exponent. MP integer.
  59512. * mod Modulus. MP integer.
  59513. * res Result. MP integer.
  59514. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  59515. * and MEMORY_E if memory allocation fails.
  59516. */
  59517. int sp_ModExp_4096(const mp_int* base, const mp_int* exp, const mp_int* mod,
  59518. mp_int* res)
  59519. {
  59520. int err = MP_OKAY;
  59521. sp_digit b[256];
  59522. sp_digit e[128];
  59523. sp_digit m[128];
  59524. sp_digit* r = b;
  59525. int expBits = mp_count_bits(exp);
  59526. if (mp_count_bits(base) > 4096) {
  59527. err = MP_READ_E;
  59528. }
  59529. else if (expBits > 4096) {
  59530. err = MP_READ_E;
  59531. }
  59532. else if (mp_count_bits(mod) != 4096) {
  59533. err = MP_READ_E;
  59534. }
  59535. else if (mp_iseven(mod)) {
  59536. err = MP_VAL;
  59537. }
  59538. if (err == MP_OKAY) {
  59539. sp_4096_from_mp(b, 128, base);
  59540. sp_4096_from_mp(e, 128, exp);
  59541. sp_4096_from_mp(m, 128, mod);
  59542. err = sp_4096_mod_exp_128(r, b, e, expBits, m, 0);
  59543. }
  59544. if (err == MP_OKAY) {
  59545. err = sp_4096_to_mp(r, res);
  59546. }
  59547. XMEMSET(e, 0, sizeof(e));
  59548. return err;
  59549. }
  59550. #ifdef WOLFSSL_HAVE_SP_DH
  59551. #ifdef HAVE_FFDHE_4096
  59552. static void sp_4096_lshift_128(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  59553. {
  59554. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  59555. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  59556. register byte n asm ("r2") = (byte)n_p;
  59557. __asm__ __volatile__ (
  59558. "rsb r12, %[n], #31\n\t"
  59559. "ldr r5, [%[a], #508]\n\t"
  59560. "lsr r6, r5, #1\n\t"
  59561. "lsl r5, r5, %[n]\n\t"
  59562. "lsr r6, r6, r12\n\t"
  59563. "ldr r4, [%[a], #504]\n\t"
  59564. "str r6, [%[r], #512]\n\t"
  59565. "lsr r3, r4, #1\n\t"
  59566. "lsl r4, r4, %[n]\n\t"
  59567. "lsr r3, r3, r12\n\t"
  59568. "orr r5, r5, r3\n\t"
  59569. "ldr r6, [%[a], #500]\n\t"
  59570. "str r5, [%[r], #508]\n\t"
  59571. "lsr r3, r6, #1\n\t"
  59572. "lsl r6, r6, %[n]\n\t"
  59573. "lsr r3, r3, r12\n\t"
  59574. "orr r4, r4, r3\n\t"
  59575. "ldr r5, [%[a], #496]\n\t"
  59576. "str r4, [%[r], #504]\n\t"
  59577. "lsr r3, r5, #1\n\t"
  59578. "lsl r5, r5, %[n]\n\t"
  59579. "lsr r3, r3, r12\n\t"
  59580. "orr r6, r6, r3\n\t"
  59581. "ldr r4, [%[a], #492]\n\t"
  59582. "str r6, [%[r], #500]\n\t"
  59583. "lsr r3, r4, #1\n\t"
  59584. "lsl r4, r4, %[n]\n\t"
  59585. "lsr r3, r3, r12\n\t"
  59586. "orr r5, r5, r3\n\t"
  59587. "ldr r6, [%[a], #488]\n\t"
  59588. "str r5, [%[r], #496]\n\t"
  59589. "lsr r3, r6, #1\n\t"
  59590. "lsl r6, r6, %[n]\n\t"
  59591. "lsr r3, r3, r12\n\t"
  59592. "orr r4, r4, r3\n\t"
  59593. "ldr r5, [%[a], #484]\n\t"
  59594. "str r4, [%[r], #492]\n\t"
  59595. "lsr r3, r5, #1\n\t"
  59596. "lsl r5, r5, %[n]\n\t"
  59597. "lsr r3, r3, r12\n\t"
  59598. "orr r6, r6, r3\n\t"
  59599. "ldr r4, [%[a], #480]\n\t"
  59600. "str r6, [%[r], #488]\n\t"
  59601. "lsr r3, r4, #1\n\t"
  59602. "lsl r4, r4, %[n]\n\t"
  59603. "lsr r3, r3, r12\n\t"
  59604. "orr r5, r5, r3\n\t"
  59605. "ldr r6, [%[a], #476]\n\t"
  59606. "str r5, [%[r], #484]\n\t"
  59607. "lsr r3, r6, #1\n\t"
  59608. "lsl r6, r6, %[n]\n\t"
  59609. "lsr r3, r3, r12\n\t"
  59610. "orr r4, r4, r3\n\t"
  59611. "ldr r5, [%[a], #472]\n\t"
  59612. "str r4, [%[r], #480]\n\t"
  59613. "lsr r3, r5, #1\n\t"
  59614. "lsl r5, r5, %[n]\n\t"
  59615. "lsr r3, r3, r12\n\t"
  59616. "orr r6, r6, r3\n\t"
  59617. "ldr r4, [%[a], #468]\n\t"
  59618. "str r6, [%[r], #476]\n\t"
  59619. "lsr r3, r4, #1\n\t"
  59620. "lsl r4, r4, %[n]\n\t"
  59621. "lsr r3, r3, r12\n\t"
  59622. "orr r5, r5, r3\n\t"
  59623. "ldr r6, [%[a], #464]\n\t"
  59624. "str r5, [%[r], #472]\n\t"
  59625. "lsr r3, r6, #1\n\t"
  59626. "lsl r6, r6, %[n]\n\t"
  59627. "lsr r3, r3, r12\n\t"
  59628. "orr r4, r4, r3\n\t"
  59629. "ldr r5, [%[a], #460]\n\t"
  59630. "str r4, [%[r], #468]\n\t"
  59631. "lsr r3, r5, #1\n\t"
  59632. "lsl r5, r5, %[n]\n\t"
  59633. "lsr r3, r3, r12\n\t"
  59634. "orr r6, r6, r3\n\t"
  59635. "ldr r4, [%[a], #456]\n\t"
  59636. "str r6, [%[r], #464]\n\t"
  59637. "lsr r3, r4, #1\n\t"
  59638. "lsl r4, r4, %[n]\n\t"
  59639. "lsr r3, r3, r12\n\t"
  59640. "orr r5, r5, r3\n\t"
  59641. "ldr r6, [%[a], #452]\n\t"
  59642. "str r5, [%[r], #460]\n\t"
  59643. "lsr r3, r6, #1\n\t"
  59644. "lsl r6, r6, %[n]\n\t"
  59645. "lsr r3, r3, r12\n\t"
  59646. "orr r4, r4, r3\n\t"
  59647. "ldr r5, [%[a], #448]\n\t"
  59648. "str r4, [%[r], #456]\n\t"
  59649. "lsr r3, r5, #1\n\t"
  59650. "lsl r5, r5, %[n]\n\t"
  59651. "lsr r3, r3, r12\n\t"
  59652. "orr r6, r6, r3\n\t"
  59653. "ldr r4, [%[a], #444]\n\t"
  59654. "str r6, [%[r], #452]\n\t"
  59655. "lsr r3, r4, #1\n\t"
  59656. "lsl r4, r4, %[n]\n\t"
  59657. "lsr r3, r3, r12\n\t"
  59658. "orr r5, r5, r3\n\t"
  59659. "ldr r6, [%[a], #440]\n\t"
  59660. "str r5, [%[r], #448]\n\t"
  59661. "lsr r3, r6, #1\n\t"
  59662. "lsl r6, r6, %[n]\n\t"
  59663. "lsr r3, r3, r12\n\t"
  59664. "orr r4, r4, r3\n\t"
  59665. "ldr r5, [%[a], #436]\n\t"
  59666. "str r4, [%[r], #444]\n\t"
  59667. "lsr r3, r5, #1\n\t"
  59668. "lsl r5, r5, %[n]\n\t"
  59669. "lsr r3, r3, r12\n\t"
  59670. "orr r6, r6, r3\n\t"
  59671. "ldr r4, [%[a], #432]\n\t"
  59672. "str r6, [%[r], #440]\n\t"
  59673. "lsr r3, r4, #1\n\t"
  59674. "lsl r4, r4, %[n]\n\t"
  59675. "lsr r3, r3, r12\n\t"
  59676. "orr r5, r5, r3\n\t"
  59677. "ldr r6, [%[a], #428]\n\t"
  59678. "str r5, [%[r], #436]\n\t"
  59679. "lsr r3, r6, #1\n\t"
  59680. "lsl r6, r6, %[n]\n\t"
  59681. "lsr r3, r3, r12\n\t"
  59682. "orr r4, r4, r3\n\t"
  59683. "ldr r5, [%[a], #424]\n\t"
  59684. "str r4, [%[r], #432]\n\t"
  59685. "lsr r3, r5, #1\n\t"
  59686. "lsl r5, r5, %[n]\n\t"
  59687. "lsr r3, r3, r12\n\t"
  59688. "orr r6, r6, r3\n\t"
  59689. "ldr r4, [%[a], #420]\n\t"
  59690. "str r6, [%[r], #428]\n\t"
  59691. "lsr r3, r4, #1\n\t"
  59692. "lsl r4, r4, %[n]\n\t"
  59693. "lsr r3, r3, r12\n\t"
  59694. "orr r5, r5, r3\n\t"
  59695. "ldr r6, [%[a], #416]\n\t"
  59696. "str r5, [%[r], #424]\n\t"
  59697. "lsr r3, r6, #1\n\t"
  59698. "lsl r6, r6, %[n]\n\t"
  59699. "lsr r3, r3, r12\n\t"
  59700. "orr r4, r4, r3\n\t"
  59701. "ldr r5, [%[a], #412]\n\t"
  59702. "str r4, [%[r], #420]\n\t"
  59703. "lsr r3, r5, #1\n\t"
  59704. "lsl r5, r5, %[n]\n\t"
  59705. "lsr r3, r3, r12\n\t"
  59706. "orr r6, r6, r3\n\t"
  59707. "ldr r4, [%[a], #408]\n\t"
  59708. "str r6, [%[r], #416]\n\t"
  59709. "lsr r3, r4, #1\n\t"
  59710. "lsl r4, r4, %[n]\n\t"
  59711. "lsr r3, r3, r12\n\t"
  59712. "orr r5, r5, r3\n\t"
  59713. "ldr r6, [%[a], #404]\n\t"
  59714. "str r5, [%[r], #412]\n\t"
  59715. "lsr r3, r6, #1\n\t"
  59716. "lsl r6, r6, %[n]\n\t"
  59717. "lsr r3, r3, r12\n\t"
  59718. "orr r4, r4, r3\n\t"
  59719. "ldr r5, [%[a], #400]\n\t"
  59720. "str r4, [%[r], #408]\n\t"
  59721. "lsr r3, r5, #1\n\t"
  59722. "lsl r5, r5, %[n]\n\t"
  59723. "lsr r3, r3, r12\n\t"
  59724. "orr r6, r6, r3\n\t"
  59725. "ldr r4, [%[a], #396]\n\t"
  59726. "str r6, [%[r], #404]\n\t"
  59727. "lsr r3, r4, #1\n\t"
  59728. "lsl r4, r4, %[n]\n\t"
  59729. "lsr r3, r3, r12\n\t"
  59730. "orr r5, r5, r3\n\t"
  59731. "ldr r6, [%[a], #392]\n\t"
  59732. "str r5, [%[r], #400]\n\t"
  59733. "lsr r3, r6, #1\n\t"
  59734. "lsl r6, r6, %[n]\n\t"
  59735. "lsr r3, r3, r12\n\t"
  59736. "orr r4, r4, r3\n\t"
  59737. "ldr r5, [%[a], #388]\n\t"
  59738. "str r4, [%[r], #396]\n\t"
  59739. "lsr r3, r5, #1\n\t"
  59740. "lsl r5, r5, %[n]\n\t"
  59741. "lsr r3, r3, r12\n\t"
  59742. "orr r6, r6, r3\n\t"
  59743. "ldr r4, [%[a], #384]\n\t"
  59744. "str r6, [%[r], #392]\n\t"
  59745. "lsr r3, r4, #1\n\t"
  59746. "lsl r4, r4, %[n]\n\t"
  59747. "lsr r3, r3, r12\n\t"
  59748. "orr r5, r5, r3\n\t"
  59749. "ldr r6, [%[a], #380]\n\t"
  59750. "str r5, [%[r], #388]\n\t"
  59751. "lsr r3, r6, #1\n\t"
  59752. "lsl r6, r6, %[n]\n\t"
  59753. "lsr r3, r3, r12\n\t"
  59754. "orr r4, r4, r3\n\t"
  59755. "ldr r5, [%[a], #376]\n\t"
  59756. "str r4, [%[r], #384]\n\t"
  59757. "lsr r3, r5, #1\n\t"
  59758. "lsl r5, r5, %[n]\n\t"
  59759. "lsr r3, r3, r12\n\t"
  59760. "orr r6, r6, r3\n\t"
  59761. "ldr r4, [%[a], #372]\n\t"
  59762. "str r6, [%[r], #380]\n\t"
  59763. "lsr r3, r4, #1\n\t"
  59764. "lsl r4, r4, %[n]\n\t"
  59765. "lsr r3, r3, r12\n\t"
  59766. "orr r5, r5, r3\n\t"
  59767. "ldr r6, [%[a], #368]\n\t"
  59768. "str r5, [%[r], #376]\n\t"
  59769. "lsr r3, r6, #1\n\t"
  59770. "lsl r6, r6, %[n]\n\t"
  59771. "lsr r3, r3, r12\n\t"
  59772. "orr r4, r4, r3\n\t"
  59773. "ldr r5, [%[a], #364]\n\t"
  59774. "str r4, [%[r], #372]\n\t"
  59775. "lsr r3, r5, #1\n\t"
  59776. "lsl r5, r5, %[n]\n\t"
  59777. "lsr r3, r3, r12\n\t"
  59778. "orr r6, r6, r3\n\t"
  59779. "ldr r4, [%[a], #360]\n\t"
  59780. "str r6, [%[r], #368]\n\t"
  59781. "lsr r3, r4, #1\n\t"
  59782. "lsl r4, r4, %[n]\n\t"
  59783. "lsr r3, r3, r12\n\t"
  59784. "orr r5, r5, r3\n\t"
  59785. "ldr r6, [%[a], #356]\n\t"
  59786. "str r5, [%[r], #364]\n\t"
  59787. "lsr r3, r6, #1\n\t"
  59788. "lsl r6, r6, %[n]\n\t"
  59789. "lsr r3, r3, r12\n\t"
  59790. "orr r4, r4, r3\n\t"
  59791. "ldr r5, [%[a], #352]\n\t"
  59792. "str r4, [%[r], #360]\n\t"
  59793. "lsr r3, r5, #1\n\t"
  59794. "lsl r5, r5, %[n]\n\t"
  59795. "lsr r3, r3, r12\n\t"
  59796. "orr r6, r6, r3\n\t"
  59797. "ldr r4, [%[a], #348]\n\t"
  59798. "str r6, [%[r], #356]\n\t"
  59799. "lsr r3, r4, #1\n\t"
  59800. "lsl r4, r4, %[n]\n\t"
  59801. "lsr r3, r3, r12\n\t"
  59802. "orr r5, r5, r3\n\t"
  59803. "ldr r6, [%[a], #344]\n\t"
  59804. "str r5, [%[r], #352]\n\t"
  59805. "lsr r3, r6, #1\n\t"
  59806. "lsl r6, r6, %[n]\n\t"
  59807. "lsr r3, r3, r12\n\t"
  59808. "orr r4, r4, r3\n\t"
  59809. "ldr r5, [%[a], #340]\n\t"
  59810. "str r4, [%[r], #348]\n\t"
  59811. "lsr r3, r5, #1\n\t"
  59812. "lsl r5, r5, %[n]\n\t"
  59813. "lsr r3, r3, r12\n\t"
  59814. "orr r6, r6, r3\n\t"
  59815. "ldr r4, [%[a], #336]\n\t"
  59816. "str r6, [%[r], #344]\n\t"
  59817. "lsr r3, r4, #1\n\t"
  59818. "lsl r4, r4, %[n]\n\t"
  59819. "lsr r3, r3, r12\n\t"
  59820. "orr r5, r5, r3\n\t"
  59821. "ldr r6, [%[a], #332]\n\t"
  59822. "str r5, [%[r], #340]\n\t"
  59823. "lsr r3, r6, #1\n\t"
  59824. "lsl r6, r6, %[n]\n\t"
  59825. "lsr r3, r3, r12\n\t"
  59826. "orr r4, r4, r3\n\t"
  59827. "ldr r5, [%[a], #328]\n\t"
  59828. "str r4, [%[r], #336]\n\t"
  59829. "lsr r3, r5, #1\n\t"
  59830. "lsl r5, r5, %[n]\n\t"
  59831. "lsr r3, r3, r12\n\t"
  59832. "orr r6, r6, r3\n\t"
  59833. "ldr r4, [%[a], #324]\n\t"
  59834. "str r6, [%[r], #332]\n\t"
  59835. "lsr r3, r4, #1\n\t"
  59836. "lsl r4, r4, %[n]\n\t"
  59837. "lsr r3, r3, r12\n\t"
  59838. "orr r5, r5, r3\n\t"
  59839. "ldr r6, [%[a], #320]\n\t"
  59840. "str r5, [%[r], #328]\n\t"
  59841. "lsr r3, r6, #1\n\t"
  59842. "lsl r6, r6, %[n]\n\t"
  59843. "lsr r3, r3, r12\n\t"
  59844. "orr r4, r4, r3\n\t"
  59845. "ldr r5, [%[a], #316]\n\t"
  59846. "str r4, [%[r], #324]\n\t"
  59847. "lsr r3, r5, #1\n\t"
  59848. "lsl r5, r5, %[n]\n\t"
  59849. "lsr r3, r3, r12\n\t"
  59850. "orr r6, r6, r3\n\t"
  59851. "ldr r4, [%[a], #312]\n\t"
  59852. "str r6, [%[r], #320]\n\t"
  59853. "lsr r3, r4, #1\n\t"
  59854. "lsl r4, r4, %[n]\n\t"
  59855. "lsr r3, r3, r12\n\t"
  59856. "orr r5, r5, r3\n\t"
  59857. "ldr r6, [%[a], #308]\n\t"
  59858. "str r5, [%[r], #316]\n\t"
  59859. "lsr r3, r6, #1\n\t"
  59860. "lsl r6, r6, %[n]\n\t"
  59861. "lsr r3, r3, r12\n\t"
  59862. "orr r4, r4, r3\n\t"
  59863. "ldr r5, [%[a], #304]\n\t"
  59864. "str r4, [%[r], #312]\n\t"
  59865. "lsr r3, r5, #1\n\t"
  59866. "lsl r5, r5, %[n]\n\t"
  59867. "lsr r3, r3, r12\n\t"
  59868. "orr r6, r6, r3\n\t"
  59869. "ldr r4, [%[a], #300]\n\t"
  59870. "str r6, [%[r], #308]\n\t"
  59871. "lsr r3, r4, #1\n\t"
  59872. "lsl r4, r4, %[n]\n\t"
  59873. "lsr r3, r3, r12\n\t"
  59874. "orr r5, r5, r3\n\t"
  59875. "ldr r6, [%[a], #296]\n\t"
  59876. "str r5, [%[r], #304]\n\t"
  59877. "lsr r3, r6, #1\n\t"
  59878. "lsl r6, r6, %[n]\n\t"
  59879. "lsr r3, r3, r12\n\t"
  59880. "orr r4, r4, r3\n\t"
  59881. "ldr r5, [%[a], #292]\n\t"
  59882. "str r4, [%[r], #300]\n\t"
  59883. "lsr r3, r5, #1\n\t"
  59884. "lsl r5, r5, %[n]\n\t"
  59885. "lsr r3, r3, r12\n\t"
  59886. "orr r6, r6, r3\n\t"
  59887. "ldr r4, [%[a], #288]\n\t"
  59888. "str r6, [%[r], #296]\n\t"
  59889. "lsr r3, r4, #1\n\t"
  59890. "lsl r4, r4, %[n]\n\t"
  59891. "lsr r3, r3, r12\n\t"
  59892. "orr r5, r5, r3\n\t"
  59893. "ldr r6, [%[a], #284]\n\t"
  59894. "str r5, [%[r], #292]\n\t"
  59895. "lsr r3, r6, #1\n\t"
  59896. "lsl r6, r6, %[n]\n\t"
  59897. "lsr r3, r3, r12\n\t"
  59898. "orr r4, r4, r3\n\t"
  59899. "ldr r5, [%[a], #280]\n\t"
  59900. "str r4, [%[r], #288]\n\t"
  59901. "lsr r3, r5, #1\n\t"
  59902. "lsl r5, r5, %[n]\n\t"
  59903. "lsr r3, r3, r12\n\t"
  59904. "orr r6, r6, r3\n\t"
  59905. "ldr r4, [%[a], #276]\n\t"
  59906. "str r6, [%[r], #284]\n\t"
  59907. "lsr r3, r4, #1\n\t"
  59908. "lsl r4, r4, %[n]\n\t"
  59909. "lsr r3, r3, r12\n\t"
  59910. "orr r5, r5, r3\n\t"
  59911. "ldr r6, [%[a], #272]\n\t"
  59912. "str r5, [%[r], #280]\n\t"
  59913. "lsr r3, r6, #1\n\t"
  59914. "lsl r6, r6, %[n]\n\t"
  59915. "lsr r3, r3, r12\n\t"
  59916. "orr r4, r4, r3\n\t"
  59917. "ldr r5, [%[a], #268]\n\t"
  59918. "str r4, [%[r], #276]\n\t"
  59919. "lsr r3, r5, #1\n\t"
  59920. "lsl r5, r5, %[n]\n\t"
  59921. "lsr r3, r3, r12\n\t"
  59922. "orr r6, r6, r3\n\t"
  59923. "ldr r4, [%[a], #264]\n\t"
  59924. "str r6, [%[r], #272]\n\t"
  59925. "lsr r3, r4, #1\n\t"
  59926. "lsl r4, r4, %[n]\n\t"
  59927. "lsr r3, r3, r12\n\t"
  59928. "orr r5, r5, r3\n\t"
  59929. "ldr r6, [%[a], #260]\n\t"
  59930. "str r5, [%[r], #268]\n\t"
  59931. "lsr r3, r6, #1\n\t"
  59932. "lsl r6, r6, %[n]\n\t"
  59933. "lsr r3, r3, r12\n\t"
  59934. "orr r4, r4, r3\n\t"
  59935. "ldr r5, [%[a], #256]\n\t"
  59936. "str r4, [%[r], #264]\n\t"
  59937. "lsr r3, r5, #1\n\t"
  59938. "lsl r5, r5, %[n]\n\t"
  59939. "lsr r3, r3, r12\n\t"
  59940. "orr r6, r6, r3\n\t"
  59941. "ldr r4, [%[a], #252]\n\t"
  59942. "str r6, [%[r], #260]\n\t"
  59943. "lsr r3, r4, #1\n\t"
  59944. "lsl r4, r4, %[n]\n\t"
  59945. "lsr r3, r3, r12\n\t"
  59946. "orr r5, r5, r3\n\t"
  59947. "ldr r6, [%[a], #248]\n\t"
  59948. "str r5, [%[r], #256]\n\t"
  59949. "lsr r3, r6, #1\n\t"
  59950. "lsl r6, r6, %[n]\n\t"
  59951. "lsr r3, r3, r12\n\t"
  59952. "orr r4, r4, r3\n\t"
  59953. "ldr r5, [%[a], #244]\n\t"
  59954. "str r4, [%[r], #252]\n\t"
  59955. "lsr r3, r5, #1\n\t"
  59956. "lsl r5, r5, %[n]\n\t"
  59957. "lsr r3, r3, r12\n\t"
  59958. "orr r6, r6, r3\n\t"
  59959. "ldr r4, [%[a], #240]\n\t"
  59960. "str r6, [%[r], #248]\n\t"
  59961. "lsr r3, r4, #1\n\t"
  59962. "lsl r4, r4, %[n]\n\t"
  59963. "lsr r3, r3, r12\n\t"
  59964. "orr r5, r5, r3\n\t"
  59965. "ldr r6, [%[a], #236]\n\t"
  59966. "str r5, [%[r], #244]\n\t"
  59967. "lsr r3, r6, #1\n\t"
  59968. "lsl r6, r6, %[n]\n\t"
  59969. "lsr r3, r3, r12\n\t"
  59970. "orr r4, r4, r3\n\t"
  59971. "ldr r5, [%[a], #232]\n\t"
  59972. "str r4, [%[r], #240]\n\t"
  59973. "lsr r3, r5, #1\n\t"
  59974. "lsl r5, r5, %[n]\n\t"
  59975. "lsr r3, r3, r12\n\t"
  59976. "orr r6, r6, r3\n\t"
  59977. "ldr r4, [%[a], #228]\n\t"
  59978. "str r6, [%[r], #236]\n\t"
  59979. "lsr r3, r4, #1\n\t"
  59980. "lsl r4, r4, %[n]\n\t"
  59981. "lsr r3, r3, r12\n\t"
  59982. "orr r5, r5, r3\n\t"
  59983. "ldr r6, [%[a], #224]\n\t"
  59984. "str r5, [%[r], #232]\n\t"
  59985. "lsr r3, r6, #1\n\t"
  59986. "lsl r6, r6, %[n]\n\t"
  59987. "lsr r3, r3, r12\n\t"
  59988. "orr r4, r4, r3\n\t"
  59989. "ldr r5, [%[a], #220]\n\t"
  59990. "str r4, [%[r], #228]\n\t"
  59991. "lsr r3, r5, #1\n\t"
  59992. "lsl r5, r5, %[n]\n\t"
  59993. "lsr r3, r3, r12\n\t"
  59994. "orr r6, r6, r3\n\t"
  59995. "ldr r4, [%[a], #216]\n\t"
  59996. "str r6, [%[r], #224]\n\t"
  59997. "lsr r3, r4, #1\n\t"
  59998. "lsl r4, r4, %[n]\n\t"
  59999. "lsr r3, r3, r12\n\t"
  60000. "orr r5, r5, r3\n\t"
  60001. "ldr r6, [%[a], #212]\n\t"
  60002. "str r5, [%[r], #220]\n\t"
  60003. "lsr r3, r6, #1\n\t"
  60004. "lsl r6, r6, %[n]\n\t"
  60005. "lsr r3, r3, r12\n\t"
  60006. "orr r4, r4, r3\n\t"
  60007. "ldr r5, [%[a], #208]\n\t"
  60008. "str r4, [%[r], #216]\n\t"
  60009. "lsr r3, r5, #1\n\t"
  60010. "lsl r5, r5, %[n]\n\t"
  60011. "lsr r3, r3, r12\n\t"
  60012. "orr r6, r6, r3\n\t"
  60013. "ldr r4, [%[a], #204]\n\t"
  60014. "str r6, [%[r], #212]\n\t"
  60015. "lsr r3, r4, #1\n\t"
  60016. "lsl r4, r4, %[n]\n\t"
  60017. "lsr r3, r3, r12\n\t"
  60018. "orr r5, r5, r3\n\t"
  60019. "ldr r6, [%[a], #200]\n\t"
  60020. "str r5, [%[r], #208]\n\t"
  60021. "lsr r3, r6, #1\n\t"
  60022. "lsl r6, r6, %[n]\n\t"
  60023. "lsr r3, r3, r12\n\t"
  60024. "orr r4, r4, r3\n\t"
  60025. "ldr r5, [%[a], #196]\n\t"
  60026. "str r4, [%[r], #204]\n\t"
  60027. "lsr r3, r5, #1\n\t"
  60028. "lsl r5, r5, %[n]\n\t"
  60029. "lsr r3, r3, r12\n\t"
  60030. "orr r6, r6, r3\n\t"
  60031. "ldr r4, [%[a], #192]\n\t"
  60032. "str r6, [%[r], #200]\n\t"
  60033. "lsr r3, r4, #1\n\t"
  60034. "lsl r4, r4, %[n]\n\t"
  60035. "lsr r3, r3, r12\n\t"
  60036. "orr r5, r5, r3\n\t"
  60037. "ldr r6, [%[a], #188]\n\t"
  60038. "str r5, [%[r], #196]\n\t"
  60039. "lsr r3, r6, #1\n\t"
  60040. "lsl r6, r6, %[n]\n\t"
  60041. "lsr r3, r3, r12\n\t"
  60042. "orr r4, r4, r3\n\t"
  60043. "ldr r5, [%[a], #184]\n\t"
  60044. "str r4, [%[r], #192]\n\t"
  60045. "lsr r3, r5, #1\n\t"
  60046. "lsl r5, r5, %[n]\n\t"
  60047. "lsr r3, r3, r12\n\t"
  60048. "orr r6, r6, r3\n\t"
  60049. "ldr r4, [%[a], #180]\n\t"
  60050. "str r6, [%[r], #188]\n\t"
  60051. "lsr r3, r4, #1\n\t"
  60052. "lsl r4, r4, %[n]\n\t"
  60053. "lsr r3, r3, r12\n\t"
  60054. "orr r5, r5, r3\n\t"
  60055. "ldr r6, [%[a], #176]\n\t"
  60056. "str r5, [%[r], #184]\n\t"
  60057. "lsr r3, r6, #1\n\t"
  60058. "lsl r6, r6, %[n]\n\t"
  60059. "lsr r3, r3, r12\n\t"
  60060. "orr r4, r4, r3\n\t"
  60061. "ldr r5, [%[a], #172]\n\t"
  60062. "str r4, [%[r], #180]\n\t"
  60063. "lsr r3, r5, #1\n\t"
  60064. "lsl r5, r5, %[n]\n\t"
  60065. "lsr r3, r3, r12\n\t"
  60066. "orr r6, r6, r3\n\t"
  60067. "ldr r4, [%[a], #168]\n\t"
  60068. "str r6, [%[r], #176]\n\t"
  60069. "lsr r3, r4, #1\n\t"
  60070. "lsl r4, r4, %[n]\n\t"
  60071. "lsr r3, r3, r12\n\t"
  60072. "orr r5, r5, r3\n\t"
  60073. "ldr r6, [%[a], #164]\n\t"
  60074. "str r5, [%[r], #172]\n\t"
  60075. "lsr r3, r6, #1\n\t"
  60076. "lsl r6, r6, %[n]\n\t"
  60077. "lsr r3, r3, r12\n\t"
  60078. "orr r4, r4, r3\n\t"
  60079. "ldr r5, [%[a], #160]\n\t"
  60080. "str r4, [%[r], #168]\n\t"
  60081. "lsr r3, r5, #1\n\t"
  60082. "lsl r5, r5, %[n]\n\t"
  60083. "lsr r3, r3, r12\n\t"
  60084. "orr r6, r6, r3\n\t"
  60085. "ldr r4, [%[a], #156]\n\t"
  60086. "str r6, [%[r], #164]\n\t"
  60087. "lsr r3, r4, #1\n\t"
  60088. "lsl r4, r4, %[n]\n\t"
  60089. "lsr r3, r3, r12\n\t"
  60090. "orr r5, r5, r3\n\t"
  60091. "ldr r6, [%[a], #152]\n\t"
  60092. "str r5, [%[r], #160]\n\t"
  60093. "lsr r3, r6, #1\n\t"
  60094. "lsl r6, r6, %[n]\n\t"
  60095. "lsr r3, r3, r12\n\t"
  60096. "orr r4, r4, r3\n\t"
  60097. "ldr r5, [%[a], #148]\n\t"
  60098. "str r4, [%[r], #156]\n\t"
  60099. "lsr r3, r5, #1\n\t"
  60100. "lsl r5, r5, %[n]\n\t"
  60101. "lsr r3, r3, r12\n\t"
  60102. "orr r6, r6, r3\n\t"
  60103. "ldr r4, [%[a], #144]\n\t"
  60104. "str r6, [%[r], #152]\n\t"
  60105. "lsr r3, r4, #1\n\t"
  60106. "lsl r4, r4, %[n]\n\t"
  60107. "lsr r3, r3, r12\n\t"
  60108. "orr r5, r5, r3\n\t"
  60109. "ldr r6, [%[a], #140]\n\t"
  60110. "str r5, [%[r], #148]\n\t"
  60111. "lsr r3, r6, #1\n\t"
  60112. "lsl r6, r6, %[n]\n\t"
  60113. "lsr r3, r3, r12\n\t"
  60114. "orr r4, r4, r3\n\t"
  60115. "ldr r5, [%[a], #136]\n\t"
  60116. "str r4, [%[r], #144]\n\t"
  60117. "lsr r3, r5, #1\n\t"
  60118. "lsl r5, r5, %[n]\n\t"
  60119. "lsr r3, r3, r12\n\t"
  60120. "orr r6, r6, r3\n\t"
  60121. "ldr r4, [%[a], #132]\n\t"
  60122. "str r6, [%[r], #140]\n\t"
  60123. "lsr r3, r4, #1\n\t"
  60124. "lsl r4, r4, %[n]\n\t"
  60125. "lsr r3, r3, r12\n\t"
  60126. "orr r5, r5, r3\n\t"
  60127. "ldr r6, [%[a], #128]\n\t"
  60128. "str r5, [%[r], #136]\n\t"
  60129. "lsr r3, r6, #1\n\t"
  60130. "lsl r6, r6, %[n]\n\t"
  60131. "lsr r3, r3, r12\n\t"
  60132. "orr r4, r4, r3\n\t"
  60133. "ldr r5, [%[a], #124]\n\t"
  60134. "str r4, [%[r], #132]\n\t"
  60135. "lsr r3, r5, #1\n\t"
  60136. "lsl r5, r5, %[n]\n\t"
  60137. "lsr r3, r3, r12\n\t"
  60138. "orr r6, r6, r3\n\t"
  60139. "ldr r4, [%[a], #120]\n\t"
  60140. "str r6, [%[r], #128]\n\t"
  60141. "lsr r3, r4, #1\n\t"
  60142. "lsl r4, r4, %[n]\n\t"
  60143. "lsr r3, r3, r12\n\t"
  60144. "orr r5, r5, r3\n\t"
  60145. "ldr r6, [%[a], #116]\n\t"
  60146. "str r5, [%[r], #124]\n\t"
  60147. "lsr r3, r6, #1\n\t"
  60148. "lsl r6, r6, %[n]\n\t"
  60149. "lsr r3, r3, r12\n\t"
  60150. "orr r4, r4, r3\n\t"
  60151. "ldr r5, [%[a], #112]\n\t"
  60152. "str r4, [%[r], #120]\n\t"
  60153. "lsr r3, r5, #1\n\t"
  60154. "lsl r5, r5, %[n]\n\t"
  60155. "lsr r3, r3, r12\n\t"
  60156. "orr r6, r6, r3\n\t"
  60157. "ldr r4, [%[a], #108]\n\t"
  60158. "str r6, [%[r], #116]\n\t"
  60159. "lsr r3, r4, #1\n\t"
  60160. "lsl r4, r4, %[n]\n\t"
  60161. "lsr r3, r3, r12\n\t"
  60162. "orr r5, r5, r3\n\t"
  60163. "ldr r6, [%[a], #104]\n\t"
  60164. "str r5, [%[r], #112]\n\t"
  60165. "lsr r3, r6, #1\n\t"
  60166. "lsl r6, r6, %[n]\n\t"
  60167. "lsr r3, r3, r12\n\t"
  60168. "orr r4, r4, r3\n\t"
  60169. "ldr r5, [%[a], #100]\n\t"
  60170. "str r4, [%[r], #108]\n\t"
  60171. "lsr r3, r5, #1\n\t"
  60172. "lsl r5, r5, %[n]\n\t"
  60173. "lsr r3, r3, r12\n\t"
  60174. "orr r6, r6, r3\n\t"
  60175. "ldr r4, [%[a], #96]\n\t"
  60176. "str r6, [%[r], #104]\n\t"
  60177. "lsr r3, r4, #1\n\t"
  60178. "lsl r4, r4, %[n]\n\t"
  60179. "lsr r3, r3, r12\n\t"
  60180. "orr r5, r5, r3\n\t"
  60181. "ldr r6, [%[a], #92]\n\t"
  60182. "str r5, [%[r], #100]\n\t"
  60183. "lsr r3, r6, #1\n\t"
  60184. "lsl r6, r6, %[n]\n\t"
  60185. "lsr r3, r3, r12\n\t"
  60186. "orr r4, r4, r3\n\t"
  60187. "ldr r5, [%[a], #88]\n\t"
  60188. "str r4, [%[r], #96]\n\t"
  60189. "lsr r3, r5, #1\n\t"
  60190. "lsl r5, r5, %[n]\n\t"
  60191. "lsr r3, r3, r12\n\t"
  60192. "orr r6, r6, r3\n\t"
  60193. "ldr r4, [%[a], #84]\n\t"
  60194. "str r6, [%[r], #92]\n\t"
  60195. "lsr r3, r4, #1\n\t"
  60196. "lsl r4, r4, %[n]\n\t"
  60197. "lsr r3, r3, r12\n\t"
  60198. "orr r5, r5, r3\n\t"
  60199. "ldr r6, [%[a], #80]\n\t"
  60200. "str r5, [%[r], #88]\n\t"
  60201. "lsr r3, r6, #1\n\t"
  60202. "lsl r6, r6, %[n]\n\t"
  60203. "lsr r3, r3, r12\n\t"
  60204. "orr r4, r4, r3\n\t"
  60205. "ldr r5, [%[a], #76]\n\t"
  60206. "str r4, [%[r], #84]\n\t"
  60207. "lsr r3, r5, #1\n\t"
  60208. "lsl r5, r5, %[n]\n\t"
  60209. "lsr r3, r3, r12\n\t"
  60210. "orr r6, r6, r3\n\t"
  60211. "ldr r4, [%[a], #72]\n\t"
  60212. "str r6, [%[r], #80]\n\t"
  60213. "lsr r3, r4, #1\n\t"
  60214. "lsl r4, r4, %[n]\n\t"
  60215. "lsr r3, r3, r12\n\t"
  60216. "orr r5, r5, r3\n\t"
  60217. "ldr r6, [%[a], #68]\n\t"
  60218. "str r5, [%[r], #76]\n\t"
  60219. "lsr r3, r6, #1\n\t"
  60220. "lsl r6, r6, %[n]\n\t"
  60221. "lsr r3, r3, r12\n\t"
  60222. "orr r4, r4, r3\n\t"
  60223. "ldr r5, [%[a], #64]\n\t"
  60224. "str r4, [%[r], #72]\n\t"
  60225. "lsr r3, r5, #1\n\t"
  60226. "lsl r5, r5, %[n]\n\t"
  60227. "lsr r3, r3, r12\n\t"
  60228. "orr r6, r6, r3\n\t"
  60229. "ldr r4, [%[a], #60]\n\t"
  60230. "str r6, [%[r], #68]\n\t"
  60231. "lsr r3, r4, #1\n\t"
  60232. "lsl r4, r4, %[n]\n\t"
  60233. "lsr r3, r3, r12\n\t"
  60234. "orr r5, r5, r3\n\t"
  60235. "ldr r6, [%[a], #56]\n\t"
  60236. "str r5, [%[r], #64]\n\t"
  60237. "lsr r3, r6, #1\n\t"
  60238. "lsl r6, r6, %[n]\n\t"
  60239. "lsr r3, r3, r12\n\t"
  60240. "orr r4, r4, r3\n\t"
  60241. "ldr r5, [%[a], #52]\n\t"
  60242. "str r4, [%[r], #60]\n\t"
  60243. "lsr r3, r5, #1\n\t"
  60244. "lsl r5, r5, %[n]\n\t"
  60245. "lsr r3, r3, r12\n\t"
  60246. "orr r6, r6, r3\n\t"
  60247. "ldr r4, [%[a], #48]\n\t"
  60248. "str r6, [%[r], #56]\n\t"
  60249. "lsr r3, r4, #1\n\t"
  60250. "lsl r4, r4, %[n]\n\t"
  60251. "lsr r3, r3, r12\n\t"
  60252. "orr r5, r5, r3\n\t"
  60253. "ldr r6, [%[a], #44]\n\t"
  60254. "str r5, [%[r], #52]\n\t"
  60255. "lsr r3, r6, #1\n\t"
  60256. "lsl r6, r6, %[n]\n\t"
  60257. "lsr r3, r3, r12\n\t"
  60258. "orr r4, r4, r3\n\t"
  60259. "ldr r5, [%[a], #40]\n\t"
  60260. "str r4, [%[r], #48]\n\t"
  60261. "lsr r3, r5, #1\n\t"
  60262. "lsl r5, r5, %[n]\n\t"
  60263. "lsr r3, r3, r12\n\t"
  60264. "orr r6, r6, r3\n\t"
  60265. "ldr r4, [%[a], #36]\n\t"
  60266. "str r6, [%[r], #44]\n\t"
  60267. "lsr r3, r4, #1\n\t"
  60268. "lsl r4, r4, %[n]\n\t"
  60269. "lsr r3, r3, r12\n\t"
  60270. "orr r5, r5, r3\n\t"
  60271. "ldr r6, [%[a], #32]\n\t"
  60272. "str r5, [%[r], #40]\n\t"
  60273. "lsr r3, r6, #1\n\t"
  60274. "lsl r6, r6, %[n]\n\t"
  60275. "lsr r3, r3, r12\n\t"
  60276. "orr r4, r4, r3\n\t"
  60277. "ldr r5, [%[a], #28]\n\t"
  60278. "str r4, [%[r], #36]\n\t"
  60279. "lsr r3, r5, #1\n\t"
  60280. "lsl r5, r5, %[n]\n\t"
  60281. "lsr r3, r3, r12\n\t"
  60282. "orr r6, r6, r3\n\t"
  60283. "ldr r4, [%[a], #24]\n\t"
  60284. "str r6, [%[r], #32]\n\t"
  60285. "lsr r3, r4, #1\n\t"
  60286. "lsl r4, r4, %[n]\n\t"
  60287. "lsr r3, r3, r12\n\t"
  60288. "orr r5, r5, r3\n\t"
  60289. "ldr r6, [%[a], #20]\n\t"
  60290. "str r5, [%[r], #28]\n\t"
  60291. "lsr r3, r6, #1\n\t"
  60292. "lsl r6, r6, %[n]\n\t"
  60293. "lsr r3, r3, r12\n\t"
  60294. "orr r4, r4, r3\n\t"
  60295. "ldr r5, [%[a], #16]\n\t"
  60296. "str r4, [%[r], #24]\n\t"
  60297. "lsr r3, r5, #1\n\t"
  60298. "lsl r5, r5, %[n]\n\t"
  60299. "lsr r3, r3, r12\n\t"
  60300. "orr r6, r6, r3\n\t"
  60301. "ldr r4, [%[a], #12]\n\t"
  60302. "str r6, [%[r], #20]\n\t"
  60303. "lsr r3, r4, #1\n\t"
  60304. "lsl r4, r4, %[n]\n\t"
  60305. "lsr r3, r3, r12\n\t"
  60306. "orr r5, r5, r3\n\t"
  60307. "ldr r6, [%[a], #8]\n\t"
  60308. "str r5, [%[r], #16]\n\t"
  60309. "lsr r3, r6, #1\n\t"
  60310. "lsl r6, r6, %[n]\n\t"
  60311. "lsr r3, r3, r12\n\t"
  60312. "orr r4, r4, r3\n\t"
  60313. "ldr r5, [%[a], #4]\n\t"
  60314. "str r4, [%[r], #12]\n\t"
  60315. "lsr r3, r5, #1\n\t"
  60316. "lsl r5, r5, %[n]\n\t"
  60317. "lsr r3, r3, r12\n\t"
  60318. "orr r6, r6, r3\n\t"
  60319. "ldr r4, [%[a]]\n\t"
  60320. "str r6, [%[r], #8]\n\t"
  60321. "lsr r3, r4, #1\n\t"
  60322. "lsl r4, r4, %[n]\n\t"
  60323. "lsr r3, r3, r12\n\t"
  60324. "orr r5, r5, r3\n\t"
  60325. "str r4, [%[r]]\n\t"
  60326. "str r5, [%[r], #4]\n\t"
  60327. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  60328. :
  60329. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  60330. );
  60331. }
  60332. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  60333. *
  60334. * r A single precision number that is the result of the operation.
  60335. * e A single precision number that is the exponent.
  60336. * bits The number of bits in the exponent.
  60337. * m A single precision number that is the modulus.
  60338. * returns 0 on success.
  60339. * returns MEMORY_E on dynamic memory allocation failure.
  60340. * returns MP_VAL when base is even.
  60341. */
  60342. static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits,
  60343. const sp_digit* m)
  60344. {
  60345. #ifdef WOLFSSL_SP_SMALL_STACK
  60346. sp_digit* td = NULL;
  60347. #else
  60348. sp_digit td[385];
  60349. #endif
  60350. sp_digit* norm = NULL;
  60351. sp_digit* tmp = NULL;
  60352. sp_digit mp = 1;
  60353. sp_digit n;
  60354. sp_digit o;
  60355. sp_digit mask;
  60356. int i;
  60357. int c;
  60358. byte y;
  60359. int err = MP_OKAY;
  60360. if (bits == 0) {
  60361. err = MP_VAL;
  60362. }
  60363. #ifdef WOLFSSL_SP_SMALL_STACK
  60364. if (err == MP_OKAY) {
  60365. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 385, NULL,
  60366. DYNAMIC_TYPE_TMP_BUFFER);
  60367. if (td == NULL)
  60368. err = MEMORY_E;
  60369. }
  60370. #endif
  60371. if (err == MP_OKAY) {
  60372. norm = td;
  60373. tmp = td + 256;
  60374. sp_4096_mont_setup(m, &mp);
  60375. sp_4096_mont_norm_128(norm, m);
  60376. i = (bits - 1) / 32;
  60377. n = e[i--];
  60378. c = bits & 31;
  60379. if (c == 0) {
  60380. c = 32;
  60381. }
  60382. c -= bits % 5;
  60383. if (c == 32) {
  60384. c = 27;
  60385. }
  60386. if (c < 0) {
  60387. /* Number of bits in top word is less than number needed. */
  60388. c = -c;
  60389. y = (byte)(n << c);
  60390. n = e[i--];
  60391. y |= (byte)(n >> (64 - c));
  60392. n <<= c;
  60393. c = 64 - c;
  60394. }
  60395. else if (c == 0) {
  60396. /* All bits in top word used. */
  60397. y = (byte)n;
  60398. }
  60399. else {
  60400. y = (byte)(n >> c);
  60401. n <<= 32 - c;
  60402. }
  60403. sp_4096_lshift_128(r, norm, y);
  60404. for (; i>=0 || c>=5; ) {
  60405. if (c == 0) {
  60406. n = e[i--];
  60407. y = (byte)(n >> 27);
  60408. n <<= 5;
  60409. c = 27;
  60410. }
  60411. else if (c < 5) {
  60412. y = (byte)(n >> 27);
  60413. n = e[i--];
  60414. c = 5 - c;
  60415. y |= (byte)(n >> (32 - c));
  60416. n <<= c;
  60417. c = 32 - c;
  60418. }
  60419. else {
  60420. y = (byte)((n >> 27) & 0x1f);
  60421. n <<= 5;
  60422. c -= 5;
  60423. }
  60424. sp_4096_mont_sqr_128(r, r, m, mp);
  60425. sp_4096_mont_sqr_128(r, r, m, mp);
  60426. sp_4096_mont_sqr_128(r, r, m, mp);
  60427. sp_4096_mont_sqr_128(r, r, m, mp);
  60428. sp_4096_mont_sqr_128(r, r, m, mp);
  60429. sp_4096_lshift_128(r, r, y);
  60430. sp_4096_mul_d_128(tmp, norm, r[128]);
  60431. r[128] = 0;
  60432. o = sp_4096_add_128(r, r, tmp);
  60433. sp_4096_cond_sub_128(r, r, m, (sp_digit)0 - o);
  60434. }
  60435. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  60436. sp_4096_mont_reduce_128(r, m, mp);
  60437. mask = (sp_digit)0 - (sp_4096_cmp_128(r, m) >= 0);
  60438. sp_4096_cond_sub_128(r, r, m, mask);
  60439. }
  60440. #ifdef WOLFSSL_SP_SMALL_STACK
  60441. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  60442. #endif
  60443. return err;
  60444. }
  60445. #endif /* HAVE_FFDHE_4096 */
  60446. /* Perform the modular exponentiation for Diffie-Hellman.
  60447. *
  60448. * base Base.
  60449. * exp Array of bytes that is the exponent.
  60450. * expLen Length of data, in bytes, in exponent.
  60451. * mod Modulus.
  60452. * out Buffer to hold big-endian bytes of exponentiation result.
  60453. * Must be at least 512 bytes long.
  60454. * outLen Length, in bytes, of exponentiation result.
  60455. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  60456. * and MEMORY_E if memory allocation fails.
  60457. */
  60458. int sp_DhExp_4096(const mp_int* base, const byte* exp, word32 expLen,
  60459. const mp_int* mod, byte* out, word32* outLen)
  60460. {
  60461. int err = MP_OKAY;
  60462. sp_digit b[256];
  60463. sp_digit e[128];
  60464. sp_digit m[128];
  60465. sp_digit* r = b;
  60466. word32 i;
  60467. if (mp_count_bits(base) > 4096) {
  60468. err = MP_READ_E;
  60469. }
  60470. else if (expLen > 512) {
  60471. err = MP_READ_E;
  60472. }
  60473. else if (mp_count_bits(mod) != 4096) {
  60474. err = MP_READ_E;
  60475. }
  60476. else if (mp_iseven(mod)) {
  60477. err = MP_VAL;
  60478. }
  60479. if (err == MP_OKAY) {
  60480. sp_4096_from_mp(b, 128, base);
  60481. sp_4096_from_bin(e, 128, exp, expLen);
  60482. sp_4096_from_mp(m, 128, mod);
  60483. #ifdef HAVE_FFDHE_4096
  60484. if (base->used == 1 && base->dp[0] == 2 && m[127] == (sp_digit)-1)
  60485. err = sp_4096_mod_exp_2_128(r, e, expLen * 8, m);
  60486. else
  60487. #endif
  60488. err = sp_4096_mod_exp_128(r, b, e, expLen * 8, m, 0);
  60489. }
  60490. if (err == MP_OKAY) {
  60491. sp_4096_to_bin_128(r, out);
  60492. *outLen = 512;
  60493. for (i=0; i<512 && out[i] == 0; i++) {
  60494. /* Search for first non-zero. */
  60495. }
  60496. *outLen -= i;
  60497. XMEMMOVE(out, out + i, *outLen);
  60498. }
  60499. XMEMSET(e, 0, sizeof(e));
  60500. return err;
  60501. }
  60502. #endif /* WOLFSSL_HAVE_SP_DH */
  60503. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  60504. #endif /* WOLFSSL_SP_4096 */
  60505. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH */
  60506. #ifdef WOLFSSL_HAVE_SP_ECC
  60507. #ifndef WOLFSSL_SP_NO_256
  60508. /* Point structure to use. */
  60509. typedef struct sp_point_256 {
  60510. /* X ordinate of point. */
  60511. sp_digit x[2 * 8];
  60512. /* Y ordinate of point. */
  60513. sp_digit y[2 * 8];
  60514. /* Z ordinate of point. */
  60515. sp_digit z[2 * 8];
  60516. /* Indicates point is at infinity. */
  60517. int infinity;
  60518. } sp_point_256;
  60519. /* The modulus (prime) of the curve P256. */
  60520. static const sp_digit p256_mod[8] = {
  60521. 0xffffffff,0xffffffff,0xffffffff,0x00000000,0x00000000,0x00000000,
  60522. 0x00000001,0xffffffff
  60523. };
  60524. /* The Montgomery normalizer for modulus of the curve P256. */
  60525. static const sp_digit p256_norm_mod[8] = {
  60526. 0x00000001,0x00000000,0x00000000,0xffffffff,0xffffffff,0xffffffff,
  60527. 0xfffffffe,0x00000000
  60528. };
  60529. /* The Montgomery multiplier for modulus of the curve P256. */
  60530. static const sp_digit p256_mp_mod = 0x00000001;
  60531. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  60532. defined(HAVE_ECC_VERIFY)
  60533. /* The order of the curve P256. */
  60534. static const sp_digit p256_order[8] = {
  60535. 0xfc632551,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  60536. 0x00000000,0xffffffff
  60537. };
  60538. #endif
  60539. /* The order of the curve P256 minus 2. */
  60540. static const sp_digit p256_order2[8] = {
  60541. 0xfc63254f,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  60542. 0x00000000,0xffffffff
  60543. };
  60544. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  60545. /* The Montgomery normalizer for order of the curve P256. */
  60546. static const sp_digit p256_norm_order[8] = {
  60547. 0x039cdaaf,0x0c46353d,0x58e8617b,0x43190552,0x00000000,0x00000000,
  60548. 0xffffffff,0x00000000
  60549. };
  60550. #endif
  60551. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  60552. /* The Montgomery multiplier for order of the curve P256. */
  60553. static const sp_digit p256_mp_order = 0xee00bc4f;
  60554. #endif
  60555. /* The base point of curve P256. */
  60556. static const sp_point_256 p256_base = {
  60557. /* X ordinate */
  60558. {
  60559. 0xd898c296,0xf4a13945,0x2deb33a0,0x77037d81,0x63a440f2,0xf8bce6e5,
  60560. 0xe12c4247,0x6b17d1f2,
  60561. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  60562. (sp_digit)0, (sp_digit)0, (sp_digit)0
  60563. },
  60564. /* Y ordinate */
  60565. {
  60566. 0x37bf51f5,0xcbb64068,0x6b315ece,0x2bce3357,0x7c0f9e16,0x8ee7eb4a,
  60567. 0xfe1a7f9b,0x4fe342e2,
  60568. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  60569. (sp_digit)0, (sp_digit)0, (sp_digit)0
  60570. },
  60571. /* Z ordinate */
  60572. {
  60573. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  60574. 0x00000000,0x00000000,
  60575. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  60576. (sp_digit)0, (sp_digit)0, (sp_digit)0
  60577. },
  60578. /* infinity */
  60579. 0
  60580. };
  60581. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  60582. static const sp_digit p256_b[8] = {
  60583. 0x27d2604b,0x3bce3c3e,0xcc53b0f6,0x651d06b0,0x769886bc,0xb3ebbd55,
  60584. 0xaa3a93e7,0x5ac635d8
  60585. };
  60586. #endif
  60587. #ifdef WOLFSSL_SP_SMALL
  60588. /* Multiply a and b into r. (r = a * b)
  60589. *
  60590. * r A single precision integer.
  60591. * a A single precision integer.
  60592. * b A single precision integer.
  60593. */
  60594. static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  60595. {
  60596. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  60597. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  60598. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  60599. __asm__ __volatile__ (
  60600. "sub sp, sp, #0x40\n\t"
  60601. "ldr lr, [%[a]]\n\t"
  60602. "ldr r11, [%[b]]\n\t"
  60603. "umull r8, r6, lr, r11\n\t"
  60604. "str r8, [sp]\n\t"
  60605. "mov r7, #0\n\t"
  60606. "mov r8, #0\n\t"
  60607. "mov r5, #4\n\t"
  60608. "\n"
  60609. "L_sp_256_mul_8_outer_%=: \n\t"
  60610. "subs r3, r5, #28\n\t"
  60611. "it cc\n\t"
  60612. "movcc r3, #0\n\t"
  60613. "sub r4, r5, r3\n\t"
  60614. "\n"
  60615. "L_sp_256_mul_8_inner_%=: \n\t"
  60616. "ldr lr, [%[a], r3]\n\t"
  60617. "ldr r11, [%[b], r4]\n\t"
  60618. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  60619. "lsl r9, lr, #16\n\t"
  60620. "lsl r10, r11, #16\n\t"
  60621. "lsr r9, r9, #16\n\t"
  60622. "lsr r10, r10, #16\n\t"
  60623. "mul r10, r9, r10\n\t"
  60624. "adds r6, r6, r10\n\t"
  60625. "adcs r7, r7, #0\n\t"
  60626. "adc r8, r8, #0\n\t"
  60627. "lsr r10, r11, #16\n\t"
  60628. "mul r9, r10, r9\n\t"
  60629. "lsr r10, r9, #16\n\t"
  60630. "lsl r9, r9, #16\n\t"
  60631. "adds r6, r6, r9\n\t"
  60632. "adcs r7, r7, r10\n\t"
  60633. "adc r8, r8, #0\n\t"
  60634. "lsr r9, lr, #16\n\t"
  60635. "lsr r10, r11, #16\n\t"
  60636. "mul r10, r9, r10\n\t"
  60637. "adds r7, r7, r10\n\t"
  60638. "adc r8, r8, #0\n\t"
  60639. "lsl r10, r11, #16\n\t"
  60640. "lsr r10, r10, #16\n\t"
  60641. "mul r9, r10, r9\n\t"
  60642. "lsr r10, r9, #16\n\t"
  60643. "lsl r9, r9, #16\n\t"
  60644. "adds r6, r6, r9\n\t"
  60645. "adcs r7, r7, r10\n\t"
  60646. "adc r8, r8, #0\n\t"
  60647. #else
  60648. "umull r9, r10, lr, r11\n\t"
  60649. "adds r6, r6, r9\n\t"
  60650. "adcs r7, r7, r10\n\t"
  60651. "adc r8, r8, #0\n\t"
  60652. #endif
  60653. "ldr lr, [%[a], r4]\n\t"
  60654. "ldr r11, [%[b], r3]\n\t"
  60655. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  60656. "lsl r9, lr, #16\n\t"
  60657. "lsl r10, r11, #16\n\t"
  60658. "lsr r9, r9, #16\n\t"
  60659. "lsr r10, r10, #16\n\t"
  60660. "mul r10, r9, r10\n\t"
  60661. "adds r6, r6, r10\n\t"
  60662. "adcs r7, r7, #0\n\t"
  60663. "adc r8, r8, #0\n\t"
  60664. "lsr r10, r11, #16\n\t"
  60665. "mul r9, r10, r9\n\t"
  60666. "lsr r10, r9, #16\n\t"
  60667. "lsl r9, r9, #16\n\t"
  60668. "adds r6, r6, r9\n\t"
  60669. "adcs r7, r7, r10\n\t"
  60670. "adc r8, r8, #0\n\t"
  60671. "lsr r9, lr, #16\n\t"
  60672. "lsr r10, r11, #16\n\t"
  60673. "mul r10, r9, r10\n\t"
  60674. "adds r7, r7, r10\n\t"
  60675. "adc r8, r8, #0\n\t"
  60676. "lsl r10, r11, #16\n\t"
  60677. "lsr r10, r10, #16\n\t"
  60678. "mul r9, r10, r9\n\t"
  60679. "lsr r10, r9, #16\n\t"
  60680. "lsl r9, r9, #16\n\t"
  60681. "adds r6, r6, r9\n\t"
  60682. "adcs r7, r7, r10\n\t"
  60683. "adc r8, r8, #0\n\t"
  60684. #else
  60685. "umull r9, r10, lr, r11\n\t"
  60686. "adds r6, r6, r9\n\t"
  60687. "adcs r7, r7, r10\n\t"
  60688. "adc r8, r8, #0\n\t"
  60689. #endif
  60690. "add r3, r3, #4\n\t"
  60691. "sub r4, r4, #4\n\t"
  60692. "cmp r3, r4\n\t"
  60693. "bgt L_sp_256_mul_8_inner_done_%=\n\t"
  60694. "blt L_sp_256_mul_8_inner_%=\n\t"
  60695. "ldr lr, [%[a], r3]\n\t"
  60696. "ldr r11, [%[b], r3]\n\t"
  60697. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  60698. "lsl r9, lr, #16\n\t"
  60699. "lsl r10, r11, #16\n\t"
  60700. "lsr r9, r9, #16\n\t"
  60701. "lsr r10, r10, #16\n\t"
  60702. "mul r10, r9, r10\n\t"
  60703. "adds r6, r6, r10\n\t"
  60704. "adcs r7, r7, #0\n\t"
  60705. "adc r8, r8, #0\n\t"
  60706. "lsr r10, r11, #16\n\t"
  60707. "mul r9, r10, r9\n\t"
  60708. "lsr r10, r9, #16\n\t"
  60709. "lsl r9, r9, #16\n\t"
  60710. "adds r6, r6, r9\n\t"
  60711. "adcs r7, r7, r10\n\t"
  60712. "adc r8, r8, #0\n\t"
  60713. "lsr r9, lr, #16\n\t"
  60714. "lsr r10, r11, #16\n\t"
  60715. "mul r10, r9, r10\n\t"
  60716. "adds r7, r7, r10\n\t"
  60717. "adc r8, r8, #0\n\t"
  60718. "lsl r10, r11, #16\n\t"
  60719. "lsr r10, r10, #16\n\t"
  60720. "mul r9, r10, r9\n\t"
  60721. "lsr r10, r9, #16\n\t"
  60722. "lsl r9, r9, #16\n\t"
  60723. "adds r6, r6, r9\n\t"
  60724. "adcs r7, r7, r10\n\t"
  60725. "adc r8, r8, #0\n\t"
  60726. #else
  60727. "umull r9, r10, lr, r11\n\t"
  60728. "adds r6, r6, r9\n\t"
  60729. "adcs r7, r7, r10\n\t"
  60730. "adc r8, r8, #0\n\t"
  60731. #endif
  60732. "\n"
  60733. "L_sp_256_mul_8_inner_done_%=: \n\t"
  60734. "str r6, [sp, r5]\n\t"
  60735. "mov r6, r7\n\t"
  60736. "mov r7, r8\n\t"
  60737. "mov r8, #0\n\t"
  60738. "add r5, r5, #4\n\t"
  60739. "cmp r5, #52\n\t"
  60740. "ble L_sp_256_mul_8_outer_%=\n\t"
  60741. "ldr lr, [%[a], #28]\n\t"
  60742. "ldr r11, [%[b], #28]\n\t"
  60743. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  60744. "lsl r9, lr, #16\n\t"
  60745. "lsl r10, r11, #16\n\t"
  60746. "lsr r9, r9, #16\n\t"
  60747. "lsr r10, r10, #16\n\t"
  60748. "mul r10, r9, r10\n\t"
  60749. "adds r6, r6, r10\n\t"
  60750. "adc r7, r7, #0\n\t"
  60751. "lsr r10, r11, #16\n\t"
  60752. "mul r9, r10, r9\n\t"
  60753. "lsr r10, r9, #16\n\t"
  60754. "lsl r9, r9, #16\n\t"
  60755. "adds r6, r6, r9\n\t"
  60756. "adc r7, r7, r10\n\t"
  60757. "lsr r9, lr, #16\n\t"
  60758. "lsr r10, r11, #16\n\t"
  60759. "mul r10, r9, r10\n\t"
  60760. "add r7, r7, r10\n\t"
  60761. "lsl r10, r11, #16\n\t"
  60762. "lsr r10, r10, #16\n\t"
  60763. "mul r9, r10, r9\n\t"
  60764. "lsr r10, r9, #16\n\t"
  60765. "lsl r9, r9, #16\n\t"
  60766. "adds r6, r6, r9\n\t"
  60767. "adc r7, r7, r10\n\t"
  60768. #else
  60769. "umlal r6, r7, lr, r11\n\t"
  60770. #endif
  60771. "str r6, [sp, r5]\n\t"
  60772. "add r5, r5, #4\n\t"
  60773. "str r7, [sp, r5]\n\t"
  60774. "\n"
  60775. "L_sp_256_mul_8_store_%=: \n\t"
  60776. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  60777. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  60778. "subs r5, r5, #32\n\t"
  60779. "bgt L_sp_256_mul_8_store_%=\n\t"
  60780. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  60781. :
  60782. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  60783. );
  60784. }
  60785. #else
  60786. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  60787. /* Multiply a and b into r. (r = a * b)
  60788. *
  60789. * r A single precision integer.
  60790. * a A single precision integer.
  60791. * b A single precision integer.
  60792. */
  60793. static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  60794. {
  60795. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  60796. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  60797. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  60798. __asm__ __volatile__ (
  60799. "sub sp, sp, #32\n\t"
  60800. /* A[0] * B[0] */
  60801. "ldr r11, [%[a]]\n\t"
  60802. "ldr r12, [%[b]]\n\t"
  60803. "lsl r6, r11, #16\n\t"
  60804. "lsl r3, r12, #16\n\t"
  60805. "lsr r6, r6, #16\n\t"
  60806. "lsr r3, r3, #16\n\t"
  60807. "mul r3, r6, r3\n\t"
  60808. "lsr r7, r12, #16\n\t"
  60809. "mul r6, r7, r6\n\t"
  60810. "lsr r4, r6, #16\n\t"
  60811. "lsl r6, r6, #16\n\t"
  60812. "adds r3, r3, r6\n\t"
  60813. "adc r4, r4, #0\n\t"
  60814. "lsr r6, r11, #16\n\t"
  60815. "mul r7, r6, r7\n\t"
  60816. "add r4, r4, r7\n\t"
  60817. "lsl r7, r12, #16\n\t"
  60818. "lsr r7, r7, #16\n\t"
  60819. "mul r6, r7, r6\n\t"
  60820. "lsr r7, r6, #16\n\t"
  60821. "lsl r6, r6, #16\n\t"
  60822. "adds r3, r3, r6\n\t"
  60823. "adc r4, r4, r7\n\t"
  60824. "mov r5, #0\n\t"
  60825. "str r3, [sp]\n\t"
  60826. /* A[0] * B[1] */
  60827. "ldr r9, [%[b], #4]\n\t"
  60828. "lsl r6, r11, #16\n\t"
  60829. "lsl r7, r9, #16\n\t"
  60830. "lsr r6, r6, #16\n\t"
  60831. "lsr r7, r7, #16\n\t"
  60832. "mul r7, r6, r7\n\t"
  60833. "adds r4, r4, r7\n\t"
  60834. "adcs r5, r5, #0\n\t"
  60835. "mov r3, #0\n\t"
  60836. "adc r3, r3, #0\n\t"
  60837. "lsr r7, r9, #16\n\t"
  60838. "mul r6, r7, r6\n\t"
  60839. "lsr r7, r6, #16\n\t"
  60840. "lsl r6, r6, #16\n\t"
  60841. "adds r4, r4, r6\n\t"
  60842. "adcs r5, r5, r7\n\t"
  60843. "adc r3, r3, #0\n\t"
  60844. "lsr r6, r11, #16\n\t"
  60845. "lsr r7, r9, #16\n\t"
  60846. "mul r7, r6, r7\n\t"
  60847. "adds r5, r5, r7\n\t"
  60848. "adc r3, r3, #0\n\t"
  60849. "lsl r7, r9, #16\n\t"
  60850. "lsr r7, r7, #16\n\t"
  60851. "mul r6, r7, r6\n\t"
  60852. "lsr r7, r6, #16\n\t"
  60853. "lsl r6, r6, #16\n\t"
  60854. "adds r4, r4, r6\n\t"
  60855. "adcs r5, r5, r7\n\t"
  60856. "adc r3, r3, #0\n\t"
  60857. /* A[1] * B[0] */
  60858. "ldr r8, [%[a], #4]\n\t"
  60859. "lsl r6, r8, #16\n\t"
  60860. "lsl r7, r12, #16\n\t"
  60861. "lsr r6, r6, #16\n\t"
  60862. "lsr r7, r7, #16\n\t"
  60863. "mul r7, r6, r7\n\t"
  60864. "adds r4, r4, r7\n\t"
  60865. "adcs r5, r5, #0\n\t"
  60866. "adc r3, r3, #0\n\t"
  60867. "lsr r7, r12, #16\n\t"
  60868. "mul r6, r7, r6\n\t"
  60869. "lsr r7, r6, #16\n\t"
  60870. "lsl r6, r6, #16\n\t"
  60871. "adds r4, r4, r6\n\t"
  60872. "adcs r5, r5, r7\n\t"
  60873. "adc r3, r3, #0\n\t"
  60874. "lsr r6, r8, #16\n\t"
  60875. "lsr r7, r12, #16\n\t"
  60876. "mul r7, r6, r7\n\t"
  60877. "adds r5, r5, r7\n\t"
  60878. "adc r3, r3, #0\n\t"
  60879. "lsl r7, r12, #16\n\t"
  60880. "lsr r7, r7, #16\n\t"
  60881. "mul r6, r7, r6\n\t"
  60882. "lsr r7, r6, #16\n\t"
  60883. "lsl r6, r6, #16\n\t"
  60884. "adds r4, r4, r6\n\t"
  60885. "adcs r5, r5, r7\n\t"
  60886. "adc r3, r3, #0\n\t"
  60887. "str r4, [sp, #4]\n\t"
  60888. /* A[2] * B[0] */
  60889. "ldr r8, [%[a], #8]\n\t"
  60890. "lsl r6, r8, #16\n\t"
  60891. "lsl r7, r12, #16\n\t"
  60892. "lsr r6, r6, #16\n\t"
  60893. "lsr r7, r7, #16\n\t"
  60894. "mul r7, r6, r7\n\t"
  60895. "adds r5, r5, r7\n\t"
  60896. "adcs r3, r3, #0\n\t"
  60897. "mov r4, #0\n\t"
  60898. "adc r4, r4, #0\n\t"
  60899. "lsr r7, r12, #16\n\t"
  60900. "mul r6, r7, r6\n\t"
  60901. "lsr r7, r6, #16\n\t"
  60902. "lsl r6, r6, #16\n\t"
  60903. "adds r5, r5, r6\n\t"
  60904. "adcs r3, r3, r7\n\t"
  60905. "adc r4, r4, #0\n\t"
  60906. "lsr r6, r8, #16\n\t"
  60907. "lsr r7, r12, #16\n\t"
  60908. "mul r7, r6, r7\n\t"
  60909. "adds r3, r3, r7\n\t"
  60910. "adc r4, r4, #0\n\t"
  60911. "lsl r7, r12, #16\n\t"
  60912. "lsr r7, r7, #16\n\t"
  60913. "mul r6, r7, r6\n\t"
  60914. "lsr r7, r6, #16\n\t"
  60915. "lsl r6, r6, #16\n\t"
  60916. "adds r5, r5, r6\n\t"
  60917. "adcs r3, r3, r7\n\t"
  60918. "adc r4, r4, #0\n\t"
  60919. /* A[1] * B[1] */
  60920. "ldr r11, [%[a], #4]\n\t"
  60921. "ldr r12, [%[b], #4]\n\t"
  60922. "lsl r6, r11, #16\n\t"
  60923. "lsl r7, r12, #16\n\t"
  60924. "lsr r6, r6, #16\n\t"
  60925. "lsr r7, r7, #16\n\t"
  60926. "mul r7, r6, r7\n\t"
  60927. "adds r5, r5, r7\n\t"
  60928. "adcs r3, r3, #0\n\t"
  60929. "adc r4, r4, #0\n\t"
  60930. "lsr r7, r12, #16\n\t"
  60931. "mul r6, r7, r6\n\t"
  60932. "lsr r7, r6, #16\n\t"
  60933. "lsl r6, r6, #16\n\t"
  60934. "adds r5, r5, r6\n\t"
  60935. "adcs r3, r3, r7\n\t"
  60936. "adc r4, r4, #0\n\t"
  60937. "lsr r6, r11, #16\n\t"
  60938. "lsr r7, r12, #16\n\t"
  60939. "mul r7, r6, r7\n\t"
  60940. "adds r3, r3, r7\n\t"
  60941. "adc r4, r4, #0\n\t"
  60942. "lsl r7, r12, #16\n\t"
  60943. "lsr r7, r7, #16\n\t"
  60944. "mul r6, r7, r6\n\t"
  60945. "lsr r7, r6, #16\n\t"
  60946. "lsl r6, r6, #16\n\t"
  60947. "adds r5, r5, r6\n\t"
  60948. "adcs r3, r3, r7\n\t"
  60949. "adc r4, r4, #0\n\t"
  60950. /* A[0] * B[2] */
  60951. "ldr r8, [%[a]]\n\t"
  60952. "ldr r9, [%[b], #8]\n\t"
  60953. "lsl r6, r8, #16\n\t"
  60954. "lsl r7, r9, #16\n\t"
  60955. "lsr r6, r6, #16\n\t"
  60956. "lsr r7, r7, #16\n\t"
  60957. "mul r7, r6, r7\n\t"
  60958. "adds r5, r5, r7\n\t"
  60959. "adcs r3, r3, #0\n\t"
  60960. "adc r4, r4, #0\n\t"
  60961. "lsr r7, r9, #16\n\t"
  60962. "mul r6, r7, r6\n\t"
  60963. "lsr r7, r6, #16\n\t"
  60964. "lsl r6, r6, #16\n\t"
  60965. "adds r5, r5, r6\n\t"
  60966. "adcs r3, r3, r7\n\t"
  60967. "adc r4, r4, #0\n\t"
  60968. "lsr r6, r8, #16\n\t"
  60969. "lsr r7, r9, #16\n\t"
  60970. "mul r7, r6, r7\n\t"
  60971. "adds r3, r3, r7\n\t"
  60972. "adc r4, r4, #0\n\t"
  60973. "lsl r7, r9, #16\n\t"
  60974. "lsr r7, r7, #16\n\t"
  60975. "mul r6, r7, r6\n\t"
  60976. "lsr r7, r6, #16\n\t"
  60977. "lsl r6, r6, #16\n\t"
  60978. "adds r5, r5, r6\n\t"
  60979. "adcs r3, r3, r7\n\t"
  60980. "adc r4, r4, #0\n\t"
  60981. "str r5, [sp, #8]\n\t"
  60982. /* A[0] * B[3] */
  60983. "ldr r9, [%[b], #12]\n\t"
  60984. "lsl r6, r8, #16\n\t"
  60985. "lsl r7, r9, #16\n\t"
  60986. "lsr r6, r6, #16\n\t"
  60987. "lsr r7, r7, #16\n\t"
  60988. "mul r7, r6, r7\n\t"
  60989. "adds r3, r3, r7\n\t"
  60990. "adcs r4, r4, #0\n\t"
  60991. "mov r5, #0\n\t"
  60992. "adc r5, r5, #0\n\t"
  60993. "lsr r7, r9, #16\n\t"
  60994. "mul r6, r7, r6\n\t"
  60995. "lsr r7, r6, #16\n\t"
  60996. "lsl r6, r6, #16\n\t"
  60997. "adds r3, r3, r6\n\t"
  60998. "adcs r4, r4, r7\n\t"
  60999. "adc r5, r5, #0\n\t"
  61000. "lsr r6, r8, #16\n\t"
  61001. "lsr r7, r9, #16\n\t"
  61002. "mul r7, r6, r7\n\t"
  61003. "adds r4, r4, r7\n\t"
  61004. "adc r5, r5, #0\n\t"
  61005. "lsl r7, r9, #16\n\t"
  61006. "lsr r7, r7, #16\n\t"
  61007. "mul r6, r7, r6\n\t"
  61008. "lsr r7, r6, #16\n\t"
  61009. "lsl r6, r6, #16\n\t"
  61010. "adds r3, r3, r6\n\t"
  61011. "adcs r4, r4, r7\n\t"
  61012. "adc r5, r5, #0\n\t"
  61013. /* A[1] * B[2] */
  61014. "ldr r9, [%[b], #8]\n\t"
  61015. "lsl r6, r11, #16\n\t"
  61016. "lsl r7, r9, #16\n\t"
  61017. "lsr r6, r6, #16\n\t"
  61018. "lsr r7, r7, #16\n\t"
  61019. "mul r7, r6, r7\n\t"
  61020. "adds r3, r3, r7\n\t"
  61021. "adcs r4, r4, #0\n\t"
  61022. "adc r5, r5, #0\n\t"
  61023. "lsr r7, r9, #16\n\t"
  61024. "mul r6, r7, r6\n\t"
  61025. "lsr r7, r6, #16\n\t"
  61026. "lsl r6, r6, #16\n\t"
  61027. "adds r3, r3, r6\n\t"
  61028. "adcs r4, r4, r7\n\t"
  61029. "adc r5, r5, #0\n\t"
  61030. "lsr r6, r11, #16\n\t"
  61031. "lsr r7, r9, #16\n\t"
  61032. "mul r7, r6, r7\n\t"
  61033. "adds r4, r4, r7\n\t"
  61034. "adc r5, r5, #0\n\t"
  61035. "lsl r7, r9, #16\n\t"
  61036. "lsr r7, r7, #16\n\t"
  61037. "mul r6, r7, r6\n\t"
  61038. "lsr r7, r6, #16\n\t"
  61039. "lsl r6, r6, #16\n\t"
  61040. "adds r3, r3, r6\n\t"
  61041. "adcs r4, r4, r7\n\t"
  61042. "adc r5, r5, #0\n\t"
  61043. /* A[2] * B[1] */
  61044. "ldr r8, [%[a], #8]\n\t"
  61045. "lsl r6, r8, #16\n\t"
  61046. "lsl r7, r12, #16\n\t"
  61047. "lsr r6, r6, #16\n\t"
  61048. "lsr r7, r7, #16\n\t"
  61049. "mul r7, r6, r7\n\t"
  61050. "adds r3, r3, r7\n\t"
  61051. "adcs r4, r4, #0\n\t"
  61052. "adc r5, r5, #0\n\t"
  61053. "lsr r7, r12, #16\n\t"
  61054. "mul r6, r7, r6\n\t"
  61055. "lsr r7, r6, #16\n\t"
  61056. "lsl r6, r6, #16\n\t"
  61057. "adds r3, r3, r6\n\t"
  61058. "adcs r4, r4, r7\n\t"
  61059. "adc r5, r5, #0\n\t"
  61060. "lsr r6, r8, #16\n\t"
  61061. "lsr r7, r12, #16\n\t"
  61062. "mul r7, r6, r7\n\t"
  61063. "adds r4, r4, r7\n\t"
  61064. "adc r5, r5, #0\n\t"
  61065. "lsl r7, r12, #16\n\t"
  61066. "lsr r7, r7, #16\n\t"
  61067. "mul r6, r7, r6\n\t"
  61068. "lsr r7, r6, #16\n\t"
  61069. "lsl r6, r6, #16\n\t"
  61070. "adds r3, r3, r6\n\t"
  61071. "adcs r4, r4, r7\n\t"
  61072. "adc r5, r5, #0\n\t"
  61073. /* A[3] * B[0] */
  61074. "ldr r8, [%[a], #12]\n\t"
  61075. "ldr r9, [%[b]]\n\t"
  61076. "lsl r6, r8, #16\n\t"
  61077. "lsl r7, r9, #16\n\t"
  61078. "lsr r6, r6, #16\n\t"
  61079. "lsr r7, r7, #16\n\t"
  61080. "mul r7, r6, r7\n\t"
  61081. "adds r3, r3, r7\n\t"
  61082. "adcs r4, r4, #0\n\t"
  61083. "adc r5, r5, #0\n\t"
  61084. "lsr r7, r9, #16\n\t"
  61085. "mul r6, r7, r6\n\t"
  61086. "lsr r7, r6, #16\n\t"
  61087. "lsl r6, r6, #16\n\t"
  61088. "adds r3, r3, r6\n\t"
  61089. "adcs r4, r4, r7\n\t"
  61090. "adc r5, r5, #0\n\t"
  61091. "lsr r6, r8, #16\n\t"
  61092. "lsr r7, r9, #16\n\t"
  61093. "mul r7, r6, r7\n\t"
  61094. "adds r4, r4, r7\n\t"
  61095. "adc r5, r5, #0\n\t"
  61096. "lsl r7, r9, #16\n\t"
  61097. "lsr r7, r7, #16\n\t"
  61098. "mul r6, r7, r6\n\t"
  61099. "lsr r7, r6, #16\n\t"
  61100. "lsl r6, r6, #16\n\t"
  61101. "adds r3, r3, r6\n\t"
  61102. "adcs r4, r4, r7\n\t"
  61103. "adc r5, r5, #0\n\t"
  61104. "str r3, [sp, #12]\n\t"
  61105. /* A[4] * B[0] */
  61106. "ldr r8, [%[a], #16]\n\t"
  61107. "lsl r6, r8, #16\n\t"
  61108. "lsl r7, r9, #16\n\t"
  61109. "lsr r6, r6, #16\n\t"
  61110. "lsr r7, r7, #16\n\t"
  61111. "mul r7, r6, r7\n\t"
  61112. "adds r4, r4, r7\n\t"
  61113. "adcs r5, r5, #0\n\t"
  61114. "mov r3, #0\n\t"
  61115. "adc r3, r3, #0\n\t"
  61116. "lsr r7, r9, #16\n\t"
  61117. "mul r6, r7, r6\n\t"
  61118. "lsr r7, r6, #16\n\t"
  61119. "lsl r6, r6, #16\n\t"
  61120. "adds r4, r4, r6\n\t"
  61121. "adcs r5, r5, r7\n\t"
  61122. "adc r3, r3, #0\n\t"
  61123. "lsr r6, r8, #16\n\t"
  61124. "lsr r7, r9, #16\n\t"
  61125. "mul r7, r6, r7\n\t"
  61126. "adds r5, r5, r7\n\t"
  61127. "adc r3, r3, #0\n\t"
  61128. "lsl r7, r9, #16\n\t"
  61129. "lsr r7, r7, #16\n\t"
  61130. "mul r6, r7, r6\n\t"
  61131. "lsr r7, r6, #16\n\t"
  61132. "lsl r6, r6, #16\n\t"
  61133. "adds r4, r4, r6\n\t"
  61134. "adcs r5, r5, r7\n\t"
  61135. "adc r3, r3, #0\n\t"
  61136. /* A[3] * B[1] */
  61137. "ldr r8, [%[a], #12]\n\t"
  61138. "lsl r6, r8, #16\n\t"
  61139. "lsl r7, r12, #16\n\t"
  61140. "lsr r6, r6, #16\n\t"
  61141. "lsr r7, r7, #16\n\t"
  61142. "mul r7, r6, r7\n\t"
  61143. "adds r4, r4, r7\n\t"
  61144. "adcs r5, r5, #0\n\t"
  61145. "adc r3, r3, #0\n\t"
  61146. "lsr r7, r12, #16\n\t"
  61147. "mul r6, r7, r6\n\t"
  61148. "lsr r7, r6, #16\n\t"
  61149. "lsl r6, r6, #16\n\t"
  61150. "adds r4, r4, r6\n\t"
  61151. "adcs r5, r5, r7\n\t"
  61152. "adc r3, r3, #0\n\t"
  61153. "lsr r6, r8, #16\n\t"
  61154. "lsr r7, r12, #16\n\t"
  61155. "mul r7, r6, r7\n\t"
  61156. "adds r5, r5, r7\n\t"
  61157. "adc r3, r3, #0\n\t"
  61158. "lsl r7, r12, #16\n\t"
  61159. "lsr r7, r7, #16\n\t"
  61160. "mul r6, r7, r6\n\t"
  61161. "lsr r7, r6, #16\n\t"
  61162. "lsl r6, r6, #16\n\t"
  61163. "adds r4, r4, r6\n\t"
  61164. "adcs r5, r5, r7\n\t"
  61165. "adc r3, r3, #0\n\t"
  61166. /* A[2] * B[2] */
  61167. "ldr r11, [%[a], #8]\n\t"
  61168. "ldr r12, [%[b], #8]\n\t"
  61169. "lsl r6, r11, #16\n\t"
  61170. "lsl r7, r12, #16\n\t"
  61171. "lsr r6, r6, #16\n\t"
  61172. "lsr r7, r7, #16\n\t"
  61173. "mul r7, r6, r7\n\t"
  61174. "adds r4, r4, r7\n\t"
  61175. "adcs r5, r5, #0\n\t"
  61176. "adc r3, r3, #0\n\t"
  61177. "lsr r7, r12, #16\n\t"
  61178. "mul r6, r7, r6\n\t"
  61179. "lsr r7, r6, #16\n\t"
  61180. "lsl r6, r6, #16\n\t"
  61181. "adds r4, r4, r6\n\t"
  61182. "adcs r5, r5, r7\n\t"
  61183. "adc r3, r3, #0\n\t"
  61184. "lsr r6, r11, #16\n\t"
  61185. "lsr r7, r12, #16\n\t"
  61186. "mul r7, r6, r7\n\t"
  61187. "adds r5, r5, r7\n\t"
  61188. "adc r3, r3, #0\n\t"
  61189. "lsl r7, r12, #16\n\t"
  61190. "lsr r7, r7, #16\n\t"
  61191. "mul r6, r7, r6\n\t"
  61192. "lsr r7, r6, #16\n\t"
  61193. "lsl r6, r6, #16\n\t"
  61194. "adds r4, r4, r6\n\t"
  61195. "adcs r5, r5, r7\n\t"
  61196. "adc r3, r3, #0\n\t"
  61197. /* A[1] * B[3] */
  61198. "ldr r8, [%[a], #4]\n\t"
  61199. "ldr r9, [%[b], #12]\n\t"
  61200. "lsl r6, r8, #16\n\t"
  61201. "lsl r7, r9, #16\n\t"
  61202. "lsr r6, r6, #16\n\t"
  61203. "lsr r7, r7, #16\n\t"
  61204. "mul r7, r6, r7\n\t"
  61205. "adds r4, r4, r7\n\t"
  61206. "adcs r5, r5, #0\n\t"
  61207. "adc r3, r3, #0\n\t"
  61208. "lsr r7, r9, #16\n\t"
  61209. "mul r6, r7, r6\n\t"
  61210. "lsr r7, r6, #16\n\t"
  61211. "lsl r6, r6, #16\n\t"
  61212. "adds r4, r4, r6\n\t"
  61213. "adcs r5, r5, r7\n\t"
  61214. "adc r3, r3, #0\n\t"
  61215. "lsr r6, r8, #16\n\t"
  61216. "lsr r7, r9, #16\n\t"
  61217. "mul r7, r6, r7\n\t"
  61218. "adds r5, r5, r7\n\t"
  61219. "adc r3, r3, #0\n\t"
  61220. "lsl r7, r9, #16\n\t"
  61221. "lsr r7, r7, #16\n\t"
  61222. "mul r6, r7, r6\n\t"
  61223. "lsr r7, r6, #16\n\t"
  61224. "lsl r6, r6, #16\n\t"
  61225. "adds r4, r4, r6\n\t"
  61226. "adcs r5, r5, r7\n\t"
  61227. "adc r3, r3, #0\n\t"
  61228. /* A[0] * B[4] */
  61229. "ldr r8, [%[a]]\n\t"
  61230. "ldr r9, [%[b], #16]\n\t"
  61231. "lsl r6, r8, #16\n\t"
  61232. "lsl r7, r9, #16\n\t"
  61233. "lsr r6, r6, #16\n\t"
  61234. "lsr r7, r7, #16\n\t"
  61235. "mul r7, r6, r7\n\t"
  61236. "adds r4, r4, r7\n\t"
  61237. "adcs r5, r5, #0\n\t"
  61238. "adc r3, r3, #0\n\t"
  61239. "lsr r7, r9, #16\n\t"
  61240. "mul r6, r7, r6\n\t"
  61241. "lsr r7, r6, #16\n\t"
  61242. "lsl r6, r6, #16\n\t"
  61243. "adds r4, r4, r6\n\t"
  61244. "adcs r5, r5, r7\n\t"
  61245. "adc r3, r3, #0\n\t"
  61246. "lsr r6, r8, #16\n\t"
  61247. "lsr r7, r9, #16\n\t"
  61248. "mul r7, r6, r7\n\t"
  61249. "adds r5, r5, r7\n\t"
  61250. "adc r3, r3, #0\n\t"
  61251. "lsl r7, r9, #16\n\t"
  61252. "lsr r7, r7, #16\n\t"
  61253. "mul r6, r7, r6\n\t"
  61254. "lsr r7, r6, #16\n\t"
  61255. "lsl r6, r6, #16\n\t"
  61256. "adds r4, r4, r6\n\t"
  61257. "adcs r5, r5, r7\n\t"
  61258. "adc r3, r3, #0\n\t"
  61259. "str r4, [sp, #16]\n\t"
  61260. /* A[0] * B[5] */
  61261. "ldr r9, [%[b], #20]\n\t"
  61262. "lsl r6, r8, #16\n\t"
  61263. "lsl r7, r9, #16\n\t"
  61264. "lsr r6, r6, #16\n\t"
  61265. "lsr r7, r7, #16\n\t"
  61266. "mul r7, r6, r7\n\t"
  61267. "adds r5, r5, r7\n\t"
  61268. "adcs r3, r3, #0\n\t"
  61269. "mov r4, #0\n\t"
  61270. "adc r4, r4, #0\n\t"
  61271. "lsr r7, r9, #16\n\t"
  61272. "mul r6, r7, r6\n\t"
  61273. "lsr r7, r6, #16\n\t"
  61274. "lsl r6, r6, #16\n\t"
  61275. "adds r5, r5, r6\n\t"
  61276. "adcs r3, r3, r7\n\t"
  61277. "adc r4, r4, #0\n\t"
  61278. "lsr r6, r8, #16\n\t"
  61279. "lsr r7, r9, #16\n\t"
  61280. "mul r7, r6, r7\n\t"
  61281. "adds r3, r3, r7\n\t"
  61282. "adc r4, r4, #0\n\t"
  61283. "lsl r7, r9, #16\n\t"
  61284. "lsr r7, r7, #16\n\t"
  61285. "mul r6, r7, r6\n\t"
  61286. "lsr r7, r6, #16\n\t"
  61287. "lsl r6, r6, #16\n\t"
  61288. "adds r5, r5, r6\n\t"
  61289. "adcs r3, r3, r7\n\t"
  61290. "adc r4, r4, #0\n\t"
  61291. /* A[1] * B[4] */
  61292. "ldr r8, [%[a], #4]\n\t"
  61293. "ldr r9, [%[b], #16]\n\t"
  61294. "lsl r6, r8, #16\n\t"
  61295. "lsl r7, r9, #16\n\t"
  61296. "lsr r6, r6, #16\n\t"
  61297. "lsr r7, r7, #16\n\t"
  61298. "mul r7, r6, r7\n\t"
  61299. "adds r5, r5, r7\n\t"
  61300. "adcs r3, r3, #0\n\t"
  61301. "adc r4, r4, #0\n\t"
  61302. "lsr r7, r9, #16\n\t"
  61303. "mul r6, r7, r6\n\t"
  61304. "lsr r7, r6, #16\n\t"
  61305. "lsl r6, r6, #16\n\t"
  61306. "adds r5, r5, r6\n\t"
  61307. "adcs r3, r3, r7\n\t"
  61308. "adc r4, r4, #0\n\t"
  61309. "lsr r6, r8, #16\n\t"
  61310. "lsr r7, r9, #16\n\t"
  61311. "mul r7, r6, r7\n\t"
  61312. "adds r3, r3, r7\n\t"
  61313. "adc r4, r4, #0\n\t"
  61314. "lsl r7, r9, #16\n\t"
  61315. "lsr r7, r7, #16\n\t"
  61316. "mul r6, r7, r6\n\t"
  61317. "lsr r7, r6, #16\n\t"
  61318. "lsl r6, r6, #16\n\t"
  61319. "adds r5, r5, r6\n\t"
  61320. "adcs r3, r3, r7\n\t"
  61321. "adc r4, r4, #0\n\t"
  61322. /* A[2] * B[3] */
  61323. "ldr r9, [%[b], #12]\n\t"
  61324. "lsl r6, r11, #16\n\t"
  61325. "lsl r7, r9, #16\n\t"
  61326. "lsr r6, r6, #16\n\t"
  61327. "lsr r7, r7, #16\n\t"
  61328. "mul r7, r6, r7\n\t"
  61329. "adds r5, r5, r7\n\t"
  61330. "adcs r3, r3, #0\n\t"
  61331. "adc r4, r4, #0\n\t"
  61332. "lsr r7, r9, #16\n\t"
  61333. "mul r6, r7, r6\n\t"
  61334. "lsr r7, r6, #16\n\t"
  61335. "lsl r6, r6, #16\n\t"
  61336. "adds r5, r5, r6\n\t"
  61337. "adcs r3, r3, r7\n\t"
  61338. "adc r4, r4, #0\n\t"
  61339. "lsr r6, r11, #16\n\t"
  61340. "lsr r7, r9, #16\n\t"
  61341. "mul r7, r6, r7\n\t"
  61342. "adds r3, r3, r7\n\t"
  61343. "adc r4, r4, #0\n\t"
  61344. "lsl r7, r9, #16\n\t"
  61345. "lsr r7, r7, #16\n\t"
  61346. "mul r6, r7, r6\n\t"
  61347. "lsr r7, r6, #16\n\t"
  61348. "lsl r6, r6, #16\n\t"
  61349. "adds r5, r5, r6\n\t"
  61350. "adcs r3, r3, r7\n\t"
  61351. "adc r4, r4, #0\n\t"
  61352. /* A[3] * B[2] */
  61353. "ldr r8, [%[a], #12]\n\t"
  61354. "lsl r6, r8, #16\n\t"
  61355. "lsl r7, r12, #16\n\t"
  61356. "lsr r6, r6, #16\n\t"
  61357. "lsr r7, r7, #16\n\t"
  61358. "mul r7, r6, r7\n\t"
  61359. "adds r5, r5, r7\n\t"
  61360. "adcs r3, r3, #0\n\t"
  61361. "adc r4, r4, #0\n\t"
  61362. "lsr r7, r12, #16\n\t"
  61363. "mul r6, r7, r6\n\t"
  61364. "lsr r7, r6, #16\n\t"
  61365. "lsl r6, r6, #16\n\t"
  61366. "adds r5, r5, r6\n\t"
  61367. "adcs r3, r3, r7\n\t"
  61368. "adc r4, r4, #0\n\t"
  61369. "lsr r6, r8, #16\n\t"
  61370. "lsr r7, r12, #16\n\t"
  61371. "mul r7, r6, r7\n\t"
  61372. "adds r3, r3, r7\n\t"
  61373. "adc r4, r4, #0\n\t"
  61374. "lsl r7, r12, #16\n\t"
  61375. "lsr r7, r7, #16\n\t"
  61376. "mul r6, r7, r6\n\t"
  61377. "lsr r7, r6, #16\n\t"
  61378. "lsl r6, r6, #16\n\t"
  61379. "adds r5, r5, r6\n\t"
  61380. "adcs r3, r3, r7\n\t"
  61381. "adc r4, r4, #0\n\t"
  61382. /* A[4] * B[1] */
  61383. "ldr r8, [%[a], #16]\n\t"
  61384. "ldr r9, [%[b], #4]\n\t"
  61385. "lsl r6, r8, #16\n\t"
  61386. "lsl r7, r9, #16\n\t"
  61387. "lsr r6, r6, #16\n\t"
  61388. "lsr r7, r7, #16\n\t"
  61389. "mul r7, r6, r7\n\t"
  61390. "adds r5, r5, r7\n\t"
  61391. "adcs r3, r3, #0\n\t"
  61392. "adc r4, r4, #0\n\t"
  61393. "lsr r7, r9, #16\n\t"
  61394. "mul r6, r7, r6\n\t"
  61395. "lsr r7, r6, #16\n\t"
  61396. "lsl r6, r6, #16\n\t"
  61397. "adds r5, r5, r6\n\t"
  61398. "adcs r3, r3, r7\n\t"
  61399. "adc r4, r4, #0\n\t"
  61400. "lsr r6, r8, #16\n\t"
  61401. "lsr r7, r9, #16\n\t"
  61402. "mul r7, r6, r7\n\t"
  61403. "adds r3, r3, r7\n\t"
  61404. "adc r4, r4, #0\n\t"
  61405. "lsl r7, r9, #16\n\t"
  61406. "lsr r7, r7, #16\n\t"
  61407. "mul r6, r7, r6\n\t"
  61408. "lsr r7, r6, #16\n\t"
  61409. "lsl r6, r6, #16\n\t"
  61410. "adds r5, r5, r6\n\t"
  61411. "adcs r3, r3, r7\n\t"
  61412. "adc r4, r4, #0\n\t"
  61413. /* A[5] * B[0] */
  61414. "ldr r8, [%[a], #20]\n\t"
  61415. "ldr r9, [%[b]]\n\t"
  61416. "lsl r6, r8, #16\n\t"
  61417. "lsl r7, r9, #16\n\t"
  61418. "lsr r6, r6, #16\n\t"
  61419. "lsr r7, r7, #16\n\t"
  61420. "mul r7, r6, r7\n\t"
  61421. "adds r5, r5, r7\n\t"
  61422. "adcs r3, r3, #0\n\t"
  61423. "adc r4, r4, #0\n\t"
  61424. "lsr r7, r9, #16\n\t"
  61425. "mul r6, r7, r6\n\t"
  61426. "lsr r7, r6, #16\n\t"
  61427. "lsl r6, r6, #16\n\t"
  61428. "adds r5, r5, r6\n\t"
  61429. "adcs r3, r3, r7\n\t"
  61430. "adc r4, r4, #0\n\t"
  61431. "lsr r6, r8, #16\n\t"
  61432. "lsr r7, r9, #16\n\t"
  61433. "mul r7, r6, r7\n\t"
  61434. "adds r3, r3, r7\n\t"
  61435. "adc r4, r4, #0\n\t"
  61436. "lsl r7, r9, #16\n\t"
  61437. "lsr r7, r7, #16\n\t"
  61438. "mul r6, r7, r6\n\t"
  61439. "lsr r7, r6, #16\n\t"
  61440. "lsl r6, r6, #16\n\t"
  61441. "adds r5, r5, r6\n\t"
  61442. "adcs r3, r3, r7\n\t"
  61443. "adc r4, r4, #0\n\t"
  61444. "str r5, [sp, #20]\n\t"
  61445. /* A[6] * B[0] */
  61446. "ldr r8, [%[a], #24]\n\t"
  61447. "lsl r6, r8, #16\n\t"
  61448. "lsl r7, r9, #16\n\t"
  61449. "lsr r6, r6, #16\n\t"
  61450. "lsr r7, r7, #16\n\t"
  61451. "mul r7, r6, r7\n\t"
  61452. "adds r3, r3, r7\n\t"
  61453. "adcs r4, r4, #0\n\t"
  61454. "mov r5, #0\n\t"
  61455. "adc r5, r5, #0\n\t"
  61456. "lsr r7, r9, #16\n\t"
  61457. "mul r6, r7, r6\n\t"
  61458. "lsr r7, r6, #16\n\t"
  61459. "lsl r6, r6, #16\n\t"
  61460. "adds r3, r3, r6\n\t"
  61461. "adcs r4, r4, r7\n\t"
  61462. "adc r5, r5, #0\n\t"
  61463. "lsr r6, r8, #16\n\t"
  61464. "lsr r7, r9, #16\n\t"
  61465. "mul r7, r6, r7\n\t"
  61466. "adds r4, r4, r7\n\t"
  61467. "adc r5, r5, #0\n\t"
  61468. "lsl r7, r9, #16\n\t"
  61469. "lsr r7, r7, #16\n\t"
  61470. "mul r6, r7, r6\n\t"
  61471. "lsr r7, r6, #16\n\t"
  61472. "lsl r6, r6, #16\n\t"
  61473. "adds r3, r3, r6\n\t"
  61474. "adcs r4, r4, r7\n\t"
  61475. "adc r5, r5, #0\n\t"
  61476. /* A[5] * B[1] */
  61477. "ldr r8, [%[a], #20]\n\t"
  61478. "ldr r9, [%[b], #4]\n\t"
  61479. "lsl r6, r8, #16\n\t"
  61480. "lsl r7, r9, #16\n\t"
  61481. "lsr r6, r6, #16\n\t"
  61482. "lsr r7, r7, #16\n\t"
  61483. "mul r7, r6, r7\n\t"
  61484. "adds r3, r3, r7\n\t"
  61485. "adcs r4, r4, #0\n\t"
  61486. "adc r5, r5, #0\n\t"
  61487. "lsr r7, r9, #16\n\t"
  61488. "mul r6, r7, r6\n\t"
  61489. "lsr r7, r6, #16\n\t"
  61490. "lsl r6, r6, #16\n\t"
  61491. "adds r3, r3, r6\n\t"
  61492. "adcs r4, r4, r7\n\t"
  61493. "adc r5, r5, #0\n\t"
  61494. "lsr r6, r8, #16\n\t"
  61495. "lsr r7, r9, #16\n\t"
  61496. "mul r7, r6, r7\n\t"
  61497. "adds r4, r4, r7\n\t"
  61498. "adc r5, r5, #0\n\t"
  61499. "lsl r7, r9, #16\n\t"
  61500. "lsr r7, r7, #16\n\t"
  61501. "mul r6, r7, r6\n\t"
  61502. "lsr r7, r6, #16\n\t"
  61503. "lsl r6, r6, #16\n\t"
  61504. "adds r3, r3, r6\n\t"
  61505. "adcs r4, r4, r7\n\t"
  61506. "adc r5, r5, #0\n\t"
  61507. /* A[4] * B[2] */
  61508. "ldr r8, [%[a], #16]\n\t"
  61509. "lsl r6, r8, #16\n\t"
  61510. "lsl r7, r12, #16\n\t"
  61511. "lsr r6, r6, #16\n\t"
  61512. "lsr r7, r7, #16\n\t"
  61513. "mul r7, r6, r7\n\t"
  61514. "adds r3, r3, r7\n\t"
  61515. "adcs r4, r4, #0\n\t"
  61516. "adc r5, r5, #0\n\t"
  61517. "lsr r7, r12, #16\n\t"
  61518. "mul r6, r7, r6\n\t"
  61519. "lsr r7, r6, #16\n\t"
  61520. "lsl r6, r6, #16\n\t"
  61521. "adds r3, r3, r6\n\t"
  61522. "adcs r4, r4, r7\n\t"
  61523. "adc r5, r5, #0\n\t"
  61524. "lsr r6, r8, #16\n\t"
  61525. "lsr r7, r12, #16\n\t"
  61526. "mul r7, r6, r7\n\t"
  61527. "adds r4, r4, r7\n\t"
  61528. "adc r5, r5, #0\n\t"
  61529. "lsl r7, r12, #16\n\t"
  61530. "lsr r7, r7, #16\n\t"
  61531. "mul r6, r7, r6\n\t"
  61532. "lsr r7, r6, #16\n\t"
  61533. "lsl r6, r6, #16\n\t"
  61534. "adds r3, r3, r6\n\t"
  61535. "adcs r4, r4, r7\n\t"
  61536. "adc r5, r5, #0\n\t"
  61537. /* A[3] * B[3] */
  61538. "ldr r11, [%[a], #12]\n\t"
  61539. "ldr r12, [%[b], #12]\n\t"
  61540. "lsl r6, r11, #16\n\t"
  61541. "lsl r7, r12, #16\n\t"
  61542. "lsr r6, r6, #16\n\t"
  61543. "lsr r7, r7, #16\n\t"
  61544. "mul r7, r6, r7\n\t"
  61545. "adds r3, r3, r7\n\t"
  61546. "adcs r4, r4, #0\n\t"
  61547. "adc r5, r5, #0\n\t"
  61548. "lsr r7, r12, #16\n\t"
  61549. "mul r6, r7, r6\n\t"
  61550. "lsr r7, r6, #16\n\t"
  61551. "lsl r6, r6, #16\n\t"
  61552. "adds r3, r3, r6\n\t"
  61553. "adcs r4, r4, r7\n\t"
  61554. "adc r5, r5, #0\n\t"
  61555. "lsr r6, r11, #16\n\t"
  61556. "lsr r7, r12, #16\n\t"
  61557. "mul r7, r6, r7\n\t"
  61558. "adds r4, r4, r7\n\t"
  61559. "adc r5, r5, #0\n\t"
  61560. "lsl r7, r12, #16\n\t"
  61561. "lsr r7, r7, #16\n\t"
  61562. "mul r6, r7, r6\n\t"
  61563. "lsr r7, r6, #16\n\t"
  61564. "lsl r6, r6, #16\n\t"
  61565. "adds r3, r3, r6\n\t"
  61566. "adcs r4, r4, r7\n\t"
  61567. "adc r5, r5, #0\n\t"
  61568. /* A[2] * B[4] */
  61569. "ldr r8, [%[a], #8]\n\t"
  61570. "ldr r9, [%[b], #16]\n\t"
  61571. "lsl r6, r8, #16\n\t"
  61572. "lsl r7, r9, #16\n\t"
  61573. "lsr r6, r6, #16\n\t"
  61574. "lsr r7, r7, #16\n\t"
  61575. "mul r7, r6, r7\n\t"
  61576. "adds r3, r3, r7\n\t"
  61577. "adcs r4, r4, #0\n\t"
  61578. "adc r5, r5, #0\n\t"
  61579. "lsr r7, r9, #16\n\t"
  61580. "mul r6, r7, r6\n\t"
  61581. "lsr r7, r6, #16\n\t"
  61582. "lsl r6, r6, #16\n\t"
  61583. "adds r3, r3, r6\n\t"
  61584. "adcs r4, r4, r7\n\t"
  61585. "adc r5, r5, #0\n\t"
  61586. "lsr r6, r8, #16\n\t"
  61587. "lsr r7, r9, #16\n\t"
  61588. "mul r7, r6, r7\n\t"
  61589. "adds r4, r4, r7\n\t"
  61590. "adc r5, r5, #0\n\t"
  61591. "lsl r7, r9, #16\n\t"
  61592. "lsr r7, r7, #16\n\t"
  61593. "mul r6, r7, r6\n\t"
  61594. "lsr r7, r6, #16\n\t"
  61595. "lsl r6, r6, #16\n\t"
  61596. "adds r3, r3, r6\n\t"
  61597. "adcs r4, r4, r7\n\t"
  61598. "adc r5, r5, #0\n\t"
  61599. /* A[1] * B[5] */
  61600. "ldr r8, [%[a], #4]\n\t"
  61601. "ldr r9, [%[b], #20]\n\t"
  61602. "lsl r6, r8, #16\n\t"
  61603. "lsl r7, r9, #16\n\t"
  61604. "lsr r6, r6, #16\n\t"
  61605. "lsr r7, r7, #16\n\t"
  61606. "mul r7, r6, r7\n\t"
  61607. "adds r3, r3, r7\n\t"
  61608. "adcs r4, r4, #0\n\t"
  61609. "adc r5, r5, #0\n\t"
  61610. "lsr r7, r9, #16\n\t"
  61611. "mul r6, r7, r6\n\t"
  61612. "lsr r7, r6, #16\n\t"
  61613. "lsl r6, r6, #16\n\t"
  61614. "adds r3, r3, r6\n\t"
  61615. "adcs r4, r4, r7\n\t"
  61616. "adc r5, r5, #0\n\t"
  61617. "lsr r6, r8, #16\n\t"
  61618. "lsr r7, r9, #16\n\t"
  61619. "mul r7, r6, r7\n\t"
  61620. "adds r4, r4, r7\n\t"
  61621. "adc r5, r5, #0\n\t"
  61622. "lsl r7, r9, #16\n\t"
  61623. "lsr r7, r7, #16\n\t"
  61624. "mul r6, r7, r6\n\t"
  61625. "lsr r7, r6, #16\n\t"
  61626. "lsl r6, r6, #16\n\t"
  61627. "adds r3, r3, r6\n\t"
  61628. "adcs r4, r4, r7\n\t"
  61629. "adc r5, r5, #0\n\t"
  61630. /* A[0] * B[6] */
  61631. "ldr r8, [%[a]]\n\t"
  61632. "ldr r9, [%[b], #24]\n\t"
  61633. "lsl r6, r8, #16\n\t"
  61634. "lsl r7, r9, #16\n\t"
  61635. "lsr r6, r6, #16\n\t"
  61636. "lsr r7, r7, #16\n\t"
  61637. "mul r7, r6, r7\n\t"
  61638. "adds r3, r3, r7\n\t"
  61639. "adcs r4, r4, #0\n\t"
  61640. "adc r5, r5, #0\n\t"
  61641. "lsr r7, r9, #16\n\t"
  61642. "mul r6, r7, r6\n\t"
  61643. "lsr r7, r6, #16\n\t"
  61644. "lsl r6, r6, #16\n\t"
  61645. "adds r3, r3, r6\n\t"
  61646. "adcs r4, r4, r7\n\t"
  61647. "adc r5, r5, #0\n\t"
  61648. "lsr r6, r8, #16\n\t"
  61649. "lsr r7, r9, #16\n\t"
  61650. "mul r7, r6, r7\n\t"
  61651. "adds r4, r4, r7\n\t"
  61652. "adc r5, r5, #0\n\t"
  61653. "lsl r7, r9, #16\n\t"
  61654. "lsr r7, r7, #16\n\t"
  61655. "mul r6, r7, r6\n\t"
  61656. "lsr r7, r6, #16\n\t"
  61657. "lsl r6, r6, #16\n\t"
  61658. "adds r3, r3, r6\n\t"
  61659. "adcs r4, r4, r7\n\t"
  61660. "adc r5, r5, #0\n\t"
  61661. "str r3, [sp, #24]\n\t"
  61662. /* A[0] * B[7] */
  61663. "ldr r9, [%[b], #28]\n\t"
  61664. "lsl r6, r8, #16\n\t"
  61665. "lsl r7, r9, #16\n\t"
  61666. "lsr r6, r6, #16\n\t"
  61667. "lsr r7, r7, #16\n\t"
  61668. "mul r7, r6, r7\n\t"
  61669. "adds r4, r4, r7\n\t"
  61670. "adcs r5, r5, #0\n\t"
  61671. "mov r3, #0\n\t"
  61672. "adc r3, r3, #0\n\t"
  61673. "lsr r7, r9, #16\n\t"
  61674. "mul r6, r7, r6\n\t"
  61675. "lsr r7, r6, #16\n\t"
  61676. "lsl r6, r6, #16\n\t"
  61677. "adds r4, r4, r6\n\t"
  61678. "adcs r5, r5, r7\n\t"
  61679. "adc r3, r3, #0\n\t"
  61680. "lsr r6, r8, #16\n\t"
  61681. "lsr r7, r9, #16\n\t"
  61682. "mul r7, r6, r7\n\t"
  61683. "adds r5, r5, r7\n\t"
  61684. "adc r3, r3, #0\n\t"
  61685. "lsl r7, r9, #16\n\t"
  61686. "lsr r7, r7, #16\n\t"
  61687. "mul r6, r7, r6\n\t"
  61688. "lsr r7, r6, #16\n\t"
  61689. "lsl r6, r6, #16\n\t"
  61690. "adds r4, r4, r6\n\t"
  61691. "adcs r5, r5, r7\n\t"
  61692. "adc r3, r3, #0\n\t"
  61693. /* A[1] * B[6] */
  61694. "ldr r8, [%[a], #4]\n\t"
  61695. "ldr r9, [%[b], #24]\n\t"
  61696. "lsl r6, r8, #16\n\t"
  61697. "lsl r7, r9, #16\n\t"
  61698. "lsr r6, r6, #16\n\t"
  61699. "lsr r7, r7, #16\n\t"
  61700. "mul r7, r6, r7\n\t"
  61701. "adds r4, r4, r7\n\t"
  61702. "adcs r5, r5, #0\n\t"
  61703. "adc r3, r3, #0\n\t"
  61704. "lsr r7, r9, #16\n\t"
  61705. "mul r6, r7, r6\n\t"
  61706. "lsr r7, r6, #16\n\t"
  61707. "lsl r6, r6, #16\n\t"
  61708. "adds r4, r4, r6\n\t"
  61709. "adcs r5, r5, r7\n\t"
  61710. "adc r3, r3, #0\n\t"
  61711. "lsr r6, r8, #16\n\t"
  61712. "lsr r7, r9, #16\n\t"
  61713. "mul r7, r6, r7\n\t"
  61714. "adds r5, r5, r7\n\t"
  61715. "adc r3, r3, #0\n\t"
  61716. "lsl r7, r9, #16\n\t"
  61717. "lsr r7, r7, #16\n\t"
  61718. "mul r6, r7, r6\n\t"
  61719. "lsr r7, r6, #16\n\t"
  61720. "lsl r6, r6, #16\n\t"
  61721. "adds r4, r4, r6\n\t"
  61722. "adcs r5, r5, r7\n\t"
  61723. "adc r3, r3, #0\n\t"
  61724. /* A[2] * B[5] */
  61725. "ldr r8, [%[a], #8]\n\t"
  61726. "ldr r9, [%[b], #20]\n\t"
  61727. "lsl r6, r8, #16\n\t"
  61728. "lsl r7, r9, #16\n\t"
  61729. "lsr r6, r6, #16\n\t"
  61730. "lsr r7, r7, #16\n\t"
  61731. "mul r7, r6, r7\n\t"
  61732. "adds r4, r4, r7\n\t"
  61733. "adcs r5, r5, #0\n\t"
  61734. "adc r3, r3, #0\n\t"
  61735. "lsr r7, r9, #16\n\t"
  61736. "mul r6, r7, r6\n\t"
  61737. "lsr r7, r6, #16\n\t"
  61738. "lsl r6, r6, #16\n\t"
  61739. "adds r4, r4, r6\n\t"
  61740. "adcs r5, r5, r7\n\t"
  61741. "adc r3, r3, #0\n\t"
  61742. "lsr r6, r8, #16\n\t"
  61743. "lsr r7, r9, #16\n\t"
  61744. "mul r7, r6, r7\n\t"
  61745. "adds r5, r5, r7\n\t"
  61746. "adc r3, r3, #0\n\t"
  61747. "lsl r7, r9, #16\n\t"
  61748. "lsr r7, r7, #16\n\t"
  61749. "mul r6, r7, r6\n\t"
  61750. "lsr r7, r6, #16\n\t"
  61751. "lsl r6, r6, #16\n\t"
  61752. "adds r4, r4, r6\n\t"
  61753. "adcs r5, r5, r7\n\t"
  61754. "adc r3, r3, #0\n\t"
  61755. /* A[3] * B[4] */
  61756. "ldr r9, [%[b], #16]\n\t"
  61757. "lsl r6, r11, #16\n\t"
  61758. "lsl r7, r9, #16\n\t"
  61759. "lsr r6, r6, #16\n\t"
  61760. "lsr r7, r7, #16\n\t"
  61761. "mul r7, r6, r7\n\t"
  61762. "adds r4, r4, r7\n\t"
  61763. "adcs r5, r5, #0\n\t"
  61764. "adc r3, r3, #0\n\t"
  61765. "lsr r7, r9, #16\n\t"
  61766. "mul r6, r7, r6\n\t"
  61767. "lsr r7, r6, #16\n\t"
  61768. "lsl r6, r6, #16\n\t"
  61769. "adds r4, r4, r6\n\t"
  61770. "adcs r5, r5, r7\n\t"
  61771. "adc r3, r3, #0\n\t"
  61772. "lsr r6, r11, #16\n\t"
  61773. "lsr r7, r9, #16\n\t"
  61774. "mul r7, r6, r7\n\t"
  61775. "adds r5, r5, r7\n\t"
  61776. "adc r3, r3, #0\n\t"
  61777. "lsl r7, r9, #16\n\t"
  61778. "lsr r7, r7, #16\n\t"
  61779. "mul r6, r7, r6\n\t"
  61780. "lsr r7, r6, #16\n\t"
  61781. "lsl r6, r6, #16\n\t"
  61782. "adds r4, r4, r6\n\t"
  61783. "adcs r5, r5, r7\n\t"
  61784. "adc r3, r3, #0\n\t"
  61785. /* A[4] * B[3] */
  61786. "ldr r8, [%[a], #16]\n\t"
  61787. "lsl r6, r8, #16\n\t"
  61788. "lsl r7, r12, #16\n\t"
  61789. "lsr r6, r6, #16\n\t"
  61790. "lsr r7, r7, #16\n\t"
  61791. "mul r7, r6, r7\n\t"
  61792. "adds r4, r4, r7\n\t"
  61793. "adcs r5, r5, #0\n\t"
  61794. "adc r3, r3, #0\n\t"
  61795. "lsr r7, r12, #16\n\t"
  61796. "mul r6, r7, r6\n\t"
  61797. "lsr r7, r6, #16\n\t"
  61798. "lsl r6, r6, #16\n\t"
  61799. "adds r4, r4, r6\n\t"
  61800. "adcs r5, r5, r7\n\t"
  61801. "adc r3, r3, #0\n\t"
  61802. "lsr r6, r8, #16\n\t"
  61803. "lsr r7, r12, #16\n\t"
  61804. "mul r7, r6, r7\n\t"
  61805. "adds r5, r5, r7\n\t"
  61806. "adc r3, r3, #0\n\t"
  61807. "lsl r7, r12, #16\n\t"
  61808. "lsr r7, r7, #16\n\t"
  61809. "mul r6, r7, r6\n\t"
  61810. "lsr r7, r6, #16\n\t"
  61811. "lsl r6, r6, #16\n\t"
  61812. "adds r4, r4, r6\n\t"
  61813. "adcs r5, r5, r7\n\t"
  61814. "adc r3, r3, #0\n\t"
  61815. /* A[5] * B[2] */
  61816. "ldr r8, [%[a], #20]\n\t"
  61817. "ldr r9, [%[b], #8]\n\t"
  61818. "lsl r6, r8, #16\n\t"
  61819. "lsl r7, r9, #16\n\t"
  61820. "lsr r6, r6, #16\n\t"
  61821. "lsr r7, r7, #16\n\t"
  61822. "mul r7, r6, r7\n\t"
  61823. "adds r4, r4, r7\n\t"
  61824. "adcs r5, r5, #0\n\t"
  61825. "adc r3, r3, #0\n\t"
  61826. "lsr r7, r9, #16\n\t"
  61827. "mul r6, r7, r6\n\t"
  61828. "lsr r7, r6, #16\n\t"
  61829. "lsl r6, r6, #16\n\t"
  61830. "adds r4, r4, r6\n\t"
  61831. "adcs r5, r5, r7\n\t"
  61832. "adc r3, r3, #0\n\t"
  61833. "lsr r6, r8, #16\n\t"
  61834. "lsr r7, r9, #16\n\t"
  61835. "mul r7, r6, r7\n\t"
  61836. "adds r5, r5, r7\n\t"
  61837. "adc r3, r3, #0\n\t"
  61838. "lsl r7, r9, #16\n\t"
  61839. "lsr r7, r7, #16\n\t"
  61840. "mul r6, r7, r6\n\t"
  61841. "lsr r7, r6, #16\n\t"
  61842. "lsl r6, r6, #16\n\t"
  61843. "adds r4, r4, r6\n\t"
  61844. "adcs r5, r5, r7\n\t"
  61845. "adc r3, r3, #0\n\t"
  61846. /* A[6] * B[1] */
  61847. "ldr r8, [%[a], #24]\n\t"
  61848. "ldr r9, [%[b], #4]\n\t"
  61849. "lsl r6, r8, #16\n\t"
  61850. "lsl r7, r9, #16\n\t"
  61851. "lsr r6, r6, #16\n\t"
  61852. "lsr r7, r7, #16\n\t"
  61853. "mul r7, r6, r7\n\t"
  61854. "adds r4, r4, r7\n\t"
  61855. "adcs r5, r5, #0\n\t"
  61856. "adc r3, r3, #0\n\t"
  61857. "lsr r7, r9, #16\n\t"
  61858. "mul r6, r7, r6\n\t"
  61859. "lsr r7, r6, #16\n\t"
  61860. "lsl r6, r6, #16\n\t"
  61861. "adds r4, r4, r6\n\t"
  61862. "adcs r5, r5, r7\n\t"
  61863. "adc r3, r3, #0\n\t"
  61864. "lsr r6, r8, #16\n\t"
  61865. "lsr r7, r9, #16\n\t"
  61866. "mul r7, r6, r7\n\t"
  61867. "adds r5, r5, r7\n\t"
  61868. "adc r3, r3, #0\n\t"
  61869. "lsl r7, r9, #16\n\t"
  61870. "lsr r7, r7, #16\n\t"
  61871. "mul r6, r7, r6\n\t"
  61872. "lsr r7, r6, #16\n\t"
  61873. "lsl r6, r6, #16\n\t"
  61874. "adds r4, r4, r6\n\t"
  61875. "adcs r5, r5, r7\n\t"
  61876. "adc r3, r3, #0\n\t"
  61877. /* A[7] * B[0] */
  61878. "ldr r8, [%[a], #28]\n\t"
  61879. "ldr r9, [%[b]]\n\t"
  61880. "lsl r6, r8, #16\n\t"
  61881. "lsl r7, r9, #16\n\t"
  61882. "lsr r6, r6, #16\n\t"
  61883. "lsr r7, r7, #16\n\t"
  61884. "mul r7, r6, r7\n\t"
  61885. "adds r4, r4, r7\n\t"
  61886. "adcs r5, r5, #0\n\t"
  61887. "adc r3, r3, #0\n\t"
  61888. "lsr r7, r9, #16\n\t"
  61889. "mul r6, r7, r6\n\t"
  61890. "lsr r7, r6, #16\n\t"
  61891. "lsl r6, r6, #16\n\t"
  61892. "adds r4, r4, r6\n\t"
  61893. "adcs r5, r5, r7\n\t"
  61894. "adc r3, r3, #0\n\t"
  61895. "lsr r6, r8, #16\n\t"
  61896. "lsr r7, r9, #16\n\t"
  61897. "mul r7, r6, r7\n\t"
  61898. "adds r5, r5, r7\n\t"
  61899. "adc r3, r3, #0\n\t"
  61900. "lsl r7, r9, #16\n\t"
  61901. "lsr r7, r7, #16\n\t"
  61902. "mul r6, r7, r6\n\t"
  61903. "lsr r7, r6, #16\n\t"
  61904. "lsl r6, r6, #16\n\t"
  61905. "adds r4, r4, r6\n\t"
  61906. "adcs r5, r5, r7\n\t"
  61907. "adc r3, r3, #0\n\t"
  61908. "str r4, [sp, #28]\n\t"
  61909. /* A[7] * B[1] */
  61910. "ldr r9, [%[b], #4]\n\t"
  61911. "lsl r6, r8, #16\n\t"
  61912. "lsl r7, r9, #16\n\t"
  61913. "lsr r6, r6, #16\n\t"
  61914. "lsr r7, r7, #16\n\t"
  61915. "mul r7, r6, r7\n\t"
  61916. "adds r5, r5, r7\n\t"
  61917. "adcs r3, r3, #0\n\t"
  61918. "mov r4, #0\n\t"
  61919. "adc r4, r4, #0\n\t"
  61920. "lsr r7, r9, #16\n\t"
  61921. "mul r6, r7, r6\n\t"
  61922. "lsr r7, r6, #16\n\t"
  61923. "lsl r6, r6, #16\n\t"
  61924. "adds r5, r5, r6\n\t"
  61925. "adcs r3, r3, r7\n\t"
  61926. "adc r4, r4, #0\n\t"
  61927. "lsr r6, r8, #16\n\t"
  61928. "lsr r7, r9, #16\n\t"
  61929. "mul r7, r6, r7\n\t"
  61930. "adds r3, r3, r7\n\t"
  61931. "adc r4, r4, #0\n\t"
  61932. "lsl r7, r9, #16\n\t"
  61933. "lsr r7, r7, #16\n\t"
  61934. "mul r6, r7, r6\n\t"
  61935. "lsr r7, r6, #16\n\t"
  61936. "lsl r6, r6, #16\n\t"
  61937. "adds r5, r5, r6\n\t"
  61938. "adcs r3, r3, r7\n\t"
  61939. "adc r4, r4, #0\n\t"
  61940. /* A[6] * B[2] */
  61941. "ldr r8, [%[a], #24]\n\t"
  61942. "ldr r9, [%[b], #8]\n\t"
  61943. "lsl r6, r8, #16\n\t"
  61944. "lsl r7, r9, #16\n\t"
  61945. "lsr r6, r6, #16\n\t"
  61946. "lsr r7, r7, #16\n\t"
  61947. "mul r7, r6, r7\n\t"
  61948. "adds r5, r5, r7\n\t"
  61949. "adcs r3, r3, #0\n\t"
  61950. "adc r4, r4, #0\n\t"
  61951. "lsr r7, r9, #16\n\t"
  61952. "mul r6, r7, r6\n\t"
  61953. "lsr r7, r6, #16\n\t"
  61954. "lsl r6, r6, #16\n\t"
  61955. "adds r5, r5, r6\n\t"
  61956. "adcs r3, r3, r7\n\t"
  61957. "adc r4, r4, #0\n\t"
  61958. "lsr r6, r8, #16\n\t"
  61959. "lsr r7, r9, #16\n\t"
  61960. "mul r7, r6, r7\n\t"
  61961. "adds r3, r3, r7\n\t"
  61962. "adc r4, r4, #0\n\t"
  61963. "lsl r7, r9, #16\n\t"
  61964. "lsr r7, r7, #16\n\t"
  61965. "mul r6, r7, r6\n\t"
  61966. "lsr r7, r6, #16\n\t"
  61967. "lsl r6, r6, #16\n\t"
  61968. "adds r5, r5, r6\n\t"
  61969. "adcs r3, r3, r7\n\t"
  61970. "adc r4, r4, #0\n\t"
  61971. /* A[5] * B[3] */
  61972. "ldr r8, [%[a], #20]\n\t"
  61973. "lsl r6, r8, #16\n\t"
  61974. "lsl r7, r12, #16\n\t"
  61975. "lsr r6, r6, #16\n\t"
  61976. "lsr r7, r7, #16\n\t"
  61977. "mul r7, r6, r7\n\t"
  61978. "adds r5, r5, r7\n\t"
  61979. "adcs r3, r3, #0\n\t"
  61980. "adc r4, r4, #0\n\t"
  61981. "lsr r7, r12, #16\n\t"
  61982. "mul r6, r7, r6\n\t"
  61983. "lsr r7, r6, #16\n\t"
  61984. "lsl r6, r6, #16\n\t"
  61985. "adds r5, r5, r6\n\t"
  61986. "adcs r3, r3, r7\n\t"
  61987. "adc r4, r4, #0\n\t"
  61988. "lsr r6, r8, #16\n\t"
  61989. "lsr r7, r12, #16\n\t"
  61990. "mul r7, r6, r7\n\t"
  61991. "adds r3, r3, r7\n\t"
  61992. "adc r4, r4, #0\n\t"
  61993. "lsl r7, r12, #16\n\t"
  61994. "lsr r7, r7, #16\n\t"
  61995. "mul r6, r7, r6\n\t"
  61996. "lsr r7, r6, #16\n\t"
  61997. "lsl r6, r6, #16\n\t"
  61998. "adds r5, r5, r6\n\t"
  61999. "adcs r3, r3, r7\n\t"
  62000. "adc r4, r4, #0\n\t"
  62001. /* A[4] * B[4] */
  62002. "ldr r11, [%[a], #16]\n\t"
  62003. "ldr r12, [%[b], #16]\n\t"
  62004. "lsl r6, r11, #16\n\t"
  62005. "lsl r7, r12, #16\n\t"
  62006. "lsr r6, r6, #16\n\t"
  62007. "lsr r7, r7, #16\n\t"
  62008. "mul r7, r6, r7\n\t"
  62009. "adds r5, r5, r7\n\t"
  62010. "adcs r3, r3, #0\n\t"
  62011. "adc r4, r4, #0\n\t"
  62012. "lsr r7, r12, #16\n\t"
  62013. "mul r6, r7, r6\n\t"
  62014. "lsr r7, r6, #16\n\t"
  62015. "lsl r6, r6, #16\n\t"
  62016. "adds r5, r5, r6\n\t"
  62017. "adcs r3, r3, r7\n\t"
  62018. "adc r4, r4, #0\n\t"
  62019. "lsr r6, r11, #16\n\t"
  62020. "lsr r7, r12, #16\n\t"
  62021. "mul r7, r6, r7\n\t"
  62022. "adds r3, r3, r7\n\t"
  62023. "adc r4, r4, #0\n\t"
  62024. "lsl r7, r12, #16\n\t"
  62025. "lsr r7, r7, #16\n\t"
  62026. "mul r6, r7, r6\n\t"
  62027. "lsr r7, r6, #16\n\t"
  62028. "lsl r6, r6, #16\n\t"
  62029. "adds r5, r5, r6\n\t"
  62030. "adcs r3, r3, r7\n\t"
  62031. "adc r4, r4, #0\n\t"
  62032. /* A[3] * B[5] */
  62033. "ldr r8, [%[a], #12]\n\t"
  62034. "ldr r9, [%[b], #20]\n\t"
  62035. "lsl r6, r8, #16\n\t"
  62036. "lsl r7, r9, #16\n\t"
  62037. "lsr r6, r6, #16\n\t"
  62038. "lsr r7, r7, #16\n\t"
  62039. "mul r7, r6, r7\n\t"
  62040. "adds r5, r5, r7\n\t"
  62041. "adcs r3, r3, #0\n\t"
  62042. "adc r4, r4, #0\n\t"
  62043. "lsr r7, r9, #16\n\t"
  62044. "mul r6, r7, r6\n\t"
  62045. "lsr r7, r6, #16\n\t"
  62046. "lsl r6, r6, #16\n\t"
  62047. "adds r5, r5, r6\n\t"
  62048. "adcs r3, r3, r7\n\t"
  62049. "adc r4, r4, #0\n\t"
  62050. "lsr r6, r8, #16\n\t"
  62051. "lsr r7, r9, #16\n\t"
  62052. "mul r7, r6, r7\n\t"
  62053. "adds r3, r3, r7\n\t"
  62054. "adc r4, r4, #0\n\t"
  62055. "lsl r7, r9, #16\n\t"
  62056. "lsr r7, r7, #16\n\t"
  62057. "mul r6, r7, r6\n\t"
  62058. "lsr r7, r6, #16\n\t"
  62059. "lsl r6, r6, #16\n\t"
  62060. "adds r5, r5, r6\n\t"
  62061. "adcs r3, r3, r7\n\t"
  62062. "adc r4, r4, #0\n\t"
  62063. /* A[2] * B[6] */
  62064. "ldr r8, [%[a], #8]\n\t"
  62065. "ldr r9, [%[b], #24]\n\t"
  62066. "lsl r6, r8, #16\n\t"
  62067. "lsl r7, r9, #16\n\t"
  62068. "lsr r6, r6, #16\n\t"
  62069. "lsr r7, r7, #16\n\t"
  62070. "mul r7, r6, r7\n\t"
  62071. "adds r5, r5, r7\n\t"
  62072. "adcs r3, r3, #0\n\t"
  62073. "adc r4, r4, #0\n\t"
  62074. "lsr r7, r9, #16\n\t"
  62075. "mul r6, r7, r6\n\t"
  62076. "lsr r7, r6, #16\n\t"
  62077. "lsl r6, r6, #16\n\t"
  62078. "adds r5, r5, r6\n\t"
  62079. "adcs r3, r3, r7\n\t"
  62080. "adc r4, r4, #0\n\t"
  62081. "lsr r6, r8, #16\n\t"
  62082. "lsr r7, r9, #16\n\t"
  62083. "mul r7, r6, r7\n\t"
  62084. "adds r3, r3, r7\n\t"
  62085. "adc r4, r4, #0\n\t"
  62086. "lsl r7, r9, #16\n\t"
  62087. "lsr r7, r7, #16\n\t"
  62088. "mul r6, r7, r6\n\t"
  62089. "lsr r7, r6, #16\n\t"
  62090. "lsl r6, r6, #16\n\t"
  62091. "adds r5, r5, r6\n\t"
  62092. "adcs r3, r3, r7\n\t"
  62093. "adc r4, r4, #0\n\t"
  62094. /* A[1] * B[7] */
  62095. "ldr r8, [%[a], #4]\n\t"
  62096. "ldr r9, [%[b], #28]\n\t"
  62097. "lsl r6, r8, #16\n\t"
  62098. "lsl r7, r9, #16\n\t"
  62099. "lsr r6, r6, #16\n\t"
  62100. "lsr r7, r7, #16\n\t"
  62101. "mul r7, r6, r7\n\t"
  62102. "adds r5, r5, r7\n\t"
  62103. "adcs r3, r3, #0\n\t"
  62104. "adc r4, r4, #0\n\t"
  62105. "lsr r7, r9, #16\n\t"
  62106. "mul r6, r7, r6\n\t"
  62107. "lsr r7, r6, #16\n\t"
  62108. "lsl r6, r6, #16\n\t"
  62109. "adds r5, r5, r6\n\t"
  62110. "adcs r3, r3, r7\n\t"
  62111. "adc r4, r4, #0\n\t"
  62112. "lsr r6, r8, #16\n\t"
  62113. "lsr r7, r9, #16\n\t"
  62114. "mul r7, r6, r7\n\t"
  62115. "adds r3, r3, r7\n\t"
  62116. "adc r4, r4, #0\n\t"
  62117. "lsl r7, r9, #16\n\t"
  62118. "lsr r7, r7, #16\n\t"
  62119. "mul r6, r7, r6\n\t"
  62120. "lsr r7, r6, #16\n\t"
  62121. "lsl r6, r6, #16\n\t"
  62122. "adds r5, r5, r6\n\t"
  62123. "adcs r3, r3, r7\n\t"
  62124. "adc r4, r4, #0\n\t"
  62125. "str r5, [%[r], #32]\n\t"
  62126. /* A[2] * B[7] */
  62127. "ldr r8, [%[a], #8]\n\t"
  62128. "lsl r6, r8, #16\n\t"
  62129. "lsl r7, r9, #16\n\t"
  62130. "lsr r6, r6, #16\n\t"
  62131. "lsr r7, r7, #16\n\t"
  62132. "mul r7, r6, r7\n\t"
  62133. "adds r3, r3, r7\n\t"
  62134. "adcs r4, r4, #0\n\t"
  62135. "mov r5, #0\n\t"
  62136. "adc r5, r5, #0\n\t"
  62137. "lsr r7, r9, #16\n\t"
  62138. "mul r6, r7, r6\n\t"
  62139. "lsr r7, r6, #16\n\t"
  62140. "lsl r6, r6, #16\n\t"
  62141. "adds r3, r3, r6\n\t"
  62142. "adcs r4, r4, r7\n\t"
  62143. "adc r5, r5, #0\n\t"
  62144. "lsr r6, r8, #16\n\t"
  62145. "lsr r7, r9, #16\n\t"
  62146. "mul r7, r6, r7\n\t"
  62147. "adds r4, r4, r7\n\t"
  62148. "adc r5, r5, #0\n\t"
  62149. "lsl r7, r9, #16\n\t"
  62150. "lsr r7, r7, #16\n\t"
  62151. "mul r6, r7, r6\n\t"
  62152. "lsr r7, r6, #16\n\t"
  62153. "lsl r6, r6, #16\n\t"
  62154. "adds r3, r3, r6\n\t"
  62155. "adcs r4, r4, r7\n\t"
  62156. "adc r5, r5, #0\n\t"
  62157. /* A[3] * B[6] */
  62158. "ldr r8, [%[a], #12]\n\t"
  62159. "ldr r9, [%[b], #24]\n\t"
  62160. "lsl r6, r8, #16\n\t"
  62161. "lsl r7, r9, #16\n\t"
  62162. "lsr r6, r6, #16\n\t"
  62163. "lsr r7, r7, #16\n\t"
  62164. "mul r7, r6, r7\n\t"
  62165. "adds r3, r3, r7\n\t"
  62166. "adcs r4, r4, #0\n\t"
  62167. "adc r5, r5, #0\n\t"
  62168. "lsr r7, r9, #16\n\t"
  62169. "mul r6, r7, r6\n\t"
  62170. "lsr r7, r6, #16\n\t"
  62171. "lsl r6, r6, #16\n\t"
  62172. "adds r3, r3, r6\n\t"
  62173. "adcs r4, r4, r7\n\t"
  62174. "adc r5, r5, #0\n\t"
  62175. "lsr r6, r8, #16\n\t"
  62176. "lsr r7, r9, #16\n\t"
  62177. "mul r7, r6, r7\n\t"
  62178. "adds r4, r4, r7\n\t"
  62179. "adc r5, r5, #0\n\t"
  62180. "lsl r7, r9, #16\n\t"
  62181. "lsr r7, r7, #16\n\t"
  62182. "mul r6, r7, r6\n\t"
  62183. "lsr r7, r6, #16\n\t"
  62184. "lsl r6, r6, #16\n\t"
  62185. "adds r3, r3, r6\n\t"
  62186. "adcs r4, r4, r7\n\t"
  62187. "adc r5, r5, #0\n\t"
  62188. /* A[4] * B[5] */
  62189. "ldr r9, [%[b], #20]\n\t"
  62190. "lsl r6, r11, #16\n\t"
  62191. "lsl r7, r9, #16\n\t"
  62192. "lsr r6, r6, #16\n\t"
  62193. "lsr r7, r7, #16\n\t"
  62194. "mul r7, r6, r7\n\t"
  62195. "adds r3, r3, r7\n\t"
  62196. "adcs r4, r4, #0\n\t"
  62197. "adc r5, r5, #0\n\t"
  62198. "lsr r7, r9, #16\n\t"
  62199. "mul r6, r7, r6\n\t"
  62200. "lsr r7, r6, #16\n\t"
  62201. "lsl r6, r6, #16\n\t"
  62202. "adds r3, r3, r6\n\t"
  62203. "adcs r4, r4, r7\n\t"
  62204. "adc r5, r5, #0\n\t"
  62205. "lsr r6, r11, #16\n\t"
  62206. "lsr r7, r9, #16\n\t"
  62207. "mul r7, r6, r7\n\t"
  62208. "adds r4, r4, r7\n\t"
  62209. "adc r5, r5, #0\n\t"
  62210. "lsl r7, r9, #16\n\t"
  62211. "lsr r7, r7, #16\n\t"
  62212. "mul r6, r7, r6\n\t"
  62213. "lsr r7, r6, #16\n\t"
  62214. "lsl r6, r6, #16\n\t"
  62215. "adds r3, r3, r6\n\t"
  62216. "adcs r4, r4, r7\n\t"
  62217. "adc r5, r5, #0\n\t"
  62218. /* A[5] * B[4] */
  62219. "ldr r8, [%[a], #20]\n\t"
  62220. "lsl r6, r8, #16\n\t"
  62221. "lsl r7, r12, #16\n\t"
  62222. "lsr r6, r6, #16\n\t"
  62223. "lsr r7, r7, #16\n\t"
  62224. "mul r7, r6, r7\n\t"
  62225. "adds r3, r3, r7\n\t"
  62226. "adcs r4, r4, #0\n\t"
  62227. "adc r5, r5, #0\n\t"
  62228. "lsr r7, r12, #16\n\t"
  62229. "mul r6, r7, r6\n\t"
  62230. "lsr r7, r6, #16\n\t"
  62231. "lsl r6, r6, #16\n\t"
  62232. "adds r3, r3, r6\n\t"
  62233. "adcs r4, r4, r7\n\t"
  62234. "adc r5, r5, #0\n\t"
  62235. "lsr r6, r8, #16\n\t"
  62236. "lsr r7, r12, #16\n\t"
  62237. "mul r7, r6, r7\n\t"
  62238. "adds r4, r4, r7\n\t"
  62239. "adc r5, r5, #0\n\t"
  62240. "lsl r7, r12, #16\n\t"
  62241. "lsr r7, r7, #16\n\t"
  62242. "mul r6, r7, r6\n\t"
  62243. "lsr r7, r6, #16\n\t"
  62244. "lsl r6, r6, #16\n\t"
  62245. "adds r3, r3, r6\n\t"
  62246. "adcs r4, r4, r7\n\t"
  62247. "adc r5, r5, #0\n\t"
  62248. /* A[6] * B[3] */
  62249. "ldr r8, [%[a], #24]\n\t"
  62250. "ldr r9, [%[b], #12]\n\t"
  62251. "lsl r6, r8, #16\n\t"
  62252. "lsl r7, r9, #16\n\t"
  62253. "lsr r6, r6, #16\n\t"
  62254. "lsr r7, r7, #16\n\t"
  62255. "mul r7, r6, r7\n\t"
  62256. "adds r3, r3, r7\n\t"
  62257. "adcs r4, r4, #0\n\t"
  62258. "adc r5, r5, #0\n\t"
  62259. "lsr r7, r9, #16\n\t"
  62260. "mul r6, r7, r6\n\t"
  62261. "lsr r7, r6, #16\n\t"
  62262. "lsl r6, r6, #16\n\t"
  62263. "adds r3, r3, r6\n\t"
  62264. "adcs r4, r4, r7\n\t"
  62265. "adc r5, r5, #0\n\t"
  62266. "lsr r6, r8, #16\n\t"
  62267. "lsr r7, r9, #16\n\t"
  62268. "mul r7, r6, r7\n\t"
  62269. "adds r4, r4, r7\n\t"
  62270. "adc r5, r5, #0\n\t"
  62271. "lsl r7, r9, #16\n\t"
  62272. "lsr r7, r7, #16\n\t"
  62273. "mul r6, r7, r6\n\t"
  62274. "lsr r7, r6, #16\n\t"
  62275. "lsl r6, r6, #16\n\t"
  62276. "adds r3, r3, r6\n\t"
  62277. "adcs r4, r4, r7\n\t"
  62278. "adc r5, r5, #0\n\t"
  62279. /* A[7] * B[2] */
  62280. "ldr r8, [%[a], #28]\n\t"
  62281. "ldr r9, [%[b], #8]\n\t"
  62282. "lsl r6, r8, #16\n\t"
  62283. "lsl r7, r9, #16\n\t"
  62284. "lsr r6, r6, #16\n\t"
  62285. "lsr r7, r7, #16\n\t"
  62286. "mul r7, r6, r7\n\t"
  62287. "adds r3, r3, r7\n\t"
  62288. "adcs r4, r4, #0\n\t"
  62289. "adc r5, r5, #0\n\t"
  62290. "lsr r7, r9, #16\n\t"
  62291. "mul r6, r7, r6\n\t"
  62292. "lsr r7, r6, #16\n\t"
  62293. "lsl r6, r6, #16\n\t"
  62294. "adds r3, r3, r6\n\t"
  62295. "adcs r4, r4, r7\n\t"
  62296. "adc r5, r5, #0\n\t"
  62297. "lsr r6, r8, #16\n\t"
  62298. "lsr r7, r9, #16\n\t"
  62299. "mul r7, r6, r7\n\t"
  62300. "adds r4, r4, r7\n\t"
  62301. "adc r5, r5, #0\n\t"
  62302. "lsl r7, r9, #16\n\t"
  62303. "lsr r7, r7, #16\n\t"
  62304. "mul r6, r7, r6\n\t"
  62305. "lsr r7, r6, #16\n\t"
  62306. "lsl r6, r6, #16\n\t"
  62307. "adds r3, r3, r6\n\t"
  62308. "adcs r4, r4, r7\n\t"
  62309. "adc r5, r5, #0\n\t"
  62310. "str r3, [%[r], #36]\n\t"
  62311. /* A[7] * B[3] */
  62312. "ldr r9, [%[b], #12]\n\t"
  62313. "lsl r6, r8, #16\n\t"
  62314. "lsl r7, r9, #16\n\t"
  62315. "lsr r6, r6, #16\n\t"
  62316. "lsr r7, r7, #16\n\t"
  62317. "mul r7, r6, r7\n\t"
  62318. "adds r4, r4, r7\n\t"
  62319. "adcs r5, r5, #0\n\t"
  62320. "mov r3, #0\n\t"
  62321. "adc r3, r3, #0\n\t"
  62322. "lsr r7, r9, #16\n\t"
  62323. "mul r6, r7, r6\n\t"
  62324. "lsr r7, r6, #16\n\t"
  62325. "lsl r6, r6, #16\n\t"
  62326. "adds r4, r4, r6\n\t"
  62327. "adcs r5, r5, r7\n\t"
  62328. "adc r3, r3, #0\n\t"
  62329. "lsr r6, r8, #16\n\t"
  62330. "lsr r7, r9, #16\n\t"
  62331. "mul r7, r6, r7\n\t"
  62332. "adds r5, r5, r7\n\t"
  62333. "adc r3, r3, #0\n\t"
  62334. "lsl r7, r9, #16\n\t"
  62335. "lsr r7, r7, #16\n\t"
  62336. "mul r6, r7, r6\n\t"
  62337. "lsr r7, r6, #16\n\t"
  62338. "lsl r6, r6, #16\n\t"
  62339. "adds r4, r4, r6\n\t"
  62340. "adcs r5, r5, r7\n\t"
  62341. "adc r3, r3, #0\n\t"
  62342. /* A[6] * B[4] */
  62343. "ldr r8, [%[a], #24]\n\t"
  62344. "lsl r6, r8, #16\n\t"
  62345. "lsl r7, r12, #16\n\t"
  62346. "lsr r6, r6, #16\n\t"
  62347. "lsr r7, r7, #16\n\t"
  62348. "mul r7, r6, r7\n\t"
  62349. "adds r4, r4, r7\n\t"
  62350. "adcs r5, r5, #0\n\t"
  62351. "adc r3, r3, #0\n\t"
  62352. "lsr r7, r12, #16\n\t"
  62353. "mul r6, r7, r6\n\t"
  62354. "lsr r7, r6, #16\n\t"
  62355. "lsl r6, r6, #16\n\t"
  62356. "adds r4, r4, r6\n\t"
  62357. "adcs r5, r5, r7\n\t"
  62358. "adc r3, r3, #0\n\t"
  62359. "lsr r6, r8, #16\n\t"
  62360. "lsr r7, r12, #16\n\t"
  62361. "mul r7, r6, r7\n\t"
  62362. "adds r5, r5, r7\n\t"
  62363. "adc r3, r3, #0\n\t"
  62364. "lsl r7, r12, #16\n\t"
  62365. "lsr r7, r7, #16\n\t"
  62366. "mul r6, r7, r6\n\t"
  62367. "lsr r7, r6, #16\n\t"
  62368. "lsl r6, r6, #16\n\t"
  62369. "adds r4, r4, r6\n\t"
  62370. "adcs r5, r5, r7\n\t"
  62371. "adc r3, r3, #0\n\t"
  62372. /* A[5] * B[5] */
  62373. "ldr r11, [%[a], #20]\n\t"
  62374. "ldr r12, [%[b], #20]\n\t"
  62375. "lsl r6, r11, #16\n\t"
  62376. "lsl r7, r12, #16\n\t"
  62377. "lsr r6, r6, #16\n\t"
  62378. "lsr r7, r7, #16\n\t"
  62379. "mul r7, r6, r7\n\t"
  62380. "adds r4, r4, r7\n\t"
  62381. "adcs r5, r5, #0\n\t"
  62382. "adc r3, r3, #0\n\t"
  62383. "lsr r7, r12, #16\n\t"
  62384. "mul r6, r7, r6\n\t"
  62385. "lsr r7, r6, #16\n\t"
  62386. "lsl r6, r6, #16\n\t"
  62387. "adds r4, r4, r6\n\t"
  62388. "adcs r5, r5, r7\n\t"
  62389. "adc r3, r3, #0\n\t"
  62390. "lsr r6, r11, #16\n\t"
  62391. "lsr r7, r12, #16\n\t"
  62392. "mul r7, r6, r7\n\t"
  62393. "adds r5, r5, r7\n\t"
  62394. "adc r3, r3, #0\n\t"
  62395. "lsl r7, r12, #16\n\t"
  62396. "lsr r7, r7, #16\n\t"
  62397. "mul r6, r7, r6\n\t"
  62398. "lsr r7, r6, #16\n\t"
  62399. "lsl r6, r6, #16\n\t"
  62400. "adds r4, r4, r6\n\t"
  62401. "adcs r5, r5, r7\n\t"
  62402. "adc r3, r3, #0\n\t"
  62403. /* A[4] * B[6] */
  62404. "ldr r8, [%[a], #16]\n\t"
  62405. "ldr r9, [%[b], #24]\n\t"
  62406. "lsl r6, r8, #16\n\t"
  62407. "lsl r7, r9, #16\n\t"
  62408. "lsr r6, r6, #16\n\t"
  62409. "lsr r7, r7, #16\n\t"
  62410. "mul r7, r6, r7\n\t"
  62411. "adds r4, r4, r7\n\t"
  62412. "adcs r5, r5, #0\n\t"
  62413. "adc r3, r3, #0\n\t"
  62414. "lsr r7, r9, #16\n\t"
  62415. "mul r6, r7, r6\n\t"
  62416. "lsr r7, r6, #16\n\t"
  62417. "lsl r6, r6, #16\n\t"
  62418. "adds r4, r4, r6\n\t"
  62419. "adcs r5, r5, r7\n\t"
  62420. "adc r3, r3, #0\n\t"
  62421. "lsr r6, r8, #16\n\t"
  62422. "lsr r7, r9, #16\n\t"
  62423. "mul r7, r6, r7\n\t"
  62424. "adds r5, r5, r7\n\t"
  62425. "adc r3, r3, #0\n\t"
  62426. "lsl r7, r9, #16\n\t"
  62427. "lsr r7, r7, #16\n\t"
  62428. "mul r6, r7, r6\n\t"
  62429. "lsr r7, r6, #16\n\t"
  62430. "lsl r6, r6, #16\n\t"
  62431. "adds r4, r4, r6\n\t"
  62432. "adcs r5, r5, r7\n\t"
  62433. "adc r3, r3, #0\n\t"
  62434. /* A[3] * B[7] */
  62435. "ldr r8, [%[a], #12]\n\t"
  62436. "ldr r9, [%[b], #28]\n\t"
  62437. "lsl r6, r8, #16\n\t"
  62438. "lsl r7, r9, #16\n\t"
  62439. "lsr r6, r6, #16\n\t"
  62440. "lsr r7, r7, #16\n\t"
  62441. "mul r7, r6, r7\n\t"
  62442. "adds r4, r4, r7\n\t"
  62443. "adcs r5, r5, #0\n\t"
  62444. "adc r3, r3, #0\n\t"
  62445. "lsr r7, r9, #16\n\t"
  62446. "mul r6, r7, r6\n\t"
  62447. "lsr r7, r6, #16\n\t"
  62448. "lsl r6, r6, #16\n\t"
  62449. "adds r4, r4, r6\n\t"
  62450. "adcs r5, r5, r7\n\t"
  62451. "adc r3, r3, #0\n\t"
  62452. "lsr r6, r8, #16\n\t"
  62453. "lsr r7, r9, #16\n\t"
  62454. "mul r7, r6, r7\n\t"
  62455. "adds r5, r5, r7\n\t"
  62456. "adc r3, r3, #0\n\t"
  62457. "lsl r7, r9, #16\n\t"
  62458. "lsr r7, r7, #16\n\t"
  62459. "mul r6, r7, r6\n\t"
  62460. "lsr r7, r6, #16\n\t"
  62461. "lsl r6, r6, #16\n\t"
  62462. "adds r4, r4, r6\n\t"
  62463. "adcs r5, r5, r7\n\t"
  62464. "adc r3, r3, #0\n\t"
  62465. "str r4, [%[r], #40]\n\t"
  62466. /* A[4] * B[7] */
  62467. "ldr r8, [%[a], #16]\n\t"
  62468. "lsl r6, r8, #16\n\t"
  62469. "lsl r7, r9, #16\n\t"
  62470. "lsr r6, r6, #16\n\t"
  62471. "lsr r7, r7, #16\n\t"
  62472. "mul r7, r6, r7\n\t"
  62473. "adds r5, r5, r7\n\t"
  62474. "adcs r3, r3, #0\n\t"
  62475. "mov r4, #0\n\t"
  62476. "adc r4, r4, #0\n\t"
  62477. "lsr r7, r9, #16\n\t"
  62478. "mul r6, r7, r6\n\t"
  62479. "lsr r7, r6, #16\n\t"
  62480. "lsl r6, r6, #16\n\t"
  62481. "adds r5, r5, r6\n\t"
  62482. "adcs r3, r3, r7\n\t"
  62483. "adc r4, r4, #0\n\t"
  62484. "lsr r6, r8, #16\n\t"
  62485. "lsr r7, r9, #16\n\t"
  62486. "mul r7, r6, r7\n\t"
  62487. "adds r3, r3, r7\n\t"
  62488. "adc r4, r4, #0\n\t"
  62489. "lsl r7, r9, #16\n\t"
  62490. "lsr r7, r7, #16\n\t"
  62491. "mul r6, r7, r6\n\t"
  62492. "lsr r7, r6, #16\n\t"
  62493. "lsl r6, r6, #16\n\t"
  62494. "adds r5, r5, r6\n\t"
  62495. "adcs r3, r3, r7\n\t"
  62496. "adc r4, r4, #0\n\t"
  62497. /* A[5] * B[6] */
  62498. "ldr r9, [%[b], #24]\n\t"
  62499. "lsl r6, r11, #16\n\t"
  62500. "lsl r7, r9, #16\n\t"
  62501. "lsr r6, r6, #16\n\t"
  62502. "lsr r7, r7, #16\n\t"
  62503. "mul r7, r6, r7\n\t"
  62504. "adds r5, r5, r7\n\t"
  62505. "adcs r3, r3, #0\n\t"
  62506. "adc r4, r4, #0\n\t"
  62507. "lsr r7, r9, #16\n\t"
  62508. "mul r6, r7, r6\n\t"
  62509. "lsr r7, r6, #16\n\t"
  62510. "lsl r6, r6, #16\n\t"
  62511. "adds r5, r5, r6\n\t"
  62512. "adcs r3, r3, r7\n\t"
  62513. "adc r4, r4, #0\n\t"
  62514. "lsr r6, r11, #16\n\t"
  62515. "lsr r7, r9, #16\n\t"
  62516. "mul r7, r6, r7\n\t"
  62517. "adds r3, r3, r7\n\t"
  62518. "adc r4, r4, #0\n\t"
  62519. "lsl r7, r9, #16\n\t"
  62520. "lsr r7, r7, #16\n\t"
  62521. "mul r6, r7, r6\n\t"
  62522. "lsr r7, r6, #16\n\t"
  62523. "lsl r6, r6, #16\n\t"
  62524. "adds r5, r5, r6\n\t"
  62525. "adcs r3, r3, r7\n\t"
  62526. "adc r4, r4, #0\n\t"
  62527. /* A[6] * B[5] */
  62528. "ldr r8, [%[a], #24]\n\t"
  62529. "lsl r6, r8, #16\n\t"
  62530. "lsl r7, r12, #16\n\t"
  62531. "lsr r6, r6, #16\n\t"
  62532. "lsr r7, r7, #16\n\t"
  62533. "mul r7, r6, r7\n\t"
  62534. "adds r5, r5, r7\n\t"
  62535. "adcs r3, r3, #0\n\t"
  62536. "adc r4, r4, #0\n\t"
  62537. "lsr r7, r12, #16\n\t"
  62538. "mul r6, r7, r6\n\t"
  62539. "lsr r7, r6, #16\n\t"
  62540. "lsl r6, r6, #16\n\t"
  62541. "adds r5, r5, r6\n\t"
  62542. "adcs r3, r3, r7\n\t"
  62543. "adc r4, r4, #0\n\t"
  62544. "lsr r6, r8, #16\n\t"
  62545. "lsr r7, r12, #16\n\t"
  62546. "mul r7, r6, r7\n\t"
  62547. "adds r3, r3, r7\n\t"
  62548. "adc r4, r4, #0\n\t"
  62549. "lsl r7, r12, #16\n\t"
  62550. "lsr r7, r7, #16\n\t"
  62551. "mul r6, r7, r6\n\t"
  62552. "lsr r7, r6, #16\n\t"
  62553. "lsl r6, r6, #16\n\t"
  62554. "adds r5, r5, r6\n\t"
  62555. "adcs r3, r3, r7\n\t"
  62556. "adc r4, r4, #0\n\t"
  62557. /* A[7] * B[4] */
  62558. "ldr r8, [%[a], #28]\n\t"
  62559. "ldr r9, [%[b], #16]\n\t"
  62560. "lsl r6, r8, #16\n\t"
  62561. "lsl r7, r9, #16\n\t"
  62562. "lsr r6, r6, #16\n\t"
  62563. "lsr r7, r7, #16\n\t"
  62564. "mul r7, r6, r7\n\t"
  62565. "adds r5, r5, r7\n\t"
  62566. "adcs r3, r3, #0\n\t"
  62567. "adc r4, r4, #0\n\t"
  62568. "lsr r7, r9, #16\n\t"
  62569. "mul r6, r7, r6\n\t"
  62570. "lsr r7, r6, #16\n\t"
  62571. "lsl r6, r6, #16\n\t"
  62572. "adds r5, r5, r6\n\t"
  62573. "adcs r3, r3, r7\n\t"
  62574. "adc r4, r4, #0\n\t"
  62575. "lsr r6, r8, #16\n\t"
  62576. "lsr r7, r9, #16\n\t"
  62577. "mul r7, r6, r7\n\t"
  62578. "adds r3, r3, r7\n\t"
  62579. "adc r4, r4, #0\n\t"
  62580. "lsl r7, r9, #16\n\t"
  62581. "lsr r7, r7, #16\n\t"
  62582. "mul r6, r7, r6\n\t"
  62583. "lsr r7, r6, #16\n\t"
  62584. "lsl r6, r6, #16\n\t"
  62585. "adds r5, r5, r6\n\t"
  62586. "adcs r3, r3, r7\n\t"
  62587. "adc r4, r4, #0\n\t"
  62588. "str r5, [%[r], #44]\n\t"
  62589. /* A[7] * B[5] */
  62590. "lsl r6, r8, #16\n\t"
  62591. "lsl r7, r12, #16\n\t"
  62592. "lsr r6, r6, #16\n\t"
  62593. "lsr r7, r7, #16\n\t"
  62594. "mul r7, r6, r7\n\t"
  62595. "adds r3, r3, r7\n\t"
  62596. "adcs r4, r4, #0\n\t"
  62597. "mov r5, #0\n\t"
  62598. "adc r5, r5, #0\n\t"
  62599. "lsr r7, r12, #16\n\t"
  62600. "mul r6, r7, r6\n\t"
  62601. "lsr r7, r6, #16\n\t"
  62602. "lsl r6, r6, #16\n\t"
  62603. "adds r3, r3, r6\n\t"
  62604. "adcs r4, r4, r7\n\t"
  62605. "adc r5, r5, #0\n\t"
  62606. "lsr r6, r8, #16\n\t"
  62607. "lsr r7, r12, #16\n\t"
  62608. "mul r7, r6, r7\n\t"
  62609. "adds r4, r4, r7\n\t"
  62610. "adc r5, r5, #0\n\t"
  62611. "lsl r7, r12, #16\n\t"
  62612. "lsr r7, r7, #16\n\t"
  62613. "mul r6, r7, r6\n\t"
  62614. "lsr r7, r6, #16\n\t"
  62615. "lsl r6, r6, #16\n\t"
  62616. "adds r3, r3, r6\n\t"
  62617. "adcs r4, r4, r7\n\t"
  62618. "adc r5, r5, #0\n\t"
  62619. /* A[6] * B[6] */
  62620. "ldr r11, [%[a], #24]\n\t"
  62621. "ldr r12, [%[b], #24]\n\t"
  62622. "lsl r6, r11, #16\n\t"
  62623. "lsl r7, r12, #16\n\t"
  62624. "lsr r6, r6, #16\n\t"
  62625. "lsr r7, r7, #16\n\t"
  62626. "mul r7, r6, r7\n\t"
  62627. "adds r3, r3, r7\n\t"
  62628. "adcs r4, r4, #0\n\t"
  62629. "adc r5, r5, #0\n\t"
  62630. "lsr r7, r12, #16\n\t"
  62631. "mul r6, r7, r6\n\t"
  62632. "lsr r7, r6, #16\n\t"
  62633. "lsl r6, r6, #16\n\t"
  62634. "adds r3, r3, r6\n\t"
  62635. "adcs r4, r4, r7\n\t"
  62636. "adc r5, r5, #0\n\t"
  62637. "lsr r6, r11, #16\n\t"
  62638. "lsr r7, r12, #16\n\t"
  62639. "mul r7, r6, r7\n\t"
  62640. "adds r4, r4, r7\n\t"
  62641. "adc r5, r5, #0\n\t"
  62642. "lsl r7, r12, #16\n\t"
  62643. "lsr r7, r7, #16\n\t"
  62644. "mul r6, r7, r6\n\t"
  62645. "lsr r7, r6, #16\n\t"
  62646. "lsl r6, r6, #16\n\t"
  62647. "adds r3, r3, r6\n\t"
  62648. "adcs r4, r4, r7\n\t"
  62649. "adc r5, r5, #0\n\t"
  62650. /* A[5] * B[7] */
  62651. "ldr r8, [%[a], #20]\n\t"
  62652. "ldr r9, [%[b], #28]\n\t"
  62653. "lsl r6, r8, #16\n\t"
  62654. "lsl r7, r9, #16\n\t"
  62655. "lsr r6, r6, #16\n\t"
  62656. "lsr r7, r7, #16\n\t"
  62657. "mul r7, r6, r7\n\t"
  62658. "adds r3, r3, r7\n\t"
  62659. "adcs r4, r4, #0\n\t"
  62660. "adc r5, r5, #0\n\t"
  62661. "lsr r7, r9, #16\n\t"
  62662. "mul r6, r7, r6\n\t"
  62663. "lsr r7, r6, #16\n\t"
  62664. "lsl r6, r6, #16\n\t"
  62665. "adds r3, r3, r6\n\t"
  62666. "adcs r4, r4, r7\n\t"
  62667. "adc r5, r5, #0\n\t"
  62668. "lsr r6, r8, #16\n\t"
  62669. "lsr r7, r9, #16\n\t"
  62670. "mul r7, r6, r7\n\t"
  62671. "adds r4, r4, r7\n\t"
  62672. "adc r5, r5, #0\n\t"
  62673. "lsl r7, r9, #16\n\t"
  62674. "lsr r7, r7, #16\n\t"
  62675. "mul r6, r7, r6\n\t"
  62676. "lsr r7, r6, #16\n\t"
  62677. "lsl r6, r6, #16\n\t"
  62678. "adds r3, r3, r6\n\t"
  62679. "adcs r4, r4, r7\n\t"
  62680. "adc r5, r5, #0\n\t"
  62681. "str r3, [%[r], #48]\n\t"
  62682. /* A[6] * B[7] */
  62683. "lsl r6, r11, #16\n\t"
  62684. "lsl r7, r9, #16\n\t"
  62685. "lsr r6, r6, #16\n\t"
  62686. "lsr r7, r7, #16\n\t"
  62687. "mul r7, r6, r7\n\t"
  62688. "adds r4, r4, r7\n\t"
  62689. "adcs r5, r5, #0\n\t"
  62690. "mov r3, #0\n\t"
  62691. "adc r3, r3, #0\n\t"
  62692. "lsr r7, r9, #16\n\t"
  62693. "mul r6, r7, r6\n\t"
  62694. "lsr r7, r6, #16\n\t"
  62695. "lsl r6, r6, #16\n\t"
  62696. "adds r4, r4, r6\n\t"
  62697. "adcs r5, r5, r7\n\t"
  62698. "adc r3, r3, #0\n\t"
  62699. "lsr r6, r11, #16\n\t"
  62700. "lsr r7, r9, #16\n\t"
  62701. "mul r7, r6, r7\n\t"
  62702. "adds r5, r5, r7\n\t"
  62703. "adc r3, r3, #0\n\t"
  62704. "lsl r7, r9, #16\n\t"
  62705. "lsr r7, r7, #16\n\t"
  62706. "mul r6, r7, r6\n\t"
  62707. "lsr r7, r6, #16\n\t"
  62708. "lsl r6, r6, #16\n\t"
  62709. "adds r4, r4, r6\n\t"
  62710. "adcs r5, r5, r7\n\t"
  62711. "adc r3, r3, #0\n\t"
  62712. /* A[7] * B[6] */
  62713. "ldr r8, [%[a], #28]\n\t"
  62714. "lsl r6, r8, #16\n\t"
  62715. "lsl r7, r12, #16\n\t"
  62716. "lsr r6, r6, #16\n\t"
  62717. "lsr r7, r7, #16\n\t"
  62718. "mul r7, r6, r7\n\t"
  62719. "adds r4, r4, r7\n\t"
  62720. "adcs r5, r5, #0\n\t"
  62721. "adc r3, r3, #0\n\t"
  62722. "lsr r7, r12, #16\n\t"
  62723. "mul r6, r7, r6\n\t"
  62724. "lsr r7, r6, #16\n\t"
  62725. "lsl r6, r6, #16\n\t"
  62726. "adds r4, r4, r6\n\t"
  62727. "adcs r5, r5, r7\n\t"
  62728. "adc r3, r3, #0\n\t"
  62729. "lsr r6, r8, #16\n\t"
  62730. "lsr r7, r12, #16\n\t"
  62731. "mul r7, r6, r7\n\t"
  62732. "adds r5, r5, r7\n\t"
  62733. "adc r3, r3, #0\n\t"
  62734. "lsl r7, r12, #16\n\t"
  62735. "lsr r7, r7, #16\n\t"
  62736. "mul r6, r7, r6\n\t"
  62737. "lsr r7, r6, #16\n\t"
  62738. "lsl r6, r6, #16\n\t"
  62739. "adds r4, r4, r6\n\t"
  62740. "adcs r5, r5, r7\n\t"
  62741. "adc r3, r3, #0\n\t"
  62742. "str r4, [%[r], #52]\n\t"
  62743. /* A[7] * B[7] */
  62744. "lsl r6, r8, #16\n\t"
  62745. "lsl r7, r9, #16\n\t"
  62746. "lsr r6, r6, #16\n\t"
  62747. "lsr r7, r7, #16\n\t"
  62748. "mul r7, r6, r7\n\t"
  62749. "adds r5, r5, r7\n\t"
  62750. "adc r3, r3, #0\n\t"
  62751. "lsr r7, r9, #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 r5, r5, r6\n\t"
  62756. "adc r3, r3, r7\n\t"
  62757. "lsr r6, r8, #16\n\t"
  62758. "lsr r7, r9, #16\n\t"
  62759. "mul r7, r6, r7\n\t"
  62760. "add r3, r3, r7\n\t"
  62761. "lsl r7, r9, #16\n\t"
  62762. "lsr r7, r7, #16\n\t"
  62763. "mul r6, r7, r6\n\t"
  62764. "lsr r7, r6, #16\n\t"
  62765. "lsl r6, r6, #16\n\t"
  62766. "adds r5, r5, r6\n\t"
  62767. "adc r3, r3, r7\n\t"
  62768. "str r5, [%[r], #56]\n\t"
  62769. "str r3, [%[r], #60]\n\t"
  62770. "ldm sp!, {r3, r4, r5, r6}\n\t"
  62771. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  62772. "ldm sp!, {r3, r4, r5, r6}\n\t"
  62773. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  62774. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  62775. :
  62776. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  62777. );
  62778. }
  62779. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  62780. /* Multiply a and b into r. (r = a * b)
  62781. *
  62782. * r A single precision integer.
  62783. * a A single precision integer.
  62784. * b A single precision integer.
  62785. */
  62786. static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  62787. {
  62788. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  62789. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  62790. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  62791. __asm__ __volatile__ (
  62792. "sub sp, sp, #36\n\t"
  62793. "str %[r], [sp, #32]\n\t"
  62794. "mov %[r], #0\n\t"
  62795. "ldr r12, [%[a]]\n\t"
  62796. /* A[0] * B[0] */
  62797. "ldr lr, [%[b]]\n\t"
  62798. "umull r3, r4, r12, lr\n\t"
  62799. /* A[0] * B[2] */
  62800. "ldr lr, [%[b], #8]\n\t"
  62801. "umull r5, r6, r12, lr\n\t"
  62802. /* A[0] * B[4] */
  62803. "ldr lr, [%[b], #16]\n\t"
  62804. "umull r7, r8, r12, lr\n\t"
  62805. /* A[0] * B[6] */
  62806. "ldr lr, [%[b], #24]\n\t"
  62807. "umull r9, r10, r12, lr\n\t"
  62808. "str r3, [sp]\n\t"
  62809. /* A[0] * B[1] */
  62810. "ldr lr, [%[b], #4]\n\t"
  62811. "mov r11, %[r]\n\t"
  62812. "umlal r4, r11, r12, lr\n\t"
  62813. "adds r5, r5, r11\n\t"
  62814. /* A[0] * B[3] */
  62815. "ldr lr, [%[b], #12]\n\t"
  62816. "adcs r6, r6, #0\n\t"
  62817. "adc r11, %[r], #0\n\t"
  62818. "umlal r6, r11, r12, lr\n\t"
  62819. "adds r7, r7, r11\n\t"
  62820. /* A[0] * B[5] */
  62821. "ldr lr, [%[b], #20]\n\t"
  62822. "adcs r8, r8, #0\n\t"
  62823. "adc r11, %[r], #0\n\t"
  62824. "umlal r8, r11, r12, lr\n\t"
  62825. "adds r9, r9, r11\n\t"
  62826. /* A[0] * B[7] */
  62827. "ldr lr, [%[b], #28]\n\t"
  62828. "adcs r10, r10, #0\n\t"
  62829. "adc r3, %[r], #0\n\t"
  62830. "umlal r10, r3, r12, lr\n\t"
  62831. /* A[1] * B[0] */
  62832. "ldr r12, [%[a], #4]\n\t"
  62833. "ldr lr, [%[b]]\n\t"
  62834. "mov r11, #0\n\t"
  62835. "umlal r4, r11, r12, lr\n\t"
  62836. "str r4, [sp, #4]\n\t"
  62837. "adds r5, r5, r11\n\t"
  62838. /* A[1] * B[1] */
  62839. "ldr lr, [%[b], #4]\n\t"
  62840. "adc r11, %[r], #0\n\t"
  62841. "umlal r5, r11, r12, lr\n\t"
  62842. "adds r6, r6, r11\n\t"
  62843. /* A[1] * B[2] */
  62844. "ldr lr, [%[b], #8]\n\t"
  62845. "adc r11, %[r], #0\n\t"
  62846. "umlal r6, r11, r12, lr\n\t"
  62847. "adds r7, r7, r11\n\t"
  62848. /* A[1] * B[3] */
  62849. "ldr lr, [%[b], #12]\n\t"
  62850. "adc r11, %[r], #0\n\t"
  62851. "umlal r7, r11, r12, lr\n\t"
  62852. "adds r8, r8, r11\n\t"
  62853. /* A[1] * B[4] */
  62854. "ldr lr, [%[b], #16]\n\t"
  62855. "adc r11, %[r], #0\n\t"
  62856. "umlal r8, r11, r12, lr\n\t"
  62857. "adds r9, r9, r11\n\t"
  62858. /* A[1] * B[5] */
  62859. "ldr lr, [%[b], #20]\n\t"
  62860. "adc r11, %[r], #0\n\t"
  62861. "umlal r9, r11, r12, lr\n\t"
  62862. "adds r10, r10, r11\n\t"
  62863. /* A[1] * B[6] */
  62864. "ldr lr, [%[b], #24]\n\t"
  62865. "adc r11, %[r], #0\n\t"
  62866. "umlal r10, r11, r12, lr\n\t"
  62867. "adds r3, r3, r11\n\t"
  62868. /* A[1] * B[7] */
  62869. "ldr lr, [%[b], #28]\n\t"
  62870. "adc r4, %[r], #0\n\t"
  62871. "umlal r3, r4, r12, lr\n\t"
  62872. /* A[2] * B[0] */
  62873. "ldr r12, [%[a], #8]\n\t"
  62874. "ldr lr, [%[b]]\n\t"
  62875. "mov r11, #0\n\t"
  62876. "umlal r5, r11, r12, lr\n\t"
  62877. "str r5, [sp, #8]\n\t"
  62878. "adds r6, r6, r11\n\t"
  62879. /* A[2] * B[1] */
  62880. "ldr lr, [%[b], #4]\n\t"
  62881. "adc r11, %[r], #0\n\t"
  62882. "umlal r6, r11, r12, lr\n\t"
  62883. "adds r7, r7, r11\n\t"
  62884. /* A[2] * B[2] */
  62885. "ldr lr, [%[b], #8]\n\t"
  62886. "adc r11, %[r], #0\n\t"
  62887. "umlal r7, r11, r12, lr\n\t"
  62888. "adds r8, r8, r11\n\t"
  62889. /* A[2] * B[3] */
  62890. "ldr lr, [%[b], #12]\n\t"
  62891. "adc r11, %[r], #0\n\t"
  62892. "umlal r8, r11, r12, lr\n\t"
  62893. "adds r9, r9, r11\n\t"
  62894. /* A[2] * B[4] */
  62895. "ldr lr, [%[b], #16]\n\t"
  62896. "adc r11, %[r], #0\n\t"
  62897. "umlal r9, r11, r12, lr\n\t"
  62898. "adds r10, r10, r11\n\t"
  62899. /* A[2] * B[5] */
  62900. "ldr lr, [%[b], #20]\n\t"
  62901. "adc r11, %[r], #0\n\t"
  62902. "umlal r10, r11, r12, lr\n\t"
  62903. "adds r3, r3, r11\n\t"
  62904. /* A[2] * B[6] */
  62905. "ldr lr, [%[b], #24]\n\t"
  62906. "adc r11, %[r], #0\n\t"
  62907. "umlal r3, r11, r12, lr\n\t"
  62908. "adds r4, r4, r11\n\t"
  62909. /* A[2] * B[7] */
  62910. "ldr lr, [%[b], #28]\n\t"
  62911. "adc r5, %[r], #0\n\t"
  62912. "umlal r4, r5, r12, lr\n\t"
  62913. /* A[3] * B[0] */
  62914. "ldr r12, [%[a], #12]\n\t"
  62915. "ldr lr, [%[b]]\n\t"
  62916. "mov r11, #0\n\t"
  62917. "umlal r6, r11, r12, lr\n\t"
  62918. "str r6, [sp, #12]\n\t"
  62919. "adds r7, r7, r11\n\t"
  62920. /* A[3] * B[1] */
  62921. "ldr lr, [%[b], #4]\n\t"
  62922. "adc r11, %[r], #0\n\t"
  62923. "umlal r7, r11, r12, lr\n\t"
  62924. "adds r8, r8, r11\n\t"
  62925. /* A[3] * B[2] */
  62926. "ldr lr, [%[b], #8]\n\t"
  62927. "adc r11, %[r], #0\n\t"
  62928. "umlal r8, r11, r12, lr\n\t"
  62929. "adds r9, r9, r11\n\t"
  62930. /* A[3] * B[3] */
  62931. "ldr lr, [%[b], #12]\n\t"
  62932. "adc r11, %[r], #0\n\t"
  62933. "umlal r9, r11, r12, lr\n\t"
  62934. "adds r10, r10, r11\n\t"
  62935. /* A[3] * B[4] */
  62936. "ldr lr, [%[b], #16]\n\t"
  62937. "adc r11, %[r], #0\n\t"
  62938. "umlal r10, r11, r12, lr\n\t"
  62939. "adds r3, r3, r11\n\t"
  62940. /* A[3] * B[5] */
  62941. "ldr lr, [%[b], #20]\n\t"
  62942. "adc r11, %[r], #0\n\t"
  62943. "umlal r3, r11, r12, lr\n\t"
  62944. "adds r4, r4, r11\n\t"
  62945. /* A[3] * B[6] */
  62946. "ldr lr, [%[b], #24]\n\t"
  62947. "adc r11, %[r], #0\n\t"
  62948. "umlal r4, r11, r12, lr\n\t"
  62949. "adds r5, r5, r11\n\t"
  62950. /* A[3] * B[7] */
  62951. "ldr lr, [%[b], #28]\n\t"
  62952. "adc r6, %[r], #0\n\t"
  62953. "umlal r5, r6, r12, lr\n\t"
  62954. /* A[4] * B[0] */
  62955. "ldr r12, [%[a], #16]\n\t"
  62956. "ldr lr, [%[b]]\n\t"
  62957. "mov r11, #0\n\t"
  62958. "umlal r7, r11, r12, lr\n\t"
  62959. "str r7, [sp, #16]\n\t"
  62960. "adds r8, r8, r11\n\t"
  62961. /* A[4] * B[1] */
  62962. "ldr lr, [%[b], #4]\n\t"
  62963. "adc r11, %[r], #0\n\t"
  62964. "umlal r8, r11, r12, lr\n\t"
  62965. "adds r9, r9, r11\n\t"
  62966. /* A[4] * B[2] */
  62967. "ldr lr, [%[b], #8]\n\t"
  62968. "adc r11, %[r], #0\n\t"
  62969. "umlal r9, r11, r12, lr\n\t"
  62970. "adds r10, r10, r11\n\t"
  62971. /* A[4] * B[3] */
  62972. "ldr lr, [%[b], #12]\n\t"
  62973. "adc r11, %[r], #0\n\t"
  62974. "umlal r10, r11, r12, lr\n\t"
  62975. "adds r3, r3, r11\n\t"
  62976. /* A[4] * B[4] */
  62977. "ldr lr, [%[b], #16]\n\t"
  62978. "adc r11, %[r], #0\n\t"
  62979. "umlal r3, r11, r12, lr\n\t"
  62980. "adds r4, r4, r11\n\t"
  62981. /* A[4] * B[5] */
  62982. "ldr lr, [%[b], #20]\n\t"
  62983. "adc r11, %[r], #0\n\t"
  62984. "umlal r4, r11, r12, lr\n\t"
  62985. "adds r5, r5, r11\n\t"
  62986. /* A[4] * B[6] */
  62987. "ldr lr, [%[b], #24]\n\t"
  62988. "adc r11, %[r], #0\n\t"
  62989. "umlal r5, r11, r12, lr\n\t"
  62990. "adds r6, r6, r11\n\t"
  62991. /* A[4] * B[7] */
  62992. "ldr lr, [%[b], #28]\n\t"
  62993. "adc r7, %[r], #0\n\t"
  62994. "umlal r6, r7, r12, lr\n\t"
  62995. /* A[5] * B[0] */
  62996. "ldr r12, [%[a], #20]\n\t"
  62997. "ldr lr, [%[b]]\n\t"
  62998. "mov r11, #0\n\t"
  62999. "umlal r8, r11, r12, lr\n\t"
  63000. "str r8, [sp, #20]\n\t"
  63001. "adds r9, r9, r11\n\t"
  63002. /* A[5] * B[1] */
  63003. "ldr lr, [%[b], #4]\n\t"
  63004. "adc r11, %[r], #0\n\t"
  63005. "umlal r9, r11, r12, lr\n\t"
  63006. "adds r10, r10, r11\n\t"
  63007. /* A[5] * B[2] */
  63008. "ldr lr, [%[b], #8]\n\t"
  63009. "adc r11, %[r], #0\n\t"
  63010. "umlal r10, r11, r12, lr\n\t"
  63011. "adds r3, r3, r11\n\t"
  63012. /* A[5] * B[3] */
  63013. "ldr lr, [%[b], #12]\n\t"
  63014. "adc r11, %[r], #0\n\t"
  63015. "umlal r3, r11, r12, lr\n\t"
  63016. "adds r4, r4, r11\n\t"
  63017. /* A[5] * B[4] */
  63018. "ldr lr, [%[b], #16]\n\t"
  63019. "adc r11, %[r], #0\n\t"
  63020. "umlal r4, r11, r12, lr\n\t"
  63021. "adds r5, r5, r11\n\t"
  63022. /* A[5] * B[5] */
  63023. "ldr lr, [%[b], #20]\n\t"
  63024. "adc r11, %[r], #0\n\t"
  63025. "umlal r5, r11, r12, lr\n\t"
  63026. "adds r6, r6, r11\n\t"
  63027. /* A[5] * B[6] */
  63028. "ldr lr, [%[b], #24]\n\t"
  63029. "adc r11, %[r], #0\n\t"
  63030. "umlal r6, r11, r12, lr\n\t"
  63031. "adds r7, r7, r11\n\t"
  63032. /* A[5] * B[7] */
  63033. "ldr lr, [%[b], #28]\n\t"
  63034. "adc r8, %[r], #0\n\t"
  63035. "umlal r7, r8, r12, lr\n\t"
  63036. /* A[6] * B[0] */
  63037. "ldr r12, [%[a], #24]\n\t"
  63038. "ldr lr, [%[b]]\n\t"
  63039. "mov r11, #0\n\t"
  63040. "umlal r9, r11, r12, lr\n\t"
  63041. "str r9, [sp, #24]\n\t"
  63042. "adds r10, r10, r11\n\t"
  63043. /* A[6] * B[1] */
  63044. "ldr lr, [%[b], #4]\n\t"
  63045. "adc r11, %[r], #0\n\t"
  63046. "umlal r10, r11, r12, lr\n\t"
  63047. "adds r3, r3, r11\n\t"
  63048. /* A[6] * B[2] */
  63049. "ldr lr, [%[b], #8]\n\t"
  63050. "adc r11, %[r], #0\n\t"
  63051. "umlal r3, r11, r12, lr\n\t"
  63052. "adds r4, r4, r11\n\t"
  63053. /* A[6] * B[3] */
  63054. "ldr lr, [%[b], #12]\n\t"
  63055. "adc r11, %[r], #0\n\t"
  63056. "umlal r4, r11, r12, lr\n\t"
  63057. "adds r5, r5, r11\n\t"
  63058. /* A[6] * B[4] */
  63059. "ldr lr, [%[b], #16]\n\t"
  63060. "adc r11, %[r], #0\n\t"
  63061. "umlal r5, r11, r12, lr\n\t"
  63062. "adds r6, r6, r11\n\t"
  63063. /* A[6] * B[5] */
  63064. "ldr lr, [%[b], #20]\n\t"
  63065. "adc r11, %[r], #0\n\t"
  63066. "umlal r6, r11, r12, lr\n\t"
  63067. "adds r7, r7, r11\n\t"
  63068. /* A[6] * B[6] */
  63069. "ldr lr, [%[b], #24]\n\t"
  63070. "adc r11, %[r], #0\n\t"
  63071. "umlal r7, r11, r12, lr\n\t"
  63072. "adds r8, r8, r11\n\t"
  63073. /* A[6] * B[7] */
  63074. "ldr lr, [%[b], #28]\n\t"
  63075. "adc r9, %[r], #0\n\t"
  63076. "umlal r8, r9, r12, lr\n\t"
  63077. /* A[7] * B[0] */
  63078. "ldr r12, [%[a], #28]\n\t"
  63079. "ldr lr, [%[b]]\n\t"
  63080. "mov r11, #0\n\t"
  63081. "umlal r10, r11, r12, lr\n\t"
  63082. "str r10, [sp, #28]\n\t"
  63083. "adds r3, r3, r11\n\t"
  63084. /* A[7] * B[1] */
  63085. "ldr lr, [%[b], #4]\n\t"
  63086. "adc r11, %[r], #0\n\t"
  63087. "umlal r3, r11, r12, lr\n\t"
  63088. "adds r4, r4, r11\n\t"
  63089. /* A[7] * B[2] */
  63090. "ldr lr, [%[b], #8]\n\t"
  63091. "adc r11, %[r], #0\n\t"
  63092. "umlal r4, r11, r12, lr\n\t"
  63093. "adds r5, r5, r11\n\t"
  63094. /* A[7] * B[3] */
  63095. "ldr lr, [%[b], #12]\n\t"
  63096. "adc r11, %[r], #0\n\t"
  63097. "umlal r5, r11, r12, lr\n\t"
  63098. "adds r6, r6, r11\n\t"
  63099. /* A[7] * B[4] */
  63100. "ldr lr, [%[b], #16]\n\t"
  63101. "adc r11, %[r], #0\n\t"
  63102. "umlal r6, r11, r12, lr\n\t"
  63103. "adds r7, r7, r11\n\t"
  63104. /* A[7] * B[5] */
  63105. "ldr lr, [%[b], #20]\n\t"
  63106. "adc r11, %[r], #0\n\t"
  63107. "umlal r7, r11, r12, lr\n\t"
  63108. "adds r8, r8, r11\n\t"
  63109. /* A[7] * B[6] */
  63110. "ldr lr, [%[b], #24]\n\t"
  63111. "adc r11, %[r], #0\n\t"
  63112. "umlal r8, r11, r12, lr\n\t"
  63113. "adds r9, r9, r11\n\t"
  63114. /* A[7] * B[7] */
  63115. "ldr lr, [%[b], #28]\n\t"
  63116. "adc r10, %[r], #0\n\t"
  63117. "umlal r9, r10, r12, lr\n\t"
  63118. "ldr %[r], [sp, #32]\n\t"
  63119. "add %[r], %[r], #32\n\t"
  63120. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63121. "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63122. "sub %[r], %[r], #32\n\t"
  63123. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63124. "add sp, sp, #36\n\t"
  63125. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  63126. :
  63127. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  63128. );
  63129. }
  63130. #else
  63131. /* Multiply a and b into r. (r = a * b)
  63132. *
  63133. * r A single precision integer.
  63134. * a A single precision integer.
  63135. * b A single precision integer.
  63136. */
  63137. static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  63138. {
  63139. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  63140. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  63141. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  63142. __asm__ __volatile__ (
  63143. "sub sp, sp, #44\n\t"
  63144. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  63145. "str %[r], [sp, #36]\n\t"
  63146. "str %[a], [sp, #40]\n\t"
  63147. #else
  63148. "strd %[r], %[a], [sp, #36]\n\t"
  63149. #endif
  63150. "mov lr, %[b]\n\t"
  63151. "ldm %[a], {%[r], %[a], %[b], r3}\n\t"
  63152. "ldm lr!, {r4, r5, r6}\n\t"
  63153. "umull r10, r11, %[r], r4\n\t"
  63154. "umull r12, r7, %[a], r4\n\t"
  63155. "umaal r11, r12, %[r], r5\n\t"
  63156. "umull r8, r9, %[b], r4\n\t"
  63157. "umaal r12, r8, %[a], r5\n\t"
  63158. "umaal r12, r7, %[r], r6\n\t"
  63159. "umaal r8, r9, r3, r4\n\t"
  63160. "stm sp, {r10, r11, r12}\n\t"
  63161. "umaal r7, r8, %[b], r5\n\t"
  63162. "ldm lr!, {r4}\n\t"
  63163. "umull r10, r11, %[a], r6\n\t"
  63164. "umaal r8, r9, %[b], r6\n\t"
  63165. "umaal r7, r10, %[r], r4\n\t"
  63166. "umaal r8, r11, r3, r5\n\t"
  63167. "str r7, [sp, #12]\n\t"
  63168. "umaal r8, r10, %[a], r4\n\t"
  63169. "umaal r9, r11, r3, r6\n\t"
  63170. "umaal r9, r10, %[b], r4\n\t"
  63171. "umaal r10, r11, r3, r4\n\t"
  63172. "ldm lr, {r4, r5, r6, r7}\n\t"
  63173. "mov r12, #0\n\t"
  63174. "umlal r8, r12, %[r], r4\n\t"
  63175. "umaal r9, r12, %[a], r4\n\t"
  63176. "umaal r10, r12, %[b], r4\n\t"
  63177. "umaal r11, r12, r3, r4\n\t"
  63178. "mov r4, #0\n\t"
  63179. "umlal r9, r4, %[r], r5\n\t"
  63180. "umaal r10, r4, %[a], r5\n\t"
  63181. "umaal r11, r4, %[b], r5\n\t"
  63182. "umaal r12, r4, r3, r5\n\t"
  63183. "mov r5, #0\n\t"
  63184. "umlal r10, r5, %[r], r6\n\t"
  63185. "umaal r11, r5, %[a], r6\n\t"
  63186. "umaal r12, r5, %[b], r6\n\t"
  63187. "umaal r4, r5, r3, r6\n\t"
  63188. "mov r6, #0\n\t"
  63189. "umlal r11, r6, %[r], r7\n\t"
  63190. "ldr %[r], [sp, #40]\n\t"
  63191. "umaal r12, r6, %[a], r7\n\t"
  63192. "add %[r], %[r], #16\n\t"
  63193. "umaal r4, r6, %[b], r7\n\t"
  63194. "sub lr, lr, #16\n\t"
  63195. "umaal r5, r6, r3, r7\n\t"
  63196. "ldm %[r], {%[r], %[a], %[b], r3}\n\t"
  63197. "str r6, [sp, #32]\n\t"
  63198. "ldm lr!, {r6}\n\t"
  63199. "mov r7, #0\n\t"
  63200. "umlal r8, r7, %[r], r6\n\t"
  63201. "umaal r9, r7, %[a], r6\n\t"
  63202. "str r8, [sp, #16]\n\t"
  63203. "umaal r10, r7, %[b], r6\n\t"
  63204. "umaal r11, r7, r3, r6\n\t"
  63205. "ldm lr!, {r6}\n\t"
  63206. "mov r8, #0\n\t"
  63207. "umlal r9, r8, %[r], r6\n\t"
  63208. "umaal r10, r8, %[a], r6\n\t"
  63209. "str r9, [sp, #20]\n\t"
  63210. "umaal r11, r8, %[b], r6\n\t"
  63211. "umaal r12, r8, r3, r6\n\t"
  63212. "ldm lr!, {r6}\n\t"
  63213. "mov r9, #0\n\t"
  63214. "umlal r10, r9, %[r], r6\n\t"
  63215. "umaal r11, r9, %[a], r6\n\t"
  63216. "str r10, [sp, #24]\n\t"
  63217. "umaal r12, r9, %[b], r6\n\t"
  63218. "umaal r4, r9, r3, r6\n\t"
  63219. "ldm lr!, {r6}\n\t"
  63220. "mov r10, #0\n\t"
  63221. "umlal r11, r10, %[r], r6\n\t"
  63222. "umaal r12, r10, %[a], r6\n\t"
  63223. "str r11, [sp, #28]\n\t"
  63224. "umaal r4, r10, %[b], r6\n\t"
  63225. "umaal r5, r10, r3, r6\n\t"
  63226. "ldm lr!, {r11}\n\t"
  63227. "umaal r12, r7, %[r], r11\n\t"
  63228. "umaal r4, r7, %[a], r11\n\t"
  63229. "ldr r6, [sp, #32]\n\t"
  63230. "umaal r5, r7, %[b], r11\n\t"
  63231. "umaal r6, r7, r3, r11\n\t"
  63232. "ldm lr!, {r11}\n\t"
  63233. "umaal r4, r8, %[r], r11\n\t"
  63234. "umaal r5, r8, %[a], r11\n\t"
  63235. "umaal r6, r8, %[b], r11\n\t"
  63236. "umaal r7, r8, r3, r11\n\t"
  63237. "ldm lr, {r11, lr}\n\t"
  63238. "umaal r5, r9, %[r], r11\n\t"
  63239. "umaal r6, r10, %[r], lr\n\t"
  63240. "umaal r6, r9, %[a], r11\n\t"
  63241. "umaal r7, r10, %[a], lr\n\t"
  63242. "umaal r7, r9, %[b], r11\n\t"
  63243. "umaal r8, r10, %[b], lr\n\t"
  63244. "umaal r8, r9, r3, r11\n\t"
  63245. "umaal r9, r10, r3, lr\n\t"
  63246. "mov r3, r12\n\t"
  63247. "ldr lr, [sp, #36]\n\t"
  63248. "add lr, lr, #32\n\t"
  63249. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63250. "sub lr, lr, #32\n\t"
  63251. "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63252. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  63253. "add sp, sp, #44\n\t"
  63254. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  63255. :
  63256. : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc"
  63257. );
  63258. }
  63259. #endif
  63260. #endif /* WOLFSSL_SP_SMALL */
  63261. #ifdef WOLFSSL_SP_SMALL
  63262. /* Square a and put result in r. (r = a * a)
  63263. *
  63264. * r A single precision integer.
  63265. * a A single precision integer.
  63266. */
  63267. static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  63268. {
  63269. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  63270. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  63271. __asm__ __volatile__ (
  63272. "sub sp, sp, #0x40\n\t"
  63273. "ldr lr, [%[a]]\n\t"
  63274. "umull r8, r6, lr, lr\n\t"
  63275. "str r8, [sp]\n\t"
  63276. "mov r7, #0\n\t"
  63277. "mov r8, #0\n\t"
  63278. "mov r5, #4\n\t"
  63279. "\n"
  63280. "L_sp_256_sqr_8_outer_%=: \n\t"
  63281. "subs r3, r5, #28\n\t"
  63282. "it cc\n\t"
  63283. "movcc r3, #0\n\t"
  63284. "sub r4, r5, r3\n\t"
  63285. "\n"
  63286. "L_sp_256_sqr_8_inner_%=: \n\t"
  63287. "ldr lr, [%[a], r3]\n\t"
  63288. "ldr r11, [%[a], r4]\n\t"
  63289. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  63290. "lsl r9, lr, #16\n\t"
  63291. "lsl r10, r11, #16\n\t"
  63292. "lsr r9, r9, #16\n\t"
  63293. "lsr r10, r10, #16\n\t"
  63294. "mul r10, r9, r10\n\t"
  63295. "adds r6, r6, r10\n\t"
  63296. "adcs r7, r7, #0\n\t"
  63297. "adc r8, r8, #0\n\t"
  63298. "adds r6, r6, r10\n\t"
  63299. "adcs r7, r7, #0\n\t"
  63300. "adc r8, r8, #0\n\t"
  63301. "lsr r10, r11, #16\n\t"
  63302. "mul r9, r10, r9\n\t"
  63303. "lsr r10, r9, #16\n\t"
  63304. "lsl r9, r9, #16\n\t"
  63305. "adds r6, r6, r9\n\t"
  63306. "adcs r7, r7, r10\n\t"
  63307. "adc r8, r8, #0\n\t"
  63308. "adds r6, r6, r9\n\t"
  63309. "adcs r7, r7, r10\n\t"
  63310. "adc r8, r8, #0\n\t"
  63311. "lsr r9, lr, #16\n\t"
  63312. "lsr r10, r11, #16\n\t"
  63313. "mul r10, r9, r10\n\t"
  63314. "adds r7, r7, r10\n\t"
  63315. "adc r8, r8, #0\n\t"
  63316. "adds r7, r7, r10\n\t"
  63317. "adc r8, r8, #0\n\t"
  63318. "lsl r10, r11, #16\n\t"
  63319. "lsr r10, r10, #16\n\t"
  63320. "mul r9, r10, r9\n\t"
  63321. "lsr r10, r9, #16\n\t"
  63322. "lsl r9, r9, #16\n\t"
  63323. "adds r6, r6, r9\n\t"
  63324. "adcs r7, r7, r10\n\t"
  63325. "adc r8, r8, #0\n\t"
  63326. "adds r6, r6, r9\n\t"
  63327. "adcs r7, r7, r10\n\t"
  63328. "adc r8, r8, #0\n\t"
  63329. #else
  63330. "umull r9, r10, lr, r11\n\t"
  63331. "adds r6, r6, r9\n\t"
  63332. "adcs r7, r7, r10\n\t"
  63333. "adc r8, r8, #0\n\t"
  63334. "adds r6, r6, r9\n\t"
  63335. "adcs r7, r7, r10\n\t"
  63336. "adc r8, r8, #0\n\t"
  63337. #endif
  63338. "add r3, r3, #4\n\t"
  63339. "sub r4, r4, #4\n\t"
  63340. "cmp r3, r4\n\t"
  63341. "bgt L_sp_256_sqr_8_inner_done_%=\n\t"
  63342. "blt L_sp_256_sqr_8_inner_%=\n\t"
  63343. "ldr lr, [%[a], r3]\n\t"
  63344. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  63345. "lsl r9, lr, #16\n\t"
  63346. "lsr r10, lr, #16\n\t"
  63347. "lsr r9, r9, #16\n\t"
  63348. "mov r11, r9\n\t"
  63349. "mul r9, r11, r9\n\t"
  63350. "mov r11, r10\n\t"
  63351. "mul r10, r11, r10\n\t"
  63352. "adds r6, r6, r9\n\t"
  63353. "adcs r7, r7, r10\n\t"
  63354. "adc r8, r8, #0\n\t"
  63355. "lsr r10, lr, #16\n\t"
  63356. "lsl r9, lr, #16\n\t"
  63357. "lsr r9, r9, #16\n\t"
  63358. "mul r9, r10, r9\n\t"
  63359. "lsr r10, r9, #15\n\t"
  63360. "lsl r9, r9, #17\n\t"
  63361. "adds r6, r6, r9\n\t"
  63362. "adcs r7, r7, r10\n\t"
  63363. "adc r8, r8, #0\n\t"
  63364. #else
  63365. "umull r9, r10, lr, lr\n\t"
  63366. "adds r6, r6, r9\n\t"
  63367. "adcs r7, r7, r10\n\t"
  63368. "adc r8, r8, #0\n\t"
  63369. #endif
  63370. "\n"
  63371. "L_sp_256_sqr_8_inner_done_%=: \n\t"
  63372. "str r6, [sp, r5]\n\t"
  63373. "mov r6, r7\n\t"
  63374. "mov r7, r8\n\t"
  63375. "mov r8, #0\n\t"
  63376. "add r5, r5, #4\n\t"
  63377. "cmp r5, #52\n\t"
  63378. "ble L_sp_256_sqr_8_outer_%=\n\t"
  63379. "ldr lr, [%[a], #28]\n\t"
  63380. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  63381. "lsl r9, lr, #16\n\t"
  63382. "lsr r10, lr, #16\n\t"
  63383. "lsr r9, r9, #16\n\t"
  63384. "mov r11, r9\n\t"
  63385. "mul r9, r11, r9\n\t"
  63386. "mov r11, r10\n\t"
  63387. "mul r10, r11, r10\n\t"
  63388. "adds r6, r6, r9\n\t"
  63389. "adc r7, r7, r10\n\t"
  63390. "lsr r10, lr, #16\n\t"
  63391. "lsl r9, lr, #16\n\t"
  63392. "lsr r9, r9, #16\n\t"
  63393. "mul r9, r10, r9\n\t"
  63394. "lsr r10, r9, #15\n\t"
  63395. "lsl r9, r9, #17\n\t"
  63396. "adds r6, r6, r9\n\t"
  63397. "adc r7, r7, r10\n\t"
  63398. #else
  63399. "umull r9, r10, lr, lr\n\t"
  63400. "adds r6, r6, r9\n\t"
  63401. "adc r7, r7, r10\n\t"
  63402. #endif
  63403. "str r6, [sp, r5]\n\t"
  63404. "add r5, r5, #4\n\t"
  63405. "str r7, [sp, r5]\n\t"
  63406. "\n"
  63407. "L_sp_256_sqr_8_store_%=: \n\t"
  63408. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  63409. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  63410. "subs r5, r5, #32\n\t"
  63411. "bgt L_sp_256_sqr_8_store_%=\n\t"
  63412. : [r] "+r" (r), [a] "+r" (a)
  63413. :
  63414. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  63415. );
  63416. }
  63417. #else
  63418. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  63419. /* Square a and put result in r. (r = a * a)
  63420. *
  63421. * r A single precision integer.
  63422. * a A single precision integer.
  63423. */
  63424. static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  63425. {
  63426. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  63427. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  63428. __asm__ __volatile__ (
  63429. "sub sp, sp, #32\n\t"
  63430. /* A[0] * A[0] */
  63431. "ldr r10, [%[a]]\n\t"
  63432. "lsr r9, r10, #16\n\t"
  63433. "lsl r2, r10, #16\n\t"
  63434. "lsr r2, r2, #16\n\t"
  63435. "mul r8, r2, r2\n\t"
  63436. "mul r3, r9, r9\n\t"
  63437. "mul r2, r9, r2\n\t"
  63438. "lsr r9, r2, #15\n\t"
  63439. "lsl r2, r2, #17\n\t"
  63440. "adds r8, r8, r2\n\t"
  63441. "adc r3, r3, r9\n\t"
  63442. "mov r4, #0\n\t"
  63443. "str r8, [sp]\n\t"
  63444. /* A[0] * A[1] */
  63445. "ldr r10, [%[a], #4]\n\t"
  63446. "ldr r12, [%[a]]\n\t"
  63447. "lsl r8, r10, #16\n\t"
  63448. "lsl r9, r12, #16\n\t"
  63449. "lsr r8, r8, #16\n\t"
  63450. "lsr r9, r9, #16\n\t"
  63451. "mul r9, r8, r9\n\t"
  63452. "adds r3, r3, r9\n\t"
  63453. "adcs r4, r4, #0\n\t"
  63454. "mov r2, #0\n\t"
  63455. "adc r2, r2, #0\n\t"
  63456. "adds r3, r3, r9\n\t"
  63457. "adcs r4, r4, #0\n\t"
  63458. "adc r2, r2, #0\n\t"
  63459. "lsr r9, r12, #16\n\t"
  63460. "mul r8, r9, r8\n\t"
  63461. "lsr r9, r8, #16\n\t"
  63462. "lsl r8, r8, #16\n\t"
  63463. "adds r3, r3, r8\n\t"
  63464. "adcs r4, r4, r9\n\t"
  63465. "adc r2, r2, #0\n\t"
  63466. "adds r3, r3, r8\n\t"
  63467. "adcs r4, r4, r9\n\t"
  63468. "adc r2, r2, #0\n\t"
  63469. "lsr r8, r10, #16\n\t"
  63470. "lsr r9, r12, #16\n\t"
  63471. "mul r9, r8, r9\n\t"
  63472. "adds r4, r4, r9\n\t"
  63473. "adc r2, r2, #0\n\t"
  63474. "adds r4, r4, r9\n\t"
  63475. "adc r2, r2, #0\n\t"
  63476. "lsl r9, r12, #16\n\t"
  63477. "lsr r9, r9, #16\n\t"
  63478. "mul r8, r9, r8\n\t"
  63479. "lsr r9, r8, #16\n\t"
  63480. "lsl r8, r8, #16\n\t"
  63481. "adds r3, r3, r8\n\t"
  63482. "adcs r4, r4, r9\n\t"
  63483. "adc r2, r2, #0\n\t"
  63484. "adds r3, r3, r8\n\t"
  63485. "adcs r4, r4, r9\n\t"
  63486. "adc r2, r2, #0\n\t"
  63487. "str r3, [sp, #4]\n\t"
  63488. /* A[0] * A[2] */
  63489. "ldr r10, [%[a], #8]\n\t"
  63490. "ldr r12, [%[a]]\n\t"
  63491. "lsl r8, r10, #16\n\t"
  63492. "lsl r9, r12, #16\n\t"
  63493. "lsr r8, r8, #16\n\t"
  63494. "lsr r9, r9, #16\n\t"
  63495. "mul r9, r8, r9\n\t"
  63496. "adds r4, r4, r9\n\t"
  63497. "adcs r2, r2, #0\n\t"
  63498. "mov r3, #0\n\t"
  63499. "adc r3, r3, #0\n\t"
  63500. "adds r4, r4, r9\n\t"
  63501. "adcs r2, r2, #0\n\t"
  63502. "adc r3, r3, #0\n\t"
  63503. "lsr r9, r12, #16\n\t"
  63504. "mul r8, r9, r8\n\t"
  63505. "lsr r9, r8, #16\n\t"
  63506. "lsl r8, r8, #16\n\t"
  63507. "adds r4, r4, r8\n\t"
  63508. "adcs r2, r2, r9\n\t"
  63509. "adc r3, r3, #0\n\t"
  63510. "adds r4, r4, r8\n\t"
  63511. "adcs r2, r2, r9\n\t"
  63512. "adc r3, r3, #0\n\t"
  63513. "lsr r8, r10, #16\n\t"
  63514. "lsr r9, r12, #16\n\t"
  63515. "mul r9, r8, r9\n\t"
  63516. "adds r2, r2, r9\n\t"
  63517. "adc r3, r3, #0\n\t"
  63518. "adds r2, r2, r9\n\t"
  63519. "adc r3, r3, #0\n\t"
  63520. "lsl r9, r12, #16\n\t"
  63521. "lsr r9, r9, #16\n\t"
  63522. "mul r8, r9, r8\n\t"
  63523. "lsr r9, r8, #16\n\t"
  63524. "lsl r8, r8, #16\n\t"
  63525. "adds r4, r4, r8\n\t"
  63526. "adcs r2, r2, r9\n\t"
  63527. "adc r3, r3, #0\n\t"
  63528. "adds r4, r4, r8\n\t"
  63529. "adcs r2, r2, r9\n\t"
  63530. "adc r3, r3, #0\n\t"
  63531. /* A[1] * A[1] */
  63532. "ldr r10, [%[a], #4]\n\t"
  63533. "lsl r8, r10, #16\n\t"
  63534. "lsr r9, r10, #16\n\t"
  63535. "lsr r8, r8, #16\n\t"
  63536. "mov r12, r8\n\t"
  63537. "mul r8, r12, r8\n\t"
  63538. "mov r12, r9\n\t"
  63539. "mul r9, r12, r9\n\t"
  63540. "adds r4, r4, r8\n\t"
  63541. "adcs r2, r2, r9\n\t"
  63542. "adc r3, r3, #0\n\t"
  63543. "lsr r9, r10, #16\n\t"
  63544. "lsl r8, r10, #16\n\t"
  63545. "lsr r8, r8, #16\n\t"
  63546. "mul r8, r9, r8\n\t"
  63547. "lsr r9, r8, #15\n\t"
  63548. "lsl r8, r8, #17\n\t"
  63549. "adds r4, r4, r8\n\t"
  63550. "adcs r2, r2, r9\n\t"
  63551. "adc r3, r3, #0\n\t"
  63552. "str r4, [sp, #8]\n\t"
  63553. /* A[0] * A[3] */
  63554. "ldr r10, [%[a], #12]\n\t"
  63555. "ldr r12, [%[a]]\n\t"
  63556. "lsl r8, r10, #16\n\t"
  63557. "lsl r9, r12, #16\n\t"
  63558. "lsr r8, r8, #16\n\t"
  63559. "lsr r9, r9, #16\n\t"
  63560. "mul r9, r8, r9\n\t"
  63561. "adds r2, r2, r9\n\t"
  63562. "adcs r3, r3, #0\n\t"
  63563. "mov r4, #0\n\t"
  63564. "adc r4, r4, #0\n\t"
  63565. "adds r2, r2, r9\n\t"
  63566. "adcs r3, r3, #0\n\t"
  63567. "adc r4, r4, #0\n\t"
  63568. "lsr r9, r12, #16\n\t"
  63569. "mul r8, r9, r8\n\t"
  63570. "lsr r9, r8, #16\n\t"
  63571. "lsl r8, r8, #16\n\t"
  63572. "adds r2, r2, r8\n\t"
  63573. "adcs r3, r3, r9\n\t"
  63574. "adc r4, r4, #0\n\t"
  63575. "adds r2, r2, r8\n\t"
  63576. "adcs r3, r3, r9\n\t"
  63577. "adc r4, r4, #0\n\t"
  63578. "lsr r8, r10, #16\n\t"
  63579. "lsr r9, r12, #16\n\t"
  63580. "mul r9, r8, r9\n\t"
  63581. "adds r3, r3, r9\n\t"
  63582. "adc r4, r4, #0\n\t"
  63583. "adds r3, r3, r9\n\t"
  63584. "adc r4, r4, #0\n\t"
  63585. "lsl r9, r12, #16\n\t"
  63586. "lsr r9, r9, #16\n\t"
  63587. "mul r8, r9, r8\n\t"
  63588. "lsr r9, r8, #16\n\t"
  63589. "lsl r8, r8, #16\n\t"
  63590. "adds r2, r2, r8\n\t"
  63591. "adcs r3, r3, r9\n\t"
  63592. "adc r4, r4, #0\n\t"
  63593. "adds r2, r2, r8\n\t"
  63594. "adcs r3, r3, r9\n\t"
  63595. "adc r4, r4, #0\n\t"
  63596. /* A[1] * A[2] */
  63597. "ldr r10, [%[a], #8]\n\t"
  63598. "ldr r12, [%[a], #4]\n\t"
  63599. "lsl r8, r10, #16\n\t"
  63600. "lsl r9, r12, #16\n\t"
  63601. "lsr r8, r8, #16\n\t"
  63602. "lsr r9, r9, #16\n\t"
  63603. "mul r9, r8, r9\n\t"
  63604. "adds r2, r2, r9\n\t"
  63605. "adcs r3, r3, #0\n\t"
  63606. "adc r4, r4, #0\n\t"
  63607. "adds r2, r2, r9\n\t"
  63608. "adcs r3, r3, #0\n\t"
  63609. "adc r4, r4, #0\n\t"
  63610. "lsr r9, r12, #16\n\t"
  63611. "mul r8, r9, r8\n\t"
  63612. "lsr r9, r8, #16\n\t"
  63613. "lsl r8, r8, #16\n\t"
  63614. "adds r2, r2, r8\n\t"
  63615. "adcs r3, r3, r9\n\t"
  63616. "adc r4, r4, #0\n\t"
  63617. "adds r2, r2, r8\n\t"
  63618. "adcs r3, r3, r9\n\t"
  63619. "adc r4, r4, #0\n\t"
  63620. "lsr r8, r10, #16\n\t"
  63621. "lsr r9, r12, #16\n\t"
  63622. "mul r9, r8, r9\n\t"
  63623. "adds r3, r3, r9\n\t"
  63624. "adc r4, r4, #0\n\t"
  63625. "adds r3, r3, r9\n\t"
  63626. "adc r4, r4, #0\n\t"
  63627. "lsl r9, r12, #16\n\t"
  63628. "lsr r9, r9, #16\n\t"
  63629. "mul r8, r9, r8\n\t"
  63630. "lsr r9, r8, #16\n\t"
  63631. "lsl r8, r8, #16\n\t"
  63632. "adds r2, r2, r8\n\t"
  63633. "adcs r3, r3, r9\n\t"
  63634. "adc r4, r4, #0\n\t"
  63635. "adds r2, r2, r8\n\t"
  63636. "adcs r3, r3, r9\n\t"
  63637. "adc r4, r4, #0\n\t"
  63638. "str r2, [sp, #12]\n\t"
  63639. /* A[0] * A[4] */
  63640. "ldr r10, [%[a], #16]\n\t"
  63641. "ldr r12, [%[a]]\n\t"
  63642. "lsl r8, r10, #16\n\t"
  63643. "lsl r9, r12, #16\n\t"
  63644. "lsr r8, r8, #16\n\t"
  63645. "lsr r9, r9, #16\n\t"
  63646. "mul r9, r8, r9\n\t"
  63647. "adds r3, r3, r9\n\t"
  63648. "adcs r4, r4, #0\n\t"
  63649. "mov r2, #0\n\t"
  63650. "adc r2, r2, #0\n\t"
  63651. "adds r3, r3, r9\n\t"
  63652. "adcs r4, r4, #0\n\t"
  63653. "adc r2, r2, #0\n\t"
  63654. "lsr r9, r12, #16\n\t"
  63655. "mul r8, r9, r8\n\t"
  63656. "lsr r9, r8, #16\n\t"
  63657. "lsl r8, r8, #16\n\t"
  63658. "adds r3, r3, r8\n\t"
  63659. "adcs r4, r4, r9\n\t"
  63660. "adc r2, r2, #0\n\t"
  63661. "adds r3, r3, r8\n\t"
  63662. "adcs r4, r4, r9\n\t"
  63663. "adc r2, r2, #0\n\t"
  63664. "lsr r8, r10, #16\n\t"
  63665. "lsr r9, r12, #16\n\t"
  63666. "mul r9, r8, r9\n\t"
  63667. "adds r4, r4, r9\n\t"
  63668. "adc r2, r2, #0\n\t"
  63669. "adds r4, r4, r9\n\t"
  63670. "adc r2, r2, #0\n\t"
  63671. "lsl r9, r12, #16\n\t"
  63672. "lsr r9, r9, #16\n\t"
  63673. "mul r8, r9, r8\n\t"
  63674. "lsr r9, r8, #16\n\t"
  63675. "lsl r8, r8, #16\n\t"
  63676. "adds r3, r3, r8\n\t"
  63677. "adcs r4, r4, r9\n\t"
  63678. "adc r2, r2, #0\n\t"
  63679. "adds r3, r3, r8\n\t"
  63680. "adcs r4, r4, r9\n\t"
  63681. "adc r2, r2, #0\n\t"
  63682. /* A[1] * A[3] */
  63683. "ldr r10, [%[a], #12]\n\t"
  63684. "ldr r12, [%[a], #4]\n\t"
  63685. "lsl r8, r10, #16\n\t"
  63686. "lsl r9, r12, #16\n\t"
  63687. "lsr r8, r8, #16\n\t"
  63688. "lsr r9, r9, #16\n\t"
  63689. "mul r9, r8, r9\n\t"
  63690. "adds r3, r3, r9\n\t"
  63691. "adcs r4, r4, #0\n\t"
  63692. "adc r2, r2, #0\n\t"
  63693. "adds r3, r3, r9\n\t"
  63694. "adcs r4, r4, #0\n\t"
  63695. "adc r2, r2, #0\n\t"
  63696. "lsr r9, r12, #16\n\t"
  63697. "mul r8, r9, r8\n\t"
  63698. "lsr r9, r8, #16\n\t"
  63699. "lsl r8, r8, #16\n\t"
  63700. "adds r3, r3, r8\n\t"
  63701. "adcs r4, r4, r9\n\t"
  63702. "adc r2, r2, #0\n\t"
  63703. "adds r3, r3, r8\n\t"
  63704. "adcs r4, r4, r9\n\t"
  63705. "adc r2, r2, #0\n\t"
  63706. "lsr r8, r10, #16\n\t"
  63707. "lsr r9, r12, #16\n\t"
  63708. "mul r9, r8, r9\n\t"
  63709. "adds r4, r4, r9\n\t"
  63710. "adc r2, r2, #0\n\t"
  63711. "adds r4, r4, r9\n\t"
  63712. "adc r2, r2, #0\n\t"
  63713. "lsl r9, r12, #16\n\t"
  63714. "lsr r9, r9, #16\n\t"
  63715. "mul r8, r9, r8\n\t"
  63716. "lsr r9, r8, #16\n\t"
  63717. "lsl r8, r8, #16\n\t"
  63718. "adds r3, r3, r8\n\t"
  63719. "adcs r4, r4, r9\n\t"
  63720. "adc r2, r2, #0\n\t"
  63721. "adds r3, r3, r8\n\t"
  63722. "adcs r4, r4, r9\n\t"
  63723. "adc r2, r2, #0\n\t"
  63724. /* A[2] * A[2] */
  63725. "ldr r10, [%[a], #8]\n\t"
  63726. "lsl r8, r10, #16\n\t"
  63727. "lsr r9, r10, #16\n\t"
  63728. "lsr r8, r8, #16\n\t"
  63729. "mov r12, r8\n\t"
  63730. "mul r8, r12, r8\n\t"
  63731. "mov r12, r9\n\t"
  63732. "mul r9, r12, r9\n\t"
  63733. "adds r3, r3, r8\n\t"
  63734. "adcs r4, r4, r9\n\t"
  63735. "adc r2, r2, #0\n\t"
  63736. "lsr r9, r10, #16\n\t"
  63737. "lsl r8, r10, #16\n\t"
  63738. "lsr r8, r8, #16\n\t"
  63739. "mul r8, r9, r8\n\t"
  63740. "lsr r9, r8, #15\n\t"
  63741. "lsl r8, r8, #17\n\t"
  63742. "adds r3, r3, r8\n\t"
  63743. "adcs r4, r4, r9\n\t"
  63744. "adc r2, r2, #0\n\t"
  63745. "str r3, [sp, #16]\n\t"
  63746. /* A[0] * A[5] */
  63747. "ldr r10, [%[a], #20]\n\t"
  63748. "ldr r12, [%[a]]\n\t"
  63749. "lsl r8, r10, #16\n\t"
  63750. "lsl r5, r12, #16\n\t"
  63751. "lsr r8, r8, #16\n\t"
  63752. "lsr r5, r5, #16\n\t"
  63753. "mul r5, r8, r5\n\t"
  63754. "lsr r9, r12, #16\n\t"
  63755. "mul r8, r9, r8\n\t"
  63756. "lsr r6, r8, #16\n\t"
  63757. "lsl r8, r8, #16\n\t"
  63758. "adds r5, r5, r8\n\t"
  63759. "adc r6, r6, #0\n\t"
  63760. "lsr r8, r10, #16\n\t"
  63761. "mul r9, r8, r9\n\t"
  63762. "add r6, r6, r9\n\t"
  63763. "lsl r9, r12, #16\n\t"
  63764. "lsr r9, r9, #16\n\t"
  63765. "mul r8, r9, r8\n\t"
  63766. "lsr r9, r8, #16\n\t"
  63767. "lsl r8, r8, #16\n\t"
  63768. "adds r5, r5, r8\n\t"
  63769. "adc r6, r6, r9\n\t"
  63770. "mov r3, #0\n\t"
  63771. "mov r7, #0\n\t"
  63772. /* A[1] * A[4] */
  63773. "ldr r10, [%[a], #16]\n\t"
  63774. "ldr r12, [%[a], #4]\n\t"
  63775. "lsl r8, r10, #16\n\t"
  63776. "lsl r9, r12, #16\n\t"
  63777. "lsr r8, r8, #16\n\t"
  63778. "lsr r9, r9, #16\n\t"
  63779. "mul r9, r8, r9\n\t"
  63780. "adds r5, r5, r9\n\t"
  63781. "adcs r6, r6, #0\n\t"
  63782. "adc r7, r7, #0\n\t"
  63783. "lsr r9, r12, #16\n\t"
  63784. "mul r8, r9, r8\n\t"
  63785. "lsr r9, r8, #16\n\t"
  63786. "lsl r8, r8, #16\n\t"
  63787. "adds r5, r5, r8\n\t"
  63788. "adcs r6, r6, r9\n\t"
  63789. "adc r7, r7, #0\n\t"
  63790. "lsr r8, r10, #16\n\t"
  63791. "lsr r9, r12, #16\n\t"
  63792. "mul r9, r8, r9\n\t"
  63793. "adds r6, r6, r9\n\t"
  63794. "adc r7, r7, #0\n\t"
  63795. "lsl r9, r12, #16\n\t"
  63796. "lsr r9, r9, #16\n\t"
  63797. "mul r8, r9, r8\n\t"
  63798. "lsr r9, r8, #16\n\t"
  63799. "lsl r8, r8, #16\n\t"
  63800. "adds r5, r5, r8\n\t"
  63801. "adcs r6, r6, r9\n\t"
  63802. "adc r7, r7, #0\n\t"
  63803. /* A[2] * A[3] */
  63804. "ldr r10, [%[a], #12]\n\t"
  63805. "ldr r12, [%[a], #8]\n\t"
  63806. "lsl r8, r10, #16\n\t"
  63807. "lsl r9, r12, #16\n\t"
  63808. "lsr r8, r8, #16\n\t"
  63809. "lsr r9, r9, #16\n\t"
  63810. "mul r9, r8, r9\n\t"
  63811. "adds r5, r5, r9\n\t"
  63812. "adcs r6, r6, #0\n\t"
  63813. "adc r7, r7, #0\n\t"
  63814. "lsr r9, r12, #16\n\t"
  63815. "mul r8, r9, r8\n\t"
  63816. "lsr r9, r8, #16\n\t"
  63817. "lsl r8, r8, #16\n\t"
  63818. "adds r5, r5, r8\n\t"
  63819. "adcs r6, r6, r9\n\t"
  63820. "adc r7, r7, #0\n\t"
  63821. "lsr r8, r10, #16\n\t"
  63822. "lsr r9, r12, #16\n\t"
  63823. "mul r9, r8, r9\n\t"
  63824. "adds r6, r6, r9\n\t"
  63825. "adc r7, r7, #0\n\t"
  63826. "lsl r9, r12, #16\n\t"
  63827. "lsr r9, r9, #16\n\t"
  63828. "mul r8, r9, r8\n\t"
  63829. "lsr r9, r8, #16\n\t"
  63830. "lsl r8, r8, #16\n\t"
  63831. "adds r5, r5, r8\n\t"
  63832. "adcs r6, r6, r9\n\t"
  63833. "adc r7, r7, #0\n\t"
  63834. "adds r5, r5, r5\n\t"
  63835. "adcs r6, r6, r6\n\t"
  63836. "adc r7, r7, r7\n\t"
  63837. "adds r4, r4, r5\n\t"
  63838. "adcs r2, r2, r6\n\t"
  63839. "adc r3, r3, r7\n\t"
  63840. "str r4, [sp, #20]\n\t"
  63841. /* A[0] * A[6] */
  63842. "ldr r10, [%[a], #24]\n\t"
  63843. "ldr r12, [%[a]]\n\t"
  63844. "lsl r8, r10, #16\n\t"
  63845. "lsl r5, r12, #16\n\t"
  63846. "lsr r8, r8, #16\n\t"
  63847. "lsr r5, r5, #16\n\t"
  63848. "mul r5, r8, r5\n\t"
  63849. "lsr r9, r12, #16\n\t"
  63850. "mul r8, r9, r8\n\t"
  63851. "lsr r6, r8, #16\n\t"
  63852. "lsl r8, r8, #16\n\t"
  63853. "adds r5, r5, r8\n\t"
  63854. "adc r6, r6, #0\n\t"
  63855. "lsr r8, r10, #16\n\t"
  63856. "mul r9, r8, r9\n\t"
  63857. "add r6, r6, r9\n\t"
  63858. "lsl r9, r12, #16\n\t"
  63859. "lsr r9, r9, #16\n\t"
  63860. "mul r8, r9, r8\n\t"
  63861. "lsr r9, r8, #16\n\t"
  63862. "lsl r8, r8, #16\n\t"
  63863. "adds r5, r5, r8\n\t"
  63864. "adc r6, r6, r9\n\t"
  63865. "mov r4, #0\n\t"
  63866. "mov r7, #0\n\t"
  63867. /* A[1] * A[5] */
  63868. "ldr r10, [%[a], #20]\n\t"
  63869. "ldr r12, [%[a], #4]\n\t"
  63870. "lsl r8, r10, #16\n\t"
  63871. "lsl r9, r12, #16\n\t"
  63872. "lsr r8, r8, #16\n\t"
  63873. "lsr r9, r9, #16\n\t"
  63874. "mul r9, r8, r9\n\t"
  63875. "adds r5, r5, r9\n\t"
  63876. "adcs r6, r6, #0\n\t"
  63877. "adc r7, r7, #0\n\t"
  63878. "lsr r9, r12, #16\n\t"
  63879. "mul r8, r9, r8\n\t"
  63880. "lsr r9, r8, #16\n\t"
  63881. "lsl r8, r8, #16\n\t"
  63882. "adds r5, r5, r8\n\t"
  63883. "adcs r6, r6, r9\n\t"
  63884. "adc r7, r7, #0\n\t"
  63885. "lsr r8, r10, #16\n\t"
  63886. "lsr r9, r12, #16\n\t"
  63887. "mul r9, r8, r9\n\t"
  63888. "adds r6, r6, r9\n\t"
  63889. "adc r7, r7, #0\n\t"
  63890. "lsl r9, r12, #16\n\t"
  63891. "lsr r9, r9, #16\n\t"
  63892. "mul r8, r9, r8\n\t"
  63893. "lsr r9, r8, #16\n\t"
  63894. "lsl r8, r8, #16\n\t"
  63895. "adds r5, r5, r8\n\t"
  63896. "adcs r6, r6, r9\n\t"
  63897. "adc r7, r7, #0\n\t"
  63898. /* A[2] * A[4] */
  63899. "ldr r10, [%[a], #16]\n\t"
  63900. "ldr r12, [%[a], #8]\n\t"
  63901. "lsl r8, r10, #16\n\t"
  63902. "lsl r9, r12, #16\n\t"
  63903. "lsr r8, r8, #16\n\t"
  63904. "lsr r9, r9, #16\n\t"
  63905. "mul r9, r8, r9\n\t"
  63906. "adds r5, r5, r9\n\t"
  63907. "adcs r6, r6, #0\n\t"
  63908. "adc r7, r7, #0\n\t"
  63909. "lsr r9, r12, #16\n\t"
  63910. "mul r8, r9, r8\n\t"
  63911. "lsr r9, r8, #16\n\t"
  63912. "lsl r8, r8, #16\n\t"
  63913. "adds r5, r5, r8\n\t"
  63914. "adcs r6, r6, r9\n\t"
  63915. "adc r7, r7, #0\n\t"
  63916. "lsr r8, r10, #16\n\t"
  63917. "lsr r9, r12, #16\n\t"
  63918. "mul r9, r8, r9\n\t"
  63919. "adds r6, r6, r9\n\t"
  63920. "adc r7, r7, #0\n\t"
  63921. "lsl r9, r12, #16\n\t"
  63922. "lsr r9, r9, #16\n\t"
  63923. "mul r8, r9, r8\n\t"
  63924. "lsr r9, r8, #16\n\t"
  63925. "lsl r8, r8, #16\n\t"
  63926. "adds r5, r5, r8\n\t"
  63927. "adcs r6, r6, r9\n\t"
  63928. "adc r7, r7, #0\n\t"
  63929. /* A[3] * A[3] */
  63930. "ldr r10, [%[a], #12]\n\t"
  63931. "lsl r8, r10, #16\n\t"
  63932. "lsr r9, r10, #16\n\t"
  63933. "lsr r8, r8, #16\n\t"
  63934. "mov r12, r8\n\t"
  63935. "mul r8, r12, r8\n\t"
  63936. "mov r12, r9\n\t"
  63937. "mul r9, r12, r9\n\t"
  63938. "adds r2, r2, r8\n\t"
  63939. "adcs r3, r3, r9\n\t"
  63940. "adc r4, r4, #0\n\t"
  63941. "lsr r9, r10, #16\n\t"
  63942. "lsl r8, r10, #16\n\t"
  63943. "lsr r8, r8, #16\n\t"
  63944. "mul r8, r9, r8\n\t"
  63945. "lsr r9, r8, #15\n\t"
  63946. "lsl r8, r8, #17\n\t"
  63947. "adds r2, r2, r8\n\t"
  63948. "adcs r3, r3, r9\n\t"
  63949. "adc r4, r4, #0\n\t"
  63950. "adds r5, r5, r5\n\t"
  63951. "adcs r6, r6, r6\n\t"
  63952. "adc r7, r7, r7\n\t"
  63953. "adds r2, r2, r5\n\t"
  63954. "adcs r3, r3, r6\n\t"
  63955. "adc r4, r4, r7\n\t"
  63956. "str r2, [sp, #24]\n\t"
  63957. /* A[0] * A[7] */
  63958. "ldr r10, [%[a], #28]\n\t"
  63959. "ldr r12, [%[a]]\n\t"
  63960. "lsl r8, r10, #16\n\t"
  63961. "lsl r5, r12, #16\n\t"
  63962. "lsr r8, r8, #16\n\t"
  63963. "lsr r5, r5, #16\n\t"
  63964. "mul r5, r8, r5\n\t"
  63965. "lsr r9, r12, #16\n\t"
  63966. "mul r8, r9, r8\n\t"
  63967. "lsr r6, r8, #16\n\t"
  63968. "lsl r8, r8, #16\n\t"
  63969. "adds r5, r5, r8\n\t"
  63970. "adc r6, r6, #0\n\t"
  63971. "lsr r8, r10, #16\n\t"
  63972. "mul r9, r8, r9\n\t"
  63973. "add r6, r6, r9\n\t"
  63974. "lsl r9, r12, #16\n\t"
  63975. "lsr r9, r9, #16\n\t"
  63976. "mul r8, r9, r8\n\t"
  63977. "lsr r9, r8, #16\n\t"
  63978. "lsl r8, r8, #16\n\t"
  63979. "adds r5, r5, r8\n\t"
  63980. "adc r6, r6, r9\n\t"
  63981. "mov r2, #0\n\t"
  63982. "mov r7, #0\n\t"
  63983. /* A[1] * A[6] */
  63984. "ldr r10, [%[a], #24]\n\t"
  63985. "ldr r12, [%[a], #4]\n\t"
  63986. "lsl r8, r10, #16\n\t"
  63987. "lsl r9, r12, #16\n\t"
  63988. "lsr r8, r8, #16\n\t"
  63989. "lsr r9, r9, #16\n\t"
  63990. "mul r9, r8, r9\n\t"
  63991. "adds r5, r5, r9\n\t"
  63992. "adcs r6, r6, #0\n\t"
  63993. "adc r7, r7, #0\n\t"
  63994. "lsr r9, r12, #16\n\t"
  63995. "mul r8, r9, r8\n\t"
  63996. "lsr r9, r8, #16\n\t"
  63997. "lsl r8, r8, #16\n\t"
  63998. "adds r5, r5, r8\n\t"
  63999. "adcs r6, r6, r9\n\t"
  64000. "adc r7, r7, #0\n\t"
  64001. "lsr r8, r10, #16\n\t"
  64002. "lsr r9, r12, #16\n\t"
  64003. "mul r9, r8, r9\n\t"
  64004. "adds r6, r6, r9\n\t"
  64005. "adc r7, r7, #0\n\t"
  64006. "lsl r9, r12, #16\n\t"
  64007. "lsr r9, r9, #16\n\t"
  64008. "mul r8, r9, r8\n\t"
  64009. "lsr r9, r8, #16\n\t"
  64010. "lsl r8, r8, #16\n\t"
  64011. "adds r5, r5, r8\n\t"
  64012. "adcs r6, r6, r9\n\t"
  64013. "adc r7, r7, #0\n\t"
  64014. /* A[2] * A[5] */
  64015. "ldr r10, [%[a], #20]\n\t"
  64016. "ldr r12, [%[a], #8]\n\t"
  64017. "lsl r8, r10, #16\n\t"
  64018. "lsl r9, r12, #16\n\t"
  64019. "lsr r8, r8, #16\n\t"
  64020. "lsr r9, r9, #16\n\t"
  64021. "mul r9, r8, r9\n\t"
  64022. "adds r5, r5, r9\n\t"
  64023. "adcs r6, r6, #0\n\t"
  64024. "adc r7, r7, #0\n\t"
  64025. "lsr r9, r12, #16\n\t"
  64026. "mul r8, r9, r8\n\t"
  64027. "lsr r9, r8, #16\n\t"
  64028. "lsl r8, r8, #16\n\t"
  64029. "adds r5, r5, r8\n\t"
  64030. "adcs r6, r6, r9\n\t"
  64031. "adc r7, r7, #0\n\t"
  64032. "lsr r8, r10, #16\n\t"
  64033. "lsr r9, r12, #16\n\t"
  64034. "mul r9, r8, r9\n\t"
  64035. "adds r6, r6, r9\n\t"
  64036. "adc r7, r7, #0\n\t"
  64037. "lsl r9, r12, #16\n\t"
  64038. "lsr r9, r9, #16\n\t"
  64039. "mul r8, r9, r8\n\t"
  64040. "lsr r9, r8, #16\n\t"
  64041. "lsl r8, r8, #16\n\t"
  64042. "adds r5, r5, r8\n\t"
  64043. "adcs r6, r6, r9\n\t"
  64044. "adc r7, r7, #0\n\t"
  64045. /* A[3] * A[4] */
  64046. "ldr r10, [%[a], #16]\n\t"
  64047. "ldr r12, [%[a], #12]\n\t"
  64048. "lsl r8, r10, #16\n\t"
  64049. "lsl r9, r12, #16\n\t"
  64050. "lsr r8, r8, #16\n\t"
  64051. "lsr r9, r9, #16\n\t"
  64052. "mul r9, r8, r9\n\t"
  64053. "adds r5, r5, r9\n\t"
  64054. "adcs r6, r6, #0\n\t"
  64055. "adc r7, r7, #0\n\t"
  64056. "lsr r9, r12, #16\n\t"
  64057. "mul r8, r9, r8\n\t"
  64058. "lsr r9, r8, #16\n\t"
  64059. "lsl r8, r8, #16\n\t"
  64060. "adds r5, r5, r8\n\t"
  64061. "adcs r6, r6, r9\n\t"
  64062. "adc r7, r7, #0\n\t"
  64063. "lsr r8, r10, #16\n\t"
  64064. "lsr r9, r12, #16\n\t"
  64065. "mul r9, r8, r9\n\t"
  64066. "adds r6, r6, r9\n\t"
  64067. "adc r7, r7, #0\n\t"
  64068. "lsl r9, r12, #16\n\t"
  64069. "lsr r9, r9, #16\n\t"
  64070. "mul r8, r9, r8\n\t"
  64071. "lsr r9, r8, #16\n\t"
  64072. "lsl r8, r8, #16\n\t"
  64073. "adds r5, r5, r8\n\t"
  64074. "adcs r6, r6, r9\n\t"
  64075. "adc r7, r7, #0\n\t"
  64076. "adds r5, r5, r5\n\t"
  64077. "adcs r6, r6, r6\n\t"
  64078. "adc r7, r7, r7\n\t"
  64079. "adds r3, r3, r5\n\t"
  64080. "adcs r4, r4, r6\n\t"
  64081. "adc r2, r2, r7\n\t"
  64082. "str r3, [sp, #28]\n\t"
  64083. /* A[1] * A[7] */
  64084. "ldr r10, [%[a], #28]\n\t"
  64085. "ldr r12, [%[a], #4]\n\t"
  64086. "lsl r8, r10, #16\n\t"
  64087. "lsl r5, r12, #16\n\t"
  64088. "lsr r8, r8, #16\n\t"
  64089. "lsr r5, r5, #16\n\t"
  64090. "mul r5, r8, r5\n\t"
  64091. "lsr r9, r12, #16\n\t"
  64092. "mul r8, r9, r8\n\t"
  64093. "lsr r6, r8, #16\n\t"
  64094. "lsl r8, r8, #16\n\t"
  64095. "adds r5, r5, r8\n\t"
  64096. "adc r6, r6, #0\n\t"
  64097. "lsr r8, r10, #16\n\t"
  64098. "mul r9, r8, r9\n\t"
  64099. "add r6, r6, r9\n\t"
  64100. "lsl r9, r12, #16\n\t"
  64101. "lsr r9, r9, #16\n\t"
  64102. "mul r8, r9, r8\n\t"
  64103. "lsr r9, r8, #16\n\t"
  64104. "lsl r8, r8, #16\n\t"
  64105. "adds r5, r5, r8\n\t"
  64106. "adc r6, r6, r9\n\t"
  64107. "mov r3, #0\n\t"
  64108. "mov r7, #0\n\t"
  64109. /* A[2] * A[6] */
  64110. "ldr r10, [%[a], #24]\n\t"
  64111. "ldr r12, [%[a], #8]\n\t"
  64112. "lsl r8, r10, #16\n\t"
  64113. "lsl r9, r12, #16\n\t"
  64114. "lsr r8, r8, #16\n\t"
  64115. "lsr r9, r9, #16\n\t"
  64116. "mul r9, r8, r9\n\t"
  64117. "adds r5, r5, r9\n\t"
  64118. "adcs r6, r6, #0\n\t"
  64119. "adc r7, r7, #0\n\t"
  64120. "lsr r9, r12, #16\n\t"
  64121. "mul r8, r9, r8\n\t"
  64122. "lsr r9, r8, #16\n\t"
  64123. "lsl r8, r8, #16\n\t"
  64124. "adds r5, r5, r8\n\t"
  64125. "adcs r6, r6, r9\n\t"
  64126. "adc r7, r7, #0\n\t"
  64127. "lsr r8, r10, #16\n\t"
  64128. "lsr r9, r12, #16\n\t"
  64129. "mul r9, r8, r9\n\t"
  64130. "adds r6, r6, r9\n\t"
  64131. "adc r7, r7, #0\n\t"
  64132. "lsl r9, r12, #16\n\t"
  64133. "lsr r9, r9, #16\n\t"
  64134. "mul r8, r9, r8\n\t"
  64135. "lsr r9, r8, #16\n\t"
  64136. "lsl r8, r8, #16\n\t"
  64137. "adds r5, r5, r8\n\t"
  64138. "adcs r6, r6, r9\n\t"
  64139. "adc r7, r7, #0\n\t"
  64140. /* A[3] * A[5] */
  64141. "ldr r10, [%[a], #20]\n\t"
  64142. "ldr r12, [%[a], #12]\n\t"
  64143. "lsl r8, r10, #16\n\t"
  64144. "lsl r9, r12, #16\n\t"
  64145. "lsr r8, r8, #16\n\t"
  64146. "lsr r9, r9, #16\n\t"
  64147. "mul r9, r8, r9\n\t"
  64148. "adds r5, r5, r9\n\t"
  64149. "adcs r6, r6, #0\n\t"
  64150. "adc r7, r7, #0\n\t"
  64151. "lsr r9, r12, #16\n\t"
  64152. "mul r8, r9, r8\n\t"
  64153. "lsr r9, r8, #16\n\t"
  64154. "lsl r8, r8, #16\n\t"
  64155. "adds r5, r5, r8\n\t"
  64156. "adcs r6, r6, r9\n\t"
  64157. "adc r7, r7, #0\n\t"
  64158. "lsr r8, r10, #16\n\t"
  64159. "lsr r9, r12, #16\n\t"
  64160. "mul r9, r8, r9\n\t"
  64161. "adds r6, r6, r9\n\t"
  64162. "adc r7, r7, #0\n\t"
  64163. "lsl r9, r12, #16\n\t"
  64164. "lsr r9, r9, #16\n\t"
  64165. "mul r8, r9, r8\n\t"
  64166. "lsr r9, r8, #16\n\t"
  64167. "lsl r8, r8, #16\n\t"
  64168. "adds r5, r5, r8\n\t"
  64169. "adcs r6, r6, r9\n\t"
  64170. "adc r7, r7, #0\n\t"
  64171. /* A[4] * A[4] */
  64172. "ldr r10, [%[a], #16]\n\t"
  64173. "lsl r8, r10, #16\n\t"
  64174. "lsr r9, r10, #16\n\t"
  64175. "lsr r8, r8, #16\n\t"
  64176. "mov r12, r8\n\t"
  64177. "mul r8, r12, r8\n\t"
  64178. "mov r12, r9\n\t"
  64179. "mul r9, r12, r9\n\t"
  64180. "adds r4, r4, r8\n\t"
  64181. "adcs r2, r2, r9\n\t"
  64182. "adc r3, r3, #0\n\t"
  64183. "lsr r9, r10, #16\n\t"
  64184. "lsl r8, r10, #16\n\t"
  64185. "lsr r8, r8, #16\n\t"
  64186. "mul r8, r9, r8\n\t"
  64187. "lsr r9, r8, #15\n\t"
  64188. "lsl r8, r8, #17\n\t"
  64189. "adds r4, r4, r8\n\t"
  64190. "adcs r2, r2, r9\n\t"
  64191. "adc r3, r3, #0\n\t"
  64192. "adds r5, r5, r5\n\t"
  64193. "adcs r6, r6, r6\n\t"
  64194. "adc r7, r7, r7\n\t"
  64195. "adds r4, r4, r5\n\t"
  64196. "adcs r2, r2, r6\n\t"
  64197. "adc r3, r3, r7\n\t"
  64198. "str r4, [%[r], #32]\n\t"
  64199. /* A[2] * A[7] */
  64200. "ldr r10, [%[a], #28]\n\t"
  64201. "ldr r12, [%[a], #8]\n\t"
  64202. "lsl r8, r10, #16\n\t"
  64203. "lsl r5, r12, #16\n\t"
  64204. "lsr r8, r8, #16\n\t"
  64205. "lsr r5, r5, #16\n\t"
  64206. "mul r5, r8, r5\n\t"
  64207. "lsr r9, r12, #16\n\t"
  64208. "mul r8, r9, r8\n\t"
  64209. "lsr r6, r8, #16\n\t"
  64210. "lsl r8, r8, #16\n\t"
  64211. "adds r5, r5, r8\n\t"
  64212. "adc r6, r6, #0\n\t"
  64213. "lsr r8, r10, #16\n\t"
  64214. "mul r9, r8, r9\n\t"
  64215. "add r6, r6, r9\n\t"
  64216. "lsl r9, r12, #16\n\t"
  64217. "lsr r9, r9, #16\n\t"
  64218. "mul r8, r9, r8\n\t"
  64219. "lsr r9, r8, #16\n\t"
  64220. "lsl r8, r8, #16\n\t"
  64221. "adds r5, r5, r8\n\t"
  64222. "adc r6, r6, r9\n\t"
  64223. "mov r4, #0\n\t"
  64224. "mov r7, #0\n\t"
  64225. /* A[3] * A[6] */
  64226. "ldr r10, [%[a], #24]\n\t"
  64227. "ldr r12, [%[a], #12]\n\t"
  64228. "lsl r8, r10, #16\n\t"
  64229. "lsl r9, r12, #16\n\t"
  64230. "lsr r8, r8, #16\n\t"
  64231. "lsr r9, r9, #16\n\t"
  64232. "mul r9, r8, r9\n\t"
  64233. "adds r5, r5, r9\n\t"
  64234. "adcs r6, r6, #0\n\t"
  64235. "adc r7, r7, #0\n\t"
  64236. "lsr r9, r12, #16\n\t"
  64237. "mul r8, r9, r8\n\t"
  64238. "lsr r9, r8, #16\n\t"
  64239. "lsl r8, r8, #16\n\t"
  64240. "adds r5, r5, r8\n\t"
  64241. "adcs r6, r6, r9\n\t"
  64242. "adc r7, r7, #0\n\t"
  64243. "lsr r8, r10, #16\n\t"
  64244. "lsr r9, r12, #16\n\t"
  64245. "mul r9, r8, r9\n\t"
  64246. "adds r6, r6, r9\n\t"
  64247. "adc r7, r7, #0\n\t"
  64248. "lsl r9, r12, #16\n\t"
  64249. "lsr r9, r9, #16\n\t"
  64250. "mul r8, r9, r8\n\t"
  64251. "lsr r9, r8, #16\n\t"
  64252. "lsl r8, r8, #16\n\t"
  64253. "adds r5, r5, r8\n\t"
  64254. "adcs r6, r6, r9\n\t"
  64255. "adc r7, r7, #0\n\t"
  64256. /* A[4] * A[5] */
  64257. "ldr r10, [%[a], #20]\n\t"
  64258. "ldr r12, [%[a], #16]\n\t"
  64259. "lsl r8, r10, #16\n\t"
  64260. "lsl r9, r12, #16\n\t"
  64261. "lsr r8, r8, #16\n\t"
  64262. "lsr r9, r9, #16\n\t"
  64263. "mul r9, r8, r9\n\t"
  64264. "adds r5, r5, r9\n\t"
  64265. "adcs r6, r6, #0\n\t"
  64266. "adc r7, r7, #0\n\t"
  64267. "lsr r9, r12, #16\n\t"
  64268. "mul r8, r9, r8\n\t"
  64269. "lsr r9, r8, #16\n\t"
  64270. "lsl r8, r8, #16\n\t"
  64271. "adds r5, r5, r8\n\t"
  64272. "adcs r6, r6, r9\n\t"
  64273. "adc r7, r7, #0\n\t"
  64274. "lsr r8, r10, #16\n\t"
  64275. "lsr r9, r12, #16\n\t"
  64276. "mul r9, r8, r9\n\t"
  64277. "adds r6, r6, r9\n\t"
  64278. "adc r7, r7, #0\n\t"
  64279. "lsl r9, r12, #16\n\t"
  64280. "lsr r9, r9, #16\n\t"
  64281. "mul r8, r9, r8\n\t"
  64282. "lsr r9, r8, #16\n\t"
  64283. "lsl r8, r8, #16\n\t"
  64284. "adds r5, r5, r8\n\t"
  64285. "adcs r6, r6, r9\n\t"
  64286. "adc r7, r7, #0\n\t"
  64287. "adds r5, r5, r5\n\t"
  64288. "adcs r6, r6, r6\n\t"
  64289. "adc r7, r7, r7\n\t"
  64290. "adds r2, r2, r5\n\t"
  64291. "adcs r3, r3, r6\n\t"
  64292. "adc r4, r4, r7\n\t"
  64293. "str r2, [%[r], #36]\n\t"
  64294. /* A[3] * A[7] */
  64295. "ldr r10, [%[a], #28]\n\t"
  64296. "ldr r12, [%[a], #12]\n\t"
  64297. "lsl r8, r10, #16\n\t"
  64298. "lsl r9, r12, #16\n\t"
  64299. "lsr r8, r8, #16\n\t"
  64300. "lsr r9, r9, #16\n\t"
  64301. "mul r9, r8, r9\n\t"
  64302. "adds r3, r3, r9\n\t"
  64303. "adcs r4, r4, #0\n\t"
  64304. "mov r2, #0\n\t"
  64305. "adc r2, r2, #0\n\t"
  64306. "adds r3, r3, r9\n\t"
  64307. "adcs r4, r4, #0\n\t"
  64308. "adc r2, r2, #0\n\t"
  64309. "lsr r9, r12, #16\n\t"
  64310. "mul r8, r9, r8\n\t"
  64311. "lsr r9, r8, #16\n\t"
  64312. "lsl r8, r8, #16\n\t"
  64313. "adds r3, r3, r8\n\t"
  64314. "adcs r4, r4, r9\n\t"
  64315. "adc r2, r2, #0\n\t"
  64316. "adds r3, r3, r8\n\t"
  64317. "adcs r4, r4, r9\n\t"
  64318. "adc r2, r2, #0\n\t"
  64319. "lsr r8, r10, #16\n\t"
  64320. "lsr r9, r12, #16\n\t"
  64321. "mul r9, r8, r9\n\t"
  64322. "adds r4, r4, r9\n\t"
  64323. "adc r2, r2, #0\n\t"
  64324. "adds r4, r4, r9\n\t"
  64325. "adc r2, r2, #0\n\t"
  64326. "lsl r9, r12, #16\n\t"
  64327. "lsr r9, r9, #16\n\t"
  64328. "mul r8, r9, r8\n\t"
  64329. "lsr r9, r8, #16\n\t"
  64330. "lsl r8, r8, #16\n\t"
  64331. "adds r3, r3, r8\n\t"
  64332. "adcs r4, r4, r9\n\t"
  64333. "adc r2, r2, #0\n\t"
  64334. "adds r3, r3, r8\n\t"
  64335. "adcs r4, r4, r9\n\t"
  64336. "adc r2, r2, #0\n\t"
  64337. /* A[4] * A[6] */
  64338. "ldr r10, [%[a], #24]\n\t"
  64339. "ldr r12, [%[a], #16]\n\t"
  64340. "lsl r8, r10, #16\n\t"
  64341. "lsl r9, r12, #16\n\t"
  64342. "lsr r8, r8, #16\n\t"
  64343. "lsr r9, r9, #16\n\t"
  64344. "mul r9, r8, r9\n\t"
  64345. "adds r3, r3, r9\n\t"
  64346. "adcs r4, r4, #0\n\t"
  64347. "adc r2, r2, #0\n\t"
  64348. "adds r3, r3, r9\n\t"
  64349. "adcs r4, r4, #0\n\t"
  64350. "adc r2, r2, #0\n\t"
  64351. "lsr r9, r12, #16\n\t"
  64352. "mul r8, r9, r8\n\t"
  64353. "lsr r9, r8, #16\n\t"
  64354. "lsl r8, r8, #16\n\t"
  64355. "adds r3, r3, r8\n\t"
  64356. "adcs r4, r4, r9\n\t"
  64357. "adc r2, r2, #0\n\t"
  64358. "adds r3, r3, r8\n\t"
  64359. "adcs r4, r4, r9\n\t"
  64360. "adc r2, r2, #0\n\t"
  64361. "lsr r8, r10, #16\n\t"
  64362. "lsr r9, r12, #16\n\t"
  64363. "mul r9, r8, r9\n\t"
  64364. "adds r4, r4, r9\n\t"
  64365. "adc r2, r2, #0\n\t"
  64366. "adds r4, r4, r9\n\t"
  64367. "adc r2, r2, #0\n\t"
  64368. "lsl r9, r12, #16\n\t"
  64369. "lsr r9, r9, #16\n\t"
  64370. "mul r8, r9, r8\n\t"
  64371. "lsr r9, r8, #16\n\t"
  64372. "lsl r8, r8, #16\n\t"
  64373. "adds r3, r3, r8\n\t"
  64374. "adcs r4, r4, r9\n\t"
  64375. "adc r2, r2, #0\n\t"
  64376. "adds r3, r3, r8\n\t"
  64377. "adcs r4, r4, r9\n\t"
  64378. "adc r2, r2, #0\n\t"
  64379. /* A[5] * A[5] */
  64380. "ldr r10, [%[a], #20]\n\t"
  64381. "lsl r8, r10, #16\n\t"
  64382. "lsr r9, r10, #16\n\t"
  64383. "lsr r8, r8, #16\n\t"
  64384. "mov r12, r8\n\t"
  64385. "mul r8, r12, r8\n\t"
  64386. "mov r12, r9\n\t"
  64387. "mul r9, r12, r9\n\t"
  64388. "adds r3, r3, r8\n\t"
  64389. "adcs r4, r4, r9\n\t"
  64390. "adc r2, r2, #0\n\t"
  64391. "lsr r9, r10, #16\n\t"
  64392. "lsl r8, r10, #16\n\t"
  64393. "lsr r8, r8, #16\n\t"
  64394. "mul r8, r9, r8\n\t"
  64395. "lsr r9, r8, #15\n\t"
  64396. "lsl r8, r8, #17\n\t"
  64397. "adds r3, r3, r8\n\t"
  64398. "adcs r4, r4, r9\n\t"
  64399. "adc r2, r2, #0\n\t"
  64400. "str r3, [%[r], #40]\n\t"
  64401. /* A[4] * A[7] */
  64402. "ldr r10, [%[a], #28]\n\t"
  64403. "ldr r12, [%[a], #16]\n\t"
  64404. "lsl r8, r10, #16\n\t"
  64405. "lsl r9, r12, #16\n\t"
  64406. "lsr r8, r8, #16\n\t"
  64407. "lsr r9, r9, #16\n\t"
  64408. "mul r9, r8, r9\n\t"
  64409. "adds r4, r4, r9\n\t"
  64410. "adcs r2, r2, #0\n\t"
  64411. "mov r3, #0\n\t"
  64412. "adc r3, r3, #0\n\t"
  64413. "adds r4, r4, r9\n\t"
  64414. "adcs r2, r2, #0\n\t"
  64415. "adc r3, r3, #0\n\t"
  64416. "lsr r9, r12, #16\n\t"
  64417. "mul r8, r9, r8\n\t"
  64418. "lsr r9, r8, #16\n\t"
  64419. "lsl r8, r8, #16\n\t"
  64420. "adds r4, r4, r8\n\t"
  64421. "adcs r2, r2, r9\n\t"
  64422. "adc r3, r3, #0\n\t"
  64423. "adds r4, r4, r8\n\t"
  64424. "adcs r2, r2, r9\n\t"
  64425. "adc r3, r3, #0\n\t"
  64426. "lsr r8, r10, #16\n\t"
  64427. "lsr r9, r12, #16\n\t"
  64428. "mul r9, r8, r9\n\t"
  64429. "adds r2, r2, r9\n\t"
  64430. "adc r3, r3, #0\n\t"
  64431. "adds r2, r2, r9\n\t"
  64432. "adc r3, r3, #0\n\t"
  64433. "lsl r9, r12, #16\n\t"
  64434. "lsr r9, r9, #16\n\t"
  64435. "mul r8, r9, r8\n\t"
  64436. "lsr r9, r8, #16\n\t"
  64437. "lsl r8, r8, #16\n\t"
  64438. "adds r4, r4, r8\n\t"
  64439. "adcs r2, r2, r9\n\t"
  64440. "adc r3, r3, #0\n\t"
  64441. "adds r4, r4, r8\n\t"
  64442. "adcs r2, r2, r9\n\t"
  64443. "adc r3, r3, #0\n\t"
  64444. /* A[5] * A[6] */
  64445. "ldr r10, [%[a], #24]\n\t"
  64446. "ldr r12, [%[a], #20]\n\t"
  64447. "lsl r8, r10, #16\n\t"
  64448. "lsl r9, r12, #16\n\t"
  64449. "lsr r8, r8, #16\n\t"
  64450. "lsr r9, r9, #16\n\t"
  64451. "mul r9, r8, r9\n\t"
  64452. "adds r4, r4, r9\n\t"
  64453. "adcs r2, r2, #0\n\t"
  64454. "adc r3, r3, #0\n\t"
  64455. "adds r4, r4, r9\n\t"
  64456. "adcs r2, r2, #0\n\t"
  64457. "adc r3, r3, #0\n\t"
  64458. "lsr r9, r12, #16\n\t"
  64459. "mul r8, r9, r8\n\t"
  64460. "lsr r9, r8, #16\n\t"
  64461. "lsl r8, r8, #16\n\t"
  64462. "adds r4, r4, r8\n\t"
  64463. "adcs r2, r2, r9\n\t"
  64464. "adc r3, r3, #0\n\t"
  64465. "adds r4, r4, r8\n\t"
  64466. "adcs r2, r2, r9\n\t"
  64467. "adc r3, r3, #0\n\t"
  64468. "lsr r8, r10, #16\n\t"
  64469. "lsr r9, r12, #16\n\t"
  64470. "mul r9, r8, r9\n\t"
  64471. "adds r2, r2, r9\n\t"
  64472. "adc r3, r3, #0\n\t"
  64473. "adds r2, r2, r9\n\t"
  64474. "adc r3, r3, #0\n\t"
  64475. "lsl r9, r12, #16\n\t"
  64476. "lsr r9, r9, #16\n\t"
  64477. "mul r8, r9, r8\n\t"
  64478. "lsr r9, r8, #16\n\t"
  64479. "lsl r8, r8, #16\n\t"
  64480. "adds r4, r4, r8\n\t"
  64481. "adcs r2, r2, r9\n\t"
  64482. "adc r3, r3, #0\n\t"
  64483. "adds r4, r4, r8\n\t"
  64484. "adcs r2, r2, r9\n\t"
  64485. "adc r3, r3, #0\n\t"
  64486. "str r4, [%[r], #44]\n\t"
  64487. /* A[5] * A[7] */
  64488. "ldr r10, [%[a], #28]\n\t"
  64489. "ldr r12, [%[a], #20]\n\t"
  64490. "lsl r8, r10, #16\n\t"
  64491. "lsl r9, r12, #16\n\t"
  64492. "lsr r8, r8, #16\n\t"
  64493. "lsr r9, r9, #16\n\t"
  64494. "mul r9, r8, r9\n\t"
  64495. "adds r2, r2, r9\n\t"
  64496. "adcs r3, r3, #0\n\t"
  64497. "mov r4, #0\n\t"
  64498. "adc r4, r4, #0\n\t"
  64499. "adds r2, r2, r9\n\t"
  64500. "adcs r3, r3, #0\n\t"
  64501. "adc r4, r4, #0\n\t"
  64502. "lsr r9, r12, #16\n\t"
  64503. "mul r8, r9, r8\n\t"
  64504. "lsr r9, r8, #16\n\t"
  64505. "lsl r8, r8, #16\n\t"
  64506. "adds r2, r2, r8\n\t"
  64507. "adcs r3, r3, r9\n\t"
  64508. "adc r4, r4, #0\n\t"
  64509. "adds r2, r2, r8\n\t"
  64510. "adcs r3, r3, r9\n\t"
  64511. "adc r4, r4, #0\n\t"
  64512. "lsr r8, r10, #16\n\t"
  64513. "lsr r9, r12, #16\n\t"
  64514. "mul r9, r8, r9\n\t"
  64515. "adds r3, r3, r9\n\t"
  64516. "adc r4, r4, #0\n\t"
  64517. "adds r3, r3, r9\n\t"
  64518. "adc r4, r4, #0\n\t"
  64519. "lsl r9, r12, #16\n\t"
  64520. "lsr r9, r9, #16\n\t"
  64521. "mul r8, r9, r8\n\t"
  64522. "lsr r9, r8, #16\n\t"
  64523. "lsl r8, r8, #16\n\t"
  64524. "adds r2, r2, r8\n\t"
  64525. "adcs r3, r3, r9\n\t"
  64526. "adc r4, r4, #0\n\t"
  64527. "adds r2, r2, r8\n\t"
  64528. "adcs r3, r3, r9\n\t"
  64529. "adc r4, r4, #0\n\t"
  64530. /* A[6] * A[6] */
  64531. "ldr r10, [%[a], #24]\n\t"
  64532. "lsl r8, r10, #16\n\t"
  64533. "lsr r9, r10, #16\n\t"
  64534. "lsr r8, r8, #16\n\t"
  64535. "mov r12, r8\n\t"
  64536. "mul r8, r12, r8\n\t"
  64537. "mov r12, r9\n\t"
  64538. "mul r9, r12, r9\n\t"
  64539. "adds r2, r2, r8\n\t"
  64540. "adcs r3, r3, r9\n\t"
  64541. "adc r4, r4, #0\n\t"
  64542. "lsr r9, r10, #16\n\t"
  64543. "lsl r8, r10, #16\n\t"
  64544. "lsr r8, r8, #16\n\t"
  64545. "mul r8, r9, r8\n\t"
  64546. "lsr r9, r8, #15\n\t"
  64547. "lsl r8, r8, #17\n\t"
  64548. "adds r2, r2, r8\n\t"
  64549. "adcs r3, r3, r9\n\t"
  64550. "adc r4, r4, #0\n\t"
  64551. "str r2, [%[r], #48]\n\t"
  64552. /* A[6] * A[7] */
  64553. "ldr r10, [%[a], #28]\n\t"
  64554. "ldr r12, [%[a], #24]\n\t"
  64555. "lsl r8, r10, #16\n\t"
  64556. "lsl r9, r12, #16\n\t"
  64557. "lsr r8, r8, #16\n\t"
  64558. "lsr r9, r9, #16\n\t"
  64559. "mul r9, r8, r9\n\t"
  64560. "adds r3, r3, r9\n\t"
  64561. "adcs r4, r4, #0\n\t"
  64562. "mov r2, #0\n\t"
  64563. "adc r2, r2, #0\n\t"
  64564. "adds r3, r3, r9\n\t"
  64565. "adcs r4, r4, #0\n\t"
  64566. "adc r2, r2, #0\n\t"
  64567. "lsr r9, r12, #16\n\t"
  64568. "mul r8, r9, r8\n\t"
  64569. "lsr r9, r8, #16\n\t"
  64570. "lsl r8, r8, #16\n\t"
  64571. "adds r3, r3, r8\n\t"
  64572. "adcs r4, r4, r9\n\t"
  64573. "adc r2, r2, #0\n\t"
  64574. "adds r3, r3, r8\n\t"
  64575. "adcs r4, r4, r9\n\t"
  64576. "adc r2, r2, #0\n\t"
  64577. "lsr r8, r10, #16\n\t"
  64578. "lsr r9, r12, #16\n\t"
  64579. "mul r9, r8, r9\n\t"
  64580. "adds r4, r4, r9\n\t"
  64581. "adc r2, r2, #0\n\t"
  64582. "adds r4, r4, r9\n\t"
  64583. "adc r2, r2, #0\n\t"
  64584. "lsl r9, r12, #16\n\t"
  64585. "lsr r9, r9, #16\n\t"
  64586. "mul r8, r9, r8\n\t"
  64587. "lsr r9, r8, #16\n\t"
  64588. "lsl r8, r8, #16\n\t"
  64589. "adds r3, r3, r8\n\t"
  64590. "adcs r4, r4, r9\n\t"
  64591. "adc r2, r2, #0\n\t"
  64592. "adds r3, r3, r8\n\t"
  64593. "adcs r4, r4, r9\n\t"
  64594. "adc r2, r2, #0\n\t"
  64595. "str r3, [%[r], #52]\n\t"
  64596. /* A[7] * A[7] */
  64597. "ldr r10, [%[a], #28]\n\t"
  64598. "lsl r8, r10, #16\n\t"
  64599. "lsr r9, r10, #16\n\t"
  64600. "lsr r8, r8, #16\n\t"
  64601. "mov r12, r8\n\t"
  64602. "mul r8, r12, r8\n\t"
  64603. "mov r12, r9\n\t"
  64604. "mul r9, r12, r9\n\t"
  64605. "adds r4, r4, r8\n\t"
  64606. "adc r2, r2, r9\n\t"
  64607. "lsr r9, r10, #16\n\t"
  64608. "lsl r8, r10, #16\n\t"
  64609. "lsr r8, r8, #16\n\t"
  64610. "mul r8, r9, r8\n\t"
  64611. "lsr r9, r8, #15\n\t"
  64612. "lsl r8, r8, #17\n\t"
  64613. "adds r4, r4, r8\n\t"
  64614. "adc r2, r2, r9\n\t"
  64615. "str r4, [%[r], #56]\n\t"
  64616. "str r2, [%[r], #60]\n\t"
  64617. "ldm sp!, {r2, r3, r4, r8}\n\t"
  64618. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  64619. "ldm sp!, {r2, r3, r4, r8}\n\t"
  64620. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  64621. : [r] "+r" (r), [a] "+r" (a)
  64622. :
  64623. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  64624. );
  64625. }
  64626. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  64627. /* Square a and put result in r. (r = a * a)
  64628. *
  64629. * r A single precision integer.
  64630. * a A single precision integer.
  64631. */
  64632. static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  64633. {
  64634. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  64635. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  64636. __asm__ __volatile__ (
  64637. "sub sp, sp, #0x44\n\t"
  64638. "str %[r], [sp, #64]\n\t"
  64639. "mov %[r], #0\n\t"
  64640. "ldr r12, [%[a]]\n\t"
  64641. /* A[0] * A[1] */
  64642. "ldr lr, [%[a], #4]\n\t"
  64643. "umull r4, r5, r12, lr\n\t"
  64644. /* A[0] * A[3] */
  64645. "ldr lr, [%[a], #12]\n\t"
  64646. "umull r6, r7, r12, lr\n\t"
  64647. /* A[0] * A[5] */
  64648. "ldr lr, [%[a], #20]\n\t"
  64649. "umull r8, r9, r12, lr\n\t"
  64650. /* A[0] * A[7] */
  64651. "ldr lr, [%[a], #28]\n\t"
  64652. "umull r10, r3, r12, lr\n\t"
  64653. /* A[0] * A[2] */
  64654. "ldr lr, [%[a], #8]\n\t"
  64655. "mov r11, #0\n\t"
  64656. "umlal r5, r11, r12, lr\n\t"
  64657. "adds r6, r6, r11\n\t"
  64658. /* A[0] * A[4] */
  64659. "ldr lr, [%[a], #16]\n\t"
  64660. "adcs r7, r7, #0\n\t"
  64661. "adc r11, %[r], #0\n\t"
  64662. "umlal r7, r11, r12, lr\n\t"
  64663. "adds r8, r8, r11\n\t"
  64664. /* A[0] * A[6] */
  64665. "ldr lr, [%[a], #24]\n\t"
  64666. "adcs r9, r9, #0\n\t"
  64667. "adc r11, %[r], #0\n\t"
  64668. "umlal r9, r11, r12, lr\n\t"
  64669. "adds r10, r10, r11\n\t"
  64670. "adcs r3, r3, #0\n\t"
  64671. "str r4, [sp, #4]\n\t"
  64672. "str r5, [sp, #8]\n\t"
  64673. /* A[1] * A[2] */
  64674. "ldr r12, [%[a], #4]\n\t"
  64675. "ldr lr, [%[a], #8]\n\t"
  64676. "mov r11, #0\n\t"
  64677. "umlal r6, r11, r12, lr\n\t"
  64678. "str r6, [sp, #12]\n\t"
  64679. "adds r7, r7, r11\n\t"
  64680. /* A[1] * A[3] */
  64681. "ldr lr, [%[a], #12]\n\t"
  64682. "adc r11, %[r], #0\n\t"
  64683. "umlal r7, r11, r12, lr\n\t"
  64684. "str r7, [sp, #16]\n\t"
  64685. "adds r8, r8, r11\n\t"
  64686. /* A[1] * A[4] */
  64687. "ldr lr, [%[a], #16]\n\t"
  64688. "adc r11, %[r], #0\n\t"
  64689. "umlal r8, r11, r12, lr\n\t"
  64690. "adds r9, r9, r11\n\t"
  64691. /* A[1] * A[5] */
  64692. "ldr lr, [%[a], #20]\n\t"
  64693. "adc r11, %[r], #0\n\t"
  64694. "umlal r9, r11, r12, lr\n\t"
  64695. "adds r10, r10, r11\n\t"
  64696. /* A[1] * A[6] */
  64697. "ldr lr, [%[a], #24]\n\t"
  64698. "adc r11, %[r], #0\n\t"
  64699. "umlal r10, r11, r12, lr\n\t"
  64700. "adds r3, r3, r11\n\t"
  64701. /* A[1] * A[7] */
  64702. "ldr lr, [%[a], #28]\n\t"
  64703. "adc r4, %[r], #0\n\t"
  64704. "umlal r3, r4, r12, lr\n\t"
  64705. /* A[2] * A[3] */
  64706. "ldr r12, [%[a], #8]\n\t"
  64707. "ldr lr, [%[a], #12]\n\t"
  64708. "mov r11, #0\n\t"
  64709. "umlal r8, r11, r12, lr\n\t"
  64710. "str r8, [sp, #20]\n\t"
  64711. "adds r9, r9, r11\n\t"
  64712. /* A[2] * A[4] */
  64713. "ldr lr, [%[a], #16]\n\t"
  64714. "adc r11, %[r], #0\n\t"
  64715. "umlal r9, r11, r12, lr\n\t"
  64716. "str r9, [sp, #24]\n\t"
  64717. "adds r10, r10, r11\n\t"
  64718. /* A[2] * A[5] */
  64719. "ldr lr, [%[a], #20]\n\t"
  64720. "adc r11, %[r], #0\n\t"
  64721. "umlal r10, r11, r12, lr\n\t"
  64722. "adds r3, r3, r11\n\t"
  64723. /* A[2] * A[6] */
  64724. "ldr lr, [%[a], #24]\n\t"
  64725. "adc r11, %[r], #0\n\t"
  64726. "umlal r3, r11, r12, lr\n\t"
  64727. "adds r4, r4, r11\n\t"
  64728. /* A[2] * A[7] */
  64729. "ldr lr, [%[a], #28]\n\t"
  64730. "adc r5, %[r], #0\n\t"
  64731. "umlal r4, r5, r12, lr\n\t"
  64732. /* A[3] * A[4] */
  64733. "ldr r12, [%[a], #12]\n\t"
  64734. "ldr lr, [%[a], #16]\n\t"
  64735. "mov r11, #0\n\t"
  64736. "umlal r10, r11, r12, lr\n\t"
  64737. "str r10, [sp, #28]\n\t"
  64738. "adds r3, r3, r11\n\t"
  64739. /* A[3] * A[5] */
  64740. "ldr lr, [%[a], #20]\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[3] * A[6] */
  64745. "ldr lr, [%[a], #24]\n\t"
  64746. "adc r11, %[r], #0\n\t"
  64747. "umlal r4, r11, r12, lr\n\t"
  64748. "adds r5, r5, r11\n\t"
  64749. /* A[3] * A[7] */
  64750. "ldr lr, [%[a], #28]\n\t"
  64751. "adc r6, %[r], #0\n\t"
  64752. "umlal r5, r6, r12, lr\n\t"
  64753. /* A[4] * A[5] */
  64754. "ldr r12, [%[a], #16]\n\t"
  64755. "ldr lr, [%[a], #20]\n\t"
  64756. "mov r11, #0\n\t"
  64757. "umlal r4, r11, r12, lr\n\t"
  64758. "adds r5, r5, r11\n\t"
  64759. /* A[4] * A[6] */
  64760. "ldr lr, [%[a], #24]\n\t"
  64761. "adc r11, %[r], #0\n\t"
  64762. "umlal r5, r11, r12, lr\n\t"
  64763. "adds r6, r6, r11\n\t"
  64764. /* A[4] * A[7] */
  64765. "ldr lr, [%[a], #28]\n\t"
  64766. "adc r7, %[r], #0\n\t"
  64767. "umlal r6, r7, r12, lr\n\t"
  64768. /* A[5] * A[6] */
  64769. "ldr r12, [%[a], #20]\n\t"
  64770. "ldr lr, [%[a], #24]\n\t"
  64771. "mov r11, #0\n\t"
  64772. "umlal r6, r11, r12, lr\n\t"
  64773. "adds r7, r7, r11\n\t"
  64774. /* A[5] * A[7] */
  64775. "ldr lr, [%[a], #28]\n\t"
  64776. "adc r8, %[r], #0\n\t"
  64777. "umlal r7, r8, r12, lr\n\t"
  64778. /* A[6] * A[7] */
  64779. "ldr r12, [%[a], #24]\n\t"
  64780. "ldr lr, [%[a], #28]\n\t"
  64781. "mov r9, #0\n\t"
  64782. "umlal r8, r9, r12, lr\n\t"
  64783. "add lr, sp, #32\n\t"
  64784. "stm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t"
  64785. "add lr, sp, #4\n\t"
  64786. "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  64787. "adds r4, r4, r4\n\t"
  64788. "adcs r5, r5, r5\n\t"
  64789. "adcs r6, r6, r6\n\t"
  64790. "adcs r7, r7, r7\n\t"
  64791. "adcs r8, r8, r8\n\t"
  64792. "adcs r9, r9, r9\n\t"
  64793. "adcs r10, r10, r10\n\t"
  64794. "stm lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  64795. "ldm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t"
  64796. "adcs r3, r3, r3\n\t"
  64797. "adcs r4, r4, r4\n\t"
  64798. "adcs r5, r5, r5\n\t"
  64799. "adcs r6, r6, r6\n\t"
  64800. "adcs r7, r7, r7\n\t"
  64801. "adcs r8, r8, r8\n\t"
  64802. "adcs r9, r9, r9\n\t"
  64803. "adc r10, %[r], #0\n\t"
  64804. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64805. "add lr, sp, #4\n\t"
  64806. "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  64807. "mov lr, sp\n\t"
  64808. /* A[0] * A[0] */
  64809. "ldr r12, [%[a]]\n\t"
  64810. "umull r3, r11, r12, r12\n\t"
  64811. "adds r4, r4, r11\n\t"
  64812. /* A[1] * A[1] */
  64813. "ldr r12, [%[a], #4]\n\t"
  64814. "adcs r5, r5, #0\n\t"
  64815. "adc r11, %[r], #0\n\t"
  64816. "umlal r5, r11, r12, r12\n\t"
  64817. "adds r6, r6, r11\n\t"
  64818. /* A[2] * A[2] */
  64819. "ldr r12, [%[a], #8]\n\t"
  64820. "adcs r7, r7, #0\n\t"
  64821. "adc r11, %[r], #0\n\t"
  64822. "umlal r7, r11, r12, r12\n\t"
  64823. "adds r8, r8, r11\n\t"
  64824. /* A[3] * A[3] */
  64825. "ldr r12, [%[a], #12]\n\t"
  64826. "adcs r9, r9, #0\n\t"
  64827. "adc r11, %[r], #0\n\t"
  64828. "umlal r9, r11, r12, r12\n\t"
  64829. "adds r10, r10, r11\n\t"
  64830. "stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64831. "ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64832. /* A[4] * A[4] */
  64833. "ldr r12, [%[a], #16]\n\t"
  64834. "adcs r3, r3, #0\n\t"
  64835. "adc r11, %[r], #0\n\t"
  64836. "umlal r3, r11, r12, r12\n\t"
  64837. "adds r4, r4, r11\n\t"
  64838. /* A[5] * A[5] */
  64839. "ldr r12, [%[a], #20]\n\t"
  64840. "adcs r5, r5, #0\n\t"
  64841. "adc r11, %[r], #0\n\t"
  64842. "umlal r5, r11, r12, r12\n\t"
  64843. "adds r6, r6, r11\n\t"
  64844. /* A[6] * A[6] */
  64845. "ldr r12, [%[a], #24]\n\t"
  64846. "adcs r7, r7, #0\n\t"
  64847. "adc r11, %[r], #0\n\t"
  64848. "umlal r7, r11, r12, r12\n\t"
  64849. "adds r8, r8, r11\n\t"
  64850. /* A[7] * A[7] */
  64851. "ldr r12, [%[a], #28]\n\t"
  64852. "adcs r9, r9, #0\n\t"
  64853. "adc r10, r10, #0\n\t"
  64854. "umlal r9, r10, r12, r12\n\t"
  64855. "ldr %[r], [sp, #64]\n\t"
  64856. "add %[r], %[r], #32\n\t"
  64857. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64858. "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64859. "sub %[r], %[r], #32\n\t"
  64860. "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  64861. "add sp, sp, #0x44\n\t"
  64862. : [r] "+r" (r), [a] "+r" (a)
  64863. :
  64864. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  64865. );
  64866. }
  64867. #else
  64868. /* Square a and put result in r. (r = a * a)
  64869. *
  64870. * r A single precision integer.
  64871. * a A single precision integer.
  64872. */
  64873. static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  64874. {
  64875. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  64876. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  64877. __asm__ __volatile__ (
  64878. "sub sp, sp, #32\n\t"
  64879. "str %[r], [sp, #28]\n\t"
  64880. "ldm %[a], {%[r], %[a], r2, r3, r4, r5, r6, r7}\n\t"
  64881. "umull r9, r10, %[r], %[r]\n\t"
  64882. "umull r11, r12, %[r], %[a]\n\t"
  64883. "adds r11, r11, r11\n\t"
  64884. "mov lr, #0\n\t"
  64885. "umaal r10, r11, lr, lr\n\t"
  64886. "stm sp, {r9, r10}\n\t"
  64887. "mov r8, lr\n\t"
  64888. "umaal r8, r12, %[r], r2\n\t"
  64889. "adcs r8, r8, r8\n\t"
  64890. "umaal r8, r11, %[a], %[a]\n\t"
  64891. "umull r9, r10, %[r], r3\n\t"
  64892. "umaal r9, r12, %[a], r2\n\t"
  64893. "adcs r9, r9, r9\n\t"
  64894. "umaal r9, r11, lr, lr\n\t"
  64895. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  64896. "str r8, [sp, #8]\n\t"
  64897. "str r9, [sp, #12]\n\t"
  64898. #else
  64899. "strd r8, r9, [sp, #8]\n\t"
  64900. #endif
  64901. "mov r9, lr\n\t"
  64902. "umaal r9, r10, %[r], r4\n\t"
  64903. "umaal r9, r12, %[a], r3\n\t"
  64904. "adcs r9, r9, r9\n\t"
  64905. "umaal r9, r11, r2, r2\n\t"
  64906. "str r9, [sp, #16]\n\t"
  64907. "umull r9, r8, %[r], r5\n\t"
  64908. "umaal r9, r12, %[a], r4\n\t"
  64909. "umaal r9, r10, r2, r3\n\t"
  64910. "adcs r9, r9, r9\n\t"
  64911. "umaal r9, r11, lr, lr\n\t"
  64912. "str r9, [sp, #20]\n\t"
  64913. "mov r9, lr\n\t"
  64914. "umaal r9, r8, %[r], r6\n\t"
  64915. "umaal r9, r12, %[a], r5\n\t"
  64916. "umaal r9, r10, r2, r4\n\t"
  64917. "adcs r9, r9, r9\n\t"
  64918. "umaal r9, r11, r3, r3\n\t"
  64919. "str r9, [sp, #24]\n\t"
  64920. "umull %[r], r9, %[r], r7\n\t"
  64921. "umaal %[r], r8, %[a], r6\n\t"
  64922. "umaal %[r], r12, r2, r5\n\t"
  64923. "umaal %[r], r10, r3, r4\n\t"
  64924. "adcs %[r], %[r], %[r]\n\t"
  64925. "umaal %[r], r11, lr, lr\n\t"
  64926. /* R[7] = r0 */
  64927. "umaal r9, r8, %[a], r7\n\t"
  64928. "umaal r9, r10, r2, r6\n\t"
  64929. "umaal r12, r9, r3, r5\n\t"
  64930. "adcs r12, r12, r12\n\t"
  64931. "umaal r12, r11, r4, r4\n\t"
  64932. /* R[8] = r12 */
  64933. "umaal r9, r8, r2, r7\n\t"
  64934. "umaal r10, r9, r3, r6\n\t"
  64935. "mov r2, lr\n\t"
  64936. "umaal r10, r2, r4, r5\n\t"
  64937. "adcs r10, r10, r10\n\t"
  64938. "umaal r11, r10, lr, lr\n\t"
  64939. /* R[9] = r11 */
  64940. "umaal r2, r8, r3, r7\n\t"
  64941. "umaal r2, r9, r4, r6\n\t"
  64942. "adcs r3, r2, r2\n\t"
  64943. "umaal r10, r3, r5, r5\n\t"
  64944. /* R[10] = r10 */
  64945. "mov %[a], lr\n\t"
  64946. "umaal %[a], r8, r4, r7\n\t"
  64947. "umaal %[a], r9, r5, r6\n\t"
  64948. "adcs r4, %[a], %[a]\n\t"
  64949. "umaal r3, r4, lr, lr\n\t"
  64950. /* R[11] = r3 */
  64951. "umaal r8, r9, r5, r7\n\t"
  64952. "adcs r8, r8, r8\n\t"
  64953. "umaal r4, r8, r6, r6\n\t"
  64954. /* R[12] = r4 */
  64955. "mov r5, lr\n\t"
  64956. "umaal r5, r9, r6, r7\n\t"
  64957. "adcs r5, r5, r5\n\t"
  64958. "umaal r8, r5, lr, lr\n\t"
  64959. /* R[13] = r8 */
  64960. "adcs r9, r9, r9\n\t"
  64961. "umaal r9, r5, r7, r7\n\t"
  64962. "adcs r7, r5, lr\n\t"
  64963. /* R[14] = r9 */
  64964. /* R[15] = r7 */
  64965. "ldr lr, [sp, #28]\n\t"
  64966. "add lr, lr, #28\n\t"
  64967. "stm lr!, {%[r], r12}\n\t"
  64968. "stm lr!, {r11}\n\t"
  64969. "stm lr!, {r10}\n\t"
  64970. "stm lr!, {r3, r4, r8, r9}\n\t"
  64971. "stm lr!, {r7}\n\t"
  64972. "sub lr, lr, #0x40\n\t"
  64973. "ldm sp, {%[r], %[a], r2, r3, r4, r5, r6}\n\t"
  64974. "stm lr, {%[r], %[a], r2, r3, r4, r5, r6}\n\t"
  64975. "add sp, sp, #32\n\t"
  64976. : [r] "+r" (r), [a] "+r" (a)
  64977. :
  64978. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  64979. );
  64980. }
  64981. #endif
  64982. #endif /* WOLFSSL_SP_SMALL */
  64983. #ifdef WOLFSSL_SP_SMALL
  64984. /* Add b to a into r. (r = a + b)
  64985. *
  64986. * r A single precision integer.
  64987. * a A single precision integer.
  64988. * b A single precision integer.
  64989. */
  64990. static sp_digit sp_256_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  64991. {
  64992. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  64993. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  64994. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  64995. __asm__ __volatile__ (
  64996. "mov r3, #0\n\t"
  64997. "add r12, %[a], #32\n\t"
  64998. "\n"
  64999. "L_sp_256_add_8_word_%=: \n\t"
  65000. "adds r3, r3, #-1\n\t"
  65001. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  65002. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  65003. "adcs r4, r4, r8\n\t"
  65004. "adcs r5, r5, r9\n\t"
  65005. "adcs r6, r6, r10\n\t"
  65006. "adcs r7, r7, r11\n\t"
  65007. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  65008. "mov r4, #0\n\t"
  65009. "adc r3, r4, #0\n\t"
  65010. "cmp %[a], r12\n\t"
  65011. "bne L_sp_256_add_8_word_%=\n\t"
  65012. "mov %[r], r3\n\t"
  65013. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  65014. :
  65015. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  65016. );
  65017. return (uint32_t)(size_t)r;
  65018. }
  65019. #else
  65020. /* Add b to a into r. (r = a + b)
  65021. *
  65022. * r A single precision integer.
  65023. * a A single precision integer.
  65024. * b A single precision integer.
  65025. */
  65026. static sp_digit sp_256_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  65027. {
  65028. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  65029. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  65030. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  65031. __asm__ __volatile__ (
  65032. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  65033. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  65034. "adds r3, r3, r7\n\t"
  65035. "adcs r4, r4, r8\n\t"
  65036. "adcs r5, r5, r9\n\t"
  65037. "adcs r6, r6, r10\n\t"
  65038. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  65039. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  65040. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  65041. "adcs r3, r3, r7\n\t"
  65042. "adcs r4, r4, r8\n\t"
  65043. "adcs r5, r5, r9\n\t"
  65044. "adcs r6, r6, r10\n\t"
  65045. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  65046. "mov %[r], #0\n\t"
  65047. "adc %[r], %[r], #0\n\t"
  65048. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  65049. :
  65050. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  65051. );
  65052. return (uint32_t)(size_t)r;
  65053. }
  65054. #endif /* WOLFSSL_SP_SMALL */
  65055. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  65056. *
  65057. * r The resulting Montgomery form number.
  65058. * a The number to convert.
  65059. * m The modulus (prime).
  65060. */
  65061. static int sp_256_mod_mul_norm_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  65062. {
  65063. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  65064. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  65065. __asm__ __volatile__ (
  65066. "sub sp, sp, #24\n\t"
  65067. "ldm %[a], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  65068. /* Clear overflow and underflow */
  65069. "mov lr, #0\n\t"
  65070. "mov r10, #0\n\t"
  65071. "# t[0] = 1 1 0 -1 -1 -1 -1 0\n\t"
  65072. "adds r12, r2, r3\n\t"
  65073. "adc lr, lr, #0\n\t"
  65074. "subs r12, r12, r5\n\t"
  65075. "sbc r10, r10, #0\n\t"
  65076. "subs r12, r12, r6\n\t"
  65077. "sbc r10, r10, #0\n\t"
  65078. "subs r12, r12, r7\n\t"
  65079. "sbc r10, r10, #0\n\t"
  65080. "subs r12, r12, r8\n\t"
  65081. "sbc r10, r10, #0\n\t"
  65082. /* Store t[0] */
  65083. "str r12, [sp]\n\t"
  65084. "neg r10, r10\n\t"
  65085. "mov r12, #0\n\t"
  65086. "# t[1] = 0 1 1 0 -1 -1 -1 -1\n\t"
  65087. "adds lr, lr, r3\n\t"
  65088. "adc r12, r12, #0\n\t"
  65089. "adds lr, lr, r4\n\t"
  65090. "adc r12, r12, #0\n\t"
  65091. "subs lr, lr, r10\n\t"
  65092. "sbc r10, r10, r10\n\t"
  65093. "subs lr, lr, r6\n\t"
  65094. "sbc r10, r10, #0\n\t"
  65095. "subs lr, lr, r7\n\t"
  65096. "sbc r10, r10, #0\n\t"
  65097. "subs lr, lr, r8\n\t"
  65098. "sbc r10, r10, #0\n\t"
  65099. "subs lr, lr, r9\n\t"
  65100. "sbc r10, r10, #0\n\t"
  65101. /* Store t[1] */
  65102. "str lr, [sp, #4]\n\t"
  65103. "neg r10, r10\n\t"
  65104. "mov lr, #0\n\t"
  65105. "# t[2] = 0 0 1 1 0 -1 -1 -1\n\t"
  65106. "adds r12, r12, r4\n\t"
  65107. "adc lr, lr, #0\n\t"
  65108. "adds r12, r12, r5\n\t"
  65109. "adc lr, lr, #0\n\t"
  65110. "subs r12, r12, r10\n\t"
  65111. "sbc r10, r10, r10\n\t"
  65112. "subs r12, r12, r7\n\t"
  65113. "sbc r10, r10, #0\n\t"
  65114. "subs r12, r12, r8\n\t"
  65115. "sbc r10, r10, #0\n\t"
  65116. "subs r12, r12, r9\n\t"
  65117. "sbc r10, r10, #0\n\t"
  65118. /* Store t[2] */
  65119. "str r12, [sp, #8]\n\t"
  65120. "neg r10, r10\n\t"
  65121. "mov r12, #0\n\t"
  65122. "# t[3] = -1 -1 0 2 2 1 0 -1\n\t"
  65123. "adds lr, lr, r5\n\t"
  65124. "adc r12, r12, #0\n\t"
  65125. "adds lr, lr, r5\n\t"
  65126. "adc r12, r12, #0\n\t"
  65127. "adds lr, lr, r6\n\t"
  65128. "adc r12, r12, #0\n\t"
  65129. "adds lr, lr, r6\n\t"
  65130. "adc r12, r12, #0\n\t"
  65131. "adds lr, lr, r7\n\t"
  65132. "adc r12, r12, #0\n\t"
  65133. "subs lr, lr, r10\n\t"
  65134. "sbc r10, r10, r10\n\t"
  65135. "subs lr, lr, r2\n\t"
  65136. "sbc r10, r10, #0\n\t"
  65137. "subs lr, lr, r3\n\t"
  65138. "sbc r10, r10, #0\n\t"
  65139. "subs lr, lr, r9\n\t"
  65140. "sbc r10, r10, #0\n\t"
  65141. /* Store t[3] */
  65142. "str lr, [sp, #12]\n\t"
  65143. "neg r10, r10\n\t"
  65144. "mov lr, #0\n\t"
  65145. "# t[4] = 0 -1 -1 0 2 2 1 0\n\t"
  65146. "adds r12, r12, r6\n\t"
  65147. "adc lr, lr, #0\n\t"
  65148. "adds r12, r12, r6\n\t"
  65149. "adc lr, lr, #0\n\t"
  65150. "adds r12, r12, r7\n\t"
  65151. "adc lr, lr, #0\n\t"
  65152. "adds r12, r12, r7\n\t"
  65153. "adc lr, lr, #0\n\t"
  65154. "adds r12, r12, r8\n\t"
  65155. "adc lr, lr, #0\n\t"
  65156. "subs r12, r12, r10\n\t"
  65157. "sbc r10, r10, r10\n\t"
  65158. "subs r12, r12, r3\n\t"
  65159. "sbc r10, r10, #0\n\t"
  65160. "subs r12, r12, r4\n\t"
  65161. "sbc r10, r10, #0\n\t"
  65162. /* Store t[4] */
  65163. "str r12, [sp, #16]\n\t"
  65164. "neg r10, r10\n\t"
  65165. "mov r12, #0\n\t"
  65166. "# t[5] = 0 0 -1 -1 0 2 2 1\n\t"
  65167. "adds lr, lr, r7\n\t"
  65168. "adc r12, r12, #0\n\t"
  65169. "adds lr, lr, r7\n\t"
  65170. "adc r12, r12, #0\n\t"
  65171. "adds lr, lr, r8\n\t"
  65172. "adc r12, r12, #0\n\t"
  65173. "adds lr, lr, r8\n\t"
  65174. "adc r12, r12, #0\n\t"
  65175. "adds lr, lr, r9\n\t"
  65176. "adc r12, r12, #0\n\t"
  65177. "subs lr, lr, r10\n\t"
  65178. "sbc r10, r10, r10\n\t"
  65179. "subs lr, lr, r4\n\t"
  65180. "sbc r10, r10, #0\n\t"
  65181. "subs lr, lr, r5\n\t"
  65182. "sbc r10, r10, #0\n\t"
  65183. /* Store t[5] */
  65184. "str lr, [sp, #20]\n\t"
  65185. "neg r10, r10\n\t"
  65186. "mov lr, #0\n\t"
  65187. "# t[6] = -1 -1 0 0 0 1 3 2\n\t"
  65188. "adds r12, r12, r7\n\t"
  65189. "adc lr, lr, #0\n\t"
  65190. "adds r12, r12, r8\n\t"
  65191. "adc lr, lr, #0\n\t"
  65192. "adds r12, r12, r8\n\t"
  65193. "adc lr, lr, #0\n\t"
  65194. "adds r12, r12, r8\n\t"
  65195. "adc lr, lr, #0\n\t"
  65196. "adds r12, r12, r9\n\t"
  65197. "adc lr, lr, #0\n\t"
  65198. "adds r12, r12, r9\n\t"
  65199. "adc lr, lr, #0\n\t"
  65200. "subs r12, r12, r10\n\t"
  65201. "sbc r10, r10, r10\n\t"
  65202. "subs r12, r12, r2\n\t"
  65203. "sbc r10, r10, #0\n\t"
  65204. "subs r12, r12, r3\n\t"
  65205. "sbc r10, r10, #0\n\t"
  65206. /* Store t[6] */
  65207. "mov r8, r12\n\t"
  65208. "neg r10, r10\n\t"
  65209. "mov r12, #0\n\t"
  65210. "# t[7] = 1 0 -1 -1 -1 -1 0 3\n\t"
  65211. "adds lr, lr, r2\n\t"
  65212. "adc r12, r12, #0\n\t"
  65213. "adds lr, lr, r9\n\t"
  65214. "adc r12, r12, #0\n\t"
  65215. "adds lr, lr, r9\n\t"
  65216. "adc r12, r12, #0\n\t"
  65217. "adds lr, lr, r9\n\t"
  65218. "adc r12, r12, #0\n\t"
  65219. "subs lr, lr, r10\n\t"
  65220. "sbc r10, r10, r10\n\t"
  65221. "subs lr, lr, r4\n\t"
  65222. "sbc r10, r10, #0\n\t"
  65223. "subs lr, lr, r5\n\t"
  65224. "sbc r10, r10, #0\n\t"
  65225. "subs lr, lr, r6\n\t"
  65226. "sbc r10, r10, #0\n\t"
  65227. "subs lr, lr, r7\n\t"
  65228. "sbc r10, r10, #0\n\t"
  65229. /* Store t[7] */
  65230. /* Load intermediate */
  65231. "ldm sp, {r2, r3, r4, r5, r6, r7}\n\t"
  65232. "neg r10, r10\n\t"
  65233. /* Add overflow */
  65234. /* Subtract underflow - add neg underflow */
  65235. "adds r2, r2, r12\n\t"
  65236. "adcs r3, r3, #0\n\t"
  65237. "adcs r4, r4, #0\n\t"
  65238. "adcs r5, r5, r10\n\t"
  65239. "adcs r6, r6, #0\n\t"
  65240. "adcs r7, r7, #0\n\t"
  65241. "adcs r8, r8, r10\n\t"
  65242. "adcs lr, lr, r12\n\t"
  65243. "mov r9, #0\n\t"
  65244. "adc r9, r9, #0\n\t"
  65245. /* Subtract overflow */
  65246. /* Add underflow - subtract neg underflow */
  65247. "subs r2, r2, r10\n\t"
  65248. "sbcs r3, r3, #0\n\t"
  65249. "sbcs r4, r4, #0\n\t"
  65250. "sbcs r5, r5, r12\n\t"
  65251. "sbcs r6, r6, #0\n\t"
  65252. "sbcs r7, r7, #0\n\t"
  65253. "sbcs r8, r8, r12\n\t"
  65254. "sbcs lr, lr, r10\n\t"
  65255. "mov r10, #0\n\t"
  65256. "sbc r10, r10, #0\n\t"
  65257. "neg r10, r10\n\t"
  65258. /* Add overflow */
  65259. /* Subtract underflow - add neg underflow */
  65260. "adds r2, r2, r9\n\t"
  65261. "adcs r3, r3, #0\n\t"
  65262. "adcs r4, r4, #0\n\t"
  65263. "adcs r5, r5, r10\n\t"
  65264. "adcs r6, r6, #0\n\t"
  65265. "adcs r7, r7, #0\n\t"
  65266. "adcs r8, r8, r10\n\t"
  65267. "adc lr, lr, r9\n\t"
  65268. /* Subtract overflow */
  65269. /* Add underflow - subtract neg underflow */
  65270. "subs r2, r2, r10\n\t"
  65271. "sbcs r3, r3, #0\n\t"
  65272. "sbcs r4, r4, #0\n\t"
  65273. "sbcs r5, r5, r9\n\t"
  65274. "sbcs r6, r6, #0\n\t"
  65275. "sbcs r7, r7, #0\n\t"
  65276. "sbcs r8, r8, r9\n\t"
  65277. "sbc lr, lr, r10\n\t"
  65278. /* Store result */
  65279. "stm %[r], {r2, r3, r4, r5, r6, r7, r8, lr}\n\t"
  65280. "mov %[r], #0\n\t"
  65281. "add sp, sp, #24\n\t"
  65282. : [r] "+r" (r), [a] "+r" (a)
  65283. :
  65284. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "cc"
  65285. );
  65286. (void)m_p;
  65287. return (uint32_t)(size_t)r;
  65288. }
  65289. /* Convert an mp_int to an array of sp_digit.
  65290. *
  65291. * r A single precision integer.
  65292. * size Maximum number of bytes to convert
  65293. * a A multi-precision integer.
  65294. */
  65295. static void sp_256_from_mp(sp_digit* r, int size, const mp_int* a)
  65296. {
  65297. #if DIGIT_BIT == 32
  65298. int i;
  65299. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  65300. int o = 0;
  65301. for (i = 0; i < size; i++) {
  65302. sp_digit mask = (sp_digit)0 - (j >> 31);
  65303. r[i] = a->dp[o] & mask;
  65304. j++;
  65305. o += (int)(j >> 31);
  65306. }
  65307. #elif DIGIT_BIT > 32
  65308. unsigned int i;
  65309. int j = 0;
  65310. word32 s = 0;
  65311. r[0] = 0;
  65312. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  65313. r[j] |= ((sp_digit)a->dp[i] << s);
  65314. r[j] &= 0xffffffff;
  65315. s = 32U - s;
  65316. if (j + 1 >= size) {
  65317. break;
  65318. }
  65319. /* lint allow cast of mismatch word32 and mp_digit */
  65320. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  65321. while ((s + 32U) <= (word32)DIGIT_BIT) {
  65322. s += 32U;
  65323. r[j] &= 0xffffffff;
  65324. if (j + 1 >= size) {
  65325. break;
  65326. }
  65327. if (s < (word32)DIGIT_BIT) {
  65328. /* lint allow cast of mismatch word32 and mp_digit */
  65329. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  65330. }
  65331. else {
  65332. r[++j] = (sp_digit)0;
  65333. }
  65334. }
  65335. s = (word32)DIGIT_BIT - s;
  65336. }
  65337. for (j++; j < size; j++) {
  65338. r[j] = 0;
  65339. }
  65340. #else
  65341. unsigned int i;
  65342. int j = 0;
  65343. int s = 0;
  65344. r[0] = 0;
  65345. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  65346. r[j] |= ((sp_digit)a->dp[i]) << s;
  65347. if (s + DIGIT_BIT >= 32) {
  65348. r[j] &= 0xffffffff;
  65349. if (j + 1 >= size) {
  65350. break;
  65351. }
  65352. s = 32 - s;
  65353. if (s == DIGIT_BIT) {
  65354. r[++j] = 0;
  65355. s = 0;
  65356. }
  65357. else {
  65358. r[++j] = a->dp[i] >> s;
  65359. s = DIGIT_BIT - s;
  65360. }
  65361. }
  65362. else {
  65363. s += DIGIT_BIT;
  65364. }
  65365. }
  65366. for (j++; j < size; j++) {
  65367. r[j] = 0;
  65368. }
  65369. #endif
  65370. }
  65371. /* Convert a point of type ecc_point to type sp_point_256.
  65372. *
  65373. * p Point of type sp_point_256 (result).
  65374. * pm Point of type ecc_point.
  65375. */
  65376. static void sp_256_point_from_ecc_point_8(sp_point_256* p,
  65377. const ecc_point* pm)
  65378. {
  65379. XMEMSET(p->x, 0, sizeof(p->x));
  65380. XMEMSET(p->y, 0, sizeof(p->y));
  65381. XMEMSET(p->z, 0, sizeof(p->z));
  65382. sp_256_from_mp(p->x, 8, pm->x);
  65383. sp_256_from_mp(p->y, 8, pm->y);
  65384. sp_256_from_mp(p->z, 8, pm->z);
  65385. p->infinity = 0;
  65386. }
  65387. /* Convert an array of sp_digit to an mp_int.
  65388. *
  65389. * a A single precision integer.
  65390. * r A multi-precision integer.
  65391. */
  65392. static int sp_256_to_mp(const sp_digit* a, mp_int* r)
  65393. {
  65394. int err;
  65395. err = mp_grow(r, (256 + DIGIT_BIT - 1) / DIGIT_BIT);
  65396. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  65397. #if DIGIT_BIT == 32
  65398. XMEMCPY(r->dp, a, sizeof(sp_digit) * 8);
  65399. r->used = 8;
  65400. mp_clamp(r);
  65401. #elif DIGIT_BIT < 32
  65402. int i;
  65403. int j = 0;
  65404. int s = 0;
  65405. r->dp[0] = 0;
  65406. for (i = 0; i < 8; i++) {
  65407. r->dp[j] |= (mp_digit)(a[i] << s);
  65408. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  65409. s = DIGIT_BIT - s;
  65410. r->dp[++j] = (mp_digit)(a[i] >> s);
  65411. while (s + DIGIT_BIT <= 32) {
  65412. s += DIGIT_BIT;
  65413. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  65414. if (s == SP_WORD_SIZE) {
  65415. r->dp[j] = 0;
  65416. }
  65417. else {
  65418. r->dp[j] = (mp_digit)(a[i] >> s);
  65419. }
  65420. }
  65421. s = 32 - s;
  65422. }
  65423. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  65424. mp_clamp(r);
  65425. #else
  65426. int i;
  65427. int j = 0;
  65428. int s = 0;
  65429. r->dp[0] = 0;
  65430. for (i = 0; i < 8; i++) {
  65431. r->dp[j] |= ((mp_digit)a[i]) << s;
  65432. if (s + 32 >= DIGIT_BIT) {
  65433. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  65434. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  65435. #endif
  65436. s = DIGIT_BIT - s;
  65437. r->dp[++j] = a[i] >> s;
  65438. s = 32 - s;
  65439. }
  65440. else {
  65441. s += 32;
  65442. }
  65443. }
  65444. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  65445. mp_clamp(r);
  65446. #endif
  65447. }
  65448. return err;
  65449. }
  65450. /* Convert a point of type sp_point_256 to type ecc_point.
  65451. *
  65452. * p Point of type sp_point_256.
  65453. * pm Point of type ecc_point (result).
  65454. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  65455. * MP_OKAY.
  65456. */
  65457. static int sp_256_point_to_ecc_point_8(const sp_point_256* p, ecc_point* pm)
  65458. {
  65459. int err;
  65460. err = sp_256_to_mp(p->x, pm->x);
  65461. if (err == MP_OKAY) {
  65462. err = sp_256_to_mp(p->y, pm->y);
  65463. }
  65464. if (err == MP_OKAY) {
  65465. err = sp_256_to_mp(p->z, pm->z);
  65466. }
  65467. return err;
  65468. }
  65469. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  65470. /* Multiply two Montgomery form numbers mod the modulus (prime).
  65471. * (r = a * b mod m)
  65472. *
  65473. * r Result of multiplication.
  65474. * a First number to multiply in Montgomery form.
  65475. * b Second number to multiply in Montgomery form.
  65476. * m Modulus (prime).
  65477. * mp Montgomery multiplier.
  65478. */
  65479. 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)
  65480. {
  65481. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  65482. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  65483. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  65484. __asm__ __volatile__ (
  65485. "sub sp, sp, #0x44\n\t"
  65486. "mov r5, #0\n\t"
  65487. /* A[0] * B[0] */
  65488. "ldr r6, [%[a]]\n\t"
  65489. "ldr r7, [%[b]]\n\t"
  65490. "lsl r3, r6, #16\n\t"
  65491. "lsl r8, r7, #16\n\t"
  65492. "lsr r3, r3, #16\n\t"
  65493. "lsr r8, r8, #16\n\t"
  65494. "mul r8, r3, r8\n\t"
  65495. "lsr r4, r7, #16\n\t"
  65496. "mul r3, r4, r3\n\t"
  65497. "lsr r9, r3, #16\n\t"
  65498. "lsl r3, r3, #16\n\t"
  65499. "adds r8, r8, r3\n\t"
  65500. "adc r9, r9, #0\n\t"
  65501. "lsr r3, r6, #16\n\t"
  65502. "mul r4, r3, r4\n\t"
  65503. "add r9, r9, r4\n\t"
  65504. "lsl r4, r7, #16\n\t"
  65505. "lsr r4, r4, #16\n\t"
  65506. "mul r3, r4, r3\n\t"
  65507. "lsr r4, r3, #16\n\t"
  65508. "lsl r3, r3, #16\n\t"
  65509. "adds r8, r8, r3\n\t"
  65510. "adc r9, r9, r4\n\t"
  65511. "str r8, [sp]\n\t"
  65512. /* A[0] * B[1] */
  65513. "ldr r7, [%[b], #4]\n\t"
  65514. "lsl r3, r6, #16\n\t"
  65515. "lsl r4, r7, #16\n\t"
  65516. "lsr r3, r3, #16\n\t"
  65517. "lsr r4, r4, #16\n\t"
  65518. "mul r4, r3, r4\n\t"
  65519. "mov r10, #0\n\t"
  65520. "adds r9, r9, r4\n\t"
  65521. "adc r10, r10, #0\n\t"
  65522. "lsr r4, r7, #16\n\t"
  65523. "mul r3, r4, r3\n\t"
  65524. "lsr r4, r3, #16\n\t"
  65525. "lsl r3, r3, #16\n\t"
  65526. "adds r9, r9, r3\n\t"
  65527. "adc r10, r10, r4\n\t"
  65528. "lsr r3, r6, #16\n\t"
  65529. "lsr r4, r7, #16\n\t"
  65530. "mul r4, r3, r4\n\t"
  65531. "add r10, r10, r4\n\t"
  65532. "lsl r4, r7, #16\n\t"
  65533. "lsr r4, r4, #16\n\t"
  65534. "mul r3, r4, r3\n\t"
  65535. "lsr r4, r3, #16\n\t"
  65536. "lsl r3, r3, #16\n\t"
  65537. "adds r9, r9, r3\n\t"
  65538. "adc r10, r10, r4\n\t"
  65539. /* A[1] * B[0] */
  65540. "ldr r6, [%[a], #4]\n\t"
  65541. "ldr r7, [%[b]]\n\t"
  65542. "lsl r3, r6, #16\n\t"
  65543. "lsl r4, r7, #16\n\t"
  65544. "lsr r3, r3, #16\n\t"
  65545. "lsr r4, r4, #16\n\t"
  65546. "mul r4, r3, r4\n\t"
  65547. "adds r9, r9, r4\n\t"
  65548. "adcs r10, r10, #0\n\t"
  65549. "adc lr, r5, #0\n\t"
  65550. "lsr r4, r7, #16\n\t"
  65551. "mul r3, r4, r3\n\t"
  65552. "lsr r4, r3, #16\n\t"
  65553. "lsl r3, r3, #16\n\t"
  65554. "adds r9, r9, r3\n\t"
  65555. "adcs r10, r10, r4\n\t"
  65556. "adc lr, lr, #0\n\t"
  65557. "lsr r3, r6, #16\n\t"
  65558. "lsr r4, r7, #16\n\t"
  65559. "mul r4, r3, r4\n\t"
  65560. "adds r10, r10, r4\n\t"
  65561. "adc lr, lr, #0\n\t"
  65562. "lsl r4, r7, #16\n\t"
  65563. "lsr r4, r4, #16\n\t"
  65564. "mul r3, r4, r3\n\t"
  65565. "lsr r4, r3, #16\n\t"
  65566. "lsl r3, r3, #16\n\t"
  65567. "adds r9, r9, r3\n\t"
  65568. "adcs r10, r10, r4\n\t"
  65569. "adc lr, lr, #0\n\t"
  65570. "str r9, [sp, #4]\n\t"
  65571. /* A[2] * B[0] */
  65572. "ldr r6, [%[a], #8]\n\t"
  65573. "lsl r3, r6, #16\n\t"
  65574. "lsl r4, r7, #16\n\t"
  65575. "lsr r3, r3, #16\n\t"
  65576. "lsr r4, r4, #16\n\t"
  65577. "mul r4, r3, r4\n\t"
  65578. "adds r10, r10, r4\n\t"
  65579. "adc lr, lr, #0\n\t"
  65580. "lsr r4, r7, #16\n\t"
  65581. "mul r3, r4, r3\n\t"
  65582. "lsr r4, r3, #16\n\t"
  65583. "lsl r3, r3, #16\n\t"
  65584. "adds r10, r10, r3\n\t"
  65585. "adc lr, lr, r4\n\t"
  65586. "lsr r3, r6, #16\n\t"
  65587. "lsr r4, r7, #16\n\t"
  65588. "mul r4, r3, r4\n\t"
  65589. "add lr, lr, r4\n\t"
  65590. "lsl r4, r7, #16\n\t"
  65591. "lsr r4, r4, #16\n\t"
  65592. "mul r3, r4, r3\n\t"
  65593. "lsr r4, r3, #16\n\t"
  65594. "lsl r3, r3, #16\n\t"
  65595. "adds r10, r10, r3\n\t"
  65596. "adc lr, lr, r4\n\t"
  65597. /* A[1] * B[1] */
  65598. "ldr r6, [%[a], #4]\n\t"
  65599. "ldr r7, [%[b], #4]\n\t"
  65600. "lsl r3, r6, #16\n\t"
  65601. "lsl r4, r7, #16\n\t"
  65602. "lsr r3, r3, #16\n\t"
  65603. "lsr r4, r4, #16\n\t"
  65604. "mul r4, r3, r4\n\t"
  65605. "adds r10, r10, r4\n\t"
  65606. "adcs lr, lr, #0\n\t"
  65607. "adc r8, r5, #0\n\t"
  65608. "lsr r4, r7, #16\n\t"
  65609. "mul r3, r4, r3\n\t"
  65610. "lsr r4, r3, #16\n\t"
  65611. "lsl r3, r3, #16\n\t"
  65612. "adds r10, r10, r3\n\t"
  65613. "adcs lr, lr, r4\n\t"
  65614. "adc r8, r8, #0\n\t"
  65615. "lsr r3, r6, #16\n\t"
  65616. "lsr r4, r7, #16\n\t"
  65617. "mul r4, r3, r4\n\t"
  65618. "adds lr, lr, r4\n\t"
  65619. "adc r8, r8, #0\n\t"
  65620. "lsl r4, r7, #16\n\t"
  65621. "lsr r4, r4, #16\n\t"
  65622. "mul r3, r4, r3\n\t"
  65623. "lsr r4, r3, #16\n\t"
  65624. "lsl r3, r3, #16\n\t"
  65625. "adds r10, r10, r3\n\t"
  65626. "adcs lr, lr, r4\n\t"
  65627. "adc r8, r8, #0\n\t"
  65628. /* A[0] * B[2] */
  65629. "ldr r6, [%[a]]\n\t"
  65630. "ldr r7, [%[b], #8]\n\t"
  65631. "lsl r3, r6, #16\n\t"
  65632. "lsl r4, r7, #16\n\t"
  65633. "lsr r3, r3, #16\n\t"
  65634. "lsr r4, r4, #16\n\t"
  65635. "mul r4, r3, r4\n\t"
  65636. "adds r10, r10, r4\n\t"
  65637. "adcs lr, lr, #0\n\t"
  65638. "adc r8, r5, r8\n\t"
  65639. "lsr r4, r7, #16\n\t"
  65640. "mul r3, r4, r3\n\t"
  65641. "lsr r4, r3, #16\n\t"
  65642. "lsl r3, r3, #16\n\t"
  65643. "adds r10, r10, r3\n\t"
  65644. "adcs lr, lr, r4\n\t"
  65645. "adc r8, r8, #0\n\t"
  65646. "lsr r3, r6, #16\n\t"
  65647. "lsr r4, r7, #16\n\t"
  65648. "mul r4, r3, r4\n\t"
  65649. "adds lr, lr, r4\n\t"
  65650. "adc r8, r8, #0\n\t"
  65651. "lsl r4, r7, #16\n\t"
  65652. "lsr r4, r4, #16\n\t"
  65653. "mul r3, r4, r3\n\t"
  65654. "lsr r4, r3, #16\n\t"
  65655. "lsl r3, r3, #16\n\t"
  65656. "adds r10, r10, r3\n\t"
  65657. "adcs lr, lr, r4\n\t"
  65658. "adc r8, r8, #0\n\t"
  65659. "str r10, [sp, #8]\n\t"
  65660. /* A[0] * B[3] */
  65661. "ldr r7, [%[b], #12]\n\t"
  65662. "lsl r3, r6, #16\n\t"
  65663. "lsl r4, r7, #16\n\t"
  65664. "lsr r3, r3, #16\n\t"
  65665. "lsr r4, r4, #16\n\t"
  65666. "mul r4, r3, r4\n\t"
  65667. "adds lr, lr, r4\n\t"
  65668. "adcs r8, r8, #0\n\t"
  65669. "adc r9, r5, #0\n\t"
  65670. "lsr r4, r7, #16\n\t"
  65671. "mul r3, r4, r3\n\t"
  65672. "lsr r4, r3, #16\n\t"
  65673. "lsl r3, r3, #16\n\t"
  65674. "adds lr, lr, r3\n\t"
  65675. "adcs r8, r8, r4\n\t"
  65676. "adc r9, r9, #0\n\t"
  65677. "lsr r3, r6, #16\n\t"
  65678. "lsr r4, r7, #16\n\t"
  65679. "mul r4, r3, r4\n\t"
  65680. "adds r8, r8, r4\n\t"
  65681. "adc r9, r9, #0\n\t"
  65682. "lsl r4, r7, #16\n\t"
  65683. "lsr r4, r4, #16\n\t"
  65684. "mul r3, r4, r3\n\t"
  65685. "lsr r4, r3, #16\n\t"
  65686. "lsl r3, r3, #16\n\t"
  65687. "adds lr, lr, r3\n\t"
  65688. "adcs r8, r8, r4\n\t"
  65689. "adc r9, r9, #0\n\t"
  65690. /* A[1] * B[2] */
  65691. "ldr r6, [%[a], #4]\n\t"
  65692. "ldr r7, [%[b], #8]\n\t"
  65693. "lsl r3, r6, #16\n\t"
  65694. "lsl r4, r7, #16\n\t"
  65695. "lsr r3, r3, #16\n\t"
  65696. "lsr r4, r4, #16\n\t"
  65697. "mul r4, r3, r4\n\t"
  65698. "adds lr, lr, r4\n\t"
  65699. "adcs r8, r8, #0\n\t"
  65700. "adc r9, r5, r9\n\t"
  65701. "lsr r4, r7, #16\n\t"
  65702. "mul r3, r4, r3\n\t"
  65703. "lsr r4, r3, #16\n\t"
  65704. "lsl r3, r3, #16\n\t"
  65705. "adds lr, lr, r3\n\t"
  65706. "adcs r8, r8, r4\n\t"
  65707. "adc r9, r9, #0\n\t"
  65708. "lsr r3, r6, #16\n\t"
  65709. "lsr r4, r7, #16\n\t"
  65710. "mul r4, r3, r4\n\t"
  65711. "adds r8, r8, r4\n\t"
  65712. "adc r9, r9, #0\n\t"
  65713. "lsl r4, r7, #16\n\t"
  65714. "lsr r4, r4, #16\n\t"
  65715. "mul r3, r4, r3\n\t"
  65716. "lsr r4, r3, #16\n\t"
  65717. "lsl r3, r3, #16\n\t"
  65718. "adds lr, lr, r3\n\t"
  65719. "adcs r8, r8, r4\n\t"
  65720. "adc r9, r9, #0\n\t"
  65721. /* A[2] * B[1] */
  65722. "ldr r6, [%[a], #8]\n\t"
  65723. "ldr r7, [%[b], #4]\n\t"
  65724. "lsl r3, r6, #16\n\t"
  65725. "lsl r4, r7, #16\n\t"
  65726. "lsr r3, r3, #16\n\t"
  65727. "lsr r4, r4, #16\n\t"
  65728. "mul r4, r3, r4\n\t"
  65729. "adds lr, lr, r4\n\t"
  65730. "adcs r8, r8, #0\n\t"
  65731. "adc r9, r5, r9\n\t"
  65732. "lsr r4, r7, #16\n\t"
  65733. "mul r3, r4, r3\n\t"
  65734. "lsr r4, r3, #16\n\t"
  65735. "lsl r3, r3, #16\n\t"
  65736. "adds lr, lr, r3\n\t"
  65737. "adcs r8, r8, r4\n\t"
  65738. "adc r9, r9, #0\n\t"
  65739. "lsr r3, r6, #16\n\t"
  65740. "lsr r4, r7, #16\n\t"
  65741. "mul r4, r3, r4\n\t"
  65742. "adds r8, r8, r4\n\t"
  65743. "adc r9, r9, #0\n\t"
  65744. "lsl r4, r7, #16\n\t"
  65745. "lsr r4, r4, #16\n\t"
  65746. "mul r3, r4, r3\n\t"
  65747. "lsr r4, r3, #16\n\t"
  65748. "lsl r3, r3, #16\n\t"
  65749. "adds lr, lr, r3\n\t"
  65750. "adcs r8, r8, r4\n\t"
  65751. "adc r9, r9, #0\n\t"
  65752. /* A[3] * B[0] */
  65753. "ldr r6, [%[a], #12]\n\t"
  65754. "ldr r7, [%[b]]\n\t"
  65755. "lsl r3, r6, #16\n\t"
  65756. "lsl r4, r7, #16\n\t"
  65757. "lsr r3, r3, #16\n\t"
  65758. "lsr r4, r4, #16\n\t"
  65759. "mul r4, r3, r4\n\t"
  65760. "adds lr, lr, r4\n\t"
  65761. "adcs r8, r8, #0\n\t"
  65762. "adc r9, r5, r9\n\t"
  65763. "lsr r4, r7, #16\n\t"
  65764. "mul r3, r4, r3\n\t"
  65765. "lsr r4, r3, #16\n\t"
  65766. "lsl r3, r3, #16\n\t"
  65767. "adds lr, lr, r3\n\t"
  65768. "adcs r8, r8, r4\n\t"
  65769. "adc r9, r9, #0\n\t"
  65770. "lsr r3, r6, #16\n\t"
  65771. "lsr r4, r7, #16\n\t"
  65772. "mul r4, r3, r4\n\t"
  65773. "adds r8, r8, r4\n\t"
  65774. "adc r9, r9, #0\n\t"
  65775. "lsl r4, r7, #16\n\t"
  65776. "lsr r4, r4, #16\n\t"
  65777. "mul r3, r4, r3\n\t"
  65778. "lsr r4, r3, #16\n\t"
  65779. "lsl r3, r3, #16\n\t"
  65780. "adds lr, lr, r3\n\t"
  65781. "adcs r8, r8, r4\n\t"
  65782. "adc r9, r9, #0\n\t"
  65783. "str lr, [sp, #12]\n\t"
  65784. /* A[4] * B[0] */
  65785. "ldr r6, [%[a], #16]\n\t"
  65786. "lsl r3, r6, #16\n\t"
  65787. "lsl r4, r7, #16\n\t"
  65788. "lsr r3, r3, #16\n\t"
  65789. "lsr r4, r4, #16\n\t"
  65790. "mul r4, r3, r4\n\t"
  65791. "adds r8, r8, r4\n\t"
  65792. "adcs r9, r9, #0\n\t"
  65793. "adc r10, r5, #0\n\t"
  65794. "lsr r4, r7, #16\n\t"
  65795. "mul r3, r4, r3\n\t"
  65796. "lsr r4, r3, #16\n\t"
  65797. "lsl r3, r3, #16\n\t"
  65798. "adds r8, r8, r3\n\t"
  65799. "adcs r9, r9, r4\n\t"
  65800. "adc r10, r10, #0\n\t"
  65801. "lsr r3, r6, #16\n\t"
  65802. "lsr r4, r7, #16\n\t"
  65803. "mul r4, r3, r4\n\t"
  65804. "adds r9, r9, r4\n\t"
  65805. "adc r10, r10, #0\n\t"
  65806. "lsl r4, r7, #16\n\t"
  65807. "lsr r4, r4, #16\n\t"
  65808. "mul r3, r4, r3\n\t"
  65809. "lsr r4, r3, #16\n\t"
  65810. "lsl r3, r3, #16\n\t"
  65811. "adds r8, r8, r3\n\t"
  65812. "adcs r9, r9, r4\n\t"
  65813. "adc r10, r10, #0\n\t"
  65814. /* A[3] * B[1] */
  65815. "ldr r6, [%[a], #12]\n\t"
  65816. "ldr r7, [%[b], #4]\n\t"
  65817. "lsl r3, r6, #16\n\t"
  65818. "lsl r4, r7, #16\n\t"
  65819. "lsr r3, r3, #16\n\t"
  65820. "lsr r4, r4, #16\n\t"
  65821. "mul r4, r3, r4\n\t"
  65822. "adds r8, r8, r4\n\t"
  65823. "adcs r9, r9, #0\n\t"
  65824. "adc r10, r5, r10\n\t"
  65825. "lsr r4, r7, #16\n\t"
  65826. "mul r3, r4, r3\n\t"
  65827. "lsr r4, r3, #16\n\t"
  65828. "lsl r3, r3, #16\n\t"
  65829. "adds r8, r8, r3\n\t"
  65830. "adcs r9, r9, r4\n\t"
  65831. "adc r10, r10, #0\n\t"
  65832. "lsr r3, r6, #16\n\t"
  65833. "lsr r4, r7, #16\n\t"
  65834. "mul r4, r3, r4\n\t"
  65835. "adds r9, r9, r4\n\t"
  65836. "adc r10, r10, #0\n\t"
  65837. "lsl r4, r7, #16\n\t"
  65838. "lsr r4, r4, #16\n\t"
  65839. "mul r3, r4, r3\n\t"
  65840. "lsr r4, r3, #16\n\t"
  65841. "lsl r3, r3, #16\n\t"
  65842. "adds r8, r8, r3\n\t"
  65843. "adcs r9, r9, r4\n\t"
  65844. "adc r10, r10, #0\n\t"
  65845. /* A[2] * B[2] */
  65846. "ldr r6, [%[a], #8]\n\t"
  65847. "ldr r7, [%[b], #8]\n\t"
  65848. "lsl r3, r6, #16\n\t"
  65849. "lsl r4, r7, #16\n\t"
  65850. "lsr r3, r3, #16\n\t"
  65851. "lsr r4, r4, #16\n\t"
  65852. "mul r4, r3, r4\n\t"
  65853. "adds r8, r8, r4\n\t"
  65854. "adcs r9, r9, #0\n\t"
  65855. "adc r10, r5, r10\n\t"
  65856. "lsr r4, r7, #16\n\t"
  65857. "mul r3, r4, r3\n\t"
  65858. "lsr r4, r3, #16\n\t"
  65859. "lsl r3, r3, #16\n\t"
  65860. "adds r8, r8, r3\n\t"
  65861. "adcs r9, r9, r4\n\t"
  65862. "adc r10, r10, #0\n\t"
  65863. "lsr r3, r6, #16\n\t"
  65864. "lsr r4, r7, #16\n\t"
  65865. "mul r4, r3, r4\n\t"
  65866. "adds r9, r9, r4\n\t"
  65867. "adc r10, r10, #0\n\t"
  65868. "lsl r4, r7, #16\n\t"
  65869. "lsr r4, r4, #16\n\t"
  65870. "mul r3, r4, r3\n\t"
  65871. "lsr r4, r3, #16\n\t"
  65872. "lsl r3, r3, #16\n\t"
  65873. "adds r8, r8, r3\n\t"
  65874. "adcs r9, r9, r4\n\t"
  65875. "adc r10, r10, #0\n\t"
  65876. /* A[1] * B[3] */
  65877. "ldr r6, [%[a], #4]\n\t"
  65878. "ldr r7, [%[b], #12]\n\t"
  65879. "lsl r3, r6, #16\n\t"
  65880. "lsl r4, r7, #16\n\t"
  65881. "lsr r3, r3, #16\n\t"
  65882. "lsr r4, r4, #16\n\t"
  65883. "mul r4, r3, r4\n\t"
  65884. "adds r8, r8, r4\n\t"
  65885. "adcs r9, r9, #0\n\t"
  65886. "adc r10, r5, r10\n\t"
  65887. "lsr r4, r7, #16\n\t"
  65888. "mul r3, r4, r3\n\t"
  65889. "lsr r4, r3, #16\n\t"
  65890. "lsl r3, r3, #16\n\t"
  65891. "adds r8, r8, r3\n\t"
  65892. "adcs r9, r9, r4\n\t"
  65893. "adc r10, r10, #0\n\t"
  65894. "lsr r3, r6, #16\n\t"
  65895. "lsr r4, r7, #16\n\t"
  65896. "mul r4, r3, r4\n\t"
  65897. "adds r9, r9, r4\n\t"
  65898. "adc r10, r10, #0\n\t"
  65899. "lsl r4, r7, #16\n\t"
  65900. "lsr r4, r4, #16\n\t"
  65901. "mul r3, r4, r3\n\t"
  65902. "lsr r4, r3, #16\n\t"
  65903. "lsl r3, r3, #16\n\t"
  65904. "adds r8, r8, r3\n\t"
  65905. "adcs r9, r9, r4\n\t"
  65906. "adc r10, r10, #0\n\t"
  65907. /* A[0] * B[4] */
  65908. "ldr r6, [%[a]]\n\t"
  65909. "ldr r7, [%[b], #16]\n\t"
  65910. "lsl r3, r6, #16\n\t"
  65911. "lsl r4, r7, #16\n\t"
  65912. "lsr r3, r3, #16\n\t"
  65913. "lsr r4, r4, #16\n\t"
  65914. "mul r4, r3, r4\n\t"
  65915. "adds r8, r8, r4\n\t"
  65916. "adcs r9, r9, #0\n\t"
  65917. "adc r10, r5, r10\n\t"
  65918. "lsr r4, r7, #16\n\t"
  65919. "mul r3, r4, r3\n\t"
  65920. "lsr r4, r3, #16\n\t"
  65921. "lsl r3, r3, #16\n\t"
  65922. "adds r8, r8, r3\n\t"
  65923. "adcs r9, r9, r4\n\t"
  65924. "adc r10, r10, #0\n\t"
  65925. "lsr r3, r6, #16\n\t"
  65926. "lsr r4, r7, #16\n\t"
  65927. "mul r4, r3, r4\n\t"
  65928. "adds r9, r9, r4\n\t"
  65929. "adc r10, r10, #0\n\t"
  65930. "lsl r4, r7, #16\n\t"
  65931. "lsr r4, r4, #16\n\t"
  65932. "mul r3, r4, r3\n\t"
  65933. "lsr r4, r3, #16\n\t"
  65934. "lsl r3, r3, #16\n\t"
  65935. "adds r8, r8, r3\n\t"
  65936. "adcs r9, r9, r4\n\t"
  65937. "adc r10, r10, #0\n\t"
  65938. "str r8, [sp, #16]\n\t"
  65939. /* A[0] * B[5] */
  65940. "ldr r7, [%[b], #20]\n\t"
  65941. "lsl r3, r6, #16\n\t"
  65942. "lsl r4, r7, #16\n\t"
  65943. "lsr r3, r3, #16\n\t"
  65944. "lsr r4, r4, #16\n\t"
  65945. "mul r4, r3, r4\n\t"
  65946. "adds r9, r9, r4\n\t"
  65947. "adcs r10, r10, #0\n\t"
  65948. "adc lr, r5, #0\n\t"
  65949. "lsr r4, r7, #16\n\t"
  65950. "mul r3, r4, r3\n\t"
  65951. "lsr r4, r3, #16\n\t"
  65952. "lsl r3, r3, #16\n\t"
  65953. "adds r9, r9, r3\n\t"
  65954. "adcs r10, r10, r4\n\t"
  65955. "adc lr, lr, #0\n\t"
  65956. "lsr r3, r6, #16\n\t"
  65957. "lsr r4, r7, #16\n\t"
  65958. "mul r4, r3, r4\n\t"
  65959. "adds r10, r10, r4\n\t"
  65960. "adc lr, lr, #0\n\t"
  65961. "lsl r4, r7, #16\n\t"
  65962. "lsr r4, r4, #16\n\t"
  65963. "mul r3, r4, r3\n\t"
  65964. "lsr r4, r3, #16\n\t"
  65965. "lsl r3, r3, #16\n\t"
  65966. "adds r9, r9, r3\n\t"
  65967. "adcs r10, r10, r4\n\t"
  65968. "adc lr, lr, #0\n\t"
  65969. /* A[1] * B[4] */
  65970. "ldr r6, [%[a], #4]\n\t"
  65971. "ldr r7, [%[b], #16]\n\t"
  65972. "lsl r3, r6, #16\n\t"
  65973. "lsl r4, r7, #16\n\t"
  65974. "lsr r3, r3, #16\n\t"
  65975. "lsr r4, r4, #16\n\t"
  65976. "mul r4, r3, r4\n\t"
  65977. "adds r9, r9, r4\n\t"
  65978. "adcs r10, r10, #0\n\t"
  65979. "adc lr, r5, lr\n\t"
  65980. "lsr r4, r7, #16\n\t"
  65981. "mul r3, r4, r3\n\t"
  65982. "lsr r4, r3, #16\n\t"
  65983. "lsl r3, r3, #16\n\t"
  65984. "adds r9, r9, r3\n\t"
  65985. "adcs r10, r10, r4\n\t"
  65986. "adc lr, lr, #0\n\t"
  65987. "lsr r3, r6, #16\n\t"
  65988. "lsr r4, r7, #16\n\t"
  65989. "mul r4, r3, r4\n\t"
  65990. "adds r10, r10, r4\n\t"
  65991. "adc lr, lr, #0\n\t"
  65992. "lsl r4, r7, #16\n\t"
  65993. "lsr r4, r4, #16\n\t"
  65994. "mul r3, r4, r3\n\t"
  65995. "lsr r4, r3, #16\n\t"
  65996. "lsl r3, r3, #16\n\t"
  65997. "adds r9, r9, r3\n\t"
  65998. "adcs r10, r10, r4\n\t"
  65999. "adc lr, lr, #0\n\t"
  66000. /* A[2] * B[3] */
  66001. "ldr r6, [%[a], #8]\n\t"
  66002. "ldr r7, [%[b], #12]\n\t"
  66003. "lsl r3, r6, #16\n\t"
  66004. "lsl r4, r7, #16\n\t"
  66005. "lsr r3, r3, #16\n\t"
  66006. "lsr r4, r4, #16\n\t"
  66007. "mul r4, r3, r4\n\t"
  66008. "adds r9, r9, r4\n\t"
  66009. "adcs r10, r10, #0\n\t"
  66010. "adc lr, r5, lr\n\t"
  66011. "lsr r4, r7, #16\n\t"
  66012. "mul r3, r4, r3\n\t"
  66013. "lsr r4, r3, #16\n\t"
  66014. "lsl r3, r3, #16\n\t"
  66015. "adds r9, r9, r3\n\t"
  66016. "adcs r10, r10, r4\n\t"
  66017. "adc lr, lr, #0\n\t"
  66018. "lsr r3, r6, #16\n\t"
  66019. "lsr r4, r7, #16\n\t"
  66020. "mul r4, r3, r4\n\t"
  66021. "adds r10, r10, r4\n\t"
  66022. "adc lr, lr, #0\n\t"
  66023. "lsl r4, r7, #16\n\t"
  66024. "lsr r4, r4, #16\n\t"
  66025. "mul r3, r4, r3\n\t"
  66026. "lsr r4, r3, #16\n\t"
  66027. "lsl r3, r3, #16\n\t"
  66028. "adds r9, r9, r3\n\t"
  66029. "adcs r10, r10, r4\n\t"
  66030. "adc lr, lr, #0\n\t"
  66031. /* A[3] * B[2] */
  66032. "ldr r6, [%[a], #12]\n\t"
  66033. "ldr r7, [%[b], #8]\n\t"
  66034. "lsl r3, r6, #16\n\t"
  66035. "lsl r4, r7, #16\n\t"
  66036. "lsr r3, r3, #16\n\t"
  66037. "lsr r4, r4, #16\n\t"
  66038. "mul r4, r3, r4\n\t"
  66039. "adds r9, r9, r4\n\t"
  66040. "adcs r10, r10, #0\n\t"
  66041. "adc lr, r5, lr\n\t"
  66042. "lsr r4, r7, #16\n\t"
  66043. "mul r3, r4, r3\n\t"
  66044. "lsr r4, r3, #16\n\t"
  66045. "lsl r3, r3, #16\n\t"
  66046. "adds r9, r9, r3\n\t"
  66047. "adcs r10, r10, r4\n\t"
  66048. "adc lr, lr, #0\n\t"
  66049. "lsr r3, r6, #16\n\t"
  66050. "lsr r4, r7, #16\n\t"
  66051. "mul r4, r3, r4\n\t"
  66052. "adds r10, r10, r4\n\t"
  66053. "adc lr, lr, #0\n\t"
  66054. "lsl r4, r7, #16\n\t"
  66055. "lsr r4, r4, #16\n\t"
  66056. "mul r3, r4, r3\n\t"
  66057. "lsr r4, r3, #16\n\t"
  66058. "lsl r3, r3, #16\n\t"
  66059. "adds r9, r9, r3\n\t"
  66060. "adcs r10, r10, r4\n\t"
  66061. "adc lr, lr, #0\n\t"
  66062. /* A[4] * B[1] */
  66063. "ldr r6, [%[a], #16]\n\t"
  66064. "ldr r7, [%[b], #4]\n\t"
  66065. "lsl r3, r6, #16\n\t"
  66066. "lsl r4, r7, #16\n\t"
  66067. "lsr r3, r3, #16\n\t"
  66068. "lsr r4, r4, #16\n\t"
  66069. "mul r4, r3, r4\n\t"
  66070. "adds r9, r9, r4\n\t"
  66071. "adcs r10, r10, #0\n\t"
  66072. "adc lr, r5, lr\n\t"
  66073. "lsr r4, r7, #16\n\t"
  66074. "mul r3, r4, r3\n\t"
  66075. "lsr r4, r3, #16\n\t"
  66076. "lsl r3, r3, #16\n\t"
  66077. "adds r9, r9, r3\n\t"
  66078. "adcs r10, r10, r4\n\t"
  66079. "adc lr, lr, #0\n\t"
  66080. "lsr r3, r6, #16\n\t"
  66081. "lsr r4, r7, #16\n\t"
  66082. "mul r4, r3, r4\n\t"
  66083. "adds r10, r10, r4\n\t"
  66084. "adc lr, lr, #0\n\t"
  66085. "lsl r4, r7, #16\n\t"
  66086. "lsr r4, r4, #16\n\t"
  66087. "mul r3, r4, r3\n\t"
  66088. "lsr r4, r3, #16\n\t"
  66089. "lsl r3, r3, #16\n\t"
  66090. "adds r9, r9, r3\n\t"
  66091. "adcs r10, r10, r4\n\t"
  66092. "adc lr, lr, #0\n\t"
  66093. /* A[5] * B[0] */
  66094. "ldr r6, [%[a], #20]\n\t"
  66095. "ldr r7, [%[b]]\n\t"
  66096. "lsl r3, r6, #16\n\t"
  66097. "lsl r4, r7, #16\n\t"
  66098. "lsr r3, r3, #16\n\t"
  66099. "lsr r4, r4, #16\n\t"
  66100. "mul r4, r3, r4\n\t"
  66101. "adds r9, r9, r4\n\t"
  66102. "adcs r10, r10, #0\n\t"
  66103. "adc lr, r5, lr\n\t"
  66104. "lsr r4, r7, #16\n\t"
  66105. "mul r3, r4, r3\n\t"
  66106. "lsr r4, r3, #16\n\t"
  66107. "lsl r3, r3, #16\n\t"
  66108. "adds r9, r9, r3\n\t"
  66109. "adcs r10, r10, r4\n\t"
  66110. "adc lr, lr, #0\n\t"
  66111. "lsr r3, r6, #16\n\t"
  66112. "lsr r4, r7, #16\n\t"
  66113. "mul r4, r3, r4\n\t"
  66114. "adds r10, r10, r4\n\t"
  66115. "adc lr, lr, #0\n\t"
  66116. "lsl r4, r7, #16\n\t"
  66117. "lsr r4, r4, #16\n\t"
  66118. "mul r3, r4, r3\n\t"
  66119. "lsr r4, r3, #16\n\t"
  66120. "lsl r3, r3, #16\n\t"
  66121. "adds r9, r9, r3\n\t"
  66122. "adcs r10, r10, r4\n\t"
  66123. "adc lr, lr, #0\n\t"
  66124. "str r9, [sp, #20]\n\t"
  66125. /* A[6] * B[0] */
  66126. "ldr r6, [%[a], #24]\n\t"
  66127. "lsl r3, r6, #16\n\t"
  66128. "lsl r4, r7, #16\n\t"
  66129. "lsr r3, r3, #16\n\t"
  66130. "lsr r4, r4, #16\n\t"
  66131. "mul r4, r3, r4\n\t"
  66132. "adds r10, r10, r4\n\t"
  66133. "adcs lr, lr, #0\n\t"
  66134. "adc r8, r5, #0\n\t"
  66135. "lsr r4, r7, #16\n\t"
  66136. "mul r3, r4, r3\n\t"
  66137. "lsr r4, r3, #16\n\t"
  66138. "lsl r3, r3, #16\n\t"
  66139. "adds r10, r10, r3\n\t"
  66140. "adcs lr, lr, r4\n\t"
  66141. "adc r8, r8, #0\n\t"
  66142. "lsr r3, r6, #16\n\t"
  66143. "lsr r4, r7, #16\n\t"
  66144. "mul r4, r3, r4\n\t"
  66145. "adds lr, lr, r4\n\t"
  66146. "adc r8, r8, #0\n\t"
  66147. "lsl r4, r7, #16\n\t"
  66148. "lsr r4, r4, #16\n\t"
  66149. "mul r3, r4, r3\n\t"
  66150. "lsr r4, r3, #16\n\t"
  66151. "lsl r3, r3, #16\n\t"
  66152. "adds r10, r10, r3\n\t"
  66153. "adcs lr, lr, r4\n\t"
  66154. "adc r8, r8, #0\n\t"
  66155. /* A[5] * B[1] */
  66156. "ldr r6, [%[a], #20]\n\t"
  66157. "ldr r7, [%[b], #4]\n\t"
  66158. "lsl r3, r6, #16\n\t"
  66159. "lsl r4, r7, #16\n\t"
  66160. "lsr r3, r3, #16\n\t"
  66161. "lsr r4, r4, #16\n\t"
  66162. "mul r4, r3, r4\n\t"
  66163. "adds r10, r10, r4\n\t"
  66164. "adcs lr, lr, #0\n\t"
  66165. "adc r8, r5, r8\n\t"
  66166. "lsr r4, r7, #16\n\t"
  66167. "mul r3, r4, r3\n\t"
  66168. "lsr r4, r3, #16\n\t"
  66169. "lsl r3, r3, #16\n\t"
  66170. "adds r10, r10, r3\n\t"
  66171. "adcs lr, lr, r4\n\t"
  66172. "adc r8, r8, #0\n\t"
  66173. "lsr r3, r6, #16\n\t"
  66174. "lsr r4, r7, #16\n\t"
  66175. "mul r4, r3, r4\n\t"
  66176. "adds lr, lr, r4\n\t"
  66177. "adc r8, r8, #0\n\t"
  66178. "lsl r4, r7, #16\n\t"
  66179. "lsr r4, r4, #16\n\t"
  66180. "mul r3, r4, r3\n\t"
  66181. "lsr r4, r3, #16\n\t"
  66182. "lsl r3, r3, #16\n\t"
  66183. "adds r10, r10, r3\n\t"
  66184. "adcs lr, lr, r4\n\t"
  66185. "adc r8, r8, #0\n\t"
  66186. /* A[4] * B[2] */
  66187. "ldr r6, [%[a], #16]\n\t"
  66188. "ldr r7, [%[b], #8]\n\t"
  66189. "lsl r3, r6, #16\n\t"
  66190. "lsl r4, r7, #16\n\t"
  66191. "lsr r3, r3, #16\n\t"
  66192. "lsr r4, r4, #16\n\t"
  66193. "mul r4, r3, r4\n\t"
  66194. "adds r10, r10, r4\n\t"
  66195. "adcs lr, lr, #0\n\t"
  66196. "adc r8, r5, r8\n\t"
  66197. "lsr r4, r7, #16\n\t"
  66198. "mul r3, r4, r3\n\t"
  66199. "lsr r4, r3, #16\n\t"
  66200. "lsl r3, r3, #16\n\t"
  66201. "adds r10, r10, r3\n\t"
  66202. "adcs lr, lr, r4\n\t"
  66203. "adc r8, r8, #0\n\t"
  66204. "lsr r3, r6, #16\n\t"
  66205. "lsr r4, r7, #16\n\t"
  66206. "mul r4, r3, r4\n\t"
  66207. "adds lr, lr, r4\n\t"
  66208. "adc r8, r8, #0\n\t"
  66209. "lsl r4, r7, #16\n\t"
  66210. "lsr r4, r4, #16\n\t"
  66211. "mul r3, r4, r3\n\t"
  66212. "lsr r4, r3, #16\n\t"
  66213. "lsl r3, r3, #16\n\t"
  66214. "adds r10, r10, r3\n\t"
  66215. "adcs lr, lr, r4\n\t"
  66216. "adc r8, r8, #0\n\t"
  66217. /* A[3] * B[3] */
  66218. "ldr r6, [%[a], #12]\n\t"
  66219. "ldr r7, [%[b], #12]\n\t"
  66220. "lsl r3, r6, #16\n\t"
  66221. "lsl r4, r7, #16\n\t"
  66222. "lsr r3, r3, #16\n\t"
  66223. "lsr r4, r4, #16\n\t"
  66224. "mul r4, r3, r4\n\t"
  66225. "adds r10, r10, r4\n\t"
  66226. "adcs lr, lr, #0\n\t"
  66227. "adc r8, r5, r8\n\t"
  66228. "lsr r4, r7, #16\n\t"
  66229. "mul r3, r4, r3\n\t"
  66230. "lsr r4, r3, #16\n\t"
  66231. "lsl r3, r3, #16\n\t"
  66232. "adds r10, r10, r3\n\t"
  66233. "adcs lr, lr, r4\n\t"
  66234. "adc r8, r8, #0\n\t"
  66235. "lsr r3, r6, #16\n\t"
  66236. "lsr r4, r7, #16\n\t"
  66237. "mul r4, r3, r4\n\t"
  66238. "adds lr, lr, r4\n\t"
  66239. "adc r8, r8, #0\n\t"
  66240. "lsl r4, r7, #16\n\t"
  66241. "lsr r4, r4, #16\n\t"
  66242. "mul r3, r4, r3\n\t"
  66243. "lsr r4, r3, #16\n\t"
  66244. "lsl r3, r3, #16\n\t"
  66245. "adds r10, r10, r3\n\t"
  66246. "adcs lr, lr, r4\n\t"
  66247. "adc r8, r8, #0\n\t"
  66248. /* A[2] * B[4] */
  66249. "ldr r6, [%[a], #8]\n\t"
  66250. "ldr r7, [%[b], #16]\n\t"
  66251. "lsl r3, r6, #16\n\t"
  66252. "lsl r4, r7, #16\n\t"
  66253. "lsr r3, r3, #16\n\t"
  66254. "lsr r4, r4, #16\n\t"
  66255. "mul r4, r3, r4\n\t"
  66256. "adds r10, r10, r4\n\t"
  66257. "adcs lr, lr, #0\n\t"
  66258. "adc r8, r5, r8\n\t"
  66259. "lsr r4, r7, #16\n\t"
  66260. "mul r3, r4, r3\n\t"
  66261. "lsr r4, r3, #16\n\t"
  66262. "lsl r3, r3, #16\n\t"
  66263. "adds r10, r10, r3\n\t"
  66264. "adcs lr, lr, r4\n\t"
  66265. "adc r8, r8, #0\n\t"
  66266. "lsr r3, r6, #16\n\t"
  66267. "lsr r4, r7, #16\n\t"
  66268. "mul r4, r3, r4\n\t"
  66269. "adds lr, lr, r4\n\t"
  66270. "adc r8, r8, #0\n\t"
  66271. "lsl r4, r7, #16\n\t"
  66272. "lsr r4, r4, #16\n\t"
  66273. "mul r3, r4, r3\n\t"
  66274. "lsr r4, r3, #16\n\t"
  66275. "lsl r3, r3, #16\n\t"
  66276. "adds r10, r10, r3\n\t"
  66277. "adcs lr, lr, r4\n\t"
  66278. "adc r8, r8, #0\n\t"
  66279. /* A[1] * B[5] */
  66280. "ldr r6, [%[a], #4]\n\t"
  66281. "ldr r7, [%[b], #20]\n\t"
  66282. "lsl r3, r6, #16\n\t"
  66283. "lsl r4, r7, #16\n\t"
  66284. "lsr r3, r3, #16\n\t"
  66285. "lsr r4, r4, #16\n\t"
  66286. "mul r4, r3, r4\n\t"
  66287. "adds r10, r10, r4\n\t"
  66288. "adcs lr, lr, #0\n\t"
  66289. "adc r8, r5, r8\n\t"
  66290. "lsr r4, r7, #16\n\t"
  66291. "mul r3, r4, r3\n\t"
  66292. "lsr r4, r3, #16\n\t"
  66293. "lsl r3, r3, #16\n\t"
  66294. "adds r10, r10, r3\n\t"
  66295. "adcs lr, lr, r4\n\t"
  66296. "adc r8, r8, #0\n\t"
  66297. "lsr r3, r6, #16\n\t"
  66298. "lsr r4, r7, #16\n\t"
  66299. "mul r4, r3, r4\n\t"
  66300. "adds lr, lr, r4\n\t"
  66301. "adc r8, r8, #0\n\t"
  66302. "lsl r4, r7, #16\n\t"
  66303. "lsr r4, r4, #16\n\t"
  66304. "mul r3, r4, r3\n\t"
  66305. "lsr r4, r3, #16\n\t"
  66306. "lsl r3, r3, #16\n\t"
  66307. "adds r10, r10, r3\n\t"
  66308. "adcs lr, lr, r4\n\t"
  66309. "adc r8, r8, #0\n\t"
  66310. /* A[0] * B[6] */
  66311. "ldr r6, [%[a]]\n\t"
  66312. "ldr r7, [%[b], #24]\n\t"
  66313. "lsl r3, r6, #16\n\t"
  66314. "lsl r4, r7, #16\n\t"
  66315. "lsr r3, r3, #16\n\t"
  66316. "lsr r4, r4, #16\n\t"
  66317. "mul r4, r3, r4\n\t"
  66318. "adds r10, r10, r4\n\t"
  66319. "adcs lr, lr, #0\n\t"
  66320. "adc r8, r5, r8\n\t"
  66321. "lsr r4, r7, #16\n\t"
  66322. "mul r3, r4, r3\n\t"
  66323. "lsr r4, r3, #16\n\t"
  66324. "lsl r3, r3, #16\n\t"
  66325. "adds r10, r10, r3\n\t"
  66326. "adcs lr, lr, r4\n\t"
  66327. "adc r8, r8, #0\n\t"
  66328. "lsr r3, r6, #16\n\t"
  66329. "lsr r4, r7, #16\n\t"
  66330. "mul r4, r3, r4\n\t"
  66331. "adds lr, lr, r4\n\t"
  66332. "adc r8, r8, #0\n\t"
  66333. "lsl r4, r7, #16\n\t"
  66334. "lsr r4, r4, #16\n\t"
  66335. "mul r3, r4, r3\n\t"
  66336. "lsr r4, r3, #16\n\t"
  66337. "lsl r3, r3, #16\n\t"
  66338. "adds r10, r10, r3\n\t"
  66339. "adcs lr, lr, r4\n\t"
  66340. "adc r8, r8, #0\n\t"
  66341. "str r10, [sp, #24]\n\t"
  66342. /* A[0] * B[7] */
  66343. "ldr r7, [%[b], #28]\n\t"
  66344. "lsl r3, r6, #16\n\t"
  66345. "lsl r4, r7, #16\n\t"
  66346. "lsr r3, r3, #16\n\t"
  66347. "lsr r4, r4, #16\n\t"
  66348. "mul r4, r3, r4\n\t"
  66349. "adds lr, lr, r4\n\t"
  66350. "adcs r8, r8, #0\n\t"
  66351. "adc r9, r5, #0\n\t"
  66352. "lsr r4, r7, #16\n\t"
  66353. "mul r3, r4, r3\n\t"
  66354. "lsr r4, r3, #16\n\t"
  66355. "lsl r3, r3, #16\n\t"
  66356. "adds lr, lr, r3\n\t"
  66357. "adcs r8, r8, r4\n\t"
  66358. "adc r9, r9, #0\n\t"
  66359. "lsr r3, r6, #16\n\t"
  66360. "lsr r4, r7, #16\n\t"
  66361. "mul r4, r3, r4\n\t"
  66362. "adds r8, r8, r4\n\t"
  66363. "adc r9, r9, #0\n\t"
  66364. "lsl r4, r7, #16\n\t"
  66365. "lsr r4, r4, #16\n\t"
  66366. "mul r3, r4, r3\n\t"
  66367. "lsr r4, r3, #16\n\t"
  66368. "lsl r3, r3, #16\n\t"
  66369. "adds lr, lr, r3\n\t"
  66370. "adcs r8, r8, r4\n\t"
  66371. "adc r9, r9, #0\n\t"
  66372. /* A[1] * B[6] */
  66373. "ldr r6, [%[a], #4]\n\t"
  66374. "ldr r7, [%[b], #24]\n\t"
  66375. "lsl r3, r6, #16\n\t"
  66376. "lsl r4, r7, #16\n\t"
  66377. "lsr r3, r3, #16\n\t"
  66378. "lsr r4, r4, #16\n\t"
  66379. "mul r4, r3, r4\n\t"
  66380. "adds lr, lr, r4\n\t"
  66381. "adcs r8, r8, #0\n\t"
  66382. "adc r9, r5, r9\n\t"
  66383. "lsr r4, r7, #16\n\t"
  66384. "mul r3, r4, r3\n\t"
  66385. "lsr r4, r3, #16\n\t"
  66386. "lsl r3, r3, #16\n\t"
  66387. "adds lr, lr, r3\n\t"
  66388. "adcs r8, r8, r4\n\t"
  66389. "adc r9, r9, #0\n\t"
  66390. "lsr r3, r6, #16\n\t"
  66391. "lsr r4, r7, #16\n\t"
  66392. "mul r4, r3, r4\n\t"
  66393. "adds r8, r8, r4\n\t"
  66394. "adc r9, r9, #0\n\t"
  66395. "lsl r4, r7, #16\n\t"
  66396. "lsr r4, r4, #16\n\t"
  66397. "mul r3, r4, r3\n\t"
  66398. "lsr r4, r3, #16\n\t"
  66399. "lsl r3, r3, #16\n\t"
  66400. "adds lr, lr, r3\n\t"
  66401. "adcs r8, r8, r4\n\t"
  66402. "adc r9, r9, #0\n\t"
  66403. /* A[2] * B[5] */
  66404. "ldr r6, [%[a], #8]\n\t"
  66405. "ldr r7, [%[b], #20]\n\t"
  66406. "lsl r3, r6, #16\n\t"
  66407. "lsl r4, r7, #16\n\t"
  66408. "lsr r3, r3, #16\n\t"
  66409. "lsr r4, r4, #16\n\t"
  66410. "mul r4, r3, r4\n\t"
  66411. "adds lr, lr, r4\n\t"
  66412. "adcs r8, r8, #0\n\t"
  66413. "adc r9, r5, r9\n\t"
  66414. "lsr r4, r7, #16\n\t"
  66415. "mul r3, r4, r3\n\t"
  66416. "lsr r4, r3, #16\n\t"
  66417. "lsl r3, r3, #16\n\t"
  66418. "adds lr, lr, r3\n\t"
  66419. "adcs r8, r8, r4\n\t"
  66420. "adc r9, r9, #0\n\t"
  66421. "lsr r3, r6, #16\n\t"
  66422. "lsr r4, r7, #16\n\t"
  66423. "mul r4, r3, r4\n\t"
  66424. "adds r8, r8, r4\n\t"
  66425. "adc r9, r9, #0\n\t"
  66426. "lsl r4, r7, #16\n\t"
  66427. "lsr r4, r4, #16\n\t"
  66428. "mul r3, r4, r3\n\t"
  66429. "lsr r4, r3, #16\n\t"
  66430. "lsl r3, r3, #16\n\t"
  66431. "adds lr, lr, r3\n\t"
  66432. "adcs r8, r8, r4\n\t"
  66433. "adc r9, r9, #0\n\t"
  66434. /* A[3] * B[4] */
  66435. "ldr r6, [%[a], #12]\n\t"
  66436. "ldr r7, [%[b], #16]\n\t"
  66437. "lsl r3, r6, #16\n\t"
  66438. "lsl r4, r7, #16\n\t"
  66439. "lsr r3, r3, #16\n\t"
  66440. "lsr r4, r4, #16\n\t"
  66441. "mul r4, r3, r4\n\t"
  66442. "adds lr, lr, r4\n\t"
  66443. "adcs r8, r8, #0\n\t"
  66444. "adc r9, r5, r9\n\t"
  66445. "lsr r4, r7, #16\n\t"
  66446. "mul r3, r4, r3\n\t"
  66447. "lsr r4, r3, #16\n\t"
  66448. "lsl r3, r3, #16\n\t"
  66449. "adds lr, lr, r3\n\t"
  66450. "adcs r8, r8, r4\n\t"
  66451. "adc r9, r9, #0\n\t"
  66452. "lsr r3, r6, #16\n\t"
  66453. "lsr r4, r7, #16\n\t"
  66454. "mul r4, r3, r4\n\t"
  66455. "adds r8, r8, r4\n\t"
  66456. "adc r9, r9, #0\n\t"
  66457. "lsl r4, r7, #16\n\t"
  66458. "lsr r4, r4, #16\n\t"
  66459. "mul r3, r4, r3\n\t"
  66460. "lsr r4, r3, #16\n\t"
  66461. "lsl r3, r3, #16\n\t"
  66462. "adds lr, lr, r3\n\t"
  66463. "adcs r8, r8, r4\n\t"
  66464. "adc r9, r9, #0\n\t"
  66465. /* A[4] * B[3] */
  66466. "ldr r6, [%[a], #16]\n\t"
  66467. "ldr r7, [%[b], #12]\n\t"
  66468. "lsl r3, r6, #16\n\t"
  66469. "lsl r4, r7, #16\n\t"
  66470. "lsr r3, r3, #16\n\t"
  66471. "lsr r4, r4, #16\n\t"
  66472. "mul r4, r3, r4\n\t"
  66473. "adds lr, lr, r4\n\t"
  66474. "adcs r8, r8, #0\n\t"
  66475. "adc r9, r5, r9\n\t"
  66476. "lsr r4, r7, #16\n\t"
  66477. "mul r3, r4, r3\n\t"
  66478. "lsr r4, r3, #16\n\t"
  66479. "lsl r3, r3, #16\n\t"
  66480. "adds lr, lr, r3\n\t"
  66481. "adcs r8, r8, r4\n\t"
  66482. "adc r9, r9, #0\n\t"
  66483. "lsr r3, r6, #16\n\t"
  66484. "lsr r4, r7, #16\n\t"
  66485. "mul r4, r3, r4\n\t"
  66486. "adds r8, r8, r4\n\t"
  66487. "adc r9, r9, #0\n\t"
  66488. "lsl r4, r7, #16\n\t"
  66489. "lsr r4, r4, #16\n\t"
  66490. "mul r3, r4, r3\n\t"
  66491. "lsr r4, r3, #16\n\t"
  66492. "lsl r3, r3, #16\n\t"
  66493. "adds lr, lr, r3\n\t"
  66494. "adcs r8, r8, r4\n\t"
  66495. "adc r9, r9, #0\n\t"
  66496. /* A[5] * B[2] */
  66497. "ldr r6, [%[a], #20]\n\t"
  66498. "ldr r7, [%[b], #8]\n\t"
  66499. "lsl r3, r6, #16\n\t"
  66500. "lsl r4, r7, #16\n\t"
  66501. "lsr r3, r3, #16\n\t"
  66502. "lsr r4, r4, #16\n\t"
  66503. "mul r4, r3, r4\n\t"
  66504. "adds lr, lr, r4\n\t"
  66505. "adcs r8, r8, #0\n\t"
  66506. "adc r9, r5, r9\n\t"
  66507. "lsr r4, r7, #16\n\t"
  66508. "mul r3, r4, r3\n\t"
  66509. "lsr r4, r3, #16\n\t"
  66510. "lsl r3, r3, #16\n\t"
  66511. "adds lr, lr, r3\n\t"
  66512. "adcs r8, r8, r4\n\t"
  66513. "adc r9, r9, #0\n\t"
  66514. "lsr r3, r6, #16\n\t"
  66515. "lsr r4, r7, #16\n\t"
  66516. "mul r4, r3, r4\n\t"
  66517. "adds r8, r8, r4\n\t"
  66518. "adc r9, r9, #0\n\t"
  66519. "lsl r4, r7, #16\n\t"
  66520. "lsr r4, r4, #16\n\t"
  66521. "mul r3, r4, r3\n\t"
  66522. "lsr r4, r3, #16\n\t"
  66523. "lsl r3, r3, #16\n\t"
  66524. "adds lr, lr, r3\n\t"
  66525. "adcs r8, r8, r4\n\t"
  66526. "adc r9, r9, #0\n\t"
  66527. /* A[6] * B[1] */
  66528. "ldr r6, [%[a], #24]\n\t"
  66529. "ldr r7, [%[b], #4]\n\t"
  66530. "lsl r3, r6, #16\n\t"
  66531. "lsl r4, r7, #16\n\t"
  66532. "lsr r3, r3, #16\n\t"
  66533. "lsr r4, r4, #16\n\t"
  66534. "mul r4, r3, r4\n\t"
  66535. "adds lr, lr, r4\n\t"
  66536. "adcs r8, r8, #0\n\t"
  66537. "adc r9, r5, r9\n\t"
  66538. "lsr r4, r7, #16\n\t"
  66539. "mul r3, r4, r3\n\t"
  66540. "lsr r4, r3, #16\n\t"
  66541. "lsl r3, r3, #16\n\t"
  66542. "adds lr, lr, r3\n\t"
  66543. "adcs r8, r8, r4\n\t"
  66544. "adc r9, r9, #0\n\t"
  66545. "lsr r3, r6, #16\n\t"
  66546. "lsr r4, r7, #16\n\t"
  66547. "mul r4, r3, r4\n\t"
  66548. "adds r8, r8, r4\n\t"
  66549. "adc r9, r9, #0\n\t"
  66550. "lsl r4, r7, #16\n\t"
  66551. "lsr r4, r4, #16\n\t"
  66552. "mul r3, r4, r3\n\t"
  66553. "lsr r4, r3, #16\n\t"
  66554. "lsl r3, r3, #16\n\t"
  66555. "adds lr, lr, r3\n\t"
  66556. "adcs r8, r8, r4\n\t"
  66557. "adc r9, r9, #0\n\t"
  66558. /* A[7] * B[0] */
  66559. "ldr r6, [%[a], #28]\n\t"
  66560. "ldr r7, [%[b]]\n\t"
  66561. "lsl r3, r6, #16\n\t"
  66562. "lsl r4, r7, #16\n\t"
  66563. "lsr r3, r3, #16\n\t"
  66564. "lsr r4, r4, #16\n\t"
  66565. "mul r4, r3, r4\n\t"
  66566. "adds lr, lr, r4\n\t"
  66567. "adcs r8, r8, #0\n\t"
  66568. "adc r9, r5, r9\n\t"
  66569. "lsr r4, r7, #16\n\t"
  66570. "mul r3, r4, r3\n\t"
  66571. "lsr r4, r3, #16\n\t"
  66572. "lsl r3, r3, #16\n\t"
  66573. "adds lr, lr, r3\n\t"
  66574. "adcs r8, r8, r4\n\t"
  66575. "adc r9, r9, #0\n\t"
  66576. "lsr r3, r6, #16\n\t"
  66577. "lsr r4, r7, #16\n\t"
  66578. "mul r4, r3, r4\n\t"
  66579. "adds r8, r8, r4\n\t"
  66580. "adc r9, r9, #0\n\t"
  66581. "lsl r4, r7, #16\n\t"
  66582. "lsr r4, r4, #16\n\t"
  66583. "mul r3, r4, r3\n\t"
  66584. "lsr r4, r3, #16\n\t"
  66585. "lsl r3, r3, #16\n\t"
  66586. "adds lr, lr, r3\n\t"
  66587. "adcs r8, r8, r4\n\t"
  66588. "adc r9, r9, #0\n\t"
  66589. "str lr, [sp, #28]\n\t"
  66590. /* A[7] * B[1] */
  66591. "ldr r7, [%[b], #4]\n\t"
  66592. "lsl r3, r6, #16\n\t"
  66593. "lsl r4, r7, #16\n\t"
  66594. "lsr r3, r3, #16\n\t"
  66595. "lsr r4, r4, #16\n\t"
  66596. "mul r4, r3, r4\n\t"
  66597. "adds r8, r8, r4\n\t"
  66598. "adcs r9, r9, #0\n\t"
  66599. "adc r10, r5, #0\n\t"
  66600. "lsr r4, r7, #16\n\t"
  66601. "mul r3, r4, r3\n\t"
  66602. "lsr r4, r3, #16\n\t"
  66603. "lsl r3, r3, #16\n\t"
  66604. "adds r8, r8, r3\n\t"
  66605. "adcs r9, r9, r4\n\t"
  66606. "adc r10, r10, #0\n\t"
  66607. "lsr r3, r6, #16\n\t"
  66608. "lsr r4, r7, #16\n\t"
  66609. "mul r4, r3, r4\n\t"
  66610. "adds r9, r9, r4\n\t"
  66611. "adc r10, r10, #0\n\t"
  66612. "lsl r4, r7, #16\n\t"
  66613. "lsr r4, r4, #16\n\t"
  66614. "mul r3, r4, r3\n\t"
  66615. "lsr r4, r3, #16\n\t"
  66616. "lsl r3, r3, #16\n\t"
  66617. "adds r8, r8, r3\n\t"
  66618. "adcs r9, r9, r4\n\t"
  66619. "adc r10, r10, #0\n\t"
  66620. /* A[6] * B[2] */
  66621. "ldr r6, [%[a], #24]\n\t"
  66622. "ldr r7, [%[b], #8]\n\t"
  66623. "lsl r3, r6, #16\n\t"
  66624. "lsl r4, r7, #16\n\t"
  66625. "lsr r3, r3, #16\n\t"
  66626. "lsr r4, r4, #16\n\t"
  66627. "mul r4, r3, r4\n\t"
  66628. "adds r8, r8, r4\n\t"
  66629. "adcs r9, r9, #0\n\t"
  66630. "adc r10, r5, r10\n\t"
  66631. "lsr r4, r7, #16\n\t"
  66632. "mul r3, r4, r3\n\t"
  66633. "lsr r4, r3, #16\n\t"
  66634. "lsl r3, r3, #16\n\t"
  66635. "adds r8, r8, r3\n\t"
  66636. "adcs r9, r9, r4\n\t"
  66637. "adc r10, r10, #0\n\t"
  66638. "lsr r3, r6, #16\n\t"
  66639. "lsr r4, r7, #16\n\t"
  66640. "mul r4, r3, r4\n\t"
  66641. "adds r9, r9, r4\n\t"
  66642. "adc r10, r10, #0\n\t"
  66643. "lsl r4, r7, #16\n\t"
  66644. "lsr r4, r4, #16\n\t"
  66645. "mul r3, r4, r3\n\t"
  66646. "lsr r4, r3, #16\n\t"
  66647. "lsl r3, r3, #16\n\t"
  66648. "adds r8, r8, r3\n\t"
  66649. "adcs r9, r9, r4\n\t"
  66650. "adc r10, r10, #0\n\t"
  66651. /* A[5] * B[3] */
  66652. "ldr r6, [%[a], #20]\n\t"
  66653. "ldr r7, [%[b], #12]\n\t"
  66654. "lsl r3, r6, #16\n\t"
  66655. "lsl r4, r7, #16\n\t"
  66656. "lsr r3, r3, #16\n\t"
  66657. "lsr r4, r4, #16\n\t"
  66658. "mul r4, r3, r4\n\t"
  66659. "adds r8, r8, r4\n\t"
  66660. "adcs r9, r9, #0\n\t"
  66661. "adc r10, r5, r10\n\t"
  66662. "lsr r4, r7, #16\n\t"
  66663. "mul r3, r4, r3\n\t"
  66664. "lsr r4, r3, #16\n\t"
  66665. "lsl r3, r3, #16\n\t"
  66666. "adds r8, r8, r3\n\t"
  66667. "adcs r9, r9, r4\n\t"
  66668. "adc r10, r10, #0\n\t"
  66669. "lsr r3, r6, #16\n\t"
  66670. "lsr r4, r7, #16\n\t"
  66671. "mul r4, r3, r4\n\t"
  66672. "adds r9, r9, r4\n\t"
  66673. "adc r10, r10, #0\n\t"
  66674. "lsl r4, r7, #16\n\t"
  66675. "lsr r4, r4, #16\n\t"
  66676. "mul r3, r4, r3\n\t"
  66677. "lsr r4, r3, #16\n\t"
  66678. "lsl r3, r3, #16\n\t"
  66679. "adds r8, r8, r3\n\t"
  66680. "adcs r9, r9, r4\n\t"
  66681. "adc r10, r10, #0\n\t"
  66682. /* A[4] * B[4] */
  66683. "ldr r6, [%[a], #16]\n\t"
  66684. "ldr r7, [%[b], #16]\n\t"
  66685. "lsl r3, r6, #16\n\t"
  66686. "lsl r4, r7, #16\n\t"
  66687. "lsr r3, r3, #16\n\t"
  66688. "lsr r4, r4, #16\n\t"
  66689. "mul r4, r3, r4\n\t"
  66690. "adds r8, r8, r4\n\t"
  66691. "adcs r9, r9, #0\n\t"
  66692. "adc r10, r5, r10\n\t"
  66693. "lsr r4, r7, #16\n\t"
  66694. "mul r3, r4, r3\n\t"
  66695. "lsr r4, r3, #16\n\t"
  66696. "lsl r3, r3, #16\n\t"
  66697. "adds r8, r8, r3\n\t"
  66698. "adcs r9, r9, r4\n\t"
  66699. "adc r10, r10, #0\n\t"
  66700. "lsr r3, r6, #16\n\t"
  66701. "lsr r4, r7, #16\n\t"
  66702. "mul r4, r3, r4\n\t"
  66703. "adds r9, r9, r4\n\t"
  66704. "adc r10, r10, #0\n\t"
  66705. "lsl r4, r7, #16\n\t"
  66706. "lsr r4, r4, #16\n\t"
  66707. "mul r3, r4, r3\n\t"
  66708. "lsr r4, r3, #16\n\t"
  66709. "lsl r3, r3, #16\n\t"
  66710. "adds r8, r8, r3\n\t"
  66711. "adcs r9, r9, r4\n\t"
  66712. "adc r10, r10, #0\n\t"
  66713. /* A[3] * B[5] */
  66714. "ldr r6, [%[a], #12]\n\t"
  66715. "ldr r7, [%[b], #20]\n\t"
  66716. "lsl r3, r6, #16\n\t"
  66717. "lsl r4, r7, #16\n\t"
  66718. "lsr r3, r3, #16\n\t"
  66719. "lsr r4, r4, #16\n\t"
  66720. "mul r4, r3, r4\n\t"
  66721. "adds r8, r8, r4\n\t"
  66722. "adcs r9, r9, #0\n\t"
  66723. "adc r10, r5, r10\n\t"
  66724. "lsr r4, r7, #16\n\t"
  66725. "mul r3, r4, r3\n\t"
  66726. "lsr r4, r3, #16\n\t"
  66727. "lsl r3, r3, #16\n\t"
  66728. "adds r8, r8, r3\n\t"
  66729. "adcs r9, r9, r4\n\t"
  66730. "adc r10, r10, #0\n\t"
  66731. "lsr r3, r6, #16\n\t"
  66732. "lsr r4, r7, #16\n\t"
  66733. "mul r4, r3, r4\n\t"
  66734. "adds r9, r9, r4\n\t"
  66735. "adc r10, r10, #0\n\t"
  66736. "lsl r4, r7, #16\n\t"
  66737. "lsr r4, r4, #16\n\t"
  66738. "mul r3, r4, r3\n\t"
  66739. "lsr r4, r3, #16\n\t"
  66740. "lsl r3, r3, #16\n\t"
  66741. "adds r8, r8, r3\n\t"
  66742. "adcs r9, r9, r4\n\t"
  66743. "adc r10, r10, #0\n\t"
  66744. /* A[2] * B[6] */
  66745. "ldr r6, [%[a], #8]\n\t"
  66746. "ldr r7, [%[b], #24]\n\t"
  66747. "lsl r3, r6, #16\n\t"
  66748. "lsl r4, r7, #16\n\t"
  66749. "lsr r3, r3, #16\n\t"
  66750. "lsr r4, r4, #16\n\t"
  66751. "mul r4, r3, r4\n\t"
  66752. "adds r8, r8, r4\n\t"
  66753. "adcs r9, r9, #0\n\t"
  66754. "adc r10, r5, r10\n\t"
  66755. "lsr r4, r7, #16\n\t"
  66756. "mul r3, r4, r3\n\t"
  66757. "lsr r4, r3, #16\n\t"
  66758. "lsl r3, r3, #16\n\t"
  66759. "adds r8, r8, r3\n\t"
  66760. "adcs r9, r9, r4\n\t"
  66761. "adc r10, r10, #0\n\t"
  66762. "lsr r3, r6, #16\n\t"
  66763. "lsr r4, r7, #16\n\t"
  66764. "mul r4, r3, r4\n\t"
  66765. "adds r9, r9, r4\n\t"
  66766. "adc r10, r10, #0\n\t"
  66767. "lsl r4, r7, #16\n\t"
  66768. "lsr r4, r4, #16\n\t"
  66769. "mul r3, r4, r3\n\t"
  66770. "lsr r4, r3, #16\n\t"
  66771. "lsl r3, r3, #16\n\t"
  66772. "adds r8, r8, r3\n\t"
  66773. "adcs r9, r9, r4\n\t"
  66774. "adc r10, r10, #0\n\t"
  66775. /* A[1] * B[7] */
  66776. "ldr r6, [%[a], #4]\n\t"
  66777. "ldr r7, [%[b], #28]\n\t"
  66778. "lsl r3, r6, #16\n\t"
  66779. "lsl r4, r7, #16\n\t"
  66780. "lsr r3, r3, #16\n\t"
  66781. "lsr r4, r4, #16\n\t"
  66782. "mul r4, r3, r4\n\t"
  66783. "adds r8, r8, r4\n\t"
  66784. "adcs r9, r9, #0\n\t"
  66785. "adc r10, r5, r10\n\t"
  66786. "lsr r4, r7, #16\n\t"
  66787. "mul r3, r4, r3\n\t"
  66788. "lsr r4, r3, #16\n\t"
  66789. "lsl r3, r3, #16\n\t"
  66790. "adds r8, r8, r3\n\t"
  66791. "adcs r9, r9, r4\n\t"
  66792. "adc r10, r10, #0\n\t"
  66793. "lsr r3, r6, #16\n\t"
  66794. "lsr r4, r7, #16\n\t"
  66795. "mul r4, r3, r4\n\t"
  66796. "adds r9, r9, r4\n\t"
  66797. "adc r10, r10, #0\n\t"
  66798. "lsl r4, r7, #16\n\t"
  66799. "lsr r4, r4, #16\n\t"
  66800. "mul r3, r4, r3\n\t"
  66801. "lsr r4, r3, #16\n\t"
  66802. "lsl r3, r3, #16\n\t"
  66803. "adds r8, r8, r3\n\t"
  66804. "adcs r9, r9, r4\n\t"
  66805. "adc r10, r10, #0\n\t"
  66806. "str r8, [sp, #32]\n\t"
  66807. /* A[2] * B[7] */
  66808. "ldr r6, [%[a], #8]\n\t"
  66809. "lsl r3, r6, #16\n\t"
  66810. "lsl r4, r7, #16\n\t"
  66811. "lsr r3, r3, #16\n\t"
  66812. "lsr r4, r4, #16\n\t"
  66813. "mul r4, r3, r4\n\t"
  66814. "adds r9, r9, r4\n\t"
  66815. "adcs r10, r10, #0\n\t"
  66816. "adc lr, r5, #0\n\t"
  66817. "lsr r4, r7, #16\n\t"
  66818. "mul r3, r4, r3\n\t"
  66819. "lsr r4, r3, #16\n\t"
  66820. "lsl r3, r3, #16\n\t"
  66821. "adds r9, r9, r3\n\t"
  66822. "adcs r10, r10, r4\n\t"
  66823. "adc lr, lr, #0\n\t"
  66824. "lsr r3, r6, #16\n\t"
  66825. "lsr r4, r7, #16\n\t"
  66826. "mul r4, r3, r4\n\t"
  66827. "adds r10, r10, r4\n\t"
  66828. "adc lr, lr, #0\n\t"
  66829. "lsl r4, r7, #16\n\t"
  66830. "lsr r4, r4, #16\n\t"
  66831. "mul r3, r4, r3\n\t"
  66832. "lsr r4, r3, #16\n\t"
  66833. "lsl r3, r3, #16\n\t"
  66834. "adds r9, r9, r3\n\t"
  66835. "adcs r10, r10, r4\n\t"
  66836. "adc lr, lr, #0\n\t"
  66837. /* A[3] * B[6] */
  66838. "ldr r6, [%[a], #12]\n\t"
  66839. "ldr r7, [%[b], #24]\n\t"
  66840. "lsl r3, r6, #16\n\t"
  66841. "lsl r4, r7, #16\n\t"
  66842. "lsr r3, r3, #16\n\t"
  66843. "lsr r4, r4, #16\n\t"
  66844. "mul r4, r3, r4\n\t"
  66845. "adds r9, r9, r4\n\t"
  66846. "adcs r10, r10, #0\n\t"
  66847. "adc lr, r5, lr\n\t"
  66848. "lsr r4, r7, #16\n\t"
  66849. "mul r3, r4, r3\n\t"
  66850. "lsr r4, r3, #16\n\t"
  66851. "lsl r3, r3, #16\n\t"
  66852. "adds r9, r9, r3\n\t"
  66853. "adcs r10, r10, r4\n\t"
  66854. "adc lr, lr, #0\n\t"
  66855. "lsr r3, r6, #16\n\t"
  66856. "lsr r4, r7, #16\n\t"
  66857. "mul r4, r3, r4\n\t"
  66858. "adds r10, r10, r4\n\t"
  66859. "adc lr, lr, #0\n\t"
  66860. "lsl r4, r7, #16\n\t"
  66861. "lsr r4, r4, #16\n\t"
  66862. "mul r3, r4, r3\n\t"
  66863. "lsr r4, r3, #16\n\t"
  66864. "lsl r3, r3, #16\n\t"
  66865. "adds r9, r9, r3\n\t"
  66866. "adcs r10, r10, r4\n\t"
  66867. "adc lr, lr, #0\n\t"
  66868. /* A[4] * B[5] */
  66869. "ldr r6, [%[a], #16]\n\t"
  66870. "ldr r7, [%[b], #20]\n\t"
  66871. "lsl r3, r6, #16\n\t"
  66872. "lsl r4, r7, #16\n\t"
  66873. "lsr r3, r3, #16\n\t"
  66874. "lsr r4, r4, #16\n\t"
  66875. "mul r4, r3, r4\n\t"
  66876. "adds r9, r9, r4\n\t"
  66877. "adcs r10, r10, #0\n\t"
  66878. "adc lr, r5, lr\n\t"
  66879. "lsr r4, r7, #16\n\t"
  66880. "mul r3, r4, r3\n\t"
  66881. "lsr r4, r3, #16\n\t"
  66882. "lsl r3, r3, #16\n\t"
  66883. "adds r9, r9, r3\n\t"
  66884. "adcs r10, r10, r4\n\t"
  66885. "adc lr, lr, #0\n\t"
  66886. "lsr r3, r6, #16\n\t"
  66887. "lsr r4, r7, #16\n\t"
  66888. "mul r4, r3, r4\n\t"
  66889. "adds r10, r10, r4\n\t"
  66890. "adc lr, lr, #0\n\t"
  66891. "lsl r4, r7, #16\n\t"
  66892. "lsr r4, r4, #16\n\t"
  66893. "mul r3, r4, r3\n\t"
  66894. "lsr r4, r3, #16\n\t"
  66895. "lsl r3, r3, #16\n\t"
  66896. "adds r9, r9, r3\n\t"
  66897. "adcs r10, r10, r4\n\t"
  66898. "adc lr, lr, #0\n\t"
  66899. /* A[5] * B[4] */
  66900. "ldr r6, [%[a], #20]\n\t"
  66901. "ldr r7, [%[b], #16]\n\t"
  66902. "lsl r3, r6, #16\n\t"
  66903. "lsl r4, r7, #16\n\t"
  66904. "lsr r3, r3, #16\n\t"
  66905. "lsr r4, r4, #16\n\t"
  66906. "mul r4, r3, r4\n\t"
  66907. "adds r9, r9, r4\n\t"
  66908. "adcs r10, r10, #0\n\t"
  66909. "adc lr, r5, lr\n\t"
  66910. "lsr r4, r7, #16\n\t"
  66911. "mul r3, r4, r3\n\t"
  66912. "lsr r4, r3, #16\n\t"
  66913. "lsl r3, r3, #16\n\t"
  66914. "adds r9, r9, r3\n\t"
  66915. "adcs r10, r10, r4\n\t"
  66916. "adc lr, lr, #0\n\t"
  66917. "lsr r3, r6, #16\n\t"
  66918. "lsr r4, r7, #16\n\t"
  66919. "mul r4, r3, r4\n\t"
  66920. "adds r10, r10, r4\n\t"
  66921. "adc lr, lr, #0\n\t"
  66922. "lsl r4, r7, #16\n\t"
  66923. "lsr r4, r4, #16\n\t"
  66924. "mul r3, r4, r3\n\t"
  66925. "lsr r4, r3, #16\n\t"
  66926. "lsl r3, r3, #16\n\t"
  66927. "adds r9, r9, r3\n\t"
  66928. "adcs r10, r10, r4\n\t"
  66929. "adc lr, lr, #0\n\t"
  66930. /* A[6] * B[3] */
  66931. "ldr r6, [%[a], #24]\n\t"
  66932. "ldr r7, [%[b], #12]\n\t"
  66933. "lsl r3, r6, #16\n\t"
  66934. "lsl r4, r7, #16\n\t"
  66935. "lsr r3, r3, #16\n\t"
  66936. "lsr r4, r4, #16\n\t"
  66937. "mul r4, r3, r4\n\t"
  66938. "adds r9, r9, r4\n\t"
  66939. "adcs r10, r10, #0\n\t"
  66940. "adc lr, r5, lr\n\t"
  66941. "lsr r4, r7, #16\n\t"
  66942. "mul r3, r4, r3\n\t"
  66943. "lsr r4, r3, #16\n\t"
  66944. "lsl r3, r3, #16\n\t"
  66945. "adds r9, r9, r3\n\t"
  66946. "adcs r10, r10, r4\n\t"
  66947. "adc lr, lr, #0\n\t"
  66948. "lsr r3, r6, #16\n\t"
  66949. "lsr r4, r7, #16\n\t"
  66950. "mul r4, r3, r4\n\t"
  66951. "adds r10, r10, r4\n\t"
  66952. "adc lr, lr, #0\n\t"
  66953. "lsl r4, r7, #16\n\t"
  66954. "lsr r4, r4, #16\n\t"
  66955. "mul r3, r4, r3\n\t"
  66956. "lsr r4, r3, #16\n\t"
  66957. "lsl r3, r3, #16\n\t"
  66958. "adds r9, r9, r3\n\t"
  66959. "adcs r10, r10, r4\n\t"
  66960. "adc lr, lr, #0\n\t"
  66961. /* A[7] * B[2] */
  66962. "ldr r6, [%[a], #28]\n\t"
  66963. "ldr r7, [%[b], #8]\n\t"
  66964. "lsl r3, r6, #16\n\t"
  66965. "lsl r4, r7, #16\n\t"
  66966. "lsr r3, r3, #16\n\t"
  66967. "lsr r4, r4, #16\n\t"
  66968. "mul r4, r3, r4\n\t"
  66969. "adds r9, r9, r4\n\t"
  66970. "adcs r10, r10, #0\n\t"
  66971. "adc lr, r5, lr\n\t"
  66972. "lsr r4, r7, #16\n\t"
  66973. "mul r3, r4, r3\n\t"
  66974. "lsr r4, r3, #16\n\t"
  66975. "lsl r3, r3, #16\n\t"
  66976. "adds r9, r9, r3\n\t"
  66977. "adcs r10, r10, r4\n\t"
  66978. "adc lr, lr, #0\n\t"
  66979. "lsr r3, r6, #16\n\t"
  66980. "lsr r4, r7, #16\n\t"
  66981. "mul r4, r3, r4\n\t"
  66982. "adds r10, r10, r4\n\t"
  66983. "adc lr, lr, #0\n\t"
  66984. "lsl r4, r7, #16\n\t"
  66985. "lsr r4, r4, #16\n\t"
  66986. "mul r3, r4, r3\n\t"
  66987. "lsr r4, r3, #16\n\t"
  66988. "lsl r3, r3, #16\n\t"
  66989. "adds r9, r9, r3\n\t"
  66990. "adcs r10, r10, r4\n\t"
  66991. "adc lr, lr, #0\n\t"
  66992. "str r9, [sp, #36]\n\t"
  66993. /* A[7] * B[3] */
  66994. "ldr r7, [%[b], #12]\n\t"
  66995. "lsl r3, r6, #16\n\t"
  66996. "lsl r4, r7, #16\n\t"
  66997. "lsr r3, r3, #16\n\t"
  66998. "lsr r4, r4, #16\n\t"
  66999. "mul r4, r3, r4\n\t"
  67000. "adds r10, r10, r4\n\t"
  67001. "adcs lr, lr, #0\n\t"
  67002. "adc r8, r5, #0\n\t"
  67003. "lsr r4, r7, #16\n\t"
  67004. "mul r3, r4, r3\n\t"
  67005. "lsr r4, r3, #16\n\t"
  67006. "lsl r3, r3, #16\n\t"
  67007. "adds r10, r10, r3\n\t"
  67008. "adcs lr, lr, r4\n\t"
  67009. "adc r8, r8, #0\n\t"
  67010. "lsr r3, r6, #16\n\t"
  67011. "lsr r4, r7, #16\n\t"
  67012. "mul r4, r3, r4\n\t"
  67013. "adds lr, lr, r4\n\t"
  67014. "adc r8, r8, #0\n\t"
  67015. "lsl r4, r7, #16\n\t"
  67016. "lsr r4, r4, #16\n\t"
  67017. "mul r3, r4, r3\n\t"
  67018. "lsr r4, r3, #16\n\t"
  67019. "lsl r3, r3, #16\n\t"
  67020. "adds r10, r10, r3\n\t"
  67021. "adcs lr, lr, r4\n\t"
  67022. "adc r8, r8, #0\n\t"
  67023. /* A[6] * B[4] */
  67024. "ldr r6, [%[a], #24]\n\t"
  67025. "ldr r7, [%[b], #16]\n\t"
  67026. "lsl r3, r6, #16\n\t"
  67027. "lsl r4, r7, #16\n\t"
  67028. "lsr r3, r3, #16\n\t"
  67029. "lsr r4, r4, #16\n\t"
  67030. "mul r4, r3, r4\n\t"
  67031. "adds r10, r10, r4\n\t"
  67032. "adcs lr, lr, #0\n\t"
  67033. "adc r8, r5, r8\n\t"
  67034. "lsr r4, r7, #16\n\t"
  67035. "mul r3, r4, r3\n\t"
  67036. "lsr r4, r3, #16\n\t"
  67037. "lsl r3, r3, #16\n\t"
  67038. "adds r10, r10, r3\n\t"
  67039. "adcs lr, lr, r4\n\t"
  67040. "adc r8, r8, #0\n\t"
  67041. "lsr r3, r6, #16\n\t"
  67042. "lsr r4, r7, #16\n\t"
  67043. "mul r4, r3, r4\n\t"
  67044. "adds lr, lr, r4\n\t"
  67045. "adc r8, r8, #0\n\t"
  67046. "lsl r4, r7, #16\n\t"
  67047. "lsr r4, r4, #16\n\t"
  67048. "mul r3, r4, r3\n\t"
  67049. "lsr r4, r3, #16\n\t"
  67050. "lsl r3, r3, #16\n\t"
  67051. "adds r10, r10, r3\n\t"
  67052. "adcs lr, lr, r4\n\t"
  67053. "adc r8, r8, #0\n\t"
  67054. /* A[5] * B[5] */
  67055. "ldr r6, [%[a], #20]\n\t"
  67056. "ldr r7, [%[b], #20]\n\t"
  67057. "lsl r3, r6, #16\n\t"
  67058. "lsl r4, r7, #16\n\t"
  67059. "lsr r3, r3, #16\n\t"
  67060. "lsr r4, r4, #16\n\t"
  67061. "mul r4, r3, r4\n\t"
  67062. "adds r10, r10, r4\n\t"
  67063. "adcs lr, lr, #0\n\t"
  67064. "adc r8, r5, r8\n\t"
  67065. "lsr r4, r7, #16\n\t"
  67066. "mul r3, r4, r3\n\t"
  67067. "lsr r4, r3, #16\n\t"
  67068. "lsl r3, r3, #16\n\t"
  67069. "adds r10, r10, r3\n\t"
  67070. "adcs lr, lr, r4\n\t"
  67071. "adc r8, r8, #0\n\t"
  67072. "lsr r3, r6, #16\n\t"
  67073. "lsr r4, r7, #16\n\t"
  67074. "mul r4, r3, r4\n\t"
  67075. "adds lr, lr, r4\n\t"
  67076. "adc r8, r8, #0\n\t"
  67077. "lsl r4, r7, #16\n\t"
  67078. "lsr r4, r4, #16\n\t"
  67079. "mul r3, r4, r3\n\t"
  67080. "lsr r4, r3, #16\n\t"
  67081. "lsl r3, r3, #16\n\t"
  67082. "adds r10, r10, r3\n\t"
  67083. "adcs lr, lr, r4\n\t"
  67084. "adc r8, r8, #0\n\t"
  67085. /* A[4] * B[6] */
  67086. "ldr r6, [%[a], #16]\n\t"
  67087. "ldr r7, [%[b], #24]\n\t"
  67088. "lsl r3, r6, #16\n\t"
  67089. "lsl r4, r7, #16\n\t"
  67090. "lsr r3, r3, #16\n\t"
  67091. "lsr r4, r4, #16\n\t"
  67092. "mul r4, r3, r4\n\t"
  67093. "adds r10, r10, r4\n\t"
  67094. "adcs lr, lr, #0\n\t"
  67095. "adc r8, r5, r8\n\t"
  67096. "lsr r4, r7, #16\n\t"
  67097. "mul r3, r4, r3\n\t"
  67098. "lsr r4, r3, #16\n\t"
  67099. "lsl r3, r3, #16\n\t"
  67100. "adds r10, r10, r3\n\t"
  67101. "adcs lr, lr, r4\n\t"
  67102. "adc r8, r8, #0\n\t"
  67103. "lsr r3, r6, #16\n\t"
  67104. "lsr r4, r7, #16\n\t"
  67105. "mul r4, r3, r4\n\t"
  67106. "adds lr, lr, r4\n\t"
  67107. "adc r8, r8, #0\n\t"
  67108. "lsl r4, r7, #16\n\t"
  67109. "lsr r4, r4, #16\n\t"
  67110. "mul r3, r4, r3\n\t"
  67111. "lsr r4, r3, #16\n\t"
  67112. "lsl r3, r3, #16\n\t"
  67113. "adds r10, r10, r3\n\t"
  67114. "adcs lr, lr, r4\n\t"
  67115. "adc r8, r8, #0\n\t"
  67116. /* A[3] * B[7] */
  67117. "ldr r6, [%[a], #12]\n\t"
  67118. "ldr r7, [%[b], #28]\n\t"
  67119. "lsl r3, r6, #16\n\t"
  67120. "lsl r4, r7, #16\n\t"
  67121. "lsr r3, r3, #16\n\t"
  67122. "lsr r4, r4, #16\n\t"
  67123. "mul r4, r3, r4\n\t"
  67124. "adds r10, r10, r4\n\t"
  67125. "adcs lr, lr, #0\n\t"
  67126. "adc r8, r5, r8\n\t"
  67127. "lsr r4, r7, #16\n\t"
  67128. "mul r3, r4, r3\n\t"
  67129. "lsr r4, r3, #16\n\t"
  67130. "lsl r3, r3, #16\n\t"
  67131. "adds r10, r10, r3\n\t"
  67132. "adcs lr, lr, r4\n\t"
  67133. "adc r8, r8, #0\n\t"
  67134. "lsr r3, r6, #16\n\t"
  67135. "lsr r4, r7, #16\n\t"
  67136. "mul r4, r3, r4\n\t"
  67137. "adds lr, lr, r4\n\t"
  67138. "adc r8, r8, #0\n\t"
  67139. "lsl r4, r7, #16\n\t"
  67140. "lsr r4, r4, #16\n\t"
  67141. "mul r3, r4, r3\n\t"
  67142. "lsr r4, r3, #16\n\t"
  67143. "lsl r3, r3, #16\n\t"
  67144. "adds r10, r10, r3\n\t"
  67145. "adcs lr, lr, r4\n\t"
  67146. "adc r8, r8, #0\n\t"
  67147. "str r10, [sp, #40]\n\t"
  67148. /* A[4] * B[7] */
  67149. "ldr r6, [%[a], #16]\n\t"
  67150. "lsl r3, r6, #16\n\t"
  67151. "lsl r4, r7, #16\n\t"
  67152. "lsr r3, r3, #16\n\t"
  67153. "lsr r4, r4, #16\n\t"
  67154. "mul r4, r3, r4\n\t"
  67155. "adds lr, lr, r4\n\t"
  67156. "adcs r8, r8, #0\n\t"
  67157. "adc r9, r5, #0\n\t"
  67158. "lsr r4, r7, #16\n\t"
  67159. "mul r3, r4, r3\n\t"
  67160. "lsr r4, r3, #16\n\t"
  67161. "lsl r3, r3, #16\n\t"
  67162. "adds lr, lr, r3\n\t"
  67163. "adcs r8, r8, r4\n\t"
  67164. "adc r9, r9, #0\n\t"
  67165. "lsr r3, r6, #16\n\t"
  67166. "lsr r4, r7, #16\n\t"
  67167. "mul r4, r3, r4\n\t"
  67168. "adds r8, r8, r4\n\t"
  67169. "adc r9, r9, #0\n\t"
  67170. "lsl r4, r7, #16\n\t"
  67171. "lsr r4, r4, #16\n\t"
  67172. "mul r3, r4, r3\n\t"
  67173. "lsr r4, r3, #16\n\t"
  67174. "lsl r3, r3, #16\n\t"
  67175. "adds lr, lr, r3\n\t"
  67176. "adcs r8, r8, r4\n\t"
  67177. "adc r9, r9, #0\n\t"
  67178. /* A[5] * B[6] */
  67179. "ldr r6, [%[a], #20]\n\t"
  67180. "ldr r7, [%[b], #24]\n\t"
  67181. "lsl r3, r6, #16\n\t"
  67182. "lsl r4, r7, #16\n\t"
  67183. "lsr r3, r3, #16\n\t"
  67184. "lsr r4, r4, #16\n\t"
  67185. "mul r4, r3, r4\n\t"
  67186. "adds lr, lr, r4\n\t"
  67187. "adcs r8, r8, #0\n\t"
  67188. "adc r9, r5, r9\n\t"
  67189. "lsr r4, r7, #16\n\t"
  67190. "mul r3, r4, r3\n\t"
  67191. "lsr r4, r3, #16\n\t"
  67192. "lsl r3, r3, #16\n\t"
  67193. "adds lr, lr, r3\n\t"
  67194. "adcs r8, r8, r4\n\t"
  67195. "adc r9, r9, #0\n\t"
  67196. "lsr r3, r6, #16\n\t"
  67197. "lsr r4, r7, #16\n\t"
  67198. "mul r4, r3, r4\n\t"
  67199. "adds r8, r8, r4\n\t"
  67200. "adc r9, r9, #0\n\t"
  67201. "lsl r4, r7, #16\n\t"
  67202. "lsr r4, r4, #16\n\t"
  67203. "mul r3, r4, r3\n\t"
  67204. "lsr r4, r3, #16\n\t"
  67205. "lsl r3, r3, #16\n\t"
  67206. "adds lr, lr, r3\n\t"
  67207. "adcs r8, r8, r4\n\t"
  67208. "adc r9, r9, #0\n\t"
  67209. /* A[6] * B[5] */
  67210. "ldr r6, [%[a], #24]\n\t"
  67211. "ldr r7, [%[b], #20]\n\t"
  67212. "lsl r3, r6, #16\n\t"
  67213. "lsl r4, r7, #16\n\t"
  67214. "lsr r3, r3, #16\n\t"
  67215. "lsr r4, r4, #16\n\t"
  67216. "mul r4, r3, r4\n\t"
  67217. "adds lr, lr, r4\n\t"
  67218. "adcs r8, r8, #0\n\t"
  67219. "adc r9, r5, r9\n\t"
  67220. "lsr r4, r7, #16\n\t"
  67221. "mul r3, r4, r3\n\t"
  67222. "lsr r4, r3, #16\n\t"
  67223. "lsl r3, r3, #16\n\t"
  67224. "adds lr, lr, r3\n\t"
  67225. "adcs r8, r8, r4\n\t"
  67226. "adc r9, r9, #0\n\t"
  67227. "lsr r3, r6, #16\n\t"
  67228. "lsr r4, r7, #16\n\t"
  67229. "mul r4, r3, r4\n\t"
  67230. "adds r8, r8, r4\n\t"
  67231. "adc r9, r9, #0\n\t"
  67232. "lsl r4, r7, #16\n\t"
  67233. "lsr r4, r4, #16\n\t"
  67234. "mul r3, r4, r3\n\t"
  67235. "lsr r4, r3, #16\n\t"
  67236. "lsl r3, r3, #16\n\t"
  67237. "adds lr, lr, r3\n\t"
  67238. "adcs r8, r8, r4\n\t"
  67239. "adc r9, r9, #0\n\t"
  67240. /* A[7] * B[4] */
  67241. "ldr r6, [%[a], #28]\n\t"
  67242. "ldr r7, [%[b], #16]\n\t"
  67243. "lsl r3, r6, #16\n\t"
  67244. "lsl r4, r7, #16\n\t"
  67245. "lsr r3, r3, #16\n\t"
  67246. "lsr r4, r4, #16\n\t"
  67247. "mul r4, r3, r4\n\t"
  67248. "adds lr, lr, r4\n\t"
  67249. "adcs r8, r8, #0\n\t"
  67250. "adc r9, r5, r9\n\t"
  67251. "lsr r4, r7, #16\n\t"
  67252. "mul r3, r4, r3\n\t"
  67253. "lsr r4, r3, #16\n\t"
  67254. "lsl r3, r3, #16\n\t"
  67255. "adds lr, lr, r3\n\t"
  67256. "adcs r8, r8, r4\n\t"
  67257. "adc r9, r9, #0\n\t"
  67258. "lsr r3, r6, #16\n\t"
  67259. "lsr r4, r7, #16\n\t"
  67260. "mul r4, r3, r4\n\t"
  67261. "adds r8, r8, r4\n\t"
  67262. "adc r9, r9, #0\n\t"
  67263. "lsl r4, r7, #16\n\t"
  67264. "lsr r4, r4, #16\n\t"
  67265. "mul r3, r4, r3\n\t"
  67266. "lsr r4, r3, #16\n\t"
  67267. "lsl r3, r3, #16\n\t"
  67268. "adds lr, lr, r3\n\t"
  67269. "adcs r8, r8, r4\n\t"
  67270. "adc r9, r9, #0\n\t"
  67271. "str lr, [sp, #44]\n\t"
  67272. /* A[7] * B[5] */
  67273. "ldr r7, [%[b], #20]\n\t"
  67274. "lsl r3, r6, #16\n\t"
  67275. "lsl r4, r7, #16\n\t"
  67276. "lsr r3, r3, #16\n\t"
  67277. "lsr r4, r4, #16\n\t"
  67278. "mul r4, r3, r4\n\t"
  67279. "adds r8, r8, r4\n\t"
  67280. "adcs r9, r9, #0\n\t"
  67281. "adc r10, r5, #0\n\t"
  67282. "lsr r4, r7, #16\n\t"
  67283. "mul r3, r4, r3\n\t"
  67284. "lsr r4, r3, #16\n\t"
  67285. "lsl r3, r3, #16\n\t"
  67286. "adds r8, r8, r3\n\t"
  67287. "adcs r9, r9, r4\n\t"
  67288. "adc r10, r10, #0\n\t"
  67289. "lsr r3, r6, #16\n\t"
  67290. "lsr r4, r7, #16\n\t"
  67291. "mul r4, r3, r4\n\t"
  67292. "adds r9, r9, r4\n\t"
  67293. "adc r10, r10, #0\n\t"
  67294. "lsl r4, r7, #16\n\t"
  67295. "lsr r4, r4, #16\n\t"
  67296. "mul r3, r4, r3\n\t"
  67297. "lsr r4, r3, #16\n\t"
  67298. "lsl r3, r3, #16\n\t"
  67299. "adds r8, r8, r3\n\t"
  67300. "adcs r9, r9, r4\n\t"
  67301. "adc r10, r10, #0\n\t"
  67302. /* A[6] * B[6] */
  67303. "ldr r6, [%[a], #24]\n\t"
  67304. "ldr r7, [%[b], #24]\n\t"
  67305. "lsl r3, r6, #16\n\t"
  67306. "lsl r4, r7, #16\n\t"
  67307. "lsr r3, r3, #16\n\t"
  67308. "lsr r4, r4, #16\n\t"
  67309. "mul r4, r3, r4\n\t"
  67310. "adds r8, r8, r4\n\t"
  67311. "adcs r9, r9, #0\n\t"
  67312. "adc r10, r5, r10\n\t"
  67313. "lsr r4, r7, #16\n\t"
  67314. "mul r3, r4, r3\n\t"
  67315. "lsr r4, r3, #16\n\t"
  67316. "lsl r3, r3, #16\n\t"
  67317. "adds r8, r8, r3\n\t"
  67318. "adcs r9, r9, r4\n\t"
  67319. "adc r10, r10, #0\n\t"
  67320. "lsr r3, r6, #16\n\t"
  67321. "lsr r4, r7, #16\n\t"
  67322. "mul r4, r3, r4\n\t"
  67323. "adds r9, r9, r4\n\t"
  67324. "adc r10, r10, #0\n\t"
  67325. "lsl r4, r7, #16\n\t"
  67326. "lsr r4, r4, #16\n\t"
  67327. "mul r3, r4, r3\n\t"
  67328. "lsr r4, r3, #16\n\t"
  67329. "lsl r3, r3, #16\n\t"
  67330. "adds r8, r8, r3\n\t"
  67331. "adcs r9, r9, r4\n\t"
  67332. "adc r10, r10, #0\n\t"
  67333. /* A[5] * B[7] */
  67334. "ldr r6, [%[a], #20]\n\t"
  67335. "ldr r7, [%[b], #28]\n\t"
  67336. "lsl r3, r6, #16\n\t"
  67337. "lsl r4, r7, #16\n\t"
  67338. "lsr r3, r3, #16\n\t"
  67339. "lsr r4, r4, #16\n\t"
  67340. "mul r4, r3, r4\n\t"
  67341. "adds r8, r8, r4\n\t"
  67342. "adcs r9, r9, #0\n\t"
  67343. "adc r10, r5, r10\n\t"
  67344. "lsr r4, r7, #16\n\t"
  67345. "mul r3, r4, r3\n\t"
  67346. "lsr r4, r3, #16\n\t"
  67347. "lsl r3, r3, #16\n\t"
  67348. "adds r8, r8, r3\n\t"
  67349. "adcs r9, r9, r4\n\t"
  67350. "adc r10, r10, #0\n\t"
  67351. "lsr r3, r6, #16\n\t"
  67352. "lsr r4, r7, #16\n\t"
  67353. "mul r4, r3, r4\n\t"
  67354. "adds r9, r9, r4\n\t"
  67355. "adc r10, r10, #0\n\t"
  67356. "lsl r4, r7, #16\n\t"
  67357. "lsr r4, r4, #16\n\t"
  67358. "mul r3, r4, r3\n\t"
  67359. "lsr r4, r3, #16\n\t"
  67360. "lsl r3, r3, #16\n\t"
  67361. "adds r8, r8, r3\n\t"
  67362. "adcs r9, r9, r4\n\t"
  67363. "adc r10, r10, #0\n\t"
  67364. /* A[6] * B[7] */
  67365. "ldr r6, [%[a], #24]\n\t"
  67366. "lsl r3, r6, #16\n\t"
  67367. "lsl r4, r7, #16\n\t"
  67368. "lsr r3, r3, #16\n\t"
  67369. "lsr r4, r4, #16\n\t"
  67370. "mul r4, r3, r4\n\t"
  67371. "adds r9, r9, r4\n\t"
  67372. "adcs r10, r10, #0\n\t"
  67373. "adc lr, r5, #0\n\t"
  67374. "lsr r4, r7, #16\n\t"
  67375. "mul r3, r4, r3\n\t"
  67376. "lsr r4, r3, #16\n\t"
  67377. "lsl r3, r3, #16\n\t"
  67378. "adds r9, r9, r3\n\t"
  67379. "adcs r10, r10, r4\n\t"
  67380. "adc lr, lr, #0\n\t"
  67381. "lsr r3, r6, #16\n\t"
  67382. "lsr r4, r7, #16\n\t"
  67383. "mul r4, r3, r4\n\t"
  67384. "adds r10, r10, r4\n\t"
  67385. "adc lr, lr, #0\n\t"
  67386. "lsl r4, r7, #16\n\t"
  67387. "lsr r4, r4, #16\n\t"
  67388. "mul r3, r4, r3\n\t"
  67389. "lsr r4, r3, #16\n\t"
  67390. "lsl r3, r3, #16\n\t"
  67391. "adds r9, r9, r3\n\t"
  67392. "adcs r10, r10, r4\n\t"
  67393. "adc lr, lr, #0\n\t"
  67394. /* A[7] * B[6] */
  67395. "ldr r6, [%[a], #28]\n\t"
  67396. "ldr r7, [%[b], #24]\n\t"
  67397. "lsl r3, r6, #16\n\t"
  67398. "lsl r4, r7, #16\n\t"
  67399. "lsr r3, r3, #16\n\t"
  67400. "lsr r4, r4, #16\n\t"
  67401. "mul r4, r3, r4\n\t"
  67402. "adds r9, r9, r4\n\t"
  67403. "adcs r10, r10, #0\n\t"
  67404. "adc lr, r5, lr\n\t"
  67405. "lsr r4, r7, #16\n\t"
  67406. "mul r3, r4, r3\n\t"
  67407. "lsr r4, r3, #16\n\t"
  67408. "lsl r3, r3, #16\n\t"
  67409. "adds r9, r9, r3\n\t"
  67410. "adcs r10, r10, r4\n\t"
  67411. "adc lr, lr, #0\n\t"
  67412. "lsr r3, r6, #16\n\t"
  67413. "lsr r4, r7, #16\n\t"
  67414. "mul r4, r3, r4\n\t"
  67415. "adds r10, r10, r4\n\t"
  67416. "adc lr, lr, #0\n\t"
  67417. "lsl r4, r7, #16\n\t"
  67418. "lsr r4, r4, #16\n\t"
  67419. "mul r3, r4, r3\n\t"
  67420. "lsr r4, r3, #16\n\t"
  67421. "lsl r3, r3, #16\n\t"
  67422. "adds r9, r9, r3\n\t"
  67423. "adcs r10, r10, r4\n\t"
  67424. "adc lr, lr, #0\n\t"
  67425. /* A[7] * B[7] */
  67426. "ldr r7, [%[b], #28]\n\t"
  67427. "lsl r3, r6, #16\n\t"
  67428. "lsl r4, r7, #16\n\t"
  67429. "lsr r3, r3, #16\n\t"
  67430. "lsr r4, r4, #16\n\t"
  67431. "mul r4, r3, r4\n\t"
  67432. "adds r10, r10, r4\n\t"
  67433. "adc lr, lr, #0\n\t"
  67434. "lsr r4, r7, #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 r10, r10, r3\n\t"
  67439. "adc lr, lr, r4\n\t"
  67440. "lsr r3, r6, #16\n\t"
  67441. "lsr r4, r7, #16\n\t"
  67442. "mul r4, r3, r4\n\t"
  67443. "add lr, lr, r4\n\t"
  67444. "lsl r4, r7, #16\n\t"
  67445. "lsr r4, r4, #16\n\t"
  67446. "mul r3, r4, r3\n\t"
  67447. "lsr r4, r3, #16\n\t"
  67448. "lsl r3, r3, #16\n\t"
  67449. "adds r10, r10, r3\n\t"
  67450. "adc lr, lr, r4\n\t"
  67451. "str r8, [sp, #48]\n\t"
  67452. "str r9, [sp, #52]\n\t"
  67453. "str r10, [sp, #56]\n\t"
  67454. "str lr, [sp, #60]\n\t"
  67455. "str %[r], [sp, #64]\n\t"
  67456. /* Start Reduction */
  67457. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  67458. "mov r3, r11\n\t"
  67459. "mov r4, r12\n\t"
  67460. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  67461. /* - a[0] << 224 */
  67462. /* + (a[0]-a[1] * 2) << (6 * 32) */
  67463. "adds r11, r11, r5\n\t"
  67464. "adc r12, r12, r6\n\t"
  67465. "adds r11, r11, r5\n\t"
  67466. "adc r12, r12, r6\n\t"
  67467. /* - a[0] << (7 * 32) */
  67468. "sub r12, r12, r5\n\t"
  67469. /* + a[0]-a[4] << (3 * 32) */
  67470. "mov r0, r8\n\t"
  67471. "mov r1, r9\n\t"
  67472. "mov r2, r10\n\t"
  67473. "adds r8, r8, r5\n\t"
  67474. "adcs r9, r9, r6\n\t"
  67475. "adcs r10, r10, r7\n\t"
  67476. "adcs r11, r11, r0\n\t"
  67477. "adc r12, r12, r1\n\t"
  67478. /* a += mu * m */
  67479. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  67480. /* a[0] = = t[0] */
  67481. /* a[1] = = t[1] */
  67482. /* a[2] = = t[2] */
  67483. /* a[3] += t[0] = t[3] */
  67484. /* a[4] += t[1] = t[4] */
  67485. /* a[5] += t[2] = t[5] */
  67486. /* a[6] += t[0] + t[3] = t[6] */
  67487. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  67488. "adds r0, r0, r5\n\t"
  67489. "adcs r1, r1, r6\n\t"
  67490. "adcs r2, r2, r7\n\t"
  67491. "adcs r3, r3, r8\n\t"
  67492. "adcs r4, r4, r9\n\t"
  67493. "mov lr, #0\n\t"
  67494. "adc lr, lr, #0\n\t"
  67495. "adds r3, r3, r5\n\t"
  67496. "adcs r4, r4, r6\n\t"
  67497. "adc lr, lr, #0\n\t"
  67498. "str r4, [sp, #28]\n\t"
  67499. /* a[8] += t[0] + t[2] + t[5] + carry */
  67500. /* a[9] += t[1] + t[3] + t[6] */
  67501. /* a[10] += t[2] + t[4] + t[7] */
  67502. "add r0, sp, #32\n\t"
  67503. "ldm r0, {r2, r3, r4}\n\t"
  67504. "adds r2, r2, lr\n\t"
  67505. "adcs r3, r3, #0\n\t"
  67506. "adcs r4, r4, #0\n\t"
  67507. "mov lr, #0\n\t"
  67508. "adc lr, lr, #0\n\t"
  67509. "adds r2, r2, r5\n\t"
  67510. "adcs r3, r3, r6\n\t"
  67511. "adcs r4, r4, r7\n\t"
  67512. "adc lr, lr, #0\n\t"
  67513. "adds r2, r2, r7\n\t"
  67514. "adcs r3, r3, r8\n\t"
  67515. "adcs r4, r4, r9\n\t"
  67516. "adc lr, lr, #0\n\t"
  67517. "adds r2, r2, r10\n\t"
  67518. "adcs r3, r3, r11\n\t"
  67519. "adcs r4, r4, r12\n\t"
  67520. "adc lr, lr, #0\n\t"
  67521. "stm r0!, {r2, r3, r4}\n\t"
  67522. /* a[11] += t[3] + t[5] + carry */
  67523. /* a[12] += t[4] + t[6] */
  67524. /* a[13] += t[5] + t[7] */
  67525. /* a[14] += t[6] */
  67526. /* a[15] += t[7] */
  67527. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  67528. "adds r0, r0, lr\n\t"
  67529. "adcs r1, r1, #0\n\t"
  67530. "adcs r2, r2, #0\n\t"
  67531. "adcs r3, r3, #0\n\t"
  67532. "adcs r4, r4, #0\n\t"
  67533. "mov lr, #0\n\t"
  67534. "adc lr, lr, #0\n\t"
  67535. "adds r0, r0, r8\n\t"
  67536. "adcs r1, r1, r9\n\t"
  67537. "adcs r2, r2, r10\n\t"
  67538. "adcs r3, r3, r11\n\t"
  67539. "adcs r4, r4, r12\n\t"
  67540. "adc lr, lr, #0\n\t"
  67541. "adds r0, r0, r10\n\t"
  67542. "adcs r1, r1, r11\n\t"
  67543. "adcs r2, r2, r12\n\t"
  67544. "adcs r3, r3, #0\n\t"
  67545. "adcs r4, r4, #0\n\t"
  67546. "adc lr, lr, #0\n\t"
  67547. "str r0, [sp, #44]\n\t"
  67548. "str r1, [sp, #48]\n\t"
  67549. "str r2, [sp, #52]\n\t"
  67550. "str r3, [sp, #56]\n\t"
  67551. /* a[7..15] - t[0..7] */
  67552. "add r0, sp, #28\n\t"
  67553. "ldm r0, {r0, r1, r2, r3}\n\t"
  67554. "subs r0, r0, r5\n\t"
  67555. "sbcs r1, r1, r6\n\t"
  67556. "sbcs r2, r2, r7\n\t"
  67557. "sbcs r3, r3, r8\n\t"
  67558. "add r0, sp, #44\n\t"
  67559. "mov r8, r4\n\t"
  67560. "ldm r0, {r4, r5, r6, r7}\n\t"
  67561. "sbcs r4, r4, r9\n\t"
  67562. "sbcs r5, r5, r10\n\t"
  67563. "sbcs r6, r6, r11\n\t"
  67564. "sbcs r7, r7, r12\n\t"
  67565. "sbcs r8, r8, #0\n\t"
  67566. "sbc lr, lr, #0\n\t"
  67567. /* mask m and sub from result if overflow */
  67568. "rsb lr, lr, #0\n\t"
  67569. "subs r1, r1, lr\n\t"
  67570. "sbcs r2, r2, lr\n\t"
  67571. "sbcs r3, r3, lr\n\t"
  67572. "sbcs r4, r4, #0\n\t"
  67573. "sbcs r5, r5, #0\n\t"
  67574. "sbcs r6, r6, #0\n\t"
  67575. "sbcs r7, r7, lr, lsr #31\n\t"
  67576. "sbc r8, r8, lr\n\t"
  67577. "ldr %[r], [sp, #64]\n\t"
  67578. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  67579. "add sp, sp, #0x44\n\t"
  67580. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  67581. :
  67582. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r12", "cc"
  67583. );
  67584. (void)m_p;
  67585. (void)mp_p;
  67586. }
  67587. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  67588. /* Multiply two Montgomery form numbers mod the modulus (prime).
  67589. * (r = a * b mod m)
  67590. *
  67591. * r Result of multiplication.
  67592. * a First number to multiply in Montgomery form.
  67593. * b Second number to multiply in Montgomery form.
  67594. * m Modulus (prime).
  67595. * mp Montgomery multiplier.
  67596. */
  67597. 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)
  67598. {
  67599. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  67600. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  67601. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  67602. __asm__ __volatile__ (
  67603. "sub sp, sp, #0x44\n\t"
  67604. "str %[r], [sp, #64]\n\t"
  67605. "mov %[r], #0\n\t"
  67606. "ldr r12, [%[a]]\n\t"
  67607. /* A[0] * B[0] */
  67608. "ldr lr, [%[b]]\n\t"
  67609. "umull r3, r4, r12, lr\n\t"
  67610. /* A[0] * B[2] */
  67611. "ldr lr, [%[b], #8]\n\t"
  67612. "umull r5, r6, r12, lr\n\t"
  67613. /* A[0] * B[4] */
  67614. "ldr lr, [%[b], #16]\n\t"
  67615. "umull r7, r8, r12, lr\n\t"
  67616. /* A[0] * B[6] */
  67617. "ldr lr, [%[b], #24]\n\t"
  67618. "umull r9, r10, r12, lr\n\t"
  67619. "str r3, [sp]\n\t"
  67620. /* A[0] * B[1] */
  67621. "ldr lr, [%[b], #4]\n\t"
  67622. "mov r11, %[r]\n\t"
  67623. "umlal r4, r11, r12, lr\n\t"
  67624. "adds r5, r5, r11\n\t"
  67625. /* A[0] * B[3] */
  67626. "ldr lr, [%[b], #12]\n\t"
  67627. "adcs r6, r6, #0\n\t"
  67628. "adc r11, %[r], #0\n\t"
  67629. "umlal r6, r11, r12, lr\n\t"
  67630. "adds r7, r7, r11\n\t"
  67631. /* A[0] * B[5] */
  67632. "ldr lr, [%[b], #20]\n\t"
  67633. "adcs r8, r8, #0\n\t"
  67634. "adc r11, %[r], #0\n\t"
  67635. "umlal r8, r11, r12, lr\n\t"
  67636. "adds r9, r9, r11\n\t"
  67637. /* A[0] * B[7] */
  67638. "ldr lr, [%[b], #28]\n\t"
  67639. "adcs r10, r10, #0\n\t"
  67640. "adc r3, %[r], #0\n\t"
  67641. "umlal r10, r3, r12, lr\n\t"
  67642. /* A[1] * B[0] */
  67643. "ldr r12, [%[a], #4]\n\t"
  67644. "ldr lr, [%[b]]\n\t"
  67645. "mov r11, #0\n\t"
  67646. "umlal r4, r11, r12, lr\n\t"
  67647. "str r4, [sp, #4]\n\t"
  67648. "adds r5, r5, r11\n\t"
  67649. /* A[1] * B[1] */
  67650. "ldr lr, [%[b], #4]\n\t"
  67651. "adc r11, %[r], #0\n\t"
  67652. "umlal r5, r11, r12, lr\n\t"
  67653. "adds r6, r6, r11\n\t"
  67654. /* A[1] * B[2] */
  67655. "ldr lr, [%[b], #8]\n\t"
  67656. "adc r11, %[r], #0\n\t"
  67657. "umlal r6, r11, r12, lr\n\t"
  67658. "adds r7, r7, r11\n\t"
  67659. /* A[1] * B[3] */
  67660. "ldr lr, [%[b], #12]\n\t"
  67661. "adc r11, %[r], #0\n\t"
  67662. "umlal r7, r11, r12, lr\n\t"
  67663. "adds r8, r8, r11\n\t"
  67664. /* A[1] * B[4] */
  67665. "ldr lr, [%[b], #16]\n\t"
  67666. "adc r11, %[r], #0\n\t"
  67667. "umlal r8, r11, r12, lr\n\t"
  67668. "adds r9, r9, r11\n\t"
  67669. /* A[1] * B[5] */
  67670. "ldr lr, [%[b], #20]\n\t"
  67671. "adc r11, %[r], #0\n\t"
  67672. "umlal r9, r11, r12, lr\n\t"
  67673. "adds r10, r10, r11\n\t"
  67674. /* A[1] * B[6] */
  67675. "ldr lr, [%[b], #24]\n\t"
  67676. "adc r11, %[r], #0\n\t"
  67677. "umlal r10, r11, r12, lr\n\t"
  67678. "adds r3, r3, r11\n\t"
  67679. /* A[1] * B[7] */
  67680. "ldr lr, [%[b], #28]\n\t"
  67681. "adc r4, %[r], #0\n\t"
  67682. "umlal r3, r4, r12, lr\n\t"
  67683. /* A[2] * B[0] */
  67684. "ldr r12, [%[a], #8]\n\t"
  67685. "ldr lr, [%[b]]\n\t"
  67686. "mov r11, #0\n\t"
  67687. "umlal r5, r11, r12, lr\n\t"
  67688. "str r5, [sp, #8]\n\t"
  67689. "adds r6, r6, r11\n\t"
  67690. /* A[2] * B[1] */
  67691. "ldr lr, [%[b], #4]\n\t"
  67692. "adc r11, %[r], #0\n\t"
  67693. "umlal r6, r11, r12, lr\n\t"
  67694. "adds r7, r7, r11\n\t"
  67695. /* A[2] * B[2] */
  67696. "ldr lr, [%[b], #8]\n\t"
  67697. "adc r11, %[r], #0\n\t"
  67698. "umlal r7, r11, r12, lr\n\t"
  67699. "adds r8, r8, r11\n\t"
  67700. /* A[2] * B[3] */
  67701. "ldr lr, [%[b], #12]\n\t"
  67702. "adc r11, %[r], #0\n\t"
  67703. "umlal r8, r11, r12, lr\n\t"
  67704. "adds r9, r9, r11\n\t"
  67705. /* A[2] * B[4] */
  67706. "ldr lr, [%[b], #16]\n\t"
  67707. "adc r11, %[r], #0\n\t"
  67708. "umlal r9, r11, r12, lr\n\t"
  67709. "adds r10, r10, r11\n\t"
  67710. /* A[2] * B[5] */
  67711. "ldr lr, [%[b], #20]\n\t"
  67712. "adc r11, %[r], #0\n\t"
  67713. "umlal r10, r11, r12, lr\n\t"
  67714. "adds r3, r3, r11\n\t"
  67715. /* A[2] * B[6] */
  67716. "ldr lr, [%[b], #24]\n\t"
  67717. "adc r11, %[r], #0\n\t"
  67718. "umlal r3, r11, r12, lr\n\t"
  67719. "adds r4, r4, r11\n\t"
  67720. /* A[2] * B[7] */
  67721. "ldr lr, [%[b], #28]\n\t"
  67722. "adc r5, %[r], #0\n\t"
  67723. "umlal r4, r5, r12, lr\n\t"
  67724. /* A[3] * B[0] */
  67725. "ldr r12, [%[a], #12]\n\t"
  67726. "ldr lr, [%[b]]\n\t"
  67727. "mov r11, #0\n\t"
  67728. "umlal r6, r11, r12, lr\n\t"
  67729. "str r6, [sp, #12]\n\t"
  67730. "adds r7, r7, r11\n\t"
  67731. /* A[3] * B[1] */
  67732. "ldr lr, [%[b], #4]\n\t"
  67733. "adc r11, %[r], #0\n\t"
  67734. "umlal r7, r11, r12, lr\n\t"
  67735. "adds r8, r8, r11\n\t"
  67736. /* A[3] * B[2] */
  67737. "ldr lr, [%[b], #8]\n\t"
  67738. "adc r11, %[r], #0\n\t"
  67739. "umlal r8, r11, r12, lr\n\t"
  67740. "adds r9, r9, r11\n\t"
  67741. /* A[3] * B[3] */
  67742. "ldr lr, [%[b], #12]\n\t"
  67743. "adc r11, %[r], #0\n\t"
  67744. "umlal r9, r11, r12, lr\n\t"
  67745. "adds r10, r10, r11\n\t"
  67746. /* A[3] * B[4] */
  67747. "ldr lr, [%[b], #16]\n\t"
  67748. "adc r11, %[r], #0\n\t"
  67749. "umlal r10, r11, r12, lr\n\t"
  67750. "adds r3, r3, r11\n\t"
  67751. /* A[3] * B[5] */
  67752. "ldr lr, [%[b], #20]\n\t"
  67753. "adc r11, %[r], #0\n\t"
  67754. "umlal r3, r11, r12, lr\n\t"
  67755. "adds r4, r4, r11\n\t"
  67756. /* A[3] * B[6] */
  67757. "ldr lr, [%[b], #24]\n\t"
  67758. "adc r11, %[r], #0\n\t"
  67759. "umlal r4, r11, r12, lr\n\t"
  67760. "adds r5, r5, r11\n\t"
  67761. /* A[3] * B[7] */
  67762. "ldr lr, [%[b], #28]\n\t"
  67763. "adc r6, %[r], #0\n\t"
  67764. "umlal r5, r6, r12, lr\n\t"
  67765. /* A[4] * B[0] */
  67766. "ldr r12, [%[a], #16]\n\t"
  67767. "ldr lr, [%[b]]\n\t"
  67768. "mov r11, #0\n\t"
  67769. "umlal r7, r11, r12, lr\n\t"
  67770. "str r7, [sp, #16]\n\t"
  67771. "adds r8, r8, r11\n\t"
  67772. /* A[4] * B[1] */
  67773. "ldr lr, [%[b], #4]\n\t"
  67774. "adc r11, %[r], #0\n\t"
  67775. "umlal r8, r11, r12, lr\n\t"
  67776. "adds r9, r9, r11\n\t"
  67777. /* A[4] * B[2] */
  67778. "ldr lr, [%[b], #8]\n\t"
  67779. "adc r11, %[r], #0\n\t"
  67780. "umlal r9, r11, r12, lr\n\t"
  67781. "adds r10, r10, r11\n\t"
  67782. /* A[4] * B[3] */
  67783. "ldr lr, [%[b], #12]\n\t"
  67784. "adc r11, %[r], #0\n\t"
  67785. "umlal r10, r11, r12, lr\n\t"
  67786. "adds r3, r3, r11\n\t"
  67787. /* A[4] * B[4] */
  67788. "ldr lr, [%[b], #16]\n\t"
  67789. "adc r11, %[r], #0\n\t"
  67790. "umlal r3, r11, r12, lr\n\t"
  67791. "adds r4, r4, r11\n\t"
  67792. /* A[4] * B[5] */
  67793. "ldr lr, [%[b], #20]\n\t"
  67794. "adc r11, %[r], #0\n\t"
  67795. "umlal r4, r11, r12, lr\n\t"
  67796. "adds r5, r5, r11\n\t"
  67797. /* A[4] * B[6] */
  67798. "ldr lr, [%[b], #24]\n\t"
  67799. "adc r11, %[r], #0\n\t"
  67800. "umlal r5, r11, r12, lr\n\t"
  67801. "adds r6, r6, r11\n\t"
  67802. /* A[4] * B[7] */
  67803. "ldr lr, [%[b], #28]\n\t"
  67804. "adc r7, %[r], #0\n\t"
  67805. "umlal r6, r7, r12, lr\n\t"
  67806. /* A[5] * B[0] */
  67807. "ldr r12, [%[a], #20]\n\t"
  67808. "ldr lr, [%[b]]\n\t"
  67809. "mov r11, #0\n\t"
  67810. "umlal r8, r11, r12, lr\n\t"
  67811. "str r8, [sp, #20]\n\t"
  67812. "adds r9, r9, r11\n\t"
  67813. /* A[5] * B[1] */
  67814. "ldr lr, [%[b], #4]\n\t"
  67815. "adc r11, %[r], #0\n\t"
  67816. "umlal r9, r11, r12, lr\n\t"
  67817. "adds r10, r10, r11\n\t"
  67818. /* A[5] * B[2] */
  67819. "ldr lr, [%[b], #8]\n\t"
  67820. "adc r11, %[r], #0\n\t"
  67821. "umlal r10, r11, r12, lr\n\t"
  67822. "adds r3, r3, r11\n\t"
  67823. /* A[5] * B[3] */
  67824. "ldr lr, [%[b], #12]\n\t"
  67825. "adc r11, %[r], #0\n\t"
  67826. "umlal r3, r11, r12, lr\n\t"
  67827. "adds r4, r4, r11\n\t"
  67828. /* A[5] * B[4] */
  67829. "ldr lr, [%[b], #16]\n\t"
  67830. "adc r11, %[r], #0\n\t"
  67831. "umlal r4, r11, r12, lr\n\t"
  67832. "adds r5, r5, r11\n\t"
  67833. /* A[5] * B[5] */
  67834. "ldr lr, [%[b], #20]\n\t"
  67835. "adc r11, %[r], #0\n\t"
  67836. "umlal r5, r11, r12, lr\n\t"
  67837. "adds r6, r6, r11\n\t"
  67838. /* A[5] * B[6] */
  67839. "ldr lr, [%[b], #24]\n\t"
  67840. "adc r11, %[r], #0\n\t"
  67841. "umlal r6, r11, r12, lr\n\t"
  67842. "adds r7, r7, r11\n\t"
  67843. /* A[5] * B[7] */
  67844. "ldr lr, [%[b], #28]\n\t"
  67845. "adc r8, %[r], #0\n\t"
  67846. "umlal r7, r8, r12, lr\n\t"
  67847. /* A[6] * B[0] */
  67848. "ldr r12, [%[a], #24]\n\t"
  67849. "ldr lr, [%[b]]\n\t"
  67850. "mov r11, #0\n\t"
  67851. "umlal r9, r11, r12, lr\n\t"
  67852. "str r9, [sp, #24]\n\t"
  67853. "adds r10, r10, r11\n\t"
  67854. /* A[6] * B[1] */
  67855. "ldr lr, [%[b], #4]\n\t"
  67856. "adc r11, %[r], #0\n\t"
  67857. "umlal r10, r11, r12, lr\n\t"
  67858. "adds r3, r3, r11\n\t"
  67859. /* A[6] * B[2] */
  67860. "ldr lr, [%[b], #8]\n\t"
  67861. "adc r11, %[r], #0\n\t"
  67862. "umlal r3, r11, r12, lr\n\t"
  67863. "adds r4, r4, r11\n\t"
  67864. /* A[6] * B[3] */
  67865. "ldr lr, [%[b], #12]\n\t"
  67866. "adc r11, %[r], #0\n\t"
  67867. "umlal r4, r11, r12, lr\n\t"
  67868. "adds r5, r5, r11\n\t"
  67869. /* A[6] * B[4] */
  67870. "ldr lr, [%[b], #16]\n\t"
  67871. "adc r11, %[r], #0\n\t"
  67872. "umlal r5, r11, r12, lr\n\t"
  67873. "adds r6, r6, r11\n\t"
  67874. /* A[6] * B[5] */
  67875. "ldr lr, [%[b], #20]\n\t"
  67876. "adc r11, %[r], #0\n\t"
  67877. "umlal r6, r11, r12, lr\n\t"
  67878. "adds r7, r7, r11\n\t"
  67879. /* A[6] * B[6] */
  67880. "ldr lr, [%[b], #24]\n\t"
  67881. "adc r11, %[r], #0\n\t"
  67882. "umlal r7, r11, r12, lr\n\t"
  67883. "adds r8, r8, r11\n\t"
  67884. /* A[6] * B[7] */
  67885. "ldr lr, [%[b], #28]\n\t"
  67886. "adc r9, %[r], #0\n\t"
  67887. "umlal r8, r9, r12, lr\n\t"
  67888. /* A[7] * B[0] */
  67889. "ldr r12, [%[a], #28]\n\t"
  67890. "ldr lr, [%[b]]\n\t"
  67891. "mov r11, #0\n\t"
  67892. "umlal r10, r11, r12, lr\n\t"
  67893. "str r10, [sp, #28]\n\t"
  67894. "adds r3, r3, r11\n\t"
  67895. /* A[7] * B[1] */
  67896. "ldr lr, [%[b], #4]\n\t"
  67897. "adc r11, %[r], #0\n\t"
  67898. "umlal r3, r11, r12, lr\n\t"
  67899. "adds r4, r4, r11\n\t"
  67900. /* A[7] * B[2] */
  67901. "ldr lr, [%[b], #8]\n\t"
  67902. "adc r11, %[r], #0\n\t"
  67903. "umlal r4, r11, r12, lr\n\t"
  67904. "adds r5, r5, r11\n\t"
  67905. /* A[7] * B[3] */
  67906. "ldr lr, [%[b], #12]\n\t"
  67907. "adc r11, %[r], #0\n\t"
  67908. "umlal r5, r11, r12, lr\n\t"
  67909. "adds r6, r6, r11\n\t"
  67910. /* A[7] * B[4] */
  67911. "ldr lr, [%[b], #16]\n\t"
  67912. "adc r11, %[r], #0\n\t"
  67913. "umlal r6, r11, r12, lr\n\t"
  67914. "adds r7, r7, r11\n\t"
  67915. /* A[7] * B[5] */
  67916. "ldr lr, [%[b], #20]\n\t"
  67917. "adc r11, %[r], #0\n\t"
  67918. "umlal r7, r11, r12, lr\n\t"
  67919. "adds r8, r8, r11\n\t"
  67920. /* A[7] * B[6] */
  67921. "ldr lr, [%[b], #24]\n\t"
  67922. "adc r11, %[r], #0\n\t"
  67923. "umlal r8, r11, r12, lr\n\t"
  67924. "adds r9, r9, r11\n\t"
  67925. /* A[7] * B[7] */
  67926. "ldr lr, [%[b], #28]\n\t"
  67927. "adc r10, %[r], #0\n\t"
  67928. "umlal r9, r10, r12, lr\n\t"
  67929. "add lr, sp, #32\n\t"
  67930. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  67931. /* Start Reduction */
  67932. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  67933. "mov r3, r11\n\t"
  67934. "mov r4, r12\n\t"
  67935. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  67936. /* - a[0] << 224 */
  67937. /* + (a[0]-a[1] * 2) << (6 * 32) */
  67938. "adds r11, r11, r5\n\t"
  67939. "adc r12, r12, r6\n\t"
  67940. "adds r11, r11, r5\n\t"
  67941. "adc r12, r12, r6\n\t"
  67942. /* - a[0] << (7 * 32) */
  67943. "sub r12, r12, r5\n\t"
  67944. /* + a[0]-a[4] << (3 * 32) */
  67945. "mov r0, r8\n\t"
  67946. "mov r1, r9\n\t"
  67947. "mov r2, r10\n\t"
  67948. "adds r8, r8, r5\n\t"
  67949. "adcs r9, r9, r6\n\t"
  67950. "adcs r10, r10, r7\n\t"
  67951. "adcs r11, r11, r0\n\t"
  67952. "adc r12, r12, r1\n\t"
  67953. /* a += mu * m */
  67954. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  67955. /* a[0] = = t[0] */
  67956. /* a[1] = = t[1] */
  67957. /* a[2] = = t[2] */
  67958. /* a[3] += t[0] = t[3] */
  67959. /* a[4] += t[1] = t[4] */
  67960. /* a[5] += t[2] = t[5] */
  67961. /* a[6] += t[0] + t[3] = t[6] */
  67962. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  67963. "adds r0, r0, r5\n\t"
  67964. "adcs r1, r1, r6\n\t"
  67965. "adcs r2, r2, r7\n\t"
  67966. "adcs r3, r3, r8\n\t"
  67967. "adcs r4, r4, r9\n\t"
  67968. "mov lr, #0\n\t"
  67969. "adc lr, lr, #0\n\t"
  67970. "adds r3, r3, r5\n\t"
  67971. "adcs r4, r4, r6\n\t"
  67972. "adc lr, lr, #0\n\t"
  67973. "str r4, [sp, #28]\n\t"
  67974. /* a[8] += t[0] + t[2] + t[5] + carry */
  67975. /* a[9] += t[1] + t[3] + t[6] */
  67976. /* a[10] += t[2] + t[4] + t[7] */
  67977. "add r0, sp, #32\n\t"
  67978. "ldm r0, {r2, r3, r4}\n\t"
  67979. "adds r2, r2, lr\n\t"
  67980. "adcs r3, r3, #0\n\t"
  67981. "adcs r4, r4, #0\n\t"
  67982. "mov lr, #0\n\t"
  67983. "adc lr, lr, #0\n\t"
  67984. "adds r2, r2, r5\n\t"
  67985. "adcs r3, r3, r6\n\t"
  67986. "adcs r4, r4, r7\n\t"
  67987. "adc lr, lr, #0\n\t"
  67988. "adds r2, r2, r7\n\t"
  67989. "adcs r3, r3, r8\n\t"
  67990. "adcs r4, r4, r9\n\t"
  67991. "adc lr, lr, #0\n\t"
  67992. "adds r2, r2, r10\n\t"
  67993. "adcs r3, r3, r11\n\t"
  67994. "adcs r4, r4, r12\n\t"
  67995. "adc lr, lr, #0\n\t"
  67996. "stm r0!, {r2, r3, r4}\n\t"
  67997. /* a[11] += t[3] + t[5] + carry */
  67998. /* a[12] += t[4] + t[6] */
  67999. /* a[13] += t[5] + t[7] */
  68000. /* a[14] += t[6] */
  68001. /* a[15] += t[7] */
  68002. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  68003. "adds r0, r0, lr\n\t"
  68004. "adcs r1, r1, #0\n\t"
  68005. "adcs r2, r2, #0\n\t"
  68006. "adcs r3, r3, #0\n\t"
  68007. "adcs r4, r4, #0\n\t"
  68008. "mov lr, #0\n\t"
  68009. "adc lr, lr, #0\n\t"
  68010. "adds r0, r0, r8\n\t"
  68011. "adcs r1, r1, r9\n\t"
  68012. "adcs r2, r2, r10\n\t"
  68013. "adcs r3, r3, r11\n\t"
  68014. "adcs r4, r4, r12\n\t"
  68015. "adc lr, lr, #0\n\t"
  68016. "adds r0, r0, r10\n\t"
  68017. "adcs r1, r1, r11\n\t"
  68018. "adcs r2, r2, r12\n\t"
  68019. "adcs r3, r3, #0\n\t"
  68020. "adcs r4, r4, #0\n\t"
  68021. "adc lr, lr, #0\n\t"
  68022. "str r0, [sp, #44]\n\t"
  68023. "str r1, [sp, #48]\n\t"
  68024. "str r2, [sp, #52]\n\t"
  68025. "str r3, [sp, #56]\n\t"
  68026. /* a[7..15] - t[0..7] */
  68027. "add r0, sp, #28\n\t"
  68028. "ldm r0, {r0, r1, r2, r3}\n\t"
  68029. "subs r0, r0, r5\n\t"
  68030. "sbcs r1, r1, r6\n\t"
  68031. "sbcs r2, r2, r7\n\t"
  68032. "sbcs r3, r3, r8\n\t"
  68033. "add r0, sp, #44\n\t"
  68034. "mov r8, r4\n\t"
  68035. "ldm r0, {r4, r5, r6, r7}\n\t"
  68036. "sbcs r4, r4, r9\n\t"
  68037. "sbcs r5, r5, r10\n\t"
  68038. "sbcs r6, r6, r11\n\t"
  68039. "sbcs r7, r7, r12\n\t"
  68040. "sbcs r8, r8, #0\n\t"
  68041. "sbc lr, lr, #0\n\t"
  68042. /* mask m and sub from result if overflow */
  68043. "rsb lr, lr, #0\n\t"
  68044. "subs r1, r1, lr\n\t"
  68045. "sbcs r2, r2, lr\n\t"
  68046. "sbcs r3, r3, lr\n\t"
  68047. "sbcs r4, r4, #0\n\t"
  68048. "sbcs r5, r5, #0\n\t"
  68049. "sbcs r6, r6, #0\n\t"
  68050. "sbcs r7, r7, lr, lsr #31\n\t"
  68051. "sbc r8, r8, lr\n\t"
  68052. "ldr %[r], [sp, #64]\n\t"
  68053. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  68054. "add sp, sp, #0x44\n\t"
  68055. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  68056. :
  68057. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  68058. );
  68059. (void)m_p;
  68060. (void)mp_p;
  68061. }
  68062. #else
  68063. /* Multiply two Montgomery form numbers mod the modulus (prime).
  68064. * (r = a * b mod m)
  68065. *
  68066. * r Result of multiplication.
  68067. * a First number to multiply in Montgomery form.
  68068. * b Second number to multiply in Montgomery form.
  68069. * m Modulus (prime).
  68070. * mp Montgomery multiplier.
  68071. */
  68072. 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)
  68073. {
  68074. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  68075. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  68076. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  68077. __asm__ __volatile__ (
  68078. "sub sp, sp, #0x4c\n\t"
  68079. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  68080. "str %[r], [sp, #68]\n\t"
  68081. "str %[a], [sp, #72]\n\t"
  68082. #else
  68083. "strd %[r], %[a], [sp, #68]\n\t"
  68084. #endif
  68085. "mov lr, %[b]\n\t"
  68086. "ldm %[a], {%[r], %[a], %[b], r3}\n\t"
  68087. "ldm lr!, {r4, r5, r6}\n\t"
  68088. "umull r10, r11, %[r], r4\n\t"
  68089. "umull r12, r7, %[a], r4\n\t"
  68090. "umaal r11, r12, %[r], r5\n\t"
  68091. "umull r8, r9, %[b], r4\n\t"
  68092. "umaal r12, r8, %[a], r5\n\t"
  68093. "umaal r12, r7, %[r], r6\n\t"
  68094. "umaal r8, r9, r3, r4\n\t"
  68095. "stm sp, {r10, r11, r12}\n\t"
  68096. "umaal r7, r8, %[b], r5\n\t"
  68097. "ldm lr!, {r4}\n\t"
  68098. "umull r10, r11, %[a], r6\n\t"
  68099. "umaal r8, r9, %[b], r6\n\t"
  68100. "umaal r7, r10, %[r], r4\n\t"
  68101. "umaal r8, r11, r3, r5\n\t"
  68102. "str r7, [sp, #12]\n\t"
  68103. "umaal r8, r10, %[a], r4\n\t"
  68104. "umaal r9, r11, r3, r6\n\t"
  68105. "umaal r9, r10, %[b], r4\n\t"
  68106. "umaal r10, r11, r3, r4\n\t"
  68107. "ldm lr, {r4, r5, r6, r7}\n\t"
  68108. "mov r12, #0\n\t"
  68109. "umlal r8, r12, %[r], r4\n\t"
  68110. "umaal r9, r12, %[a], r4\n\t"
  68111. "umaal r10, r12, %[b], r4\n\t"
  68112. "umaal r11, r12, r3, r4\n\t"
  68113. "mov r4, #0\n\t"
  68114. "umlal r9, r4, %[r], r5\n\t"
  68115. "umaal r10, r4, %[a], r5\n\t"
  68116. "umaal r11, r4, %[b], r5\n\t"
  68117. "umaal r12, r4, r3, r5\n\t"
  68118. "mov r5, #0\n\t"
  68119. "umlal r10, r5, %[r], r6\n\t"
  68120. "umaal r11, r5, %[a], r6\n\t"
  68121. "umaal r12, r5, %[b], r6\n\t"
  68122. "umaal r4, r5, r3, r6\n\t"
  68123. "mov r6, #0\n\t"
  68124. "umlal r11, r6, %[r], r7\n\t"
  68125. "ldr %[r], [sp, #72]\n\t"
  68126. "umaal r12, r6, %[a], r7\n\t"
  68127. "add %[r], %[r], #16\n\t"
  68128. "umaal r4, r6, %[b], r7\n\t"
  68129. "sub lr, lr, #16\n\t"
  68130. "umaal r5, r6, r3, r7\n\t"
  68131. "ldm %[r], {%[r], %[a], %[b], r3}\n\t"
  68132. "str r6, [sp, #64]\n\t"
  68133. "ldm lr!, {r6}\n\t"
  68134. "mov r7, #0\n\t"
  68135. "umlal r8, r7, %[r], r6\n\t"
  68136. "umaal r9, r7, %[a], r6\n\t"
  68137. "str r8, [sp, #16]\n\t"
  68138. "umaal r10, r7, %[b], r6\n\t"
  68139. "umaal r11, r7, r3, r6\n\t"
  68140. "ldm lr!, {r6}\n\t"
  68141. "mov r8, #0\n\t"
  68142. "umlal r9, r8, %[r], r6\n\t"
  68143. "umaal r10, r8, %[a], r6\n\t"
  68144. "str r9, [sp, #20]\n\t"
  68145. "umaal r11, r8, %[b], r6\n\t"
  68146. "umaal r12, r8, r3, r6\n\t"
  68147. "ldm lr!, {r6}\n\t"
  68148. "mov r9, #0\n\t"
  68149. "umlal r10, r9, %[r], r6\n\t"
  68150. "umaal r11, r9, %[a], r6\n\t"
  68151. "str r10, [sp, #24]\n\t"
  68152. "umaal r12, r9, %[b], r6\n\t"
  68153. "umaal r4, r9, r3, r6\n\t"
  68154. "ldm lr!, {r6}\n\t"
  68155. "mov r10, #0\n\t"
  68156. "umlal r11, r10, %[r], r6\n\t"
  68157. "umaal r12, r10, %[a], r6\n\t"
  68158. "str r11, [sp, #28]\n\t"
  68159. "umaal r4, r10, %[b], r6\n\t"
  68160. "umaal r5, r10, r3, r6\n\t"
  68161. "ldm lr!, {r11}\n\t"
  68162. "umaal r12, r7, %[r], r11\n\t"
  68163. "umaal r4, r7, %[a], r11\n\t"
  68164. "ldr r6, [sp, #64]\n\t"
  68165. "umaal r5, r7, %[b], r11\n\t"
  68166. "umaal r6, r7, r3, r11\n\t"
  68167. "ldm lr!, {r11}\n\t"
  68168. "umaal r4, r8, %[r], r11\n\t"
  68169. "umaal r5, r8, %[a], r11\n\t"
  68170. "umaal r6, r8, %[b], r11\n\t"
  68171. "umaal r7, r8, r3, r11\n\t"
  68172. "ldm lr, {r11, lr}\n\t"
  68173. "umaal r5, r9, %[r], r11\n\t"
  68174. "umaal r6, r10, %[r], lr\n\t"
  68175. "umaal r6, r9, %[a], r11\n\t"
  68176. "umaal r7, r10, %[a], lr\n\t"
  68177. "umaal r7, r9, %[b], r11\n\t"
  68178. "umaal r8, r10, %[b], lr\n\t"
  68179. "umaal r8, r9, r3, r11\n\t"
  68180. "umaal r9, r10, r3, lr\n\t"
  68181. "mov r3, r12\n\t"
  68182. "add lr, sp, #32\n\t"
  68183. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  68184. /* Start Reduction */
  68185. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  68186. "mov r3, r11\n\t"
  68187. "mov r4, r12\n\t"
  68188. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  68189. /* - a[0] << 224 */
  68190. /* + (a[0]-a[1] * 2) << (6 * 32) */
  68191. "adds r11, r11, r5\n\t"
  68192. "adc r12, r12, r6\n\t"
  68193. "adds r11, r11, r5\n\t"
  68194. "adc r12, r12, r6\n\t"
  68195. /* - a[0] << (7 * 32) */
  68196. "sub r12, r12, r5\n\t"
  68197. /* + a[0]-a[4] << (3 * 32) */
  68198. "mov r0, r8\n\t"
  68199. "mov r1, r9\n\t"
  68200. "mov r2, r10\n\t"
  68201. "adds r8, r8, r5\n\t"
  68202. "adcs r9, r9, r6\n\t"
  68203. "adcs r10, r10, r7\n\t"
  68204. "adcs r11, r11, r0\n\t"
  68205. "adc r12, r12, r1\n\t"
  68206. /* a += mu * m */
  68207. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  68208. /* a[0] = = t[0] */
  68209. /* a[1] = = t[1] */
  68210. /* a[2] = = t[2] */
  68211. /* a[3] += t[0] = t[3] */
  68212. /* a[4] += t[1] = t[4] */
  68213. /* a[5] += t[2] = t[5] */
  68214. /* a[6] += t[0] + t[3] = t[6] */
  68215. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  68216. "adds r0, r0, r5\n\t"
  68217. "adcs r1, r1, r6\n\t"
  68218. "adcs r2, r2, r7\n\t"
  68219. "adcs r3, r3, r8\n\t"
  68220. "adcs r4, r4, r9\n\t"
  68221. "mov lr, #0\n\t"
  68222. "adc lr, lr, #0\n\t"
  68223. "adds r3, r3, r5\n\t"
  68224. "adcs r4, r4, r6\n\t"
  68225. "adc lr, lr, #0\n\t"
  68226. "str r4, [sp, #28]\n\t"
  68227. /* a[8] += t[0] + t[2] + t[5] + carry */
  68228. /* a[9] += t[1] + t[3] + t[6] */
  68229. /* a[10] += t[2] + t[4] + t[7] */
  68230. "add r0, sp, #32\n\t"
  68231. "ldm r0, {r2, r3, r4}\n\t"
  68232. "adds r2, r2, lr\n\t"
  68233. "adcs r3, r3, #0\n\t"
  68234. "adcs r4, r4, #0\n\t"
  68235. "mov lr, #0\n\t"
  68236. "adc lr, lr, #0\n\t"
  68237. "adds r2, r2, r5\n\t"
  68238. "adcs r3, r3, r6\n\t"
  68239. "adcs r4, r4, r7\n\t"
  68240. "adc lr, lr, #0\n\t"
  68241. "adds r2, r2, r7\n\t"
  68242. "adcs r3, r3, r8\n\t"
  68243. "adcs r4, r4, r9\n\t"
  68244. "adc lr, lr, #0\n\t"
  68245. "adds r2, r2, r10\n\t"
  68246. "adcs r3, r3, r11\n\t"
  68247. "adcs r4, r4, r12\n\t"
  68248. "adc lr, lr, #0\n\t"
  68249. "stm r0!, {r2, r3, r4}\n\t"
  68250. /* a[11] += t[3] + t[5] + carry */
  68251. /* a[12] += t[4] + t[6] */
  68252. /* a[13] += t[5] + t[7] */
  68253. /* a[14] += t[6] */
  68254. /* a[15] += t[7] */
  68255. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  68256. "adds r0, r0, lr\n\t"
  68257. "adcs r1, r1, #0\n\t"
  68258. "adcs r2, r2, #0\n\t"
  68259. "adcs r3, r3, #0\n\t"
  68260. "adcs r4, r4, #0\n\t"
  68261. "mov lr, #0\n\t"
  68262. "adc lr, lr, #0\n\t"
  68263. "adds r0, r0, r8\n\t"
  68264. "adcs r1, r1, r9\n\t"
  68265. "adcs r2, r2, r10\n\t"
  68266. "adcs r3, r3, r11\n\t"
  68267. "adcs r4, r4, r12\n\t"
  68268. "adc lr, lr, #0\n\t"
  68269. "adds r0, r0, r10\n\t"
  68270. "adcs r1, r1, r11\n\t"
  68271. "adcs r2, r2, r12\n\t"
  68272. "adcs r3, r3, #0\n\t"
  68273. "adcs r4, r4, #0\n\t"
  68274. "adc lr, lr, #0\n\t"
  68275. "str r0, [sp, #44]\n\t"
  68276. "str r1, [sp, #48]\n\t"
  68277. "str r2, [sp, #52]\n\t"
  68278. "str r3, [sp, #56]\n\t"
  68279. /* a[7..15] - t[0..7] */
  68280. "add r0, sp, #28\n\t"
  68281. "ldm r0, {r0, r1, r2, r3}\n\t"
  68282. "subs r0, r0, r5\n\t"
  68283. "sbcs r1, r1, r6\n\t"
  68284. "sbcs r2, r2, r7\n\t"
  68285. "sbcs r3, r3, r8\n\t"
  68286. "add r0, sp, #44\n\t"
  68287. "mov r8, r4\n\t"
  68288. "ldm r0, {r4, r5, r6, r7}\n\t"
  68289. "sbcs r4, r4, r9\n\t"
  68290. "sbcs r5, r5, r10\n\t"
  68291. "sbcs r6, r6, r11\n\t"
  68292. "sbcs r7, r7, r12\n\t"
  68293. "sbcs r8, r8, #0\n\t"
  68294. "sbc lr, lr, #0\n\t"
  68295. /* mask m and sub from result if overflow */
  68296. "rsb lr, lr, #0\n\t"
  68297. "subs r1, r1, lr\n\t"
  68298. "sbcs r2, r2, lr\n\t"
  68299. "sbcs r3, r3, lr\n\t"
  68300. "sbcs r4, r4, #0\n\t"
  68301. "sbcs r5, r5, #0\n\t"
  68302. "sbcs r6, r6, #0\n\t"
  68303. "sbcs r7, r7, lr, lsr #31\n\t"
  68304. "sbc r8, r8, lr\n\t"
  68305. "ldr %[r], [sp, #68]\n\t"
  68306. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  68307. "add sp, sp, #0x4c\n\t"
  68308. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  68309. :
  68310. : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc"
  68311. );
  68312. (void)m_p;
  68313. (void)mp_p;
  68314. }
  68315. #endif
  68316. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  68317. /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m)
  68318. *
  68319. * r Result of squaring.
  68320. * a Number to square in Montgomery form.
  68321. * m Modulus (prime).
  68322. * mp Montgomery multiplier.
  68323. */
  68324. 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)
  68325. {
  68326. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  68327. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  68328. __asm__ __volatile__ (
  68329. "sub sp, sp, #0x44\n\t"
  68330. "sub sp, sp, #0x44\n\t"
  68331. "mov r5, #0\n\t"
  68332. /* A[0] * A[1] */
  68333. "ldr r6, [%[a]]\n\t"
  68334. "ldr r7, [%[a], #4]\n\t"
  68335. "lsl r3, r6, #16\n\t"
  68336. "lsl r9, r7, #16\n\t"
  68337. "lsr r3, r3, #16\n\t"
  68338. "lsr r9, r9, #16\n\t"
  68339. "mul r9, r3, r9\n\t"
  68340. "lsr r4, r7, #16\n\t"
  68341. "mul r3, r4, r3\n\t"
  68342. "lsr r10, r3, #16\n\t"
  68343. "lsl r3, r3, #16\n\t"
  68344. "adds r9, r9, r3\n\t"
  68345. "adc r10, r10, #0\n\t"
  68346. "lsr r3, r6, #16\n\t"
  68347. "mul r4, r3, r4\n\t"
  68348. "add r10, r10, r4\n\t"
  68349. "lsl r4, r7, #16\n\t"
  68350. "lsr r4, r4, #16\n\t"
  68351. "mul r3, r4, r3\n\t"
  68352. "lsr r4, r3, #16\n\t"
  68353. "lsl r3, r3, #16\n\t"
  68354. "adds r9, r9, r3\n\t"
  68355. "adc r10, r10, r4\n\t"
  68356. "str r9, [sp, #4]\n\t"
  68357. /* A[0] * A[2] */
  68358. "ldr r7, [%[a], #8]\n\t"
  68359. "lsl r3, r6, #16\n\t"
  68360. "lsl r4, r7, #16\n\t"
  68361. "lsr r3, r3, #16\n\t"
  68362. "lsr r4, r4, #16\n\t"
  68363. "mul r4, r3, r4\n\t"
  68364. "mov lr, #0\n\t"
  68365. "adds r10, r10, r4\n\t"
  68366. "adc lr, lr, #0\n\t"
  68367. "lsr r4, r7, #16\n\t"
  68368. "mul r3, r4, r3\n\t"
  68369. "lsr r4, r3, #16\n\t"
  68370. "lsl r3, r3, #16\n\t"
  68371. "adds r10, r10, r3\n\t"
  68372. "adc lr, lr, r4\n\t"
  68373. "lsr r3, r6, #16\n\t"
  68374. "lsr r4, r7, #16\n\t"
  68375. "mul r4, r3, r4\n\t"
  68376. "add lr, lr, r4\n\t"
  68377. "lsl r4, r7, #16\n\t"
  68378. "lsr r4, r4, #16\n\t"
  68379. "mul r3, r4, r3\n\t"
  68380. "lsr r4, r3, #16\n\t"
  68381. "lsl r3, r3, #16\n\t"
  68382. "adds r10, r10, r3\n\t"
  68383. "adc lr, lr, r4\n\t"
  68384. "str r10, [sp, #8]\n\t"
  68385. /* A[0] * A[3] */
  68386. "ldr r7, [%[a], #12]\n\t"
  68387. "lsl r3, r6, #16\n\t"
  68388. "lsl r4, r7, #16\n\t"
  68389. "lsr r3, r3, #16\n\t"
  68390. "lsr r4, r4, #16\n\t"
  68391. "mul r4, r3, r4\n\t"
  68392. "mov r8, #0\n\t"
  68393. "adds lr, lr, r4\n\t"
  68394. "adc r8, r8, #0\n\t"
  68395. "lsr r4, r7, #16\n\t"
  68396. "mul r3, r4, r3\n\t"
  68397. "lsr r4, r3, #16\n\t"
  68398. "lsl r3, r3, #16\n\t"
  68399. "adds lr, lr, r3\n\t"
  68400. "adc r8, r8, r4\n\t"
  68401. "lsr r3, r6, #16\n\t"
  68402. "lsr r4, r7, #16\n\t"
  68403. "mul r4, r3, r4\n\t"
  68404. "add r8, r8, r4\n\t"
  68405. "lsl r4, r7, #16\n\t"
  68406. "lsr r4, r4, #16\n\t"
  68407. "mul r3, r4, r3\n\t"
  68408. "lsr r4, r3, #16\n\t"
  68409. "lsl r3, r3, #16\n\t"
  68410. "adds lr, lr, r3\n\t"
  68411. "adc r8, r8, r4\n\t"
  68412. /* A[1] * A[2] */
  68413. "ldr r6, [%[a], #4]\n\t"
  68414. "ldr r7, [%[a], #8]\n\t"
  68415. "lsl r3, r6, #16\n\t"
  68416. "lsl r4, r7, #16\n\t"
  68417. "lsr r3, r3, #16\n\t"
  68418. "lsr r4, r4, #16\n\t"
  68419. "mul r4, r3, r4\n\t"
  68420. "adds lr, lr, r4\n\t"
  68421. "adcs r8, r8, #0\n\t"
  68422. "adc r9, r5, #0\n\t"
  68423. "lsr r4, r7, #16\n\t"
  68424. "mul r3, r4, r3\n\t"
  68425. "lsr r4, r3, #16\n\t"
  68426. "lsl r3, r3, #16\n\t"
  68427. "adds lr, lr, r3\n\t"
  68428. "adcs r8, r8, r4\n\t"
  68429. "adc r9, r9, #0\n\t"
  68430. "lsr r3, r6, #16\n\t"
  68431. "lsr r4, r7, #16\n\t"
  68432. "mul r4, r3, r4\n\t"
  68433. "adds r8, r8, r4\n\t"
  68434. "adc r9, r9, #0\n\t"
  68435. "lsl r4, r7, #16\n\t"
  68436. "lsr r4, r4, #16\n\t"
  68437. "mul r3, r4, r3\n\t"
  68438. "lsr r4, r3, #16\n\t"
  68439. "lsl r3, r3, #16\n\t"
  68440. "adds lr, lr, r3\n\t"
  68441. "adcs r8, r8, r4\n\t"
  68442. "adc r9, r9, #0\n\t"
  68443. "str lr, [sp, #12]\n\t"
  68444. /* A[1] * A[3] */
  68445. "ldr r7, [%[a], #12]\n\t"
  68446. "lsl r3, r6, #16\n\t"
  68447. "lsl r4, r7, #16\n\t"
  68448. "lsr r3, r3, #16\n\t"
  68449. "lsr r4, r4, #16\n\t"
  68450. "mul r4, r3, r4\n\t"
  68451. "adds r8, r8, r4\n\t"
  68452. "adc r9, r9, #0\n\t"
  68453. "lsr r4, r7, #16\n\t"
  68454. "mul r3, r4, r3\n\t"
  68455. "lsr r4, r3, #16\n\t"
  68456. "lsl r3, r3, #16\n\t"
  68457. "adds r8, r8, r3\n\t"
  68458. "adc r9, r9, r4\n\t"
  68459. "lsr r3, r6, #16\n\t"
  68460. "lsr r4, r7, #16\n\t"
  68461. "mul r4, r3, r4\n\t"
  68462. "add r9, r9, r4\n\t"
  68463. "lsl r4, r7, #16\n\t"
  68464. "lsr r4, r4, #16\n\t"
  68465. "mul r3, r4, r3\n\t"
  68466. "lsr r4, r3, #16\n\t"
  68467. "lsl r3, r3, #16\n\t"
  68468. "adds r8, r8, r3\n\t"
  68469. "adc r9, r9, r4\n\t"
  68470. /* A[0] * A[4] */
  68471. "ldr r6, [%[a]]\n\t"
  68472. "ldr r7, [%[a], #16]\n\t"
  68473. "lsl r3, r6, #16\n\t"
  68474. "lsl r4, r7, #16\n\t"
  68475. "lsr r3, r3, #16\n\t"
  68476. "lsr r4, r4, #16\n\t"
  68477. "mul r4, r3, r4\n\t"
  68478. "adds r8, r8, r4\n\t"
  68479. "adcs r9, r9, #0\n\t"
  68480. "adc r10, r5, #0\n\t"
  68481. "lsr r4, r7, #16\n\t"
  68482. "mul r3, r4, r3\n\t"
  68483. "lsr r4, r3, #16\n\t"
  68484. "lsl r3, r3, #16\n\t"
  68485. "adds r8, r8, r3\n\t"
  68486. "adcs r9, r9, r4\n\t"
  68487. "adc r10, r10, #0\n\t"
  68488. "lsr r3, r6, #16\n\t"
  68489. "lsr r4, r7, #16\n\t"
  68490. "mul r4, r3, r4\n\t"
  68491. "adds r9, r9, r4\n\t"
  68492. "adc r10, r10, #0\n\t"
  68493. "lsl r4, r7, #16\n\t"
  68494. "lsr r4, r4, #16\n\t"
  68495. "mul r3, r4, r3\n\t"
  68496. "lsr r4, r3, #16\n\t"
  68497. "lsl r3, r3, #16\n\t"
  68498. "adds r8, r8, r3\n\t"
  68499. "adcs r9, r9, r4\n\t"
  68500. "adc r10, r10, #0\n\t"
  68501. "str r8, [sp, #16]\n\t"
  68502. /* A[0] * A[5] */
  68503. "ldr r7, [%[a], #20]\n\t"
  68504. "lsl r3, r6, #16\n\t"
  68505. "lsl r4, r7, #16\n\t"
  68506. "lsr r3, r3, #16\n\t"
  68507. "lsr r4, r4, #16\n\t"
  68508. "mul r4, r3, r4\n\t"
  68509. "adds r9, r9, r4\n\t"
  68510. "adc r10, r10, #0\n\t"
  68511. "lsr r4, r7, #16\n\t"
  68512. "mul r3, r4, r3\n\t"
  68513. "lsr r4, r3, #16\n\t"
  68514. "lsl r3, r3, #16\n\t"
  68515. "adds r9, r9, r3\n\t"
  68516. "adc r10, r10, r4\n\t"
  68517. "lsr r3, r6, #16\n\t"
  68518. "lsr r4, r7, #16\n\t"
  68519. "mul r4, r3, r4\n\t"
  68520. "add r10, r10, r4\n\t"
  68521. "lsl r4, r7, #16\n\t"
  68522. "lsr r4, r4, #16\n\t"
  68523. "mul r3, r4, r3\n\t"
  68524. "lsr r4, r3, #16\n\t"
  68525. "lsl r3, r3, #16\n\t"
  68526. "adds r9, r9, r3\n\t"
  68527. "adc r10, r10, r4\n\t"
  68528. /* A[1] * A[4] */
  68529. "ldr r6, [%[a], #4]\n\t"
  68530. "ldr r7, [%[a], #16]\n\t"
  68531. "lsl r3, r6, #16\n\t"
  68532. "lsl r4, r7, #16\n\t"
  68533. "lsr r3, r3, #16\n\t"
  68534. "lsr r4, r4, #16\n\t"
  68535. "mul r4, r3, r4\n\t"
  68536. "adds r9, r9, r4\n\t"
  68537. "adcs r10, r10, #0\n\t"
  68538. "adc lr, r5, #0\n\t"
  68539. "lsr r4, r7, #16\n\t"
  68540. "mul r3, r4, r3\n\t"
  68541. "lsr r4, r3, #16\n\t"
  68542. "lsl r3, r3, #16\n\t"
  68543. "adds r9, r9, r3\n\t"
  68544. "adcs r10, r10, r4\n\t"
  68545. "adc lr, lr, #0\n\t"
  68546. "lsr r3, r6, #16\n\t"
  68547. "lsr r4, r7, #16\n\t"
  68548. "mul r4, r3, r4\n\t"
  68549. "adds r10, r10, r4\n\t"
  68550. "adc lr, lr, #0\n\t"
  68551. "lsl r4, r7, #16\n\t"
  68552. "lsr r4, r4, #16\n\t"
  68553. "mul r3, r4, r3\n\t"
  68554. "lsr r4, r3, #16\n\t"
  68555. "lsl r3, r3, #16\n\t"
  68556. "adds r9, r9, r3\n\t"
  68557. "adcs r10, r10, r4\n\t"
  68558. "adc lr, lr, #0\n\t"
  68559. /* A[2] * A[3] */
  68560. "ldr r6, [%[a], #8]\n\t"
  68561. "ldr r7, [%[a], #12]\n\t"
  68562. "lsl r3, r6, #16\n\t"
  68563. "lsl r4, r7, #16\n\t"
  68564. "lsr r3, r3, #16\n\t"
  68565. "lsr r4, r4, #16\n\t"
  68566. "mul r4, r3, r4\n\t"
  68567. "adds r9, r9, r4\n\t"
  68568. "adcs r10, r10, #0\n\t"
  68569. "adc lr, r5, lr\n\t"
  68570. "lsr r4, r7, #16\n\t"
  68571. "mul r3, r4, r3\n\t"
  68572. "lsr r4, r3, #16\n\t"
  68573. "lsl r3, r3, #16\n\t"
  68574. "adds r9, r9, r3\n\t"
  68575. "adcs r10, r10, r4\n\t"
  68576. "adc lr, lr, #0\n\t"
  68577. "lsr r3, r6, #16\n\t"
  68578. "lsr r4, r7, #16\n\t"
  68579. "mul r4, r3, r4\n\t"
  68580. "adds r10, r10, r4\n\t"
  68581. "adc lr, lr, #0\n\t"
  68582. "lsl r4, r7, #16\n\t"
  68583. "lsr r4, r4, #16\n\t"
  68584. "mul r3, r4, r3\n\t"
  68585. "lsr r4, r3, #16\n\t"
  68586. "lsl r3, r3, #16\n\t"
  68587. "adds r9, r9, r3\n\t"
  68588. "adcs r10, r10, r4\n\t"
  68589. "adc lr, lr, #0\n\t"
  68590. "str r9, [sp, #20]\n\t"
  68591. /* A[2] * A[4] */
  68592. "ldr r7, [%[a], #16]\n\t"
  68593. "lsl r3, r6, #16\n\t"
  68594. "lsl r4, r7, #16\n\t"
  68595. "lsr r3, r3, #16\n\t"
  68596. "lsr r4, r4, #16\n\t"
  68597. "mul r4, r3, r4\n\t"
  68598. "adds r10, r10, r4\n\t"
  68599. "adcs lr, lr, #0\n\t"
  68600. "adc r8, r5, #0\n\t"
  68601. "lsr r4, r7, #16\n\t"
  68602. "mul r3, r4, r3\n\t"
  68603. "lsr r4, r3, #16\n\t"
  68604. "lsl r3, r3, #16\n\t"
  68605. "adds r10, r10, r3\n\t"
  68606. "adcs lr, lr, r4\n\t"
  68607. "adc r8, r8, #0\n\t"
  68608. "lsr r3, r6, #16\n\t"
  68609. "lsr r4, r7, #16\n\t"
  68610. "mul r4, r3, r4\n\t"
  68611. "adds lr, lr, r4\n\t"
  68612. "adc r8, r8, #0\n\t"
  68613. "lsl r4, r7, #16\n\t"
  68614. "lsr r4, r4, #16\n\t"
  68615. "mul r3, r4, r3\n\t"
  68616. "lsr r4, r3, #16\n\t"
  68617. "lsl r3, r3, #16\n\t"
  68618. "adds r10, r10, r3\n\t"
  68619. "adcs lr, lr, r4\n\t"
  68620. "adc r8, r8, #0\n\t"
  68621. /* A[1] * A[5] */
  68622. "ldr r6, [%[a], #4]\n\t"
  68623. "ldr r7, [%[a], #20]\n\t"
  68624. "lsl r3, r6, #16\n\t"
  68625. "lsl r4, r7, #16\n\t"
  68626. "lsr r3, r3, #16\n\t"
  68627. "lsr r4, r4, #16\n\t"
  68628. "mul r4, r3, r4\n\t"
  68629. "adds r10, r10, r4\n\t"
  68630. "adcs lr, lr, #0\n\t"
  68631. "adc r8, r5, r8\n\t"
  68632. "lsr r4, r7, #16\n\t"
  68633. "mul r3, r4, r3\n\t"
  68634. "lsr r4, r3, #16\n\t"
  68635. "lsl r3, r3, #16\n\t"
  68636. "adds r10, r10, r3\n\t"
  68637. "adcs lr, lr, r4\n\t"
  68638. "adc r8, r8, #0\n\t"
  68639. "lsr r3, r6, #16\n\t"
  68640. "lsr r4, r7, #16\n\t"
  68641. "mul r4, r3, r4\n\t"
  68642. "adds lr, lr, r4\n\t"
  68643. "adc r8, r8, #0\n\t"
  68644. "lsl r4, r7, #16\n\t"
  68645. "lsr r4, r4, #16\n\t"
  68646. "mul r3, r4, r3\n\t"
  68647. "lsr r4, r3, #16\n\t"
  68648. "lsl r3, r3, #16\n\t"
  68649. "adds r10, r10, r3\n\t"
  68650. "adcs lr, lr, r4\n\t"
  68651. "adc r8, r8, #0\n\t"
  68652. /* A[0] * A[6] */
  68653. "ldr r6, [%[a]]\n\t"
  68654. "ldr r7, [%[a], #24]\n\t"
  68655. "lsl r3, r6, #16\n\t"
  68656. "lsl r4, r7, #16\n\t"
  68657. "lsr r3, r3, #16\n\t"
  68658. "lsr r4, r4, #16\n\t"
  68659. "mul r4, r3, r4\n\t"
  68660. "adds r10, r10, r4\n\t"
  68661. "adcs lr, lr, #0\n\t"
  68662. "adc r8, r5, r8\n\t"
  68663. "lsr r4, r7, #16\n\t"
  68664. "mul r3, r4, r3\n\t"
  68665. "lsr r4, r3, #16\n\t"
  68666. "lsl r3, r3, #16\n\t"
  68667. "adds r10, r10, r3\n\t"
  68668. "adcs lr, lr, r4\n\t"
  68669. "adc r8, r8, #0\n\t"
  68670. "lsr r3, r6, #16\n\t"
  68671. "lsr r4, r7, #16\n\t"
  68672. "mul r4, r3, r4\n\t"
  68673. "adds lr, lr, r4\n\t"
  68674. "adc r8, r8, #0\n\t"
  68675. "lsl r4, r7, #16\n\t"
  68676. "lsr r4, r4, #16\n\t"
  68677. "mul r3, r4, r3\n\t"
  68678. "lsr r4, r3, #16\n\t"
  68679. "lsl r3, r3, #16\n\t"
  68680. "adds r10, r10, r3\n\t"
  68681. "adcs lr, lr, r4\n\t"
  68682. "adc r8, r8, #0\n\t"
  68683. "str r10, [sp, #24]\n\t"
  68684. /* A[0] * A[7] */
  68685. "ldr r7, [%[a], #28]\n\t"
  68686. "lsl r3, r6, #16\n\t"
  68687. "lsl r4, r7, #16\n\t"
  68688. "lsr r3, r3, #16\n\t"
  68689. "lsr r4, r4, #16\n\t"
  68690. "mul r4, r3, r4\n\t"
  68691. "adds lr, lr, r4\n\t"
  68692. "adcs r8, r8, #0\n\t"
  68693. "adc r9, r5, #0\n\t"
  68694. "lsr r4, r7, #16\n\t"
  68695. "mul r3, r4, r3\n\t"
  68696. "lsr r4, r3, #16\n\t"
  68697. "lsl r3, r3, #16\n\t"
  68698. "adds lr, lr, r3\n\t"
  68699. "adcs r8, r8, r4\n\t"
  68700. "adc r9, r9, #0\n\t"
  68701. "lsr r3, r6, #16\n\t"
  68702. "lsr r4, r7, #16\n\t"
  68703. "mul r4, r3, r4\n\t"
  68704. "adds r8, r8, r4\n\t"
  68705. "adc r9, r9, #0\n\t"
  68706. "lsl r4, r7, #16\n\t"
  68707. "lsr r4, r4, #16\n\t"
  68708. "mul r3, r4, r3\n\t"
  68709. "lsr r4, r3, #16\n\t"
  68710. "lsl r3, r3, #16\n\t"
  68711. "adds lr, lr, r3\n\t"
  68712. "adcs r8, r8, r4\n\t"
  68713. "adc r9, r9, #0\n\t"
  68714. /* A[1] * A[6] */
  68715. "ldr r6, [%[a], #4]\n\t"
  68716. "ldr r7, [%[a], #24]\n\t"
  68717. "lsl r3, r6, #16\n\t"
  68718. "lsl r4, r7, #16\n\t"
  68719. "lsr r3, r3, #16\n\t"
  68720. "lsr r4, r4, #16\n\t"
  68721. "mul r4, r3, r4\n\t"
  68722. "adds lr, lr, r4\n\t"
  68723. "adcs r8, r8, #0\n\t"
  68724. "adc r9, r5, r9\n\t"
  68725. "lsr r4, r7, #16\n\t"
  68726. "mul r3, r4, r3\n\t"
  68727. "lsr r4, r3, #16\n\t"
  68728. "lsl r3, r3, #16\n\t"
  68729. "adds lr, lr, r3\n\t"
  68730. "adcs r8, r8, r4\n\t"
  68731. "adc r9, r9, #0\n\t"
  68732. "lsr r3, r6, #16\n\t"
  68733. "lsr r4, r7, #16\n\t"
  68734. "mul r4, r3, r4\n\t"
  68735. "adds r8, r8, r4\n\t"
  68736. "adc r9, r9, #0\n\t"
  68737. "lsl r4, r7, #16\n\t"
  68738. "lsr r4, r4, #16\n\t"
  68739. "mul r3, r4, r3\n\t"
  68740. "lsr r4, r3, #16\n\t"
  68741. "lsl r3, r3, #16\n\t"
  68742. "adds lr, lr, r3\n\t"
  68743. "adcs r8, r8, r4\n\t"
  68744. "adc r9, r9, #0\n\t"
  68745. /* A[2] * A[5] */
  68746. "ldr r6, [%[a], #8]\n\t"
  68747. "ldr r7, [%[a], #20]\n\t"
  68748. "lsl r3, r6, #16\n\t"
  68749. "lsl r4, r7, #16\n\t"
  68750. "lsr r3, r3, #16\n\t"
  68751. "lsr r4, r4, #16\n\t"
  68752. "mul r4, r3, r4\n\t"
  68753. "adds lr, lr, r4\n\t"
  68754. "adcs r8, r8, #0\n\t"
  68755. "adc r9, r5, r9\n\t"
  68756. "lsr r4, r7, #16\n\t"
  68757. "mul r3, r4, r3\n\t"
  68758. "lsr r4, r3, #16\n\t"
  68759. "lsl r3, r3, #16\n\t"
  68760. "adds lr, lr, r3\n\t"
  68761. "adcs r8, r8, r4\n\t"
  68762. "adc r9, r9, #0\n\t"
  68763. "lsr r3, r6, #16\n\t"
  68764. "lsr r4, r7, #16\n\t"
  68765. "mul r4, r3, r4\n\t"
  68766. "adds r8, r8, r4\n\t"
  68767. "adc r9, r9, #0\n\t"
  68768. "lsl r4, r7, #16\n\t"
  68769. "lsr r4, r4, #16\n\t"
  68770. "mul r3, r4, r3\n\t"
  68771. "lsr r4, r3, #16\n\t"
  68772. "lsl r3, r3, #16\n\t"
  68773. "adds lr, lr, r3\n\t"
  68774. "adcs r8, r8, r4\n\t"
  68775. "adc r9, r9, #0\n\t"
  68776. /* A[3] * A[4] */
  68777. "ldr r6, [%[a], #12]\n\t"
  68778. "ldr r7, [%[a], #16]\n\t"
  68779. "lsl r3, r6, #16\n\t"
  68780. "lsl r4, r7, #16\n\t"
  68781. "lsr r3, r3, #16\n\t"
  68782. "lsr r4, r4, #16\n\t"
  68783. "mul r4, r3, r4\n\t"
  68784. "adds lr, lr, r4\n\t"
  68785. "adcs r8, r8, #0\n\t"
  68786. "adc r9, r5, r9\n\t"
  68787. "lsr r4, r7, #16\n\t"
  68788. "mul r3, r4, r3\n\t"
  68789. "lsr r4, r3, #16\n\t"
  68790. "lsl r3, r3, #16\n\t"
  68791. "adds lr, lr, r3\n\t"
  68792. "adcs r8, r8, r4\n\t"
  68793. "adc r9, r9, #0\n\t"
  68794. "lsr r3, r6, #16\n\t"
  68795. "lsr r4, r7, #16\n\t"
  68796. "mul r4, r3, r4\n\t"
  68797. "adds r8, r8, r4\n\t"
  68798. "adc r9, r9, #0\n\t"
  68799. "lsl r4, r7, #16\n\t"
  68800. "lsr r4, r4, #16\n\t"
  68801. "mul r3, r4, r3\n\t"
  68802. "lsr r4, r3, #16\n\t"
  68803. "lsl r3, r3, #16\n\t"
  68804. "adds lr, lr, r3\n\t"
  68805. "adcs r8, r8, r4\n\t"
  68806. "adc r9, r9, #0\n\t"
  68807. "str lr, [sp, #28]\n\t"
  68808. /* A[3] * A[5] */
  68809. "ldr r7, [%[a], #20]\n\t"
  68810. "lsl r3, r6, #16\n\t"
  68811. "lsl r4, r7, #16\n\t"
  68812. "lsr r3, r3, #16\n\t"
  68813. "lsr r4, r4, #16\n\t"
  68814. "mul r4, r3, r4\n\t"
  68815. "adds r8, r8, r4\n\t"
  68816. "adcs r9, r9, #0\n\t"
  68817. "adc r10, r5, #0\n\t"
  68818. "lsr r4, r7, #16\n\t"
  68819. "mul r3, r4, r3\n\t"
  68820. "lsr r4, r3, #16\n\t"
  68821. "lsl r3, r3, #16\n\t"
  68822. "adds r8, r8, r3\n\t"
  68823. "adcs r9, r9, r4\n\t"
  68824. "adc r10, r10, #0\n\t"
  68825. "lsr r3, r6, #16\n\t"
  68826. "lsr r4, r7, #16\n\t"
  68827. "mul r4, r3, r4\n\t"
  68828. "adds r9, r9, r4\n\t"
  68829. "adc r10, r10, #0\n\t"
  68830. "lsl r4, r7, #16\n\t"
  68831. "lsr r4, r4, #16\n\t"
  68832. "mul r3, r4, r3\n\t"
  68833. "lsr r4, r3, #16\n\t"
  68834. "lsl r3, r3, #16\n\t"
  68835. "adds r8, r8, r3\n\t"
  68836. "adcs r9, r9, r4\n\t"
  68837. "adc r10, r10, #0\n\t"
  68838. /* A[2] * A[6] */
  68839. "ldr r6, [%[a], #8]\n\t"
  68840. "ldr r7, [%[a], #24]\n\t"
  68841. "lsl r3, r6, #16\n\t"
  68842. "lsl r4, r7, #16\n\t"
  68843. "lsr r3, r3, #16\n\t"
  68844. "lsr r4, r4, #16\n\t"
  68845. "mul r4, r3, r4\n\t"
  68846. "adds r8, r8, r4\n\t"
  68847. "adcs r9, r9, #0\n\t"
  68848. "adc r10, r5, r10\n\t"
  68849. "lsr r4, r7, #16\n\t"
  68850. "mul r3, r4, r3\n\t"
  68851. "lsr r4, r3, #16\n\t"
  68852. "lsl r3, r3, #16\n\t"
  68853. "adds r8, r8, r3\n\t"
  68854. "adcs r9, r9, r4\n\t"
  68855. "adc r10, r10, #0\n\t"
  68856. "lsr r3, r6, #16\n\t"
  68857. "lsr r4, r7, #16\n\t"
  68858. "mul r4, r3, r4\n\t"
  68859. "adds r9, r9, r4\n\t"
  68860. "adc r10, r10, #0\n\t"
  68861. "lsl r4, r7, #16\n\t"
  68862. "lsr r4, r4, #16\n\t"
  68863. "mul r3, r4, r3\n\t"
  68864. "lsr r4, r3, #16\n\t"
  68865. "lsl r3, r3, #16\n\t"
  68866. "adds r8, r8, r3\n\t"
  68867. "adcs r9, r9, r4\n\t"
  68868. "adc r10, r10, #0\n\t"
  68869. /* A[1] * A[7] */
  68870. "ldr r6, [%[a], #4]\n\t"
  68871. "ldr r7, [%[a], #28]\n\t"
  68872. "lsl r3, r6, #16\n\t"
  68873. "lsl r4, r7, #16\n\t"
  68874. "lsr r3, r3, #16\n\t"
  68875. "lsr r4, r4, #16\n\t"
  68876. "mul r4, r3, r4\n\t"
  68877. "adds r8, r8, r4\n\t"
  68878. "adcs r9, r9, #0\n\t"
  68879. "adc r10, r5, r10\n\t"
  68880. "lsr r4, r7, #16\n\t"
  68881. "mul r3, r4, r3\n\t"
  68882. "lsr r4, r3, #16\n\t"
  68883. "lsl r3, r3, #16\n\t"
  68884. "adds r8, r8, r3\n\t"
  68885. "adcs r9, r9, r4\n\t"
  68886. "adc r10, r10, #0\n\t"
  68887. "lsr r3, r6, #16\n\t"
  68888. "lsr r4, r7, #16\n\t"
  68889. "mul r4, r3, r4\n\t"
  68890. "adds r9, r9, r4\n\t"
  68891. "adc r10, r10, #0\n\t"
  68892. "lsl r4, r7, #16\n\t"
  68893. "lsr r4, r4, #16\n\t"
  68894. "mul r3, r4, r3\n\t"
  68895. "lsr r4, r3, #16\n\t"
  68896. "lsl r3, r3, #16\n\t"
  68897. "adds r8, r8, r3\n\t"
  68898. "adcs r9, r9, r4\n\t"
  68899. "adc r10, r10, #0\n\t"
  68900. "str r8, [sp, #32]\n\t"
  68901. /* A[2] * A[7] */
  68902. "ldr r6, [%[a], #8]\n\t"
  68903. "lsl r3, r6, #16\n\t"
  68904. "lsl r4, r7, #16\n\t"
  68905. "lsr r3, r3, #16\n\t"
  68906. "lsr r4, r4, #16\n\t"
  68907. "mul r4, r3, r4\n\t"
  68908. "adds r9, r9, r4\n\t"
  68909. "adcs r10, r10, #0\n\t"
  68910. "adc lr, r5, #0\n\t"
  68911. "lsr r4, r7, #16\n\t"
  68912. "mul r3, r4, r3\n\t"
  68913. "lsr r4, r3, #16\n\t"
  68914. "lsl r3, r3, #16\n\t"
  68915. "adds r9, r9, r3\n\t"
  68916. "adcs r10, r10, r4\n\t"
  68917. "adc lr, lr, #0\n\t"
  68918. "lsr r3, r6, #16\n\t"
  68919. "lsr r4, r7, #16\n\t"
  68920. "mul r4, r3, r4\n\t"
  68921. "adds r10, r10, r4\n\t"
  68922. "adc lr, lr, #0\n\t"
  68923. "lsl r4, r7, #16\n\t"
  68924. "lsr r4, r4, #16\n\t"
  68925. "mul r3, r4, r3\n\t"
  68926. "lsr r4, r3, #16\n\t"
  68927. "lsl r3, r3, #16\n\t"
  68928. "adds r9, r9, r3\n\t"
  68929. "adcs r10, r10, r4\n\t"
  68930. "adc lr, lr, #0\n\t"
  68931. /* A[3] * A[6] */
  68932. "ldr r6, [%[a], #12]\n\t"
  68933. "ldr r7, [%[a], #24]\n\t"
  68934. "lsl r3, r6, #16\n\t"
  68935. "lsl r4, r7, #16\n\t"
  68936. "lsr r3, r3, #16\n\t"
  68937. "lsr r4, r4, #16\n\t"
  68938. "mul r4, r3, r4\n\t"
  68939. "adds r9, r9, r4\n\t"
  68940. "adcs r10, r10, #0\n\t"
  68941. "adc lr, r5, lr\n\t"
  68942. "lsr r4, r7, #16\n\t"
  68943. "mul r3, r4, r3\n\t"
  68944. "lsr r4, r3, #16\n\t"
  68945. "lsl r3, r3, #16\n\t"
  68946. "adds r9, r9, r3\n\t"
  68947. "adcs r10, r10, r4\n\t"
  68948. "adc lr, lr, #0\n\t"
  68949. "lsr r3, r6, #16\n\t"
  68950. "lsr r4, r7, #16\n\t"
  68951. "mul r4, r3, r4\n\t"
  68952. "adds r10, r10, r4\n\t"
  68953. "adc lr, lr, #0\n\t"
  68954. "lsl r4, r7, #16\n\t"
  68955. "lsr r4, r4, #16\n\t"
  68956. "mul r3, r4, r3\n\t"
  68957. "lsr r4, r3, #16\n\t"
  68958. "lsl r3, r3, #16\n\t"
  68959. "adds r9, r9, r3\n\t"
  68960. "adcs r10, r10, r4\n\t"
  68961. "adc lr, lr, #0\n\t"
  68962. /* A[4] * A[5] */
  68963. "ldr r6, [%[a], #16]\n\t"
  68964. "ldr r7, [%[a], #20]\n\t"
  68965. "lsl r3, r6, #16\n\t"
  68966. "lsl r4, r7, #16\n\t"
  68967. "lsr r3, r3, #16\n\t"
  68968. "lsr r4, r4, #16\n\t"
  68969. "mul r4, r3, r4\n\t"
  68970. "adds r9, r9, r4\n\t"
  68971. "adcs r10, r10, #0\n\t"
  68972. "adc lr, r5, lr\n\t"
  68973. "lsr r4, r7, #16\n\t"
  68974. "mul r3, r4, r3\n\t"
  68975. "lsr r4, r3, #16\n\t"
  68976. "lsl r3, r3, #16\n\t"
  68977. "adds r9, r9, r3\n\t"
  68978. "adcs r10, r10, r4\n\t"
  68979. "adc lr, lr, #0\n\t"
  68980. "lsr r3, r6, #16\n\t"
  68981. "lsr r4, r7, #16\n\t"
  68982. "mul r4, r3, r4\n\t"
  68983. "adds r10, r10, r4\n\t"
  68984. "adc lr, lr, #0\n\t"
  68985. "lsl r4, r7, #16\n\t"
  68986. "lsr r4, r4, #16\n\t"
  68987. "mul r3, r4, r3\n\t"
  68988. "lsr r4, r3, #16\n\t"
  68989. "lsl r3, r3, #16\n\t"
  68990. "adds r9, r9, r3\n\t"
  68991. "adcs r10, r10, r4\n\t"
  68992. "adc lr, lr, #0\n\t"
  68993. "str r9, [sp, #36]\n\t"
  68994. /* A[4] * A[6] */
  68995. "ldr r7, [%[a], #24]\n\t"
  68996. "lsl r3, r6, #16\n\t"
  68997. "lsl r4, r7, #16\n\t"
  68998. "lsr r3, r3, #16\n\t"
  68999. "lsr r4, r4, #16\n\t"
  69000. "mul r4, r3, r4\n\t"
  69001. "adds r10, r10, r4\n\t"
  69002. "adcs lr, lr, #0\n\t"
  69003. "adc r8, r5, #0\n\t"
  69004. "lsr r4, r7, #16\n\t"
  69005. "mul r3, r4, r3\n\t"
  69006. "lsr r4, r3, #16\n\t"
  69007. "lsl r3, r3, #16\n\t"
  69008. "adds r10, r10, r3\n\t"
  69009. "adcs lr, lr, r4\n\t"
  69010. "adc r8, r8, #0\n\t"
  69011. "lsr r3, r6, #16\n\t"
  69012. "lsr r4, r7, #16\n\t"
  69013. "mul r4, r3, r4\n\t"
  69014. "adds lr, lr, r4\n\t"
  69015. "adc r8, r8, #0\n\t"
  69016. "lsl r4, r7, #16\n\t"
  69017. "lsr r4, r4, #16\n\t"
  69018. "mul r3, r4, r3\n\t"
  69019. "lsr r4, r3, #16\n\t"
  69020. "lsl r3, r3, #16\n\t"
  69021. "adds r10, r10, r3\n\t"
  69022. "adcs lr, lr, r4\n\t"
  69023. "adc r8, r8, #0\n\t"
  69024. /* A[3] * A[7] */
  69025. "ldr r6, [%[a], #12]\n\t"
  69026. "ldr r7, [%[a], #28]\n\t"
  69027. "lsl r3, r6, #16\n\t"
  69028. "lsl r4, r7, #16\n\t"
  69029. "lsr r3, r3, #16\n\t"
  69030. "lsr r4, r4, #16\n\t"
  69031. "mul r4, r3, r4\n\t"
  69032. "adds r10, r10, r4\n\t"
  69033. "adcs lr, lr, #0\n\t"
  69034. "adc r8, r5, r8\n\t"
  69035. "lsr r4, r7, #16\n\t"
  69036. "mul r3, r4, r3\n\t"
  69037. "lsr r4, r3, #16\n\t"
  69038. "lsl r3, r3, #16\n\t"
  69039. "adds r10, r10, r3\n\t"
  69040. "adcs lr, lr, r4\n\t"
  69041. "adc r8, r8, #0\n\t"
  69042. "lsr r3, r6, #16\n\t"
  69043. "lsr r4, r7, #16\n\t"
  69044. "mul r4, r3, r4\n\t"
  69045. "adds lr, lr, r4\n\t"
  69046. "adc r8, r8, #0\n\t"
  69047. "lsl r4, r7, #16\n\t"
  69048. "lsr r4, r4, #16\n\t"
  69049. "mul r3, r4, r3\n\t"
  69050. "lsr r4, r3, #16\n\t"
  69051. "lsl r3, r3, #16\n\t"
  69052. "adds r10, r10, r3\n\t"
  69053. "adcs lr, lr, r4\n\t"
  69054. "adc r8, r8, #0\n\t"
  69055. "str r10, [sp, #40]\n\t"
  69056. /* A[4] * A[7] */
  69057. "ldr r6, [%[a], #16]\n\t"
  69058. "lsl r3, r6, #16\n\t"
  69059. "lsl r4, r7, #16\n\t"
  69060. "lsr r3, r3, #16\n\t"
  69061. "lsr r4, r4, #16\n\t"
  69062. "mul r4, r3, r4\n\t"
  69063. "adds lr, lr, r4\n\t"
  69064. "adcs r8, r8, #0\n\t"
  69065. "adc r9, r5, #0\n\t"
  69066. "lsr r4, r7, #16\n\t"
  69067. "mul r3, r4, r3\n\t"
  69068. "lsr r4, r3, #16\n\t"
  69069. "lsl r3, r3, #16\n\t"
  69070. "adds lr, lr, r3\n\t"
  69071. "adcs r8, r8, r4\n\t"
  69072. "adc r9, r9, #0\n\t"
  69073. "lsr r3, r6, #16\n\t"
  69074. "lsr r4, r7, #16\n\t"
  69075. "mul r4, r3, r4\n\t"
  69076. "adds r8, r8, r4\n\t"
  69077. "adc r9, r9, #0\n\t"
  69078. "lsl r4, r7, #16\n\t"
  69079. "lsr r4, r4, #16\n\t"
  69080. "mul r3, r4, r3\n\t"
  69081. "lsr r4, r3, #16\n\t"
  69082. "lsl r3, r3, #16\n\t"
  69083. "adds lr, lr, r3\n\t"
  69084. "adcs r8, r8, r4\n\t"
  69085. "adc r9, r9, #0\n\t"
  69086. /* A[5] * A[6] */
  69087. "ldr r6, [%[a], #20]\n\t"
  69088. "ldr r7, [%[a], #24]\n\t"
  69089. "lsl r3, r6, #16\n\t"
  69090. "lsl r4, r7, #16\n\t"
  69091. "lsr r3, r3, #16\n\t"
  69092. "lsr r4, r4, #16\n\t"
  69093. "mul r4, r3, r4\n\t"
  69094. "adds lr, lr, r4\n\t"
  69095. "adcs r8, r8, #0\n\t"
  69096. "adc r9, r5, r9\n\t"
  69097. "lsr r4, r7, #16\n\t"
  69098. "mul r3, r4, r3\n\t"
  69099. "lsr r4, r3, #16\n\t"
  69100. "lsl r3, r3, #16\n\t"
  69101. "adds lr, lr, r3\n\t"
  69102. "adcs r8, r8, r4\n\t"
  69103. "adc r9, r9, #0\n\t"
  69104. "lsr r3, r6, #16\n\t"
  69105. "lsr r4, r7, #16\n\t"
  69106. "mul r4, r3, r4\n\t"
  69107. "adds r8, r8, r4\n\t"
  69108. "adc r9, r9, #0\n\t"
  69109. "lsl r4, r7, #16\n\t"
  69110. "lsr r4, r4, #16\n\t"
  69111. "mul r3, r4, r3\n\t"
  69112. "lsr r4, r3, #16\n\t"
  69113. "lsl r3, r3, #16\n\t"
  69114. "adds lr, lr, r3\n\t"
  69115. "adcs r8, r8, r4\n\t"
  69116. "adc r9, r9, #0\n\t"
  69117. "str lr, [sp, #44]\n\t"
  69118. /* A[5] * A[7] */
  69119. "ldr r7, [%[a], #28]\n\t"
  69120. "lsl r3, r6, #16\n\t"
  69121. "lsl r4, r7, #16\n\t"
  69122. "lsr r3, r3, #16\n\t"
  69123. "lsr r4, r4, #16\n\t"
  69124. "mul r4, r3, r4\n\t"
  69125. "adds r8, r8, r4\n\t"
  69126. "adcs r9, r9, #0\n\t"
  69127. "adc r10, r5, #0\n\t"
  69128. "lsr r4, r7, #16\n\t"
  69129. "mul r3, r4, r3\n\t"
  69130. "lsr r4, r3, #16\n\t"
  69131. "lsl r3, r3, #16\n\t"
  69132. "adds r8, r8, r3\n\t"
  69133. "adcs r9, r9, r4\n\t"
  69134. "adc r10, r10, #0\n\t"
  69135. "lsr r3, r6, #16\n\t"
  69136. "lsr r4, r7, #16\n\t"
  69137. "mul r4, r3, r4\n\t"
  69138. "adds r9, r9, r4\n\t"
  69139. "adc r10, r10, #0\n\t"
  69140. "lsl r4, r7, #16\n\t"
  69141. "lsr r4, r4, #16\n\t"
  69142. "mul r3, r4, r3\n\t"
  69143. "lsr r4, r3, #16\n\t"
  69144. "lsl r3, r3, #16\n\t"
  69145. "adds r8, r8, r3\n\t"
  69146. "adcs r9, r9, r4\n\t"
  69147. "adc r10, r10, #0\n\t"
  69148. "str r8, [sp, #48]\n\t"
  69149. /* A[6] * A[7] */
  69150. "ldr r6, [%[a], #24]\n\t"
  69151. "lsl r3, r6, #16\n\t"
  69152. "lsl r4, r7, #16\n\t"
  69153. "lsr r3, r3, #16\n\t"
  69154. "lsr r4, r4, #16\n\t"
  69155. "mul r4, r3, r4\n\t"
  69156. "adds r9, r9, r4\n\t"
  69157. "adc r10, r10, #0\n\t"
  69158. "lsr r4, r7, #16\n\t"
  69159. "mul r3, r4, r3\n\t"
  69160. "lsr r4, r3, #16\n\t"
  69161. "lsl r3, r3, #16\n\t"
  69162. "adds r9, r9, r3\n\t"
  69163. "adc r10, r10, r4\n\t"
  69164. "lsr r3, r6, #16\n\t"
  69165. "lsr r4, r7, #16\n\t"
  69166. "mul r4, r3, r4\n\t"
  69167. "add r10, r10, r4\n\t"
  69168. "lsl r4, r7, #16\n\t"
  69169. "lsr r4, r4, #16\n\t"
  69170. "mul r3, r4, r3\n\t"
  69171. "lsr r4, r3, #16\n\t"
  69172. "lsl r3, r3, #16\n\t"
  69173. "adds r9, r9, r3\n\t"
  69174. "adc r10, r10, r4\n\t"
  69175. "str r9, [sp, #52]\n\t"
  69176. "str r10, [sp, #56]\n\t"
  69177. /* Double */
  69178. "ldr r4, [sp, #4]\n\t"
  69179. "ldr r6, [sp, #8]\n\t"
  69180. "ldr r7, [sp, #12]\n\t"
  69181. "ldr r8, [sp, #16]\n\t"
  69182. "ldr r9, [sp, #20]\n\t"
  69183. "ldr r10, [sp, #24]\n\t"
  69184. "ldr lr, [sp, #28]\n\t"
  69185. "ldr r12, [sp, #32]\n\t"
  69186. "ldr r3, [sp, #36]\n\t"
  69187. "adds r4, r4, r4\n\t"
  69188. "adcs r6, r6, r6\n\t"
  69189. "adcs r7, r7, r7\n\t"
  69190. "adcs r8, r8, r8\n\t"
  69191. "adcs r9, r9, r9\n\t"
  69192. "adcs r10, r10, r10\n\t"
  69193. "adcs lr, lr, lr\n\t"
  69194. "adcs r12, r12, r12\n\t"
  69195. "adcs r3, r3, r3\n\t"
  69196. "str r4, [sp, #4]\n\t"
  69197. "str r6, [sp, #8]\n\t"
  69198. "str r7, [sp, #12]\n\t"
  69199. "str r8, [sp, #16]\n\t"
  69200. "str r9, [sp, #20]\n\t"
  69201. "str r10, [sp, #24]\n\t"
  69202. "str lr, [sp, #28]\n\t"
  69203. "str r12, [sp, #32]\n\t"
  69204. "str r3, [sp, #36]\n\t"
  69205. "ldr r4, [sp, #40]\n\t"
  69206. "ldr r6, [sp, #44]\n\t"
  69207. "ldr r7, [sp, #48]\n\t"
  69208. "ldr r8, [sp, #52]\n\t"
  69209. "ldr r9, [sp, #56]\n\t"
  69210. "adcs r4, r4, r4\n\t"
  69211. "adcs r6, r6, r6\n\t"
  69212. "adcs r7, r7, r7\n\t"
  69213. "adcs r8, r8, r8\n\t"
  69214. "adcs r9, r9, r9\n\t"
  69215. "str r4, [sp, #40]\n\t"
  69216. "str r6, [sp, #44]\n\t"
  69217. "str r7, [sp, #48]\n\t"
  69218. "str r8, [sp, #52]\n\t"
  69219. "str r9, [sp, #56]\n\t"
  69220. "adc r10, r5, #0\n\t"
  69221. "str r10, [sp, #60]\n\t"
  69222. "ldr r4, [sp, #4]\n\t"
  69223. "ldr r5, [sp, #8]\n\t"
  69224. "ldr r12, [sp, #12]\n\t"
  69225. /* A[0] * A[0] */
  69226. "ldr r6, [%[a]]\n\t"
  69227. "lsr r7, r6, #16\n\t"
  69228. "lsl r6, r6, #16\n\t"
  69229. "lsr r6, r6, #16\n\t"
  69230. "mul r8, r6, r6\n\t"
  69231. "mul r9, r7, r7\n\t"
  69232. "mul r6, r7, r6\n\t"
  69233. "lsr r7, r6, #15\n\t"
  69234. "lsl r6, r6, #17\n\t"
  69235. "adds r8, r8, r6\n\t"
  69236. "adc r9, r9, r7\n\t"
  69237. /* A[1] * A[1] */
  69238. "ldr r6, [%[a], #4]\n\t"
  69239. "lsr r7, r6, #16\n\t"
  69240. "lsl r6, r6, #16\n\t"
  69241. "lsr r6, r6, #16\n\t"
  69242. "mul r10, r6, r6\n\t"
  69243. "mul lr, r7, r7\n\t"
  69244. "mul r6, r7, r6\n\t"
  69245. "lsr r7, r6, #15\n\t"
  69246. "lsl r6, r6, #17\n\t"
  69247. "adds r10, r10, r6\n\t"
  69248. "adc lr, lr, r7\n\t"
  69249. "adds r9, r9, r4\n\t"
  69250. "adcs r10, r10, r5\n\t"
  69251. "adcs lr, lr, r12\n\t"
  69252. "str r8, [sp]\n\t"
  69253. "str r9, [sp, #4]\n\t"
  69254. "str r10, [sp, #8]\n\t"
  69255. "str lr, [sp, #12]\n\t"
  69256. "ldr r3, [sp, #16]\n\t"
  69257. "ldr r4, [sp, #20]\n\t"
  69258. "ldr r5, [sp, #24]\n\t"
  69259. "ldr r12, [sp, #28]\n\t"
  69260. /* A[2] * A[2] */
  69261. "ldr r6, [%[a], #8]\n\t"
  69262. "lsr r7, r6, #16\n\t"
  69263. "lsl r6, r6, #16\n\t"
  69264. "lsr r6, r6, #16\n\t"
  69265. "mul r8, r6, r6\n\t"
  69266. "mul r9, r7, r7\n\t"
  69267. "mul r6, r7, r6\n\t"
  69268. "lsr r7, r6, #15\n\t"
  69269. "lsl r6, r6, #17\n\t"
  69270. "adcs r8, r8, r6\n\t"
  69271. "adc r9, r9, r7\n\t"
  69272. /* A[3] * A[3] */
  69273. "ldr r6, [%[a], #12]\n\t"
  69274. "lsr r7, r6, #16\n\t"
  69275. "lsl r6, r6, #16\n\t"
  69276. "lsr r6, r6, #16\n\t"
  69277. "mul r10, r6, r6\n\t"
  69278. "mul lr, r7, r7\n\t"
  69279. "mul r6, r7, r6\n\t"
  69280. "lsr r7, r6, #15\n\t"
  69281. "lsl r6, r6, #17\n\t"
  69282. "adds r10, r10, r6\n\t"
  69283. "adc lr, lr, r7\n\t"
  69284. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  69285. "adcs r8, r8, r3\n\t"
  69286. "adcs r9, r9, r4\n\t"
  69287. #else
  69288. "adds r8, r8, r3\n\t"
  69289. "adcs r9, r9, r4\n\t"
  69290. #endif
  69291. "adcs r10, r10, r5\n\t"
  69292. "adcs lr, lr, r12\n\t"
  69293. "str r8, [sp, #16]\n\t"
  69294. "str r9, [sp, #20]\n\t"
  69295. "str r10, [sp, #24]\n\t"
  69296. "str lr, [sp, #28]\n\t"
  69297. "ldr r3, [sp, #32]\n\t"
  69298. "ldr r4, [sp, #36]\n\t"
  69299. "ldr r5, [sp, #40]\n\t"
  69300. "ldr r12, [sp, #44]\n\t"
  69301. /* A[4] * A[4] */
  69302. "ldr r6, [%[a], #16]\n\t"
  69303. "lsr r7, r6, #16\n\t"
  69304. "lsl r6, r6, #16\n\t"
  69305. "lsr r6, r6, #16\n\t"
  69306. "mul r8, r6, r6\n\t"
  69307. "mul r9, r7, r7\n\t"
  69308. "mul r6, r7, r6\n\t"
  69309. "lsr r7, r6, #15\n\t"
  69310. "lsl r6, r6, #17\n\t"
  69311. "adcs r8, r8, r6\n\t"
  69312. "adc r9, r9, r7\n\t"
  69313. /* A[5] * A[5] */
  69314. "ldr r6, [%[a], #20]\n\t"
  69315. "lsr r7, r6, #16\n\t"
  69316. "lsl r6, r6, #16\n\t"
  69317. "lsr r6, r6, #16\n\t"
  69318. "mul r10, r6, r6\n\t"
  69319. "mul lr, r7, r7\n\t"
  69320. "mul r6, r7, r6\n\t"
  69321. "lsr r7, r6, #15\n\t"
  69322. "lsl r6, r6, #17\n\t"
  69323. "adds r10, r10, r6\n\t"
  69324. "adc lr, lr, r7\n\t"
  69325. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  69326. "adcs r8, r8, r3\n\t"
  69327. "adcs r9, r9, r4\n\t"
  69328. #else
  69329. "adds r8, r8, r3\n\t"
  69330. "adcs r9, r9, r4\n\t"
  69331. #endif
  69332. "adcs r10, r10, r5\n\t"
  69333. "adcs lr, lr, r12\n\t"
  69334. "str r8, [sp, #32]\n\t"
  69335. "str r9, [sp, #36]\n\t"
  69336. "str r10, [sp, #40]\n\t"
  69337. "str lr, [sp, #44]\n\t"
  69338. "ldr r3, [sp, #48]\n\t"
  69339. "ldr r4, [sp, #52]\n\t"
  69340. "ldr r5, [sp, #56]\n\t"
  69341. "ldr r12, [sp, #60]\n\t"
  69342. /* A[6] * A[6] */
  69343. "ldr r6, [%[a], #24]\n\t"
  69344. "lsr r7, r6, #16\n\t"
  69345. "lsl r6, r6, #16\n\t"
  69346. "lsr r6, r6, #16\n\t"
  69347. "mul r8, r6, r6\n\t"
  69348. "mul r9, r7, r7\n\t"
  69349. "mul r6, r7, r6\n\t"
  69350. "lsr r7, r6, #15\n\t"
  69351. "lsl r6, r6, #17\n\t"
  69352. "adcs r8, r8, r6\n\t"
  69353. "adc r9, r9, r7\n\t"
  69354. /* A[7] * A[7] */
  69355. "ldr r6, [%[a], #28]\n\t"
  69356. "lsr r7, r6, #16\n\t"
  69357. "lsl r6, r6, #16\n\t"
  69358. "lsr r6, r6, #16\n\t"
  69359. "mul r10, r6, r6\n\t"
  69360. "mul lr, r7, r7\n\t"
  69361. "mul r6, r7, r6\n\t"
  69362. "lsr r7, r6, #15\n\t"
  69363. "lsl r6, r6, #17\n\t"
  69364. "adds r10, r10, r6\n\t"
  69365. "adc lr, lr, r7\n\t"
  69366. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  69367. "adcs r8, r8, r3\n\t"
  69368. "adcs r9, r9, r4\n\t"
  69369. #else
  69370. "adds r8, r8, r3\n\t"
  69371. "adcs r9, r9, r4\n\t"
  69372. #endif
  69373. "adcs r10, r10, r5\n\t"
  69374. "adc lr, lr, r12\n\t"
  69375. "str r8, [sp, #48]\n\t"
  69376. "str r9, [sp, #52]\n\t"
  69377. "str r10, [sp, #56]\n\t"
  69378. "str lr, [sp, #60]\n\t"
  69379. "str %[r], [sp, #64]\n\t"
  69380. /* Start Reduction */
  69381. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  69382. "mov r3, r11\n\t"
  69383. "mov r4, r12\n\t"
  69384. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  69385. /* - a[0] << 224 */
  69386. /* + (a[0]-a[1] * 2) << (6 * 32) */
  69387. "adds r11, r11, r5\n\t"
  69388. "adc r12, r12, r6\n\t"
  69389. "adds r11, r11, r5\n\t"
  69390. "adc r12, r12, r6\n\t"
  69391. /* - a[0] << (7 * 32) */
  69392. "sub r12, r12, r5\n\t"
  69393. /* + a[0]-a[4] << (3 * 32) */
  69394. "mov r0, r8\n\t"
  69395. "mov r1, r9\n\t"
  69396. "mov r2, r10\n\t"
  69397. "adds r8, r8, r5\n\t"
  69398. "adcs r9, r9, r6\n\t"
  69399. "adcs r10, r10, r7\n\t"
  69400. "adcs r11, r11, r0\n\t"
  69401. "adc r12, r12, r1\n\t"
  69402. /* a += mu * m */
  69403. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  69404. /* a[0] = = t[0] */
  69405. /* a[1] = = t[1] */
  69406. /* a[2] = = t[2] */
  69407. /* a[3] += t[0] = t[3] */
  69408. /* a[4] += t[1] = t[4] */
  69409. /* a[5] += t[2] = t[5] */
  69410. /* a[6] += t[0] + t[3] = t[6] */
  69411. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  69412. "adds r0, r0, r5\n\t"
  69413. "adcs r1, r1, r6\n\t"
  69414. "adcs r2, r2, r7\n\t"
  69415. "adcs r3, r3, r8\n\t"
  69416. "adcs r4, r4, r9\n\t"
  69417. "mov lr, #0\n\t"
  69418. "adc lr, lr, #0\n\t"
  69419. "adds r3, r3, r5\n\t"
  69420. "adcs r4, r4, r6\n\t"
  69421. "adc lr, lr, #0\n\t"
  69422. "str r4, [sp, #28]\n\t"
  69423. /* a[8] += t[0] + t[2] + t[5] + carry */
  69424. /* a[9] += t[1] + t[3] + t[6] */
  69425. /* a[10] += t[2] + t[4] + t[7] */
  69426. "add r0, sp, #32\n\t"
  69427. "ldm r0, {r2, r3, r4}\n\t"
  69428. "adds r2, r2, lr\n\t"
  69429. "adcs r3, r3, #0\n\t"
  69430. "adcs r4, r4, #0\n\t"
  69431. "mov lr, #0\n\t"
  69432. "adc lr, lr, #0\n\t"
  69433. "adds r2, r2, r5\n\t"
  69434. "adcs r3, r3, r6\n\t"
  69435. "adcs r4, r4, r7\n\t"
  69436. "adc lr, lr, #0\n\t"
  69437. "adds r2, r2, r7\n\t"
  69438. "adcs r3, r3, r8\n\t"
  69439. "adcs r4, r4, r9\n\t"
  69440. "adc lr, lr, #0\n\t"
  69441. "adds r2, r2, r10\n\t"
  69442. "adcs r3, r3, r11\n\t"
  69443. "adcs r4, r4, r12\n\t"
  69444. "adc lr, lr, #0\n\t"
  69445. "stm r0!, {r2, r3, r4}\n\t"
  69446. /* a[11] += t[3] + t[5] + carry */
  69447. /* a[12] += t[4] + t[6] */
  69448. /* a[13] += t[5] + t[7] */
  69449. /* a[14] += t[6] */
  69450. /* a[15] += t[7] */
  69451. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  69452. "adds r0, r0, lr\n\t"
  69453. "adcs r1, r1, #0\n\t"
  69454. "adcs r2, r2, #0\n\t"
  69455. "adcs r3, r3, #0\n\t"
  69456. "adcs r4, r4, #0\n\t"
  69457. "mov lr, #0\n\t"
  69458. "adc lr, lr, #0\n\t"
  69459. "adds r0, r0, r8\n\t"
  69460. "adcs r1, r1, r9\n\t"
  69461. "adcs r2, r2, r10\n\t"
  69462. "adcs r3, r3, r11\n\t"
  69463. "adcs r4, r4, r12\n\t"
  69464. "adc lr, lr, #0\n\t"
  69465. "adds r0, r0, r10\n\t"
  69466. "adcs r1, r1, r11\n\t"
  69467. "adcs r2, r2, r12\n\t"
  69468. "adcs r3, r3, #0\n\t"
  69469. "adcs r4, r4, #0\n\t"
  69470. "adc lr, lr, #0\n\t"
  69471. "str r0, [sp, #44]\n\t"
  69472. "str r1, [sp, #48]\n\t"
  69473. "str r2, [sp, #52]\n\t"
  69474. "str r3, [sp, #56]\n\t"
  69475. /* a[7..15] - t[0..7] */
  69476. "add r0, sp, #28\n\t"
  69477. "ldm r0, {r0, r1, r2, r3}\n\t"
  69478. "subs r0, r0, r5\n\t"
  69479. "sbcs r1, r1, r6\n\t"
  69480. "sbcs r2, r2, r7\n\t"
  69481. "sbcs r3, r3, r8\n\t"
  69482. "add r0, sp, #44\n\t"
  69483. "mov r8, r4\n\t"
  69484. "ldm r0, {r4, r5, r6, r7}\n\t"
  69485. "sbcs r4, r4, r9\n\t"
  69486. "sbcs r5, r5, r10\n\t"
  69487. "sbcs r6, r6, r11\n\t"
  69488. "sbcs r7, r7, r12\n\t"
  69489. "sbcs r8, r8, #0\n\t"
  69490. "sbc lr, lr, #0\n\t"
  69491. /* mask m and sub from result if overflow */
  69492. "rsb lr, lr, #0\n\t"
  69493. "subs r1, r1, lr\n\t"
  69494. "sbcs r2, r2, lr\n\t"
  69495. "sbcs r3, r3, lr\n\t"
  69496. "sbcs r4, r4, #0\n\t"
  69497. "sbcs r5, r5, #0\n\t"
  69498. "sbcs r6, r6, #0\n\t"
  69499. "sbcs r7, r7, lr, lsr #31\n\t"
  69500. "sbc r8, r8, lr\n\t"
  69501. "ldr %[r], [sp, #64]\n\t"
  69502. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  69503. "add sp, sp, #0x44\n\t"
  69504. : [r] "+r" (r), [a] "+r" (a)
  69505. :
  69506. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r12", "r8", "r9", "r10", "lr", "cc"
  69507. );
  69508. (void)m_p;
  69509. (void)mp_p;
  69510. }
  69511. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  69512. /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m)
  69513. *
  69514. * r Result of squaring.
  69515. * a Number to square in Montgomery form.
  69516. * m Modulus (prime).
  69517. * mp Montgomery multiplier.
  69518. */
  69519. 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)
  69520. {
  69521. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  69522. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  69523. __asm__ __volatile__ (
  69524. "sub sp, sp, #0x44\n\t"
  69525. "str %[r], [sp, #64]\n\t"
  69526. "mov %[r], #0\n\t"
  69527. "ldr r12, [%[a]]\n\t"
  69528. /* A[0] * A[1] */
  69529. "ldr lr, [%[a], #4]\n\t"
  69530. "umull r4, r5, r12, lr\n\t"
  69531. /* A[0] * A[3] */
  69532. "ldr lr, [%[a], #12]\n\t"
  69533. "umull r6, r7, r12, lr\n\t"
  69534. /* A[0] * A[5] */
  69535. "ldr lr, [%[a], #20]\n\t"
  69536. "umull r8, r9, r12, lr\n\t"
  69537. /* A[0] * A[7] */
  69538. "ldr lr, [%[a], #28]\n\t"
  69539. "umull r10, r3, r12, lr\n\t"
  69540. /* A[0] * A[2] */
  69541. "ldr lr, [%[a], #8]\n\t"
  69542. "mov r11, #0\n\t"
  69543. "umlal r5, r11, r12, lr\n\t"
  69544. "adds r6, r6, r11\n\t"
  69545. /* A[0] * A[4] */
  69546. "ldr lr, [%[a], #16]\n\t"
  69547. "adcs r7, r7, #0\n\t"
  69548. "adc r11, %[r], #0\n\t"
  69549. "umlal r7, r11, r12, lr\n\t"
  69550. "adds r8, r8, r11\n\t"
  69551. /* A[0] * A[6] */
  69552. "ldr lr, [%[a], #24]\n\t"
  69553. "adcs r9, r9, #0\n\t"
  69554. "adc r11, %[r], #0\n\t"
  69555. "umlal r9, r11, r12, lr\n\t"
  69556. "adds r10, r10, r11\n\t"
  69557. "adcs r3, r3, #0\n\t"
  69558. "str r4, [sp, #4]\n\t"
  69559. "str r5, [sp, #8]\n\t"
  69560. /* A[1] * A[2] */
  69561. "ldr r12, [%[a], #4]\n\t"
  69562. "ldr lr, [%[a], #8]\n\t"
  69563. "mov r11, #0\n\t"
  69564. "umlal r6, r11, r12, lr\n\t"
  69565. "str r6, [sp, #12]\n\t"
  69566. "adds r7, r7, r11\n\t"
  69567. /* A[1] * A[3] */
  69568. "ldr lr, [%[a], #12]\n\t"
  69569. "adc r11, %[r], #0\n\t"
  69570. "umlal r7, r11, r12, lr\n\t"
  69571. "str r7, [sp, #16]\n\t"
  69572. "adds r8, r8, r11\n\t"
  69573. /* A[1] * A[4] */
  69574. "ldr lr, [%[a], #16]\n\t"
  69575. "adc r11, %[r], #0\n\t"
  69576. "umlal r8, r11, r12, lr\n\t"
  69577. "adds r9, r9, r11\n\t"
  69578. /* A[1] * A[5] */
  69579. "ldr lr, [%[a], #20]\n\t"
  69580. "adc r11, %[r], #0\n\t"
  69581. "umlal r9, r11, r12, lr\n\t"
  69582. "adds r10, r10, r11\n\t"
  69583. /* A[1] * A[6] */
  69584. "ldr lr, [%[a], #24]\n\t"
  69585. "adc r11, %[r], #0\n\t"
  69586. "umlal r10, r11, r12, lr\n\t"
  69587. "adds r3, r3, r11\n\t"
  69588. /* A[1] * A[7] */
  69589. "ldr lr, [%[a], #28]\n\t"
  69590. "adc r4, %[r], #0\n\t"
  69591. "umlal r3, r4, r12, lr\n\t"
  69592. /* A[2] * A[3] */
  69593. "ldr r12, [%[a], #8]\n\t"
  69594. "ldr lr, [%[a], #12]\n\t"
  69595. "mov r11, #0\n\t"
  69596. "umlal r8, r11, r12, lr\n\t"
  69597. "str r8, [sp, #20]\n\t"
  69598. "adds r9, r9, r11\n\t"
  69599. /* A[2] * A[4] */
  69600. "ldr lr, [%[a], #16]\n\t"
  69601. "adc r11, %[r], #0\n\t"
  69602. "umlal r9, r11, r12, lr\n\t"
  69603. "str r9, [sp, #24]\n\t"
  69604. "adds r10, r10, r11\n\t"
  69605. /* A[2] * A[5] */
  69606. "ldr lr, [%[a], #20]\n\t"
  69607. "adc r11, %[r], #0\n\t"
  69608. "umlal r10, r11, r12, lr\n\t"
  69609. "adds r3, r3, r11\n\t"
  69610. /* A[2] * A[6] */
  69611. "ldr lr, [%[a], #24]\n\t"
  69612. "adc r11, %[r], #0\n\t"
  69613. "umlal r3, r11, r12, lr\n\t"
  69614. "adds r4, r4, r11\n\t"
  69615. /* A[2] * A[7] */
  69616. "ldr lr, [%[a], #28]\n\t"
  69617. "adc r5, %[r], #0\n\t"
  69618. "umlal r4, r5, r12, lr\n\t"
  69619. /* A[3] * A[4] */
  69620. "ldr r12, [%[a], #12]\n\t"
  69621. "ldr lr, [%[a], #16]\n\t"
  69622. "mov r11, #0\n\t"
  69623. "umlal r10, r11, r12, lr\n\t"
  69624. "str r10, [sp, #28]\n\t"
  69625. "adds r3, r3, r11\n\t"
  69626. /* A[3] * A[5] */
  69627. "ldr lr, [%[a], #20]\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[3] * A[6] */
  69632. "ldr lr, [%[a], #24]\n\t"
  69633. "adc r11, %[r], #0\n\t"
  69634. "umlal r4, r11, r12, lr\n\t"
  69635. "adds r5, r5, r11\n\t"
  69636. /* A[3] * A[7] */
  69637. "ldr lr, [%[a], #28]\n\t"
  69638. "adc r6, %[r], #0\n\t"
  69639. "umlal r5, r6, r12, lr\n\t"
  69640. /* A[4] * A[5] */
  69641. "ldr r12, [%[a], #16]\n\t"
  69642. "ldr lr, [%[a], #20]\n\t"
  69643. "mov r11, #0\n\t"
  69644. "umlal r4, r11, r12, lr\n\t"
  69645. "adds r5, r5, r11\n\t"
  69646. /* A[4] * A[6] */
  69647. "ldr lr, [%[a], #24]\n\t"
  69648. "adc r11, %[r], #0\n\t"
  69649. "umlal r5, r11, r12, lr\n\t"
  69650. "adds r6, r6, r11\n\t"
  69651. /* A[4] * A[7] */
  69652. "ldr lr, [%[a], #28]\n\t"
  69653. "adc r7, %[r], #0\n\t"
  69654. "umlal r6, r7, r12, lr\n\t"
  69655. /* A[5] * A[6] */
  69656. "ldr r12, [%[a], #20]\n\t"
  69657. "ldr lr, [%[a], #24]\n\t"
  69658. "mov r11, #0\n\t"
  69659. "umlal r6, r11, r12, lr\n\t"
  69660. "adds r7, r7, r11\n\t"
  69661. /* A[5] * A[7] */
  69662. "ldr lr, [%[a], #28]\n\t"
  69663. "adc r8, %[r], #0\n\t"
  69664. "umlal r7, r8, r12, lr\n\t"
  69665. /* A[6] * A[7] */
  69666. "ldr r12, [%[a], #24]\n\t"
  69667. "ldr lr, [%[a], #28]\n\t"
  69668. "mov r9, #0\n\t"
  69669. "umlal r8, r9, r12, lr\n\t"
  69670. "add lr, sp, #32\n\t"
  69671. "stm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t"
  69672. "add lr, sp, #4\n\t"
  69673. "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  69674. "adds r4, r4, r4\n\t"
  69675. "adcs r5, r5, r5\n\t"
  69676. "adcs r6, r6, r6\n\t"
  69677. "adcs r7, r7, r7\n\t"
  69678. "adcs r8, r8, r8\n\t"
  69679. "adcs r9, r9, r9\n\t"
  69680. "adcs r10, r10, r10\n\t"
  69681. "stm lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  69682. "ldm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t"
  69683. "adcs r3, r3, r3\n\t"
  69684. "adcs r4, r4, r4\n\t"
  69685. "adcs r5, r5, r5\n\t"
  69686. "adcs r6, r6, r6\n\t"
  69687. "adcs r7, r7, r7\n\t"
  69688. "adcs r8, r8, r8\n\t"
  69689. "adcs r9, r9, r9\n\t"
  69690. "adc r10, %[r], #0\n\t"
  69691. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  69692. "add lr, sp, #4\n\t"
  69693. "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t"
  69694. "mov lr, sp\n\t"
  69695. /* A[0] * A[0] */
  69696. "ldr r12, [%[a]]\n\t"
  69697. "umull r3, r11, r12, r12\n\t"
  69698. "adds r4, r4, r11\n\t"
  69699. /* A[1] * A[1] */
  69700. "ldr r12, [%[a], #4]\n\t"
  69701. "adcs r5, r5, #0\n\t"
  69702. "adc r11, %[r], #0\n\t"
  69703. "umlal r5, r11, r12, r12\n\t"
  69704. "adds r6, r6, r11\n\t"
  69705. /* A[2] * A[2] */
  69706. "ldr r12, [%[a], #8]\n\t"
  69707. "adcs r7, r7, #0\n\t"
  69708. "adc r11, %[r], #0\n\t"
  69709. "umlal r7, r11, r12, r12\n\t"
  69710. "adds r8, r8, r11\n\t"
  69711. /* A[3] * A[3] */
  69712. "ldr r12, [%[a], #12]\n\t"
  69713. "adcs r9, r9, #0\n\t"
  69714. "adc r11, %[r], #0\n\t"
  69715. "umlal r9, r11, r12, r12\n\t"
  69716. "adds r10, r10, r11\n\t"
  69717. "stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  69718. "ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  69719. /* A[4] * A[4] */
  69720. "ldr r12, [%[a], #16]\n\t"
  69721. "adcs r3, r3, #0\n\t"
  69722. "adc r11, %[r], #0\n\t"
  69723. "umlal r3, r11, r12, r12\n\t"
  69724. "adds r4, r4, r11\n\t"
  69725. /* A[5] * A[5] */
  69726. "ldr r12, [%[a], #20]\n\t"
  69727. "adcs r5, r5, #0\n\t"
  69728. "adc r11, %[r], #0\n\t"
  69729. "umlal r5, r11, r12, r12\n\t"
  69730. "adds r6, r6, r11\n\t"
  69731. /* A[6] * A[6] */
  69732. "ldr r12, [%[a], #24]\n\t"
  69733. "adcs r7, r7, #0\n\t"
  69734. "adc r11, %[r], #0\n\t"
  69735. "umlal r7, r11, r12, r12\n\t"
  69736. "adds r8, r8, r11\n\t"
  69737. /* A[7] * A[7] */
  69738. "ldr r12, [%[a], #28]\n\t"
  69739. "adcs r9, r9, #0\n\t"
  69740. "adc r10, r10, #0\n\t"
  69741. "umlal r9, r10, r12, r12\n\t"
  69742. "add lr, sp, #32\n\t"
  69743. "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t"
  69744. /* Start Reduction */
  69745. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  69746. "mov r3, r11\n\t"
  69747. "mov r4, r12\n\t"
  69748. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  69749. /* - a[0] << 224 */
  69750. /* + (a[0]-a[1] * 2) << (6 * 32) */
  69751. "adds r11, r11, r5\n\t"
  69752. "adc r12, r12, r6\n\t"
  69753. "adds r11, r11, r5\n\t"
  69754. "adc r12, r12, r6\n\t"
  69755. /* - a[0] << (7 * 32) */
  69756. "sub r12, r12, r5\n\t"
  69757. /* + a[0]-a[4] << (3 * 32) */
  69758. "mov r0, r8\n\t"
  69759. "mov r1, r9\n\t"
  69760. "mov r2, r10\n\t"
  69761. "adds r8, r8, r5\n\t"
  69762. "adcs r9, r9, r6\n\t"
  69763. "adcs r10, r10, r7\n\t"
  69764. "adcs r11, r11, r0\n\t"
  69765. "adc r12, r12, r1\n\t"
  69766. /* a += mu * m */
  69767. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  69768. /* a[0] = = t[0] */
  69769. /* a[1] = = t[1] */
  69770. /* a[2] = = t[2] */
  69771. /* a[3] += t[0] = t[3] */
  69772. /* a[4] += t[1] = t[4] */
  69773. /* a[5] += t[2] = t[5] */
  69774. /* a[6] += t[0] + t[3] = t[6] */
  69775. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  69776. "adds r0, r0, r5\n\t"
  69777. "adcs r1, r1, r6\n\t"
  69778. "adcs r2, r2, r7\n\t"
  69779. "adcs r3, r3, r8\n\t"
  69780. "adcs r4, r4, r9\n\t"
  69781. "mov lr, #0\n\t"
  69782. "adc lr, lr, #0\n\t"
  69783. "adds r3, r3, r5\n\t"
  69784. "adcs r4, r4, r6\n\t"
  69785. "adc lr, lr, #0\n\t"
  69786. "str r4, [sp, #28]\n\t"
  69787. /* a[8] += t[0] + t[2] + t[5] + carry */
  69788. /* a[9] += t[1] + t[3] + t[6] */
  69789. /* a[10] += t[2] + t[4] + t[7] */
  69790. "add r0, sp, #32\n\t"
  69791. "ldm r0, {r2, r3, r4}\n\t"
  69792. "adds r2, r2, lr\n\t"
  69793. "adcs r3, r3, #0\n\t"
  69794. "adcs r4, r4, #0\n\t"
  69795. "mov lr, #0\n\t"
  69796. "adc lr, lr, #0\n\t"
  69797. "adds r2, r2, r5\n\t"
  69798. "adcs r3, r3, r6\n\t"
  69799. "adcs r4, r4, r7\n\t"
  69800. "adc lr, lr, #0\n\t"
  69801. "adds r2, r2, r7\n\t"
  69802. "adcs r3, r3, r8\n\t"
  69803. "adcs r4, r4, r9\n\t"
  69804. "adc lr, lr, #0\n\t"
  69805. "adds r2, r2, r10\n\t"
  69806. "adcs r3, r3, r11\n\t"
  69807. "adcs r4, r4, r12\n\t"
  69808. "adc lr, lr, #0\n\t"
  69809. "stm r0!, {r2, r3, r4}\n\t"
  69810. /* a[11] += t[3] + t[5] + carry */
  69811. /* a[12] += t[4] + t[6] */
  69812. /* a[13] += t[5] + t[7] */
  69813. /* a[14] += t[6] */
  69814. /* a[15] += t[7] */
  69815. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  69816. "adds r0, r0, lr\n\t"
  69817. "adcs r1, r1, #0\n\t"
  69818. "adcs r2, r2, #0\n\t"
  69819. "adcs r3, r3, #0\n\t"
  69820. "adcs r4, r4, #0\n\t"
  69821. "mov lr, #0\n\t"
  69822. "adc lr, lr, #0\n\t"
  69823. "adds r0, r0, r8\n\t"
  69824. "adcs r1, r1, r9\n\t"
  69825. "adcs r2, r2, r10\n\t"
  69826. "adcs r3, r3, r11\n\t"
  69827. "adcs r4, r4, r12\n\t"
  69828. "adc lr, lr, #0\n\t"
  69829. "adds r0, r0, r10\n\t"
  69830. "adcs r1, r1, r11\n\t"
  69831. "adcs r2, r2, r12\n\t"
  69832. "adcs r3, r3, #0\n\t"
  69833. "adcs r4, r4, #0\n\t"
  69834. "adc lr, lr, #0\n\t"
  69835. "str r0, [sp, #44]\n\t"
  69836. "str r1, [sp, #48]\n\t"
  69837. "str r2, [sp, #52]\n\t"
  69838. "str r3, [sp, #56]\n\t"
  69839. /* a[7..15] - t[0..7] */
  69840. "add r0, sp, #28\n\t"
  69841. "ldm r0, {r0, r1, r2, r3}\n\t"
  69842. "subs r0, r0, r5\n\t"
  69843. "sbcs r1, r1, r6\n\t"
  69844. "sbcs r2, r2, r7\n\t"
  69845. "sbcs r3, r3, r8\n\t"
  69846. "add r0, sp, #44\n\t"
  69847. "mov r8, r4\n\t"
  69848. "ldm r0, {r4, r5, r6, r7}\n\t"
  69849. "sbcs r4, r4, r9\n\t"
  69850. "sbcs r5, r5, r10\n\t"
  69851. "sbcs r6, r6, r11\n\t"
  69852. "sbcs r7, r7, r12\n\t"
  69853. "sbcs r8, r8, #0\n\t"
  69854. "sbc lr, lr, #0\n\t"
  69855. /* mask m and sub from result if overflow */
  69856. "rsb lr, lr, #0\n\t"
  69857. "subs r1, r1, lr\n\t"
  69858. "sbcs r2, r2, lr\n\t"
  69859. "sbcs r3, r3, lr\n\t"
  69860. "sbcs r4, r4, #0\n\t"
  69861. "sbcs r5, r5, #0\n\t"
  69862. "sbcs r6, r6, #0\n\t"
  69863. "sbcs r7, r7, lr, lsr #31\n\t"
  69864. "sbc r8, r8, lr\n\t"
  69865. "ldr %[r], [sp, #64]\n\t"
  69866. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  69867. "add sp, sp, #0x44\n\t"
  69868. : [r] "+r" (r), [a] "+r" (a)
  69869. :
  69870. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  69871. );
  69872. (void)m_p;
  69873. (void)mp_p;
  69874. }
  69875. #else
  69876. /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m)
  69877. *
  69878. * r Result of squaring.
  69879. * a Number to square in Montgomery form.
  69880. * m Modulus (prime).
  69881. * mp Montgomery multiplier.
  69882. */
  69883. 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)
  69884. {
  69885. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  69886. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  69887. __asm__ __volatile__ (
  69888. "sub sp, sp, #0x44\n\t"
  69889. "str %[r], [sp, #64]\n\t"
  69890. "ldm %[a], {%[r], %[a], r2, r3, r4, r5, r6, r7}\n\t"
  69891. "umull r9, r10, %[r], %[r]\n\t"
  69892. "umull r11, r12, %[r], %[a]\n\t"
  69893. "adds r11, r11, r11\n\t"
  69894. "mov lr, #0\n\t"
  69895. "umaal r10, r11, lr, lr\n\t"
  69896. "stm sp, {r9, r10}\n\t"
  69897. "mov r8, lr\n\t"
  69898. "umaal r8, r12, %[r], r2\n\t"
  69899. "adcs r8, r8, r8\n\t"
  69900. "umaal r8, r11, %[a], %[a]\n\t"
  69901. "umull r9, r10, %[r], r3\n\t"
  69902. "umaal r9, r12, %[a], r2\n\t"
  69903. "adcs r9, r9, r9\n\t"
  69904. "umaal r9, r11, lr, lr\n\t"
  69905. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  69906. "str r8, [sp, #8]\n\t"
  69907. "str r9, [sp, #12]\n\t"
  69908. #else
  69909. "strd r8, r9, [sp, #8]\n\t"
  69910. #endif
  69911. "mov r9, lr\n\t"
  69912. "umaal r9, r10, %[r], r4\n\t"
  69913. "umaal r9, r12, %[a], r3\n\t"
  69914. "adcs r9, r9, r9\n\t"
  69915. "umaal r9, r11, r2, r2\n\t"
  69916. "str r9, [sp, #16]\n\t"
  69917. "umull r9, r8, %[r], r5\n\t"
  69918. "umaal r9, r12, %[a], r4\n\t"
  69919. "umaal r9, r10, r2, r3\n\t"
  69920. "adcs r9, r9, r9\n\t"
  69921. "umaal r9, r11, lr, lr\n\t"
  69922. "str r9, [sp, #20]\n\t"
  69923. "mov r9, lr\n\t"
  69924. "umaal r9, r8, %[r], r6\n\t"
  69925. "umaal r9, r12, %[a], r5\n\t"
  69926. "umaal r9, r10, r2, r4\n\t"
  69927. "adcs r9, r9, r9\n\t"
  69928. "umaal r9, r11, r3, r3\n\t"
  69929. "str r9, [sp, #24]\n\t"
  69930. "umull %[r], r9, %[r], r7\n\t"
  69931. "umaal %[r], r8, %[a], r6\n\t"
  69932. "umaal %[r], r12, r2, r5\n\t"
  69933. "umaal %[r], r10, r3, r4\n\t"
  69934. "adcs %[r], %[r], %[r]\n\t"
  69935. "umaal %[r], r11, lr, lr\n\t"
  69936. /* R[7] = r0 */
  69937. "umaal r9, r8, %[a], r7\n\t"
  69938. "umaal r9, r10, r2, r6\n\t"
  69939. "umaal r12, r9, r3, r5\n\t"
  69940. "adcs r12, r12, r12\n\t"
  69941. "umaal r12, r11, r4, r4\n\t"
  69942. /* R[8] = r12 */
  69943. "umaal r9, r8, r2, r7\n\t"
  69944. "umaal r10, r9, r3, r6\n\t"
  69945. "mov r2, lr\n\t"
  69946. "umaal r10, r2, r4, r5\n\t"
  69947. "adcs r10, r10, r10\n\t"
  69948. "umaal r11, r10, lr, lr\n\t"
  69949. /* R[9] = r11 */
  69950. "umaal r2, r8, r3, r7\n\t"
  69951. "umaal r2, r9, r4, r6\n\t"
  69952. "adcs r3, r2, r2\n\t"
  69953. "umaal r10, r3, r5, r5\n\t"
  69954. /* R[10] = r10 */
  69955. "mov %[a], lr\n\t"
  69956. "umaal %[a], r8, r4, r7\n\t"
  69957. "umaal %[a], r9, r5, r6\n\t"
  69958. "adcs r4, %[a], %[a]\n\t"
  69959. "umaal r3, r4, lr, lr\n\t"
  69960. /* R[11] = r3 */
  69961. "umaal r8, r9, r5, r7\n\t"
  69962. "adcs r8, r8, r8\n\t"
  69963. "umaal r4, r8, r6, r6\n\t"
  69964. /* R[12] = r4 */
  69965. "mov r5, lr\n\t"
  69966. "umaal r5, r9, r6, r7\n\t"
  69967. "adcs r5, r5, r5\n\t"
  69968. "umaal r8, r5, lr, lr\n\t"
  69969. /* R[13] = r8 */
  69970. "adcs r9, r9, r9\n\t"
  69971. "umaal r9, r5, r7, r7\n\t"
  69972. "adcs r7, r5, lr\n\t"
  69973. /* R[14] = r9 */
  69974. /* R[15] = r7 */
  69975. "mov lr, sp\n\t"
  69976. "add lr, lr, #28\n\t"
  69977. "stm lr!, {%[r], r12}\n\t"
  69978. "stm lr!, {r11}\n\t"
  69979. "stm lr!, {r10}\n\t"
  69980. "stm lr!, {r3, r4, r8, r9}\n\t"
  69981. "stm lr!, {r7}\n\t"
  69982. /* Start Reduction */
  69983. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  69984. "mov r3, r11\n\t"
  69985. "mov r4, r12\n\t"
  69986. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  69987. /* - a[0] << 224 */
  69988. /* + (a[0]-a[1] * 2) << (6 * 32) */
  69989. "adds r11, r11, r5\n\t"
  69990. "adc r12, r12, r6\n\t"
  69991. "adds r11, r11, r5\n\t"
  69992. "adc r12, r12, r6\n\t"
  69993. /* - a[0] << (7 * 32) */
  69994. "sub r12, r12, r5\n\t"
  69995. /* + a[0]-a[4] << (3 * 32) */
  69996. "mov r0, r8\n\t"
  69997. "mov r1, r9\n\t"
  69998. "mov r2, r10\n\t"
  69999. "adds r8, r8, r5\n\t"
  70000. "adcs r9, r9, r6\n\t"
  70001. "adcs r10, r10, r7\n\t"
  70002. "adcs r11, r11, r0\n\t"
  70003. "adc r12, r12, r1\n\t"
  70004. /* a += mu * m */
  70005. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  70006. /* a[0] = = t[0] */
  70007. /* a[1] = = t[1] */
  70008. /* a[2] = = t[2] */
  70009. /* a[3] += t[0] = t[3] */
  70010. /* a[4] += t[1] = t[4] */
  70011. /* a[5] += t[2] = t[5] */
  70012. /* a[6] += t[0] + t[3] = t[6] */
  70013. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  70014. "adds r0, r0, r5\n\t"
  70015. "adcs r1, r1, r6\n\t"
  70016. "adcs r2, r2, r7\n\t"
  70017. "adcs r3, r3, r8\n\t"
  70018. "adcs r4, r4, r9\n\t"
  70019. "mov lr, #0\n\t"
  70020. "adc lr, lr, #0\n\t"
  70021. "adds r3, r3, r5\n\t"
  70022. "adcs r4, r4, r6\n\t"
  70023. "adc lr, lr, #0\n\t"
  70024. "str r4, [sp, #28]\n\t"
  70025. /* a[8] += t[0] + t[2] + t[5] + carry */
  70026. /* a[9] += t[1] + t[3] + t[6] */
  70027. /* a[10] += t[2] + t[4] + t[7] */
  70028. "add r0, sp, #32\n\t"
  70029. "ldm r0, {r2, r3, r4}\n\t"
  70030. "adds r2, r2, lr\n\t"
  70031. "adcs r3, r3, #0\n\t"
  70032. "adcs r4, r4, #0\n\t"
  70033. "mov lr, #0\n\t"
  70034. "adc lr, lr, #0\n\t"
  70035. "adds r2, r2, r5\n\t"
  70036. "adcs r3, r3, r6\n\t"
  70037. "adcs r4, r4, r7\n\t"
  70038. "adc lr, lr, #0\n\t"
  70039. "adds r2, r2, r7\n\t"
  70040. "adcs r3, r3, r8\n\t"
  70041. "adcs r4, r4, r9\n\t"
  70042. "adc lr, lr, #0\n\t"
  70043. "adds r2, r2, r10\n\t"
  70044. "adcs r3, r3, r11\n\t"
  70045. "adcs r4, r4, r12\n\t"
  70046. "adc lr, lr, #0\n\t"
  70047. "stm r0!, {r2, r3, r4}\n\t"
  70048. /* a[11] += t[3] + t[5] + carry */
  70049. /* a[12] += t[4] + t[6] */
  70050. /* a[13] += t[5] + t[7] */
  70051. /* a[14] += t[6] */
  70052. /* a[15] += t[7] */
  70053. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  70054. "adds r0, r0, lr\n\t"
  70055. "adcs r1, r1, #0\n\t"
  70056. "adcs r2, r2, #0\n\t"
  70057. "adcs r3, r3, #0\n\t"
  70058. "adcs r4, r4, #0\n\t"
  70059. "mov lr, #0\n\t"
  70060. "adc lr, lr, #0\n\t"
  70061. "adds r0, r0, r8\n\t"
  70062. "adcs r1, r1, r9\n\t"
  70063. "adcs r2, r2, r10\n\t"
  70064. "adcs r3, r3, r11\n\t"
  70065. "adcs r4, r4, r12\n\t"
  70066. "adc lr, lr, #0\n\t"
  70067. "adds r0, r0, r10\n\t"
  70068. "adcs r1, r1, r11\n\t"
  70069. "adcs r2, r2, r12\n\t"
  70070. "adcs r3, r3, #0\n\t"
  70071. "adcs r4, r4, #0\n\t"
  70072. "adc lr, lr, #0\n\t"
  70073. "str r0, [sp, #44]\n\t"
  70074. "str r1, [sp, #48]\n\t"
  70075. "str r2, [sp, #52]\n\t"
  70076. "str r3, [sp, #56]\n\t"
  70077. /* a[7..15] - t[0..7] */
  70078. "add r0, sp, #28\n\t"
  70079. "ldm r0, {r0, r1, r2, r3}\n\t"
  70080. "subs r0, r0, r5\n\t"
  70081. "sbcs r1, r1, r6\n\t"
  70082. "sbcs r2, r2, r7\n\t"
  70083. "sbcs r3, r3, r8\n\t"
  70084. "add r0, sp, #44\n\t"
  70085. "mov r8, r4\n\t"
  70086. "ldm r0, {r4, r5, r6, r7}\n\t"
  70087. "sbcs r4, r4, r9\n\t"
  70088. "sbcs r5, r5, r10\n\t"
  70089. "sbcs r6, r6, r11\n\t"
  70090. "sbcs r7, r7, r12\n\t"
  70091. "sbcs r8, r8, #0\n\t"
  70092. "sbc lr, lr, #0\n\t"
  70093. /* mask m and sub from result if overflow */
  70094. "rsb lr, lr, #0\n\t"
  70095. "subs r1, r1, lr\n\t"
  70096. "sbcs r2, r2, lr\n\t"
  70097. "sbcs r3, r3, lr\n\t"
  70098. "sbcs r4, r4, #0\n\t"
  70099. "sbcs r5, r5, #0\n\t"
  70100. "sbcs r6, r6, #0\n\t"
  70101. "sbcs r7, r7, lr, lsr #31\n\t"
  70102. "sbc r8, r8, lr\n\t"
  70103. "ldr %[r], [sp, #64]\n\t"
  70104. "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  70105. "add sp, sp, #0x44\n\t"
  70106. : [r] "+r" (r), [a] "+r" (a)
  70107. :
  70108. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  70109. );
  70110. (void)m_p;
  70111. (void)mp_p;
  70112. }
  70113. #endif
  70114. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  70115. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  70116. *
  70117. * r Result of squaring.
  70118. * a Number to square in Montgomery form.
  70119. * n Number of times to square.
  70120. * m Modulus (prime).
  70121. * mp Montgomery multiplier.
  70122. */
  70123. SP_NOINLINE static void sp_256_mont_sqr_n_8(sp_digit* r,
  70124. const sp_digit* a, int n, const sp_digit* m, sp_digit mp)
  70125. {
  70126. sp_256_mont_sqr_8(r, a, m, mp);
  70127. for (; n > 1; n--) {
  70128. sp_256_mont_sqr_8(r, r, m, mp);
  70129. }
  70130. }
  70131. #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
  70132. #ifdef WOLFSSL_SP_SMALL
  70133. /* Mod-2 for the P256 curve. */
  70134. static const uint32_t p256_mod_minus_2[8] = {
  70135. 0xfffffffdU,0xffffffffU,0xffffffffU,0x00000000U,0x00000000U,0x00000000U,
  70136. 0x00000001U,0xffffffffU
  70137. };
  70138. #endif /* !WOLFSSL_SP_SMALL */
  70139. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  70140. * P256 curve. (r = 1 / a mod m)
  70141. *
  70142. * r Inverse result.
  70143. * a Number to invert.
  70144. * td Temporary data.
  70145. */
  70146. static void sp_256_mont_inv_8(sp_digit* r, const sp_digit* a, sp_digit* td)
  70147. {
  70148. #ifdef WOLFSSL_SP_SMALL
  70149. sp_digit* t = td;
  70150. int i;
  70151. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  70152. for (i=254; i>=0; i--) {
  70153. sp_256_mont_sqr_8(t, t, p256_mod, p256_mp_mod);
  70154. if (p256_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  70155. sp_256_mont_mul_8(t, t, a, p256_mod, p256_mp_mod);
  70156. }
  70157. XMEMCPY(r, t, sizeof(sp_digit) * 8);
  70158. #else
  70159. sp_digit* t1 = td;
  70160. sp_digit* t2 = td + 2 * 8;
  70161. sp_digit* t3 = td + 4 * 8;
  70162. /* 0x2 */
  70163. sp_256_mont_sqr_8(t1, a, p256_mod, p256_mp_mod);
  70164. /* 0x3 */
  70165. sp_256_mont_mul_8(t2, t1, a, p256_mod, p256_mp_mod);
  70166. /* 0xc */
  70167. sp_256_mont_sqr_n_8(t1, t2, 2, p256_mod, p256_mp_mod);
  70168. /* 0xd */
  70169. sp_256_mont_mul_8(t3, t1, a, p256_mod, p256_mp_mod);
  70170. /* 0xf */
  70171. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  70172. /* 0xf0 */
  70173. sp_256_mont_sqr_n_8(t1, t2, 4, p256_mod, p256_mp_mod);
  70174. /* 0xfd */
  70175. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  70176. /* 0xff */
  70177. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  70178. /* 0xff00 */
  70179. sp_256_mont_sqr_n_8(t1, t2, 8, p256_mod, p256_mp_mod);
  70180. /* 0xfffd */
  70181. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  70182. /* 0xffff */
  70183. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  70184. /* 0xffff0000 */
  70185. sp_256_mont_sqr_n_8(t1, t2, 16, p256_mod, p256_mp_mod);
  70186. /* 0xfffffffd */
  70187. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  70188. /* 0xffffffff */
  70189. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  70190. /* 0xffffffff00000000 */
  70191. sp_256_mont_sqr_n_8(t1, t2, 32, p256_mod, p256_mp_mod);
  70192. /* 0xffffffffffffffff */
  70193. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  70194. /* 0xffffffff00000001 */
  70195. sp_256_mont_mul_8(r, t1, a, p256_mod, p256_mp_mod);
  70196. /* 0xffffffff000000010000000000000000000000000000000000000000 */
  70197. sp_256_mont_sqr_n_8(r, r, 160, p256_mod, p256_mp_mod);
  70198. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff */
  70199. sp_256_mont_mul_8(r, r, t2, p256_mod, p256_mp_mod);
  70200. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff00000000 */
  70201. sp_256_mont_sqr_n_8(r, r, 32, p256_mod, p256_mp_mod);
  70202. /* 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffd */
  70203. sp_256_mont_mul_8(r, r, t3, p256_mod, p256_mp_mod);
  70204. #endif /* WOLFSSL_SP_SMALL */
  70205. }
  70206. /* Compare a with b in constant time.
  70207. *
  70208. * a A single precision integer.
  70209. * b A single precision integer.
  70210. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  70211. * respectively.
  70212. */
  70213. static sp_int32 sp_256_cmp_8(const sp_digit* a_p, const sp_digit* b_p)
  70214. {
  70215. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  70216. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  70217. __asm__ __volatile__ (
  70218. "mov r2, #-1\n\t"
  70219. "mov r6, #1\n\t"
  70220. "mov r5, #0\n\t"
  70221. "mov r3, #-1\n\t"
  70222. #ifdef WOLFSSL_SP_SMALL
  70223. "mov r4, #28\n\t"
  70224. "\n"
  70225. "L_sp_256_cmp_8_words_%=: \n\t"
  70226. "ldr r12, [%[a], r4]\n\t"
  70227. "ldr lr, [%[b], r4]\n\t"
  70228. "and r12, r12, r3\n\t"
  70229. "and lr, lr, r3\n\t"
  70230. "subs r12, r12, lr\n\t"
  70231. "it hi\n\t"
  70232. "movhi r2, r6\n\t"
  70233. "it lo\n\t"
  70234. "movlo r2, r3\n\t"
  70235. "it ne\n\t"
  70236. "movne r3, r5\n\t"
  70237. "subs r4, r4, #4\n\t"
  70238. "bcs L_sp_256_cmp_8_words_%=\n\t"
  70239. "eor r2, r2, r3\n\t"
  70240. #else
  70241. "ldr r12, [%[a], #28]\n\t"
  70242. "ldr lr, [%[b], #28]\n\t"
  70243. "and r12, r12, r3\n\t"
  70244. "and lr, lr, r3\n\t"
  70245. "subs r12, r12, lr\n\t"
  70246. "it hi\n\t"
  70247. "movhi r2, r6\n\t"
  70248. "it lo\n\t"
  70249. "movlo r2, r3\n\t"
  70250. "it ne\n\t"
  70251. "movne r3, r5\n\t"
  70252. "ldr r12, [%[a], #24]\n\t"
  70253. "ldr lr, [%[b], #24]\n\t"
  70254. "and r12, r12, r3\n\t"
  70255. "and lr, lr, r3\n\t"
  70256. "subs r12, r12, lr\n\t"
  70257. "it hi\n\t"
  70258. "movhi r2, r6\n\t"
  70259. "it lo\n\t"
  70260. "movlo r2, r3\n\t"
  70261. "it ne\n\t"
  70262. "movne r3, r5\n\t"
  70263. "ldr r12, [%[a], #20]\n\t"
  70264. "ldr lr, [%[b], #20]\n\t"
  70265. "and r12, r12, r3\n\t"
  70266. "and lr, lr, r3\n\t"
  70267. "subs r12, r12, lr\n\t"
  70268. "it hi\n\t"
  70269. "movhi r2, r6\n\t"
  70270. "it lo\n\t"
  70271. "movlo r2, r3\n\t"
  70272. "it ne\n\t"
  70273. "movne r3, r5\n\t"
  70274. "ldr r12, [%[a], #16]\n\t"
  70275. "ldr lr, [%[b], #16]\n\t"
  70276. "and r12, r12, r3\n\t"
  70277. "and lr, lr, r3\n\t"
  70278. "subs r12, r12, lr\n\t"
  70279. "it hi\n\t"
  70280. "movhi r2, r6\n\t"
  70281. "it lo\n\t"
  70282. "movlo r2, r3\n\t"
  70283. "it ne\n\t"
  70284. "movne r3, r5\n\t"
  70285. "ldr r12, [%[a], #12]\n\t"
  70286. "ldr lr, [%[b], #12]\n\t"
  70287. "and r12, r12, r3\n\t"
  70288. "and lr, lr, r3\n\t"
  70289. "subs r12, r12, lr\n\t"
  70290. "it hi\n\t"
  70291. "movhi r2, r6\n\t"
  70292. "it lo\n\t"
  70293. "movlo r2, r3\n\t"
  70294. "it ne\n\t"
  70295. "movne r3, r5\n\t"
  70296. "ldr r12, [%[a], #8]\n\t"
  70297. "ldr lr, [%[b], #8]\n\t"
  70298. "and r12, r12, r3\n\t"
  70299. "and lr, lr, r3\n\t"
  70300. "subs r12, r12, lr\n\t"
  70301. "it hi\n\t"
  70302. "movhi r2, r6\n\t"
  70303. "it lo\n\t"
  70304. "movlo r2, r3\n\t"
  70305. "it ne\n\t"
  70306. "movne r3, r5\n\t"
  70307. "ldr r12, [%[a], #4]\n\t"
  70308. "ldr lr, [%[b], #4]\n\t"
  70309. "and r12, r12, r3\n\t"
  70310. "and lr, lr, r3\n\t"
  70311. "subs r12, r12, lr\n\t"
  70312. "it hi\n\t"
  70313. "movhi r2, r6\n\t"
  70314. "it lo\n\t"
  70315. "movlo r2, r3\n\t"
  70316. "it ne\n\t"
  70317. "movne r3, r5\n\t"
  70318. "ldr r12, [%[a]]\n\t"
  70319. "ldr lr, [%[b]]\n\t"
  70320. "and r12, r12, r3\n\t"
  70321. "and lr, lr, r3\n\t"
  70322. "subs r12, r12, lr\n\t"
  70323. "it hi\n\t"
  70324. "movhi r2, r6\n\t"
  70325. "it lo\n\t"
  70326. "movlo r2, r3\n\t"
  70327. "it ne\n\t"
  70328. "movne r3, r5\n\t"
  70329. "eor r2, r2, r3\n\t"
  70330. #endif /*WOLFSSL_SP_SMALL */
  70331. "mov %[a], r2\n\t"
  70332. : [a] "+r" (a), [b] "+r" (b)
  70333. :
  70334. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  70335. );
  70336. return (uint32_t)(size_t)a;
  70337. }
  70338. /* Normalize the values in each word to 32.
  70339. *
  70340. * a Array of sp_digit to normalize.
  70341. */
  70342. #define sp_256_norm_8(a)
  70343. #ifdef WOLFSSL_SP_SMALL
  70344. /* Conditionally subtract b from a using the mask m.
  70345. * m is -1 to subtract and 0 when not copying.
  70346. *
  70347. * r A single precision number representing condition subtract result.
  70348. * a A single precision number to subtract from.
  70349. * b A single precision number to subtract.
  70350. * m Mask value to apply.
  70351. */
  70352. 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)
  70353. {
  70354. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  70355. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  70356. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  70357. register sp_digit m asm ("r3") = (sp_digit)m_p;
  70358. __asm__ __volatile__ (
  70359. "mov r6, #0\n\t"
  70360. "mov r12, #0\n\t"
  70361. "mov lr, #0\n\t"
  70362. "\n"
  70363. "L_sp_256_cond_sub_8_words_%=: \n\t"
  70364. "subs r12, r6, r12\n\t"
  70365. "ldr r4, [%[a], lr]\n\t"
  70366. "ldr r5, [%[b], lr]\n\t"
  70367. "and r5, r5, %[m]\n\t"
  70368. "sbcs r4, r4, r5\n\t"
  70369. "sbc r12, r6, r6\n\t"
  70370. "str r4, [%[r], lr]\n\t"
  70371. "add lr, lr, #4\n\t"
  70372. "cmp lr, #32\n\t"
  70373. "blt L_sp_256_cond_sub_8_words_%=\n\t"
  70374. "mov %[r], r12\n\t"
  70375. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  70376. :
  70377. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  70378. );
  70379. return (uint32_t)(size_t)r;
  70380. }
  70381. #else
  70382. /* Conditionally subtract b from a using the mask m.
  70383. * m is -1 to subtract and 0 when not copying.
  70384. *
  70385. * r A single precision number representing condition subtract result.
  70386. * a A single precision number to subtract from.
  70387. * b A single precision number to subtract.
  70388. * m Mask value to apply.
  70389. */
  70390. 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)
  70391. {
  70392. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  70393. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  70394. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  70395. register sp_digit m asm ("r3") = (sp_digit)m_p;
  70396. __asm__ __volatile__ (
  70397. "mov lr, #0\n\t"
  70398. "ldm %[a]!, {r4, r5}\n\t"
  70399. "ldm %[b]!, {r6, r7}\n\t"
  70400. "and r6, r6, %[m]\n\t"
  70401. "and r7, r7, %[m]\n\t"
  70402. "subs r4, r4, r6\n\t"
  70403. "sbcs r5, r5, r7\n\t"
  70404. "stm %[r]!, {r4, r5}\n\t"
  70405. "ldm %[a]!, {r4, r5}\n\t"
  70406. "ldm %[b]!, {r6, r7}\n\t"
  70407. "and r6, r6, %[m]\n\t"
  70408. "and r7, r7, %[m]\n\t"
  70409. "sbcs r4, r4, r6\n\t"
  70410. "sbcs r5, r5, r7\n\t"
  70411. "stm %[r]!, {r4, r5}\n\t"
  70412. "ldm %[a]!, {r4, r5}\n\t"
  70413. "ldm %[b]!, {r6, r7}\n\t"
  70414. "and r6, r6, %[m]\n\t"
  70415. "and r7, r7, %[m]\n\t"
  70416. "sbcs r4, r4, r6\n\t"
  70417. "sbcs r5, r5, r7\n\t"
  70418. "stm %[r]!, {r4, r5}\n\t"
  70419. "ldm %[a]!, {r4, r5}\n\t"
  70420. "ldm %[b]!, {r6, r7}\n\t"
  70421. "and r6, r6, %[m]\n\t"
  70422. "and r7, r7, %[m]\n\t"
  70423. "sbcs r4, r4, r6\n\t"
  70424. "sbcs r5, r5, r7\n\t"
  70425. "stm %[r]!, {r4, r5}\n\t"
  70426. "sbc %[r], lr, lr\n\t"
  70427. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  70428. :
  70429. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  70430. );
  70431. return (uint32_t)(size_t)r;
  70432. }
  70433. #endif /* WOLFSSL_SP_SMALL */
  70434. #ifndef WOLFSSL_SP_SMALL
  70435. #define sp_256_mont_reduce_order_8 sp_256_mont_reduce_8
  70436. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  70437. /* Reduce the number back to 256 bits using Montgomery reduction.
  70438. *
  70439. * a A single precision number to reduce in place.
  70440. * m The single precision number representing the modulus.
  70441. * mp The digit representing the negative inverse of m mod 2^n.
  70442. */
  70443. static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  70444. {
  70445. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  70446. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  70447. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  70448. __asm__ __volatile__ (
  70449. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  70450. "ldr r11, [%[m]]\n\t"
  70451. #endif
  70452. /* i = 0 */
  70453. "mov r9, #0\n\t"
  70454. "mov r3, #0\n\t"
  70455. "ldr r12, [%[a]]\n\t"
  70456. "ldr lr, [%[a], #4]\n\t"
  70457. "\n"
  70458. "L_sp_256_mont_reduce_8_word_%=: \n\t"
  70459. /* mu = a[i] * mp */
  70460. "mul r8, %[mp], r12\n\t"
  70461. /* a[i+0] += m[0] * mu */
  70462. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  70463. "ldr r11, [%[m]]\n\t"
  70464. #endif
  70465. "lsr r7, r11, #16\n\t"
  70466. "lsr r6, r8, #16\n\t"
  70467. "mul r5, r6, r7\n\t"
  70468. "lsl r7, r11, #16\n\t"
  70469. "lsr r7, r7, #16\n\t"
  70470. "mul r6, r7, r6\n\t"
  70471. "lsr r7, r6, #16\n\t"
  70472. "lsl r6, r6, #16\n\t"
  70473. "adds r12, r12, r6\n\t"
  70474. "adc r5, r5, r7\n\t"
  70475. "lsl r6, r8, #16\n\t"
  70476. "lsl r7, r11, #16\n\t"
  70477. "lsr r6, r6, #16\n\t"
  70478. "lsr r7, r7, #16\n\t"
  70479. "mul r7, r6, r7\n\t"
  70480. "adds r12, r12, r7\n\t"
  70481. "adc r5, r5, #0\n\t"
  70482. "lsr r7, r11, #16\n\t"
  70483. "mul r6, r7, r6\n\t"
  70484. "lsr r7, r6, #16\n\t"
  70485. "lsl r6, r6, #16\n\t"
  70486. "adds r12, r12, r6\n\t"
  70487. "adc r5, r5, r7\n\t"
  70488. /* a[i+1] += m[1] * mu */
  70489. "ldr r7, [%[m], #4]\n\t"
  70490. "lsr r10, r7, #16\n\t"
  70491. "lsr r6, r8, #16\n\t"
  70492. "mul r4, r6, r10\n\t"
  70493. "lsl r10, r7, #16\n\t"
  70494. "lsr r10, r10, #16\n\t"
  70495. "mul r6, r10, r6\n\t"
  70496. "lsr r10, r6, #16\n\t"
  70497. "lsl r6, r6, #16\n\t"
  70498. "adds lr, lr, r6\n\t"
  70499. "adc r4, r4, r10\n\t"
  70500. "lsl r6, r8, #16\n\t"
  70501. "lsl r10, r7, #16\n\t"
  70502. "lsr r6, r6, #16\n\t"
  70503. "lsr r10, r10, #16\n\t"
  70504. "mul r10, r6, r10\n\t"
  70505. "adds lr, lr, r10\n\t"
  70506. "adc r4, r4, #0\n\t"
  70507. "lsr r10, r7, #16\n\t"
  70508. "mul r6, r10, r6\n\t"
  70509. "lsr r10, r6, #16\n\t"
  70510. "lsl r6, r6, #16\n\t"
  70511. "adds lr, lr, r6\n\t"
  70512. "adc r4, r4, r10\n\t"
  70513. "mov r12, lr\n\t"
  70514. "adds r12, r12, r5\n\t"
  70515. "adc r4, r4, #0\n\t"
  70516. /* a[i+2] += m[2] * mu */
  70517. "ldr r7, [%[m], #8]\n\t"
  70518. "ldr lr, [%[a], #8]\n\t"
  70519. "lsr r10, r7, #16\n\t"
  70520. "lsr r6, r8, #16\n\t"
  70521. "mul r5, r6, r10\n\t"
  70522. "lsl r10, r7, #16\n\t"
  70523. "lsr r10, r10, #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 r5, r5, r10\n\t"
  70529. "lsl r6, r8, #16\n\t"
  70530. "lsl r10, r7, #16\n\t"
  70531. "lsr r6, r6, #16\n\t"
  70532. "lsr r10, r10, #16\n\t"
  70533. "mul r10, r6, r10\n\t"
  70534. "adds lr, lr, r10\n\t"
  70535. "adc r5, r5, #0\n\t"
  70536. "lsr r10, r7, #16\n\t"
  70537. "mul r6, r10, r6\n\t"
  70538. "lsr r10, r6, #16\n\t"
  70539. "lsl r6, r6, #16\n\t"
  70540. "adds lr, lr, r6\n\t"
  70541. "adc r5, r5, r10\n\t"
  70542. "adds lr, lr, r4\n\t"
  70543. "adc r5, r5, #0\n\t"
  70544. /* a[i+3] += m[3] * mu */
  70545. "ldr r7, [%[m], #12]\n\t"
  70546. "ldr r10, [%[a], #12]\n\t"
  70547. "lsr r11, r7, #16\n\t"
  70548. "lsr r6, r8, #16\n\t"
  70549. "mul r4, r6, r11\n\t"
  70550. "lsl r11, r7, #16\n\t"
  70551. "lsr r11, r11, #16\n\t"
  70552. "mul r6, r11, r6\n\t"
  70553. "lsr r11, r6, #16\n\t"
  70554. "lsl r6, r6, #16\n\t"
  70555. "adds r10, r10, r6\n\t"
  70556. "adc r4, r4, r11\n\t"
  70557. "lsl r6, r8, #16\n\t"
  70558. "lsl r11, r7, #16\n\t"
  70559. "lsr r6, r6, #16\n\t"
  70560. "lsr r11, r11, #16\n\t"
  70561. "mul r11, r6, r11\n\t"
  70562. "adds r10, r10, r11\n\t"
  70563. "adc r4, r4, #0\n\t"
  70564. "lsr r11, r7, #16\n\t"
  70565. "mul r6, r11, r6\n\t"
  70566. "lsr r11, r6, #16\n\t"
  70567. "lsl r6, r6, #16\n\t"
  70568. "adds r10, r10, r6\n\t"
  70569. "adc r4, r4, r11\n\t"
  70570. "adds r10, r10, r5\n\t"
  70571. "str r10, [%[a], #12]\n\t"
  70572. "adc r4, r4, #0\n\t"
  70573. /* a[i+4] += m[4] * mu */
  70574. "ldr r7, [%[m], #16]\n\t"
  70575. "ldr r10, [%[a], #16]\n\t"
  70576. "lsr r11, r7, #16\n\t"
  70577. "lsr r6, r8, #16\n\t"
  70578. "mul r5, r6, r11\n\t"
  70579. "lsl r11, r7, #16\n\t"
  70580. "lsr r11, r11, #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 r5, r5, r11\n\t"
  70586. "lsl r6, r8, #16\n\t"
  70587. "lsl r11, r7, #16\n\t"
  70588. "lsr r6, r6, #16\n\t"
  70589. "lsr r11, r11, #16\n\t"
  70590. "mul r11, r6, r11\n\t"
  70591. "adds r10, r10, r11\n\t"
  70592. "adc r5, r5, #0\n\t"
  70593. "lsr r11, r7, #16\n\t"
  70594. "mul r6, r11, r6\n\t"
  70595. "lsr r11, r6, #16\n\t"
  70596. "lsl r6, r6, #16\n\t"
  70597. "adds r10, r10, r6\n\t"
  70598. "adc r5, r5, r11\n\t"
  70599. "adds r10, r10, r4\n\t"
  70600. "str r10, [%[a], #16]\n\t"
  70601. "adc r5, r5, #0\n\t"
  70602. /* a[i+5] += m[5] * mu */
  70603. "ldr r7, [%[m], #20]\n\t"
  70604. "ldr r10, [%[a], #20]\n\t"
  70605. "lsr r11, r7, #16\n\t"
  70606. "lsr r6, r8, #16\n\t"
  70607. "mul r4, r6, r11\n\t"
  70608. "lsl r11, r7, #16\n\t"
  70609. "lsr r11, r11, #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 r4, r4, r11\n\t"
  70615. "lsl r6, r8, #16\n\t"
  70616. "lsl r11, r7, #16\n\t"
  70617. "lsr r6, r6, #16\n\t"
  70618. "lsr r11, r11, #16\n\t"
  70619. "mul r11, r6, r11\n\t"
  70620. "adds r10, r10, r11\n\t"
  70621. "adc r4, r4, #0\n\t"
  70622. "lsr r11, r7, #16\n\t"
  70623. "mul r6, r11, r6\n\t"
  70624. "lsr r11, r6, #16\n\t"
  70625. "lsl r6, r6, #16\n\t"
  70626. "adds r10, r10, r6\n\t"
  70627. "adc r4, r4, r11\n\t"
  70628. "adds r10, r10, r5\n\t"
  70629. "str r10, [%[a], #20]\n\t"
  70630. "adc r4, r4, #0\n\t"
  70631. /* a[i+6] += m[6] * mu */
  70632. "ldr r7, [%[m], #24]\n\t"
  70633. "ldr r10, [%[a], #24]\n\t"
  70634. "lsr r11, r7, #16\n\t"
  70635. "lsr r6, r8, #16\n\t"
  70636. "mul r5, r6, r11\n\t"
  70637. "lsl r11, r7, #16\n\t"
  70638. "lsr r11, r11, #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 r5, r5, r11\n\t"
  70644. "lsl r6, r8, #16\n\t"
  70645. "lsl r11, r7, #16\n\t"
  70646. "lsr r6, r6, #16\n\t"
  70647. "lsr r11, r11, #16\n\t"
  70648. "mul r11, r6, r11\n\t"
  70649. "adds r10, r10, r11\n\t"
  70650. "adc r5, r5, #0\n\t"
  70651. "lsr r11, r7, #16\n\t"
  70652. "mul r6, r11, r6\n\t"
  70653. "lsr r11, r6, #16\n\t"
  70654. "lsl r6, r6, #16\n\t"
  70655. "adds r10, r10, r6\n\t"
  70656. "adc r5, r5, r11\n\t"
  70657. "adds r10, r10, r4\n\t"
  70658. "str r10, [%[a], #24]\n\t"
  70659. "adc r5, r5, #0\n\t"
  70660. /* a[i+7] += m[7] * mu */
  70661. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  70662. "ldr r11, [%[m], #28]\n\t"
  70663. #else
  70664. "ldr r7, [%[m], #28]\n\t"
  70665. #endif
  70666. "ldr r10, [%[a], #28]\n\t"
  70667. "lsl r6, r8, #16\n\t"
  70668. "lsl r7, r11, #16\n\t"
  70669. "lsr r6, r6, #16\n\t"
  70670. "lsr r7, r7, #16\n\t"
  70671. "mul r7, r6, r7\n\t"
  70672. "adds r5, r5, r7\n\t"
  70673. "adcs r4, r3, #0\n\t"
  70674. "mov r3, #0\n\t"
  70675. "adc r3, r3, r3\n\t"
  70676. "lsr r7, r11, #16\n\t"
  70677. "mul r6, r7, r6\n\t"
  70678. "lsr r7, r6, #16\n\t"
  70679. "lsl r6, r6, #16\n\t"
  70680. "adds r5, r5, r6\n\t"
  70681. "adcs r4, r4, r7\n\t"
  70682. "adc r3, r3, #0\n\t"
  70683. "mov r6, r8\n\t"
  70684. "lsr r7, r11, #16\n\t"
  70685. "lsr r6, r6, #16\n\t"
  70686. "mul r7, r6, r7\n\t"
  70687. "adds r4, r4, r7\n\t"
  70688. "lsl r7, r11, #16\n\t"
  70689. "adc r3, r3, #0\n\t"
  70690. "lsr r7, r7, #16\n\t"
  70691. "mul r6, r7, r6\n\t"
  70692. "lsr r7, r6, #16\n\t"
  70693. "lsl r6, r6, #16\n\t"
  70694. "adds r5, r5, r6\n\t"
  70695. "adcs r4, r4, r7\n\t"
  70696. "adc r3, r3, #0\n\t"
  70697. "adds r10, r10, r5\n\t"
  70698. "str r10, [%[a], #28]\n\t"
  70699. "ldr r10, [%[a], #32]\n\t"
  70700. "adcs r10, r10, r4\n\t"
  70701. "str r10, [%[a], #32]\n\t"
  70702. "adc r3, r3, #0\n\t"
  70703. /* i += 1 */
  70704. "add r9, r9, #4\n\t"
  70705. "add %[a], %[a], #4\n\t"
  70706. "cmp r9, #32\n\t"
  70707. "blt L_sp_256_mont_reduce_8_word_%=\n\t"
  70708. /* Loop Done */
  70709. "str r12, [%[a]]\n\t"
  70710. "str lr, [%[a], #4]\n\t"
  70711. "mov %[mp], r3\n\t"
  70712. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  70713. :
  70714. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  70715. );
  70716. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  70717. }
  70718. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  70719. /* Reduce the number back to 256 bits using Montgomery reduction.
  70720. *
  70721. * a A single precision number to reduce in place.
  70722. * m The single precision number representing the modulus.
  70723. * mp The digit representing the negative inverse of m mod 2^n.
  70724. */
  70725. static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  70726. {
  70727. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  70728. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  70729. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  70730. __asm__ __volatile__ (
  70731. "ldr r11, [%[m]]\n\t"
  70732. /* i = 0 */
  70733. "mov r9, #0\n\t"
  70734. "mov r3, #0\n\t"
  70735. "ldr r12, [%[a]]\n\t"
  70736. "ldr lr, [%[a], #4]\n\t"
  70737. "\n"
  70738. "L_sp_256_mont_reduce_8_word_%=: \n\t"
  70739. /* mu = a[i] * mp */
  70740. "mul r8, %[mp], r12\n\t"
  70741. /* a[i+0] += m[0] * mu */
  70742. "mov r5, #0\n\t"
  70743. "umlal r12, r5, r8, r11\n\t"
  70744. /* a[i+1] += m[1] * mu */
  70745. "ldr r7, [%[m], #4]\n\t"
  70746. "mov r4, #0\n\t"
  70747. "umlal lr, r4, r8, r7\n\t"
  70748. "mov r12, lr\n\t"
  70749. "adds r12, r12, r5\n\t"
  70750. "adc r4, r4, #0\n\t"
  70751. /* a[i+2] += m[2] * mu */
  70752. "ldr r7, [%[m], #8]\n\t"
  70753. "ldr lr, [%[a], #8]\n\t"
  70754. "mov r5, #0\n\t"
  70755. "umlal lr, r5, r8, r7\n\t"
  70756. "adds lr, lr, r4\n\t"
  70757. "adc r5, r5, #0\n\t"
  70758. /* a[i+3] += m[3] * mu */
  70759. "ldr r7, [%[m], #12]\n\t"
  70760. "ldr r10, [%[a], #12]\n\t"
  70761. "mov r4, #0\n\t"
  70762. "umlal r10, r4, r8, r7\n\t"
  70763. "adds r10, r10, r5\n\t"
  70764. "str r10, [%[a], #12]\n\t"
  70765. "adc r4, r4, #0\n\t"
  70766. /* a[i+4] += m[4] * mu */
  70767. "ldr r7, [%[m], #16]\n\t"
  70768. "ldr r10, [%[a], #16]\n\t"
  70769. "mov r5, #0\n\t"
  70770. "umlal r10, r5, r8, r7\n\t"
  70771. "adds r10, r10, r4\n\t"
  70772. "str r10, [%[a], #16]\n\t"
  70773. "adc r5, r5, #0\n\t"
  70774. /* a[i+5] += m[5] * mu */
  70775. "ldr r7, [%[m], #20]\n\t"
  70776. "ldr r10, [%[a], #20]\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], #20]\n\t"
  70781. "adc r4, r4, #0\n\t"
  70782. /* a[i+6] += m[6] * mu */
  70783. "ldr r7, [%[m], #24]\n\t"
  70784. "ldr r10, [%[a], #24]\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], #24]\n\t"
  70789. "adc r5, r5, #0\n\t"
  70790. /* a[i+7] += m[7] * mu */
  70791. "ldr r7, [%[m], #28]\n\t"
  70792. "ldr r10, [%[a], #28]\n\t"
  70793. "umull r6, r7, r8, r7\n\t"
  70794. "adds r5, r5, r6\n\t"
  70795. "adcs r4, r7, r3\n\t"
  70796. "mov r3, #0\n\t"
  70797. "adc r3, r3, r3\n\t"
  70798. "adds r10, r10, r5\n\t"
  70799. "str r10, [%[a], #28]\n\t"
  70800. "ldr r10, [%[a], #32]\n\t"
  70801. "adcs r10, r10, r4\n\t"
  70802. "str r10, [%[a], #32]\n\t"
  70803. "adc r3, r3, #0\n\t"
  70804. /* i += 1 */
  70805. "add r9, r9, #4\n\t"
  70806. "add %[a], %[a], #4\n\t"
  70807. "cmp r9, #32\n\t"
  70808. "blt L_sp_256_mont_reduce_8_word_%=\n\t"
  70809. /* Loop Done */
  70810. "str r12, [%[a]]\n\t"
  70811. "str lr, [%[a], #4]\n\t"
  70812. "mov %[mp], r3\n\t"
  70813. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  70814. :
  70815. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  70816. );
  70817. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  70818. }
  70819. #else
  70820. /* Reduce the number back to 256 bits using Montgomery reduction.
  70821. *
  70822. * a A single precision number to reduce in place.
  70823. * m The single precision number representing the modulus.
  70824. * mp The digit representing the negative inverse of m mod 2^n.
  70825. */
  70826. static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  70827. {
  70828. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  70829. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  70830. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  70831. __asm__ __volatile__ (
  70832. /* i = 0 */
  70833. "mov r12, #0\n\t"
  70834. "mov lr, #0\n\t"
  70835. "ldr r4, [%[a]]\n\t"
  70836. "ldr r5, [%[a], #4]\n\t"
  70837. "ldr r6, [%[a], #8]\n\t"
  70838. "ldr r7, [%[a], #12]\n\t"
  70839. "ldr r8, [%[a], #16]\n\t"
  70840. "\n"
  70841. "L_sp_256_mont_reduce_8_word_%=: \n\t"
  70842. /* mu = a[i] * mp */
  70843. "mul r11, %[mp], r4\n\t"
  70844. /* a[i+0] += m[0] * mu */
  70845. "ldr r10, [%[m]]\n\t"
  70846. "mov r3, #0\n\t"
  70847. "umaal r4, r3, r11, r10\n\t"
  70848. /* a[i+1] += m[1] * mu */
  70849. "ldr r10, [%[m], #4]\n\t"
  70850. "mov r4, r5\n\t"
  70851. "umaal r4, r3, r11, r10\n\t"
  70852. /* a[i+2] += m[2] * mu */
  70853. "ldr r10, [%[m], #8]\n\t"
  70854. "mov r5, r6\n\t"
  70855. "umaal r5, r3, r11, r10\n\t"
  70856. /* a[i+3] += m[3] * mu */
  70857. "ldr r10, [%[m], #12]\n\t"
  70858. "mov r6, r7\n\t"
  70859. "umaal r6, r3, r11, r10\n\t"
  70860. /* a[i+4] += m[4] * mu */
  70861. "ldr r10, [%[m], #16]\n\t"
  70862. "mov r7, r8\n\t"
  70863. "umaal r7, r3, r11, r10\n\t"
  70864. /* a[i+5] += m[5] * mu */
  70865. "ldr r10, [%[m], #20]\n\t"
  70866. "ldr r8, [%[a], #20]\n\t"
  70867. "umaal r8, r3, r11, r10\n\t"
  70868. /* a[i+6] += m[6] * mu */
  70869. "ldr r10, [%[m], #24]\n\t"
  70870. "ldr r9, [%[a], #24]\n\t"
  70871. "umaal r9, r3, r11, r10\n\t"
  70872. "str r9, [%[a], #24]\n\t"
  70873. /* a[i+7] += m[7] * mu */
  70874. "ldr r10, [%[m], #28]\n\t"
  70875. "ldr r9, [%[a], #28]\n\t"
  70876. "umaal r9, r3, r11, r10\n\t"
  70877. "ldr r11, [%[a], #32]\n\t"
  70878. "mov r10, #0\n\t"
  70879. "umaal r3, r11, r10, r10\n\t"
  70880. "str r9, [%[a], #28]\n\t"
  70881. "adds r3, r3, lr\n\t"
  70882. "adc lr, r11, #0\n\t"
  70883. "str r3, [%[a], #32]\n\t"
  70884. /* i += 1 */
  70885. "add r12, r12, #4\n\t"
  70886. "add %[a], %[a], #4\n\t"
  70887. "cmp r12, #32\n\t"
  70888. "blt L_sp_256_mont_reduce_8_word_%=\n\t"
  70889. /* Loop Done */
  70890. "str r4, [%[a]]\n\t"
  70891. "str r5, [%[a], #4]\n\t"
  70892. "str r6, [%[a], #8]\n\t"
  70893. "str r7, [%[a], #12]\n\t"
  70894. "str r8, [%[a], #16]\n\t"
  70895. "mov %[mp], lr\n\t"
  70896. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  70897. :
  70898. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  70899. );
  70900. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  70901. }
  70902. #endif
  70903. #else
  70904. /* Reduce the number back to 256 bits using Montgomery reduction.
  70905. *
  70906. * a A single precision number to reduce in place.
  70907. * m The single precision number representing the modulus.
  70908. * mp The digit representing the negative inverse of m mod 2^n.
  70909. */
  70910. static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  70911. {
  70912. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  70913. __asm__ __volatile__ (
  70914. "sub sp, sp, #0x44\n\t"
  70915. "str %[a], [sp, #64]\n\t"
  70916. "mov lr, sp\n\t"
  70917. "ldm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  70918. "stm lr!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  70919. "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  70920. "stm lr, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  70921. /* Start Reduction */
  70922. "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  70923. "mov r3, r11\n\t"
  70924. "mov r4, r12\n\t"
  70925. /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */
  70926. /* - a[0] << 224 */
  70927. /* + (a[0]-a[1] * 2) << (6 * 32) */
  70928. "adds r11, r11, r5\n\t"
  70929. "adc r12, r12, r6\n\t"
  70930. "adds r11, r11, r5\n\t"
  70931. "adc r12, r12, r6\n\t"
  70932. /* - a[0] << (7 * 32) */
  70933. "sub r12, r12, r5\n\t"
  70934. /* + a[0]-a[4] << (3 * 32) */
  70935. "mov r0, r8\n\t"
  70936. "mov r1, r9\n\t"
  70937. "mov r2, r10\n\t"
  70938. "adds r8, r8, r5\n\t"
  70939. "adcs r9, r9, r6\n\t"
  70940. "adcs r10, r10, r7\n\t"
  70941. "adcs r11, r11, r0\n\t"
  70942. "adc r12, r12, r1\n\t"
  70943. /* a += mu * m */
  70944. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  70945. /* a[0] = = t[0] */
  70946. /* a[1] = = t[1] */
  70947. /* a[2] = = t[2] */
  70948. /* a[3] += t[0] = t[3] */
  70949. /* a[4] += t[1] = t[4] */
  70950. /* a[5] += t[2] = t[5] */
  70951. /* a[6] += t[0] + t[3] = t[6] */
  70952. /* a[7] += t[1] + t[4] = t[7] + t[0] */
  70953. "adds r0, r0, r5\n\t"
  70954. "adcs r1, r1, r6\n\t"
  70955. "adcs r2, r2, r7\n\t"
  70956. "adcs r3, r3, r8\n\t"
  70957. "adcs r4, r4, r9\n\t"
  70958. "mov lr, #0\n\t"
  70959. "adc lr, lr, #0\n\t"
  70960. "adds r3, r3, r5\n\t"
  70961. "adcs r4, r4, r6\n\t"
  70962. "adc lr, lr, #0\n\t"
  70963. "str r4, [sp, #28]\n\t"
  70964. /* a[8] += t[0] + t[2] + t[5] + carry */
  70965. /* a[9] += t[1] + t[3] + t[6] */
  70966. /* a[10] += t[2] + t[4] + t[7] */
  70967. "add r0, sp, #32\n\t"
  70968. "ldm r0, {r2, r3, r4}\n\t"
  70969. "adds r2, r2, lr\n\t"
  70970. "adcs r3, r3, #0\n\t"
  70971. "adcs r4, r4, #0\n\t"
  70972. "mov lr, #0\n\t"
  70973. "adc lr, lr, #0\n\t"
  70974. "adds r2, r2, r5\n\t"
  70975. "adcs r3, r3, r6\n\t"
  70976. "adcs r4, r4, r7\n\t"
  70977. "adc lr, lr, #0\n\t"
  70978. "adds r2, r2, r7\n\t"
  70979. "adcs r3, r3, r8\n\t"
  70980. "adcs r4, r4, r9\n\t"
  70981. "adc lr, lr, #0\n\t"
  70982. "adds r2, r2, r10\n\t"
  70983. "adcs r3, r3, r11\n\t"
  70984. "adcs r4, r4, r12\n\t"
  70985. "adc lr, lr, #0\n\t"
  70986. "stm r0!, {r2, r3, r4}\n\t"
  70987. /* a[11] += t[3] + t[5] + carry */
  70988. /* a[12] += t[4] + t[6] */
  70989. /* a[13] += t[5] + t[7] */
  70990. /* a[14] += t[6] */
  70991. /* a[15] += t[7] */
  70992. "ldm r0, {r0, r1, r2, r3, r4}\n\t"
  70993. "adds r0, r0, lr\n\t"
  70994. "adcs r1, r1, #0\n\t"
  70995. "adcs r2, r2, #0\n\t"
  70996. "adcs r3, r3, #0\n\t"
  70997. "adcs r4, r4, #0\n\t"
  70998. "mov lr, #0\n\t"
  70999. "adc lr, lr, #0\n\t"
  71000. "adds r0, r0, r8\n\t"
  71001. "adcs r1, r1, r9\n\t"
  71002. "adcs r2, r2, r10\n\t"
  71003. "adcs r3, r3, r11\n\t"
  71004. "adcs r4, r4, r12\n\t"
  71005. "adc lr, lr, #0\n\t"
  71006. "adds r0, r0, r10\n\t"
  71007. "adcs r1, r1, r11\n\t"
  71008. "adcs r2, r2, r12\n\t"
  71009. "adcs r3, r3, #0\n\t"
  71010. "adcs r4, r4, #0\n\t"
  71011. "adc lr, lr, #0\n\t"
  71012. "str r0, [sp, #44]\n\t"
  71013. "str r1, [sp, #48]\n\t"
  71014. "str r2, [sp, #52]\n\t"
  71015. "str r3, [sp, #56]\n\t"
  71016. /* a[7..15] - t[0..7] */
  71017. "add r0, sp, #28\n\t"
  71018. "ldm r0, {r0, r1, r2, r3}\n\t"
  71019. "subs r0, r0, r5\n\t"
  71020. "sbcs r1, r1, r6\n\t"
  71021. "sbcs r2, r2, r7\n\t"
  71022. "sbcs r3, r3, r8\n\t"
  71023. "add r0, sp, #44\n\t"
  71024. "mov r8, r4\n\t"
  71025. "ldm r0, {r4, r5, r6, r7}\n\t"
  71026. "sbcs r4, r4, r9\n\t"
  71027. "sbcs r5, r5, r10\n\t"
  71028. "sbcs r6, r6, r11\n\t"
  71029. "sbcs r7, r7, r12\n\t"
  71030. "sbcs r8, r8, #0\n\t"
  71031. "sbc lr, lr, #0\n\t"
  71032. /* mask m and sub from result if overflow */
  71033. "rsb lr, lr, #0\n\t"
  71034. "subs r1, r1, lr\n\t"
  71035. "sbcs r2, r2, lr\n\t"
  71036. "sbcs r3, r3, lr\n\t"
  71037. "sbcs r4, r4, #0\n\t"
  71038. "sbcs r5, r5, #0\n\t"
  71039. "sbcs r6, r6, #0\n\t"
  71040. "sbcs r7, r7, lr, lsr #31\n\t"
  71041. "sbc r8, r8, lr\n\t"
  71042. "ldr %[a], [sp, #64]\n\t"
  71043. "stm %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  71044. "add sp, sp, #0x44\n\t"
  71045. : [a] "+r" (a)
  71046. :
  71047. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  71048. );
  71049. (void)m_p;
  71050. (void)mp_p;
  71051. }
  71052. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  71053. /* Reduce the number back to 256 bits using Montgomery reduction.
  71054. *
  71055. * a A single precision number to reduce in place.
  71056. * m The single precision number representing the modulus.
  71057. * mp The digit representing the negative inverse of m mod 2^n.
  71058. */
  71059. static SP_NOINLINE void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  71060. {
  71061. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  71062. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  71063. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  71064. __asm__ __volatile__ (
  71065. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  71066. "ldr r11, [%[m]]\n\t"
  71067. #endif
  71068. /* i = 0 */
  71069. "mov r9, #0\n\t"
  71070. "mov r3, #0\n\t"
  71071. "ldr r12, [%[a]]\n\t"
  71072. "ldr lr, [%[a], #4]\n\t"
  71073. "\n"
  71074. "L_sp_256_mont_reduce_order_8_word_%=: \n\t"
  71075. /* mu = a[i] * mp */
  71076. "mul r8, %[mp], r12\n\t"
  71077. /* a[i+0] += m[0] * mu */
  71078. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  71079. "ldr r11, [%[m]]\n\t"
  71080. #endif
  71081. "lsr r7, r11, #16\n\t"
  71082. "lsr r6, r8, #16\n\t"
  71083. "mul r5, r6, r7\n\t"
  71084. "lsl r7, r11, #16\n\t"
  71085. "lsr r7, r7, #16\n\t"
  71086. "mul r6, r7, r6\n\t"
  71087. "lsr r7, r6, #16\n\t"
  71088. "lsl r6, r6, #16\n\t"
  71089. "adds r12, r12, r6\n\t"
  71090. "adc r5, r5, r7\n\t"
  71091. "lsl r6, r8, #16\n\t"
  71092. "lsl r7, r11, #16\n\t"
  71093. "lsr r6, r6, #16\n\t"
  71094. "lsr r7, r7, #16\n\t"
  71095. "mul r7, r6, r7\n\t"
  71096. "adds r12, r12, r7\n\t"
  71097. "adc r5, r5, #0\n\t"
  71098. "lsr r7, r11, #16\n\t"
  71099. "mul r6, r7, r6\n\t"
  71100. "lsr r7, r6, #16\n\t"
  71101. "lsl r6, r6, #16\n\t"
  71102. "adds r12, r12, r6\n\t"
  71103. "adc r5, r5, r7\n\t"
  71104. /* a[i+1] += m[1] * mu */
  71105. "ldr r7, [%[m], #4]\n\t"
  71106. "lsr r10, r7, #16\n\t"
  71107. "lsr r6, r8, #16\n\t"
  71108. "mul r4, r6, r10\n\t"
  71109. "lsl r10, r7, #16\n\t"
  71110. "lsr r10, r10, #16\n\t"
  71111. "mul r6, r10, r6\n\t"
  71112. "lsr r10, r6, #16\n\t"
  71113. "lsl r6, r6, #16\n\t"
  71114. "adds lr, lr, r6\n\t"
  71115. "adc r4, r4, r10\n\t"
  71116. "lsl r6, r8, #16\n\t"
  71117. "lsl r10, r7, #16\n\t"
  71118. "lsr r6, r6, #16\n\t"
  71119. "lsr r10, r10, #16\n\t"
  71120. "mul r10, r6, r10\n\t"
  71121. "adds lr, lr, r10\n\t"
  71122. "adc r4, r4, #0\n\t"
  71123. "lsr r10, r7, #16\n\t"
  71124. "mul r6, r10, r6\n\t"
  71125. "lsr r10, r6, #16\n\t"
  71126. "lsl r6, r6, #16\n\t"
  71127. "adds lr, lr, r6\n\t"
  71128. "adc r4, r4, r10\n\t"
  71129. "mov r12, lr\n\t"
  71130. "adds r12, r12, r5\n\t"
  71131. "adc r4, r4, #0\n\t"
  71132. /* a[i+2] += m[2] * mu */
  71133. "ldr r7, [%[m], #8]\n\t"
  71134. "ldr lr, [%[a], #8]\n\t"
  71135. "lsr r10, r7, #16\n\t"
  71136. "lsr r6, r8, #16\n\t"
  71137. "mul r5, r6, r10\n\t"
  71138. "lsl r10, r7, #16\n\t"
  71139. "lsr r10, r10, #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 r5, r5, r10\n\t"
  71145. "lsl r6, r8, #16\n\t"
  71146. "lsl r10, r7, #16\n\t"
  71147. "lsr r6, r6, #16\n\t"
  71148. "lsr r10, r10, #16\n\t"
  71149. "mul r10, r6, r10\n\t"
  71150. "adds lr, lr, r10\n\t"
  71151. "adc r5, r5, #0\n\t"
  71152. "lsr r10, r7, #16\n\t"
  71153. "mul r6, r10, r6\n\t"
  71154. "lsr r10, r6, #16\n\t"
  71155. "lsl r6, r6, #16\n\t"
  71156. "adds lr, lr, r6\n\t"
  71157. "adc r5, r5, r10\n\t"
  71158. "adds lr, lr, r4\n\t"
  71159. "adc r5, r5, #0\n\t"
  71160. /* a[i+3] += m[3] * mu */
  71161. "ldr r7, [%[m], #12]\n\t"
  71162. "ldr r10, [%[a], #12]\n\t"
  71163. "lsr r11, r7, #16\n\t"
  71164. "lsr r6, r8, #16\n\t"
  71165. "mul r4, r6, r11\n\t"
  71166. "lsl r11, r7, #16\n\t"
  71167. "lsr r11, r11, #16\n\t"
  71168. "mul r6, r11, r6\n\t"
  71169. "lsr r11, r6, #16\n\t"
  71170. "lsl r6, r6, #16\n\t"
  71171. "adds r10, r10, r6\n\t"
  71172. "adc r4, r4, r11\n\t"
  71173. "lsl r6, r8, #16\n\t"
  71174. "lsl r11, r7, #16\n\t"
  71175. "lsr r6, r6, #16\n\t"
  71176. "lsr r11, r11, #16\n\t"
  71177. "mul r11, r6, r11\n\t"
  71178. "adds r10, r10, r11\n\t"
  71179. "adc r4, r4, #0\n\t"
  71180. "lsr r11, r7, #16\n\t"
  71181. "mul r6, r11, r6\n\t"
  71182. "lsr r11, r6, #16\n\t"
  71183. "lsl r6, r6, #16\n\t"
  71184. "adds r10, r10, r6\n\t"
  71185. "adc r4, r4, r11\n\t"
  71186. "adds r10, r10, r5\n\t"
  71187. "str r10, [%[a], #12]\n\t"
  71188. "adc r4, r4, #0\n\t"
  71189. /* a[i+4] += m[4] * mu */
  71190. "ldr r7, [%[m], #16]\n\t"
  71191. "ldr r10, [%[a], #16]\n\t"
  71192. "lsr r11, r7, #16\n\t"
  71193. "lsr r6, r8, #16\n\t"
  71194. "mul r5, r6, r11\n\t"
  71195. "lsl r11, r7, #16\n\t"
  71196. "lsr r11, r11, #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 r5, r5, r11\n\t"
  71202. "lsl r6, r8, #16\n\t"
  71203. "lsl r11, r7, #16\n\t"
  71204. "lsr r6, r6, #16\n\t"
  71205. "lsr r11, r11, #16\n\t"
  71206. "mul r11, r6, r11\n\t"
  71207. "adds r10, r10, r11\n\t"
  71208. "adc r5, r5, #0\n\t"
  71209. "lsr r11, r7, #16\n\t"
  71210. "mul r6, r11, r6\n\t"
  71211. "lsr r11, r6, #16\n\t"
  71212. "lsl r6, r6, #16\n\t"
  71213. "adds r10, r10, r6\n\t"
  71214. "adc r5, r5, r11\n\t"
  71215. "adds r10, r10, r4\n\t"
  71216. "str r10, [%[a], #16]\n\t"
  71217. "adc r5, r5, #0\n\t"
  71218. /* a[i+5] += m[5] * mu */
  71219. "ldr r7, [%[m], #20]\n\t"
  71220. "ldr r10, [%[a], #20]\n\t"
  71221. "lsr r11, r7, #16\n\t"
  71222. "lsr r6, r8, #16\n\t"
  71223. "mul r4, r6, r11\n\t"
  71224. "lsl r11, r7, #16\n\t"
  71225. "lsr r11, r11, #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 r4, r4, r11\n\t"
  71231. "lsl r6, r8, #16\n\t"
  71232. "lsl r11, r7, #16\n\t"
  71233. "lsr r6, r6, #16\n\t"
  71234. "lsr r11, r11, #16\n\t"
  71235. "mul r11, r6, r11\n\t"
  71236. "adds r10, r10, r11\n\t"
  71237. "adc r4, r4, #0\n\t"
  71238. "lsr r11, r7, #16\n\t"
  71239. "mul r6, r11, r6\n\t"
  71240. "lsr r11, r6, #16\n\t"
  71241. "lsl r6, r6, #16\n\t"
  71242. "adds r10, r10, r6\n\t"
  71243. "adc r4, r4, r11\n\t"
  71244. "adds r10, r10, r5\n\t"
  71245. "str r10, [%[a], #20]\n\t"
  71246. "adc r4, r4, #0\n\t"
  71247. /* a[i+6] += m[6] * mu */
  71248. "ldr r7, [%[m], #24]\n\t"
  71249. "ldr r10, [%[a], #24]\n\t"
  71250. "lsr r11, r7, #16\n\t"
  71251. "lsr r6, r8, #16\n\t"
  71252. "mul r5, r6, r11\n\t"
  71253. "lsl r11, r7, #16\n\t"
  71254. "lsr r11, r11, #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 r5, r5, r11\n\t"
  71260. "lsl r6, r8, #16\n\t"
  71261. "lsl r11, r7, #16\n\t"
  71262. "lsr r6, r6, #16\n\t"
  71263. "lsr r11, r11, #16\n\t"
  71264. "mul r11, r6, r11\n\t"
  71265. "adds r10, r10, r11\n\t"
  71266. "adc r5, r5, #0\n\t"
  71267. "lsr r11, r7, #16\n\t"
  71268. "mul r6, r11, r6\n\t"
  71269. "lsr r11, r6, #16\n\t"
  71270. "lsl r6, r6, #16\n\t"
  71271. "adds r10, r10, r6\n\t"
  71272. "adc r5, r5, r11\n\t"
  71273. "adds r10, r10, r4\n\t"
  71274. "str r10, [%[a], #24]\n\t"
  71275. "adc r5, r5, #0\n\t"
  71276. /* a[i+7] += m[7] * mu */
  71277. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  71278. "ldr r11, [%[m], #28]\n\t"
  71279. #else
  71280. "ldr r7, [%[m], #28]\n\t"
  71281. #endif
  71282. "ldr r10, [%[a], #28]\n\t"
  71283. "lsl r6, r8, #16\n\t"
  71284. "lsl r7, r11, #16\n\t"
  71285. "lsr r6, r6, #16\n\t"
  71286. "lsr r7, r7, #16\n\t"
  71287. "mul r7, r6, r7\n\t"
  71288. "adds r5, r5, r7\n\t"
  71289. "adcs r4, r3, #0\n\t"
  71290. "mov r3, #0\n\t"
  71291. "adc r3, r3, r3\n\t"
  71292. "lsr r7, r11, #16\n\t"
  71293. "mul r6, r7, r6\n\t"
  71294. "lsr r7, r6, #16\n\t"
  71295. "lsl r6, r6, #16\n\t"
  71296. "adds r5, r5, r6\n\t"
  71297. "adcs r4, r4, r7\n\t"
  71298. "adc r3, r3, #0\n\t"
  71299. "mov r6, r8\n\t"
  71300. "lsr r7, r11, #16\n\t"
  71301. "lsr r6, r6, #16\n\t"
  71302. "mul r7, r6, r7\n\t"
  71303. "adds r4, r4, r7\n\t"
  71304. "lsl r7, r11, #16\n\t"
  71305. "adc r3, r3, #0\n\t"
  71306. "lsr r7, r7, #16\n\t"
  71307. "mul r6, r7, r6\n\t"
  71308. "lsr r7, r6, #16\n\t"
  71309. "lsl r6, r6, #16\n\t"
  71310. "adds r5, r5, r6\n\t"
  71311. "adcs r4, r4, r7\n\t"
  71312. "adc r3, r3, #0\n\t"
  71313. "adds r10, r10, r5\n\t"
  71314. "str r10, [%[a], #28]\n\t"
  71315. "ldr r10, [%[a], #32]\n\t"
  71316. "adcs r10, r10, r4\n\t"
  71317. "str r10, [%[a], #32]\n\t"
  71318. "adc r3, r3, #0\n\t"
  71319. /* i += 1 */
  71320. "add r9, r9, #4\n\t"
  71321. "add %[a], %[a], #4\n\t"
  71322. "cmp r9, #32\n\t"
  71323. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  71324. /* Loop Done */
  71325. "str r12, [%[a]]\n\t"
  71326. "str lr, [%[a], #4]\n\t"
  71327. "mov %[mp], r3\n\t"
  71328. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  71329. :
  71330. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  71331. );
  71332. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  71333. }
  71334. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  71335. /* Reduce the number back to 256 bits using Montgomery reduction.
  71336. *
  71337. * a A single precision number to reduce in place.
  71338. * m The single precision number representing the modulus.
  71339. * mp The digit representing the negative inverse of m mod 2^n.
  71340. */
  71341. static SP_NOINLINE void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  71342. {
  71343. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  71344. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  71345. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  71346. __asm__ __volatile__ (
  71347. "ldr r11, [%[m]]\n\t"
  71348. /* i = 0 */
  71349. "mov r9, #0\n\t"
  71350. "mov r3, #0\n\t"
  71351. "ldr r12, [%[a]]\n\t"
  71352. "ldr lr, [%[a], #4]\n\t"
  71353. "\n"
  71354. "L_sp_256_mont_reduce_order_8_word_%=: \n\t"
  71355. /* mu = a[i] * mp */
  71356. "mul r8, %[mp], r12\n\t"
  71357. /* a[i+0] += m[0] * mu */
  71358. "mov r5, #0\n\t"
  71359. "umlal r12, r5, r8, r11\n\t"
  71360. /* a[i+1] += m[1] * mu */
  71361. "ldr r7, [%[m], #4]\n\t"
  71362. "mov r4, #0\n\t"
  71363. "umlal lr, r4, r8, r7\n\t"
  71364. "mov r12, lr\n\t"
  71365. "adds r12, r12, r5\n\t"
  71366. "adc r4, r4, #0\n\t"
  71367. /* a[i+2] += m[2] * mu */
  71368. "ldr r7, [%[m], #8]\n\t"
  71369. "ldr lr, [%[a], #8]\n\t"
  71370. "mov r5, #0\n\t"
  71371. "umlal lr, r5, r8, r7\n\t"
  71372. "adds lr, lr, r4\n\t"
  71373. "adc r5, r5, #0\n\t"
  71374. /* a[i+3] += m[3] * mu */
  71375. "ldr r7, [%[m], #12]\n\t"
  71376. "ldr r10, [%[a], #12]\n\t"
  71377. "mov r4, #0\n\t"
  71378. "umlal r10, r4, r8, r7\n\t"
  71379. "adds r10, r10, r5\n\t"
  71380. "str r10, [%[a], #12]\n\t"
  71381. "adc r4, r4, #0\n\t"
  71382. /* a[i+4] += m[4] * mu */
  71383. "ldr r7, [%[m], #16]\n\t"
  71384. "ldr r10, [%[a], #16]\n\t"
  71385. "mov r5, #0\n\t"
  71386. "umlal r10, r5, r8, r7\n\t"
  71387. "adds r10, r10, r4\n\t"
  71388. "str r10, [%[a], #16]\n\t"
  71389. "adc r5, r5, #0\n\t"
  71390. /* a[i+5] += m[5] * mu */
  71391. "ldr r7, [%[m], #20]\n\t"
  71392. "ldr r10, [%[a], #20]\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], #20]\n\t"
  71397. "adc r4, r4, #0\n\t"
  71398. /* a[i+6] += m[6] * mu */
  71399. "ldr r7, [%[m], #24]\n\t"
  71400. "ldr r10, [%[a], #24]\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], #24]\n\t"
  71405. "adc r5, r5, #0\n\t"
  71406. /* a[i+7] += m[7] * mu */
  71407. "ldr r7, [%[m], #28]\n\t"
  71408. "ldr r10, [%[a], #28]\n\t"
  71409. "umull r6, r7, r8, r7\n\t"
  71410. "adds r5, r5, r6\n\t"
  71411. "adcs r4, r7, r3\n\t"
  71412. "mov r3, #0\n\t"
  71413. "adc r3, r3, r3\n\t"
  71414. "adds r10, r10, r5\n\t"
  71415. "str r10, [%[a], #28]\n\t"
  71416. "ldr r10, [%[a], #32]\n\t"
  71417. "adcs r10, r10, r4\n\t"
  71418. "str r10, [%[a], #32]\n\t"
  71419. "adc r3, r3, #0\n\t"
  71420. /* i += 1 */
  71421. "add r9, r9, #4\n\t"
  71422. "add %[a], %[a], #4\n\t"
  71423. "cmp r9, #32\n\t"
  71424. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  71425. /* Loop Done */
  71426. "str r12, [%[a]]\n\t"
  71427. "str lr, [%[a], #4]\n\t"
  71428. "mov %[mp], r3\n\t"
  71429. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  71430. :
  71431. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  71432. );
  71433. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  71434. }
  71435. #else
  71436. /* Reduce the number back to 256 bits using Montgomery reduction.
  71437. *
  71438. * a A single precision number to reduce in place.
  71439. * m The single precision number representing the modulus.
  71440. * mp The digit representing the negative inverse of m mod 2^n.
  71441. */
  71442. static SP_NOINLINE void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  71443. {
  71444. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  71445. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  71446. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  71447. __asm__ __volatile__ (
  71448. /* i = 0 */
  71449. "mov r12, #0\n\t"
  71450. "mov lr, #0\n\t"
  71451. "ldr r4, [%[a]]\n\t"
  71452. "ldr r5, [%[a], #4]\n\t"
  71453. "ldr r6, [%[a], #8]\n\t"
  71454. "ldr r7, [%[a], #12]\n\t"
  71455. "ldr r8, [%[a], #16]\n\t"
  71456. "\n"
  71457. "L_sp_256_mont_reduce_order_8_word_%=: \n\t"
  71458. /* mu = a[i] * mp */
  71459. "mul r11, %[mp], r4\n\t"
  71460. /* a[i+0] += m[0] * mu */
  71461. "ldr r10, [%[m]]\n\t"
  71462. "mov r3, #0\n\t"
  71463. "umaal r4, r3, r11, r10\n\t"
  71464. /* a[i+1] += m[1] * mu */
  71465. "ldr r10, [%[m], #4]\n\t"
  71466. "mov r4, r5\n\t"
  71467. "umaal r4, r3, r11, r10\n\t"
  71468. /* a[i+2] += m[2] * mu */
  71469. "ldr r10, [%[m], #8]\n\t"
  71470. "mov r5, r6\n\t"
  71471. "umaal r5, r3, r11, r10\n\t"
  71472. /* a[i+3] += m[3] * mu */
  71473. "ldr r10, [%[m], #12]\n\t"
  71474. "mov r6, r7\n\t"
  71475. "umaal r6, r3, r11, r10\n\t"
  71476. /* a[i+4] += m[4] * mu */
  71477. "ldr r10, [%[m], #16]\n\t"
  71478. "mov r7, r8\n\t"
  71479. "umaal r7, r3, r11, r10\n\t"
  71480. /* a[i+5] += m[5] * mu */
  71481. "ldr r10, [%[m], #20]\n\t"
  71482. "ldr r8, [%[a], #20]\n\t"
  71483. "umaal r8, r3, r11, r10\n\t"
  71484. /* a[i+6] += m[6] * mu */
  71485. "ldr r10, [%[m], #24]\n\t"
  71486. "ldr r9, [%[a], #24]\n\t"
  71487. "umaal r9, r3, r11, r10\n\t"
  71488. "str r9, [%[a], #24]\n\t"
  71489. /* a[i+7] += m[7] * mu */
  71490. "ldr r10, [%[m], #28]\n\t"
  71491. "ldr r9, [%[a], #28]\n\t"
  71492. "umaal r9, r3, r11, r10\n\t"
  71493. "ldr r11, [%[a], #32]\n\t"
  71494. "mov r10, #0\n\t"
  71495. "umaal r3, r11, r10, r10\n\t"
  71496. "str r9, [%[a], #28]\n\t"
  71497. "adds r3, r3, lr\n\t"
  71498. "adc lr, r11, #0\n\t"
  71499. "str r3, [%[a], #32]\n\t"
  71500. /* i += 1 */
  71501. "add r12, r12, #4\n\t"
  71502. "add %[a], %[a], #4\n\t"
  71503. "cmp r12, #32\n\t"
  71504. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  71505. /* Loop Done */
  71506. "str r4, [%[a]]\n\t"
  71507. "str r5, [%[a], #4]\n\t"
  71508. "str r6, [%[a], #8]\n\t"
  71509. "str r7, [%[a], #12]\n\t"
  71510. "str r8, [%[a], #16]\n\t"
  71511. "mov %[mp], lr\n\t"
  71512. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  71513. :
  71514. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  71515. );
  71516. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  71517. }
  71518. #endif
  71519. #endif /* WOLFSSL_SP_SMALL */
  71520. /* Map the Montgomery form projective coordinate point to an affine point.
  71521. *
  71522. * r Resulting affine coordinate point.
  71523. * p Montgomery form projective coordinate point.
  71524. * t Temporary ordinate data.
  71525. */
  71526. static void sp_256_map_8(sp_point_256* r, const sp_point_256* p,
  71527. sp_digit* t)
  71528. {
  71529. sp_digit* t1 = t;
  71530. sp_digit* t2 = t + 2*8;
  71531. sp_int32 n;
  71532. sp_256_mont_inv_8(t1, p->z, t + 2*8);
  71533. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  71534. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  71535. /* x /= z^2 */
  71536. sp_256_mont_mul_8(r->x, p->x, t2, p256_mod, p256_mp_mod);
  71537. XMEMSET(r->x + 8, 0, sizeof(sp_digit) * 8U);
  71538. sp_256_mont_reduce_8(r->x, p256_mod, p256_mp_mod);
  71539. /* Reduce x to less than modulus */
  71540. n = sp_256_cmp_8(r->x, p256_mod);
  71541. sp_256_cond_sub_8(r->x, r->x, p256_mod, (sp_digit)~(n >> 31));
  71542. sp_256_norm_8(r->x);
  71543. /* y /= z^3 */
  71544. sp_256_mont_mul_8(r->y, p->y, t1, p256_mod, p256_mp_mod);
  71545. XMEMSET(r->y + 8, 0, sizeof(sp_digit) * 8U);
  71546. sp_256_mont_reduce_8(r->y, p256_mod, p256_mp_mod);
  71547. /* Reduce y to less than modulus */
  71548. n = sp_256_cmp_8(r->y, p256_mod);
  71549. sp_256_cond_sub_8(r->y, r->y, p256_mod, (sp_digit)~(n >> 31));
  71550. sp_256_norm_8(r->y);
  71551. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  71552. r->z[0] = 1;
  71553. }
  71554. /* Add two Montgomery form numbers (r = a + b % m).
  71555. *
  71556. * r Result of addition.
  71557. * a First number to add in Montgomery form.
  71558. * b Second number to add in Montgomery form.
  71559. * m Modulus (prime).
  71560. */
  71561. 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)
  71562. {
  71563. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  71564. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  71565. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  71566. __asm__ __volatile__ (
  71567. "mov lr, #0\n\t"
  71568. "ldm %[a], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  71569. "ldm %[b]!, {r3, r4}\n\t"
  71570. "adds r5, r5, r3\n\t"
  71571. "adcs r6, r6, r4\n\t"
  71572. "ldm %[b]!, {r3, r4}\n\t"
  71573. "adcs r7, r7, r3\n\t"
  71574. "adcs r8, r8, r4\n\t"
  71575. "ldm %[b]!, {r3, r4}\n\t"
  71576. "adcs r9, r9, r3\n\t"
  71577. "adcs r10, r10, r4\n\t"
  71578. "ldm %[b]!, {r3, r4}\n\t"
  71579. "adcs r11, r11, r3\n\t"
  71580. "adcs r12, r12, r4\n\t"
  71581. "adc lr, lr, #0\n\t"
  71582. "rsb lr, lr, #0\n\t"
  71583. "subs r5, r5, lr\n\t"
  71584. "sbcs r6, r6, lr\n\t"
  71585. "sbcs r7, r7, lr\n\t"
  71586. "sbcs r8, r8, #0\n\t"
  71587. "sbcs r9, r9, #0\n\t"
  71588. "sbcs r10, r10, #0\n\t"
  71589. "sbcs r11, r11, lr, lsr #31\n\t"
  71590. "sbcs r12, r12, lr\n\t"
  71591. "sbc %[b], %[b], %[b]\n\t"
  71592. "sub lr, lr, %[b]\n\t"
  71593. "subs r5, r5, lr\n\t"
  71594. "sbcs r6, r6, lr\n\t"
  71595. "sbcs r7, r7, lr\n\t"
  71596. "sbcs r8, r8, #0\n\t"
  71597. "sbcs r9, r9, #0\n\t"
  71598. "sbcs r10, r10, #0\n\t"
  71599. "sbcs r11, r11, lr, lsr #31\n\t"
  71600. "sbc r12, r12, lr\n\t"
  71601. "stm %[r], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  71602. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  71603. :
  71604. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  71605. );
  71606. (void)m_p;
  71607. }
  71608. /* Double a Montgomery form number (r = a + a % m).
  71609. *
  71610. * r Result of doubling.
  71611. * a Number to double in Montgomery form.
  71612. * m Modulus (prime).
  71613. */
  71614. static void sp_256_mont_dbl_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  71615. {
  71616. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  71617. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  71618. __asm__ __volatile__ (
  71619. "mov r2, #0\n\t"
  71620. "ldm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  71621. "adds r4, r4, r4\n\t"
  71622. "adcs r5, r5, r5\n\t"
  71623. "adcs r6, r6, r6\n\t"
  71624. "adcs r7, r7, r7\n\t"
  71625. "adcs r8, r8, r8\n\t"
  71626. "adcs r9, r9, r9\n\t"
  71627. "adcs r10, r10, r10\n\t"
  71628. "adcs r11, r11, r11\n\t"
  71629. "adc r2, r2, #0\n\t"
  71630. "rsb r2, r2, #0\n\t"
  71631. "subs r4, r4, r2\n\t"
  71632. "sbcs r5, r5, r2\n\t"
  71633. "sbcs r6, r6, r2\n\t"
  71634. "sbcs r7, r7, #0\n\t"
  71635. "sbcs r8, r8, #0\n\t"
  71636. "sbcs r9, r9, #0\n\t"
  71637. "sbcs r10, r10, r2, lsr #31\n\t"
  71638. "sbcs r11, r11, r2\n\t"
  71639. "sbc %[a], %[a], %[a]\n\t"
  71640. "sub r2, r2, %[a]\n\t"
  71641. "subs r4, r4, r2\n\t"
  71642. "sbcs r5, r5, r2\n\t"
  71643. "sbcs r6, r6, r2\n\t"
  71644. "sbcs r7, r7, #0\n\t"
  71645. "sbcs r8, r8, #0\n\t"
  71646. "sbcs r9, r9, #0\n\t"
  71647. "sbcs r10, r10, r2, lsr #31\n\t"
  71648. "sbc r11, r11, r2\n\t"
  71649. "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  71650. : [r] "+r" (r), [a] "+r" (a)
  71651. :
  71652. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "cc"
  71653. );
  71654. (void)m_p;
  71655. }
  71656. /* Triple a Montgomery form number (r = a + a + a % m).
  71657. *
  71658. * r Result of Tripling.
  71659. * a Number to triple in Montgomery form.
  71660. * m Modulus (prime).
  71661. */
  71662. static void sp_256_mont_tpl_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  71663. {
  71664. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  71665. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  71666. __asm__ __volatile__ (
  71667. "mov r12, #0\n\t"
  71668. "ldm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  71669. "adds r4, r4, r4\n\t"
  71670. "adcs r5, r5, r5\n\t"
  71671. "adcs r6, r6, r6\n\t"
  71672. "adcs r7, r7, r7\n\t"
  71673. "adcs r8, r8, r8\n\t"
  71674. "adcs r9, r9, r9\n\t"
  71675. "adcs r10, r10, r10\n\t"
  71676. "adcs r11, r11, r11\n\t"
  71677. "adc r12, r12, #0\n\t"
  71678. "rsb r12, r12, #0\n\t"
  71679. "subs r4, r4, r12\n\t"
  71680. "sbcs r5, r5, r12\n\t"
  71681. "sbcs r6, r6, r12\n\t"
  71682. "sbcs r7, r7, #0\n\t"
  71683. "sbcs r8, r8, #0\n\t"
  71684. "sbcs r9, r9, #0\n\t"
  71685. "sbcs r10, r10, r12, lsr #31\n\t"
  71686. "sbcs r11, r11, r12\n\t"
  71687. "sbc r2, r2, r2\n\t"
  71688. "sub r12, r12, r2\n\t"
  71689. "subs r4, r4, r12\n\t"
  71690. "sbcs r5, r5, r12\n\t"
  71691. "sbcs r6, r6, r12\n\t"
  71692. "sbcs r7, r7, #0\n\t"
  71693. "sbcs r8, r8, #0\n\t"
  71694. "sbcs r9, r9, #0\n\t"
  71695. "sbcs r10, r10, r12, lsr #31\n\t"
  71696. "sbc r11, r11, r12\n\t"
  71697. "ldm %[a]!, {r2, r3}\n\t"
  71698. "adds r4, r4, r2\n\t"
  71699. "adcs r5, r5, r3\n\t"
  71700. "ldm %[a]!, {r2, r3}\n\t"
  71701. "adcs r6, r6, r2\n\t"
  71702. "adcs r7, r7, r3\n\t"
  71703. "ldm %[a]!, {r2, r3}\n\t"
  71704. "adcs r8, r8, r2\n\t"
  71705. "adcs r9, r9, r3\n\t"
  71706. "ldm %[a]!, {r2, r3}\n\t"
  71707. "adcs r10, r10, r2\n\t"
  71708. "adcs r11, r11, r3\n\t"
  71709. "adc r12, r12, #0\n\t"
  71710. "rsb r12, r12, #0\n\t"
  71711. "subs r4, r4, r12\n\t"
  71712. "sbcs r5, r5, r12\n\t"
  71713. "sbcs r6, r6, r12\n\t"
  71714. "sbcs r7, r7, #0\n\t"
  71715. "sbcs r8, r8, #0\n\t"
  71716. "sbcs r9, r9, #0\n\t"
  71717. "sbcs r10, r10, r12, lsr #31\n\t"
  71718. "sbcs r11, r11, r12\n\t"
  71719. "sbc r2, r2, r2\n\t"
  71720. "sub r12, r12, r2\n\t"
  71721. "subs r4, r4, r12\n\t"
  71722. "sbcs r5, r5, r12\n\t"
  71723. "sbcs r6, r6, r12\n\t"
  71724. "sbcs r7, r7, #0\n\t"
  71725. "sbcs r8, r8, #0\n\t"
  71726. "sbcs r9, r9, #0\n\t"
  71727. "sbcs r10, r10, r12, lsr #31\n\t"
  71728. "sbc r11, r11, r12\n\t"
  71729. "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  71730. : [r] "+r" (r), [a] "+r" (a)
  71731. :
  71732. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "r12", "cc"
  71733. );
  71734. (void)m_p;
  71735. }
  71736. /* Subtract two Montgomery form numbers (r = a - b % m).
  71737. *
  71738. * r Result of subtration.
  71739. * a Number to subtract from in Montgomery form.
  71740. * b Number to subtract with in Montgomery form.
  71741. * m Modulus (prime).
  71742. */
  71743. 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)
  71744. {
  71745. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  71746. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  71747. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  71748. __asm__ __volatile__ (
  71749. "mov lr, #0\n\t"
  71750. "ldm %[a], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  71751. "ldm %[b]!, {r3, r4}\n\t"
  71752. "subs r5, r5, r3\n\t"
  71753. "sbcs r6, r6, r4\n\t"
  71754. "ldm %[b]!, {r3, r4}\n\t"
  71755. "sbcs r7, r7, r3\n\t"
  71756. "sbcs r8, r8, r4\n\t"
  71757. "ldm %[b]!, {r3, r4}\n\t"
  71758. "sbcs r9, r9, r3\n\t"
  71759. "sbcs r10, r10, r4\n\t"
  71760. "ldm %[b]!, {r3, r4}\n\t"
  71761. "sbcs r11, r11, r3\n\t"
  71762. "sbcs r12, r12, r4\n\t"
  71763. "sbc lr, lr, #0\n\t"
  71764. "adds r5, r5, lr\n\t"
  71765. "adcs r6, r6, lr\n\t"
  71766. "adcs r7, r7, lr\n\t"
  71767. "adcs r8, r8, #0\n\t"
  71768. "adcs r9, r9, #0\n\t"
  71769. "adcs r10, r10, #0\n\t"
  71770. "adcs r11, r11, lr, lsr #31\n\t"
  71771. "adcs r12, r12, lr\n\t"
  71772. "adc lr, lr, #0\n\t"
  71773. "adds r5, r5, lr\n\t"
  71774. "adcs r6, r6, lr\n\t"
  71775. "adcs r7, r7, lr\n\t"
  71776. "adcs r8, r8, #0\n\t"
  71777. "adcs r9, r9, #0\n\t"
  71778. "adcs r10, r10, #0\n\t"
  71779. "adcs r11, r11, lr, lsr #31\n\t"
  71780. "adc r12, r12, lr\n\t"
  71781. "stm %[r], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t"
  71782. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  71783. :
  71784. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  71785. );
  71786. (void)m_p;
  71787. }
  71788. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  71789. *
  71790. * r Result of division by 2.
  71791. * a Number to divide.
  71792. * m Modulus (prime).
  71793. */
  71794. static void sp_256_mont_div2_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  71795. {
  71796. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  71797. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  71798. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  71799. __asm__ __volatile__ (
  71800. "ldm %[a], {r4, r5, r6, r7}\n\t"
  71801. "and r3, r4, #1\n\t"
  71802. "rsb r8, r3, #0\n\t"
  71803. "adds r4, r4, r8\n\t"
  71804. "adcs r5, r5, r8\n\t"
  71805. "adcs r6, r6, r8\n\t"
  71806. "adcs r7, r7, #0\n\t"
  71807. "stm %[r], {r4, r5, r6, r7}\n\t"
  71808. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  71809. "ldr r4, [%[a], #16]\n\t"
  71810. "ldr r5, [%[a], #20]\n\t"
  71811. #else
  71812. "ldrd r4, r5, [%[a], #16]\n\t"
  71813. #endif
  71814. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  71815. "ldr r6, [%[a], #24]\n\t"
  71816. "ldr r7, [%[a], #28]\n\t"
  71817. #else
  71818. "ldrd r6, r7, [%[a], #24]\n\t"
  71819. #endif
  71820. "adcs r4, r4, #0\n\t"
  71821. "adcs r5, r5, #0\n\t"
  71822. "adcs r6, r6, r8, lsr #31\n\t"
  71823. "adcs r7, r7, r8\n\t"
  71824. "mov r3, #0\n\t"
  71825. "adc r3, r3, #0\n\t"
  71826. "lsr r8, r4, #1\n\t"
  71827. "lsr r9, r5, #1\n\t"
  71828. "lsr r10, r6, #1\n\t"
  71829. "lsr r11, r7, #1\n\t"
  71830. "orr r8, r8, r5, lsl #31\n\t"
  71831. "orr r9, r9, r6, lsl #31\n\t"
  71832. "orr r10, r10, r7, lsl #31\n\t"
  71833. "orr r11, r11, r3, lsl #31\n\t"
  71834. "mov r3, r4\n\t"
  71835. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  71836. "str r8, [%[r], #16]\n\t"
  71837. "str r9, [%[r], #20]\n\t"
  71838. #else
  71839. "strd r8, r9, [%[r], #16]\n\t"
  71840. #endif
  71841. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  71842. "str r10, [%[r], #24]\n\t"
  71843. "str r11, [%[r], #28]\n\t"
  71844. #else
  71845. "strd r10, r11, [%[r], #24]\n\t"
  71846. #endif
  71847. "ldm %[r], {r4, r5, r6, r7}\n\t"
  71848. "lsr r8, r4, #1\n\t"
  71849. "lsr r9, r5, #1\n\t"
  71850. "lsr r10, r6, #1\n\t"
  71851. "lsr r11, r7, #1\n\t"
  71852. "orr r8, r8, r5, lsl #31\n\t"
  71853. "orr r9, r9, r6, lsl #31\n\t"
  71854. "orr r10, r10, r7, lsl #31\n\t"
  71855. "orr r11, r11, r3, lsl #31\n\t"
  71856. "stm %[r], {r8, r9, r10, r11}\n\t"
  71857. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  71858. :
  71859. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "cc"
  71860. );
  71861. }
  71862. /* Double the Montgomery form projective point p.
  71863. *
  71864. * r Result of doubling point.
  71865. * p Point to double.
  71866. * t Temporary ordinate data.
  71867. */
  71868. static void sp_256_proj_point_dbl_8(sp_point_256* r, const sp_point_256* p,
  71869. sp_digit* t)
  71870. {
  71871. sp_digit* t1 = t;
  71872. sp_digit* t2 = t + 2*8;
  71873. sp_digit* x;
  71874. sp_digit* y;
  71875. sp_digit* z;
  71876. x = r->x;
  71877. y = r->y;
  71878. z = r->z;
  71879. /* Put infinity into result. */
  71880. if (r != p) {
  71881. r->infinity = p->infinity;
  71882. }
  71883. /* T1 = Z * Z */
  71884. sp_256_mont_sqr_8(t1, p->z, p256_mod, p256_mp_mod);
  71885. /* Z = Y * Z */
  71886. sp_256_mont_mul_8(z, p->y, p->z, p256_mod, p256_mp_mod);
  71887. /* Z = 2Z */
  71888. sp_256_mont_dbl_8(z, z, p256_mod);
  71889. /* T2 = X - T1 */
  71890. sp_256_mont_sub_8(t2, p->x, t1, p256_mod);
  71891. /* T1 = X + T1 */
  71892. sp_256_mont_add_8(t1, p->x, t1, p256_mod);
  71893. /* T2 = T1 * T2 */
  71894. sp_256_mont_mul_8(t2, t1, t2, p256_mod, p256_mp_mod);
  71895. /* T1 = 3T2 */
  71896. sp_256_mont_tpl_8(t1, t2, p256_mod);
  71897. /* Y = 2Y */
  71898. sp_256_mont_dbl_8(y, p->y, p256_mod);
  71899. /* Y = Y * Y */
  71900. sp_256_mont_sqr_8(y, y, p256_mod, p256_mp_mod);
  71901. /* T2 = Y * Y */
  71902. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  71903. /* T2 = T2/2 */
  71904. sp_256_mont_div2_8(t2, t2, p256_mod);
  71905. /* Y = Y * X */
  71906. sp_256_mont_mul_8(y, y, p->x, p256_mod, p256_mp_mod);
  71907. /* X = T1 * T1 */
  71908. sp_256_mont_sqr_8(x, t1, p256_mod, p256_mp_mod);
  71909. /* X = X - Y */
  71910. sp_256_mont_sub_8(x, x, y, p256_mod);
  71911. /* X = X - Y */
  71912. sp_256_mont_sub_8(x, x, y, p256_mod);
  71913. /* Y = Y - X */
  71914. sp_256_mont_sub_8(y, y, x, p256_mod);
  71915. /* Y = Y * T1 */
  71916. sp_256_mont_mul_8(y, y, t1, p256_mod, p256_mp_mod);
  71917. /* Y = Y - T2 */
  71918. sp_256_mont_sub_8(y, y, t2, p256_mod);
  71919. }
  71920. #ifdef WOLFSSL_SP_NONBLOCK
  71921. typedef struct sp_256_proj_point_dbl_8_ctx {
  71922. int state;
  71923. sp_digit* t1;
  71924. sp_digit* t2;
  71925. sp_digit* x;
  71926. sp_digit* y;
  71927. sp_digit* z;
  71928. } sp_256_proj_point_dbl_8_ctx;
  71929. /* Double the Montgomery form projective point p.
  71930. *
  71931. * r Result of doubling point.
  71932. * p Point to double.
  71933. * t Temporary ordinate data.
  71934. */
  71935. static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
  71936. const sp_point_256* p, sp_digit* t)
  71937. {
  71938. int err = FP_WOULDBLOCK;
  71939. sp_256_proj_point_dbl_8_ctx* ctx = (sp_256_proj_point_dbl_8_ctx*)sp_ctx->data;
  71940. typedef char ctx_size_test[sizeof(sp_256_proj_point_dbl_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  71941. (void)sizeof(ctx_size_test);
  71942. switch (ctx->state) {
  71943. case 0:
  71944. ctx->t1 = t;
  71945. ctx->t2 = t + 2*8;
  71946. ctx->x = r->x;
  71947. ctx->y = r->y;
  71948. ctx->z = r->z;
  71949. /* Put infinity into result. */
  71950. if (r != p) {
  71951. r->infinity = p->infinity;
  71952. }
  71953. ctx->state = 1;
  71954. break;
  71955. case 1:
  71956. /* T1 = Z * Z */
  71957. sp_256_mont_sqr_8(ctx->t1, p->z, p256_mod, p256_mp_mod);
  71958. ctx->state = 2;
  71959. break;
  71960. case 2:
  71961. /* Z = Y * Z */
  71962. sp_256_mont_mul_8(ctx->z, p->y, p->z, p256_mod, p256_mp_mod);
  71963. ctx->state = 3;
  71964. break;
  71965. case 3:
  71966. /* Z = 2Z */
  71967. sp_256_mont_dbl_8(ctx->z, ctx->z, p256_mod);
  71968. ctx->state = 4;
  71969. break;
  71970. case 4:
  71971. /* T2 = X - T1 */
  71972. sp_256_mont_sub_8(ctx->t2, p->x, ctx->t1, p256_mod);
  71973. ctx->state = 5;
  71974. break;
  71975. case 5:
  71976. /* T1 = X + T1 */
  71977. sp_256_mont_add_8(ctx->t1, p->x, ctx->t1, p256_mod);
  71978. ctx->state = 6;
  71979. break;
  71980. case 6:
  71981. /* T2 = T1 * T2 */
  71982. sp_256_mont_mul_8(ctx->t2, ctx->t1, ctx->t2, p256_mod, p256_mp_mod);
  71983. ctx->state = 7;
  71984. break;
  71985. case 7:
  71986. /* T1 = 3T2 */
  71987. sp_256_mont_tpl_8(ctx->t1, ctx->t2, p256_mod);
  71988. ctx->state = 8;
  71989. break;
  71990. case 8:
  71991. /* Y = 2Y */
  71992. sp_256_mont_dbl_8(ctx->y, p->y, p256_mod);
  71993. ctx->state = 9;
  71994. break;
  71995. case 9:
  71996. /* Y = Y * Y */
  71997. sp_256_mont_sqr_8(ctx->y, ctx->y, p256_mod, p256_mp_mod);
  71998. ctx->state = 10;
  71999. break;
  72000. case 10:
  72001. /* T2 = Y * Y */
  72002. sp_256_mont_sqr_8(ctx->t2, ctx->y, p256_mod, p256_mp_mod);
  72003. ctx->state = 11;
  72004. break;
  72005. case 11:
  72006. /* T2 = T2/2 */
  72007. sp_256_mont_div2_8(ctx->t2, ctx->t2, p256_mod);
  72008. ctx->state = 12;
  72009. break;
  72010. case 12:
  72011. /* Y = Y * X */
  72012. sp_256_mont_mul_8(ctx->y, ctx->y, p->x, p256_mod, p256_mp_mod);
  72013. ctx->state = 13;
  72014. break;
  72015. case 13:
  72016. /* X = T1 * T1 */
  72017. sp_256_mont_sqr_8(ctx->x, ctx->t1, p256_mod, p256_mp_mod);
  72018. ctx->state = 14;
  72019. break;
  72020. case 14:
  72021. /* X = X - Y */
  72022. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  72023. ctx->state = 15;
  72024. break;
  72025. case 15:
  72026. /* X = X - Y */
  72027. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  72028. ctx->state = 16;
  72029. break;
  72030. case 16:
  72031. /* Y = Y - X */
  72032. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod);
  72033. ctx->state = 17;
  72034. break;
  72035. case 17:
  72036. /* Y = Y * T1 */
  72037. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t1, p256_mod, p256_mp_mod);
  72038. ctx->state = 18;
  72039. break;
  72040. case 18:
  72041. /* Y = Y - T2 */
  72042. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t2, p256_mod);
  72043. ctx->state = 19;
  72044. /* fall-through */
  72045. case 19:
  72046. err = MP_OKAY;
  72047. break;
  72048. }
  72049. if (err == MP_OKAY && ctx->state != 19) {
  72050. err = FP_WOULDBLOCK;
  72051. }
  72052. return err;
  72053. }
  72054. #endif /* WOLFSSL_SP_NONBLOCK */
  72055. /* Compare two numbers to determine if they are equal.
  72056. * Constant time implementation.
  72057. *
  72058. * a First number to compare.
  72059. * b Second number to compare.
  72060. * returns 1 when equal and 0 otherwise.
  72061. */
  72062. static int sp_256_cmp_equal_8(const sp_digit* a, const sp_digit* b)
  72063. {
  72064. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  72065. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  72066. (a[6] ^ b[6]) | (a[7] ^ b[7])) == 0;
  72067. }
  72068. /* Returns 1 if the number of zero.
  72069. * Implementation is constant time.
  72070. *
  72071. * a Number to check.
  72072. * returns 1 if the number is zero and 0 otherwise.
  72073. */
  72074. static int sp_256_iszero_8(const sp_digit* a)
  72075. {
  72076. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7]) == 0;
  72077. }
  72078. /* Add two Montgomery form projective points.
  72079. *
  72080. * r Result of addition.
  72081. * p First point to add.
  72082. * q Second point to add.
  72083. * t Temporary ordinate data.
  72084. */
  72085. static void sp_256_proj_point_add_8(sp_point_256* r,
  72086. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  72087. {
  72088. sp_digit* t6 = t;
  72089. sp_digit* t1 = t + 2*8;
  72090. sp_digit* t2 = t + 4*8;
  72091. sp_digit* t3 = t + 6*8;
  72092. sp_digit* t4 = t + 8*8;
  72093. sp_digit* t5 = t + 10*8;
  72094. /* U1 = X1*Z2^2 */
  72095. sp_256_mont_sqr_8(t1, q->z, p256_mod, p256_mp_mod);
  72096. sp_256_mont_mul_8(t3, t1, q->z, p256_mod, p256_mp_mod);
  72097. sp_256_mont_mul_8(t1, t1, p->x, p256_mod, p256_mp_mod);
  72098. /* U2 = X2*Z1^2 */
  72099. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  72100. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  72101. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  72102. /* S1 = Y1*Z2^3 */
  72103. sp_256_mont_mul_8(t3, t3, p->y, p256_mod, p256_mp_mod);
  72104. /* S2 = Y2*Z1^3 */
  72105. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  72106. /* Check double */
  72107. if ((~p->infinity) & (~q->infinity) &
  72108. sp_256_cmp_equal_8(t2, t1) &
  72109. sp_256_cmp_equal_8(t4, t3)) {
  72110. sp_256_proj_point_dbl_8(r, p, t);
  72111. }
  72112. else {
  72113. sp_digit* x = t6;
  72114. sp_digit* y = t1;
  72115. sp_digit* z = t2;
  72116. /* H = U2 - U1 */
  72117. sp_256_mont_sub_8(t2, t2, t1, p256_mod);
  72118. /* R = S2 - S1 */
  72119. sp_256_mont_sub_8(t4, t4, t3, p256_mod);
  72120. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  72121. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  72122. sp_256_mont_mul_8(y, t1, t5, p256_mod, p256_mp_mod);
  72123. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  72124. /* Z3 = H*Z1*Z2 */
  72125. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  72126. sp_256_mont_mul_8(z, z, q->z, p256_mod, p256_mp_mod);
  72127. sp_256_mont_sqr_8(x, t4, p256_mod, p256_mp_mod);
  72128. sp_256_mont_sub_8(x, x, t5, p256_mod);
  72129. sp_256_mont_mul_8(t5, t5, t3, p256_mod, p256_mp_mod);
  72130. sp_256_mont_dbl_8(t3, y, p256_mod);
  72131. sp_256_mont_sub_8(x, x, t3, p256_mod);
  72132. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  72133. sp_256_mont_sub_8(y, y, x, p256_mod);
  72134. sp_256_mont_mul_8(y, y, t4, p256_mod, p256_mp_mod);
  72135. sp_256_mont_sub_8(y, y, t5, p256_mod);
  72136. {
  72137. int i;
  72138. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  72139. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  72140. sp_digit maskt = ~(maskp | maskq);
  72141. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  72142. for (i = 0; i < 8; i++) {
  72143. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  72144. (x[i] & maskt);
  72145. }
  72146. for (i = 0; i < 8; i++) {
  72147. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  72148. (y[i] & maskt);
  72149. }
  72150. for (i = 0; i < 8; i++) {
  72151. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  72152. (z[i] & maskt);
  72153. }
  72154. r->z[0] |= inf;
  72155. r->infinity = (int)inf;
  72156. }
  72157. }
  72158. }
  72159. #ifdef WOLFSSL_SP_NONBLOCK
  72160. typedef struct sp_256_proj_point_add_8_ctx {
  72161. int state;
  72162. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  72163. const sp_point_256* ap[2];
  72164. sp_point_256* rp[2];
  72165. sp_digit* t1;
  72166. sp_digit* t2;
  72167. sp_digit* t3;
  72168. sp_digit* t4;
  72169. sp_digit* t5;
  72170. sp_digit* t6;
  72171. sp_digit* x;
  72172. sp_digit* y;
  72173. sp_digit* z;
  72174. } sp_256_proj_point_add_8_ctx;
  72175. /* Add two Montgomery form projective points.
  72176. *
  72177. * r Result of addition.
  72178. * p First point to add.
  72179. * q Second point to add.
  72180. * t Temporary ordinate data.
  72181. */
  72182. static int sp_256_proj_point_add_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
  72183. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  72184. {
  72185. int err = FP_WOULDBLOCK;
  72186. sp_256_proj_point_add_8_ctx* ctx = (sp_256_proj_point_add_8_ctx*)sp_ctx->data;
  72187. /* Ensure only the first point is the same as the result. */
  72188. if (q == r) {
  72189. const sp_point_256* a = p;
  72190. p = q;
  72191. q = a;
  72192. }
  72193. typedef char ctx_size_test[sizeof(sp_256_proj_point_add_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  72194. (void)sizeof(ctx_size_test);
  72195. switch (ctx->state) {
  72196. case 0: /* INIT */
  72197. ctx->t6 = t;
  72198. ctx->t1 = t + 2*8;
  72199. ctx->t2 = t + 4*8;
  72200. ctx->t3 = t + 6*8;
  72201. ctx->t4 = t + 8*8;
  72202. ctx->t5 = t + 10*8;
  72203. ctx->x = ctx->t6;
  72204. ctx->y = ctx->t1;
  72205. ctx->z = ctx->t2;
  72206. ctx->state = 1;
  72207. break;
  72208. case 1:
  72209. /* U1 = X1*Z2^2 */
  72210. sp_256_mont_sqr_8(ctx->t1, q->z, p256_mod, p256_mp_mod);
  72211. ctx->state = 2;
  72212. break;
  72213. case 2:
  72214. sp_256_mont_mul_8(ctx->t3, ctx->t1, q->z, p256_mod, p256_mp_mod);
  72215. ctx->state = 3;
  72216. break;
  72217. case 3:
  72218. sp_256_mont_mul_8(ctx->t1, ctx->t1, p->x, p256_mod, p256_mp_mod);
  72219. ctx->state = 4;
  72220. break;
  72221. case 4:
  72222. /* U2 = X2*Z1^2 */
  72223. sp_256_mont_sqr_8(ctx->t2, p->z, p256_mod, p256_mp_mod);
  72224. ctx->state = 5;
  72225. break;
  72226. case 5:
  72227. sp_256_mont_mul_8(ctx->t4, ctx->t2, p->z, p256_mod, p256_mp_mod);
  72228. ctx->state = 6;
  72229. break;
  72230. case 6:
  72231. sp_256_mont_mul_8(ctx->t2, ctx->t2, q->x, p256_mod, p256_mp_mod);
  72232. ctx->state = 7;
  72233. break;
  72234. case 7:
  72235. /* S1 = Y1*Z2^3 */
  72236. sp_256_mont_mul_8(ctx->t3, ctx->t3, p->y, p256_mod, p256_mp_mod);
  72237. ctx->state = 8;
  72238. break;
  72239. case 8:
  72240. /* S2 = Y2*Z1^3 */
  72241. sp_256_mont_mul_8(ctx->t4, ctx->t4, q->y, p256_mod, p256_mp_mod);
  72242. ctx->state = 9;
  72243. break;
  72244. case 9:
  72245. /* Check double */
  72246. if ((~p->infinity) & (~q->infinity) &
  72247. sp_256_cmp_equal_8(ctx->t2, ctx->t1) &
  72248. sp_256_cmp_equal_8(ctx->t4, ctx->t3)) {
  72249. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  72250. sp_256_proj_point_dbl_8(r, p, t);
  72251. ctx->state = 25;
  72252. }
  72253. else {
  72254. ctx->state = 10;
  72255. }
  72256. break;
  72257. case 10:
  72258. /* H = U2 - U1 */
  72259. sp_256_mont_sub_8(ctx->t2, ctx->t2, ctx->t1, p256_mod);
  72260. ctx->state = 11;
  72261. break;
  72262. case 11:
  72263. /* R = S2 - S1 */
  72264. sp_256_mont_sub_8(ctx->t4, ctx->t4, ctx->t3, p256_mod);
  72265. ctx->state = 12;
  72266. break;
  72267. case 12:
  72268. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  72269. sp_256_mont_sqr_8(ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  72270. ctx->state = 13;
  72271. break;
  72272. case 13:
  72273. sp_256_mont_mul_8(ctx->y, ctx->t1, ctx->t5, p256_mod, p256_mp_mod);
  72274. ctx->state = 14;
  72275. break;
  72276. case 14:
  72277. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  72278. ctx->state = 15;
  72279. break;
  72280. case 15:
  72281. /* Z3 = H*Z1*Z2 */
  72282. sp_256_mont_mul_8(ctx->z, p->z, ctx->t2, p256_mod, p256_mp_mod);
  72283. ctx->state = 16;
  72284. break;
  72285. case 16:
  72286. sp_256_mont_mul_8(ctx->z, ctx->z, q->z, p256_mod, p256_mp_mod);
  72287. ctx->state = 17;
  72288. break;
  72289. case 17:
  72290. sp_256_mont_sqr_8(ctx->x, ctx->t4, p256_mod, p256_mp_mod);
  72291. ctx->state = 18;
  72292. break;
  72293. case 18:
  72294. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t5, p256_mod);
  72295. ctx->state = 19;
  72296. break;
  72297. case 19:
  72298. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t3, p256_mod, p256_mp_mod);
  72299. ctx->state = 20;
  72300. break;
  72301. case 20:
  72302. sp_256_mont_dbl_8(ctx->t3, ctx->y, p256_mod);
  72303. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t3, p256_mod);
  72304. ctx->state = 21;
  72305. break;
  72306. case 21:
  72307. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  72308. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod);
  72309. ctx->state = 22;
  72310. break;
  72311. case 22:
  72312. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t4, p256_mod, p256_mp_mod);
  72313. ctx->state = 23;
  72314. break;
  72315. case 23:
  72316. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t5, p256_mod);
  72317. ctx->state = 24;
  72318. break;
  72319. case 24:
  72320. {
  72321. {
  72322. int i;
  72323. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  72324. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  72325. sp_digit maskt = ~(maskp | maskq);
  72326. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  72327. for (i = 0; i < 8; i++) {
  72328. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  72329. (ctx->x[i] & maskt);
  72330. }
  72331. for (i = 0; i < 8; i++) {
  72332. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  72333. (ctx->y[i] & maskt);
  72334. }
  72335. for (i = 0; i < 8; i++) {
  72336. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  72337. (ctx->z[i] & maskt);
  72338. }
  72339. r->z[0] |= inf;
  72340. r->infinity = (int)inf;
  72341. }
  72342. ctx->state = 25;
  72343. break;
  72344. }
  72345. case 25:
  72346. err = MP_OKAY;
  72347. break;
  72348. }
  72349. if (err == MP_OKAY && ctx->state != 25) {
  72350. err = FP_WOULDBLOCK;
  72351. }
  72352. return err;
  72353. }
  72354. #endif /* WOLFSSL_SP_NONBLOCK */
  72355. #ifndef WC_NO_CACHE_RESISTANT
  72356. /* Touch each possible point that could be being copied.
  72357. *
  72358. * r Point to copy into.
  72359. * table Table - start of the entries to access
  72360. * idx Index of entry to retrieve.
  72361. */
  72362. static void sp_256_get_point_16_8(sp_point_256* r, const sp_point_256* table,
  72363. int idx)
  72364. {
  72365. int i;
  72366. sp_digit mask;
  72367. r->x[0] = 0;
  72368. r->x[1] = 0;
  72369. r->x[2] = 0;
  72370. r->x[3] = 0;
  72371. r->x[4] = 0;
  72372. r->x[5] = 0;
  72373. r->x[6] = 0;
  72374. r->x[7] = 0;
  72375. r->y[0] = 0;
  72376. r->y[1] = 0;
  72377. r->y[2] = 0;
  72378. r->y[3] = 0;
  72379. r->y[4] = 0;
  72380. r->y[5] = 0;
  72381. r->y[6] = 0;
  72382. r->y[7] = 0;
  72383. r->z[0] = 0;
  72384. r->z[1] = 0;
  72385. r->z[2] = 0;
  72386. r->z[3] = 0;
  72387. r->z[4] = 0;
  72388. r->z[5] = 0;
  72389. r->z[6] = 0;
  72390. r->z[7] = 0;
  72391. for (i = 1; i < 16; i++) {
  72392. mask = (sp_digit)0 - (i == idx);
  72393. r->x[0] |= mask & table[i].x[0];
  72394. r->x[1] |= mask & table[i].x[1];
  72395. r->x[2] |= mask & table[i].x[2];
  72396. r->x[3] |= mask & table[i].x[3];
  72397. r->x[4] |= mask & table[i].x[4];
  72398. r->x[5] |= mask & table[i].x[5];
  72399. r->x[6] |= mask & table[i].x[6];
  72400. r->x[7] |= mask & table[i].x[7];
  72401. r->y[0] |= mask & table[i].y[0];
  72402. r->y[1] |= mask & table[i].y[1];
  72403. r->y[2] |= mask & table[i].y[2];
  72404. r->y[3] |= mask & table[i].y[3];
  72405. r->y[4] |= mask & table[i].y[4];
  72406. r->y[5] |= mask & table[i].y[5];
  72407. r->y[6] |= mask & table[i].y[6];
  72408. r->y[7] |= mask & table[i].y[7];
  72409. r->z[0] |= mask & table[i].z[0];
  72410. r->z[1] |= mask & table[i].z[1];
  72411. r->z[2] |= mask & table[i].z[2];
  72412. r->z[3] |= mask & table[i].z[3];
  72413. r->z[4] |= mask & table[i].z[4];
  72414. r->z[5] |= mask & table[i].z[5];
  72415. r->z[6] |= mask & table[i].z[6];
  72416. r->z[7] |= mask & table[i].z[7];
  72417. }
  72418. }
  72419. #endif /* !WC_NO_CACHE_RESISTANT */
  72420. /* Multiply the point by the scalar and return the result.
  72421. * If map is true then convert result to affine coordinates.
  72422. *
  72423. * Fast implementation that generates a pre-computation table.
  72424. * 4 bits of window (no sliding!).
  72425. * Uses add and double for calculating table.
  72426. * 256 doubles.
  72427. * 76 adds.
  72428. *
  72429. * r Resulting point.
  72430. * g Point to multiply.
  72431. * k Scalar to multiply by.
  72432. * map Indicates whether to convert result to affine.
  72433. * ct Constant time required.
  72434. * heap Heap to use for allocation.
  72435. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  72436. */
  72437. static int sp_256_ecc_mulmod_fast_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  72438. int map, int ct, void* heap)
  72439. {
  72440. #ifdef WOLFSSL_SP_SMALL_STACK
  72441. sp_point_256* t = NULL;
  72442. sp_digit* tmp = NULL;
  72443. #else
  72444. sp_point_256 t[16 + 1];
  72445. sp_digit tmp[2 * 8 * 6];
  72446. #endif
  72447. sp_point_256* rt = NULL;
  72448. #ifndef WC_NO_CACHE_RESISTANT
  72449. #ifdef WOLFSSL_SP_SMALL_STACK
  72450. sp_point_256* p = NULL;
  72451. #else
  72452. sp_point_256 p[1];
  72453. #endif
  72454. #endif /* !WC_NO_CACHE_RESISTANT */
  72455. sp_digit n;
  72456. int i;
  72457. int c;
  72458. int y;
  72459. int err = MP_OKAY;
  72460. /* Constant time used for cache attack resistance implementation. */
  72461. (void)ct;
  72462. (void)heap;
  72463. #ifdef WOLFSSL_SP_SMALL_STACK
  72464. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (16 + 1),
  72465. heap, DYNAMIC_TYPE_ECC);
  72466. if (t == NULL)
  72467. err = MEMORY_E;
  72468. #ifndef WC_NO_CACHE_RESISTANT
  72469. if (err == MP_OKAY) {
  72470. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256),
  72471. heap, DYNAMIC_TYPE_ECC);
  72472. if (p == NULL)
  72473. err = MEMORY_E;
  72474. }
  72475. #endif
  72476. if (err == MP_OKAY) {
  72477. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  72478. DYNAMIC_TYPE_ECC);
  72479. if (tmp == NULL)
  72480. err = MEMORY_E;
  72481. }
  72482. #endif
  72483. if (err == MP_OKAY) {
  72484. rt = t + 16;
  72485. /* t[0] = {0, 0, 1} * norm */
  72486. XMEMSET(&t[0], 0, sizeof(t[0]));
  72487. t[0].infinity = 1;
  72488. /* t[1] = {g->x, g->y, g->z} * norm */
  72489. (void)sp_256_mod_mul_norm_8(t[1].x, g->x, p256_mod);
  72490. (void)sp_256_mod_mul_norm_8(t[1].y, g->y, p256_mod);
  72491. (void)sp_256_mod_mul_norm_8(t[1].z, g->z, p256_mod);
  72492. t[1].infinity = 0;
  72493. sp_256_proj_point_dbl_8(&t[ 2], &t[ 1], tmp);
  72494. t[ 2].infinity = 0;
  72495. sp_256_proj_point_add_8(&t[ 3], &t[ 2], &t[ 1], tmp);
  72496. t[ 3].infinity = 0;
  72497. sp_256_proj_point_dbl_8(&t[ 4], &t[ 2], tmp);
  72498. t[ 4].infinity = 0;
  72499. sp_256_proj_point_add_8(&t[ 5], &t[ 3], &t[ 2], tmp);
  72500. t[ 5].infinity = 0;
  72501. sp_256_proj_point_dbl_8(&t[ 6], &t[ 3], tmp);
  72502. t[ 6].infinity = 0;
  72503. sp_256_proj_point_add_8(&t[ 7], &t[ 4], &t[ 3], tmp);
  72504. t[ 7].infinity = 0;
  72505. sp_256_proj_point_dbl_8(&t[ 8], &t[ 4], tmp);
  72506. t[ 8].infinity = 0;
  72507. sp_256_proj_point_add_8(&t[ 9], &t[ 5], &t[ 4], tmp);
  72508. t[ 9].infinity = 0;
  72509. sp_256_proj_point_dbl_8(&t[10], &t[ 5], tmp);
  72510. t[10].infinity = 0;
  72511. sp_256_proj_point_add_8(&t[11], &t[ 6], &t[ 5], tmp);
  72512. t[11].infinity = 0;
  72513. sp_256_proj_point_dbl_8(&t[12], &t[ 6], tmp);
  72514. t[12].infinity = 0;
  72515. sp_256_proj_point_add_8(&t[13], &t[ 7], &t[ 6], tmp);
  72516. t[13].infinity = 0;
  72517. sp_256_proj_point_dbl_8(&t[14], &t[ 7], tmp);
  72518. t[14].infinity = 0;
  72519. sp_256_proj_point_add_8(&t[15], &t[ 8], &t[ 7], tmp);
  72520. t[15].infinity = 0;
  72521. i = 6;
  72522. n = k[i+1] << 0;
  72523. c = 28;
  72524. y = (int)(n >> 28);
  72525. #ifndef WC_NO_CACHE_RESISTANT
  72526. if (ct) {
  72527. sp_256_get_point_16_8(rt, t, y);
  72528. rt->infinity = !y;
  72529. }
  72530. else
  72531. #endif
  72532. {
  72533. XMEMCPY(rt, &t[y], sizeof(sp_point_256));
  72534. }
  72535. n <<= 4;
  72536. for (; i>=0 || c>=4; ) {
  72537. if (c < 4) {
  72538. n |= k[i--];
  72539. c += 32;
  72540. }
  72541. y = (n >> 28) & 0xf;
  72542. n <<= 4;
  72543. c -= 4;
  72544. sp_256_proj_point_dbl_8(rt, rt, tmp);
  72545. sp_256_proj_point_dbl_8(rt, rt, tmp);
  72546. sp_256_proj_point_dbl_8(rt, rt, tmp);
  72547. sp_256_proj_point_dbl_8(rt, rt, tmp);
  72548. #ifndef WC_NO_CACHE_RESISTANT
  72549. if (ct) {
  72550. sp_256_get_point_16_8(p, t, y);
  72551. p->infinity = !y;
  72552. sp_256_proj_point_add_8(rt, rt, p, tmp);
  72553. }
  72554. else
  72555. #endif
  72556. {
  72557. sp_256_proj_point_add_8(rt, rt, &t[y], tmp);
  72558. }
  72559. }
  72560. if (map != 0) {
  72561. sp_256_map_8(r, rt, tmp);
  72562. }
  72563. else {
  72564. XMEMCPY(r, rt, sizeof(sp_point_256));
  72565. }
  72566. }
  72567. #ifdef WOLFSSL_SP_SMALL_STACK
  72568. if (tmp != NULL)
  72569. #endif
  72570. {
  72571. ForceZero(tmp, sizeof(sp_digit) * 2 * 8 * 6);
  72572. #ifdef WOLFSSL_SP_SMALL_STACK
  72573. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  72574. #endif
  72575. }
  72576. #ifndef WC_NO_CACHE_RESISTANT
  72577. #ifdef WOLFSSL_SP_SMALL_STACK
  72578. if (p != NULL)
  72579. #endif
  72580. {
  72581. ForceZero(p, sizeof(sp_point_256));
  72582. #ifdef WOLFSSL_SP_SMALL_STACK
  72583. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  72584. #endif
  72585. }
  72586. #endif /* !WC_NO_CACHE_RESISTANT */
  72587. #ifdef WOLFSSL_SP_SMALL_STACK
  72588. if (t != NULL)
  72589. #endif
  72590. {
  72591. ForceZero(t, sizeof(sp_point_256) * 17);
  72592. #ifdef WOLFSSL_SP_SMALL_STACK
  72593. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  72594. #endif
  72595. }
  72596. return err;
  72597. }
  72598. #ifdef FP_ECC
  72599. /* Double the Montgomery form projective point p a number of times.
  72600. *
  72601. * r Result of repeated doubling of point.
  72602. * p Point to double.
  72603. * n Number of times to double
  72604. * t Temporary ordinate data.
  72605. */
  72606. static void sp_256_proj_point_dbl_n_8(sp_point_256* p, int i,
  72607. sp_digit* t)
  72608. {
  72609. sp_digit* w = t;
  72610. sp_digit* a = t + 2*8;
  72611. sp_digit* b = t + 4*8;
  72612. sp_digit* t1 = t + 6*8;
  72613. sp_digit* t2 = t + 8*8;
  72614. sp_digit* x;
  72615. sp_digit* y;
  72616. sp_digit* z;
  72617. volatile int n = i;
  72618. x = p->x;
  72619. y = p->y;
  72620. z = p->z;
  72621. /* Y = 2*Y */
  72622. sp_256_mont_dbl_8(y, y, p256_mod);
  72623. /* W = Z^4 */
  72624. sp_256_mont_sqr_8(w, z, p256_mod, p256_mp_mod);
  72625. sp_256_mont_sqr_8(w, w, p256_mod, p256_mp_mod);
  72626. #ifndef WOLFSSL_SP_SMALL
  72627. while (--n > 0)
  72628. #else
  72629. while (--n >= 0)
  72630. #endif
  72631. {
  72632. /* A = 3*(X^2 - W) */
  72633. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  72634. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  72635. sp_256_mont_tpl_8(a, t1, p256_mod);
  72636. /* B = X*Y^2 */
  72637. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  72638. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  72639. /* X = A^2 - 2B */
  72640. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  72641. sp_256_mont_dbl_8(t2, b, p256_mod);
  72642. sp_256_mont_sub_8(x, x, t2, p256_mod);
  72643. /* B = 2.(B - X) */
  72644. sp_256_mont_sub_8(t2, b, x, p256_mod);
  72645. sp_256_mont_dbl_8(b, t2, p256_mod);
  72646. /* Z = Z*Y */
  72647. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  72648. /* t1 = Y^4 */
  72649. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  72650. #ifdef WOLFSSL_SP_SMALL
  72651. if (n != 0)
  72652. #endif
  72653. {
  72654. /* W = W*Y^4 */
  72655. sp_256_mont_mul_8(w, w, t1, p256_mod, p256_mp_mod);
  72656. }
  72657. /* y = 2*A*(B - X) - Y^4 */
  72658. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  72659. sp_256_mont_sub_8(y, y, t1, p256_mod);
  72660. }
  72661. #ifndef WOLFSSL_SP_SMALL
  72662. /* A = 3*(X^2 - W) */
  72663. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  72664. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  72665. sp_256_mont_tpl_8(a, t1, p256_mod);
  72666. /* B = X*Y^2 */
  72667. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  72668. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  72669. /* X = A^2 - 2B */
  72670. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  72671. sp_256_mont_dbl_8(t2, b, p256_mod);
  72672. sp_256_mont_sub_8(x, x, t2, p256_mod);
  72673. /* B = 2.(B - X) */
  72674. sp_256_mont_sub_8(t2, b, x, p256_mod);
  72675. sp_256_mont_dbl_8(b, t2, p256_mod);
  72676. /* Z = Z*Y */
  72677. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  72678. /* t1 = Y^4 */
  72679. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  72680. /* y = 2*A*(B - X) - Y^4 */
  72681. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  72682. sp_256_mont_sub_8(y, y, t1, p256_mod);
  72683. #endif /* WOLFSSL_SP_SMALL */
  72684. /* Y = Y/2 */
  72685. sp_256_mont_div2_8(y, y, p256_mod);
  72686. }
  72687. /* Convert the projective point to affine.
  72688. * Ordinates are in Montgomery form.
  72689. *
  72690. * a Point to convert.
  72691. * t Temporary data.
  72692. */
  72693. static void sp_256_proj_to_affine_8(sp_point_256* a, sp_digit* t)
  72694. {
  72695. sp_digit* t1 = t;
  72696. sp_digit* t2 = t + 2 * 8;
  72697. sp_digit* tmp = t + 4 * 8;
  72698. sp_256_mont_inv_8(t1, a->z, tmp);
  72699. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  72700. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  72701. sp_256_mont_mul_8(a->x, a->x, t2, p256_mod, p256_mp_mod);
  72702. sp_256_mont_mul_8(a->y, a->y, t1, p256_mod, p256_mp_mod);
  72703. XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod));
  72704. }
  72705. #endif /* FP_ECC */
  72706. /* A table entry for pre-computed points. */
  72707. typedef struct sp_table_entry_256 {
  72708. sp_digit x[8];
  72709. sp_digit y[8];
  72710. } sp_table_entry_256;
  72711. #ifdef FP_ECC
  72712. #endif /* FP_ECC */
  72713. /* Add two Montgomery form projective points. The second point has a q value of
  72714. * one.
  72715. * Only the first point can be the same pointer as the result point.
  72716. *
  72717. * r Result of addition.
  72718. * p First point to add.
  72719. * q Second point to add.
  72720. * t Temporary ordinate data.
  72721. */
  72722. static void sp_256_proj_point_add_qz1_8(sp_point_256* r,
  72723. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  72724. {
  72725. sp_digit* t2 = t;
  72726. sp_digit* t3 = t + 2*8;
  72727. sp_digit* t6 = t + 4*8;
  72728. sp_digit* t1 = t + 6*8;
  72729. sp_digit* t4 = t + 8*8;
  72730. sp_digit* t5 = t + 10*8;
  72731. /* Calculate values to subtract from P->x and P->y. */
  72732. /* U2 = X2*Z1^2 */
  72733. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  72734. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  72735. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  72736. /* S2 = Y2*Z1^3 */
  72737. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  72738. if ((~p->infinity) & (~q->infinity) &
  72739. sp_256_cmp_equal_8(p->x, t2) &
  72740. sp_256_cmp_equal_8(p->y, t4)) {
  72741. sp_256_proj_point_dbl_8(r, p, t);
  72742. }
  72743. else {
  72744. sp_digit* x = t2;
  72745. sp_digit* y = t3;
  72746. sp_digit* z = t6;
  72747. /* H = U2 - X1 */
  72748. sp_256_mont_sub_8(t2, t2, p->x, p256_mod);
  72749. /* R = S2 - Y1 */
  72750. sp_256_mont_sub_8(t4, t4, p->y, p256_mod);
  72751. /* Z3 = H*Z1 */
  72752. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  72753. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  72754. sp_256_mont_sqr_8(t1, t2, p256_mod, p256_mp_mod);
  72755. sp_256_mont_mul_8(t3, p->x, t1, p256_mod, p256_mp_mod);
  72756. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  72757. sp_256_mont_sqr_8(t2, t4, p256_mod, p256_mp_mod);
  72758. sp_256_mont_sub_8(t2, t2, t1, p256_mod);
  72759. sp_256_mont_dbl_8(t5, t3, p256_mod);
  72760. sp_256_mont_sub_8(x, t2, t5, p256_mod);
  72761. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  72762. sp_256_mont_sub_8(t3, t3, x, p256_mod);
  72763. sp_256_mont_mul_8(t3, t3, t4, p256_mod, p256_mp_mod);
  72764. sp_256_mont_mul_8(t1, t1, p->y, p256_mod, p256_mp_mod);
  72765. sp_256_mont_sub_8(y, t3, t1, p256_mod);
  72766. {
  72767. int i;
  72768. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  72769. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  72770. sp_digit maskt = ~(maskp | maskq);
  72771. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  72772. for (i = 0; i < 8; i++) {
  72773. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  72774. (x[i] & maskt);
  72775. }
  72776. for (i = 0; i < 8; i++) {
  72777. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  72778. (y[i] & maskt);
  72779. }
  72780. for (i = 0; i < 8; i++) {
  72781. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  72782. (z[i] & maskt);
  72783. }
  72784. r->z[0] |= inf;
  72785. r->infinity = (int)inf;
  72786. }
  72787. }
  72788. }
  72789. #ifdef WOLFSSL_SP_SMALL
  72790. #ifdef FP_ECC
  72791. /* Generate the pre-computed table of points for the base point.
  72792. *
  72793. * width = 4
  72794. * 16 entries
  72795. * 64 bits between
  72796. *
  72797. * a The base point.
  72798. * table Place to store generated point data.
  72799. * tmp Temporary data.
  72800. * heap Heap to use for allocation.
  72801. */
  72802. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  72803. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  72804. {
  72805. #ifdef WOLFSSL_SP_SMALL_STACK
  72806. sp_point_256* t = NULL;
  72807. #else
  72808. sp_point_256 t[3];
  72809. #endif
  72810. sp_point_256* s1 = NULL;
  72811. sp_point_256* s2 = NULL;
  72812. int i;
  72813. int j;
  72814. int err = MP_OKAY;
  72815. (void)heap;
  72816. #ifdef WOLFSSL_SP_SMALL_STACK
  72817. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  72818. DYNAMIC_TYPE_ECC);
  72819. if (t == NULL)
  72820. err = MEMORY_E;
  72821. #endif
  72822. if (err == MP_OKAY) {
  72823. s1 = t + 1;
  72824. s2 = t + 2;
  72825. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  72826. }
  72827. if (err == MP_OKAY) {
  72828. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  72829. }
  72830. if (err == MP_OKAY) {
  72831. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  72832. }
  72833. if (err == MP_OKAY) {
  72834. t->infinity = 0;
  72835. sp_256_proj_to_affine_8(t, tmp);
  72836. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  72837. s1->infinity = 0;
  72838. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  72839. s2->infinity = 0;
  72840. /* table[0] = {0, 0, infinity} */
  72841. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  72842. /* table[1] = Affine version of 'a' in Montgomery form */
  72843. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  72844. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  72845. for (i=1; i<4; i++) {
  72846. sp_256_proj_point_dbl_n_8(t, 64, tmp);
  72847. sp_256_proj_to_affine_8(t, tmp);
  72848. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  72849. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  72850. }
  72851. for (i=1; i<4; i++) {
  72852. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  72853. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  72854. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  72855. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  72856. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  72857. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  72858. sp_256_proj_to_affine_8(t, tmp);
  72859. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  72860. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  72861. }
  72862. }
  72863. }
  72864. #ifdef WOLFSSL_SP_SMALL_STACK
  72865. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  72866. #endif
  72867. return err;
  72868. }
  72869. #endif /* FP_ECC */
  72870. #ifndef WC_NO_CACHE_RESISTANT
  72871. /* Touch each possible entry that could be being copied.
  72872. *
  72873. * r Point to copy into.
  72874. * table Table - start of the entries to access
  72875. * idx Index of entry to retrieve.
  72876. */
  72877. static void sp_256_get_entry_16_8(sp_point_256* r,
  72878. const sp_table_entry_256* table, int idx)
  72879. {
  72880. int i;
  72881. sp_digit mask;
  72882. r->x[0] = 0;
  72883. r->x[1] = 0;
  72884. r->x[2] = 0;
  72885. r->x[3] = 0;
  72886. r->x[4] = 0;
  72887. r->x[5] = 0;
  72888. r->x[6] = 0;
  72889. r->x[7] = 0;
  72890. r->y[0] = 0;
  72891. r->y[1] = 0;
  72892. r->y[2] = 0;
  72893. r->y[3] = 0;
  72894. r->y[4] = 0;
  72895. r->y[5] = 0;
  72896. r->y[6] = 0;
  72897. r->y[7] = 0;
  72898. for (i = 1; i < 16; i++) {
  72899. mask = (sp_digit)0 - (i == idx);
  72900. r->x[0] |= mask & table[i].x[0];
  72901. r->x[1] |= mask & table[i].x[1];
  72902. r->x[2] |= mask & table[i].x[2];
  72903. r->x[3] |= mask & table[i].x[3];
  72904. r->x[4] |= mask & table[i].x[4];
  72905. r->x[5] |= mask & table[i].x[5];
  72906. r->x[6] |= mask & table[i].x[6];
  72907. r->x[7] |= mask & table[i].x[7];
  72908. r->y[0] |= mask & table[i].y[0];
  72909. r->y[1] |= mask & table[i].y[1];
  72910. r->y[2] |= mask & table[i].y[2];
  72911. r->y[3] |= mask & table[i].y[3];
  72912. r->y[4] |= mask & table[i].y[4];
  72913. r->y[5] |= mask & table[i].y[5];
  72914. r->y[6] |= mask & table[i].y[6];
  72915. r->y[7] |= mask & table[i].y[7];
  72916. }
  72917. }
  72918. #endif /* !WC_NO_CACHE_RESISTANT */
  72919. /* Multiply the point by the scalar and return the result.
  72920. * If map is true then convert result to affine coordinates.
  72921. *
  72922. * Stripe implementation.
  72923. * Pre-generated: 2^0, 2^64, ...
  72924. * Pre-generated: products of all combinations of above.
  72925. * 4 doubles and adds (with qz=1)
  72926. *
  72927. * r Resulting point.
  72928. * k Scalar to multiply by.
  72929. * table Pre-computed table.
  72930. * map Indicates whether to convert result to affine.
  72931. * ct Constant time required.
  72932. * heap Heap to use for allocation.
  72933. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  72934. */
  72935. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  72936. const sp_table_entry_256* table, const sp_digit* k, int map,
  72937. int ct, void* heap)
  72938. {
  72939. #ifdef WOLFSSL_SP_SMALL_STACK
  72940. sp_point_256* rt = NULL;
  72941. sp_digit* t = NULL;
  72942. #else
  72943. sp_point_256 rt[2];
  72944. sp_digit t[2 * 8 * 6];
  72945. #endif
  72946. sp_point_256* p = NULL;
  72947. int i;
  72948. int j;
  72949. int y;
  72950. int x;
  72951. int err = MP_OKAY;
  72952. (void)g;
  72953. /* Constant time used for cache attack resistance implementation. */
  72954. (void)ct;
  72955. (void)heap;
  72956. #ifdef WOLFSSL_SP_SMALL_STACK
  72957. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  72958. DYNAMIC_TYPE_ECC);
  72959. if (rt == NULL)
  72960. err = MEMORY_E;
  72961. if (err == MP_OKAY) {
  72962. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  72963. DYNAMIC_TYPE_ECC);
  72964. if (t == NULL)
  72965. err = MEMORY_E;
  72966. }
  72967. #endif
  72968. if (err == MP_OKAY) {
  72969. p = rt + 1;
  72970. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  72971. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  72972. y = 0;
  72973. x = 63;
  72974. for (j=0; j<4; j++) {
  72975. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  72976. x += 64;
  72977. }
  72978. #ifndef WC_NO_CACHE_RESISTANT
  72979. if (ct) {
  72980. sp_256_get_entry_16_8(rt, table, y);
  72981. } else
  72982. #endif
  72983. {
  72984. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  72985. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  72986. }
  72987. rt->infinity = !y;
  72988. for (i=62; i>=0; i--) {
  72989. y = 0;
  72990. x = i;
  72991. for (j=0; j<4; j++) {
  72992. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  72993. x += 64;
  72994. }
  72995. sp_256_proj_point_dbl_8(rt, rt, t);
  72996. #ifndef WC_NO_CACHE_RESISTANT
  72997. if (ct) {
  72998. sp_256_get_entry_16_8(p, table, y);
  72999. }
  73000. else
  73001. #endif
  73002. {
  73003. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  73004. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  73005. }
  73006. p->infinity = !y;
  73007. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  73008. }
  73009. if (map != 0) {
  73010. sp_256_map_8(r, rt, t);
  73011. }
  73012. else {
  73013. XMEMCPY(r, rt, sizeof(sp_point_256));
  73014. }
  73015. }
  73016. #ifdef WOLFSSL_SP_SMALL_STACK
  73017. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  73018. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  73019. #endif
  73020. return err;
  73021. }
  73022. #ifdef FP_ECC
  73023. #ifndef FP_ENTRIES
  73024. #define FP_ENTRIES 16
  73025. #endif
  73026. /* Cache entry - holds precomputation tables for a point. */
  73027. typedef struct sp_cache_256_t {
  73028. /* X ordinate of point that table was generated from. */
  73029. sp_digit x[8];
  73030. /* Y ordinate of point that table was generated from. */
  73031. sp_digit y[8];
  73032. /* Precomputation table for point. */
  73033. sp_table_entry_256 table[16];
  73034. /* Count of entries in table. */
  73035. uint32_t cnt;
  73036. /* Point and table set in entry. */
  73037. int set;
  73038. } sp_cache_256_t;
  73039. /* Cache of tables. */
  73040. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  73041. /* Index of last entry in cache. */
  73042. static THREAD_LS_T int sp_cache_256_last = -1;
  73043. /* Cache has been initialized. */
  73044. static THREAD_LS_T int sp_cache_256_inited = 0;
  73045. #ifndef HAVE_THREAD_LS
  73046. #ifndef WOLFSSL_MUTEX_INITIALIZER
  73047. static volatile int initCacheMutex_256 = 0;
  73048. #endif
  73049. static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock);
  73050. #endif
  73051. /* Get the cache entry for the point.
  73052. *
  73053. * g [in] Point scalar multiplying.
  73054. * cache [out] Cache table to use.
  73055. */
  73056. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  73057. {
  73058. int i;
  73059. int j;
  73060. uint32_t least;
  73061. if (sp_cache_256_inited == 0) {
  73062. for (i=0; i<FP_ENTRIES; i++) {
  73063. sp_cache_256[i].set = 0;
  73064. }
  73065. sp_cache_256_inited = 1;
  73066. }
  73067. /* Compare point with those in cache. */
  73068. for (i=0; i<FP_ENTRIES; i++) {
  73069. if (!sp_cache_256[i].set)
  73070. continue;
  73071. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  73072. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  73073. sp_cache_256[i].cnt++;
  73074. break;
  73075. }
  73076. }
  73077. /* No match. */
  73078. if (i == FP_ENTRIES) {
  73079. /* Find empty entry. */
  73080. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  73081. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  73082. if (!sp_cache_256[i].set) {
  73083. break;
  73084. }
  73085. }
  73086. /* Evict least used. */
  73087. if (i == sp_cache_256_last) {
  73088. least = sp_cache_256[0].cnt;
  73089. for (j=1; j<FP_ENTRIES; j++) {
  73090. if (sp_cache_256[j].cnt < least) {
  73091. i = j;
  73092. least = sp_cache_256[i].cnt;
  73093. }
  73094. }
  73095. }
  73096. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  73097. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  73098. sp_cache_256[i].set = 1;
  73099. sp_cache_256[i].cnt = 1;
  73100. }
  73101. *cache = &sp_cache_256[i];
  73102. sp_cache_256_last = i;
  73103. }
  73104. #endif /* FP_ECC */
  73105. /* Multiply the base point of P256 by the scalar and return the result.
  73106. * If map is true then convert result to affine coordinates.
  73107. *
  73108. * r Resulting point.
  73109. * g Point to multiply.
  73110. * k Scalar to multiply by.
  73111. * map Indicates whether to convert result to affine.
  73112. * ct Constant time required.
  73113. * heap Heap to use for allocation.
  73114. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73115. */
  73116. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g,
  73117. const sp_digit* k, int map, int ct, void* heap)
  73118. {
  73119. #ifndef FP_ECC
  73120. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  73121. #else
  73122. #ifdef WOLFSSL_SP_SMALL_STACK
  73123. sp_digit* tmp;
  73124. #else
  73125. sp_digit tmp[2 * 8 * 6];
  73126. #endif
  73127. sp_cache_256_t* cache;
  73128. int err = MP_OKAY;
  73129. #ifdef WOLFSSL_SP_SMALL_STACK
  73130. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap, DYNAMIC_TYPE_ECC);
  73131. if (tmp == NULL) {
  73132. err = MEMORY_E;
  73133. }
  73134. #endif
  73135. #ifndef HAVE_THREAD_LS
  73136. if (err == MP_OKAY) {
  73137. #ifndef WOLFSSL_MUTEX_INITIALIZER
  73138. if (initCacheMutex_256 == 0) {
  73139. wc_InitMutex(&sp_cache_256_lock);
  73140. initCacheMutex_256 = 1;
  73141. }
  73142. #endif
  73143. if (wc_LockMutex(&sp_cache_256_lock) != 0) {
  73144. err = BAD_MUTEX_E;
  73145. }
  73146. }
  73147. #endif /* HAVE_THREAD_LS */
  73148. if (err == MP_OKAY) {
  73149. sp_ecc_get_cache_256(g, &cache);
  73150. if (cache->cnt == 2)
  73151. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  73152. #ifndef HAVE_THREAD_LS
  73153. wc_UnLockMutex(&sp_cache_256_lock);
  73154. #endif /* HAVE_THREAD_LS */
  73155. if (cache->cnt < 2) {
  73156. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  73157. }
  73158. else {
  73159. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  73160. map, ct, heap);
  73161. }
  73162. }
  73163. #ifdef WOLFSSL_SP_SMALL_STACK
  73164. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  73165. #endif
  73166. return err;
  73167. #endif
  73168. }
  73169. #else
  73170. #ifdef FP_ECC
  73171. /* Generate the pre-computed table of points for the base point.
  73172. *
  73173. * width = 8
  73174. * 256 entries
  73175. * 32 bits between
  73176. *
  73177. * a The base point.
  73178. * table Place to store generated point data.
  73179. * tmp Temporary data.
  73180. * heap Heap to use for allocation.
  73181. */
  73182. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  73183. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  73184. {
  73185. #ifdef WOLFSSL_SP_SMALL_STACK
  73186. sp_point_256* t = NULL;
  73187. #else
  73188. sp_point_256 t[3];
  73189. #endif
  73190. sp_point_256* s1 = NULL;
  73191. sp_point_256* s2 = NULL;
  73192. int i;
  73193. int j;
  73194. int err = MP_OKAY;
  73195. (void)heap;
  73196. #ifdef WOLFSSL_SP_SMALL_STACK
  73197. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  73198. DYNAMIC_TYPE_ECC);
  73199. if (t == NULL)
  73200. err = MEMORY_E;
  73201. #endif
  73202. if (err == MP_OKAY) {
  73203. s1 = t + 1;
  73204. s2 = t + 2;
  73205. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  73206. }
  73207. if (err == MP_OKAY) {
  73208. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  73209. }
  73210. if (err == MP_OKAY) {
  73211. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  73212. }
  73213. if (err == MP_OKAY) {
  73214. t->infinity = 0;
  73215. sp_256_proj_to_affine_8(t, tmp);
  73216. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  73217. s1->infinity = 0;
  73218. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  73219. s2->infinity = 0;
  73220. /* table[0] = {0, 0, infinity} */
  73221. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  73222. /* table[1] = Affine version of 'a' in Montgomery form */
  73223. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  73224. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  73225. for (i=1; i<8; i++) {
  73226. sp_256_proj_point_dbl_n_8(t, 32, tmp);
  73227. sp_256_proj_to_affine_8(t, tmp);
  73228. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  73229. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  73230. }
  73231. for (i=1; i<8; i++) {
  73232. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  73233. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  73234. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  73235. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  73236. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  73237. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  73238. sp_256_proj_to_affine_8(t, tmp);
  73239. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  73240. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  73241. }
  73242. }
  73243. }
  73244. #ifdef WOLFSSL_SP_SMALL_STACK
  73245. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  73246. #endif
  73247. return err;
  73248. }
  73249. #endif /* FP_ECC */
  73250. #ifndef WC_NO_CACHE_RESISTANT
  73251. /* Touch each possible entry that could be being copied.
  73252. *
  73253. * r Point to copy into.
  73254. * table Table - start of the entries to access
  73255. * idx Index of entry to retrieve.
  73256. */
  73257. static void sp_256_get_entry_256_8(sp_point_256* r,
  73258. const sp_table_entry_256* table, int idx)
  73259. {
  73260. int i;
  73261. sp_digit mask;
  73262. r->x[0] = 0;
  73263. r->x[1] = 0;
  73264. r->x[2] = 0;
  73265. r->x[3] = 0;
  73266. r->x[4] = 0;
  73267. r->x[5] = 0;
  73268. r->x[6] = 0;
  73269. r->x[7] = 0;
  73270. r->y[0] = 0;
  73271. r->y[1] = 0;
  73272. r->y[2] = 0;
  73273. r->y[3] = 0;
  73274. r->y[4] = 0;
  73275. r->y[5] = 0;
  73276. r->y[6] = 0;
  73277. r->y[7] = 0;
  73278. for (i = 1; i < 256; i++) {
  73279. mask = (sp_digit)0 - (i == idx);
  73280. r->x[0] |= mask & table[i].x[0];
  73281. r->x[1] |= mask & table[i].x[1];
  73282. r->x[2] |= mask & table[i].x[2];
  73283. r->x[3] |= mask & table[i].x[3];
  73284. r->x[4] |= mask & table[i].x[4];
  73285. r->x[5] |= mask & table[i].x[5];
  73286. r->x[6] |= mask & table[i].x[6];
  73287. r->x[7] |= mask & table[i].x[7];
  73288. r->y[0] |= mask & table[i].y[0];
  73289. r->y[1] |= mask & table[i].y[1];
  73290. r->y[2] |= mask & table[i].y[2];
  73291. r->y[3] |= mask & table[i].y[3];
  73292. r->y[4] |= mask & table[i].y[4];
  73293. r->y[5] |= mask & table[i].y[5];
  73294. r->y[6] |= mask & table[i].y[6];
  73295. r->y[7] |= mask & table[i].y[7];
  73296. }
  73297. }
  73298. #endif /* !WC_NO_CACHE_RESISTANT */
  73299. /* Multiply the point by the scalar and return the result.
  73300. * If map is true then convert result to affine coordinates.
  73301. *
  73302. * Stripe implementation.
  73303. * Pre-generated: 2^0, 2^32, ...
  73304. * Pre-generated: products of all combinations of above.
  73305. * 8 doubles and adds (with qz=1)
  73306. *
  73307. * r Resulting point.
  73308. * k Scalar to multiply by.
  73309. * table Pre-computed table.
  73310. * map Indicates whether to convert result to affine.
  73311. * ct Constant time required.
  73312. * heap Heap to use for allocation.
  73313. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73314. */
  73315. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  73316. const sp_table_entry_256* table, const sp_digit* k, int map,
  73317. int ct, void* heap)
  73318. {
  73319. #ifdef WOLFSSL_SP_SMALL_STACK
  73320. sp_point_256* rt = NULL;
  73321. sp_digit* t = NULL;
  73322. #else
  73323. sp_point_256 rt[2];
  73324. sp_digit t[2 * 8 * 6];
  73325. #endif
  73326. sp_point_256* p = NULL;
  73327. int i;
  73328. int j;
  73329. int y;
  73330. int x;
  73331. int err = MP_OKAY;
  73332. (void)g;
  73333. /* Constant time used for cache attack resistance implementation. */
  73334. (void)ct;
  73335. (void)heap;
  73336. #ifdef WOLFSSL_SP_SMALL_STACK
  73337. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  73338. DYNAMIC_TYPE_ECC);
  73339. if (rt == NULL)
  73340. err = MEMORY_E;
  73341. if (err == MP_OKAY) {
  73342. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  73343. DYNAMIC_TYPE_ECC);
  73344. if (t == NULL)
  73345. err = MEMORY_E;
  73346. }
  73347. #endif
  73348. if (err == MP_OKAY) {
  73349. p = rt + 1;
  73350. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  73351. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  73352. y = 0;
  73353. x = 31;
  73354. for (j=0; j<8; j++) {
  73355. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  73356. x += 32;
  73357. }
  73358. #ifndef WC_NO_CACHE_RESISTANT
  73359. if (ct) {
  73360. sp_256_get_entry_256_8(rt, table, y);
  73361. } else
  73362. #endif
  73363. {
  73364. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  73365. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  73366. }
  73367. rt->infinity = !y;
  73368. for (i=30; i>=0; i--) {
  73369. y = 0;
  73370. x = i;
  73371. for (j=0; j<8; j++) {
  73372. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  73373. x += 32;
  73374. }
  73375. sp_256_proj_point_dbl_8(rt, rt, t);
  73376. #ifndef WC_NO_CACHE_RESISTANT
  73377. if (ct) {
  73378. sp_256_get_entry_256_8(p, table, y);
  73379. }
  73380. else
  73381. #endif
  73382. {
  73383. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  73384. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  73385. }
  73386. p->infinity = !y;
  73387. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  73388. }
  73389. if (map != 0) {
  73390. sp_256_map_8(r, rt, t);
  73391. }
  73392. else {
  73393. XMEMCPY(r, rt, sizeof(sp_point_256));
  73394. }
  73395. }
  73396. #ifdef WOLFSSL_SP_SMALL_STACK
  73397. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  73398. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  73399. #endif
  73400. return err;
  73401. }
  73402. #ifdef FP_ECC
  73403. #ifndef FP_ENTRIES
  73404. #define FP_ENTRIES 16
  73405. #endif
  73406. /* Cache entry - holds precomputation tables for a point. */
  73407. typedef struct sp_cache_256_t {
  73408. /* X ordinate of point that table was generated from. */
  73409. sp_digit x[8];
  73410. /* Y ordinate of point that table was generated from. */
  73411. sp_digit y[8];
  73412. /* Precomputation table for point. */
  73413. sp_table_entry_256 table[256];
  73414. /* Count of entries in table. */
  73415. uint32_t cnt;
  73416. /* Point and table set in entry. */
  73417. int set;
  73418. } sp_cache_256_t;
  73419. /* Cache of tables. */
  73420. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  73421. /* Index of last entry in cache. */
  73422. static THREAD_LS_T int sp_cache_256_last = -1;
  73423. /* Cache has been initialized. */
  73424. static THREAD_LS_T int sp_cache_256_inited = 0;
  73425. #ifndef HAVE_THREAD_LS
  73426. #ifndef WOLFSSL_MUTEX_INITIALIZER
  73427. static volatile int initCacheMutex_256 = 0;
  73428. #endif
  73429. static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock);
  73430. #endif
  73431. /* Get the cache entry for the point.
  73432. *
  73433. * g [in] Point scalar multiplying.
  73434. * cache [out] Cache table to use.
  73435. */
  73436. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  73437. {
  73438. int i;
  73439. int j;
  73440. uint32_t least;
  73441. if (sp_cache_256_inited == 0) {
  73442. for (i=0; i<FP_ENTRIES; i++) {
  73443. sp_cache_256[i].set = 0;
  73444. }
  73445. sp_cache_256_inited = 1;
  73446. }
  73447. /* Compare point with those in cache. */
  73448. for (i=0; i<FP_ENTRIES; i++) {
  73449. if (!sp_cache_256[i].set)
  73450. continue;
  73451. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  73452. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  73453. sp_cache_256[i].cnt++;
  73454. break;
  73455. }
  73456. }
  73457. /* No match. */
  73458. if (i == FP_ENTRIES) {
  73459. /* Find empty entry. */
  73460. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  73461. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  73462. if (!sp_cache_256[i].set) {
  73463. break;
  73464. }
  73465. }
  73466. /* Evict least used. */
  73467. if (i == sp_cache_256_last) {
  73468. least = sp_cache_256[0].cnt;
  73469. for (j=1; j<FP_ENTRIES; j++) {
  73470. if (sp_cache_256[j].cnt < least) {
  73471. i = j;
  73472. least = sp_cache_256[i].cnt;
  73473. }
  73474. }
  73475. }
  73476. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  73477. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  73478. sp_cache_256[i].set = 1;
  73479. sp_cache_256[i].cnt = 1;
  73480. }
  73481. *cache = &sp_cache_256[i];
  73482. sp_cache_256_last = i;
  73483. }
  73484. #endif /* FP_ECC */
  73485. /* Multiply the base point of P256 by the scalar and return the result.
  73486. * If map is true then convert result to affine coordinates.
  73487. *
  73488. * r Resulting point.
  73489. * g Point to multiply.
  73490. * k Scalar to multiply by.
  73491. * map Indicates whether to convert result to affine.
  73492. * ct Constant time required.
  73493. * heap Heap to use for allocation.
  73494. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73495. */
  73496. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g,
  73497. const sp_digit* k, int map, int ct, void* heap)
  73498. {
  73499. #ifndef FP_ECC
  73500. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  73501. #else
  73502. #ifdef WOLFSSL_SP_SMALL_STACK
  73503. sp_digit* tmp;
  73504. #else
  73505. sp_digit tmp[2 * 8 * 6];
  73506. #endif
  73507. sp_cache_256_t* cache;
  73508. int err = MP_OKAY;
  73509. #ifdef WOLFSSL_SP_SMALL_STACK
  73510. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap, DYNAMIC_TYPE_ECC);
  73511. if (tmp == NULL) {
  73512. err = MEMORY_E;
  73513. }
  73514. #endif
  73515. #ifndef HAVE_THREAD_LS
  73516. if (err == MP_OKAY) {
  73517. #ifndef WOLFSSL_MUTEX_INITIALIZER
  73518. if (initCacheMutex_256 == 0) {
  73519. wc_InitMutex(&sp_cache_256_lock);
  73520. initCacheMutex_256 = 1;
  73521. }
  73522. #endif
  73523. if (wc_LockMutex(&sp_cache_256_lock) != 0) {
  73524. err = BAD_MUTEX_E;
  73525. }
  73526. }
  73527. #endif /* HAVE_THREAD_LS */
  73528. if (err == MP_OKAY) {
  73529. sp_ecc_get_cache_256(g, &cache);
  73530. if (cache->cnt == 2)
  73531. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  73532. #ifndef HAVE_THREAD_LS
  73533. wc_UnLockMutex(&sp_cache_256_lock);
  73534. #endif /* HAVE_THREAD_LS */
  73535. if (cache->cnt < 2) {
  73536. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  73537. }
  73538. else {
  73539. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  73540. map, ct, heap);
  73541. }
  73542. }
  73543. #ifdef WOLFSSL_SP_SMALL_STACK
  73544. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  73545. #endif
  73546. return err;
  73547. #endif
  73548. }
  73549. #endif /* WOLFSSL_SP_SMALL */
  73550. /* Multiply the point by the scalar and return the result.
  73551. * If map is true then convert result to affine coordinates.
  73552. *
  73553. * km Scalar to multiply by.
  73554. * p Point to multiply.
  73555. * r Resulting point.
  73556. * map Indicates whether to convert result to affine.
  73557. * heap Heap to use for allocation.
  73558. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73559. */
  73560. int sp_ecc_mulmod_256(const mp_int* km, const ecc_point* gm, ecc_point* r,
  73561. int map, void* heap)
  73562. {
  73563. #ifdef WOLFSSL_SP_SMALL_STACK
  73564. sp_point_256* point = NULL;
  73565. sp_digit* k = NULL;
  73566. #else
  73567. sp_point_256 point[1];
  73568. sp_digit k[8];
  73569. #endif
  73570. int err = MP_OKAY;
  73571. #ifdef WOLFSSL_SP_SMALL_STACK
  73572. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  73573. DYNAMIC_TYPE_ECC);
  73574. if (point == NULL)
  73575. err = MEMORY_E;
  73576. if (err == MP_OKAY) {
  73577. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  73578. DYNAMIC_TYPE_ECC);
  73579. if (k == NULL)
  73580. err = MEMORY_E;
  73581. }
  73582. #endif
  73583. if (err == MP_OKAY) {
  73584. sp_256_from_mp(k, 8, km);
  73585. sp_256_point_from_ecc_point_8(point, gm);
  73586. err = sp_256_ecc_mulmod_8(point, point, k, map, 1, heap);
  73587. }
  73588. if (err == MP_OKAY) {
  73589. err = sp_256_point_to_ecc_point_8(point, r);
  73590. }
  73591. #ifdef WOLFSSL_SP_SMALL_STACK
  73592. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  73593. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  73594. #endif
  73595. return err;
  73596. }
  73597. /* Multiply the point by the scalar, add point a and return the result.
  73598. * If map is true then convert result to affine coordinates.
  73599. *
  73600. * km Scalar to multiply by.
  73601. * p Point to multiply.
  73602. * am Point to add to scalar multiply result.
  73603. * inMont Point to add is in montgomery form.
  73604. * r Resulting point.
  73605. * map Indicates whether to convert result to affine.
  73606. * heap Heap to use for allocation.
  73607. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73608. */
  73609. int sp_ecc_mulmod_add_256(const mp_int* km, const ecc_point* gm,
  73610. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  73611. {
  73612. #ifdef WOLFSSL_SP_SMALL_STACK
  73613. sp_point_256* point = NULL;
  73614. sp_digit* k = NULL;
  73615. #else
  73616. sp_point_256 point[2];
  73617. sp_digit k[8 + 8 * 2 * 6];
  73618. #endif
  73619. sp_point_256* addP = NULL;
  73620. sp_digit* tmp = NULL;
  73621. int err = MP_OKAY;
  73622. #ifdef WOLFSSL_SP_SMALL_STACK
  73623. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  73624. DYNAMIC_TYPE_ECC);
  73625. if (point == NULL)
  73626. err = MEMORY_E;
  73627. if (err == MP_OKAY) {
  73628. k = (sp_digit*)XMALLOC(
  73629. sizeof(sp_digit) * (8 + 8 * 2 * 6), heap,
  73630. DYNAMIC_TYPE_ECC);
  73631. if (k == NULL)
  73632. err = MEMORY_E;
  73633. }
  73634. #endif
  73635. if (err == MP_OKAY) {
  73636. addP = point + 1;
  73637. tmp = k + 8;
  73638. sp_256_from_mp(k, 8, km);
  73639. sp_256_point_from_ecc_point_8(point, gm);
  73640. sp_256_point_from_ecc_point_8(addP, am);
  73641. }
  73642. if ((err == MP_OKAY) && (!inMont)) {
  73643. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  73644. }
  73645. if ((err == MP_OKAY) && (!inMont)) {
  73646. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  73647. }
  73648. if ((err == MP_OKAY) && (!inMont)) {
  73649. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  73650. }
  73651. if (err == MP_OKAY) {
  73652. err = sp_256_ecc_mulmod_8(point, point, k, 0, 0, heap);
  73653. }
  73654. if (err == MP_OKAY) {
  73655. sp_256_proj_point_add_8(point, point, addP, tmp);
  73656. if (map) {
  73657. sp_256_map_8(point, point, tmp);
  73658. }
  73659. err = sp_256_point_to_ecc_point_8(point, r);
  73660. }
  73661. #ifdef WOLFSSL_SP_SMALL_STACK
  73662. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  73663. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  73664. #endif
  73665. return err;
  73666. }
  73667. #ifdef WOLFSSL_SP_SMALL
  73668. /* Striping precomputation table.
  73669. * 4 points combined into a table of 16 points.
  73670. * Distance of 64 between points.
  73671. */
  73672. static const sp_table_entry_256 p256_table[16] = {
  73673. /* 0 */
  73674. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  73675. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  73676. /* 1 */
  73677. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  73678. 0xa53755c6,0x18905f76 },
  73679. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  73680. 0x25885d85,0x8571ff18 } },
  73681. /* 2 */
  73682. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  73683. 0xfd1b667f,0x2f5e6961 },
  73684. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  73685. 0x8d6f0f7b,0xf648f916 } },
  73686. /* 3 */
  73687. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  73688. 0x133d0015,0x5abe0285 },
  73689. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  73690. 0x6b6f7383,0x94bb725b } },
  73691. /* 4 */
  73692. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  73693. 0x21d324f6,0x61d587d4 },
  73694. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  73695. 0x4621efbe,0xfa11fe12 } },
  73696. /* 5 */
  73697. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  73698. 0x1f13bedc,0x586eb04c },
  73699. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  73700. 0x70864f11,0x19d5ac08 } },
  73701. /* 6 */
  73702. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  73703. 0xc3b266b1,0xbb6de651 },
  73704. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  73705. 0x5d18b99b,0x60b4619a } },
  73706. /* 7 */
  73707. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  73708. 0xaeebffcd,0x9d0f27b2 },
  73709. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  73710. 0x356ec48d,0x244a566d } },
  73711. /* 8 */
  73712. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  73713. 0xcd42ab1b,0x803f3e02 },
  73714. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  73715. 0x5067adc1,0xc097440e } },
  73716. /* 9 */
  73717. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  73718. 0x915f1f30,0xf1af32d5 },
  73719. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  73720. 0xe2d41c8b,0x23d0f130 } },
  73721. /* 10 */
  73722. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  73723. 0x7990216a,0x50bbb4d9 },
  73724. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  73725. 0x01fe49c3,0x2b100118 } },
  73726. /* 11 */
  73727. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  73728. 0x83fbae0c,0xdd558999 },
  73729. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  73730. 0x149d6041,0xe6e4c551 } },
  73731. /* 12 */
  73732. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  73733. 0xdb7e63af,0xfad27148 },
  73734. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  73735. 0x9f0e1a84,0x77387de3 } },
  73736. /* 13 */
  73737. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  73738. 0xbef0c47e,0xb37b85c0 },
  73739. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  73740. 0xf9f628d5,0x9c135ac8 } },
  73741. /* 14 */
  73742. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  73743. 0x91ece900,0xc109f9cb },
  73744. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  73745. 0x2eee1ee1,0x9bc3344f } },
  73746. /* 15 */
  73747. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  73748. 0x5f1a4cc1,0x29591d52 },
  73749. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  73750. 0x18ef332c,0x6376551f } },
  73751. };
  73752. /* Multiply the base point of P256 by the scalar and return the result.
  73753. * If map is true then convert result to affine coordinates.
  73754. *
  73755. * Stripe implementation.
  73756. * Pre-generated: 2^0, 2^64, ...
  73757. * Pre-generated: products of all combinations of above.
  73758. * 4 doubles and adds (with qz=1)
  73759. *
  73760. * r Resulting point.
  73761. * k Scalar to multiply by.
  73762. * map Indicates whether to convert result to affine.
  73763. * ct Constant time required.
  73764. * heap Heap to use for allocation.
  73765. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73766. */
  73767. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  73768. int map, int ct, void* heap)
  73769. {
  73770. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  73771. k, map, ct, heap);
  73772. }
  73773. #else
  73774. /* Striping precomputation table.
  73775. * 8 points combined into a table of 256 points.
  73776. * Distance of 32 between points.
  73777. */
  73778. static const sp_table_entry_256 p256_table[256] = {
  73779. /* 0 */
  73780. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  73781. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  73782. /* 1 */
  73783. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  73784. 0xa53755c6,0x18905f76 },
  73785. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  73786. 0x25885d85,0x8571ff18 } },
  73787. /* 2 */
  73788. { { 0x4147519a,0x20288602,0x26b372f0,0xd0981eac,0xa785ebc8,0xa9d4a7ca,
  73789. 0xdbdf58e9,0xd953c50d },
  73790. { 0xfd590f8f,0x9d6361cc,0x44e6c917,0x72e9626b,0x22eb64cf,0x7fd96110,
  73791. 0x9eb288f3,0x863ebb7e } },
  73792. /* 3 */
  73793. { { 0x5cdb6485,0x7856b623,0x2f0a2f97,0x808f0ea2,0x4f7e300b,0x3e68d954,
  73794. 0xb5ff80a0,0x00076055 },
  73795. { 0x838d2010,0x7634eb9b,0x3243708a,0x54014fbb,0x842a6606,0xe0e47d39,
  73796. 0x34373ee0,0x83087761 } },
  73797. /* 4 */
  73798. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  73799. 0xfd1b667f,0x2f5e6961 },
  73800. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  73801. 0x8d6f0f7b,0xf648f916 } },
  73802. /* 5 */
  73803. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  73804. 0x133d0015,0x5abe0285 },
  73805. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  73806. 0x6b6f7383,0x94bb725b } },
  73807. /* 6 */
  73808. { { 0x720f141c,0xbbf9b48f,0x2df5bc74,0x6199b3cd,0x411045c4,0xdc3f6129,
  73809. 0x2f7dc4ef,0xcdd6bbcb },
  73810. { 0xeaf436fd,0xcca6700b,0xb99326be,0x6f647f6d,0x014f2522,0x0c0fa792,
  73811. 0x4bdae5f6,0xa361bebd } },
  73812. /* 7 */
  73813. { { 0x597c13c7,0x28aa2558,0x50b7c3e1,0xc38d635f,0xf3c09d1d,0x07039aec,
  73814. 0xc4b5292c,0xba12ca09 },
  73815. { 0x59f91dfd,0x9e408fa4,0xceea07fb,0x3af43b66,0x9d780b29,0x1eceb089,
  73816. 0x701fef4b,0x53ebb99d } },
  73817. /* 8 */
  73818. { { 0xb0e63d34,0x4fe7ee31,0xa9e54fab,0xf4600572,0xd5e7b5a4,0xc0493334,
  73819. 0x06d54831,0x8589fb92 },
  73820. { 0x6583553a,0xaa70f5cc,0xe25649e5,0x0879094a,0x10044652,0xcc904507,
  73821. 0x02541c4f,0xebb0696d } },
  73822. /* 9 */
  73823. { { 0xac1647c5,0x4616ca15,0xc4cf5799,0xb8127d47,0x764dfbac,0xdc666aa3,
  73824. 0xd1b27da3,0xeb2820cb },
  73825. { 0x6a87e008,0x9406f8d8,0x922378f3,0xd87dfa9d,0x80ccecb2,0x56ed2e42,
  73826. 0x55a7da1d,0x1f28289b } },
  73827. /* 10 */
  73828. { { 0x3b89da99,0xabbaa0c0,0xb8284022,0xa6f2d79e,0xb81c05e8,0x27847862,
  73829. 0x05e54d63,0x337a4b59 },
  73830. { 0x21f7794a,0x3c67500d,0x7d6d7f61,0x207005b7,0x04cfd6e8,0x0a5a3781,
  73831. 0xf4c2fbd6,0x0d65e0d5 } },
  73832. /* 11 */
  73833. { { 0xb5275d38,0xd9d09bbe,0x0be0a358,0x4268a745,0x973eb265,0xf0762ff4,
  73834. 0x52f4a232,0xc23da242 },
  73835. { 0x0b94520c,0x5da1b84f,0xb05bd78e,0x09666763,0x94d29ea1,0x3a4dcb86,
  73836. 0xc790cff1,0x19de3b8c } },
  73837. /* 12 */
  73838. { { 0x26c5fe04,0x183a716c,0x3bba1bdb,0x3b28de0b,0xa4cb712c,0x7432c586,
  73839. 0x91fccbfd,0xe34dcbd4 },
  73840. { 0xaaa58403,0xb408d46b,0x82e97a53,0x9a697486,0x36aaa8af,0x9e390127,
  73841. 0x7b4e0f7f,0xe7641f44 } },
  73842. /* 13 */
  73843. { { 0xdf64ba59,0x7d753941,0x0b0242fc,0xd33f10ec,0xa1581859,0x4f06dfc6,
  73844. 0x052a57bf,0x4a12df57 },
  73845. { 0x9439dbd0,0xbfa6338f,0xbde53e1f,0xd3c24bd4,0x21f1b314,0xfd5e4ffa,
  73846. 0xbb5bea46,0x6af5aa93 } },
  73847. /* 14 */
  73848. { { 0x10c91999,0xda10b699,0x2a580491,0x0a24b440,0xb8cc2090,0x3e0094b4,
  73849. 0x66a44013,0x5fe3475a },
  73850. { 0xf93e7b4b,0xb0f8cabd,0x7c23f91a,0x292b501a,0xcd1e6263,0x42e889ae,
  73851. 0xecfea916,0xb544e308 } },
  73852. /* 15 */
  73853. { { 0x16ddfdce,0x6478c6e9,0xf89179e6,0x2c329166,0x4d4e67e1,0x4e8d6e76,
  73854. 0xa6b0c20b,0xe0b6b2bd },
  73855. { 0xbb7efb57,0x0d312df2,0x790c4007,0x1aac0dde,0x679bc944,0xf90336ad,
  73856. 0x25a63774,0x71c023de } },
  73857. /* 16 */
  73858. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  73859. 0x21d324f6,0x61d587d4 },
  73860. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  73861. 0x4621efbe,0xfa11fe12 } },
  73862. /* 17 */
  73863. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  73864. 0x1f13bedc,0x586eb04c },
  73865. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  73866. 0x70864f11,0x19d5ac08 } },
  73867. /* 18 */
  73868. { { 0x309a4e1f,0x1e99f581,0xe9270074,0xab7de71b,0xefd28d20,0x26a5ef0b,
  73869. 0x7f9c563f,0xe7c0073f },
  73870. { 0x0ef59f76,0x1f6d663a,0x20fcb050,0x669b3b54,0x7a6602d4,0xc08c1f7a,
  73871. 0xc65b3c0a,0xe08504fe } },
  73872. /* 19 */
  73873. { { 0xa031b3ca,0xf098f68d,0xe6da6d66,0x6d1cab9e,0x94f246e8,0x5bfd81fa,
  73874. 0x5b0996b4,0x78f01882 },
  73875. { 0x3a25787f,0xb7eefde4,0x1dccac9b,0x8016f80d,0xb35bfc36,0x0cea4877,
  73876. 0x7e94747a,0x43a773b8 } },
  73877. /* 20 */
  73878. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  73879. 0xc3b266b1,0xbb6de651 },
  73880. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  73881. 0x5d18b99b,0x60b4619a } },
  73882. /* 21 */
  73883. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  73884. 0xaeebffcd,0x9d0f27b2 },
  73885. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  73886. 0x356ec48d,0x244a566d } },
  73887. /* 22 */
  73888. { { 0xeacf1f96,0x6db0394a,0x024c271c,0x9f2122a9,0x82cbd3b9,0x2626ac1b,
  73889. 0x3581ef69,0x45e58c87 },
  73890. { 0xa38f9dbc,0xd3ff479d,0xe888a040,0xa8aaf146,0x46e0bed7,0x945adfb2,
  73891. 0xc1e4b7a4,0xc040e21c } },
  73892. /* 23 */
  73893. { { 0x6f8117b6,0x847af000,0x73a35433,0x651969ff,0x1d9475eb,0x482b3576,
  73894. 0x682c6ec7,0x1cdf5c97 },
  73895. { 0x11f04839,0x7db775b4,0x48de1698,0x7dbeacf4,0xb70b3219,0xb2921dd1,
  73896. 0xa92dff3d,0x046755f8 } },
  73897. /* 24 */
  73898. { { 0xbce8ffcd,0xcc8ac5d2,0x2fe61a82,0x0d53c48b,0x7202d6c7,0xf6f16172,
  73899. 0x3b83a5f3,0x046e5e11 },
  73900. { 0xd8007f01,0xe7b8ff64,0x5af43183,0x7fb1ef12,0x35e1a03c,0x045c5ea6,
  73901. 0x303d005b,0x6e0106c3 } },
  73902. /* 25 */
  73903. { { 0x88dd73b1,0x48c73584,0x995ed0d9,0x7670708f,0xc56a2ab7,0x38385ea8,
  73904. 0xe901cf1f,0x442594ed },
  73905. { 0x12d4b65b,0xf8faa2c9,0x96c90c37,0x94c2343b,0x5e978d1f,0xd326e4a1,
  73906. 0x4c2ee68e,0xa796fa51 } },
  73907. /* 26 */
  73908. { { 0x823addd7,0x359fb604,0xe56693b3,0x9e2a6183,0x3cbf3c80,0xf885b78e,
  73909. 0xc69766e9,0xe4ad2da9 },
  73910. { 0x8e048a61,0x357f7f42,0xc092d9a0,0x082d198c,0xc03ed8ef,0xfc3a1af4,
  73911. 0xc37b5143,0xc5e94046 } },
  73912. /* 27 */
  73913. { { 0x2be75f9e,0x476a538c,0xcb123a78,0x6fd1a9e8,0xb109c04b,0xd85e4df0,
  73914. 0xdb464747,0x63283daf },
  73915. { 0xbaf2df15,0xce728cf7,0x0ad9a7f4,0xe592c455,0xe834bcc3,0xfab226ad,
  73916. 0x1981a938,0x68bd19ab } },
  73917. /* 28 */
  73918. { { 0x1887d659,0xc08ead51,0xb359305a,0x3374d5f4,0xcfe74fe3,0x96986981,
  73919. 0x3c6fdfd6,0x495292f5 },
  73920. { 0x1acec896,0x4a878c9e,0xec5b4484,0xd964b210,0x664d60a7,0x6696f7e2,
  73921. 0x26036837,0x0ec7530d } },
  73922. /* 29 */
  73923. { { 0xad2687bb,0x2da13a05,0xf32e21fa,0xa1f83b6a,0x1dd4607b,0x390f5ef5,
  73924. 0x64863f0b,0x0f6207a6 },
  73925. { 0x0f138233,0xbd67e3bb,0x272aa718,0xdd66b96c,0x26ec88ae,0x8ed00407,
  73926. 0x08ed6dcf,0xff0db072 } },
  73927. /* 30 */
  73928. { { 0x4c95d553,0x749fa101,0x5d680a8a,0xa44052fd,0xff3b566f,0x183b4317,
  73929. 0x88740ea3,0x313b513c },
  73930. { 0x08d11549,0xb402e2ac,0xb4dee21c,0x071ee10b,0x47f2320e,0x26b987dd,
  73931. 0x86f19f81,0x2d3abcf9 } },
  73932. /* 31 */
  73933. { { 0x815581a2,0x4c288501,0x632211af,0x9a0a6d56,0x0cab2e99,0x19ba7a0f,
  73934. 0xded98cdf,0xc036fa10 },
  73935. { 0xc1fbd009,0x29ae08ba,0x06d15816,0x0b68b190,0x9b9e0d8f,0xc2eb3277,
  73936. 0xb6d40194,0xa6b2a2c4 } },
  73937. /* 32 */
  73938. { { 0x6d3549cf,0xd433e50f,0xfacd665e,0x6f33696f,0xce11fcb4,0x695bfdac,
  73939. 0xaf7c9860,0x810ee252 },
  73940. { 0x7159bb2c,0x65450fe1,0x758b357b,0xf7dfbebe,0xd69fea72,0x2b057e74,
  73941. 0x92731745,0xd485717a } },
  73942. /* 33 */
  73943. { { 0xf0cb5a98,0x11741a8a,0x1f3110bf,0xd3da8f93,0xab382adf,0x1994e2cb,
  73944. 0x2f9a604e,0x6a6045a7 },
  73945. { 0xa2b2411d,0x170c0d3f,0x510e96e0,0xbe0eb83e,0x8865b3cc,0x3bcc9f73,
  73946. 0xf9e15790,0xd3e45cfa } },
  73947. /* 34 */
  73948. { { 0xe83f7669,0xce1f69bb,0x72877d6b,0x09f8ae82,0x3244278d,0x9548ae54,
  73949. 0xe3c2c19c,0x207755de },
  73950. { 0x6fef1945,0x87bd61d9,0xb12d28c3,0x18813cef,0x72df64aa,0x9fbcd1d6,
  73951. 0x7154b00d,0x48dc5ee5 } },
  73952. /* 35 */
  73953. { { 0xf7e5a199,0x123790bf,0x989ccbb7,0xe0efb8cf,0x0a519c79,0xc27a2bfe,
  73954. 0xdff6f445,0xf2fb0aed },
  73955. { 0xf0b5025f,0x41c09575,0x40fa9f22,0x550543d7,0x380bfbd0,0x8fa3c8ad,
  73956. 0xdb28d525,0xa13e9015 } },
  73957. /* 36 */
  73958. { { 0xa2b65cbc,0xf9f7a350,0x2a464226,0x0b04b972,0xe23f07a1,0x265ce241,
  73959. 0x1497526f,0x2bf0d6b0 },
  73960. { 0x4b216fb7,0xd3d4dd3f,0xfbdda26a,0xf7d7b867,0x6708505c,0xaeb7b83f,
  73961. 0x162fe89f,0x42a94a5a } },
  73962. /* 37 */
  73963. { { 0xeaadf191,0x5846ad0b,0x25a268d7,0x0f8a4890,0x494dc1f6,0xe8603050,
  73964. 0xc65ede3d,0x2c2dd969 },
  73965. { 0x93849c17,0x6d02171d,0x1da250dd,0x460488ba,0x3c3a5485,0x4810c706,
  73966. 0x42c56dbc,0xf437fa1f } },
  73967. /* 38 */
  73968. { { 0x4a0f7dab,0x6aa0d714,0x1776e9ac,0x0f049793,0xf5f39786,0x52c0a050,
  73969. 0x54707aa8,0xaaf45b33 },
  73970. { 0xc18d364a,0x85e37c33,0x3e497165,0xd40b9b06,0x15ec5444,0xf4171681,
  73971. 0xf4f272bc,0xcdf6310d } },
  73972. /* 39 */
  73973. { { 0x8ea8b7ef,0x7473c623,0x85bc2287,0x08e93518,0x2bda8e34,0x41956772,
  73974. 0xda9e2ff2,0xf0d008ba },
  73975. { 0x2414d3b1,0x2912671d,0xb019ea76,0xb3754985,0x453bcbdb,0x5c61b96d,
  73976. 0xca887b8b,0x5bd5c2f5 } },
  73977. /* 40 */
  73978. { { 0xf49a3154,0xef0f469e,0x6e2b2e9a,0x3e85a595,0xaa924a9c,0x45aaec1e,
  73979. 0xa09e4719,0xaa12dfc8 },
  73980. { 0x4df69f1d,0x26f27227,0xa2ff5e73,0xe0e4c82c,0xb7a9dd44,0xb9d8ce73,
  73981. 0xe48ca901,0x6c036e73 } },
  73982. /* 41 */
  73983. { { 0x0f6e3138,0x5cfae12a,0x25ad345a,0x6966ef00,0x45672bc5,0x8993c64b,
  73984. 0x96afbe24,0x292ff658 },
  73985. { 0x5e213402,0xd5250d44,0x4392c9fe,0xf6580e27,0xda1c72e8,0x097b397f,
  73986. 0x311b7276,0x644e0c90 } },
  73987. /* 42 */
  73988. { { 0xa47153f0,0xe1e421e1,0x920418c9,0xb86c3b79,0x705d7672,0x93bdce87,
  73989. 0xcab79a77,0xf25ae793 },
  73990. { 0x6d869d0c,0x1f3194a3,0x4986c264,0x9d55c882,0x096e945e,0x49fb5ea3,
  73991. 0x13db0a3e,0x39b8e653 } },
  73992. /* 43 */
  73993. { { 0xb6fd2e59,0x37754200,0x9255c98f,0x35e2c066,0x0e2a5739,0xd9dab21a,
  73994. 0x0f19db06,0x39122f2f },
  73995. { 0x03cad53c,0xcfbce1e0,0xe65c17e3,0x225b2c0f,0x9aa13877,0x72baf1d2,
  73996. 0xce80ff8d,0x8de80af8 } },
  73997. /* 44 */
  73998. { { 0x207bbb76,0xafbea8d9,0x21782758,0x921c7e7c,0x1c0436b1,0xdfa2b74b,
  73999. 0x2e368c04,0x87194906 },
  74000. { 0xa3993df5,0xb5f928bb,0xf3b3d26a,0x639d75b5,0x85b55050,0x011aa78a,
  74001. 0x5b74fde1,0xfc315e6a } },
  74002. /* 45 */
  74003. { { 0xe8d6ecfa,0x561fd41a,0x1aec7f86,0x5f8c44f6,0x4924741d,0x98452a7b,
  74004. 0xee389088,0xe6d4a7ad },
  74005. { 0x4593c75d,0x60552ed1,0xdd271162,0x70a70da4,0x7ba2c7db,0xd2aede93,
  74006. 0x9be2ae57,0x35dfaf9a } },
  74007. /* 46 */
  74008. { { 0xaa736636,0x6b956fcd,0xae2cab7e,0x09f51d97,0x0f349966,0xfb10bf41,
  74009. 0x1c830d2b,0x1da5c7d7 },
  74010. { 0x3cce6825,0x5c41e483,0xf9573c3b,0x15ad118f,0xf23036b8,0xa28552c7,
  74011. 0xdbf4b9d6,0x7077c0fd } },
  74012. /* 47 */
  74013. { { 0x46b9661c,0xbf63ff8d,0x0d2cfd71,0xa1dfd36b,0xa847f8f7,0x0373e140,
  74014. 0xe50efe44,0x53a8632e },
  74015. { 0x696d8051,0x0976ff68,0xc74f468a,0xdaec0c95,0x5e4e26bd,0x62994dc3,
  74016. 0x34e1fcc1,0x028ca76d } },
  74017. /* 48 */
  74018. { { 0xfc9877ee,0xd11d47dc,0x801d0002,0xc8b36210,0x54c260b6,0xd002c117,
  74019. 0x6962f046,0x04c17cd8 },
  74020. { 0xb0daddf5,0x6d9bd094,0x24ce55c0,0xbea23575,0x72da03b5,0x663356e6,
  74021. 0xfed97474,0xf7ba4de9 } },
  74022. /* 49 */
  74023. { { 0xebe1263f,0xd0dbfa34,0x71ae7ce6,0x55763735,0x82a6f523,0xd2440553,
  74024. 0x52131c41,0xe31f9600 },
  74025. { 0xea6b6ec6,0xd1bb9216,0x73c2fc44,0x37a1d12e,0x89d0a294,0xc10e7eac,
  74026. 0xce34d47b,0xaa3a6259 } },
  74027. /* 50 */
  74028. { { 0x36f3dcd3,0xfbcf9df5,0xd2bf7360,0x6ceded50,0xdf504f5b,0x491710fa,
  74029. 0x7e79daee,0x2398dd62 },
  74030. { 0x6d09569e,0xcf4705a3,0x5149f769,0xea0619bb,0x35f6034c,0xff9c0377,
  74031. 0x1c046210,0x5717f5b2 } },
  74032. /* 51 */
  74033. { { 0x21dd895e,0x9fe229c9,0x40c28451,0x8e518500,0x1d637ecd,0xfa13d239,
  74034. 0x0e3c28de,0x660a2c56 },
  74035. { 0xd67fcbd0,0x9cca88ae,0x0ea9f096,0xc8472478,0x72e92b4d,0x32b2f481,
  74036. 0x4f522453,0x624ee54c } },
  74037. /* 52 */
  74038. { { 0xd897eccc,0x09549ce4,0x3f9880aa,0x4d49d1d9,0x043a7c20,0x723c2423,
  74039. 0x92bdfbc0,0x4f392afb },
  74040. { 0x7de44fd9,0x6969f8fa,0x57b32156,0xb66cfbe4,0x368ebc3c,0xdb2fa803,
  74041. 0xccdb399c,0x8a3e7977 } },
  74042. /* 53 */
  74043. { { 0x06c4b125,0xdde1881f,0xf6e3ca8c,0xae34e300,0x5c7a13e9,0xef6999de,
  74044. 0x70c24404,0x3888d023 },
  74045. { 0x44f91081,0x76280356,0x5f015504,0x3d9fcf61,0x632cd36e,0x1827edc8,
  74046. 0x18102336,0xa5e62e47 } },
  74047. /* 54 */
  74048. { { 0x2facd6c8,0x1a825ee3,0x54bcbc66,0x699c6354,0x98df9931,0x0ce3edf7,
  74049. 0x466a5adc,0x2c4768e6 },
  74050. { 0x90a64bc9,0xb346ff8c,0xe4779f5c,0x630a6020,0xbc05e884,0xd949d064,
  74051. 0xf9e652a0,0x7b5e6441 } },
  74052. /* 55 */
  74053. { { 0x1d28444a,0x2169422c,0xbe136a39,0xe996c5d8,0xfb0c7fce,0x2387afe5,
  74054. 0x0c8d744a,0xb8af73cb },
  74055. { 0x338b86fd,0x5fde83aa,0xa58a5cff,0xfee3f158,0x20ac9433,0xc9ee8f6f,
  74056. 0x7f3f0895,0xa036395f } },
  74057. /* 56 */
  74058. { { 0xa10f7770,0x8c73c6bb,0xa12a0e24,0xa6f16d81,0x51bc2b9f,0x100df682,
  74059. 0x875fb533,0x4be36b01 },
  74060. { 0x9fb56dbb,0x9226086e,0x07e7a4f8,0x306fef8b,0x66d52f20,0xeeaccc05,
  74061. 0x1bdc00c0,0x8cbc9a87 } },
  74062. /* 57 */
  74063. { { 0xc0dac4ab,0xe131895c,0x712ff112,0xa874a440,0x6a1cee57,0x6332ae7c,
  74064. 0x0c0835f8,0x44e7553e },
  74065. { 0x7734002d,0x6d503fff,0x0b34425c,0x9d35cb8b,0x0e8738b5,0x95f70276,
  74066. 0x5eb8fc18,0x470a683a } },
  74067. /* 58 */
  74068. { { 0x90513482,0x81b761dc,0x01e9276a,0x0287202a,0x0ce73083,0xcda441ee,
  74069. 0xc63dc6ef,0x16410690 },
  74070. { 0x6d06a2ed,0xf5034a06,0x189b100b,0xdd4d7745,0xab8218c9,0xd914ae72,
  74071. 0x7abcbb4f,0xd73479fd } },
  74072. /* 59 */
  74073. { { 0x5ad4c6e5,0x7edefb16,0x5b06d04d,0x262cf08f,0x8575cb14,0x12ed5bb1,
  74074. 0x0771666b,0x816469e3 },
  74075. { 0x561e291e,0xd7ab9d79,0xc1de1661,0xeb9daf22,0x135e0513,0xf49827eb,
  74076. 0xf0dd3f9c,0x0a36dd23 } },
  74077. /* 60 */
  74078. { { 0x41d5533c,0x098d32c7,0x8684628f,0x7c5f5a9e,0xe349bd11,0x39a228ad,
  74079. 0xfdbab118,0xe331dfd6 },
  74080. { 0x6bcc6ed8,0x5100ab68,0xef7a260e,0x7160c3bd,0xbce850d7,0x9063d9a7,
  74081. 0x492e3389,0xd3b4782a } },
  74082. /* 61 */
  74083. { { 0xf3821f90,0xa149b6e8,0x66eb7aad,0x92edd9ed,0x1a013116,0x0bb66953,
  74084. 0x4c86a5bd,0x7281275a },
  74085. { 0xd3ff47e5,0x503858f7,0x61016441,0x5e1616bc,0x7dfd9bb1,0x62b0f11a,
  74086. 0xce145059,0x2c062e7e } },
  74087. /* 62 */
  74088. { { 0x0159ac2e,0xa76f996f,0xcbdb2713,0x281e7736,0x08e46047,0x2ad6d288,
  74089. 0x2c4e7ef1,0x282a35f9 },
  74090. { 0xc0ce5cd2,0x9c354b1e,0x1379c229,0xcf99efc9,0x3e82c11e,0x992caf38,
  74091. 0x554d2abd,0xc71cd513 } },
  74092. /* 63 */
  74093. { { 0x09b578f4,0x4885de9c,0xe3affa7a,0x1884e258,0x59182f1f,0x8f76b1b7,
  74094. 0xcf47f3a3,0xc50f6740 },
  74095. { 0x374b68ea,0xa9c4adf3,0x69965fe2,0xa406f323,0x85a53050,0x2f86a222,
  74096. 0x212958dc,0xb9ecb3a7 } },
  74097. /* 64 */
  74098. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  74099. 0xcd42ab1b,0x803f3e02 },
  74100. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  74101. 0x5067adc1,0xc097440e } },
  74102. /* 65 */
  74103. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  74104. 0x915f1f30,0xf1af32d5 },
  74105. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  74106. 0xe2d41c8b,0x23d0f130 } },
  74107. /* 66 */
  74108. { { 0xf41500d9,0x857ab6ed,0xfcbeada8,0x0d890ae5,0x89725951,0x52fe8648,
  74109. 0xc0a3fadd,0xb0288dd6 },
  74110. { 0x650bcb08,0x85320f30,0x695d6e16,0x71af6313,0xb989aa76,0x31f520a7,
  74111. 0xf408c8d2,0xffd3724f } },
  74112. /* 67 */
  74113. { { 0xb458e6cb,0x53968e64,0x317a5d28,0x992dad20,0x7aa75f56,0x3814ae0b,
  74114. 0xd78c26df,0xf5590f4a },
  74115. { 0xcf0ba55a,0x0fc24bd3,0x0c778bae,0x0fc4724a,0x683b674a,0x1ce9864f,
  74116. 0xf6f74a20,0x18d6da54 } },
  74117. /* 68 */
  74118. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  74119. 0x7990216a,0x50bbb4d9 },
  74120. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  74121. 0x01fe49c3,0x2b100118 } },
  74122. /* 69 */
  74123. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  74124. 0x83fbae0c,0xdd558999 },
  74125. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  74126. 0x149d6041,0xe6e4c551 } },
  74127. /* 70 */
  74128. { { 0x1e9af288,0x55f655bb,0xf7ada931,0x647e1a64,0xcb2820e5,0x43697e4b,
  74129. 0x07ed56ff,0x51e00db1 },
  74130. { 0x771c327e,0x43d169b8,0x4a96c2ad,0x29cdb20b,0x3deb4779,0xc07d51f5,
  74131. 0x49829177,0xe22f4241 } },
  74132. /* 71 */
  74133. { { 0x635f1abb,0xcd45e8f4,0x68538874,0x7edc0cb5,0xb5a8034d,0xc9472c1f,
  74134. 0x52dc48c9,0xf709373d },
  74135. { 0xa8af30d6,0x401966bb,0xf137b69c,0x95bf5f4a,0x9361c47e,0x3966162a,
  74136. 0xe7275b11,0xbd52d288 } },
  74137. /* 72 */
  74138. { { 0x9c5fa877,0xab155c7a,0x7d3a3d48,0x17dad672,0x73d189d8,0x43f43f9e,
  74139. 0xc8aa77a6,0xa0d0f8e4 },
  74140. { 0xcc94f92d,0x0bbeafd8,0x0c4ddb3a,0xd818c8be,0xb82eba14,0x22cc65f8,
  74141. 0x946d6a00,0xa56c78c7 } },
  74142. /* 73 */
  74143. { { 0x0dd09529,0x2962391b,0x3daddfcf,0x803e0ea6,0x5b5bf481,0x2c77351f,
  74144. 0x731a367a,0xd8befdf8 },
  74145. { 0xfc0157f4,0xab919d42,0xfec8e650,0xf51caed7,0x02d48b0a,0xcdf9cb40,
  74146. 0xce9f6478,0x854a68a5 } },
  74147. /* 74 */
  74148. { { 0x63506ea5,0xdc35f67b,0xa4fe0d66,0x9286c489,0xfe95cd4d,0x3f101d3b,
  74149. 0x98846a95,0x5cacea0b },
  74150. { 0x9ceac44d,0xa90df60c,0x354d1c3a,0x3db29af4,0xad5dbabe,0x08dd3de8,
  74151. 0x35e4efa9,0xe4982d12 } },
  74152. /* 75 */
  74153. { { 0xc34cd55e,0x23104a22,0x2680d132,0x58695bb3,0x1fa1d943,0xfb345afa,
  74154. 0x16b20499,0x8046b7f6 },
  74155. { 0x38e7d098,0xb533581e,0xf46f0b70,0xd7f61e8d,0x44cb78c4,0x30dea9ea,
  74156. 0x9082af55,0xeb17ca7b } },
  74157. /* 76 */
  74158. { { 0x76a145b9,0x1751b598,0xc1bc71ec,0xa5cf6b0f,0x392715bb,0xd3e03565,
  74159. 0xfab5e131,0x097b00ba },
  74160. { 0x565f69e1,0xaa66c8e9,0xb5be5199,0x77e8f75a,0xda4fd984,0x6033ba11,
  74161. 0xafdbcc9e,0xf95c747b } },
  74162. /* 77 */
  74163. { { 0xbebae45e,0x558f01d3,0xc4bc6955,0xa8ebe9f0,0xdbc64fc6,0xaeb705b1,
  74164. 0x566ed837,0x3512601e },
  74165. { 0xfa1161cd,0x9336f1e1,0x4c65ef87,0x328ab8d5,0x724f21e5,0x4757eee2,
  74166. 0x6068ab6b,0x0ef97123 } },
  74167. /* 78 */
  74168. { { 0x54ca4226,0x02598cf7,0xf8642c8e,0x5eede138,0x468e1790,0x48963f74,
  74169. 0x3b4fbc95,0xfc16d933 },
  74170. { 0xe7c800ca,0xbe96fb31,0x2678adaa,0x13806331,0x6ff3e8b5,0x3d624497,
  74171. 0xb95d7a17,0x14ca4af1 } },
  74172. /* 79 */
  74173. { { 0xbd2f81d5,0x7a4771ba,0x01f7d196,0x1a5f9d69,0xcad9c907,0xd898bef7,
  74174. 0xf59c231d,0x4057b063 },
  74175. { 0x89c05c0a,0xbffd82fe,0x1dc0df85,0xe4911c6f,0xa35a16db,0x3befccae,
  74176. 0xf1330b13,0x1c3b5d64 } },
  74177. /* 80 */
  74178. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  74179. 0xdb7e63af,0xfad27148 },
  74180. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  74181. 0x9f0e1a84,0x77387de3 } },
  74182. /* 81 */
  74183. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  74184. 0xbef0c47e,0xb37b85c0 },
  74185. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  74186. 0xf9f628d5,0x9c135ac8 } },
  74187. /* 82 */
  74188. { { 0x84e35743,0x32aa3202,0x85a3cdef,0x320d6ab1,0x1df19819,0xb821b176,
  74189. 0xc433851f,0x5721361f },
  74190. { 0x71fc9168,0x1f0db36a,0x5e5c403c,0x5f98ba73,0x37bcd8f5,0xf64ca87e,
  74191. 0xe6bb11bd,0xdcbac3c9 } },
  74192. /* 83 */
  74193. { { 0x4518cbe2,0xf01d9968,0x9c9eb04e,0xd242fc18,0xe47feebf,0x727663c7,
  74194. 0x2d626862,0xb8c1c89e },
  74195. { 0xc8e1d569,0x51a58bdd,0xb7d88cd0,0x563809c8,0xf11f31eb,0x26c27fd9,
  74196. 0x2f9422d4,0x5d23bbda } },
  74197. /* 84 */
  74198. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  74199. 0x91ece900,0xc109f9cb },
  74200. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  74201. 0x2eee1ee1,0x9bc3344f } },
  74202. /* 85 */
  74203. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  74204. 0x5f1a4cc1,0x29591d52 },
  74205. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  74206. 0x18ef332c,0x6376551f } },
  74207. /* 86 */
  74208. { { 0x562976cc,0xbda5f14e,0x0ef12c38,0x22bca3e6,0x6cca9852,0xbbfa3064,
  74209. 0x08e2987a,0xbdb79dc8 },
  74210. { 0xcb06a772,0xfd2cb5c9,0xfe536dce,0x38f475aa,0x7c2b5db8,0xc2a3e022,
  74211. 0xadd3c14a,0x8ee86001 } },
  74212. /* 87 */
  74213. { { 0xa4ade873,0xcbe96981,0xc4fba48c,0x7ee9aa4d,0x5a054ba5,0x2cee2899,
  74214. 0x6f77aa4b,0x92e51d7a },
  74215. { 0x7190a34d,0x948bafa8,0xf6bd1ed1,0xd698f75b,0x0caf1144,0xd00ee6e3,
  74216. 0x0a56aaaa,0x5182f86f } },
  74217. /* 88 */
  74218. { { 0x7a4cc99c,0xfba6212c,0x3e6d9ca1,0xff609b68,0x5ac98c5a,0x5dbb27cb,
  74219. 0x4073a6f2,0x91dcab5d },
  74220. { 0x5f575a70,0x01b6cc3d,0x6f8d87fa,0x0cb36139,0x89981736,0x165d4e8c,
  74221. 0x97974f2b,0x17a0cedb } },
  74222. /* 89 */
  74223. { { 0x076c8d3a,0x38861e2a,0x210f924b,0x701aad39,0x13a835d9,0x94d0eae4,
  74224. 0x7f4cdf41,0x2e8ce36c },
  74225. { 0x037a862b,0x91273dab,0x60e4c8fa,0x01ba9bb7,0x33baf2dd,0xf9645388,
  74226. 0x34f668f3,0xf4ccc6cb } },
  74227. /* 90 */
  74228. { { 0xf1f79687,0x44ef525c,0x92efa815,0x7c595495,0xa5c78d29,0xe1231741,
  74229. 0x9a0df3c9,0xac0db488 },
  74230. { 0xdf01747f,0x86bfc711,0xef17df13,0x592b9358,0x5ccb6bb5,0xe5880e4f,
  74231. 0x94c974a2,0x95a64a61 } },
  74232. /* 91 */
  74233. { { 0xc15a4c93,0x72c1efda,0x82585141,0x40269b73,0x16cb0bad,0x6a8dfb1c,
  74234. 0x29210677,0x231e54ba },
  74235. { 0x8ae6d2dc,0xa70df917,0x39112918,0x4d6aa63f,0x5e5b7223,0xf627726b,
  74236. 0xd8a731e1,0xab0be032 } },
  74237. /* 92 */
  74238. { { 0x8d131f2d,0x097ad0e9,0x3b04f101,0x637f09e3,0xd5e9a748,0x1ac86196,
  74239. 0x2cf6a679,0xf1bcc880 },
  74240. { 0xe8daacb4,0x25c69140,0x60f65009,0x3c4e4055,0x477937a6,0x591cc8fc,
  74241. 0x5aebb271,0x85169469 } },
  74242. /* 93 */
  74243. { { 0xf1dcf593,0xde35c143,0xb018be3b,0x78202b29,0x9bdd9d3d,0xe9cdadc2,
  74244. 0xdaad55d8,0x8f67d9d2 },
  74245. { 0x7481ea5f,0x84111656,0xe34c590c,0xe7d2dde9,0x05053fa8,0xffdd43f4,
  74246. 0xc0728b5d,0xf84572b9 } },
  74247. /* 94 */
  74248. { { 0x97af71c9,0x5e1a7a71,0x7a736565,0xa1449444,0x0e1d5063,0xa1b4ae07,
  74249. 0x616b2c19,0xedee2710 },
  74250. { 0x11734121,0xb2f034f5,0x4a25e9f0,0x1cac6e55,0xa40c2ecf,0x8dc148f3,
  74251. 0x44ebd7f4,0x9fd27e9b } },
  74252. /* 95 */
  74253. { { 0xf6e2cb16,0x3cc7658a,0xfe5919b6,0xe3eb7d2c,0x168d5583,0x5a8c5816,
  74254. 0x958ff387,0xa40c2fb6 },
  74255. { 0xfedcc158,0x8c9ec560,0x55f23056,0x7ad804c6,0x9a307e12,0xd9396704,
  74256. 0x7dc6decf,0x99bc9bb8 } },
  74257. /* 96 */
  74258. { { 0x927dafc6,0x84a9521d,0x5c09cd19,0x52c1fb69,0xf9366dde,0x9d9581a0,
  74259. 0xa16d7e64,0x9abe210b },
  74260. { 0x48915220,0x480af84a,0x4dd816c6,0xfa73176a,0x1681ca5a,0xc7d53987,
  74261. 0x87f344b0,0x7881c257 } },
  74262. /* 97 */
  74263. { { 0xe0bcf3ff,0x93399b51,0x127f74f6,0x0d02cbc5,0xdd01d968,0x8fb465a2,
  74264. 0xa30e8940,0x15e6e319 },
  74265. { 0x3e0e05f4,0x646d6e0d,0x43588404,0xfad7bddc,0xc4f850d3,0xbe61c7d1,
  74266. 0x191172ce,0x0e55facf } },
  74267. /* 98 */
  74268. { { 0xf8787564,0x7e9d9806,0x31e85ce6,0x1a331721,0xb819e8d6,0x6b0158ca,
  74269. 0x6fe96577,0xd73d0976 },
  74270. { 0x1eb7206e,0x42483425,0xc618bb42,0xa519290f,0x5e30a520,0x5dcbb859,
  74271. 0x8f15a50b,0x9250a374 } },
  74272. /* 99 */
  74273. { { 0xbe577410,0xcaff08f8,0x5077a8c6,0xfd408a03,0xec0a63a4,0xf1f63289,
  74274. 0xc1cc8c0b,0x77414082 },
  74275. { 0xeb0991cd,0x05a40fa6,0x49fdc296,0xc1ca0866,0xb324fd40,0x3a68a3c7,
  74276. 0x12eb20b9,0x8cb04f4d } },
  74277. /* 100 */
  74278. { { 0x6906171c,0xb1c2d055,0xb0240c3f,0x9073e9cd,0xd8906841,0xdb8e6b4f,
  74279. 0x47123b51,0xe4e429ef },
  74280. { 0x38ec36f4,0x0b8dd53c,0xff4b6a27,0xf9d2dc01,0x879a9a48,0x5d066e07,
  74281. 0x3c6e6552,0x37bca2ff } },
  74282. /* 101 */
  74283. { { 0xdf562470,0x4cd2e3c7,0xc0964ac9,0x44f272a2,0x80c793be,0x7c6d5df9,
  74284. 0x3002b22a,0x59913edc },
  74285. { 0x5750592a,0x7a139a83,0xe783de02,0x99e01d80,0xea05d64f,0xcf8c0375,
  74286. 0xb013e226,0x43786e4a } },
  74287. /* 102 */
  74288. { { 0x9e56b5a6,0xff32b0ed,0xd9fc68f9,0x0750d9a6,0x597846a7,0xec15e845,
  74289. 0xb7e79e7a,0x8638ca98 },
  74290. { 0x0afc24b2,0x2f5ae096,0x4dace8f2,0x05398eaf,0xaecba78f,0x3b765dd0,
  74291. 0x7b3aa6f0,0x1ecdd36a } },
  74292. /* 103 */
  74293. { { 0x6c5ff2f3,0x5d3acd62,0x2873a978,0xa2d516c0,0xd2110d54,0xad94c9fa,
  74294. 0xd459f32d,0xd85d0f85 },
  74295. { 0x10b11da3,0x9f700b8d,0xa78318c4,0xd2c22c30,0x9208decd,0x556988f4,
  74296. 0xb4ed3c62,0xa04f19c3 } },
  74297. /* 104 */
  74298. { { 0xed7f93bd,0x087924c8,0x392f51f6,0xcb64ac5d,0x821b71af,0x7cae330a,
  74299. 0x5c0950b0,0x92b2eeea },
  74300. { 0x85b6e235,0x85ac4c94,0x2936c0f0,0xab2ca4a9,0xe0508891,0x80faa6b3,
  74301. 0x5834276c,0x1ee78221 } },
  74302. /* 105 */
  74303. { { 0xe63e79f7,0xa60a2e00,0xf399d906,0xf590e7b2,0x6607c09d,0x9021054a,
  74304. 0x57a6e150,0xf3f2ced8 },
  74305. { 0xf10d9b55,0x200510f3,0xd8642648,0x9d2fcfac,0xe8bd0e7c,0xe5631aa7,
  74306. 0x3da3e210,0x0f56a454 } },
  74307. /* 106 */
  74308. { { 0x1043e0df,0x5b21bffa,0x9c007e6d,0x6c74b6cc,0xd4a8517a,0x1a656ec0,
  74309. 0x1969e263,0xbd8f1741 },
  74310. { 0xbeb7494a,0x8a9bbb86,0x45f3b838,0x1567d46f,0xa4e5a79a,0xdf7a12a7,
  74311. 0x30ccfa09,0x2d1a1c35 } },
  74312. /* 107 */
  74313. { { 0x506508da,0x192e3813,0xa1d795a7,0x336180c4,0x7a9944b3,0xcddb5949,
  74314. 0xb91fba46,0xa107a65e },
  74315. { 0x0f94d639,0xe6d1d1c5,0x8a58b7d7,0x8b4af375,0xbd37ca1c,0x1a7c5584,
  74316. 0xf87a9af2,0x183d760a } },
  74317. /* 108 */
  74318. { { 0x0dde59a4,0x29d69711,0x0e8bef87,0xf1ad8d07,0x4f2ebe78,0x229b4963,
  74319. 0xc269d754,0x1d44179d },
  74320. { 0x8390d30e,0xb32dc0cf,0x0de8110c,0x0a3b2753,0x2bc0339a,0x31af1dc5,
  74321. 0x9606d262,0x771f9cc2 } },
  74322. /* 109 */
  74323. { { 0x85040739,0x99993e77,0x8026a939,0x44539db9,0xf5f8fc26,0xcf40f6f2,
  74324. 0x0362718e,0x64427a31 },
  74325. { 0x85428aa8,0x4f4f2d87,0xebfb49a8,0x7b7adc3f,0xf23d01ac,0x201b2c6d,
  74326. 0x6ae90d6d,0x49d9b749 } },
  74327. /* 110 */
  74328. { { 0x435d1099,0xcc78d8bc,0x8e8d1a08,0x2adbcd4e,0x2cb68a41,0x02c2e2a0,
  74329. 0x3f605445,0x9037d81b },
  74330. { 0x074c7b61,0x7cdbac27,0x57bfd72e,0xfe2031ab,0x596d5352,0x61ccec96,
  74331. 0x7cc0639c,0x08c3de6a } },
  74332. /* 111 */
  74333. { { 0xf6d552ab,0x20fdd020,0x05cd81f1,0x56baff98,0x91351291,0x06fb7c3e,
  74334. 0x45796b2f,0xc6909442 },
  74335. { 0x41231bd1,0x17b3ae9c,0x5cc58205,0x1eac6e87,0xf9d6a122,0x208837ab,
  74336. 0xcafe3ac0,0x3fa3db02 } },
  74337. /* 112 */
  74338. { { 0x05058880,0xd75a3e65,0x643943f2,0x7da365ef,0xfab24925,0x4147861c,
  74339. 0xfdb808ff,0xc5c4bdb0 },
  74340. { 0xb272b56b,0x73513e34,0x11b9043a,0xc8327e95,0xf8844969,0xfd8ce37d,
  74341. 0x46c2b6b5,0x2d56db94 } },
  74342. /* 113 */
  74343. { { 0xff46ac6b,0x2461782f,0x07a2e425,0xd19f7926,0x09a48de1,0xfafea3c4,
  74344. 0xe503ba42,0x0f56bd9d },
  74345. { 0x345cda49,0x137d4ed1,0x816f299d,0x821158fc,0xaeb43402,0xe7c6a54a,
  74346. 0x1173b5f1,0x4003bb9d } },
  74347. /* 114 */
  74348. { { 0xa0803387,0x3b8e8189,0x39cbd404,0xece115f5,0xd2877f21,0x4297208d,
  74349. 0xa07f2f9e,0x53765522 },
  74350. { 0xa8a4182d,0xa4980a21,0x3219df79,0xa2bbd07a,0x1a19a2d4,0x674d0a2e,
  74351. 0x6c5d4549,0x7a056f58 } },
  74352. /* 115 */
  74353. { { 0x9d8a2a47,0x646b2558,0xc3df2773,0x5b582948,0xabf0d539,0x51ec000e,
  74354. 0x7a1a2675,0x77d482f1 },
  74355. { 0x87853948,0xb8a1bd95,0x6cfbffee,0xa6f817bd,0x80681e47,0xab6ec057,
  74356. 0x2b38b0e4,0x4115012b } },
  74357. /* 116 */
  74358. { { 0x6de28ced,0x3c73f0f4,0x9b13ec47,0x1d5da760,0x6e5c6392,0x61b8ce9e,
  74359. 0xfbea0946,0xcdf04572 },
  74360. { 0x6c53c3b0,0x1cb3c58b,0x447b843c,0x97fe3c10,0x2cb9780e,0xfb2b8ae1,
  74361. 0x97383109,0xee703dda } },
  74362. /* 117 */
  74363. { { 0xff57e43a,0x34515140,0xb1b811b8,0xd44660d3,0x8f42b986,0x2b3b5dff,
  74364. 0xa162ce21,0x2a0ad89d },
  74365. { 0x6bc277ba,0x64e4a694,0xc141c276,0xc788c954,0xcabf6274,0x141aa64c,
  74366. 0xac2b4659,0xd62d0b67 } },
  74367. /* 118 */
  74368. { { 0x2c054ac4,0x39c5d87b,0xf27df788,0x57005859,0xb18128d6,0xedf7cbf3,
  74369. 0x991c2426,0xb39a23f2 },
  74370. { 0xf0b16ae5,0x95284a15,0xa136f51b,0x0c6a05b1,0xf2700783,0x1d63c137,
  74371. 0xc0674cc5,0x04ed0092 } },
  74372. /* 119 */
  74373. { { 0x9ae90393,0x1f4185d1,0x4a3d64e6,0x3047b429,0x9854fc14,0xae0001a6,
  74374. 0x0177c387,0xa0a91fc1 },
  74375. { 0xae2c831e,0xff0a3f01,0x2b727e16,0xbb76ae82,0x5a3075b4,0x8f12c8a1,
  74376. 0x9ed20c41,0x084cf988 } },
  74377. /* 120 */
  74378. { { 0xfca6becf,0xd98509de,0x7dffb328,0x2fceae80,0x4778e8b9,0x5d8a15c4,
  74379. 0x73abf77e,0xd57955b2 },
  74380. { 0x31b5d4f1,0x210da79e,0x3cfa7a1c,0xaa52f04b,0xdc27c20b,0xd4d12089,
  74381. 0x02d141f1,0x8e14ea42 } },
  74382. /* 121 */
  74383. { { 0xf2897042,0xeed50345,0x43402c4a,0x8d05331f,0xc8bdfb21,0xc8d9c194,
  74384. 0x2aa4d158,0x597e1a37 },
  74385. { 0xcf0bd68c,0x0327ec1a,0xab024945,0x6d4be0dc,0xc9fe3e84,0x5b9c8d7a,
  74386. 0x199b4dea,0xca3f0236 } },
  74387. /* 122 */
  74388. { { 0x6170bd20,0x592a10b5,0x6d3f5de7,0x0ea897f1,0x44b2ade2,0xa3363ff1,
  74389. 0x309c07e4,0xbde7fd7e },
  74390. { 0xb8f5432c,0x516bb6d2,0xe043444b,0x210dc1cb,0xf8f95b5a,0x3db01e6f,
  74391. 0x0a7dd198,0xb623ad0e } },
  74392. /* 123 */
  74393. { { 0x60c7b65b,0xa75bd675,0x23a4a289,0xab8c5590,0xd7b26795,0xf8220fd0,
  74394. 0x58ec137b,0xd6aa2e46 },
  74395. { 0x5138bb85,0x10abc00b,0xd833a95c,0x8c31d121,0x1702a32e,0xb24ff00b,
  74396. 0x2dcc513a,0x111662e0 } },
  74397. /* 124 */
  74398. { { 0xefb42b87,0x78114015,0x1b6c4dff,0xbd9f5d70,0xa7d7c129,0x66ecccd7,
  74399. 0x94b750f8,0xdb3ee1cb },
  74400. { 0xf34837cf,0xb26f3db0,0xb9578d4f,0xe7eed18b,0x7c56657d,0x5d2cdf93,
  74401. 0x52206a59,0x886a6442 } },
  74402. /* 125 */
  74403. { { 0x65b569ea,0x3c234cfb,0xf72119c1,0x20011141,0xa15a619e,0x8badc85d,
  74404. 0x018a17bc,0xa70cf4eb },
  74405. { 0x8c4a6a65,0x224f97ae,0x0134378f,0x36e5cf27,0x4f7e0960,0xbe3a609e,
  74406. 0xd1747b77,0xaa4772ab } },
  74407. /* 126 */
  74408. { { 0x7aa60cc0,0x67676131,0x0368115f,0xc7916361,0xbbc1bb5a,0xded98bb4,
  74409. 0x30faf974,0x611a6ddc },
  74410. { 0xc15ee47a,0x30e78cbc,0x4e0d96a5,0x2e896282,0x3dd9ed88,0x36f35adf,
  74411. 0x16429c88,0x5cfffaf8 } },
  74412. /* 127 */
  74413. { { 0x9b7a99cd,0xc0d54cff,0x843c45a1,0x7bf3b99d,0x62c739e1,0x038a908f,
  74414. 0x7dc1994c,0x6e5a6b23 },
  74415. { 0x0ba5db77,0xef8b454e,0xacf60d63,0xb7b8807f,0x76608378,0xe591c0c6,
  74416. 0x242dabcc,0x481a238d } },
  74417. /* 128 */
  74418. { { 0x35d0b34a,0xe3417bc0,0x8327c0a7,0x440b386b,0xac0362d1,0x8fb7262d,
  74419. 0xe0cdf943,0x2c41114c },
  74420. { 0xad95a0b1,0x2ba5cef1,0x67d54362,0xc09b37a8,0x01e486c9,0x26d6cdd2,
  74421. 0x42ff9297,0x20477abf } },
  74422. /* 129 */
  74423. { { 0x18d65dbf,0x2f75173c,0x339edad8,0x77bf940e,0xdcf1001c,0x7022d26b,
  74424. 0xc77396b6,0xac66409a },
  74425. { 0xc6261cc3,0x8b0bb36f,0x190e7e90,0x213f7bc9,0xa45e6c10,0x6541ceba,
  74426. 0xcc122f85,0xce8e6975 } },
  74427. /* 130 */
  74428. { { 0xbc0a67d2,0x0f121b41,0x444d248a,0x62d4760a,0x659b4737,0x0e044f1d,
  74429. 0x250bb4a8,0x08fde365 },
  74430. { 0x848bf287,0xaceec3da,0xd3369d6e,0xc2a62182,0x92449482,0x3582dfdc,
  74431. 0x565d6cd7,0x2f7e2fd2 } },
  74432. /* 131 */
  74433. { { 0xc3770fa7,0xae4b92db,0x379043f9,0x095e8d5c,0x17761171,0x54f34e9d,
  74434. 0x907702ae,0xc65be92e },
  74435. { 0xf6fd0a40,0x2758a303,0xbcce784b,0xe7d822e3,0x4f9767bf,0x7ae4f585,
  74436. 0xd1193b3a,0x4bff8e47 } },
  74437. /* 132 */
  74438. { { 0x00ff1480,0xcd41d21f,0x0754db16,0x2ab8fb7d,0xbbe0f3ea,0xac81d2ef,
  74439. 0x5772967d,0x3e4e4ae6 },
  74440. { 0x3c5303e6,0x7e18f36d,0x92262397,0x3bd9994b,0x1324c3c0,0x9ed70e26,
  74441. 0x58ec6028,0x5388aefd } },
  74442. /* 133 */
  74443. { { 0x5e5d7713,0xad1317eb,0x75de49da,0x09b985ee,0xc74fb261,0x32f5bc4f,
  74444. 0x4f75be0e,0x5cf908d1 },
  74445. { 0x8e657b12,0x76043510,0xb96ed9e6,0xbfd421a5,0x8970ccc2,0x0e29f51f,
  74446. 0x60f00ce2,0xa698ba40 } },
  74447. /* 134 */
  74448. { { 0xef748fec,0x73db1686,0x7e9d2cf9,0xe6e755a2,0xce265eff,0x630b6544,
  74449. 0x7aebad8d,0xb142ef8a },
  74450. { 0x17d5770a,0xad31af9f,0x2cb3412f,0x66af3b67,0xdf3359de,0x6bd60d1b,
  74451. 0x58515075,0xd1896a96 } },
  74452. /* 135 */
  74453. { { 0x33c41c08,0xec5957ab,0x5468e2e1,0x87de94ac,0xac472f6c,0x18816b73,
  74454. 0x7981da39,0x267b0e0b },
  74455. { 0x8e62b988,0x6e554e5d,0x116d21e7,0xd8ddc755,0x3d2a6f99,0x4610faf0,
  74456. 0xa1119393,0xb54e287a } },
  74457. /* 136 */
  74458. { { 0x178a876b,0x0a0122b5,0x085104b4,0x51ff96ff,0x14f29f76,0x050b31ab,
  74459. 0x5f87d4e6,0x84abb28b },
  74460. { 0x8270790a,0xd5ed439f,0x85e3f46b,0x2d6cb59d,0x6c1e2212,0x75f55c1b,
  74461. 0x17655640,0xe5436f67 } },
  74462. /* 137 */
  74463. { { 0x2286e8d5,0x53f9025e,0x864453be,0x353c95b4,0xe408e3a0,0xd832f5bd,
  74464. 0x5b9ce99e,0x0404f68b },
  74465. { 0xa781e8e5,0xcad33bde,0x163c2f5b,0x3cdf5018,0x0119caa3,0x57576960,
  74466. 0x0ac1c701,0x3a4263df } },
  74467. /* 138 */
  74468. { { 0x9aeb596d,0xc2965ecc,0x023c92b4,0x01ea03e7,0x2e013961,0x4704b4b6,
  74469. 0x905ea367,0x0ca8fd3f },
  74470. { 0x551b2b61,0x92523a42,0x390fcd06,0x1eb7a89c,0x0392a63e,0xe7f1d2be,
  74471. 0x4ddb0c33,0x96dca264 } },
  74472. /* 139 */
  74473. { { 0x387510af,0x203bb43a,0xa9a36a01,0x846feaa8,0x2f950378,0xd23a5770,
  74474. 0x3aad59dc,0x4363e212 },
  74475. { 0x40246a47,0xca43a1c7,0xe55dd24d,0xb362b8d2,0x5d8faf96,0xf9b08604,
  74476. 0xd8bb98c4,0x840e115c } },
  74477. /* 140 */
  74478. { { 0x1023e8a7,0xf12205e2,0xd8dc7a0b,0xc808a8cd,0x163a5ddf,0xe292a272,
  74479. 0x30ded6d4,0x5e0d6abd },
  74480. { 0x7cfc0f64,0x07a721c2,0x0e55ed88,0x42eec01d,0x1d1f9db2,0x26a7bef9,
  74481. 0x2945a25a,0x7dea48f4 } },
  74482. /* 141 */
  74483. { { 0xe5060a81,0xabdf6f1c,0xf8f95615,0xe79f9c72,0x06ac268b,0xcfd36c54,
  74484. 0xebfd16d1,0xabc2a2be },
  74485. { 0xd3e2eac7,0x8ac66f91,0xd2dd0466,0x6f10ba63,0x0282d31b,0x6790e377,
  74486. 0x6c7eefc1,0x4ea35394 } },
  74487. /* 142 */
  74488. { { 0x5266309d,0xed8a2f8d,0x81945a3e,0x0a51c6c0,0x578c5dc1,0xcecaf45a,
  74489. 0x1c94ffc3,0x3a76e689 },
  74490. { 0x7d7b0d0f,0x9aace8a4,0x8f584a5f,0x963ace96,0x4e697fbe,0x51a30c72,
  74491. 0x465e6464,0x8212a10a } },
  74492. /* 143 */
  74493. { { 0xcfab8caa,0xef7c61c3,0x0e142390,0x18eb8e84,0x7e9733ca,0xcd1dff67,
  74494. 0x599cb164,0xaa7cab71 },
  74495. { 0xbc837bd1,0x02fc9273,0xc36af5d7,0xc06407d0,0xf423da49,0x17621292,
  74496. 0xfe0617c3,0x40e38073 } },
  74497. /* 144 */
  74498. { { 0xa7bf9b7c,0xf4f80824,0x3fbe30d0,0x365d2320,0x97cf9ce3,0xbfbe5320,
  74499. 0xb3055526,0xe3604700 },
  74500. { 0x6cc6c2c7,0x4dcb9911,0xba4cbee6,0x72683708,0x637ad9ec,0xdcded434,
  74501. 0xa3dee15f,0x6542d677 } },
  74502. /* 145 */
  74503. { { 0x7b6c377a,0x3f32b6d0,0x903448be,0x6cb03847,0x20da8af7,0xd6fdd3a8,
  74504. 0x09bb6f21,0xa6534aee },
  74505. { 0x1035facf,0x30a1780d,0x9dcb47e6,0x35e55a33,0xc447f393,0x6ea50fe1,
  74506. 0xdc9aef22,0xf3cb672f } },
  74507. /* 146 */
  74508. { { 0x3b55fd83,0xeb3719fe,0x875ddd10,0xe0d7a46c,0x05cea784,0x33ac9fa9,
  74509. 0xaae870e7,0x7cafaa2e },
  74510. { 0x1d53b338,0x9b814d04,0xef87e6c6,0xe0acc0a0,0x11672b0f,0xfb93d108,
  74511. 0xb9bd522e,0x0aab13c1 } },
  74512. /* 147 */
  74513. { { 0xd2681297,0xddcce278,0xb509546a,0xcb350eb1,0x7661aaf2,0x2dc43173,
  74514. 0x847012e9,0x4b91a602 },
  74515. { 0x72f8ddcf,0xdcff1095,0x9a911af4,0x08ebf61e,0xc372430e,0x48f4360a,
  74516. 0x72321cab,0x49534c53 } },
  74517. /* 148 */
  74518. { { 0xf07b7e9d,0x83df7d71,0x13cd516f,0xa478efa3,0x6c047ee3,0x78ef264b,
  74519. 0xd65ac5ee,0xcaf46c4f },
  74520. { 0x92aa8266,0xa04d0c77,0x913684bb,0xedf45466,0xae4b16b0,0x56e65168,
  74521. 0x04c6770f,0x14ce9e57 } },
  74522. /* 149 */
  74523. { { 0x965e8f91,0x99445e3e,0xcb0f2492,0xd3aca1ba,0x90c8a0a0,0xd31cc70f,
  74524. 0x3e4c9a71,0x1bb708a5 },
  74525. { 0x558bdd7a,0xd5ca9e69,0x018a26b1,0x734a0508,0x4c9cf1ec,0xb093aa71,
  74526. 0xda300102,0xf9d126f2 } },
  74527. /* 150 */
  74528. { { 0xaff9563e,0x749bca7a,0xb49914a0,0xdd077afe,0xbf5f1671,0xe27a0311,
  74529. 0x729ecc69,0x807afcb9 },
  74530. { 0xc9b08b77,0x7f8a9337,0x443c7e38,0x86c3a785,0x476fd8ba,0x85fafa59,
  74531. 0x6568cd8c,0x751adcd1 } },
  74532. /* 151 */
  74533. { { 0x10715c0d,0x8aea38b4,0x8f7697f7,0xd113ea71,0x93fbf06d,0x665eab14,
  74534. 0x2537743f,0x29ec4468 },
  74535. { 0xb50bebbc,0x3d94719c,0xe4505422,0x399ee5bf,0x8d2dedb1,0x90cd5b3a,
  74536. 0x92a4077d,0xff9370e3 } },
  74537. /* 152 */
  74538. { { 0xc6b75b65,0x59a2d69b,0x266651c5,0x4188f8d5,0x3de9d7d2,0x28a9f33e,
  74539. 0xa2a9d01a,0x9776478b },
  74540. { 0x929af2c7,0x8852622d,0x4e690923,0x334f5d6d,0xa89a51e9,0xce6cc7e5,
  74541. 0xac2f82fa,0x74a6313f } },
  74542. /* 153 */
  74543. { { 0xb75f079c,0xb2f4dfdd,0x18e36fbb,0x85b07c95,0xe7cd36dd,0x1b6cfcf0,
  74544. 0x0ff4863d,0xab75be15 },
  74545. { 0x173fc9b7,0x81b367c0,0xd2594fd0,0xb90a7420,0xc4091236,0x15fdbf03,
  74546. 0x0b4459f6,0x4ebeac2e } },
  74547. /* 154 */
  74548. { { 0x5c9f2c53,0xeb6c5fe7,0x8eae9411,0xd2522011,0xf95ac5d8,0xc8887633,
  74549. 0x2c1baffc,0xdf99887b },
  74550. { 0x850aaecb,0xbb78eed2,0x01d6a272,0x9d49181b,0xb1cdbcac,0x978dd511,
  74551. 0x779f4058,0x27b040a7 } },
  74552. /* 155 */
  74553. { { 0xf73b2eb2,0x90405db7,0x8e1b2118,0xe0df8508,0x5962327e,0x501b7152,
  74554. 0xe4cfa3f5,0xb393dd37 },
  74555. { 0x3fd75165,0xa1230e7b,0xbcd33554,0xd66344c2,0x0f7b5022,0x6c36f1be,
  74556. 0xd0463419,0x09588c12 } },
  74557. /* 156 */
  74558. { { 0x02601c3b,0xe086093f,0xcf5c335f,0xfb0252f8,0x894aff28,0x955cf280,
  74559. 0xdb9f648b,0x81c879a9 },
  74560. { 0xc6f56c51,0x040e687c,0x3f17618c,0xfed47169,0x9059353b,0x44f88a41,
  74561. 0x5fc11bc4,0xfa0d48f5 } },
  74562. /* 157 */
  74563. { { 0xe1608e4d,0xbc6e1c9d,0x3582822c,0x010dda11,0x157ec2d7,0xf6b7ddc1,
  74564. 0xb6a367d6,0x8ea0e156 },
  74565. { 0x2383b3b4,0xa354e02f,0x3f01f53c,0x69966b94,0x2de03ca5,0x4ff6632b,
  74566. 0xfa00b5ac,0x3f5ab924 } },
  74567. /* 158 */
  74568. { { 0x59739efb,0x337bb0d9,0xe7ebec0d,0xc751b0f4,0x411a67d1,0x2da52dd6,
  74569. 0x2b74256e,0x8bc76887 },
  74570. { 0x82d3d253,0xa5be3b72,0xf58d779f,0xa9f679a1,0xe16767bb,0xa1cac168,
  74571. 0x60fcf34f,0xb386f190 } },
  74572. /* 159 */
  74573. { { 0x2fedcfc2,0x31f3c135,0x62f8af0d,0x5396bf62,0xe57288c2,0x9a02b4ea,
  74574. 0x1b069c4d,0x4cb460f7 },
  74575. { 0x5b8095ea,0xae67b4d3,0x6fc07603,0x92bbf859,0xb614a165,0xe1475f66,
  74576. 0x95ef5223,0x52c0d508 } },
  74577. /* 160 */
  74578. { { 0x15339848,0x231c210e,0x70778c8d,0xe87a28e8,0x6956e170,0x9d1de661,
  74579. 0x2bb09c0b,0x4ac3c938 },
  74580. { 0x6998987d,0x19be0551,0xae09f4d6,0x8b2376c4,0x1a3f933d,0x1de0b765,
  74581. 0xe39705f4,0x380d94c7 } },
  74582. /* 161 */
  74583. { { 0x81542e75,0x01a355aa,0xee01b9b7,0x96c724a1,0x624d7087,0x6b3a2977,
  74584. 0xde2637af,0x2ce3e171 },
  74585. { 0xf5d5bc1a,0xcfefeb49,0x2777e2b5,0xa655607e,0x9513756c,0x4feaac2f,
  74586. 0x0b624e4d,0x2e6cd852 } },
  74587. /* 162 */
  74588. { { 0x8c31c31d,0x3685954b,0x5bf21a0c,0x68533d00,0x75c79ec9,0x0bd7626e,
  74589. 0x42c69d54,0xca177547 },
  74590. { 0xf6d2dbb2,0xcc6edaff,0x174a9d18,0xfd0d8cbd,0xaa4578e8,0x875e8793,
  74591. 0x9cab2ce6,0xa976a713 } },
  74592. /* 163 */
  74593. { { 0x93fb353d,0x0a651f1b,0x57fcfa72,0xd75cab8b,0x31b15281,0xaa88cfa7,
  74594. 0x0a1f4999,0x8720a717 },
  74595. { 0x693e1b90,0x8c3e8d37,0x16f6dfc3,0xd345dc0b,0xb52a8742,0x8ea8d00a,
  74596. 0xc769893c,0x9719ef29 } },
  74597. /* 164 */
  74598. { { 0x58e35909,0x820eed8d,0x33ddc116,0x9366d8dc,0x6e205026,0xd7f999d0,
  74599. 0xe15704c1,0xa5072976 },
  74600. { 0xc4e70b2e,0x002a37ea,0x6890aa8a,0x84dcf657,0x645b2a5c,0xcd71bf18,
  74601. 0xf7b77725,0x99389c9d } },
  74602. /* 165 */
  74603. { { 0x7ada7a4b,0x238c08f2,0xfd389366,0x3abe9d03,0x766f512c,0x6b672e89,
  74604. 0x202c82e4,0xa88806aa },
  74605. { 0xd380184e,0x6602044a,0x126a8b85,0xa8cb78c4,0xad844f17,0x79d670c0,
  74606. 0x4738dcfe,0x0043bffb } },
  74607. /* 166 */
  74608. { { 0x36d5192e,0x8d59b5dc,0x4590b2af,0xacf885d3,0x11601781,0x83566d0a,
  74609. 0xba6c4866,0x52f3ef01 },
  74610. { 0x0edcb64d,0x3986732a,0x8068379f,0x0a482c23,0x7040f309,0x16cbe5fa,
  74611. 0x9ef27e75,0x3296bd89 } },
  74612. /* 167 */
  74613. { { 0x454d81d7,0x476aba89,0x51eb9b3c,0x9eade7ef,0x81c57986,0x619a21cd,
  74614. 0xaee571e9,0x3b90febf },
  74615. { 0x5496f7cb,0x9393023e,0x7fb51bc4,0x55be41d8,0x99beb5ce,0x03f1dd48,
  74616. 0x9f810b18,0x6e88069d } },
  74617. /* 168 */
  74618. { { 0xb43ea1db,0xce37ab11,0x5259d292,0x0a7ff1a9,0x8f84f186,0x851b0221,
  74619. 0xdefaad13,0xa7222bea },
  74620. { 0x2b0a9144,0xa2ac78ec,0xf2fa59c5,0x5a024051,0x6147ce38,0x91d1eca5,
  74621. 0xbc2ac690,0xbe94d523 } },
  74622. /* 169 */
  74623. { { 0x0b226ce7,0x72f4945e,0x967e8b70,0xb8afd747,0x85a6c63e,0xedea46f1,
  74624. 0x9be8c766,0x7782defe },
  74625. { 0x3db38626,0x760d2aa4,0x76f67ad1,0x460ae787,0x54499cdb,0x341b86fc,
  74626. 0xa2892e4b,0x03838567 } },
  74627. /* 170 */
  74628. { { 0x79ec1a0f,0x2d8daefd,0xceb39c97,0x3bbcd6fd,0x58f61a95,0xf5575ffc,
  74629. 0xadf7b420,0xdbd986c4 },
  74630. { 0x15f39eb7,0x81aa8814,0xb98d976c,0x6ee2fcf5,0xcf2f717d,0x5465475d,
  74631. 0x6860bbd0,0x8e24d3c4 } },
  74632. /* 171 */
  74633. { { 0x9a587390,0x749d8e54,0x0cbec588,0x12bb194f,0xb25983c6,0x46e07da4,
  74634. 0x407bafc8,0x541a99c4 },
  74635. { 0x624c8842,0xdb241692,0xd86c05ff,0x6044c12a,0x4f7fcf62,0xc59d14b4,
  74636. 0xf57d35d1,0xc0092c49 } },
  74637. /* 172 */
  74638. { { 0xdf2e61ef,0xd3cc75c3,0x2e1b35ca,0x7e8841c8,0x909f29f4,0xc62d30d1,
  74639. 0x7286944d,0x75e40634 },
  74640. { 0xbbc237d0,0xe7d41fc5,0xec4f01c9,0xc9537bf0,0x282bd534,0x91c51a16,
  74641. 0xc7848586,0x5b7cb658 } },
  74642. /* 173 */
  74643. { { 0x8a28ead1,0x964a7084,0xfd3b47f6,0x802dc508,0x767e5b39,0x9ae4bfd1,
  74644. 0x8df097a1,0x7ae13eba },
  74645. { 0xeadd384e,0xfd216ef8,0xb6b2ff06,0x0361a2d9,0x4bcdb5f3,0x204b9878,
  74646. 0xe2a8e3fd,0x787d8074 } },
  74647. /* 174 */
  74648. { { 0x757fbb1c,0xc5e25d6b,0xca201deb,0xe47bddb2,0x6d2233ff,0x4a55e9a3,
  74649. 0x9ef28484,0x5c222819 },
  74650. { 0x88315250,0x773d4a85,0x827097c1,0x21b21a2b,0xdef5d33f,0xab7c4ea1,
  74651. 0xbaf0f2b0,0xe45d37ab } },
  74652. /* 175 */
  74653. { { 0x28511c8a,0xd2df1e34,0xbdca6cd3,0xebb229c8,0x627c39a7,0x578a71a7,
  74654. 0x84dfb9d3,0xed7bc122 },
  74655. { 0x93dea561,0xcf22a6df,0xd48f0ed1,0x5443f18d,0x5bad23e8,0xd8b86140,
  74656. 0x45ca6d27,0xaac97cc9 } },
  74657. /* 176 */
  74658. { { 0xa16bd00a,0xeb54ea74,0xf5c0bcc1,0xd839e9ad,0x1f9bfc06,0x092bb7f1,
  74659. 0x1163dc4e,0x318f97b3 },
  74660. { 0xc30d7138,0xecc0c5be,0xabc30220,0x44e8df23,0xb0223606,0x2bb7972f,
  74661. 0x9a84ff4d,0xfa41faa1 } },
  74662. /* 177 */
  74663. { { 0xa6642269,0x4402d974,0x9bb783bd,0xc81814ce,0x7941e60b,0x398d38e4,
  74664. 0x1d26e9e2,0x38bb6b2c },
  74665. { 0x6a577f87,0xc64e4a25,0xdc11fe1c,0x8b52d253,0x62280728,0xff336abf,
  74666. 0xce7601a5,0x94dd0905 } },
  74667. /* 178 */
  74668. { { 0xde93f92a,0x156cf7dc,0x89b5f315,0xa01333cb,0xc995e750,0x02404df9,
  74669. 0xd25c2ae9,0x92077867 },
  74670. { 0x0bf39d44,0xe2471e01,0x96bb53d7,0x5f2c9020,0x5c9c3d8f,0x4c44b7b3,
  74671. 0xd29beb51,0x81e8428b } },
  74672. /* 179 */
  74673. { { 0xc477199f,0x6dd9c2ba,0x6b5ecdd9,0x8cb8eeee,0xee40fd0e,0x8af7db3f,
  74674. 0xdbbfa4b1,0x1b94ab62 },
  74675. { 0xce47f143,0x44f0d8b3,0x63f46163,0x51e623fc,0xcc599383,0xf18f270f,
  74676. 0x055590ee,0x06a38e28 } },
  74677. /* 180 */
  74678. { { 0xb3355b49,0x2e5b0139,0xb4ebf99b,0x20e26560,0xd269f3dc,0xc08ffa6b,
  74679. 0x83d9d4f8,0xa7b36c20 },
  74680. { 0x1b3e8830,0x64d15c3a,0xa89f9c0b,0xd5fceae1,0xe2d16930,0xcfeee4a2,
  74681. 0xa2822a20,0xbe54c6b4 } },
  74682. /* 181 */
  74683. { { 0x8d91167c,0xd6cdb3df,0xe7a6625e,0x517c3f79,0x346ac7f4,0x7105648f,
  74684. 0xeae022bb,0xbf30a5ab },
  74685. { 0x93828a68,0x8e7785be,0x7f3ef036,0x5161c332,0x592146b2,0xe11b5feb,
  74686. 0x2732d13a,0xd1c820de } },
  74687. /* 182 */
  74688. { { 0x9038b363,0x043e1347,0x6b05e519,0x58c11f54,0x6026cad1,0x4fe57abe,
  74689. 0x68a18da3,0xb7d17bed },
  74690. { 0xe29c2559,0x44ca5891,0x5bfffd84,0x4f7a0376,0x74e46948,0x498de4af,
  74691. 0x6412cc64,0x3997fd5e } },
  74692. /* 183 */
  74693. { { 0x8bd61507,0xf2074682,0x34a64d2a,0x29e132d5,0x8a8a15e3,0xffeddfb0,
  74694. 0x3c6c13e8,0x0eeb8929 },
  74695. { 0xa7e259f8,0xe9b69a3e,0xd13e7e67,0xce1db7e6,0xad1fa685,0x277318f6,
  74696. 0xc922b6ef,0x228916f8 } },
  74697. /* 184 */
  74698. { { 0x0a12ab5b,0x959ae25b,0x957bc136,0xcc11171f,0xd16e2b0c,0x8058429e,
  74699. 0x6e93097e,0xec05ad1d },
  74700. { 0xac3f3708,0x157ba5be,0x30b59d77,0x31baf935,0x118234e5,0x47b55237,
  74701. 0x7ff11b37,0x7d314156 } },
  74702. /* 185 */
  74703. { { 0xf6dfefab,0x7bd9c05c,0xdcb37707,0xbe2f2268,0x3a38bb95,0xe53ead97,
  74704. 0x9bc1d7a3,0xe9ce66fc },
  74705. { 0x6f6a02a1,0x75aa1576,0x60e600ed,0x38c087df,0x68cdc1b9,0xf8947f34,
  74706. 0x72280651,0xd9650b01 } },
  74707. /* 186 */
  74708. { { 0x5a057e60,0x504b4c4a,0x8def25e4,0xcbccc3be,0x17c1ccbd,0xa6353208,
  74709. 0x804eb7a2,0x14d6699a },
  74710. { 0xdb1f411a,0x2c8a8415,0xf80d769c,0x09fbaf0b,0x1c2f77ad,0xb4deef90,
  74711. 0x0d43598a,0x6f4c6841 } },
  74712. /* 187 */
  74713. { { 0x96c24a96,0x8726df4e,0xfcbd99a3,0x534dbc85,0x8b2ae30a,0x3c466ef2,
  74714. 0x61189abb,0x4c4350fd },
  74715. { 0xf855b8da,0x2967f716,0x463c38a1,0x41a42394,0xeae93343,0xc37e1413,
  74716. 0x5a3118b5,0xa726d242 } },
  74717. /* 188 */
  74718. { { 0x948c1086,0xdae6b3ee,0xcbd3a2e1,0xf1de503d,0x03d022f3,0x3f35ed3f,
  74719. 0xcc6cf392,0x13639e82 },
  74720. { 0xcdafaa86,0x9ac938fb,0x2654a258,0xf45bc5fb,0x45051329,0x1963b26e,
  74721. 0xc1a335a3,0xca9365e1 } },
  74722. /* 189 */
  74723. { { 0x4c3b2d20,0x3615ac75,0x904e241b,0x742a5417,0xcc9d071d,0xb08521c4,
  74724. 0x970b72a5,0x9ce29c34 },
  74725. { 0x6d3e0ad6,0x8cc81f73,0xf2f8434c,0x8060da9e,0x6ce862d9,0x35ed1d1a,
  74726. 0xab42af98,0x48c4abd7 } },
  74727. /* 190 */
  74728. { { 0x40c7485a,0xd221b0cc,0xe5274dbf,0xead455bb,0x9263d2e8,0x493c7698,
  74729. 0xf67b33cb,0x78017c32 },
  74730. { 0x930cb5ee,0xb9d35769,0x0c408ed2,0xc0d14e94,0x272f1a4d,0xf8b7bf55,
  74731. 0xde5c1c04,0x53cd0454 } },
  74732. /* 191 */
  74733. { { 0x5d28ccac,0xbcd585fa,0x005b746e,0x5f823e56,0xcd0123aa,0x7c79f0a1,
  74734. 0xd3d7fa8f,0xeea465c1 },
  74735. { 0x0551803b,0x7810659f,0x7ce6af70,0x6c0b599f,0x29288e70,0x4195a770,
  74736. 0x7ae69193,0x1b6e42a4 } },
  74737. /* 192 */
  74738. { { 0xf67d04c3,0x2e80937c,0x89eeb811,0x1e312be2,0x92594d60,0x56b5d887,
  74739. 0x187fbd3d,0x0224da14 },
  74740. { 0x0c5fe36f,0x87abb863,0x4ef51f5f,0x580f3c60,0xb3b429ec,0x964fb1bf,
  74741. 0x42bfff33,0x60838ef0 } },
  74742. /* 193 */
  74743. { { 0x7e0bbe99,0x432cb2f2,0x04aa39ee,0x7bda44f3,0x9fa93903,0x5f497c7a,
  74744. 0x2d331643,0x636eb202 },
  74745. { 0x93ae00aa,0xfcfd0e61,0x31ae6d2f,0x875a00fe,0x9f93901c,0xf43658a2,
  74746. 0x39218bac,0x8844eeb6 } },
  74747. /* 194 */
  74748. { { 0x6b3bae58,0x114171d2,0x17e39f3e,0x7db3df71,0x81a8eada,0xcd37bc7f,
  74749. 0x51fb789e,0x27ba83dc },
  74750. { 0xfbf54de5,0xa7df439f,0xb5fe1a71,0x7277030b,0xdb297a48,0x42ee8e35,
  74751. 0x87f3a4ab,0xadb62d34 } },
  74752. /* 195 */
  74753. { { 0xa175df2a,0x9b1168a2,0x618c32e9,0x082aa04f,0x146b0916,0xc9e4f2e7,
  74754. 0x75e7c8b2,0xb990fd76 },
  74755. { 0x4df37313,0x0829d96b,0xd0b40789,0x1c205579,0x78087711,0x66c9ae4a,
  74756. 0x4d10d18d,0x81707ef9 } },
  74757. /* 196 */
  74758. { { 0x03d6ff96,0x97d7cab2,0x0d843360,0x5b851bfc,0xd042db4b,0x268823c4,
  74759. 0xd5a8aa5c,0x3792daea },
  74760. { 0x941afa0b,0x52818865,0x42d83671,0xf3e9e741,0x5be4e0a7,0x17c82527,
  74761. 0x94b001ba,0x5abd635e } },
  74762. /* 197 */
  74763. { { 0x0ac4927c,0x727fa84e,0xa7c8cf23,0xe3886035,0x4adca0df,0xa4bcd5ea,
  74764. 0x846ab610,0x5995bf21 },
  74765. { 0x829dfa33,0xe90f860b,0x958fc18b,0xcaafe2ae,0x78630366,0x9b3baf44,
  74766. 0xd483411e,0x44c32ca2 } },
  74767. /* 198 */
  74768. { { 0xe40ed80c,0xa74a97f1,0x31d2ca82,0x5f938cb1,0x7c2d6ad9,0x53f2124b,
  74769. 0x8082a54c,0x1f2162fb },
  74770. { 0x720b173e,0x7e467cc5,0x085f12f9,0x40e8a666,0x4c9d65dc,0x8cebc20e,
  74771. 0xc3e907c9,0x8f1d402b } },
  74772. /* 199 */
  74773. { { 0xfbc4058a,0x4f592f9c,0x292f5670,0xb15e14b6,0xbc1d8c57,0xc55cfe37,
  74774. 0x926edbf9,0xb1980f43 },
  74775. { 0x32c76b09,0x98c33e09,0x33b07f78,0x1df5279d,0x863bb461,0x6f08ead4,
  74776. 0x37448e45,0x2828ad9b } },
  74777. /* 200 */
  74778. { { 0xc4cf4ac5,0x696722c4,0xdde64afb,0xf5ac1a3f,0xe0890832,0x0551baa2,
  74779. 0x5a14b390,0x4973f127 },
  74780. { 0x322eac5d,0xe59d8335,0x0bd9b568,0x5e07eef5,0xa2588393,0xab36720f,
  74781. 0xdb168ac7,0x6dac8ed0 } },
  74782. /* 201 */
  74783. { { 0xeda835ef,0xf7b545ae,0x1d10ed51,0x4aa113d2,0x13741b09,0x035a65e0,
  74784. 0x20b9de4c,0x4b23ef59 },
  74785. { 0x3c4c7341,0xe82bb680,0x3f58bc37,0xd457706d,0xa51e3ee8,0x73527863,
  74786. 0xddf49a4e,0x4dd71534 } },
  74787. /* 202 */
  74788. { { 0x95476cd9,0xbf944672,0xe31a725b,0x648d072f,0xfc4b67e0,0x1441c8b8,
  74789. 0x2f4a4dbb,0xfd317000 },
  74790. { 0x8995d0e1,0x1cb43ff4,0x0ef729aa,0x76e695d1,0x41798982,0xe0d5f976,
  74791. 0x9569f365,0x14fac58c } },
  74792. /* 203 */
  74793. { { 0xf312ae18,0xad9a0065,0xfcc93fc9,0x51958dc0,0x8a7d2846,0xd9a14240,
  74794. 0x36abda50,0xed7c7651 },
  74795. { 0x25d4abbc,0x46270f1a,0xf1a113ea,0x9b5dd8f3,0x5b51952f,0xc609b075,
  74796. 0x4d2e9f53,0xfefcb7f7 } },
  74797. /* 204 */
  74798. { { 0xba119185,0xbd09497a,0xaac45ba4,0xd54e8c30,0xaa521179,0x492479de,
  74799. 0x87e0d80b,0x1801a57e },
  74800. { 0xfcafffb0,0x073d3f8d,0xae255240,0x6cf33c0b,0x5b5fdfbc,0x781d763b,
  74801. 0x1ead1064,0x9f8fc11e } },
  74802. /* 205 */
  74803. { { 0x5e69544c,0x1583a171,0xf04b7813,0x0eaf8567,0x278a4c32,0x1e22a8fd,
  74804. 0x3d3a69a9,0xa9d3809d },
  74805. { 0x59a2da3b,0x936c2c2c,0x1895c847,0x38ccbcf6,0x63d50869,0x5e65244e,
  74806. 0xe1178ef7,0x3006b9ae } },
  74807. /* 206 */
  74808. { { 0xc9eead28,0x0bb1f2b0,0x89f4dfbc,0x7eef635d,0xb2ce8939,0x074757fd,
  74809. 0x45f8f761,0x0ab85fd7 },
  74810. { 0x3e5b4549,0xecda7c93,0x97922f21,0x4be2bb5c,0xb43b8040,0x261a1274,
  74811. 0x11e942c2,0xb122d675 } },
  74812. /* 207 */
  74813. { { 0x66a5ae7a,0x3be607be,0x76adcbe3,0x01e703fa,0x4eb6e5c5,0xaf904301,
  74814. 0x097dbaec,0x9f599dc1 },
  74815. { 0x0ff250ed,0x6d75b718,0x349a20dc,0x8eb91574,0x10b227a3,0x425605a4,
  74816. 0x8a294b78,0x7d5528e0 } },
  74817. /* 208 */
  74818. { { 0x20c26def,0xf0f58f66,0x582b2d1e,0x025585ea,0x01ce3881,0xfbe7d79b,
  74819. 0x303f1730,0x28ccea01 },
  74820. { 0x79644ba5,0xd1dabcd1,0x06fff0b8,0x1fc643e8,0x66b3e17b,0xa60a76fc,
  74821. 0xa1d013bf,0xc18baf48 } },
  74822. /* 209 */
  74823. { { 0x5dc4216d,0x34e638c8,0x206142ac,0x00c01067,0x95f5064a,0xd453a171,
  74824. 0xb7a9596b,0x9def809d },
  74825. { 0x67ab8d2c,0x41e8642e,0x6237a2b6,0xb4240433,0x64c4218b,0x7d506a6d,
  74826. 0x68808ce5,0x0357f8b0 } },
  74827. /* 210 */
  74828. { { 0x4cd2cc88,0x8e9dbe64,0xf0b8f39d,0xcc61c28d,0xcd30a0c8,0x4a309874,
  74829. 0x1b489887,0xe4a01add },
  74830. { 0xf57cd8f9,0x2ed1eeac,0xbd594c48,0x1b767d3e,0x7bd2f787,0xa7295c71,
  74831. 0xce10cc30,0x466d7d79 } },
  74832. /* 211 */
  74833. { { 0x9dada2c7,0x47d31892,0x8f9aa27d,0x4fa0a6c3,0x820a59e1,0x90e4fd28,
  74834. 0x451ead1a,0xc672a522 },
  74835. { 0x5d86b655,0x30607cc8,0xf9ad4af1,0xf0235d3b,0x571172a6,0x99a08680,
  74836. 0xf2a67513,0x5e3d64fa } },
  74837. /* 212 */
  74838. { { 0x9b3b4416,0xaa6410c7,0xeab26d99,0xcd8fcf85,0xdb656a74,0x5ebff74a,
  74839. 0xeb8e42fc,0x6c8a7a95 },
  74840. { 0xb02a63bd,0x10c60ba7,0x8b8f0047,0x6b2f2303,0x312d90b0,0x8c6c3738,
  74841. 0xad82ca91,0x348ae422 } },
  74842. /* 213 */
  74843. { { 0x5ccda2fb,0x7f474663,0x8e0726d2,0x22accaa1,0x492b1f20,0x85adf782,
  74844. 0xd9ef2d2e,0xc1074de0 },
  74845. { 0xae9a65b3,0xfcf3ce44,0x05d7151b,0xfd71e4ac,0xce6a9788,0xd4711f50,
  74846. 0xc9e54ffc,0xfbadfbdb } },
  74847. /* 214 */
  74848. { { 0x20a99363,0x1713f1cd,0x6cf22775,0xb915658f,0x24d359b2,0x968175cd,
  74849. 0x83716fcd,0xb7f976b4 },
  74850. { 0x5d6dbf74,0x5758e24d,0x71c3af36,0x8d23bafd,0x0243dfe3,0x48f47760,
  74851. 0xcafcc805,0xf4d41b2e } },
  74852. /* 215 */
  74853. { { 0xfdabd48d,0x51f1cf28,0x32c078a4,0xce81be36,0x117146e9,0x6ace2974,
  74854. 0xe0160f10,0x180824ea },
  74855. { 0x66e58358,0x0387698b,0xce6ca358,0x63568752,0x5e41e6c5,0x82380e34,
  74856. 0x83cf6d25,0x67e5f639 } },
  74857. /* 216 */
  74858. { { 0xcf4899ef,0xf89ccb8d,0x9ebb44c0,0x949015f0,0xb2598ec9,0x546f9276,
  74859. 0x04c11fc6,0x9fef789a },
  74860. { 0x53d2a071,0x6d367ecf,0xa4519b09,0xb10e1a7f,0x611e2eef,0xca6b3fb0,
  74861. 0xa99c4e20,0xbc80c181 } },
  74862. /* 217 */
  74863. { { 0xe5eb82e6,0x972536f8,0xf56cb920,0x1a484fc7,0x50b5da5e,0xc78e2171,
  74864. 0x9f8cdf10,0x49270e62 },
  74865. { 0xea6b50ad,0x1a39b7bb,0xa2388ffc,0x9a0284c1,0x8107197b,0x5403eb17,
  74866. 0x61372f7f,0xd2ee52f9 } },
  74867. /* 218 */
  74868. { { 0x88e0362a,0xd37cd285,0x8fa5d94d,0x442fa8a7,0xa434a526,0xaff836e5,
  74869. 0xe5abb733,0xdfb478be },
  74870. { 0x673eede6,0xa91f1ce7,0x2b5b2f04,0xa5390ad4,0x5530da2f,0x5e66f7bf,
  74871. 0x08df473a,0xd9a140b4 } },
  74872. /* 219 */
  74873. { { 0x6e8ea498,0x0e0221b5,0x3563ee09,0x62347829,0x335d2ade,0xe06b8391,
  74874. 0x623f4b1a,0x760c058d },
  74875. { 0xc198aa79,0x0b89b58c,0xf07aba7f,0xf74890d2,0xfde2556a,0x4e204110,
  74876. 0x8f190409,0x7141982d } },
  74877. /* 220 */
  74878. { { 0x4d4b0f45,0x6f0a0e33,0x392a94e1,0xd9280b38,0xb3c61d5e,0x3af324c6,
  74879. 0x89d54e47,0x3af9d1ce },
  74880. { 0x20930371,0xfd8f7981,0x21c17097,0xeda2664c,0xdc42309b,0x0e9545dc,
  74881. 0x73957dd6,0xb1f815c3 } },
  74882. /* 221 */
  74883. { { 0x89fec44a,0x84faa78e,0x3caa4caf,0xc8c2ae47,0xc1b6a624,0x691c807d,
  74884. 0x1543f052,0xa41aed14 },
  74885. { 0x7d5ffe04,0x42435399,0x625b6e20,0x8bacb2df,0x87817775,0x85d660be,
  74886. 0x86fb60ef,0xd6e9c1dd } },
  74887. /* 222 */
  74888. { { 0xc6853264,0x3aa2e97e,0xe2304a0b,0x771533b7,0xb8eae9be,0x1b912bb7,
  74889. 0xae9bf8c2,0x9c9c6e10 },
  74890. { 0xe030b74c,0xa2309a59,0x6a631e90,0x4ed7494d,0xa49b79f2,0x89f44b23,
  74891. 0x40fa61b6,0x566bd596 } },
  74892. /* 223 */
  74893. { { 0xc18061f3,0x066c0118,0x7c83fc70,0x190b25d3,0x27273245,0xf05fc8e0,
  74894. 0xf525345e,0xcf2c7390 },
  74895. { 0x10eb30cf,0xa09bceb4,0x0d77703a,0xcfd2ebba,0x150ff255,0xe842c43a,
  74896. 0x8aa20979,0x02f51755 } },
  74897. /* 224 */
  74898. { { 0xaddb7d07,0x396ef794,0x24455500,0x0b4fc742,0xc78aa3ce,0xfaff8eac,
  74899. 0xe8d4d97d,0x14e9ada5 },
  74900. { 0x2f7079e2,0xdaa480a1,0xe4b0800e,0x45baa3cd,0x7838157d,0x01765e2d,
  74901. 0x8e9d9ae8,0xa0ad4fab } },
  74902. /* 225 */
  74903. { { 0x4a653618,0x0bfb7621,0x31eaaa5f,0x1872813c,0x44949d5e,0x1553e737,
  74904. 0x6e56ed1e,0xbcd530b8 },
  74905. { 0x32e9c47b,0x169be853,0xb50059ab,0xdc2776fe,0x192bfbb4,0xcdba9761,
  74906. 0x6979341d,0x909283cf } },
  74907. /* 226 */
  74908. { { 0x76e81a13,0x67b00324,0x62171239,0x9bee1a99,0xd32e19d6,0x08ed361b,
  74909. 0xace1549a,0x35eeb7c9 },
  74910. { 0x7e4e5bdc,0x1280ae5a,0xb6ceec6e,0x2dcd2cd3,0x6e266bc1,0x52e4224c,
  74911. 0x448ae864,0x9a8b2cf4 } },
  74912. /* 227 */
  74913. { { 0x09d03b59,0xf6471bf2,0xb65af2ab,0xc90e62a3,0xebd5eec9,0xff7ff168,
  74914. 0xd4491379,0x6bdb60f4 },
  74915. { 0x8a55bc30,0xdadafebc,0x10097fe0,0xc79ead16,0x4c1e3bdd,0x42e19741,
  74916. 0x94ba08a9,0x01ec3cfd } },
  74917. /* 228 */
  74918. { { 0xdc9485c2,0xba6277eb,0x22fb10c7,0x48cc9a79,0x70a28d8a,0x4f61d60f,
  74919. 0x475464f6,0xd1acb1c0 },
  74920. { 0x26f36612,0xd26902b1,0xe0618d8b,0x59c3a44e,0x308357ee,0x4df8a813,
  74921. 0x405626c2,0x7dcd079d } },
  74922. /* 229 */
  74923. { { 0xf05a4b48,0x5ce7d4d3,0x37230772,0xadcd2952,0x812a915a,0xd18f7971,
  74924. 0x377d19b8,0x0bf53589 },
  74925. { 0x6c68ea73,0x35ecd95a,0x823a584d,0xc7f3bbca,0xf473a723,0x9fb674c6,
  74926. 0xe16686fc,0xd28be4d9 } },
  74927. /* 230 */
  74928. { { 0x38fa8e4b,0x5d2b9906,0x893fd8fc,0x559f186e,0x436fb6fc,0x3a6de2aa,
  74929. 0x510f88ce,0xd76007aa },
  74930. { 0x523a4988,0x2d10aab6,0x74dd0273,0xb455cf44,0xa3407278,0x7f467082,
  74931. 0xb303bb01,0xf2b52f68 } },
  74932. /* 231 */
  74933. { { 0x9835b4ca,0x0d57eafa,0xbb669cbc,0x2d2232fc,0xc6643198,0x8eeeb680,
  74934. 0xcc5aed3a,0xd8dbe98e },
  74935. { 0xc5a02709,0xcba9be3f,0xf5ba1fa8,0x30be68e5,0xf10ea852,0xfebd43cd,
  74936. 0xee559705,0xe01593a3 } },
  74937. /* 232 */
  74938. { { 0xea75a0a6,0xd3e5af50,0x57858033,0x512226ac,0xd0176406,0x6fe6d50f,
  74939. 0xaeb8ef06,0xafec07b1 },
  74940. { 0x80bb0a31,0x7fb99567,0x37309aae,0x6f1af3cc,0x01abf389,0x9153a15a,
  74941. 0x6e2dbfdd,0xa71b9354 } },
  74942. /* 233 */
  74943. { { 0x18f593d2,0xbf8e12e0,0xa078122b,0xd1a90428,0x0ba4f2ad,0x150505db,
  74944. 0x628523d9,0x53a2005c },
  74945. { 0xe7f2b935,0x07c8b639,0xc182961a,0x2bff975a,0x7518ca2c,0x86bceea7,
  74946. 0x3d588e3d,0xbf47d19b } },
  74947. /* 234 */
  74948. { { 0xdd7665d5,0x672967a7,0x2f2f4de5,0x4e303057,0x80d4903f,0x144005ae,
  74949. 0x39c9a1b6,0x001c2c7f },
  74950. { 0x69efc6d6,0x143a8014,0x7bc7a724,0xc810bdaa,0xa78150a4,0x5f65670b,
  74951. 0x86ffb99b,0xfdadf8e7 } },
  74952. /* 235 */
  74953. { { 0xffc00785,0xfd38cb88,0x3b48eb67,0x77fa7591,0xbf368fbc,0x0454d055,
  74954. 0x5aa43c94,0x3a838e4d },
  74955. { 0x3e97bb9a,0x56166329,0x441d94d9,0x9eb93363,0x0adb2a83,0x515591a6,
  74956. 0x873e1da3,0x3cdb8257 } },
  74957. /* 236 */
  74958. { { 0x7de77eab,0x137140a9,0x41648109,0xf7e1c50d,0xceb1d0df,0x762dcad2,
  74959. 0xf1f57fba,0x5a60cc89 },
  74960. { 0x40d45673,0x80b36382,0x5913c655,0x1b82be19,0xdd64b741,0x057284b8,
  74961. 0xdbfd8fc0,0x922ff56f } },
  74962. /* 237 */
  74963. { { 0xc9a129a1,0x1b265dee,0xcc284e04,0xa5b1ce57,0xcebfbe3c,0x04380c46,
  74964. 0xf6c5cd62,0x72919a7d },
  74965. { 0x8fb90f9a,0x298f453a,0x88e4031b,0xd719c00b,0x796f1856,0xe32c0e77,
  74966. 0x3624089a,0x5e791780 } },
  74967. /* 238 */
  74968. { { 0x7f63cdfb,0x5c16ec55,0xf1cae4fd,0x8e6a3571,0x560597ca,0xfce26bea,
  74969. 0xe24c2fab,0x4e0a5371 },
  74970. { 0xa5765357,0x276a40d3,0x0d73a2b4,0x3c89af44,0x41d11a32,0xb8f370ae,
  74971. 0xd56604ee,0xf5ff7818 } },
  74972. /* 239 */
  74973. { { 0x1a09df21,0xfbf3e3fe,0xe66e8e47,0x26d5d28e,0x29c89015,0x2096bd0a,
  74974. 0x533f5e64,0xe41df0e9 },
  74975. { 0xb3ba9e3f,0x305fda40,0x2604d895,0xf2340ceb,0x7f0367c7,0x0866e192,
  74976. 0xac4f155f,0x8edd7d6e } },
  74977. /* 240 */
  74978. { { 0x0bfc8ff3,0xc9a1dc0e,0xe936f42f,0x14efd82b,0xcca381ef,0x67016f7c,
  74979. 0xed8aee96,0x1432c1ca },
  74980. { 0x70b23c26,0xec684829,0x0735b273,0xa64fe873,0xeaef0f5a,0xe389f6e5,
  74981. 0x5ac8d2c6,0xcaef480b } },
  74982. /* 241 */
  74983. { { 0x75315922,0x5245c978,0x3063cca5,0xd8295171,0xb64ef2cb,0xf3ce60d0,
  74984. 0x8efae236,0xd0ba177e },
  74985. { 0xb1b3af60,0x53a9ae8f,0x3d2da20e,0x1a796ae5,0xdf9eef28,0x01d63605,
  74986. 0x1c54ae16,0xf31c957c } },
  74987. /* 242 */
  74988. { { 0x49cc4597,0xc0f58d52,0xbae0a028,0xdc5015b0,0x734a814a,0xefc5fc55,
  74989. 0x96e17c3a,0x013404cb },
  74990. { 0xc9a824bf,0xb29e2585,0x001eaed7,0xd593185e,0x61ef68ac,0x8d6ee682,
  74991. 0x91933e6c,0x6f377c4b } },
  74992. /* 243 */
  74993. { { 0xa8333fd2,0x9f93bad1,0x5a2a95b8,0xa8930202,0xeaf75ace,0x211e5037,
  74994. 0xd2d09506,0x6dba3e4e },
  74995. { 0xd04399cd,0xa48ef98c,0xe6b73ade,0x1811c66e,0xc17ecaf3,0x72f60752,
  74996. 0x3becf4a7,0xf13cf342 } },
  74997. /* 244 */
  74998. { { 0xa919e2eb,0xceeb9ec0,0xf62c0f68,0x83a9a195,0x7aba2299,0xcfba3bb6,
  74999. 0x274bbad3,0xc83fa9a9 },
  75000. { 0x62fa1ce0,0x0d7d1b0b,0x3418efbf,0xe58b60f5,0x52706f04,0xbfa8ef9e,
  75001. 0x5d702683,0xb49d70f4 } },
  75002. /* 245 */
  75003. { { 0xfad5513b,0x914c7510,0xb1751e2d,0x05f32eec,0xd9fb9d59,0x6d850418,
  75004. 0x0c30f1cf,0x59cfadbb },
  75005. { 0x55cb7fd6,0xe167ac23,0x820426a3,0x249367b8,0x90a78864,0xeaeec58c,
  75006. 0x354a4b67,0x5babf362 } },
  75007. /* 246 */
  75008. { { 0xee424865,0x37c981d1,0xf2e5577f,0x8b002878,0xb9e0c058,0x702970f1,
  75009. 0x9026c8f0,0x6188c6a7 },
  75010. { 0xd0f244da,0x06f9a19b,0xfb080873,0x1ecced5c,0x9f213637,0x35470f9b,
  75011. 0xdf50b9d9,0x993fe475 } },
  75012. /* 247 */
  75013. { { 0x9b2c3609,0x68e31cdf,0x2c46d4ea,0x84eb19c0,0x9a775101,0x7ac9ec1a,
  75014. 0x4c80616b,0x81f76466 },
  75015. { 0x75fbe978,0x1d7c2a5a,0xf183b356,0x6743fed3,0x501dd2bf,0x838d1f04,
  75016. 0x5fe9060d,0x564a812a } },
  75017. /* 248 */
  75018. { { 0xfa817d1d,0x7a5a64f4,0xbea82e0f,0x55f96844,0xcd57f9aa,0xb5ff5a0f,
  75019. 0x00e51d6c,0x226bf3cf },
  75020. { 0x2f2833cf,0xd6d1a9f9,0x4f4f89a8,0x20a0a35a,0x8f3f7f77,0x11536c49,
  75021. 0xff257836,0x68779f47 } },
  75022. /* 249 */
  75023. { { 0x73043d08,0x79b0c1c1,0x1fc020fa,0xa5446774,0x9a6d26d0,0xd3767e28,
  75024. 0xeb092e0b,0x97bcb0d1 },
  75025. { 0xf32ed3c3,0x2ab6eaa8,0xb281bc48,0xc8a4f151,0xbfa178f3,0x4d1bf4f3,
  75026. 0x0a784655,0xa872ffe8 } },
  75027. /* 250 */
  75028. { { 0xa32b2086,0xb1ab7935,0x8160f486,0xe1eb710e,0x3b6ae6be,0x9bd0cd91,
  75029. 0xb732a36a,0x02812bfc },
  75030. { 0xcf605318,0xa63fd7ca,0xfdfd6d1d,0x646e5d50,0x2102d619,0xa1d68398,
  75031. 0xfe5396af,0x07391cc9 } },
  75032. /* 251 */
  75033. { { 0x8b80d02b,0xc50157f0,0x62877f7f,0x6b8333d1,0x78d542ae,0x7aca1af8,
  75034. 0x7e6d2a08,0x355d2adc },
  75035. { 0x287386e1,0xb41f335a,0xf8e43275,0xfd272a94,0xe79989ea,0x286ca2cd,
  75036. 0x7c2a3a79,0x3dc2b1e3 } },
  75037. /* 252 */
  75038. { { 0x04581352,0xd689d21c,0x376782be,0x0a00c825,0x9fed701f,0x203bd590,
  75039. 0x3ccd846b,0xc4786910 },
  75040. { 0x24c768ed,0x5dba7708,0x6841f657,0x72feea02,0x6accce0e,0x73313ed5,
  75041. 0xd5bb4d32,0xccc42968 } },
  75042. /* 253 */
  75043. { { 0x3d7620b9,0x94e50de1,0x5992a56a,0xd89a5c8a,0x675487c9,0xdc007640,
  75044. 0xaa4871cf,0xe147eb42 },
  75045. { 0xacf3ae46,0x274ab4ee,0x50350fbe,0xfd4936fb,0x48c840ea,0xdf2afe47,
  75046. 0x080e96e3,0x239ac047 } },
  75047. /* 254 */
  75048. { { 0x2bfee8d4,0x481d1f35,0xfa7b0fec,0xce80b5cf,0x2ce9af3c,0x105c4c9e,
  75049. 0xf5f7e59d,0xc55fa1a3 },
  75050. { 0x8257c227,0x3186f14e,0x342be00b,0xc5b1653f,0xaa904fb2,0x09afc998,
  75051. 0xd4f4b699,0x094cd99c } },
  75052. /* 255 */
  75053. { { 0xd703beba,0x8a981c84,0x32ceb291,0x8631d150,0xe3bd49ec,0xa445f2c9,
  75054. 0x42abad33,0xb90a30b6 },
  75055. { 0xb4a5abf9,0xb465404f,0x75db7603,0x004750c3,0xca35d89f,0x6f9a42cc,
  75056. 0x1b7924f7,0x019f8b9a } },
  75057. };
  75058. /* Multiply the base point of P256 by the scalar and return the result.
  75059. * If map is true then convert result to affine coordinates.
  75060. *
  75061. * Stripe implementation.
  75062. * Pre-generated: 2^0, 2^32, ...
  75063. * Pre-generated: products of all combinations of above.
  75064. * 8 doubles and adds (with qz=1)
  75065. *
  75066. * r Resulting point.
  75067. * k Scalar to multiply by.
  75068. * map Indicates whether to convert result to affine.
  75069. * ct Constant time required.
  75070. * heap Heap to use for allocation.
  75071. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  75072. */
  75073. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  75074. int map, int ct, void* heap)
  75075. {
  75076. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  75077. k, map, ct, heap);
  75078. }
  75079. #endif
  75080. /* Multiply the base point of P256 by the scalar and return the result.
  75081. * If map is true then convert result to affine coordinates.
  75082. *
  75083. * km Scalar to multiply by.
  75084. * r Resulting point.
  75085. * map Indicates whether to convert result to affine.
  75086. * heap Heap to use for allocation.
  75087. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  75088. */
  75089. int sp_ecc_mulmod_base_256(const mp_int* km, ecc_point* r, int map, void* heap)
  75090. {
  75091. #ifdef WOLFSSL_SP_SMALL_STACK
  75092. sp_point_256* point = NULL;
  75093. sp_digit* k = NULL;
  75094. #else
  75095. sp_point_256 point[1];
  75096. sp_digit k[8];
  75097. #endif
  75098. int err = MP_OKAY;
  75099. #ifdef WOLFSSL_SP_SMALL_STACK
  75100. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  75101. DYNAMIC_TYPE_ECC);
  75102. if (point == NULL)
  75103. err = MEMORY_E;
  75104. if (err == MP_OKAY) {
  75105. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  75106. DYNAMIC_TYPE_ECC);
  75107. if (k == NULL)
  75108. err = MEMORY_E;
  75109. }
  75110. #endif
  75111. if (err == MP_OKAY) {
  75112. sp_256_from_mp(k, 8, km);
  75113. err = sp_256_ecc_mulmod_base_8(point, k, map, 1, heap);
  75114. }
  75115. if (err == MP_OKAY) {
  75116. err = sp_256_point_to_ecc_point_8(point, r);
  75117. }
  75118. #ifdef WOLFSSL_SP_SMALL_STACK
  75119. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  75120. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  75121. #endif
  75122. return err;
  75123. }
  75124. /* Multiply the base point of P256 by the scalar, add point a and return
  75125. * the result. If map is true then convert result to affine coordinates.
  75126. *
  75127. * km Scalar to multiply by.
  75128. * am Point to add to scalar multiply result.
  75129. * inMont Point to add is in montgomery form.
  75130. * r Resulting point.
  75131. * map Indicates whether to convert result to affine.
  75132. * heap Heap to use for allocation.
  75133. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  75134. */
  75135. int sp_ecc_mulmod_base_add_256(const mp_int* km, const ecc_point* am,
  75136. int inMont, ecc_point* r, int map, void* heap)
  75137. {
  75138. #ifdef WOLFSSL_SP_SMALL_STACK
  75139. sp_point_256* point = NULL;
  75140. sp_digit* k = NULL;
  75141. #else
  75142. sp_point_256 point[2];
  75143. sp_digit k[8 + 8 * 2 * 6];
  75144. #endif
  75145. sp_point_256* addP = NULL;
  75146. sp_digit* tmp = NULL;
  75147. int err = MP_OKAY;
  75148. #ifdef WOLFSSL_SP_SMALL_STACK
  75149. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  75150. DYNAMIC_TYPE_ECC);
  75151. if (point == NULL)
  75152. err = MEMORY_E;
  75153. if (err == MP_OKAY) {
  75154. k = (sp_digit*)XMALLOC(
  75155. sizeof(sp_digit) * (8 + 8 * 2 * 6),
  75156. heap, DYNAMIC_TYPE_ECC);
  75157. if (k == NULL)
  75158. err = MEMORY_E;
  75159. }
  75160. #endif
  75161. if (err == MP_OKAY) {
  75162. addP = point + 1;
  75163. tmp = k + 8;
  75164. sp_256_from_mp(k, 8, km);
  75165. sp_256_point_from_ecc_point_8(addP, am);
  75166. }
  75167. if ((err == MP_OKAY) && (!inMont)) {
  75168. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  75169. }
  75170. if ((err == MP_OKAY) && (!inMont)) {
  75171. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  75172. }
  75173. if ((err == MP_OKAY) && (!inMont)) {
  75174. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  75175. }
  75176. if (err == MP_OKAY) {
  75177. err = sp_256_ecc_mulmod_base_8(point, k, 0, 0, heap);
  75178. }
  75179. if (err == MP_OKAY) {
  75180. sp_256_proj_point_add_8(point, point, addP, tmp);
  75181. if (map) {
  75182. sp_256_map_8(point, point, tmp);
  75183. }
  75184. err = sp_256_point_to_ecc_point_8(point, r);
  75185. }
  75186. #ifdef WOLFSSL_SP_SMALL_STACK
  75187. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  75188. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  75189. #endif
  75190. return err;
  75191. }
  75192. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  75193. defined(HAVE_ECC_VERIFY)
  75194. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  75195. /* Add 1 to a. (a = a + 1)
  75196. *
  75197. * a A single precision integer.
  75198. */
  75199. static void sp_256_add_one_8(sp_digit* a_p)
  75200. {
  75201. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  75202. __asm__ __volatile__ (
  75203. "ldm %[a], {r1, r2, r3, r4}\n\t"
  75204. "adds r1, r1, #1\n\t"
  75205. "adcs r2, r2, #0\n\t"
  75206. "adcs r3, r3, #0\n\t"
  75207. "adcs r4, r4, #0\n\t"
  75208. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  75209. "ldm %[a], {r1, r2, r3, r4}\n\t"
  75210. "adcs r1, r1, #0\n\t"
  75211. "adcs r2, r2, #0\n\t"
  75212. "adcs r3, r3, #0\n\t"
  75213. "adcs r4, r4, #0\n\t"
  75214. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  75215. : [a] "+r" (a)
  75216. :
  75217. : "memory", "r1", "r2", "r3", "r4", "cc"
  75218. );
  75219. }
  75220. /* Read big endian unsigned byte array into r.
  75221. *
  75222. * r A single precision integer.
  75223. * size Maximum number of bytes to convert
  75224. * a Byte array.
  75225. * n Number of bytes in array to read.
  75226. */
  75227. static void sp_256_from_bin(sp_digit* r, int size, const byte* a, int n)
  75228. {
  75229. int i;
  75230. int j;
  75231. byte* d;
  75232. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  75233. r[j] = ((sp_digit)a[i - 0] << 0) |
  75234. ((sp_digit)a[i - 1] << 8) |
  75235. ((sp_digit)a[i - 2] << 16) |
  75236. ((sp_digit)a[i - 3] << 24);
  75237. j++;
  75238. }
  75239. if (i >= 0) {
  75240. r[j] = 0;
  75241. d = (byte*)r;
  75242. switch (i) {
  75243. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  75244. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  75245. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  75246. }
  75247. j++;
  75248. }
  75249. for (; j < size; j++) {
  75250. r[j] = 0;
  75251. }
  75252. }
  75253. /* Generates a scalar that is in the range 1..order-1.
  75254. *
  75255. * rng Random number generator.
  75256. * k Scalar value.
  75257. * returns RNG failures, MEMORY_E when memory allocation fails and
  75258. * MP_OKAY on success.
  75259. */
  75260. static int sp_256_ecc_gen_k_8(WC_RNG* rng, sp_digit* k)
  75261. {
  75262. #ifndef WC_NO_RNG
  75263. int err;
  75264. byte buf[32];
  75265. do {
  75266. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  75267. if (err == 0) {
  75268. sp_256_from_bin(k, 8, buf, (int)sizeof(buf));
  75269. if (sp_256_cmp_8(k, p256_order2) <= 0) {
  75270. sp_256_add_one_8(k);
  75271. break;
  75272. }
  75273. }
  75274. }
  75275. while (err == 0);
  75276. return err;
  75277. #else
  75278. (void)rng;
  75279. (void)k;
  75280. return NOT_COMPILED_IN;
  75281. #endif
  75282. }
  75283. /* Makes a random EC key pair.
  75284. *
  75285. * rng Random number generator.
  75286. * priv Generated private value.
  75287. * pub Generated public point.
  75288. * heap Heap to use for allocation.
  75289. * returns ECC_INF_E when the point does not have the correct order, RNG
  75290. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  75291. */
  75292. int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  75293. {
  75294. #ifdef WOLFSSL_SP_SMALL_STACK
  75295. sp_point_256* point = NULL;
  75296. sp_digit* k = NULL;
  75297. #else
  75298. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75299. sp_point_256 point[2];
  75300. #else
  75301. sp_point_256 point[1];
  75302. #endif
  75303. sp_digit k[8];
  75304. #endif
  75305. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75306. sp_point_256* infinity = NULL;
  75307. #endif
  75308. int err = MP_OKAY;
  75309. (void)heap;
  75310. #ifdef WOLFSSL_SP_SMALL_STACK
  75311. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75312. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC);
  75313. #else
  75314. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC);
  75315. #endif
  75316. if (point == NULL)
  75317. err = MEMORY_E;
  75318. if (err == MP_OKAY) {
  75319. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  75320. DYNAMIC_TYPE_ECC);
  75321. if (k == NULL)
  75322. err = MEMORY_E;
  75323. }
  75324. #endif
  75325. if (err == MP_OKAY) {
  75326. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75327. infinity = point + 1;
  75328. #endif
  75329. err = sp_256_ecc_gen_k_8(rng, k);
  75330. }
  75331. if (err == MP_OKAY) {
  75332. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, NULL);
  75333. }
  75334. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75335. if (err == MP_OKAY) {
  75336. err = sp_256_ecc_mulmod_8(infinity, point, p256_order, 1, 1, NULL);
  75337. }
  75338. if (err == MP_OKAY) {
  75339. if (sp_256_iszero_8(point->x) || sp_256_iszero_8(point->y)) {
  75340. err = ECC_INF_E;
  75341. }
  75342. }
  75343. #endif
  75344. if (err == MP_OKAY) {
  75345. err = sp_256_to_mp(k, priv);
  75346. }
  75347. if (err == MP_OKAY) {
  75348. err = sp_256_point_to_ecc_point_8(point, pub);
  75349. }
  75350. #ifdef WOLFSSL_SP_SMALL_STACK
  75351. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  75352. /* point is not sensitive, so no need to zeroize */
  75353. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  75354. #endif
  75355. return err;
  75356. }
  75357. #ifdef WOLFSSL_SP_NONBLOCK
  75358. typedef struct sp_ecc_key_gen_256_ctx {
  75359. int state;
  75360. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  75361. sp_digit k[8];
  75362. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75363. sp_point_256 point[2];
  75364. #else
  75365. sp_point_256 point[1];
  75366. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  75367. } sp_ecc_key_gen_256_ctx;
  75368. int sp_ecc_make_key_256_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  75369. ecc_point* pub, void* heap)
  75370. {
  75371. int err = FP_WOULDBLOCK;
  75372. sp_ecc_key_gen_256_ctx* ctx = (sp_ecc_key_gen_256_ctx*)sp_ctx->data;
  75373. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75374. sp_point_256* infinity = ctx->point + 1;
  75375. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  75376. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_256_ctx)
  75377. >= sizeof(*sp_ctx) ? -1 : 1];
  75378. (void)sizeof(ctx_size_test);
  75379. switch (ctx->state) {
  75380. case 0:
  75381. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  75382. if (err == MP_OKAY) {
  75383. err = FP_WOULDBLOCK;
  75384. ctx->state = 1;
  75385. }
  75386. break;
  75387. case 1:
  75388. err = sp_256_ecc_mulmod_base_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  75389. ctx->point, ctx->k, 1, 1, heap);
  75390. if (err == MP_OKAY) {
  75391. err = FP_WOULDBLOCK;
  75392. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75393. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  75394. ctx->state = 2;
  75395. #else
  75396. ctx->state = 3;
  75397. #endif
  75398. }
  75399. break;
  75400. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  75401. case 2:
  75402. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  75403. infinity, ctx->point, p256_order, 1, 1);
  75404. if (err == MP_OKAY) {
  75405. if (sp_256_iszero_8(ctx->point->x) ||
  75406. sp_256_iszero_8(ctx->point->y)) {
  75407. err = ECC_INF_E;
  75408. }
  75409. else {
  75410. err = FP_WOULDBLOCK;
  75411. ctx->state = 3;
  75412. }
  75413. }
  75414. break;
  75415. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  75416. case 3:
  75417. err = sp_256_to_mp(ctx->k, priv);
  75418. if (err == MP_OKAY) {
  75419. err = sp_256_point_to_ecc_point_8(ctx->point, pub);
  75420. }
  75421. break;
  75422. }
  75423. if (err != FP_WOULDBLOCK) {
  75424. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_256_ctx));
  75425. }
  75426. return err;
  75427. }
  75428. #endif /* WOLFSSL_SP_NONBLOCK */
  75429. #ifdef HAVE_ECC_DHE
  75430. /* Write r as big endian to byte array.
  75431. * Fixed length number of bytes written: 32
  75432. *
  75433. * r A single precision integer.
  75434. * a Byte array.
  75435. */
  75436. static void sp_256_to_bin_8(sp_digit* r, byte* a)
  75437. {
  75438. int i;
  75439. int j = 0;
  75440. for (i = 7; i >= 0; i--) {
  75441. a[j++] = r[i] >> 24;
  75442. a[j++] = r[i] >> 16;
  75443. a[j++] = r[i] >> 8;
  75444. a[j++] = r[i] >> 0;
  75445. }
  75446. }
  75447. /* Multiply the point by the scalar and serialize the X ordinate.
  75448. * The number is 0 padded to maximum size on output.
  75449. *
  75450. * priv Scalar to multiply the point by.
  75451. * pub Point to multiply.
  75452. * out Buffer to hold X ordinate.
  75453. * outLen On entry, size of the buffer in bytes.
  75454. * On exit, length of data in buffer in bytes.
  75455. * heap Heap to use for allocation.
  75456. * returns BUFFER_E if the buffer is to small for output size,
  75457. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  75458. */
  75459. int sp_ecc_secret_gen_256(const mp_int* priv, const ecc_point* pub, byte* out,
  75460. word32* outLen, void* heap)
  75461. {
  75462. #ifdef WOLFSSL_SP_SMALL_STACK
  75463. sp_point_256* point = NULL;
  75464. sp_digit* k = NULL;
  75465. #else
  75466. sp_point_256 point[1];
  75467. sp_digit k[8];
  75468. #endif
  75469. int err = MP_OKAY;
  75470. if (*outLen < 32U) {
  75471. err = BUFFER_E;
  75472. }
  75473. #ifdef WOLFSSL_SP_SMALL_STACK
  75474. if (err == MP_OKAY) {
  75475. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  75476. DYNAMIC_TYPE_ECC);
  75477. if (point == NULL)
  75478. err = MEMORY_E;
  75479. }
  75480. if (err == MP_OKAY) {
  75481. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  75482. DYNAMIC_TYPE_ECC);
  75483. if (k == NULL)
  75484. err = MEMORY_E;
  75485. }
  75486. #endif
  75487. if (err == MP_OKAY) {
  75488. sp_256_from_mp(k, 8, priv);
  75489. sp_256_point_from_ecc_point_8(point, pub);
  75490. err = sp_256_ecc_mulmod_8(point, point, k, 1, 1, heap);
  75491. }
  75492. if (err == MP_OKAY) {
  75493. sp_256_to_bin_8(point->x, out);
  75494. *outLen = 32;
  75495. }
  75496. #ifdef WOLFSSL_SP_SMALL_STACK
  75497. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  75498. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  75499. #endif
  75500. return err;
  75501. }
  75502. #ifdef WOLFSSL_SP_NONBLOCK
  75503. typedef struct sp_ecc_sec_gen_256_ctx {
  75504. int state;
  75505. union {
  75506. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  75507. };
  75508. sp_digit k[8];
  75509. sp_point_256 point;
  75510. } sp_ecc_sec_gen_256_ctx;
  75511. int sp_ecc_secret_gen_256_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  75512. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  75513. {
  75514. int err = FP_WOULDBLOCK;
  75515. sp_ecc_sec_gen_256_ctx* ctx = (sp_ecc_sec_gen_256_ctx*)sp_ctx->data;
  75516. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  75517. (void)sizeof(ctx_size_test);
  75518. if (*outLen < 32U) {
  75519. err = BUFFER_E;
  75520. }
  75521. switch (ctx->state) {
  75522. case 0:
  75523. sp_256_from_mp(ctx->k, 8, priv);
  75524. sp_256_point_from_ecc_point_8(&ctx->point, pub);
  75525. ctx->state = 1;
  75526. break;
  75527. case 1:
  75528. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  75529. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  75530. if (err == MP_OKAY) {
  75531. sp_256_to_bin_8(ctx->point.x, out);
  75532. *outLen = 32;
  75533. }
  75534. break;
  75535. }
  75536. if (err == MP_OKAY && ctx->state != 1) {
  75537. err = FP_WOULDBLOCK;
  75538. }
  75539. if (err != FP_WOULDBLOCK) {
  75540. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_256_ctx));
  75541. }
  75542. return err;
  75543. }
  75544. #endif /* WOLFSSL_SP_NONBLOCK */
  75545. #endif /* HAVE_ECC_DHE */
  75546. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  75547. #endif
  75548. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  75549. #endif
  75550. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  75551. #ifdef WOLFSSL_SP_SMALL
  75552. /* Sub b from a into a. (a -= b)
  75553. *
  75554. * a A single precision integer.
  75555. * b A single precision integer.
  75556. */
  75557. static sp_digit sp_256_sub_in_place_8(sp_digit* a_p, const sp_digit* b_p)
  75558. {
  75559. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  75560. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  75561. __asm__ __volatile__ (
  75562. "mov r12, #0\n\t"
  75563. "add lr, %[a], #32\n\t"
  75564. "\n"
  75565. "L_sp_256_sub_in_pkace_8_word_%=: \n\t"
  75566. "rsbs r12, r12, #0\n\t"
  75567. "ldm %[a], {r2, r3, r4, r5}\n\t"
  75568. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  75569. "sbcs r2, r2, r6\n\t"
  75570. "sbcs r3, r3, r7\n\t"
  75571. "sbcs r4, r4, r8\n\t"
  75572. "sbcs r5, r5, r9\n\t"
  75573. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  75574. "sbc r12, r12, r12\n\t"
  75575. "cmp %[a], lr\n\t"
  75576. "bne L_sp_256_sub_in_pkace_8_word_%=\n\t"
  75577. "mov %[a], r12\n\t"
  75578. : [a] "+r" (a), [b] "+r" (b)
  75579. :
  75580. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  75581. );
  75582. return (uint32_t)(size_t)a;
  75583. }
  75584. #else
  75585. /* Sub b from a into a. (a -= b)
  75586. *
  75587. * a A single precision integer and result.
  75588. * b A single precision integer.
  75589. */
  75590. static sp_digit sp_256_sub_in_place_8(sp_digit* a_p, const sp_digit* b_p)
  75591. {
  75592. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  75593. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  75594. __asm__ __volatile__ (
  75595. "ldm %[a], {r2, r3, r4, r5}\n\t"
  75596. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  75597. "subs r2, r2, r6\n\t"
  75598. "sbcs r3, r3, r7\n\t"
  75599. "sbcs r4, r4, r8\n\t"
  75600. "sbcs r5, r5, r9\n\t"
  75601. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  75602. "ldm %[a], {r2, r3, r4, r5}\n\t"
  75603. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  75604. "sbcs r2, r2, r6\n\t"
  75605. "sbcs r3, r3, r7\n\t"
  75606. "sbcs r4, r4, r8\n\t"
  75607. "sbcs r5, r5, r9\n\t"
  75608. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  75609. "sbc %[a], r9, r9\n\t"
  75610. : [a] "+r" (a), [b] "+r" (b)
  75611. :
  75612. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  75613. );
  75614. return (uint32_t)(size_t)a;
  75615. }
  75616. #endif /* WOLFSSL_SP_SMALL */
  75617. #ifdef WOLFSSL_SP_SMALL
  75618. /* Mul a by digit b into r. (r = a * b)
  75619. *
  75620. * r A single precision integer.
  75621. * a A single precision integer.
  75622. * b A single precision digit.
  75623. */
  75624. static void sp_256_mul_d_8(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  75625. {
  75626. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  75627. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  75628. register sp_digit b asm ("r2") = (sp_digit)b_p;
  75629. __asm__ __volatile__ (
  75630. /* A[0] * B */
  75631. "ldr r8, [%[a]]\n\t"
  75632. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75633. "lsl r6, %[b], #16\n\t"
  75634. "lsl r5, r8, #16\n\t"
  75635. "lsr r6, r6, #16\n\t"
  75636. "lsr r5, r5, #16\n\t"
  75637. "mul r5, r6, r5\n\t"
  75638. "lsr r7, r8, #16\n\t"
  75639. "mul r6, r7, r6\n\t"
  75640. "lsr r3, r6, #16\n\t"
  75641. "lsl r6, r6, #16\n\t"
  75642. "adds r5, r5, r6\n\t"
  75643. "adc r3, r3, #0\n\t"
  75644. "lsr r6, %[b], #16\n\t"
  75645. "mul r7, r6, r7\n\t"
  75646. "add r3, r3, r7\n\t"
  75647. "lsl r7, r8, #16\n\t"
  75648. "lsr r7, r7, #16\n\t"
  75649. "mul r6, r7, r6\n\t"
  75650. "lsr r7, r6, #16\n\t"
  75651. "lsl r6, r6, #16\n\t"
  75652. "adds r5, r5, r6\n\t"
  75653. "adc r3, r3, r7\n\t"
  75654. #else
  75655. "umull r5, r3, %[b], r8\n\t"
  75656. #endif
  75657. "mov r4, #0\n\t"
  75658. "str r5, [%[r]]\n\t"
  75659. "mov r5, #0\n\t"
  75660. "mov r9, #4\n\t"
  75661. "\n"
  75662. "L_sp_256_mul_d_8_word_%=: \n\t"
  75663. /* A[i] * B */
  75664. "ldr r8, [%[a], r9]\n\t"
  75665. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75666. "lsl r6, %[b], #16\n\t"
  75667. "lsl r7, r8, #16\n\t"
  75668. "lsr r6, r6, #16\n\t"
  75669. "lsr r7, r7, #16\n\t"
  75670. "mul r7, r6, r7\n\t"
  75671. "adds r3, r3, r7\n\t"
  75672. "adcs r4, r4, #0\n\t"
  75673. "adc r5, r5, #0\n\t"
  75674. "lsr r7, r8, #16\n\t"
  75675. "mul r6, r7, r6\n\t"
  75676. "lsr r7, r6, #16\n\t"
  75677. "lsl r6, r6, #16\n\t"
  75678. "adds r3, r3, r6\n\t"
  75679. "adcs r4, r4, r7\n\t"
  75680. "adc r5, r5, #0\n\t"
  75681. "lsr r6, %[b], #16\n\t"
  75682. "lsr r7, r8, #16\n\t"
  75683. "mul r7, r6, r7\n\t"
  75684. "adds r4, r4, r7\n\t"
  75685. "adc r5, r5, #0\n\t"
  75686. "lsl r7, r8, #16\n\t"
  75687. "lsr r7, r7, #16\n\t"
  75688. "mul r6, r7, r6\n\t"
  75689. "lsr r7, r6, #16\n\t"
  75690. "lsl r6, r6, #16\n\t"
  75691. "adds r3, r3, r6\n\t"
  75692. "adcs r4, r4, r7\n\t"
  75693. "adc r5, r5, #0\n\t"
  75694. #else
  75695. "umull r6, r7, %[b], r8\n\t"
  75696. "adds r3, r3, r6\n\t"
  75697. "adcs r4, r4, r7\n\t"
  75698. "adc r5, r5, #0\n\t"
  75699. #endif
  75700. "str r3, [%[r], r9]\n\t"
  75701. "mov r3, r4\n\t"
  75702. "mov r4, r5\n\t"
  75703. "mov r5, #0\n\t"
  75704. "add r9, r9, #4\n\t"
  75705. "cmp r9, #32\n\t"
  75706. "blt L_sp_256_mul_d_8_word_%=\n\t"
  75707. "str r3, [%[r], #32]\n\t"
  75708. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  75709. :
  75710. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  75711. );
  75712. }
  75713. #else
  75714. /* Mul a by digit b into r. (r = a * b)
  75715. *
  75716. * r A single precision integer.
  75717. * a A single precision integer.
  75718. * b A single precision digit.
  75719. */
  75720. static void sp_256_mul_d_8(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  75721. {
  75722. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  75723. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  75724. register sp_digit b asm ("r2") = (sp_digit)b_p;
  75725. __asm__ __volatile__ (
  75726. /* A[0] * B */
  75727. "ldm %[a]!, {r8}\n\t"
  75728. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75729. "lsl r6, %[b], #16\n\t"
  75730. "lsl r3, r8, #16\n\t"
  75731. "lsr r6, r6, #16\n\t"
  75732. "lsr r3, r3, #16\n\t"
  75733. "mul r3, r6, r3\n\t"
  75734. "lsr r7, r8, #16\n\t"
  75735. "mul r6, r7, r6\n\t"
  75736. "lsr r4, r6, #16\n\t"
  75737. "lsl r6, r6, #16\n\t"
  75738. "adds r3, r3, r6\n\t"
  75739. "adc r4, r4, #0\n\t"
  75740. "lsr r6, %[b], #16\n\t"
  75741. "mul r7, r6, r7\n\t"
  75742. "add r4, r4, r7\n\t"
  75743. "lsl r7, r8, #16\n\t"
  75744. "lsr r7, r7, #16\n\t"
  75745. "mul r6, r7, r6\n\t"
  75746. "lsr r7, r6, #16\n\t"
  75747. "lsl r6, r6, #16\n\t"
  75748. "adds r3, r3, r6\n\t"
  75749. "adc r4, r4, r7\n\t"
  75750. #else
  75751. "umull r3, r4, %[b], r8\n\t"
  75752. #endif
  75753. "stm %[r]!, {r3}\n\t"
  75754. "mov r5, #0\n\t"
  75755. /* A[1] * B */
  75756. "ldm %[a]!, {r8}\n\t"
  75757. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75758. "lsl r6, %[b], #16\n\t"
  75759. "lsl r7, r8, #16\n\t"
  75760. "lsr r6, r6, #16\n\t"
  75761. "lsr r7, r7, #16\n\t"
  75762. "mul r7, r6, r7\n\t"
  75763. "adds r4, r4, r7\n\t"
  75764. "adc r5, r5, #0\n\t"
  75765. "lsr r7, r8, #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 r4, r4, r6\n\t"
  75770. "adc r5, r5, r7\n\t"
  75771. "lsr r6, %[b], #16\n\t"
  75772. "lsr r7, r8, #16\n\t"
  75773. "mul r7, r6, r7\n\t"
  75774. "add r5, r5, r7\n\t"
  75775. "lsl r7, r8, #16\n\t"
  75776. "lsr r7, r7, #16\n\t"
  75777. "mul r6, r7, r6\n\t"
  75778. "lsr r7, r6, #16\n\t"
  75779. "lsl r6, r6, #16\n\t"
  75780. "adds r4, r4, r6\n\t"
  75781. "adc r5, r5, r7\n\t"
  75782. #else
  75783. "umlal r4, r5, %[b], r8\n\t"
  75784. #endif
  75785. "stm %[r]!, {r4}\n\t"
  75786. "mov r3, #0\n\t"
  75787. /* A[2] * B */
  75788. "ldm %[a]!, {r8}\n\t"
  75789. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75790. "lsl r6, %[b], #16\n\t"
  75791. "lsl r7, r8, #16\n\t"
  75792. "lsr r6, r6, #16\n\t"
  75793. "lsr r7, r7, #16\n\t"
  75794. "mul r7, r6, r7\n\t"
  75795. "adds r5, r5, r7\n\t"
  75796. "adc r3, r3, #0\n\t"
  75797. "lsr r7, r8, #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 r5, r5, r6\n\t"
  75802. "adc r3, r3, r7\n\t"
  75803. "lsr r6, %[b], #16\n\t"
  75804. "lsr r7, r8, #16\n\t"
  75805. "mul r7, r6, r7\n\t"
  75806. "add r3, r3, r7\n\t"
  75807. "lsl r7, r8, #16\n\t"
  75808. "lsr r7, r7, #16\n\t"
  75809. "mul r6, r7, r6\n\t"
  75810. "lsr r7, r6, #16\n\t"
  75811. "lsl r6, r6, #16\n\t"
  75812. "adds r5, r5, r6\n\t"
  75813. "adc r3, r3, r7\n\t"
  75814. #else
  75815. "umlal r5, r3, %[b], r8\n\t"
  75816. #endif
  75817. "stm %[r]!, {r5}\n\t"
  75818. "mov r4, #0\n\t"
  75819. /* A[3] * B */
  75820. "ldm %[a]!, {r8}\n\t"
  75821. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75822. "lsl r6, %[b], #16\n\t"
  75823. "lsl r7, r8, #16\n\t"
  75824. "lsr r6, r6, #16\n\t"
  75825. "lsr r7, r7, #16\n\t"
  75826. "mul r7, r6, r7\n\t"
  75827. "adds r3, r3, r7\n\t"
  75828. "adc r4, r4, #0\n\t"
  75829. "lsr r7, r8, #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 r3, r3, r6\n\t"
  75834. "adc r4, r4, r7\n\t"
  75835. "lsr r6, %[b], #16\n\t"
  75836. "lsr r7, r8, #16\n\t"
  75837. "mul r7, r6, r7\n\t"
  75838. "add r4, r4, r7\n\t"
  75839. "lsl r7, r8, #16\n\t"
  75840. "lsr r7, r7, #16\n\t"
  75841. "mul r6, r7, r6\n\t"
  75842. "lsr r7, r6, #16\n\t"
  75843. "lsl r6, r6, #16\n\t"
  75844. "adds r3, r3, r6\n\t"
  75845. "adc r4, r4, r7\n\t"
  75846. #else
  75847. "umlal r3, r4, %[b], r8\n\t"
  75848. #endif
  75849. "stm %[r]!, {r3}\n\t"
  75850. "mov r5, #0\n\t"
  75851. /* A[4] * B */
  75852. "ldm %[a]!, {r8}\n\t"
  75853. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75854. "lsl r6, %[b], #16\n\t"
  75855. "lsl r7, r8, #16\n\t"
  75856. "lsr r6, r6, #16\n\t"
  75857. "lsr r7, r7, #16\n\t"
  75858. "mul r7, r6, r7\n\t"
  75859. "adds r4, r4, r7\n\t"
  75860. "adc r5, r5, #0\n\t"
  75861. "lsr r7, r8, #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 r4, r4, r6\n\t"
  75866. "adc r5, r5, r7\n\t"
  75867. "lsr r6, %[b], #16\n\t"
  75868. "lsr r7, r8, #16\n\t"
  75869. "mul r7, r6, r7\n\t"
  75870. "add r5, r5, r7\n\t"
  75871. "lsl r7, r8, #16\n\t"
  75872. "lsr r7, r7, #16\n\t"
  75873. "mul r6, r7, r6\n\t"
  75874. "lsr r7, r6, #16\n\t"
  75875. "lsl r6, r6, #16\n\t"
  75876. "adds r4, r4, r6\n\t"
  75877. "adc r5, r5, r7\n\t"
  75878. #else
  75879. "umlal r4, r5, %[b], r8\n\t"
  75880. #endif
  75881. "stm %[r]!, {r4}\n\t"
  75882. "mov r3, #0\n\t"
  75883. /* A[5] * B */
  75884. "ldm %[a]!, {r8}\n\t"
  75885. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75886. "lsl r6, %[b], #16\n\t"
  75887. "lsl r7, r8, #16\n\t"
  75888. "lsr r6, r6, #16\n\t"
  75889. "lsr r7, r7, #16\n\t"
  75890. "mul r7, r6, r7\n\t"
  75891. "adds r5, r5, r7\n\t"
  75892. "adc r3, r3, #0\n\t"
  75893. "lsr r7, r8, #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 r5, r5, r6\n\t"
  75898. "adc r3, r3, r7\n\t"
  75899. "lsr r6, %[b], #16\n\t"
  75900. "lsr r7, r8, #16\n\t"
  75901. "mul r7, r6, r7\n\t"
  75902. "add r3, r3, r7\n\t"
  75903. "lsl r7, r8, #16\n\t"
  75904. "lsr r7, r7, #16\n\t"
  75905. "mul r6, r7, r6\n\t"
  75906. "lsr r7, r6, #16\n\t"
  75907. "lsl r6, r6, #16\n\t"
  75908. "adds r5, r5, r6\n\t"
  75909. "adc r3, r3, r7\n\t"
  75910. #else
  75911. "umlal r5, r3, %[b], r8\n\t"
  75912. #endif
  75913. "stm %[r]!, {r5}\n\t"
  75914. "mov r4, #0\n\t"
  75915. /* A[6] * B */
  75916. "ldm %[a]!, {r8}\n\t"
  75917. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75918. "lsl r6, %[b], #16\n\t"
  75919. "lsl r7, r8, #16\n\t"
  75920. "lsr r6, r6, #16\n\t"
  75921. "lsr r7, r7, #16\n\t"
  75922. "mul r7, r6, r7\n\t"
  75923. "adds r3, r3, r7\n\t"
  75924. "adc r4, r4, #0\n\t"
  75925. "lsr r7, r8, #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 r3, r3, r6\n\t"
  75930. "adc r4, r4, r7\n\t"
  75931. "lsr r6, %[b], #16\n\t"
  75932. "lsr r7, r8, #16\n\t"
  75933. "mul r7, r6, r7\n\t"
  75934. "add r4, r4, r7\n\t"
  75935. "lsl r7, r8, #16\n\t"
  75936. "lsr r7, r7, #16\n\t"
  75937. "mul r6, r7, r6\n\t"
  75938. "lsr r7, r6, #16\n\t"
  75939. "lsl r6, r6, #16\n\t"
  75940. "adds r3, r3, r6\n\t"
  75941. "adc r4, r4, r7\n\t"
  75942. #else
  75943. "umlal r3, r4, %[b], r8\n\t"
  75944. #endif
  75945. "stm %[r]!, {r3}\n\t"
  75946. "mov r5, #0\n\t"
  75947. /* A[7] * B */
  75948. "ldm %[a]!, {r8}\n\t"
  75949. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  75950. "lsl r6, %[b], #16\n\t"
  75951. "lsl r7, r8, #16\n\t"
  75952. "lsr r6, r6, #16\n\t"
  75953. "lsr r7, r7, #16\n\t"
  75954. "mul r7, r6, r7\n\t"
  75955. "adds r4, r4, r7\n\t"
  75956. "adc r5, r5, #0\n\t"
  75957. "lsr r7, r8, #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 r4, r4, r6\n\t"
  75962. "adc r5, r5, r7\n\t"
  75963. "lsr r6, %[b], #16\n\t"
  75964. "lsr r7, r8, #16\n\t"
  75965. "mul r7, r6, r7\n\t"
  75966. "add r5, r5, r7\n\t"
  75967. "lsl r7, r8, #16\n\t"
  75968. "lsr r7, r7, #16\n\t"
  75969. "mul r6, r7, r6\n\t"
  75970. "lsr r7, r6, #16\n\t"
  75971. "lsl r6, r6, #16\n\t"
  75972. "adds r4, r4, r6\n\t"
  75973. "adc r5, r5, r7\n\t"
  75974. #else
  75975. "umlal r4, r5, %[b], r8\n\t"
  75976. #endif
  75977. "stm %[r]!, {r4}\n\t"
  75978. "str r5, [%[r]]\n\t"
  75979. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  75980. :
  75981. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  75982. );
  75983. }
  75984. #endif /* WOLFSSL_SP_SMALL */
  75985. #ifdef WOLFSSL_SP_USE_UDIV
  75986. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  75987. *
  75988. * d1 The high order half of the number to divide.
  75989. * d0 The low order half of the number to divide.
  75990. * div The divisor.
  75991. * returns the result of the division.
  75992. *
  75993. * Note that this is an approximate div. It may give an answer 1 larger.
  75994. */
  75995. static sp_digit div_256_word_8(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  75996. {
  75997. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  75998. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  75999. register sp_digit div asm ("r2") = (sp_digit)div_p;
  76000. __asm__ __volatile__ (
  76001. "lsr r6, %[div], #16\n\t"
  76002. "add lr, r6, #1\n\t"
  76003. "udiv r4, %[d1], lr\n\t"
  76004. "lsl r5, %[div], #16\n\t"
  76005. "lsl r4, r4, #16\n\t"
  76006. "umull r3, r12, %[div], r4\n\t"
  76007. "subs %[d0], %[d0], r3\n\t"
  76008. "sbc %[d1], %[d1], r12\n\t"
  76009. "subs r3, %[d1], lr\n\t"
  76010. "sbc r7, r7, r7\n\t"
  76011. "add r7, r7, #1\n\t"
  76012. "rsb r8, r7, #0\n\t"
  76013. "lsl r7, r7, #16\n\t"
  76014. "and r5, r5, r8\n\t"
  76015. "and r6, r6, r8\n\t"
  76016. "subs %[d0], %[d0], r5\n\t"
  76017. "add r4, r4, r7\n\t"
  76018. "sbc %[d1], %[d1], r6\n\t"
  76019. "lsl r12, %[d1], #16\n\t"
  76020. "lsr r3, %[d0], #16\n\t"
  76021. "orr r3, r3, r12\n\t"
  76022. "udiv r3, r3, lr\n\t"
  76023. "add r4, r4, r3\n\t"
  76024. "umull r3, r12, %[div], r3\n\t"
  76025. "subs %[d0], %[d0], r3\n\t"
  76026. "sbc %[d1], %[d1], r12\n\t"
  76027. "lsl r12, %[d1], #16\n\t"
  76028. "lsr r3, %[d0], #16\n\t"
  76029. "orr r3, r3, r12\n\t"
  76030. "udiv r3, r3, lr\n\t"
  76031. "add r4, r4, r3\n\t"
  76032. "mul r3, %[div], r3\n\t"
  76033. "sub %[d0], %[d0], r3\n\t"
  76034. "udiv r3, %[d0], %[div]\n\t"
  76035. "add %[d1], r4, r3\n\t"
  76036. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  76037. :
  76038. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  76039. );
  76040. return (uint32_t)(size_t)d1;
  76041. }
  76042. #else
  76043. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  76044. *
  76045. * d1 The high order half of the number to divide.
  76046. * d0 The low order half of the number to divide.
  76047. * div The divisor.
  76048. * returns the result of the division.
  76049. *
  76050. * Note that this is an approximate div. It may give an answer 1 larger.
  76051. */
  76052. static sp_digit div_256_word_8(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  76053. {
  76054. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  76055. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  76056. register sp_digit div asm ("r2") = (sp_digit)div_p;
  76057. __asm__ __volatile__ (
  76058. "lsr lr, %[div], #1\n\t"
  76059. "add lr, lr, #1\n\t"
  76060. "mov r4, %[d0]\n\t"
  76061. "mov r5, %[d1]\n\t"
  76062. /* Do top 32 */
  76063. "subs r6, lr, r5\n\t"
  76064. "sbc r6, r6, r6\n\t"
  76065. "mov r3, #0\n\t"
  76066. "sub r3, r3, r6\n\t"
  76067. "and r6, r6, lr\n\t"
  76068. "subs r5, r5, r6\n\t"
  76069. /* Next 30 bits */
  76070. "mov r12, #29\n\t"
  76071. "\n"
  76072. "L_div_256_word_8_bit_%=: \n\t"
  76073. "lsls r4, r4, #1\n\t"
  76074. "adc r5, r5, r5\n\t"
  76075. "subs r6, lr, r5\n\t"
  76076. "sbc r6, r6, r6\n\t"
  76077. "add r3, r3, r3\n\t"
  76078. "sub r3, r3, r6\n\t"
  76079. "and r6, r6, lr\n\t"
  76080. "subs r5, r5, r6\n\t"
  76081. "subs r12, r12, #1\n\t"
  76082. "bpl L_div_256_word_8_bit_%=\n\t"
  76083. "add r3, r3, r3\n\t"
  76084. "add r3, r3, #1\n\t"
  76085. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  76086. "lsl r7, r3, #16\n\t"
  76087. "lsl r4, %[div], #16\n\t"
  76088. "lsr r7, r7, #16\n\t"
  76089. "lsr r4, r4, #16\n\t"
  76090. "mul r4, r7, r4\n\t"
  76091. "lsr r8, %[div], #16\n\t"
  76092. "mul r7, r8, r7\n\t"
  76093. "lsr r5, r7, #16\n\t"
  76094. "lsl r7, r7, #16\n\t"
  76095. "adds r4, r4, r7\n\t"
  76096. "adc r5, r5, #0\n\t"
  76097. "lsr r7, r3, #16\n\t"
  76098. "mul r8, r7, r8\n\t"
  76099. "add r5, r5, r8\n\t"
  76100. "lsl r8, %[div], #16\n\t"
  76101. "lsr r8, r8, #16\n\t"
  76102. "mul r7, r8, r7\n\t"
  76103. "lsr r8, r7, #16\n\t"
  76104. "lsl r7, r7, #16\n\t"
  76105. "adds r4, r4, r7\n\t"
  76106. "adc r5, r5, r8\n\t"
  76107. #else
  76108. "umull r4, r5, r3, %[div]\n\t"
  76109. #endif
  76110. "subs r7, %[d0], r4\n\t"
  76111. "sbc r8, %[d1], r5\n\t"
  76112. "add r3, r3, r8\n\t"
  76113. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  76114. "lsl r7, r3, #16\n\t"
  76115. "lsl r4, %[div], #16\n\t"
  76116. "lsr r7, r7, #16\n\t"
  76117. "lsr r4, r4, #16\n\t"
  76118. "mul r4, r7, r4\n\t"
  76119. "lsr r8, %[div], #16\n\t"
  76120. "mul r7, r8, r7\n\t"
  76121. "lsr r5, r7, #16\n\t"
  76122. "lsl r7, r7, #16\n\t"
  76123. "adds r4, r4, r7\n\t"
  76124. "adc r5, r5, #0\n\t"
  76125. "lsr r7, r3, #16\n\t"
  76126. "mul r8, r7, r8\n\t"
  76127. "add r5, r5, r8\n\t"
  76128. "lsl r8, %[div], #16\n\t"
  76129. "lsr r8, r8, #16\n\t"
  76130. "mul r7, r8, r7\n\t"
  76131. "lsr r8, r7, #16\n\t"
  76132. "lsl r7, r7, #16\n\t"
  76133. "adds r4, r4, r7\n\t"
  76134. "adc r5, r5, r8\n\t"
  76135. #else
  76136. "umull r4, r5, r3, %[div]\n\t"
  76137. #endif
  76138. "subs r7, %[d0], r4\n\t"
  76139. "sbc r8, %[d1], r5\n\t"
  76140. "add r3, r3, r8\n\t"
  76141. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  76142. "lsl r7, r3, #16\n\t"
  76143. "lsl r4, %[div], #16\n\t"
  76144. "lsr r7, r7, #16\n\t"
  76145. "lsr r4, r4, #16\n\t"
  76146. "mul r4, r7, r4\n\t"
  76147. "lsr r8, %[div], #16\n\t"
  76148. "mul r7, r8, r7\n\t"
  76149. "lsr r5, r7, #16\n\t"
  76150. "lsl r7, r7, #16\n\t"
  76151. "adds r4, r4, r7\n\t"
  76152. "adc r5, r5, #0\n\t"
  76153. "lsr r7, r3, #16\n\t"
  76154. "mul r8, r7, r8\n\t"
  76155. "add r5, r5, r8\n\t"
  76156. "lsl r8, %[div], #16\n\t"
  76157. "lsr r8, r8, #16\n\t"
  76158. "mul r7, r8, r7\n\t"
  76159. "lsr r8, r7, #16\n\t"
  76160. "lsl r7, r7, #16\n\t"
  76161. "adds r4, r4, r7\n\t"
  76162. "adc r5, r5, r8\n\t"
  76163. #else
  76164. "umull r4, r5, r3, %[div]\n\t"
  76165. #endif
  76166. "subs r7, %[d0], r4\n\t"
  76167. "sbc r8, %[d1], r5\n\t"
  76168. "add r3, r3, r8\n\t"
  76169. "subs r6, %[div], r7\n\t"
  76170. "sbc r6, r6, r6\n\t"
  76171. "sub %[d1], r3, r6\n\t"
  76172. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  76173. :
  76174. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  76175. );
  76176. return (uint32_t)(size_t)d1;
  76177. }
  76178. #endif
  76179. /* AND m into each word of a and store in r.
  76180. *
  76181. * r A single precision integer.
  76182. * a A single precision integer.
  76183. * m Mask to AND against each digit.
  76184. */
  76185. static void sp_256_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  76186. {
  76187. #ifdef WOLFSSL_SP_SMALL
  76188. int i;
  76189. for (i=0; i<8; i++) {
  76190. r[i] = a[i] & m;
  76191. }
  76192. #else
  76193. r[0] = a[0] & m;
  76194. r[1] = a[1] & m;
  76195. r[2] = a[2] & m;
  76196. r[3] = a[3] & m;
  76197. r[4] = a[4] & m;
  76198. r[5] = a[5] & m;
  76199. r[6] = a[6] & m;
  76200. r[7] = a[7] & m;
  76201. #endif
  76202. }
  76203. /* Divide d in a and put remainder into r (m*d + r = a)
  76204. * m is not calculated as it is not needed at this time.
  76205. *
  76206. * a Number to be divided.
  76207. * d Number to divide with.
  76208. * m Multiplier result.
  76209. * r Remainder from the division.
  76210. * returns MP_OKAY indicating success.
  76211. */
  76212. static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d,
  76213. sp_digit* m, sp_digit* r)
  76214. {
  76215. sp_digit t1[16], t2[9];
  76216. sp_digit div, r1;
  76217. int i;
  76218. (void)m;
  76219. div = d[7];
  76220. XMEMCPY(t1, a, sizeof(*t1) * 2 * 8);
  76221. r1 = sp_256_cmp_8(&t1[8], d) >= 0;
  76222. sp_256_cond_sub_8(&t1[8], &t1[8], d, (sp_digit)0 - r1);
  76223. for (i = 7; i >= 0; i--) {
  76224. volatile sp_digit mask = (sp_digit)0 - (t1[8 + i] == div);
  76225. sp_digit hi = t1[8 + i] + mask;
  76226. r1 = div_256_word_8(hi, t1[8 + i - 1], div);
  76227. r1 |= mask;
  76228. sp_256_mul_d_8(t2, d, r1);
  76229. t1[8 + i] += sp_256_sub_in_place_8(&t1[i], t2);
  76230. t1[8 + i] -= t2[8];
  76231. sp_256_mask_8(t2, d, t1[8 + i]);
  76232. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  76233. sp_256_mask_8(t2, d, t1[8 + i]);
  76234. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  76235. }
  76236. r1 = sp_256_cmp_8(t1, d) >= 0;
  76237. sp_256_cond_sub_8(r, t1, d, (sp_digit)0 - r1);
  76238. return MP_OKAY;
  76239. }
  76240. /* Reduce a modulo m into r. (r = a mod m)
  76241. *
  76242. * r A single precision number that is the reduced result.
  76243. * a A single precision number that is to be reduced.
  76244. * m A single precision number that is the modulus to reduce with.
  76245. * returns MP_OKAY indicating success.
  76246. */
  76247. static WC_INLINE int sp_256_mod_8(sp_digit* r, const sp_digit* a,
  76248. const sp_digit* m)
  76249. {
  76250. return sp_256_div_8(a, m, NULL, r);
  76251. }
  76252. #endif
  76253. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  76254. /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
  76255. *
  76256. * r Result of the multiplication.
  76257. * a First operand of the multiplication.
  76258. * b Second operand of the multiplication.
  76259. */
  76260. static void sp_256_mont_mul_order_8(sp_digit* r, const sp_digit* a, const sp_digit* b)
  76261. {
  76262. sp_256_mul_8(r, a, b);
  76263. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  76264. }
  76265. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  76266. #ifdef WOLFSSL_SP_SMALL
  76267. /* Order-2 for the P256 curve. */
  76268. static const uint32_t p256_order_minus_2[8] = {
  76269. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU,0xffffffffU,0xffffffffU,
  76270. 0x00000000U,0xffffffffU
  76271. };
  76272. #else
  76273. /* The low half of the order-2 of the P256 curve. */
  76274. static const sp_int_digit p256_order_low[4] = {
  76275. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU
  76276. };
  76277. #endif /* WOLFSSL_SP_SMALL */
  76278. /* Square number mod the order of P256 curve. (r = a * a mod order)
  76279. *
  76280. * r Result of the squaring.
  76281. * a Number to square.
  76282. */
  76283. static void sp_256_mont_sqr_order_8(sp_digit* r, const sp_digit* a)
  76284. {
  76285. sp_256_sqr_8(r, a);
  76286. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  76287. }
  76288. #ifndef WOLFSSL_SP_SMALL
  76289. /* Square number mod the order of P256 curve a number of times.
  76290. * (r = a ^ n mod order)
  76291. *
  76292. * r Result of the squaring.
  76293. * a Number to square.
  76294. */
  76295. static void sp_256_mont_sqr_n_order_8(sp_digit* r, const sp_digit* a, int n)
  76296. {
  76297. int i;
  76298. sp_256_mont_sqr_order_8(r, a);
  76299. for (i=1; i<n; i++) {
  76300. sp_256_mont_sqr_order_8(r, r);
  76301. }
  76302. }
  76303. #endif /* !WOLFSSL_SP_SMALL */
  76304. /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
  76305. * (r = 1 / a mod order)
  76306. *
  76307. * r Inverse result.
  76308. * a Number to invert.
  76309. * td Temporary data.
  76310. */
  76311. #ifdef WOLFSSL_SP_NONBLOCK
  76312. typedef struct sp_256_mont_inv_order_8_ctx {
  76313. int state;
  76314. int i;
  76315. } sp_256_mont_inv_order_8_ctx;
  76316. static int sp_256_mont_inv_order_8_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  76317. sp_digit* t)
  76318. {
  76319. int err = FP_WOULDBLOCK;
  76320. sp_256_mont_inv_order_8_ctx* ctx = (sp_256_mont_inv_order_8_ctx*)sp_ctx;
  76321. typedef char ctx_size_test[sizeof(sp_256_mont_inv_order_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  76322. (void)sizeof(ctx_size_test);
  76323. switch (ctx->state) {
  76324. case 0:
  76325. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  76326. ctx->i = 254;
  76327. ctx->state = 1;
  76328. break;
  76329. case 1:
  76330. sp_256_mont_sqr_order_8(t, t);
  76331. ctx->state = 2;
  76332. break;
  76333. case 2:
  76334. if ((p256_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  76335. sp_256_mont_mul_order_8(t, t, a);
  76336. }
  76337. ctx->i--;
  76338. ctx->state = (ctx->i == 0) ? 3 : 1;
  76339. break;
  76340. case 3:
  76341. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  76342. err = MP_OKAY;
  76343. break;
  76344. }
  76345. return err;
  76346. }
  76347. #endif /* WOLFSSL_SP_NONBLOCK */
  76348. static void sp_256_mont_inv_order_8(sp_digit* r, const sp_digit* a,
  76349. sp_digit* td)
  76350. {
  76351. #ifdef WOLFSSL_SP_SMALL
  76352. sp_digit* t = td;
  76353. int i;
  76354. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  76355. for (i=254; i>=0; i--) {
  76356. sp_256_mont_sqr_order_8(t, t);
  76357. if ((p256_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  76358. sp_256_mont_mul_order_8(t, t, a);
  76359. }
  76360. }
  76361. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  76362. #else
  76363. sp_digit* t = td;
  76364. sp_digit* t2 = td + 2 * 8;
  76365. sp_digit* t3 = td + 4 * 8;
  76366. int i;
  76367. /* t = a^2 */
  76368. sp_256_mont_sqr_order_8(t, a);
  76369. /* t = a^3 = t * a */
  76370. sp_256_mont_mul_order_8(t, t, a);
  76371. /* t2= a^c = t ^ 2 ^ 2 */
  76372. sp_256_mont_sqr_n_order_8(t2, t, 2);
  76373. /* t3= a^f = t2 * t */
  76374. sp_256_mont_mul_order_8(t3, t2, t);
  76375. /* t2= a^f0 = t3 ^ 2 ^ 4 */
  76376. sp_256_mont_sqr_n_order_8(t2, t3, 4);
  76377. /* t = a^ff = t2 * t3 */
  76378. sp_256_mont_mul_order_8(t, t2, t3);
  76379. /* t2= a^ff00 = t ^ 2 ^ 8 */
  76380. sp_256_mont_sqr_n_order_8(t2, t, 8);
  76381. /* t = a^ffff = t2 * t */
  76382. sp_256_mont_mul_order_8(t, t2, t);
  76383. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  76384. sp_256_mont_sqr_n_order_8(t2, t, 16);
  76385. /* t = a^ffffffff = t2 * t */
  76386. sp_256_mont_mul_order_8(t, t2, t);
  76387. /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64 */
  76388. sp_256_mont_sqr_n_order_8(t2, t, 64);
  76389. /* t2= a^ffffffff00000000ffffffff = t2 * t */
  76390. sp_256_mont_mul_order_8(t2, t2, t);
  76391. /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32 */
  76392. sp_256_mont_sqr_n_order_8(t2, t2, 32);
  76393. /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
  76394. sp_256_mont_mul_order_8(t2, t2, t);
  76395. /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
  76396. sp_256_mont_sqr_order_8(t2, t2);
  76397. sp_256_mont_mul_order_8(t2, t2, a);
  76398. sp_256_mont_sqr_n_order_8(t2, t2, 5);
  76399. sp_256_mont_mul_order_8(t2, t2, t3);
  76400. for (i=121; i>=112; i--) {
  76401. sp_256_mont_sqr_order_8(t2, t2);
  76402. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  76403. sp_256_mont_mul_order_8(t2, t2, a);
  76404. }
  76405. }
  76406. /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
  76407. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  76408. sp_256_mont_mul_order_8(t2, t2, t3);
  76409. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
  76410. for (i=107; i>=64; i--) {
  76411. sp_256_mont_sqr_order_8(t2, t2);
  76412. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  76413. sp_256_mont_mul_order_8(t2, t2, a);
  76414. }
  76415. }
  76416. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
  76417. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  76418. sp_256_mont_mul_order_8(t2, t2, t3);
  76419. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
  76420. for (i=59; i>=32; i--) {
  76421. sp_256_mont_sqr_order_8(t2, t2);
  76422. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  76423. sp_256_mont_mul_order_8(t2, t2, a);
  76424. }
  76425. }
  76426. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
  76427. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  76428. sp_256_mont_mul_order_8(t2, t2, t3);
  76429. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
  76430. for (i=27; i>=0; i--) {
  76431. sp_256_mont_sqr_order_8(t2, t2);
  76432. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  76433. sp_256_mont_mul_order_8(t2, t2, a);
  76434. }
  76435. }
  76436. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
  76437. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  76438. /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
  76439. sp_256_mont_mul_order_8(r, t2, t3);
  76440. #endif /* WOLFSSL_SP_SMALL */
  76441. }
  76442. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  76443. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  76444. #ifdef HAVE_ECC_SIGN
  76445. #ifndef SP_ECC_MAX_SIG_GEN
  76446. #define SP_ECC_MAX_SIG_GEN 64
  76447. #endif
  76448. /* Calculate second signature value S from R, k and private value.
  76449. *
  76450. * s = (r * x + e) / k
  76451. *
  76452. * s Signature value.
  76453. * r First signature value.
  76454. * k Ephemeral private key.
  76455. * x Private key as a number.
  76456. * e Hash of message as a number.
  76457. * tmp Temporary storage for intermediate numbers.
  76458. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  76459. */
  76460. static int sp_256_calc_s_8(sp_digit* s, const sp_digit* r, sp_digit* k,
  76461. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  76462. {
  76463. int err;
  76464. sp_digit carry;
  76465. sp_int32 c;
  76466. sp_digit* kInv = k;
  76467. /* Conv k to Montgomery form (mod order) */
  76468. sp_256_mul_8(k, k, p256_norm_order);
  76469. err = sp_256_mod_8(k, k, p256_order);
  76470. if (err == MP_OKAY) {
  76471. sp_256_norm_8(k);
  76472. /* kInv = 1/k mod order */
  76473. sp_256_mont_inv_order_8(kInv, k, tmp);
  76474. sp_256_norm_8(kInv);
  76475. /* s = r * x + e */
  76476. sp_256_mul_8(x, x, r);
  76477. err = sp_256_mod_8(x, x, p256_order);
  76478. }
  76479. if (err == MP_OKAY) {
  76480. sp_256_norm_8(x);
  76481. carry = sp_256_add_8(s, e, x);
  76482. sp_256_cond_sub_8(s, s, p256_order, 0 - carry);
  76483. sp_256_norm_8(s);
  76484. c = sp_256_cmp_8(s, p256_order);
  76485. sp_256_cond_sub_8(s, s, p256_order,
  76486. (sp_digit)0 - (sp_digit)(c >= 0));
  76487. sp_256_norm_8(s);
  76488. /* s = s * k^-1 mod order */
  76489. sp_256_mont_mul_order_8(s, s, kInv);
  76490. sp_256_norm_8(s);
  76491. }
  76492. return err;
  76493. }
  76494. /* Sign the hash using the private key.
  76495. * e = [hash, 256 bits] from binary
  76496. * r = (k.G)->x mod order
  76497. * s = (r * x + e) / k mod order
  76498. * The hash is truncated to the first 256 bits.
  76499. *
  76500. * hash Hash to sign.
  76501. * hashLen Length of the hash data.
  76502. * rng Random number generator.
  76503. * priv Private part of key - scalar.
  76504. * rm First part of result as an mp_int.
  76505. * sm Sirst part of result as an mp_int.
  76506. * heap Heap to use for allocation.
  76507. * returns RNG failures, MEMORY_E when memory allocation fails and
  76508. * MP_OKAY on success.
  76509. */
  76510. int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng,
  76511. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  76512. {
  76513. #ifdef WOLFSSL_SP_SMALL_STACK
  76514. sp_digit* e = NULL;
  76515. sp_point_256* point = NULL;
  76516. #else
  76517. sp_digit e[7 * 2 * 8];
  76518. sp_point_256 point[1];
  76519. #endif
  76520. sp_digit* x = NULL;
  76521. sp_digit* k = NULL;
  76522. sp_digit* r = NULL;
  76523. sp_digit* tmp = NULL;
  76524. sp_digit* s = NULL;
  76525. sp_int32 c;
  76526. int err = MP_OKAY;
  76527. int i;
  76528. (void)heap;
  76529. #ifdef WOLFSSL_SP_SMALL_STACK
  76530. if (err == MP_OKAY) {
  76531. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  76532. DYNAMIC_TYPE_ECC);
  76533. if (point == NULL)
  76534. err = MEMORY_E;
  76535. }
  76536. if (err == MP_OKAY) {
  76537. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 8, heap,
  76538. DYNAMIC_TYPE_ECC);
  76539. if (e == NULL)
  76540. err = MEMORY_E;
  76541. }
  76542. #endif
  76543. if (err == MP_OKAY) {
  76544. x = e + 2 * 8;
  76545. k = e + 4 * 8;
  76546. r = e + 6 * 8;
  76547. tmp = e + 8 * 8;
  76548. s = e;
  76549. if (hashLen > 32U) {
  76550. hashLen = 32U;
  76551. }
  76552. }
  76553. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  76554. /* New random point. */
  76555. if (km == NULL || mp_iszero(km)) {
  76556. err = sp_256_ecc_gen_k_8(rng, k);
  76557. }
  76558. else {
  76559. sp_256_from_mp(k, 8, km);
  76560. mp_zero(km);
  76561. }
  76562. if (err == MP_OKAY) {
  76563. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, heap);
  76564. }
  76565. if (err == MP_OKAY) {
  76566. /* r = point->x mod order */
  76567. XMEMCPY(r, point->x, sizeof(sp_digit) * 8U);
  76568. sp_256_norm_8(r);
  76569. c = sp_256_cmp_8(r, p256_order);
  76570. sp_256_cond_sub_8(r, r, p256_order,
  76571. (sp_digit)0 - (sp_digit)(c >= 0));
  76572. sp_256_norm_8(r);
  76573. if (!sp_256_iszero_8(r)) {
  76574. /* x is modified in calculation of s. */
  76575. sp_256_from_mp(x, 8, priv);
  76576. /* s ptr == e ptr, e is modified in calculation of s. */
  76577. sp_256_from_bin(e, 8, hash, (int)hashLen);
  76578. err = sp_256_calc_s_8(s, r, k, x, e, tmp);
  76579. /* Check that signature is usable. */
  76580. if ((err == MP_OKAY) && (!sp_256_iszero_8(s))) {
  76581. break;
  76582. }
  76583. }
  76584. }
  76585. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  76586. i = 1;
  76587. #endif
  76588. }
  76589. if (i == 0) {
  76590. err = RNG_FAILURE_E;
  76591. }
  76592. if (err == MP_OKAY) {
  76593. err = sp_256_to_mp(r, rm);
  76594. }
  76595. if (err == MP_OKAY) {
  76596. err = sp_256_to_mp(s, sm);
  76597. }
  76598. #ifdef WOLFSSL_SP_SMALL_STACK
  76599. if (e != NULL)
  76600. #endif
  76601. {
  76602. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 8);
  76603. #ifdef WOLFSSL_SP_SMALL_STACK
  76604. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  76605. #endif
  76606. }
  76607. #ifdef WOLFSSL_SP_SMALL_STACK
  76608. if (point != NULL)
  76609. #endif
  76610. {
  76611. ForceZero(point, sizeof(sp_point_256));
  76612. #ifdef WOLFSSL_SP_SMALL_STACK
  76613. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  76614. #endif
  76615. }
  76616. return err;
  76617. }
  76618. #ifdef WOLFSSL_SP_NONBLOCK
  76619. typedef struct sp_ecc_sign_256_ctx {
  76620. int state;
  76621. union {
  76622. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  76623. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  76624. };
  76625. sp_digit e[2*8];
  76626. sp_digit x[2*8];
  76627. sp_digit k[2*8];
  76628. sp_digit r[2*8];
  76629. sp_digit tmp[3 * 2*8];
  76630. sp_point_256 point;
  76631. sp_digit* s;
  76632. sp_digit* kInv;
  76633. int i;
  76634. } sp_ecc_sign_256_ctx;
  76635. int sp_ecc_sign_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  76636. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  76637. {
  76638. int err = FP_WOULDBLOCK;
  76639. sp_ecc_sign_256_ctx* ctx = (sp_ecc_sign_256_ctx*)sp_ctx->data;
  76640. typedef char ctx_size_test[sizeof(sp_ecc_sign_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  76641. (void)sizeof(ctx_size_test);
  76642. switch (ctx->state) {
  76643. case 0: /* INIT */
  76644. ctx->s = ctx->e;
  76645. ctx->kInv = ctx->k;
  76646. ctx->i = SP_ECC_MAX_SIG_GEN;
  76647. ctx->state = 1;
  76648. break;
  76649. case 1: /* GEN */
  76650. /* New random point. */
  76651. if (km == NULL || mp_iszero(km)) {
  76652. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  76653. }
  76654. else {
  76655. sp_256_from_mp(ctx->k, 8, km);
  76656. mp_zero(km);
  76657. }
  76658. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  76659. ctx->state = 2;
  76660. break;
  76661. case 2: /* MULMOD */
  76662. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  76663. &ctx->point, &p256_base, ctx->k, 1, 1, heap);
  76664. if (err == MP_OKAY) {
  76665. ctx->state = 3;
  76666. }
  76667. break;
  76668. case 3: /* MODORDER */
  76669. {
  76670. sp_int32 c;
  76671. /* r = point->x mod order */
  76672. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 8U);
  76673. sp_256_norm_8(ctx->r);
  76674. c = sp_256_cmp_8(ctx->r, p256_order);
  76675. sp_256_cond_sub_8(ctx->r, ctx->r, p256_order,
  76676. (sp_digit)0 - (sp_digit)(c >= 0));
  76677. sp_256_norm_8(ctx->r);
  76678. if (hashLen > 32U) {
  76679. hashLen = 32U;
  76680. }
  76681. sp_256_from_mp(ctx->x, 8, priv);
  76682. sp_256_from_bin(ctx->e, 8, hash, (int)hashLen);
  76683. ctx->state = 4;
  76684. break;
  76685. }
  76686. case 4: /* KMODORDER */
  76687. /* Conv k to Montgomery form (mod order) */
  76688. sp_256_mul_8(ctx->k, ctx->k, p256_norm_order);
  76689. err = sp_256_mod_8(ctx->k, ctx->k, p256_order);
  76690. if (err == MP_OKAY) {
  76691. sp_256_norm_8(ctx->k);
  76692. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  76693. ctx->state = 5;
  76694. }
  76695. break;
  76696. case 5: /* KINV */
  76697. /* kInv = 1/k mod order */
  76698. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  76699. if (err == MP_OKAY) {
  76700. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  76701. ctx->state = 6;
  76702. }
  76703. break;
  76704. case 6: /* KINVNORM */
  76705. sp_256_norm_8(ctx->kInv);
  76706. ctx->state = 7;
  76707. break;
  76708. case 7: /* R */
  76709. /* s = r * x + e */
  76710. sp_256_mul_8(ctx->x, ctx->x, ctx->r);
  76711. ctx->state = 8;
  76712. break;
  76713. case 8: /* S1 */
  76714. err = sp_256_mod_8(ctx->x, ctx->x, p256_order);
  76715. if (err == MP_OKAY)
  76716. ctx->state = 9;
  76717. break;
  76718. case 9: /* S2 */
  76719. {
  76720. sp_digit carry;
  76721. sp_int32 c;
  76722. sp_256_norm_8(ctx->x);
  76723. carry = sp_256_add_8(ctx->s, ctx->e, ctx->x);
  76724. sp_256_cond_sub_8(ctx->s, ctx->s,
  76725. p256_order, 0 - carry);
  76726. sp_256_norm_8(ctx->s);
  76727. c = sp_256_cmp_8(ctx->s, p256_order);
  76728. sp_256_cond_sub_8(ctx->s, ctx->s, p256_order,
  76729. (sp_digit)0 - (sp_digit)(c >= 0));
  76730. sp_256_norm_8(ctx->s);
  76731. /* s = s * k^-1 mod order */
  76732. sp_256_mont_mul_order_8(ctx->s, ctx->s, ctx->kInv);
  76733. sp_256_norm_8(ctx->s);
  76734. /* Check that signature is usable. */
  76735. if (sp_256_iszero_8(ctx->s) == 0) {
  76736. ctx->state = 10;
  76737. break;
  76738. }
  76739. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  76740. ctx->i = 1;
  76741. #endif
  76742. /* not usable gen, try again */
  76743. ctx->i--;
  76744. if (ctx->i == 0) {
  76745. err = RNG_FAILURE_E;
  76746. }
  76747. ctx->state = 1;
  76748. break;
  76749. }
  76750. case 10: /* RES */
  76751. err = sp_256_to_mp(ctx->r, rm);
  76752. if (err == MP_OKAY) {
  76753. err = sp_256_to_mp(ctx->s, sm);
  76754. }
  76755. break;
  76756. }
  76757. if (err == MP_OKAY && ctx->state != 10) {
  76758. err = FP_WOULDBLOCK;
  76759. }
  76760. if (err != FP_WOULDBLOCK) {
  76761. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 8U);
  76762. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 8U);
  76763. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 8U);
  76764. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 8U);
  76765. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 8U);
  76766. }
  76767. return err;
  76768. }
  76769. #endif /* WOLFSSL_SP_NONBLOCK */
  76770. #endif /* HAVE_ECC_SIGN */
  76771. #ifndef WOLFSSL_SP_SMALL
  76772. #ifdef WOLFSSL_SP_SMALL
  76773. /* Sub b from a into r. (r = a - b)
  76774. *
  76775. * r A single precision integer.
  76776. * a A single precision integer.
  76777. * b A single precision integer.
  76778. */
  76779. static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  76780. {
  76781. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  76782. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  76783. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  76784. __asm__ __volatile__ (
  76785. "mov r12, #0\n\t"
  76786. "add lr, %[a], #32\n\t"
  76787. "\n"
  76788. "L_sp_256_sub_8_word_%=: \n\t"
  76789. "rsbs r12, r12, #0\n\t"
  76790. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  76791. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  76792. "sbcs r3, r3, r7\n\t"
  76793. "sbcs r4, r4, r8\n\t"
  76794. "sbcs r5, r5, r9\n\t"
  76795. "sbcs r6, r6, r10\n\t"
  76796. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  76797. "sbc r12, r3, r3\n\t"
  76798. "cmp %[a], lr\n\t"
  76799. "bne L_sp_256_sub_8_word_%=\n\t"
  76800. "mov %[r], r12\n\t"
  76801. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  76802. :
  76803. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  76804. );
  76805. return (uint32_t)(size_t)r;
  76806. }
  76807. #else
  76808. /* Sub b from a into r. (r = a - b)
  76809. *
  76810. * r A single precision integer.
  76811. * a A single precision integer.
  76812. * b A single precision integer.
  76813. */
  76814. static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  76815. {
  76816. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  76817. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  76818. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  76819. __asm__ __volatile__ (
  76820. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  76821. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  76822. "subs r3, r3, r7\n\t"
  76823. "sbcs r4, r4, r8\n\t"
  76824. "sbcs r5, r5, r9\n\t"
  76825. "sbcs r6, r6, r10\n\t"
  76826. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  76827. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  76828. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  76829. "sbcs r3, r3, r7\n\t"
  76830. "sbcs r4, r4, r8\n\t"
  76831. "sbcs r5, r5, r9\n\t"
  76832. "sbcs r6, r6, r10\n\t"
  76833. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  76834. "sbc %[r], r6, r6\n\t"
  76835. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  76836. :
  76837. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  76838. );
  76839. return (uint32_t)(size_t)r;
  76840. }
  76841. #endif /* WOLFSSL_SP_SMALL */
  76842. static void sp_256_rshift1_8(sp_digit* r_p, const sp_digit* a_p)
  76843. {
  76844. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  76845. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  76846. __asm__ __volatile__ (
  76847. "mov r12, #0\n\t"
  76848. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76849. "ldr r2, [%[a], #16]\n\t"
  76850. "ldr r3, [%[a], #20]\n\t"
  76851. #else
  76852. "ldrd r2, r3, [%[a], #16]\n\t"
  76853. #endif
  76854. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76855. "ldr r4, [%[a], #24]\n\t"
  76856. "ldr r5, [%[a], #28]\n\t"
  76857. #else
  76858. "ldrd r4, r5, [%[a], #24]\n\t"
  76859. #endif
  76860. "lsr r6, r2, #1\n\t"
  76861. "lsr r7, r3, #1\n\t"
  76862. "lsr r8, r4, #1\n\t"
  76863. "lsr r9, r5, #1\n\t"
  76864. "orr r6, r6, r3, lsl #31\n\t"
  76865. "orr r7, r7, r4, lsl #31\n\t"
  76866. "orr r8, r8, r5, lsl #31\n\t"
  76867. "orr r9, r9, r12, lsl #31\n\t"
  76868. "mov r12, r2\n\t"
  76869. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76870. "str r6, [%[r], #16]\n\t"
  76871. "str r7, [%[r], #20]\n\t"
  76872. #else
  76873. "strd r6, r7, [%[r], #16]\n\t"
  76874. #endif
  76875. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76876. "str r8, [%[r], #24]\n\t"
  76877. "str r9, [%[r], #28]\n\t"
  76878. #else
  76879. "strd r8, r9, [%[r], #24]\n\t"
  76880. #endif
  76881. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76882. "ldr r2, [%[a]]\n\t"
  76883. "ldr r3, [%[a], #4]\n\t"
  76884. #else
  76885. "ldrd r2, r3, [%[a]]\n\t"
  76886. #endif
  76887. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76888. "ldr r4, [%[a], #8]\n\t"
  76889. "ldr r5, [%[a], #12]\n\t"
  76890. #else
  76891. "ldrd r4, r5, [%[a], #8]\n\t"
  76892. #endif
  76893. "lsr r6, r2, #1\n\t"
  76894. "lsr r7, r3, #1\n\t"
  76895. "lsr r8, r4, #1\n\t"
  76896. "lsr r9, r5, #1\n\t"
  76897. "orr r6, r6, r3, lsl #31\n\t"
  76898. "orr r7, r7, r4, lsl #31\n\t"
  76899. "orr r8, r8, r5, lsl #31\n\t"
  76900. "orr r9, r9, r12, lsl #31\n\t"
  76901. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76902. "str r6, [%[r]]\n\t"
  76903. "str r7, [%[r], #4]\n\t"
  76904. #else
  76905. "strd r6, r7, [%[r]]\n\t"
  76906. #endif
  76907. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76908. "str r8, [%[r], #8]\n\t"
  76909. "str r9, [%[r], #12]\n\t"
  76910. #else
  76911. "strd r8, r9, [%[r], #8]\n\t"
  76912. #endif
  76913. : [r] "+r" (r), [a] "+r" (a)
  76914. :
  76915. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "cc"
  76916. );
  76917. }
  76918. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  76919. *
  76920. * r Result of division by 2.
  76921. * a Number to divide.
  76922. * m Modulus.
  76923. */
  76924. static void sp_256_div2_mod_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  76925. {
  76926. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  76927. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  76928. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  76929. __asm__ __volatile__ (
  76930. "mov r12, #0\n\t"
  76931. "ldm %[a]!, {r4}\n\t"
  76932. "ands r3, r4, #1\n\t"
  76933. "beq L_sp_256_div2_mod_8_even_%=\n\t"
  76934. "ldm %[a]!, {r5, r6, r7}\n\t"
  76935. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  76936. "adds r4, r4, r8\n\t"
  76937. "adcs r5, r5, r9\n\t"
  76938. "adcs r6, r6, r10\n\t"
  76939. "adcs r7, r7, r11\n\t"
  76940. "stm %[r], {r4, r5, r6, r7}\n\t"
  76941. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  76942. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  76943. "adcs r4, r4, r8\n\t"
  76944. "adcs r5, r5, r9\n\t"
  76945. "adcs r6, r6, r10\n\t"
  76946. "adcs r7, r7, r11\n\t"
  76947. "adc r3, r12, r12\n\t"
  76948. "b L_sp_256_div2_mod_8_div2_%=\n\t"
  76949. "\n"
  76950. "L_sp_256_div2_mod_8_even_%=: \n\t"
  76951. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76952. "ldr r4, [%[a], #12]\n\t"
  76953. "ldr r5, [%[a], #16]\n\t"
  76954. #else
  76955. "ldrd r4, r5, [%[a], #12]\n\t"
  76956. #endif
  76957. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76958. "ldr r6, [%[a], #20]\n\t"
  76959. "ldr r7, [%[a], #24]\n\t"
  76960. #else
  76961. "ldrd r6, r7, [%[a], #20]\n\t"
  76962. #endif
  76963. "\n"
  76964. "L_sp_256_div2_mod_8_div2_%=: \n\t"
  76965. "lsr r8, r4, #1\n\t"
  76966. "and r4, r4, #1\n\t"
  76967. "lsr r9, r5, #1\n\t"
  76968. "lsr r10, r6, #1\n\t"
  76969. "lsr r11, r7, #1\n\t"
  76970. "orr r8, r8, r5, lsl #31\n\t"
  76971. "orr r9, r9, r6, lsl #31\n\t"
  76972. "orr r10, r10, r7, lsl #31\n\t"
  76973. "orr r11, r11, r3, lsl #31\n\t"
  76974. "mov r3, r4\n\t"
  76975. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76976. "str r8, [%[r], #16]\n\t"
  76977. "str r9, [%[r], #20]\n\t"
  76978. #else
  76979. "strd r8, r9, [%[r], #16]\n\t"
  76980. #endif
  76981. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  76982. "str r10, [%[r], #24]\n\t"
  76983. "str r11, [%[r], #28]\n\t"
  76984. #else
  76985. "strd r10, r11, [%[r], #24]\n\t"
  76986. #endif
  76987. "ldm %[r], {r4, r5, r6, r7}\n\t"
  76988. "lsr r8, r4, #1\n\t"
  76989. "lsr r9, r5, #1\n\t"
  76990. "lsr r10, r6, #1\n\t"
  76991. "lsr r11, r7, #1\n\t"
  76992. "orr r8, r8, r5, lsl #31\n\t"
  76993. "orr r9, r9, r6, lsl #31\n\t"
  76994. "orr r10, r10, r7, lsl #31\n\t"
  76995. "orr r11, r11, r3, lsl #31\n\t"
  76996. "stm %[r], {r8, r9, r10, r11}\n\t"
  76997. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  76998. :
  76999. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  77000. );
  77001. }
  77002. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  77003. static const unsigned char L_sp_256_num_bits_8_table[] = {
  77004. 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03,
  77005. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  77006. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  77007. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  77008. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  77009. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  77010. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  77011. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  77012. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77013. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77014. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77015. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77016. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77017. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77018. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77019. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  77020. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77021. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77022. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77023. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77024. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77025. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77026. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77027. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77028. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77029. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77030. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77031. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77032. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77033. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77034. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77035. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  77036. };
  77037. static int sp_256_num_bits_8(const sp_digit* a_p)
  77038. {
  77039. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  77040. register unsigned char* L_sp_256_num_bits_8_table_c asm ("r1") = (unsigned char*)&L_sp_256_num_bits_8_table;
  77041. __asm__ __volatile__ (
  77042. "mov lr, %[L_sp_256_num_bits_8_table]\n\t"
  77043. "ldr r1, [%[a], #28]\n\t"
  77044. "cmp r1, #0\n\t"
  77045. "beq L_sp_256_num_bits_8_7_%=\n\t"
  77046. "lsr r3, r1, #24\n\t"
  77047. "cmp r3, #0\n\t"
  77048. "beq L_sp_256_num_bits_8_7_3_%=\n\t"
  77049. "mov r2, #0xf8\n\t"
  77050. "ldrb r12, [lr, r3]\n\t"
  77051. "add r12, r2, r12\n\t"
  77052. "b L_sp_256_num_bits_8_9_%=\n\t"
  77053. "\n"
  77054. "L_sp_256_num_bits_8_7_3_%=: \n\t"
  77055. "lsr r3, r1, #16\n\t"
  77056. "and r3, r3, #0xff\n\t"
  77057. "cmp r3, #0\n\t"
  77058. "beq L_sp_256_num_bits_8_7_2_%=\n\t"
  77059. "mov r2, #0xf0\n\t"
  77060. "ldrb r12, [lr, r3]\n\t"
  77061. "add r12, r2, r12\n\t"
  77062. "b L_sp_256_num_bits_8_9_%=\n\t"
  77063. "\n"
  77064. "L_sp_256_num_bits_8_7_2_%=: \n\t"
  77065. "lsr r3, r1, #8\n\t"
  77066. "and r3, r3, #0xff\n\t"
  77067. "cmp r3, #0\n\t"
  77068. "beq L_sp_256_num_bits_8_7_1_%=\n\t"
  77069. "mov r2, #0xe8\n\t"
  77070. "ldrb r12, [lr, r3]\n\t"
  77071. "add r12, r2, r12\n\t"
  77072. "b L_sp_256_num_bits_8_9_%=\n\t"
  77073. "\n"
  77074. "L_sp_256_num_bits_8_7_1_%=: \n\t"
  77075. "and r3, r1, #0xff\n\t"
  77076. "mov r2, #0xe0\n\t"
  77077. "ldrb r12, [lr, r3]\n\t"
  77078. "add r12, r2, r12\n\t"
  77079. "b L_sp_256_num_bits_8_9_%=\n\t"
  77080. "\n"
  77081. "L_sp_256_num_bits_8_7_%=: \n\t"
  77082. "ldr r1, [%[a], #24]\n\t"
  77083. "cmp r1, #0\n\t"
  77084. "beq L_sp_256_num_bits_8_6_%=\n\t"
  77085. "lsr r3, r1, #24\n\t"
  77086. "cmp r3, #0\n\t"
  77087. "beq L_sp_256_num_bits_8_6_3_%=\n\t"
  77088. "mov r2, #0xd8\n\t"
  77089. "ldrb r12, [lr, r3]\n\t"
  77090. "add r12, r2, r12\n\t"
  77091. "b L_sp_256_num_bits_8_9_%=\n\t"
  77092. "\n"
  77093. "L_sp_256_num_bits_8_6_3_%=: \n\t"
  77094. "lsr r3, r1, #16\n\t"
  77095. "and r3, r3, #0xff\n\t"
  77096. "cmp r3, #0\n\t"
  77097. "beq L_sp_256_num_bits_8_6_2_%=\n\t"
  77098. "mov r2, #0xd0\n\t"
  77099. "ldrb r12, [lr, r3]\n\t"
  77100. "add r12, r2, r12\n\t"
  77101. "b L_sp_256_num_bits_8_9_%=\n\t"
  77102. "\n"
  77103. "L_sp_256_num_bits_8_6_2_%=: \n\t"
  77104. "lsr r3, r1, #8\n\t"
  77105. "and r3, r3, #0xff\n\t"
  77106. "cmp r3, #0\n\t"
  77107. "beq L_sp_256_num_bits_8_6_1_%=\n\t"
  77108. "mov r2, #0xc8\n\t"
  77109. "ldrb r12, [lr, r3]\n\t"
  77110. "add r12, r2, r12\n\t"
  77111. "b L_sp_256_num_bits_8_9_%=\n\t"
  77112. "\n"
  77113. "L_sp_256_num_bits_8_6_1_%=: \n\t"
  77114. "and r3, r1, #0xff\n\t"
  77115. "mov r2, #0xc0\n\t"
  77116. "ldrb r12, [lr, r3]\n\t"
  77117. "add r12, r2, r12\n\t"
  77118. "b L_sp_256_num_bits_8_9_%=\n\t"
  77119. "\n"
  77120. "L_sp_256_num_bits_8_6_%=: \n\t"
  77121. "ldr r1, [%[a], #20]\n\t"
  77122. "cmp r1, #0\n\t"
  77123. "beq L_sp_256_num_bits_8_5_%=\n\t"
  77124. "lsr r3, r1, #24\n\t"
  77125. "cmp r3, #0\n\t"
  77126. "beq L_sp_256_num_bits_8_5_3_%=\n\t"
  77127. "mov r2, #0xb8\n\t"
  77128. "ldrb r12, [lr, r3]\n\t"
  77129. "add r12, r2, r12\n\t"
  77130. "b L_sp_256_num_bits_8_9_%=\n\t"
  77131. "\n"
  77132. "L_sp_256_num_bits_8_5_3_%=: \n\t"
  77133. "lsr r3, r1, #16\n\t"
  77134. "and r3, r3, #0xff\n\t"
  77135. "cmp r3, #0\n\t"
  77136. "beq L_sp_256_num_bits_8_5_2_%=\n\t"
  77137. "mov r2, #0xb0\n\t"
  77138. "ldrb r12, [lr, r3]\n\t"
  77139. "add r12, r2, r12\n\t"
  77140. "b L_sp_256_num_bits_8_9_%=\n\t"
  77141. "\n"
  77142. "L_sp_256_num_bits_8_5_2_%=: \n\t"
  77143. "lsr r3, r1, #8\n\t"
  77144. "and r3, r3, #0xff\n\t"
  77145. "cmp r3, #0\n\t"
  77146. "beq L_sp_256_num_bits_8_5_1_%=\n\t"
  77147. "mov r2, #0xa8\n\t"
  77148. "ldrb r12, [lr, r3]\n\t"
  77149. "add r12, r2, r12\n\t"
  77150. "b L_sp_256_num_bits_8_9_%=\n\t"
  77151. "\n"
  77152. "L_sp_256_num_bits_8_5_1_%=: \n\t"
  77153. "and r3, r1, #0xff\n\t"
  77154. "mov r2, #0xa0\n\t"
  77155. "ldrb r12, [lr, r3]\n\t"
  77156. "add r12, r2, r12\n\t"
  77157. "b L_sp_256_num_bits_8_9_%=\n\t"
  77158. "\n"
  77159. "L_sp_256_num_bits_8_5_%=: \n\t"
  77160. "ldr r1, [%[a], #16]\n\t"
  77161. "cmp r1, #0\n\t"
  77162. "beq L_sp_256_num_bits_8_4_%=\n\t"
  77163. "lsr r3, r1, #24\n\t"
  77164. "cmp r3, #0\n\t"
  77165. "beq L_sp_256_num_bits_8_4_3_%=\n\t"
  77166. "mov r2, #0x98\n\t"
  77167. "ldrb r12, [lr, r3]\n\t"
  77168. "add r12, r2, r12\n\t"
  77169. "b L_sp_256_num_bits_8_9_%=\n\t"
  77170. "\n"
  77171. "L_sp_256_num_bits_8_4_3_%=: \n\t"
  77172. "lsr r3, r1, #16\n\t"
  77173. "and r3, r3, #0xff\n\t"
  77174. "cmp r3, #0\n\t"
  77175. "beq L_sp_256_num_bits_8_4_2_%=\n\t"
  77176. "mov r2, #0x90\n\t"
  77177. "ldrb r12, [lr, r3]\n\t"
  77178. "add r12, r2, r12\n\t"
  77179. "b L_sp_256_num_bits_8_9_%=\n\t"
  77180. "\n"
  77181. "L_sp_256_num_bits_8_4_2_%=: \n\t"
  77182. "lsr r3, r1, #8\n\t"
  77183. "and r3, r3, #0xff\n\t"
  77184. "cmp r3, #0\n\t"
  77185. "beq L_sp_256_num_bits_8_4_1_%=\n\t"
  77186. "mov r2, #0x88\n\t"
  77187. "ldrb r12, [lr, r3]\n\t"
  77188. "add r12, r2, r12\n\t"
  77189. "b L_sp_256_num_bits_8_9_%=\n\t"
  77190. "\n"
  77191. "L_sp_256_num_bits_8_4_1_%=: \n\t"
  77192. "and r3, r1, #0xff\n\t"
  77193. "mov r2, #0x80\n\t"
  77194. "ldrb r12, [lr, r3]\n\t"
  77195. "add r12, r2, r12\n\t"
  77196. "b L_sp_256_num_bits_8_9_%=\n\t"
  77197. "\n"
  77198. "L_sp_256_num_bits_8_4_%=: \n\t"
  77199. "ldr r1, [%[a], #12]\n\t"
  77200. "cmp r1, #0\n\t"
  77201. "beq L_sp_256_num_bits_8_3_%=\n\t"
  77202. "lsr r3, r1, #24\n\t"
  77203. "cmp r3, #0\n\t"
  77204. "beq L_sp_256_num_bits_8_3_3_%=\n\t"
  77205. "mov r2, #0x78\n\t"
  77206. "ldrb r12, [lr, r3]\n\t"
  77207. "add r12, r2, r12\n\t"
  77208. "b L_sp_256_num_bits_8_9_%=\n\t"
  77209. "\n"
  77210. "L_sp_256_num_bits_8_3_3_%=: \n\t"
  77211. "lsr r3, r1, #16\n\t"
  77212. "and r3, r3, #0xff\n\t"
  77213. "cmp r3, #0\n\t"
  77214. "beq L_sp_256_num_bits_8_3_2_%=\n\t"
  77215. "mov r2, #0x70\n\t"
  77216. "ldrb r12, [lr, r3]\n\t"
  77217. "add r12, r2, r12\n\t"
  77218. "b L_sp_256_num_bits_8_9_%=\n\t"
  77219. "\n"
  77220. "L_sp_256_num_bits_8_3_2_%=: \n\t"
  77221. "lsr r3, r1, #8\n\t"
  77222. "and r3, r3, #0xff\n\t"
  77223. "cmp r3, #0\n\t"
  77224. "beq L_sp_256_num_bits_8_3_1_%=\n\t"
  77225. "mov r2, #0x68\n\t"
  77226. "ldrb r12, [lr, r3]\n\t"
  77227. "add r12, r2, r12\n\t"
  77228. "b L_sp_256_num_bits_8_9_%=\n\t"
  77229. "\n"
  77230. "L_sp_256_num_bits_8_3_1_%=: \n\t"
  77231. "and r3, r1, #0xff\n\t"
  77232. "mov r2, #0x60\n\t"
  77233. "ldrb r12, [lr, r3]\n\t"
  77234. "add r12, r2, r12\n\t"
  77235. "b L_sp_256_num_bits_8_9_%=\n\t"
  77236. "\n"
  77237. "L_sp_256_num_bits_8_3_%=: \n\t"
  77238. "ldr r1, [%[a], #8]\n\t"
  77239. "cmp r1, #0\n\t"
  77240. "beq L_sp_256_num_bits_8_2_%=\n\t"
  77241. "lsr r3, r1, #24\n\t"
  77242. "cmp r3, #0\n\t"
  77243. "beq L_sp_256_num_bits_8_2_3_%=\n\t"
  77244. "mov r2, #0x58\n\t"
  77245. "ldrb r12, [lr, r3]\n\t"
  77246. "add r12, r2, r12\n\t"
  77247. "b L_sp_256_num_bits_8_9_%=\n\t"
  77248. "\n"
  77249. "L_sp_256_num_bits_8_2_3_%=: \n\t"
  77250. "lsr r3, r1, #16\n\t"
  77251. "and r3, r3, #0xff\n\t"
  77252. "cmp r3, #0\n\t"
  77253. "beq L_sp_256_num_bits_8_2_2_%=\n\t"
  77254. "mov r2, #0x50\n\t"
  77255. "ldrb r12, [lr, r3]\n\t"
  77256. "add r12, r2, r12\n\t"
  77257. "b L_sp_256_num_bits_8_9_%=\n\t"
  77258. "\n"
  77259. "L_sp_256_num_bits_8_2_2_%=: \n\t"
  77260. "lsr r3, r1, #8\n\t"
  77261. "and r3, r3, #0xff\n\t"
  77262. "cmp r3, #0\n\t"
  77263. "beq L_sp_256_num_bits_8_2_1_%=\n\t"
  77264. "mov r2, #0x48\n\t"
  77265. "ldrb r12, [lr, r3]\n\t"
  77266. "add r12, r2, r12\n\t"
  77267. "b L_sp_256_num_bits_8_9_%=\n\t"
  77268. "\n"
  77269. "L_sp_256_num_bits_8_2_1_%=: \n\t"
  77270. "and r3, r1, #0xff\n\t"
  77271. "mov r2, #0x40\n\t"
  77272. "ldrb r12, [lr, r3]\n\t"
  77273. "add r12, r2, r12\n\t"
  77274. "b L_sp_256_num_bits_8_9_%=\n\t"
  77275. "\n"
  77276. "L_sp_256_num_bits_8_2_%=: \n\t"
  77277. "ldr r1, [%[a], #4]\n\t"
  77278. "cmp r1, #0\n\t"
  77279. "beq L_sp_256_num_bits_8_1_%=\n\t"
  77280. "lsr r3, r1, #24\n\t"
  77281. "cmp r3, #0\n\t"
  77282. "beq L_sp_256_num_bits_8_1_3_%=\n\t"
  77283. "mov r2, #56\n\t"
  77284. "ldrb r12, [lr, r3]\n\t"
  77285. "add r12, r2, r12\n\t"
  77286. "b L_sp_256_num_bits_8_9_%=\n\t"
  77287. "\n"
  77288. "L_sp_256_num_bits_8_1_3_%=: \n\t"
  77289. "lsr r3, r1, #16\n\t"
  77290. "and r3, r3, #0xff\n\t"
  77291. "cmp r3, #0\n\t"
  77292. "beq L_sp_256_num_bits_8_1_2_%=\n\t"
  77293. "mov r2, #48\n\t"
  77294. "ldrb r12, [lr, r3]\n\t"
  77295. "add r12, r2, r12\n\t"
  77296. "b L_sp_256_num_bits_8_9_%=\n\t"
  77297. "\n"
  77298. "L_sp_256_num_bits_8_1_2_%=: \n\t"
  77299. "lsr r3, r1, #8\n\t"
  77300. "and r3, r3, #0xff\n\t"
  77301. "cmp r3, #0\n\t"
  77302. "beq L_sp_256_num_bits_8_1_1_%=\n\t"
  77303. "mov r2, #40\n\t"
  77304. "ldrb r12, [lr, r3]\n\t"
  77305. "add r12, r2, r12\n\t"
  77306. "b L_sp_256_num_bits_8_9_%=\n\t"
  77307. "\n"
  77308. "L_sp_256_num_bits_8_1_1_%=: \n\t"
  77309. "and r3, r1, #0xff\n\t"
  77310. "mov r2, #32\n\t"
  77311. "ldrb r12, [lr, r3]\n\t"
  77312. "add r12, r2, r12\n\t"
  77313. "b L_sp_256_num_bits_8_9_%=\n\t"
  77314. "\n"
  77315. "L_sp_256_num_bits_8_1_%=: \n\t"
  77316. "ldr r1, [%[a]]\n\t"
  77317. "lsr r3, r1, #24\n\t"
  77318. "cmp r3, #0\n\t"
  77319. "beq L_sp_256_num_bits_8_0_3_%=\n\t"
  77320. "mov r2, #24\n\t"
  77321. "ldrb r12, [lr, r3]\n\t"
  77322. "add r12, r2, r12\n\t"
  77323. "b L_sp_256_num_bits_8_9_%=\n\t"
  77324. "\n"
  77325. "L_sp_256_num_bits_8_0_3_%=: \n\t"
  77326. "lsr r3, r1, #16\n\t"
  77327. "and r3, r3, #0xff\n\t"
  77328. "cmp r3, #0\n\t"
  77329. "beq L_sp_256_num_bits_8_0_2_%=\n\t"
  77330. "mov r2, #16\n\t"
  77331. "ldrb r12, [lr, r3]\n\t"
  77332. "add r12, r2, r12\n\t"
  77333. "b L_sp_256_num_bits_8_9_%=\n\t"
  77334. "\n"
  77335. "L_sp_256_num_bits_8_0_2_%=: \n\t"
  77336. "lsr r3, r1, #8\n\t"
  77337. "and r3, r3, #0xff\n\t"
  77338. "cmp r3, #0\n\t"
  77339. "beq L_sp_256_num_bits_8_0_1_%=\n\t"
  77340. "mov r2, #8\n\t"
  77341. "ldrb r12, [lr, r3]\n\t"
  77342. "add r12, r2, r12\n\t"
  77343. "b L_sp_256_num_bits_8_9_%=\n\t"
  77344. "\n"
  77345. "L_sp_256_num_bits_8_0_1_%=: \n\t"
  77346. "and r3, r1, #0xff\n\t"
  77347. "ldrb r12, [lr, r3]\n\t"
  77348. "\n"
  77349. "L_sp_256_num_bits_8_9_%=: \n\t"
  77350. "mov %[a], r12\n\t"
  77351. : [a] "+r" (a), [L_sp_256_num_bits_8_table] "+r" (L_sp_256_num_bits_8_table_c)
  77352. :
  77353. : "memory", "r2", "r3", "r12", "lr", "cc"
  77354. );
  77355. return (uint32_t)(size_t)a;
  77356. }
  77357. #else
  77358. static int sp_256_num_bits_8(const sp_digit* a_p)
  77359. {
  77360. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  77361. __asm__ __volatile__ (
  77362. "ldr r1, [%[a], #28]\n\t"
  77363. "cmp r1, #0\n\t"
  77364. "beq L_sp_256_num_bits_8_7_%=\n\t"
  77365. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  77366. "mov r2, #0x1\n\t"
  77367. "lsl r2, r2, #8\n\t"
  77368. "add r2, r2, #0x0\n\t"
  77369. #else
  77370. "mov r2, #0x100\n\t"
  77371. #endif
  77372. "clz r12, r1\n\t"
  77373. "sub r12, r2, r12\n\t"
  77374. "b L_sp_256_num_bits_8_9_%=\n\t"
  77375. "\n"
  77376. "L_sp_256_num_bits_8_7_%=: \n\t"
  77377. "ldr r1, [%[a], #24]\n\t"
  77378. "cmp r1, #0\n\t"
  77379. "beq L_sp_256_num_bits_8_6_%=\n\t"
  77380. "mov r2, #0xe0\n\t"
  77381. "clz r12, r1\n\t"
  77382. "sub r12, r2, r12\n\t"
  77383. "b L_sp_256_num_bits_8_9_%=\n\t"
  77384. "\n"
  77385. "L_sp_256_num_bits_8_6_%=: \n\t"
  77386. "ldr r1, [%[a], #20]\n\t"
  77387. "cmp r1, #0\n\t"
  77388. "beq L_sp_256_num_bits_8_5_%=\n\t"
  77389. "mov r2, #0xc0\n\t"
  77390. "clz r12, r1\n\t"
  77391. "sub r12, r2, r12\n\t"
  77392. "b L_sp_256_num_bits_8_9_%=\n\t"
  77393. "\n"
  77394. "L_sp_256_num_bits_8_5_%=: \n\t"
  77395. "ldr r1, [%[a], #16]\n\t"
  77396. "cmp r1, #0\n\t"
  77397. "beq L_sp_256_num_bits_8_4_%=\n\t"
  77398. "mov r2, #0xa0\n\t"
  77399. "clz r12, r1\n\t"
  77400. "sub r12, r2, r12\n\t"
  77401. "b L_sp_256_num_bits_8_9_%=\n\t"
  77402. "\n"
  77403. "L_sp_256_num_bits_8_4_%=: \n\t"
  77404. "ldr r1, [%[a], #12]\n\t"
  77405. "cmp r1, #0\n\t"
  77406. "beq L_sp_256_num_bits_8_3_%=\n\t"
  77407. "mov r2, #0x80\n\t"
  77408. "clz r12, r1\n\t"
  77409. "sub r12, r2, r12\n\t"
  77410. "b L_sp_256_num_bits_8_9_%=\n\t"
  77411. "\n"
  77412. "L_sp_256_num_bits_8_3_%=: \n\t"
  77413. "ldr r1, [%[a], #8]\n\t"
  77414. "cmp r1, #0\n\t"
  77415. "beq L_sp_256_num_bits_8_2_%=\n\t"
  77416. "mov r2, #0x60\n\t"
  77417. "clz r12, r1\n\t"
  77418. "sub r12, r2, r12\n\t"
  77419. "b L_sp_256_num_bits_8_9_%=\n\t"
  77420. "\n"
  77421. "L_sp_256_num_bits_8_2_%=: \n\t"
  77422. "ldr r1, [%[a], #4]\n\t"
  77423. "cmp r1, #0\n\t"
  77424. "beq L_sp_256_num_bits_8_1_%=\n\t"
  77425. "mov r2, #0x40\n\t"
  77426. "clz r12, r1\n\t"
  77427. "sub r12, r2, r12\n\t"
  77428. "b L_sp_256_num_bits_8_9_%=\n\t"
  77429. "\n"
  77430. "L_sp_256_num_bits_8_1_%=: \n\t"
  77431. "ldr r1, [%[a]]\n\t"
  77432. "mov r2, #32\n\t"
  77433. "clz r12, r1\n\t"
  77434. "sub r12, r2, r12\n\t"
  77435. "\n"
  77436. "L_sp_256_num_bits_8_9_%=: \n\t"
  77437. "mov %[a], r12\n\t"
  77438. : [a] "+r" (a)
  77439. :
  77440. : "memory", "r1", "r2", "r3", "r12", "lr", "cc"
  77441. );
  77442. return (uint32_t)(size_t)a;
  77443. }
  77444. #endif /* WOLFSSL_ARM_ARCH && (WOLFSSL_ARM_ARCH < 7) */
  77445. /* Non-constant time modular inversion.
  77446. *
  77447. * @param [out] r Resulting number.
  77448. * @param [in] a Number to invert.
  77449. * @param [in] m Modulus.
  77450. * @return MP_OKAY on success.
  77451. */
  77452. static int sp_256_mod_inv_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  77453. {
  77454. sp_digit u[8];
  77455. sp_digit v[8];
  77456. sp_digit b[8];
  77457. sp_digit d[8];
  77458. int ut, vt;
  77459. sp_digit o;
  77460. XMEMCPY(u, m, sizeof(u));
  77461. XMEMCPY(v, a, sizeof(v));
  77462. ut = sp_256_num_bits_8(u);
  77463. vt = sp_256_num_bits_8(v);
  77464. XMEMSET(b, 0, sizeof(b));
  77465. if ((v[0] & 1) == 0) {
  77466. sp_256_rshift1_8(v, v);
  77467. XMEMCPY(d, m, sizeof(u));
  77468. d[0] += 1;
  77469. sp_256_rshift1_8(d, d);
  77470. vt--;
  77471. while ((v[0] & 1) == 0) {
  77472. sp_256_rshift1_8(v, v);
  77473. sp_256_div2_mod_8(d, d, m);
  77474. vt--;
  77475. }
  77476. }
  77477. else {
  77478. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  77479. d[0] = 1;
  77480. }
  77481. while (ut > 1 && vt > 1) {
  77482. if ((ut > vt) || ((ut == vt) && (sp_256_cmp_8(u, v) >= 0))) {
  77483. sp_256_sub_8(u, u, v);
  77484. o = sp_256_sub_8(b, b, d);
  77485. if (o != 0)
  77486. sp_256_add_8(b, b, m);
  77487. ut = sp_256_num_bits_8(u);
  77488. do {
  77489. sp_256_rshift1_8(u, u);
  77490. sp_256_div2_mod_8(b, b, m);
  77491. ut--;
  77492. }
  77493. while (ut > 0 && (u[0] & 1) == 0);
  77494. }
  77495. else {
  77496. sp_256_sub_8(v, v, u);
  77497. o = sp_256_sub_8(d, d, b);
  77498. if (o != 0)
  77499. sp_256_add_8(d, d, m);
  77500. vt = sp_256_num_bits_8(v);
  77501. do {
  77502. sp_256_rshift1_8(v, v);
  77503. sp_256_div2_mod_8(d, d, m);
  77504. vt--;
  77505. }
  77506. while (vt > 0 && (v[0] & 1) == 0);
  77507. }
  77508. }
  77509. if (ut == 1)
  77510. XMEMCPY(r, b, sizeof(b));
  77511. else
  77512. XMEMCPY(r, d, sizeof(d));
  77513. return MP_OKAY;
  77514. }
  77515. #endif /* WOLFSSL_SP_SMALL */
  77516. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  77517. *
  77518. * p1 First point to add and holds result.
  77519. * p2 Second point to add.
  77520. * tmp Temporary storage for intermediate numbers.
  77521. */
  77522. static void sp_256_add_points_8(sp_point_256* p1, const sp_point_256* p2,
  77523. sp_digit* tmp)
  77524. {
  77525. sp_256_proj_point_add_8(p1, p1, p2, tmp);
  77526. if (sp_256_iszero_8(p1->z)) {
  77527. if (sp_256_iszero_8(p1->x) && sp_256_iszero_8(p1->y)) {
  77528. sp_256_proj_point_dbl_8(p1, p2, tmp);
  77529. }
  77530. else {
  77531. /* Y ordinate is not used from here - don't set. */
  77532. p1->x[0] = 0;
  77533. p1->x[1] = 0;
  77534. p1->x[2] = 0;
  77535. p1->x[3] = 0;
  77536. p1->x[4] = 0;
  77537. p1->x[5] = 0;
  77538. p1->x[6] = 0;
  77539. p1->x[7] = 0;
  77540. XMEMCPY(p1->z, p256_norm_mod, sizeof(p256_norm_mod));
  77541. }
  77542. }
  77543. }
  77544. /* Calculate the verification point: [e/s]G + [r/s]Q
  77545. *
  77546. * p1 Calculated point.
  77547. * p2 Public point and temporary.
  77548. * s Second part of signature as a number.
  77549. * u1 Temporary number.
  77550. * u2 Temporary number.
  77551. * heap Heap to use for allocation.
  77552. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  77553. */
  77554. static int sp_256_calc_vfy_point_8(sp_point_256* p1, sp_point_256* p2,
  77555. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  77556. {
  77557. int err;
  77558. #ifndef WOLFSSL_SP_SMALL
  77559. err = sp_256_mod_inv_8(s, s, p256_order);
  77560. if (err == MP_OKAY)
  77561. #endif /* !WOLFSSL_SP_SMALL */
  77562. {
  77563. sp_256_mul_8(s, s, p256_norm_order);
  77564. err = sp_256_mod_8(s, s, p256_order);
  77565. }
  77566. if (err == MP_OKAY) {
  77567. sp_256_norm_8(s);
  77568. #ifdef WOLFSSL_SP_SMALL
  77569. {
  77570. sp_256_mont_inv_order_8(s, s, tmp);
  77571. sp_256_mont_mul_order_8(u1, u1, s);
  77572. sp_256_mont_mul_order_8(u2, u2, s);
  77573. }
  77574. #else
  77575. {
  77576. sp_256_mont_mul_order_8(u1, u1, s);
  77577. sp_256_mont_mul_order_8(u2, u2, s);
  77578. }
  77579. #endif /* WOLFSSL_SP_SMALL */
  77580. {
  77581. err = sp_256_ecc_mulmod_base_8(p1, u1, 0, 0, heap);
  77582. }
  77583. }
  77584. if ((err == MP_OKAY) && sp_256_iszero_8(p1->z)) {
  77585. p1->infinity = 1;
  77586. }
  77587. if (err == MP_OKAY) {
  77588. err = sp_256_ecc_mulmod_8(p2, p2, u2, 0, 0, heap);
  77589. }
  77590. if ((err == MP_OKAY) && sp_256_iszero_8(p2->z)) {
  77591. p2->infinity = 1;
  77592. }
  77593. if (err == MP_OKAY) {
  77594. sp_256_add_points_8(p1, p2, tmp);
  77595. }
  77596. return err;
  77597. }
  77598. #ifdef HAVE_ECC_VERIFY
  77599. /* Verify the signature values with the hash and public key.
  77600. * e = Truncate(hash, 256)
  77601. * u1 = e/s mod order
  77602. * u2 = r/s mod order
  77603. * r == (u1.G + u2.Q)->x mod order
  77604. * Optimization: Leave point in projective form.
  77605. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  77606. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  77607. * The hash is truncated to the first 256 bits.
  77608. *
  77609. * hash Hash to sign.
  77610. * hashLen Length of the hash data.
  77611. * rng Random number generator.
  77612. * priv Private part of key - scalar.
  77613. * rm First part of result as an mp_int.
  77614. * sm Sirst part of result as an mp_int.
  77615. * heap Heap to use for allocation.
  77616. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  77617. */
  77618. int sp_ecc_verify_256(const byte* hash, word32 hashLen, const mp_int* pX,
  77619. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  77620. int* res, void* heap)
  77621. {
  77622. #ifdef WOLFSSL_SP_SMALL_STACK
  77623. sp_digit* u1 = NULL;
  77624. sp_point_256* p1 = NULL;
  77625. #else
  77626. sp_digit u1[18 * 8];
  77627. sp_point_256 p1[2];
  77628. #endif
  77629. sp_digit* u2 = NULL;
  77630. sp_digit* s = NULL;
  77631. sp_digit* tmp = NULL;
  77632. sp_point_256* p2 = NULL;
  77633. sp_digit carry;
  77634. sp_int32 c = 0;
  77635. int err = MP_OKAY;
  77636. #ifdef WOLFSSL_SP_SMALL_STACK
  77637. if (err == MP_OKAY) {
  77638. p1 = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  77639. DYNAMIC_TYPE_ECC);
  77640. if (p1 == NULL)
  77641. err = MEMORY_E;
  77642. }
  77643. if (err == MP_OKAY) {
  77644. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 8, heap,
  77645. DYNAMIC_TYPE_ECC);
  77646. if (u1 == NULL)
  77647. err = MEMORY_E;
  77648. }
  77649. #endif
  77650. if (err == MP_OKAY) {
  77651. u2 = u1 + 2 * 8;
  77652. s = u1 + 4 * 8;
  77653. tmp = u1 + 6 * 8;
  77654. p2 = p1 + 1;
  77655. if (hashLen > 32U) {
  77656. hashLen = 32U;
  77657. }
  77658. sp_256_from_bin(u1, 8, hash, (int)hashLen);
  77659. sp_256_from_mp(u2, 8, rm);
  77660. sp_256_from_mp(s, 8, sm);
  77661. sp_256_from_mp(p2->x, 8, pX);
  77662. sp_256_from_mp(p2->y, 8, pY);
  77663. sp_256_from_mp(p2->z, 8, pZ);
  77664. err = sp_256_calc_vfy_point_8(p1, p2, s, u1, u2, tmp, heap);
  77665. }
  77666. if (err == MP_OKAY) {
  77667. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  77668. /* Reload r and convert to Montgomery form. */
  77669. sp_256_from_mp(u2, 8, rm);
  77670. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  77671. }
  77672. if (err == MP_OKAY) {
  77673. /* u1 = r.z'.z' mod prime */
  77674. sp_256_mont_sqr_8(p1->z, p1->z, p256_mod, p256_mp_mod);
  77675. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  77676. *res = (int)(sp_256_cmp_8(p1->x, u1) == 0);
  77677. if (*res == 0) {
  77678. /* Reload r and add order. */
  77679. sp_256_from_mp(u2, 8, rm);
  77680. carry = sp_256_add_8(u2, u2, p256_order);
  77681. /* Carry means result is greater than mod and is not valid. */
  77682. if (carry == 0) {
  77683. sp_256_norm_8(u2);
  77684. /* Compare with mod and if greater or equal then not valid. */
  77685. c = sp_256_cmp_8(u2, p256_mod);
  77686. }
  77687. }
  77688. if ((*res == 0) && (c < 0)) {
  77689. /* Convert to Montogomery form */
  77690. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  77691. if (err == MP_OKAY) {
  77692. /* u1 = (r + 1*order).z'.z' mod prime */
  77693. {
  77694. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  77695. }
  77696. *res = (sp_256_cmp_8(p1->x, u1) == 0);
  77697. }
  77698. }
  77699. }
  77700. #ifdef WOLFSSL_SP_SMALL_STACK
  77701. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  77702. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  77703. #endif
  77704. return err;
  77705. }
  77706. #ifdef WOLFSSL_SP_NONBLOCK
  77707. typedef struct sp_ecc_verify_256_ctx {
  77708. int state;
  77709. union {
  77710. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  77711. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  77712. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  77713. sp_256_proj_point_add_8_ctx add_ctx;
  77714. };
  77715. sp_digit u1[2*8];
  77716. sp_digit u2[2*8];
  77717. sp_digit s[2*8];
  77718. sp_digit tmp[2*8 * 6];
  77719. sp_point_256 p1;
  77720. sp_point_256 p2;
  77721. } sp_ecc_verify_256_ctx;
  77722. int sp_ecc_verify_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  77723. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  77724. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  77725. {
  77726. int err = FP_WOULDBLOCK;
  77727. sp_ecc_verify_256_ctx* ctx = (sp_ecc_verify_256_ctx*)sp_ctx->data;
  77728. typedef char ctx_size_test[sizeof(sp_ecc_verify_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  77729. (void)sizeof(ctx_size_test);
  77730. switch (ctx->state) {
  77731. case 0: /* INIT */
  77732. if (hashLen > 32U) {
  77733. hashLen = 32U;
  77734. }
  77735. sp_256_from_bin(ctx->u1, 8, hash, (int)hashLen);
  77736. sp_256_from_mp(ctx->u2, 8, rm);
  77737. sp_256_from_mp(ctx->s, 8, sm);
  77738. sp_256_from_mp(ctx->p2.x, 8, pX);
  77739. sp_256_from_mp(ctx->p2.y, 8, pY);
  77740. sp_256_from_mp(ctx->p2.z, 8, pZ);
  77741. ctx->state = 1;
  77742. break;
  77743. case 1: /* NORMS0 */
  77744. sp_256_mul_8(ctx->s, ctx->s, p256_norm_order);
  77745. err = sp_256_mod_8(ctx->s, ctx->s, p256_order);
  77746. if (err == MP_OKAY)
  77747. ctx->state = 2;
  77748. break;
  77749. case 2: /* NORMS1 */
  77750. sp_256_norm_8(ctx->s);
  77751. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  77752. ctx->state = 3;
  77753. break;
  77754. case 3: /* NORMS2 */
  77755. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  77756. if (err == MP_OKAY) {
  77757. ctx->state = 4;
  77758. }
  77759. break;
  77760. case 4: /* NORMS3 */
  77761. sp_256_mont_mul_order_8(ctx->u1, ctx->u1, ctx->s);
  77762. ctx->state = 5;
  77763. break;
  77764. case 5: /* NORMS4 */
  77765. sp_256_mont_mul_order_8(ctx->u2, ctx->u2, ctx->s);
  77766. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  77767. ctx->state = 6;
  77768. break;
  77769. case 6: /* MULBASE */
  77770. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p256_base, ctx->u1, 0, 0, heap);
  77771. if (err == MP_OKAY) {
  77772. if (sp_256_iszero_8(ctx->p1.z)) {
  77773. ctx->p1.infinity = 1;
  77774. }
  77775. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  77776. ctx->state = 7;
  77777. }
  77778. break;
  77779. case 7: /* MULMOD */
  77780. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  77781. if (err == MP_OKAY) {
  77782. if (sp_256_iszero_8(ctx->p2.z)) {
  77783. ctx->p2.infinity = 1;
  77784. }
  77785. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  77786. ctx->state = 8;
  77787. }
  77788. break;
  77789. case 8: /* ADD */
  77790. err = sp_256_proj_point_add_8_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  77791. if (err == MP_OKAY)
  77792. ctx->state = 9;
  77793. break;
  77794. case 9: /* MONT */
  77795. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  77796. /* Reload r and convert to Montgomery form. */
  77797. sp_256_from_mp(ctx->u2, 8, rm);
  77798. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  77799. if (err == MP_OKAY)
  77800. ctx->state = 10;
  77801. break;
  77802. case 10: /* SQR */
  77803. /* u1 = r.z'.z' mod prime */
  77804. sp_256_mont_sqr_8(ctx->p1.z, ctx->p1.z, p256_mod, p256_mp_mod);
  77805. ctx->state = 11;
  77806. break;
  77807. case 11: /* MUL */
  77808. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod, p256_mp_mod);
  77809. ctx->state = 12;
  77810. break;
  77811. case 12: /* RES */
  77812. {
  77813. sp_int32 c = 0;
  77814. err = MP_OKAY; /* math okay, now check result */
  77815. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  77816. if (*res == 0) {
  77817. sp_digit carry;
  77818. /* Reload r and add order. */
  77819. sp_256_from_mp(ctx->u2, 8, rm);
  77820. carry = sp_256_add_8(ctx->u2, ctx->u2, p256_order);
  77821. /* Carry means result is greater than mod and is not valid. */
  77822. if (carry == 0) {
  77823. sp_256_norm_8(ctx->u2);
  77824. /* Compare with mod and if greater or equal then not valid. */
  77825. c = sp_256_cmp_8(ctx->u2, p256_mod);
  77826. }
  77827. }
  77828. if ((*res == 0) && (c < 0)) {
  77829. /* Convert to Montogomery form */
  77830. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  77831. if (err == MP_OKAY) {
  77832. /* u1 = (r + 1*order).z'.z' mod prime */
  77833. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod,
  77834. p256_mp_mod);
  77835. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  77836. }
  77837. }
  77838. break;
  77839. }
  77840. } /* switch */
  77841. if (err == MP_OKAY && ctx->state != 12) {
  77842. err = FP_WOULDBLOCK;
  77843. }
  77844. return err;
  77845. }
  77846. #endif /* WOLFSSL_SP_NONBLOCK */
  77847. #endif /* HAVE_ECC_VERIFY */
  77848. #ifdef HAVE_ECC_CHECK_KEY
  77849. /* Check that the x and y ordinates are a valid point on the curve.
  77850. *
  77851. * point EC point.
  77852. * heap Heap to use if dynamically allocating.
  77853. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  77854. * not on the curve and MP_OKAY otherwise.
  77855. */
  77856. static int sp_256_ecc_is_point_8(const sp_point_256* point,
  77857. void* heap)
  77858. {
  77859. #ifdef WOLFSSL_SP_SMALL_STACK
  77860. sp_digit* t1 = NULL;
  77861. #else
  77862. sp_digit t1[8 * 4];
  77863. #endif
  77864. sp_digit* t2 = NULL;
  77865. int err = MP_OKAY;
  77866. #ifdef WOLFSSL_SP_SMALL_STACK
  77867. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 4, heap, DYNAMIC_TYPE_ECC);
  77868. if (t1 == NULL)
  77869. err = MEMORY_E;
  77870. #endif
  77871. (void)heap;
  77872. if (err == MP_OKAY) {
  77873. t2 = t1 + 2 * 8;
  77874. /* y^2 - x^3 - a.x = b */
  77875. sp_256_sqr_8(t1, point->y);
  77876. (void)sp_256_mod_8(t1, t1, p256_mod);
  77877. sp_256_sqr_8(t2, point->x);
  77878. (void)sp_256_mod_8(t2, t2, p256_mod);
  77879. sp_256_mul_8(t2, t2, point->x);
  77880. (void)sp_256_mod_8(t2, t2, p256_mod);
  77881. sp_256_mont_sub_8(t1, t1, t2, p256_mod);
  77882. /* y^2 - x^3 + 3.x = b, when a = -3 */
  77883. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  77884. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  77885. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  77886. if (sp_256_cmp_8(t1, p256_b) != 0) {
  77887. err = MP_VAL;
  77888. }
  77889. }
  77890. #ifdef WOLFSSL_SP_SMALL_STACK
  77891. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  77892. #endif
  77893. return err;
  77894. }
  77895. /* Check that the x and y ordinates are a valid point on the curve.
  77896. *
  77897. * pX X ordinate of EC point.
  77898. * pY Y ordinate of EC point.
  77899. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  77900. * not on the curve and MP_OKAY otherwise.
  77901. */
  77902. int sp_ecc_is_point_256(const mp_int* pX, const mp_int* pY)
  77903. {
  77904. #ifdef WOLFSSL_SP_SMALL_STACK
  77905. sp_point_256* pub = NULL;
  77906. #else
  77907. sp_point_256 pub[1];
  77908. #endif
  77909. const byte one[1] = { 1 };
  77910. int err = MP_OKAY;
  77911. #ifdef WOLFSSL_SP_SMALL_STACK
  77912. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  77913. DYNAMIC_TYPE_ECC);
  77914. if (pub == NULL)
  77915. err = MEMORY_E;
  77916. #endif
  77917. if (err == MP_OKAY) {
  77918. sp_256_from_mp(pub->x, 8, pX);
  77919. sp_256_from_mp(pub->y, 8, pY);
  77920. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  77921. err = sp_256_ecc_is_point_8(pub, NULL);
  77922. }
  77923. #ifdef WOLFSSL_SP_SMALL_STACK
  77924. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  77925. #endif
  77926. return err;
  77927. }
  77928. /* Check that the private scalar generates the EC point (px, py), the point is
  77929. * on the curve and the point has the correct order.
  77930. *
  77931. * pX X ordinate of EC point.
  77932. * pY Y ordinate of EC point.
  77933. * privm Private scalar that generates EC point.
  77934. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  77935. * not on the curve, ECC_INF_E if the point does not have the correct order,
  77936. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  77937. * MP_OKAY otherwise.
  77938. */
  77939. int sp_ecc_check_key_256(const mp_int* pX, const mp_int* pY,
  77940. const mp_int* privm, void* heap)
  77941. {
  77942. #ifdef WOLFSSL_SP_SMALL_STACK
  77943. sp_digit* priv = NULL;
  77944. sp_point_256* pub = NULL;
  77945. #else
  77946. sp_digit priv[8];
  77947. sp_point_256 pub[2];
  77948. #endif
  77949. sp_point_256* p = NULL;
  77950. const byte one[1] = { 1 };
  77951. int err = MP_OKAY;
  77952. /* Quick check the lengs of public key ordinates and private key are in
  77953. * range. Proper check later.
  77954. */
  77955. if (((mp_count_bits(pX) > 256) ||
  77956. (mp_count_bits(pY) > 256) ||
  77957. ((privm != NULL) && (mp_count_bits(privm) > 256)))) {
  77958. err = ECC_OUT_OF_RANGE_E;
  77959. }
  77960. #ifdef WOLFSSL_SP_SMALL_STACK
  77961. if (err == MP_OKAY) {
  77962. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  77963. DYNAMIC_TYPE_ECC);
  77964. if (pub == NULL)
  77965. err = MEMORY_E;
  77966. }
  77967. if (err == MP_OKAY && privm) {
  77968. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  77969. DYNAMIC_TYPE_ECC);
  77970. if (priv == NULL)
  77971. err = MEMORY_E;
  77972. }
  77973. #endif
  77974. if (err == MP_OKAY) {
  77975. p = pub + 1;
  77976. sp_256_from_mp(pub->x, 8, pX);
  77977. sp_256_from_mp(pub->y, 8, pY);
  77978. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  77979. if (privm)
  77980. sp_256_from_mp(priv, 8, privm);
  77981. /* Check point at infinitiy. */
  77982. if ((sp_256_iszero_8(pub->x) != 0) &&
  77983. (sp_256_iszero_8(pub->y) != 0)) {
  77984. err = ECC_INF_E;
  77985. }
  77986. }
  77987. /* Check range of X and Y */
  77988. if ((err == MP_OKAY) &&
  77989. ((sp_256_cmp_8(pub->x, p256_mod) >= 0) ||
  77990. (sp_256_cmp_8(pub->y, p256_mod) >= 0))) {
  77991. err = ECC_OUT_OF_RANGE_E;
  77992. }
  77993. if (err == MP_OKAY) {
  77994. /* Check point is on curve */
  77995. err = sp_256_ecc_is_point_8(pub, heap);
  77996. }
  77997. if (err == MP_OKAY) {
  77998. /* Point * order = infinity */
  77999. err = sp_256_ecc_mulmod_8(p, pub, p256_order, 1, 1, heap);
  78000. }
  78001. /* Check result is infinity */
  78002. if ((err == MP_OKAY) && ((sp_256_iszero_8(p->x) == 0) ||
  78003. (sp_256_iszero_8(p->y) == 0))) {
  78004. err = ECC_INF_E;
  78005. }
  78006. if (privm) {
  78007. if (err == MP_OKAY) {
  78008. /* Base * private = point */
  78009. err = sp_256_ecc_mulmod_base_8(p, priv, 1, 1, heap);
  78010. }
  78011. /* Check result is public key */
  78012. if ((err == MP_OKAY) &&
  78013. ((sp_256_cmp_8(p->x, pub->x) != 0) ||
  78014. (sp_256_cmp_8(p->y, pub->y) != 0))) {
  78015. err = ECC_PRIV_KEY_E;
  78016. }
  78017. }
  78018. #ifdef WOLFSSL_SP_SMALL_STACK
  78019. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  78020. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  78021. #endif
  78022. return err;
  78023. }
  78024. #endif
  78025. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  78026. /* Add two projective EC points together.
  78027. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  78028. *
  78029. * pX First EC point's X ordinate.
  78030. * pY First EC point's Y ordinate.
  78031. * pZ First EC point's Z ordinate.
  78032. * qX Second EC point's X ordinate.
  78033. * qY Second EC point's Y ordinate.
  78034. * qZ Second EC point's Z ordinate.
  78035. * rX Resultant EC point's X ordinate.
  78036. * rY Resultant EC point's Y ordinate.
  78037. * rZ Resultant EC point's Z ordinate.
  78038. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  78039. */
  78040. int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  78041. mp_int* qX, mp_int* qY, mp_int* qZ,
  78042. mp_int* rX, mp_int* rY, mp_int* rZ)
  78043. {
  78044. #ifdef WOLFSSL_SP_SMALL_STACK
  78045. sp_digit* tmp = NULL;
  78046. sp_point_256* p = NULL;
  78047. #else
  78048. sp_digit tmp[2 * 8 * 6];
  78049. sp_point_256 p[2];
  78050. #endif
  78051. sp_point_256* q = NULL;
  78052. int err = MP_OKAY;
  78053. #ifdef WOLFSSL_SP_SMALL_STACK
  78054. if (err == MP_OKAY) {
  78055. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, NULL,
  78056. DYNAMIC_TYPE_ECC);
  78057. if (p == NULL)
  78058. err = MEMORY_E;
  78059. }
  78060. if (err == MP_OKAY) {
  78061. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, NULL,
  78062. DYNAMIC_TYPE_ECC);
  78063. if (tmp == NULL) {
  78064. err = MEMORY_E;
  78065. }
  78066. }
  78067. #endif
  78068. if (err == MP_OKAY) {
  78069. q = p + 1;
  78070. sp_256_from_mp(p->x, 8, pX);
  78071. sp_256_from_mp(p->y, 8, pY);
  78072. sp_256_from_mp(p->z, 8, pZ);
  78073. sp_256_from_mp(q->x, 8, qX);
  78074. sp_256_from_mp(q->y, 8, qY);
  78075. sp_256_from_mp(q->z, 8, qZ);
  78076. p->infinity = sp_256_iszero_8(p->x) &
  78077. sp_256_iszero_8(p->y);
  78078. q->infinity = sp_256_iszero_8(q->x) &
  78079. sp_256_iszero_8(q->y);
  78080. sp_256_proj_point_add_8(p, p, q, tmp);
  78081. }
  78082. if (err == MP_OKAY) {
  78083. err = sp_256_to_mp(p->x, rX);
  78084. }
  78085. if (err == MP_OKAY) {
  78086. err = sp_256_to_mp(p->y, rY);
  78087. }
  78088. if (err == MP_OKAY) {
  78089. err = sp_256_to_mp(p->z, rZ);
  78090. }
  78091. #ifdef WOLFSSL_SP_SMALL_STACK
  78092. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  78093. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  78094. #endif
  78095. return err;
  78096. }
  78097. /* Double a projective EC point.
  78098. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  78099. *
  78100. * pX EC point's X ordinate.
  78101. * pY EC point's Y ordinate.
  78102. * pZ EC point's Z ordinate.
  78103. * rX Resultant EC point's X ordinate.
  78104. * rY Resultant EC point's Y ordinate.
  78105. * rZ Resultant EC point's Z ordinate.
  78106. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  78107. */
  78108. int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  78109. mp_int* rX, mp_int* rY, mp_int* rZ)
  78110. {
  78111. #ifdef WOLFSSL_SP_SMALL_STACK
  78112. sp_digit* tmp = NULL;
  78113. sp_point_256* p = NULL;
  78114. #else
  78115. sp_digit tmp[2 * 8 * 2];
  78116. sp_point_256 p[1];
  78117. #endif
  78118. int err = MP_OKAY;
  78119. #ifdef WOLFSSL_SP_SMALL_STACK
  78120. if (err == MP_OKAY) {
  78121. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  78122. DYNAMIC_TYPE_ECC);
  78123. if (p == NULL)
  78124. err = MEMORY_E;
  78125. }
  78126. if (err == MP_OKAY) {
  78127. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 2, NULL,
  78128. DYNAMIC_TYPE_ECC);
  78129. if (tmp == NULL)
  78130. err = MEMORY_E;
  78131. }
  78132. #endif
  78133. if (err == MP_OKAY) {
  78134. sp_256_from_mp(p->x, 8, pX);
  78135. sp_256_from_mp(p->y, 8, pY);
  78136. sp_256_from_mp(p->z, 8, pZ);
  78137. p->infinity = sp_256_iszero_8(p->x) &
  78138. sp_256_iszero_8(p->y);
  78139. sp_256_proj_point_dbl_8(p, p, tmp);
  78140. }
  78141. if (err == MP_OKAY) {
  78142. err = sp_256_to_mp(p->x, rX);
  78143. }
  78144. if (err == MP_OKAY) {
  78145. err = sp_256_to_mp(p->y, rY);
  78146. }
  78147. if (err == MP_OKAY) {
  78148. err = sp_256_to_mp(p->z, rZ);
  78149. }
  78150. #ifdef WOLFSSL_SP_SMALL_STACK
  78151. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  78152. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  78153. #endif
  78154. return err;
  78155. }
  78156. /* Map a projective EC point to affine in place.
  78157. * pZ will be one.
  78158. *
  78159. * pX EC point's X ordinate.
  78160. * pY EC point's Y ordinate.
  78161. * pZ EC point's Z ordinate.
  78162. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  78163. */
  78164. int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ)
  78165. {
  78166. #ifdef WOLFSSL_SP_SMALL_STACK
  78167. sp_digit* tmp = NULL;
  78168. sp_point_256* p = NULL;
  78169. #else
  78170. sp_digit tmp[2 * 8 * 4];
  78171. sp_point_256 p[1];
  78172. #endif
  78173. int err = MP_OKAY;
  78174. #ifdef WOLFSSL_SP_SMALL_STACK
  78175. if (err == MP_OKAY) {
  78176. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  78177. DYNAMIC_TYPE_ECC);
  78178. if (p == NULL)
  78179. err = MEMORY_E;
  78180. }
  78181. if (err == MP_OKAY) {
  78182. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 4, NULL,
  78183. DYNAMIC_TYPE_ECC);
  78184. if (tmp == NULL)
  78185. err = MEMORY_E;
  78186. }
  78187. #endif
  78188. if (err == MP_OKAY) {
  78189. sp_256_from_mp(p->x, 8, pX);
  78190. sp_256_from_mp(p->y, 8, pY);
  78191. sp_256_from_mp(p->z, 8, pZ);
  78192. p->infinity = sp_256_iszero_8(p->x) &
  78193. sp_256_iszero_8(p->y);
  78194. sp_256_map_8(p, p, tmp);
  78195. }
  78196. if (err == MP_OKAY) {
  78197. err = sp_256_to_mp(p->x, pX);
  78198. }
  78199. if (err == MP_OKAY) {
  78200. err = sp_256_to_mp(p->y, pY);
  78201. }
  78202. if (err == MP_OKAY) {
  78203. err = sp_256_to_mp(p->z, pZ);
  78204. }
  78205. #ifdef WOLFSSL_SP_SMALL_STACK
  78206. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  78207. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  78208. #endif
  78209. return err;
  78210. }
  78211. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  78212. #ifdef HAVE_COMP_KEY
  78213. /* Find the square root of a number mod the prime of the curve.
  78214. *
  78215. * y The number to operate on and the result.
  78216. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  78217. */
  78218. static int sp_256_mont_sqrt_8(sp_digit* y)
  78219. {
  78220. #ifdef WOLFSSL_SP_SMALL_STACK
  78221. sp_digit* t1 = NULL;
  78222. #else
  78223. sp_digit t1[4 * 8];
  78224. #endif
  78225. sp_digit* t2 = NULL;
  78226. int err = MP_OKAY;
  78227. #ifdef WOLFSSL_SP_SMALL_STACK
  78228. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  78229. if (t1 == NULL) {
  78230. err = MEMORY_E;
  78231. }
  78232. #endif
  78233. if (err == MP_OKAY) {
  78234. t2 = t1 + 2 * 8;
  78235. {
  78236. /* t2 = y ^ 0x2 */
  78237. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  78238. /* t1 = y ^ 0x3 */
  78239. sp_256_mont_mul_8(t1, t2, y, p256_mod, p256_mp_mod);
  78240. /* t2 = y ^ 0xc */
  78241. sp_256_mont_sqr_n_8(t2, t1, 2, p256_mod, p256_mp_mod);
  78242. /* t1 = y ^ 0xf */
  78243. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  78244. /* t2 = y ^ 0xf0 */
  78245. sp_256_mont_sqr_n_8(t2, t1, 4, p256_mod, p256_mp_mod);
  78246. /* t1 = y ^ 0xff */
  78247. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  78248. /* t2 = y ^ 0xff00 */
  78249. sp_256_mont_sqr_n_8(t2, t1, 8, p256_mod, p256_mp_mod);
  78250. /* t1 = y ^ 0xffff */
  78251. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  78252. /* t2 = y ^ 0xffff0000 */
  78253. sp_256_mont_sqr_n_8(t2, t1, 16, p256_mod, p256_mp_mod);
  78254. /* t1 = y ^ 0xffffffff */
  78255. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  78256. /* t1 = y ^ 0xffffffff00000000 */
  78257. sp_256_mont_sqr_n_8(t1, t1, 32, p256_mod, p256_mp_mod);
  78258. /* t1 = y ^ 0xffffffff00000001 */
  78259. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  78260. /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
  78261. sp_256_mont_sqr_n_8(t1, t1, 96, p256_mod, p256_mp_mod);
  78262. /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
  78263. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  78264. sp_256_mont_sqr_n_8(y, t1, 94, p256_mod, p256_mp_mod);
  78265. }
  78266. }
  78267. #ifdef WOLFSSL_SP_SMALL_STACK
  78268. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  78269. #endif
  78270. return err;
  78271. }
  78272. /* Uncompress the point given the X ordinate.
  78273. *
  78274. * xm X ordinate.
  78275. * odd Whether the Y ordinate is odd.
  78276. * ym Calculated Y ordinate.
  78277. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  78278. */
  78279. int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym)
  78280. {
  78281. #ifdef WOLFSSL_SP_SMALL_STACK
  78282. sp_digit* x = NULL;
  78283. #else
  78284. sp_digit x[4 * 8];
  78285. #endif
  78286. sp_digit* y = NULL;
  78287. int err = MP_OKAY;
  78288. #ifdef WOLFSSL_SP_SMALL_STACK
  78289. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  78290. if (x == NULL)
  78291. err = MEMORY_E;
  78292. #endif
  78293. if (err == MP_OKAY) {
  78294. y = x + 2 * 8;
  78295. sp_256_from_mp(x, 8, xm);
  78296. err = sp_256_mod_mul_norm_8(x, x, p256_mod);
  78297. }
  78298. if (err == MP_OKAY) {
  78299. /* y = x^3 */
  78300. {
  78301. sp_256_mont_sqr_8(y, x, p256_mod, p256_mp_mod);
  78302. sp_256_mont_mul_8(y, y, x, p256_mod, p256_mp_mod);
  78303. }
  78304. /* y = x^3 - 3x */
  78305. sp_256_mont_sub_8(y, y, x, p256_mod);
  78306. sp_256_mont_sub_8(y, y, x, p256_mod);
  78307. sp_256_mont_sub_8(y, y, x, p256_mod);
  78308. /* y = x^3 - 3x + b */
  78309. err = sp_256_mod_mul_norm_8(x, p256_b, p256_mod);
  78310. }
  78311. if (err == MP_OKAY) {
  78312. sp_256_mont_add_8(y, y, x, p256_mod);
  78313. /* y = sqrt(x^3 - 3x + b) */
  78314. err = sp_256_mont_sqrt_8(y);
  78315. }
  78316. if (err == MP_OKAY) {
  78317. XMEMSET(y + 8, 0, 8U * sizeof(sp_digit));
  78318. sp_256_mont_reduce_8(y, p256_mod, p256_mp_mod);
  78319. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  78320. sp_256_mont_sub_8(y, p256_mod, y, p256_mod);
  78321. }
  78322. err = sp_256_to_mp(y, ym);
  78323. }
  78324. #ifdef WOLFSSL_SP_SMALL_STACK
  78325. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  78326. #endif
  78327. return err;
  78328. }
  78329. #endif
  78330. #endif /* !WOLFSSL_SP_NO_256 */
  78331. #ifdef WOLFSSL_SP_384
  78332. /* Point structure to use. */
  78333. typedef struct sp_point_384 {
  78334. /* X ordinate of point. */
  78335. sp_digit x[2 * 12];
  78336. /* Y ordinate of point. */
  78337. sp_digit y[2 * 12];
  78338. /* Z ordinate of point. */
  78339. sp_digit z[2 * 12];
  78340. /* Indicates point is at infinity. */
  78341. int infinity;
  78342. } sp_point_384;
  78343. /* The modulus (prime) of the curve P384. */
  78344. static const sp_digit p384_mod[12] = {
  78345. 0xffffffff,0x00000000,0x00000000,0xffffffff,0xfffffffe,0xffffffff,
  78346. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  78347. };
  78348. /* The Montgomery normalizer for modulus of the curve P384. */
  78349. static const sp_digit p384_norm_mod[12] = {
  78350. 0x00000001,0xffffffff,0xffffffff,0x00000000,0x00000001,0x00000000,
  78351. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  78352. };
  78353. /* The Montgomery multiplier for modulus of the curve P384. */
  78354. static sp_digit p384_mp_mod = 0x00000001;
  78355. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  78356. defined(HAVE_ECC_VERIFY)
  78357. /* The order of the curve P384. */
  78358. static const sp_digit p384_order[12] = {
  78359. 0xccc52973,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  78360. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  78361. };
  78362. #endif
  78363. /* The order of the curve P384 minus 2. */
  78364. static const sp_digit p384_order2[12] = {
  78365. 0xccc52971,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  78366. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  78367. };
  78368. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  78369. /* The Montgomery normalizer for order of the curve P384. */
  78370. static const sp_digit p384_norm_order[12] = {
  78371. 0x333ad68d,0x1313e695,0xb74f5885,0xa7e5f24d,0x0bc8d220,0x389cb27e,
  78372. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  78373. };
  78374. #endif
  78375. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  78376. /* The Montgomery multiplier for order of the curve P384. */
  78377. static sp_digit p384_mp_order = 0xe88fdc45;
  78378. #endif
  78379. /* The base point of curve P384. */
  78380. static const sp_point_384 p384_base = {
  78381. /* X ordinate */
  78382. {
  78383. 0x72760ab7,0x3a545e38,0xbf55296c,0x5502f25d,0x82542a38,0x59f741e0,
  78384. 0x8ba79b98,0x6e1d3b62,0xf320ad74,0x8eb1c71e,0xbe8b0537,0xaa87ca22,
  78385. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78386. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78387. (sp_digit)0, (sp_digit)0
  78388. },
  78389. /* Y ordinate */
  78390. {
  78391. 0x90ea0e5f,0x7a431d7c,0x1d7e819d,0x0a60b1ce,0xb5f0b8c0,0xe9da3113,
  78392. 0x289a147c,0xf8f41dbd,0x9292dc29,0x5d9e98bf,0x96262c6f,0x3617de4a,
  78393. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78394. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78395. (sp_digit)0, (sp_digit)0
  78396. },
  78397. /* Z ordinate */
  78398. {
  78399. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  78400. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  78401. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78402. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  78403. (sp_digit)0, (sp_digit)0
  78404. },
  78405. /* infinity */
  78406. 0
  78407. };
  78408. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  78409. static const sp_digit p384_b[12] = {
  78410. 0xd3ec2aef,0x2a85c8ed,0x8a2ed19d,0xc656398d,0x5013875a,0x0314088f,
  78411. 0xfe814112,0x181d9c6e,0xe3f82d19,0x988e056b,0xe23ee7e4,0xb3312fa7
  78412. };
  78413. #endif
  78414. #ifdef WOLFSSL_SP_SMALL
  78415. /* Multiply a and b into r. (r = a * b)
  78416. *
  78417. * r A single precision integer.
  78418. * a A single precision integer.
  78419. * b A single precision integer.
  78420. */
  78421. static void sp_384_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  78422. {
  78423. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  78424. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  78425. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  78426. __asm__ __volatile__ (
  78427. "sub sp, sp, #0x60\n\t"
  78428. "ldr lr, [%[a]]\n\t"
  78429. "ldr r11, [%[b]]\n\t"
  78430. "umull r8, r6, lr, r11\n\t"
  78431. "str r8, [sp]\n\t"
  78432. "mov r7, #0\n\t"
  78433. "mov r8, #0\n\t"
  78434. "mov r5, #4\n\t"
  78435. "\n"
  78436. "L_sp_384_mul_12_outer_%=: \n\t"
  78437. "subs r3, r5, #44\n\t"
  78438. "it cc\n\t"
  78439. "movcc r3, #0\n\t"
  78440. "sub r4, r5, r3\n\t"
  78441. "\n"
  78442. "L_sp_384_mul_12_inner_%=: \n\t"
  78443. "ldr lr, [%[a], r3]\n\t"
  78444. "ldr r11, [%[b], r4]\n\t"
  78445. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78446. "lsl r9, lr, #16\n\t"
  78447. "lsl r10, r11, #16\n\t"
  78448. "lsr r9, r9, #16\n\t"
  78449. "lsr r10, r10, #16\n\t"
  78450. "mul r10, r9, r10\n\t"
  78451. "adds r6, r6, r10\n\t"
  78452. "adcs r7, r7, #0\n\t"
  78453. "adc r8, r8, #0\n\t"
  78454. "lsr r10, r11, #16\n\t"
  78455. "mul r9, r10, r9\n\t"
  78456. "lsr r10, r9, #16\n\t"
  78457. "lsl r9, r9, #16\n\t"
  78458. "adds r6, r6, r9\n\t"
  78459. "adcs r7, r7, r10\n\t"
  78460. "adc r8, r8, #0\n\t"
  78461. "lsr r9, lr, #16\n\t"
  78462. "lsr r10, r11, #16\n\t"
  78463. "mul r10, r9, r10\n\t"
  78464. "adds r7, r7, r10\n\t"
  78465. "adc r8, r8, #0\n\t"
  78466. "lsl r10, r11, #16\n\t"
  78467. "lsr r10, r10, #16\n\t"
  78468. "mul r9, r10, r9\n\t"
  78469. "lsr r10, r9, #16\n\t"
  78470. "lsl r9, r9, #16\n\t"
  78471. "adds r6, r6, r9\n\t"
  78472. "adcs r7, r7, r10\n\t"
  78473. "adc r8, r8, #0\n\t"
  78474. #else
  78475. "umull r9, r10, lr, r11\n\t"
  78476. "adds r6, r6, r9\n\t"
  78477. "adcs r7, r7, r10\n\t"
  78478. "adc r8, r8, #0\n\t"
  78479. #endif
  78480. "ldr lr, [%[a], r4]\n\t"
  78481. "ldr r11, [%[b], r3]\n\t"
  78482. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78483. "lsl r9, lr, #16\n\t"
  78484. "lsl r10, r11, #16\n\t"
  78485. "lsr r9, r9, #16\n\t"
  78486. "lsr r10, r10, #16\n\t"
  78487. "mul r10, r9, r10\n\t"
  78488. "adds r6, r6, r10\n\t"
  78489. "adcs r7, r7, #0\n\t"
  78490. "adc r8, r8, #0\n\t"
  78491. "lsr r10, r11, #16\n\t"
  78492. "mul r9, r10, r9\n\t"
  78493. "lsr r10, r9, #16\n\t"
  78494. "lsl r9, r9, #16\n\t"
  78495. "adds r6, r6, r9\n\t"
  78496. "adcs r7, r7, r10\n\t"
  78497. "adc r8, r8, #0\n\t"
  78498. "lsr r9, lr, #16\n\t"
  78499. "lsr r10, r11, #16\n\t"
  78500. "mul r10, r9, r10\n\t"
  78501. "adds r7, r7, r10\n\t"
  78502. "adc r8, r8, #0\n\t"
  78503. "lsl r10, r11, #16\n\t"
  78504. "lsr r10, r10, #16\n\t"
  78505. "mul r9, r10, r9\n\t"
  78506. "lsr r10, r9, #16\n\t"
  78507. "lsl r9, r9, #16\n\t"
  78508. "adds r6, r6, r9\n\t"
  78509. "adcs r7, r7, r10\n\t"
  78510. "adc r8, r8, #0\n\t"
  78511. #else
  78512. "umull r9, r10, lr, r11\n\t"
  78513. "adds r6, r6, r9\n\t"
  78514. "adcs r7, r7, r10\n\t"
  78515. "adc r8, r8, #0\n\t"
  78516. #endif
  78517. "add r3, r3, #4\n\t"
  78518. "sub r4, r4, #4\n\t"
  78519. "cmp r3, r4\n\t"
  78520. "bgt L_sp_384_mul_12_inner_done_%=\n\t"
  78521. "blt L_sp_384_mul_12_inner_%=\n\t"
  78522. "ldr lr, [%[a], r3]\n\t"
  78523. "ldr r11, [%[b], r3]\n\t"
  78524. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78525. "lsl r9, lr, #16\n\t"
  78526. "lsl r10, r11, #16\n\t"
  78527. "lsr r9, r9, #16\n\t"
  78528. "lsr r10, r10, #16\n\t"
  78529. "mul r10, r9, r10\n\t"
  78530. "adds r6, r6, r10\n\t"
  78531. "adcs r7, r7, #0\n\t"
  78532. "adc r8, r8, #0\n\t"
  78533. "lsr r10, r11, #16\n\t"
  78534. "mul r9, r10, r9\n\t"
  78535. "lsr r10, r9, #16\n\t"
  78536. "lsl r9, r9, #16\n\t"
  78537. "adds r6, r6, r9\n\t"
  78538. "adcs r7, r7, r10\n\t"
  78539. "adc r8, r8, #0\n\t"
  78540. "lsr r9, lr, #16\n\t"
  78541. "lsr r10, r11, #16\n\t"
  78542. "mul r10, r9, r10\n\t"
  78543. "adds r7, r7, r10\n\t"
  78544. "adc r8, r8, #0\n\t"
  78545. "lsl r10, r11, #16\n\t"
  78546. "lsr r10, r10, #16\n\t"
  78547. "mul r9, r10, r9\n\t"
  78548. "lsr r10, r9, #16\n\t"
  78549. "lsl r9, r9, #16\n\t"
  78550. "adds r6, r6, r9\n\t"
  78551. "adcs r7, r7, r10\n\t"
  78552. "adc r8, r8, #0\n\t"
  78553. #else
  78554. "umull r9, r10, lr, r11\n\t"
  78555. "adds r6, r6, r9\n\t"
  78556. "adcs r7, r7, r10\n\t"
  78557. "adc r8, r8, #0\n\t"
  78558. #endif
  78559. "\n"
  78560. "L_sp_384_mul_12_inner_done_%=: \n\t"
  78561. "str r6, [sp, r5]\n\t"
  78562. "mov r6, r7\n\t"
  78563. "mov r7, r8\n\t"
  78564. "mov r8, #0\n\t"
  78565. "add r5, r5, #4\n\t"
  78566. "cmp r5, #0x54\n\t"
  78567. "ble L_sp_384_mul_12_outer_%=\n\t"
  78568. "ldr lr, [%[a], #44]\n\t"
  78569. "ldr r11, [%[b], #44]\n\t"
  78570. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78571. "lsl r9, lr, #16\n\t"
  78572. "lsl r10, r11, #16\n\t"
  78573. "lsr r9, r9, #16\n\t"
  78574. "lsr r10, r10, #16\n\t"
  78575. "mul r10, r9, r10\n\t"
  78576. "adds r6, r6, r10\n\t"
  78577. "adc r7, r7, #0\n\t"
  78578. "lsr r10, r11, #16\n\t"
  78579. "mul r9, r10, r9\n\t"
  78580. "lsr r10, r9, #16\n\t"
  78581. "lsl r9, r9, #16\n\t"
  78582. "adds r6, r6, r9\n\t"
  78583. "adc r7, r7, r10\n\t"
  78584. "lsr r9, lr, #16\n\t"
  78585. "lsr r10, r11, #16\n\t"
  78586. "mul r10, r9, r10\n\t"
  78587. "add r7, r7, r10\n\t"
  78588. "lsl r10, r11, #16\n\t"
  78589. "lsr r10, r10, #16\n\t"
  78590. "mul r9, r10, r9\n\t"
  78591. "lsr r10, r9, #16\n\t"
  78592. "lsl r9, r9, #16\n\t"
  78593. "adds r6, r6, r9\n\t"
  78594. "adc r7, r7, r10\n\t"
  78595. #else
  78596. "umlal r6, r7, lr, r11\n\t"
  78597. #endif
  78598. "str r6, [sp, r5]\n\t"
  78599. "add r5, r5, #4\n\t"
  78600. "str r7, [sp, r5]\n\t"
  78601. "\n"
  78602. "L_sp_384_mul_12_store_%=: \n\t"
  78603. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  78604. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  78605. "subs r5, r5, #32\n\t"
  78606. "bgt L_sp_384_mul_12_store_%=\n\t"
  78607. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  78608. :
  78609. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  78610. );
  78611. }
  78612. #else
  78613. /* Multiply a and b into r. (r = a * b)
  78614. *
  78615. * r A single precision integer.
  78616. * a A single precision integer.
  78617. * b A single precision integer.
  78618. */
  78619. static void sp_384_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  78620. {
  78621. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  78622. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  78623. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  78624. __asm__ __volatile__ (
  78625. "sub sp, sp, #48\n\t"
  78626. /* A[0] * B[0] */
  78627. "ldr r11, [%[a]]\n\t"
  78628. "ldr r12, [%[b]]\n\t"
  78629. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78630. "lsl r6, r11, #16\n\t"
  78631. "lsl r3, r12, #16\n\t"
  78632. "lsr r6, r6, #16\n\t"
  78633. "lsr r3, r3, #16\n\t"
  78634. "mul r3, r6, r3\n\t"
  78635. "lsr r7, r12, #16\n\t"
  78636. "mul r6, r7, r6\n\t"
  78637. "lsr r4, r6, #16\n\t"
  78638. "lsl r6, r6, #16\n\t"
  78639. "adds r3, r3, r6\n\t"
  78640. "adc r4, r4, #0\n\t"
  78641. "lsr r6, r11, #16\n\t"
  78642. "mul r7, r6, r7\n\t"
  78643. "add r4, r4, r7\n\t"
  78644. "lsl r7, r12, #16\n\t"
  78645. "lsr r7, r7, #16\n\t"
  78646. "mul r6, r7, r6\n\t"
  78647. "lsr r7, r6, #16\n\t"
  78648. "lsl r6, r6, #16\n\t"
  78649. "adds r3, r3, r6\n\t"
  78650. "adc r4, r4, r7\n\t"
  78651. "mov r5, #0\n\t"
  78652. #else
  78653. "umull r3, r4, r11, r12\n\t"
  78654. "mov r5, #0\n\t"
  78655. #endif
  78656. "str r3, [sp]\n\t"
  78657. /* A[0] * B[1] */
  78658. "ldr r9, [%[b], #4]\n\t"
  78659. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78660. "lsl r6, r11, #16\n\t"
  78661. "lsl r7, r9, #16\n\t"
  78662. "lsr r6, r6, #16\n\t"
  78663. "lsr r7, r7, #16\n\t"
  78664. "mul r7, r6, r7\n\t"
  78665. "adds r4, r4, r7\n\t"
  78666. "adcs r5, r5, #0\n\t"
  78667. "mov r3, #0\n\t"
  78668. "adc r3, r3, #0\n\t"
  78669. "lsr r7, r9, #16\n\t"
  78670. "mul r6, r7, r6\n\t"
  78671. "lsr r7, r6, #16\n\t"
  78672. "lsl r6, r6, #16\n\t"
  78673. "adds r4, r4, r6\n\t"
  78674. "adcs r5, r5, r7\n\t"
  78675. "adc r3, r3, #0\n\t"
  78676. "lsr r6, r11, #16\n\t"
  78677. "lsr r7, r9, #16\n\t"
  78678. "mul r7, r6, r7\n\t"
  78679. "adds r5, r5, r7\n\t"
  78680. "adc r3, r3, #0\n\t"
  78681. "lsl r7, r9, #16\n\t"
  78682. "lsr r7, r7, #16\n\t"
  78683. "mul r6, r7, r6\n\t"
  78684. "lsr r7, r6, #16\n\t"
  78685. "lsl r6, r6, #16\n\t"
  78686. "adds r4, r4, r6\n\t"
  78687. "adcs r5, r5, r7\n\t"
  78688. "adc r3, r3, #0\n\t"
  78689. #else
  78690. "umull r6, r7, r11, r9\n\t"
  78691. "adds r4, r4, r6\n\t"
  78692. "adcs r5, r5, r7\n\t"
  78693. "mov r3, #0\n\t"
  78694. "adc r3, r3, #0\n\t"
  78695. #endif
  78696. /* A[1] * B[0] */
  78697. "ldr r8, [%[a], #4]\n\t"
  78698. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78699. "lsl r6, r8, #16\n\t"
  78700. "lsl r7, r12, #16\n\t"
  78701. "lsr r6, r6, #16\n\t"
  78702. "lsr r7, r7, #16\n\t"
  78703. "mul r7, r6, r7\n\t"
  78704. "adds r4, r4, r7\n\t"
  78705. "adcs r5, r5, #0\n\t"
  78706. "adc r3, r3, #0\n\t"
  78707. "lsr r7, r12, #16\n\t"
  78708. "mul r6, r7, r6\n\t"
  78709. "lsr r7, r6, #16\n\t"
  78710. "lsl r6, r6, #16\n\t"
  78711. "adds r4, r4, r6\n\t"
  78712. "adcs r5, r5, r7\n\t"
  78713. "adc r3, r3, #0\n\t"
  78714. "lsr r6, r8, #16\n\t"
  78715. "lsr r7, r12, #16\n\t"
  78716. "mul r7, r6, r7\n\t"
  78717. "adds r5, r5, r7\n\t"
  78718. "adc r3, r3, #0\n\t"
  78719. "lsl r7, r12, #16\n\t"
  78720. "lsr r7, r7, #16\n\t"
  78721. "mul r6, r7, r6\n\t"
  78722. "lsr r7, r6, #16\n\t"
  78723. "lsl r6, r6, #16\n\t"
  78724. "adds r4, r4, r6\n\t"
  78725. "adcs r5, r5, r7\n\t"
  78726. "adc r3, r3, #0\n\t"
  78727. #else
  78728. "umull r6, r7, r8, r12\n\t"
  78729. "adds r4, r4, r6\n\t"
  78730. "adcs r5, r5, r7\n\t"
  78731. "adc r3, r3, #0\n\t"
  78732. #endif
  78733. "str r4, [sp, #4]\n\t"
  78734. /* A[2] * B[0] */
  78735. "ldr r8, [%[a], #8]\n\t"
  78736. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78737. "lsl r6, r8, #16\n\t"
  78738. "lsl r7, r12, #16\n\t"
  78739. "lsr r6, r6, #16\n\t"
  78740. "lsr r7, r7, #16\n\t"
  78741. "mul r7, r6, r7\n\t"
  78742. "adds r5, r5, r7\n\t"
  78743. "adcs r3, r3, #0\n\t"
  78744. "mov r4, #0\n\t"
  78745. "adc r4, r4, #0\n\t"
  78746. "lsr r7, r12, #16\n\t"
  78747. "mul r6, r7, r6\n\t"
  78748. "lsr r7, r6, #16\n\t"
  78749. "lsl r6, r6, #16\n\t"
  78750. "adds r5, r5, r6\n\t"
  78751. "adcs r3, r3, r7\n\t"
  78752. "adc r4, r4, #0\n\t"
  78753. "lsr r6, r8, #16\n\t"
  78754. "lsr r7, r12, #16\n\t"
  78755. "mul r7, r6, r7\n\t"
  78756. "adds r3, r3, r7\n\t"
  78757. "adc r4, r4, #0\n\t"
  78758. "lsl r7, r12, #16\n\t"
  78759. "lsr r7, r7, #16\n\t"
  78760. "mul r6, r7, r6\n\t"
  78761. "lsr r7, r6, #16\n\t"
  78762. "lsl r6, r6, #16\n\t"
  78763. "adds r5, r5, r6\n\t"
  78764. "adcs r3, r3, r7\n\t"
  78765. "adc r4, r4, #0\n\t"
  78766. #else
  78767. "umull r6, r7, r8, r12\n\t"
  78768. "adds r5, r5, r6\n\t"
  78769. "adcs r3, r3, r7\n\t"
  78770. "mov r4, #0\n\t"
  78771. "adc r4, r4, #0\n\t"
  78772. #endif
  78773. /* A[1] * B[1] */
  78774. "ldr r11, [%[a], #4]\n\t"
  78775. "ldr r12, [%[b], #4]\n\t"
  78776. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78777. "lsl r6, r11, #16\n\t"
  78778. "lsl r7, r12, #16\n\t"
  78779. "lsr r6, r6, #16\n\t"
  78780. "lsr r7, r7, #16\n\t"
  78781. "mul r7, r6, r7\n\t"
  78782. "adds r5, r5, r7\n\t"
  78783. "adcs r3, r3, #0\n\t"
  78784. "adc r4, r4, #0\n\t"
  78785. "lsr r7, r12, #16\n\t"
  78786. "mul r6, r7, r6\n\t"
  78787. "lsr r7, r6, #16\n\t"
  78788. "lsl r6, r6, #16\n\t"
  78789. "adds r5, r5, r6\n\t"
  78790. "adcs r3, r3, r7\n\t"
  78791. "adc r4, r4, #0\n\t"
  78792. "lsr r6, r11, #16\n\t"
  78793. "lsr r7, r12, #16\n\t"
  78794. "mul r7, r6, r7\n\t"
  78795. "adds r3, r3, r7\n\t"
  78796. "adc r4, r4, #0\n\t"
  78797. "lsl r7, r12, #16\n\t"
  78798. "lsr r7, r7, #16\n\t"
  78799. "mul r6, r7, r6\n\t"
  78800. "lsr r7, r6, #16\n\t"
  78801. "lsl r6, r6, #16\n\t"
  78802. "adds r5, r5, r6\n\t"
  78803. "adcs r3, r3, r7\n\t"
  78804. "adc r4, r4, #0\n\t"
  78805. #else
  78806. "umull r6, r7, r11, r12\n\t"
  78807. "adds r5, r5, r6\n\t"
  78808. "adcs r3, r3, r7\n\t"
  78809. "adc r4, r4, #0\n\t"
  78810. #endif
  78811. /* A[0] * B[2] */
  78812. "ldr r8, [%[a]]\n\t"
  78813. "ldr r9, [%[b], #8]\n\t"
  78814. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78815. "lsl r6, r8, #16\n\t"
  78816. "lsl r7, r9, #16\n\t"
  78817. "lsr r6, r6, #16\n\t"
  78818. "lsr r7, r7, #16\n\t"
  78819. "mul r7, r6, r7\n\t"
  78820. "adds r5, r5, r7\n\t"
  78821. "adcs r3, r3, #0\n\t"
  78822. "adc r4, r4, #0\n\t"
  78823. "lsr r7, r9, #16\n\t"
  78824. "mul r6, r7, r6\n\t"
  78825. "lsr r7, r6, #16\n\t"
  78826. "lsl r6, r6, #16\n\t"
  78827. "adds r5, r5, r6\n\t"
  78828. "adcs r3, r3, r7\n\t"
  78829. "adc r4, r4, #0\n\t"
  78830. "lsr r6, r8, #16\n\t"
  78831. "lsr r7, r9, #16\n\t"
  78832. "mul r7, r6, r7\n\t"
  78833. "adds r3, r3, r7\n\t"
  78834. "adc r4, r4, #0\n\t"
  78835. "lsl r7, r9, #16\n\t"
  78836. "lsr r7, r7, #16\n\t"
  78837. "mul r6, r7, r6\n\t"
  78838. "lsr r7, r6, #16\n\t"
  78839. "lsl r6, r6, #16\n\t"
  78840. "adds r5, r5, r6\n\t"
  78841. "adcs r3, r3, r7\n\t"
  78842. "adc r4, r4, #0\n\t"
  78843. #else
  78844. "umull r6, r7, r8, r9\n\t"
  78845. "adds r5, r5, r6\n\t"
  78846. "adcs r3, r3, r7\n\t"
  78847. "adc r4, r4, #0\n\t"
  78848. #endif
  78849. "str r5, [sp, #8]\n\t"
  78850. /* A[0] * B[3] */
  78851. "ldr r9, [%[b], #12]\n\t"
  78852. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78853. "lsl r6, r8, #16\n\t"
  78854. "lsl r7, r9, #16\n\t"
  78855. "lsr r6, r6, #16\n\t"
  78856. "lsr r7, r7, #16\n\t"
  78857. "mul r7, r6, r7\n\t"
  78858. "adds r3, r3, r7\n\t"
  78859. "adcs r4, r4, #0\n\t"
  78860. "mov r5, #0\n\t"
  78861. "adc r5, r5, #0\n\t"
  78862. "lsr r7, r9, #16\n\t"
  78863. "mul r6, r7, r6\n\t"
  78864. "lsr r7, r6, #16\n\t"
  78865. "lsl r6, r6, #16\n\t"
  78866. "adds r3, r3, r6\n\t"
  78867. "adcs r4, r4, r7\n\t"
  78868. "adc r5, r5, #0\n\t"
  78869. "lsr r6, r8, #16\n\t"
  78870. "lsr r7, r9, #16\n\t"
  78871. "mul r7, r6, r7\n\t"
  78872. "adds r4, r4, r7\n\t"
  78873. "adc r5, r5, #0\n\t"
  78874. "lsl r7, r9, #16\n\t"
  78875. "lsr r7, r7, #16\n\t"
  78876. "mul r6, r7, r6\n\t"
  78877. "lsr r7, r6, #16\n\t"
  78878. "lsl r6, r6, #16\n\t"
  78879. "adds r3, r3, r6\n\t"
  78880. "adcs r4, r4, r7\n\t"
  78881. "adc r5, r5, #0\n\t"
  78882. #else
  78883. "umull r6, r7, r8, r9\n\t"
  78884. "adds r3, r3, r6\n\t"
  78885. "adcs r4, r4, r7\n\t"
  78886. "mov r5, #0\n\t"
  78887. "adc r5, r5, #0\n\t"
  78888. #endif
  78889. /* A[1] * B[2] */
  78890. "ldr r9, [%[b], #8]\n\t"
  78891. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78892. "lsl r6, r11, #16\n\t"
  78893. "lsl r7, r9, #16\n\t"
  78894. "lsr r6, r6, #16\n\t"
  78895. "lsr r7, r7, #16\n\t"
  78896. "mul r7, r6, r7\n\t"
  78897. "adds r3, r3, r7\n\t"
  78898. "adcs r4, r4, #0\n\t"
  78899. "adc r5, r5, #0\n\t"
  78900. "lsr r7, r9, #16\n\t"
  78901. "mul r6, r7, r6\n\t"
  78902. "lsr r7, r6, #16\n\t"
  78903. "lsl r6, r6, #16\n\t"
  78904. "adds r3, r3, r6\n\t"
  78905. "adcs r4, r4, r7\n\t"
  78906. "adc r5, r5, #0\n\t"
  78907. "lsr r6, r11, #16\n\t"
  78908. "lsr r7, r9, #16\n\t"
  78909. "mul r7, r6, r7\n\t"
  78910. "adds r4, r4, r7\n\t"
  78911. "adc r5, r5, #0\n\t"
  78912. "lsl r7, r9, #16\n\t"
  78913. "lsr r7, r7, #16\n\t"
  78914. "mul r6, r7, r6\n\t"
  78915. "lsr r7, r6, #16\n\t"
  78916. "lsl r6, r6, #16\n\t"
  78917. "adds r3, r3, r6\n\t"
  78918. "adcs r4, r4, r7\n\t"
  78919. "adc r5, r5, #0\n\t"
  78920. #else
  78921. "umull r6, r7, r11, r9\n\t"
  78922. "adds r3, r3, r6\n\t"
  78923. "adcs r4, r4, r7\n\t"
  78924. "adc r5, r5, #0\n\t"
  78925. #endif
  78926. /* A[2] * B[1] */
  78927. "ldr r8, [%[a], #8]\n\t"
  78928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78929. "lsl r6, r8, #16\n\t"
  78930. "lsl r7, r12, #16\n\t"
  78931. "lsr r6, r6, #16\n\t"
  78932. "lsr r7, r7, #16\n\t"
  78933. "mul r7, r6, r7\n\t"
  78934. "adds r3, r3, r7\n\t"
  78935. "adcs r4, r4, #0\n\t"
  78936. "adc r5, r5, #0\n\t"
  78937. "lsr r7, r12, #16\n\t"
  78938. "mul r6, r7, r6\n\t"
  78939. "lsr r7, r6, #16\n\t"
  78940. "lsl r6, r6, #16\n\t"
  78941. "adds r3, r3, r6\n\t"
  78942. "adcs r4, r4, r7\n\t"
  78943. "adc r5, r5, #0\n\t"
  78944. "lsr r6, r8, #16\n\t"
  78945. "lsr r7, r12, #16\n\t"
  78946. "mul r7, r6, r7\n\t"
  78947. "adds r4, r4, r7\n\t"
  78948. "adc r5, r5, #0\n\t"
  78949. "lsl r7, r12, #16\n\t"
  78950. "lsr r7, r7, #16\n\t"
  78951. "mul r6, r7, r6\n\t"
  78952. "lsr r7, r6, #16\n\t"
  78953. "lsl r6, r6, #16\n\t"
  78954. "adds r3, r3, r6\n\t"
  78955. "adcs r4, r4, r7\n\t"
  78956. "adc r5, r5, #0\n\t"
  78957. #else
  78958. "umull r6, r7, r8, r12\n\t"
  78959. "adds r3, r3, r6\n\t"
  78960. "adcs r4, r4, r7\n\t"
  78961. "adc r5, r5, #0\n\t"
  78962. #endif
  78963. /* A[3] * B[0] */
  78964. "ldr r8, [%[a], #12]\n\t"
  78965. "ldr r9, [%[b]]\n\t"
  78966. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  78967. "lsl r6, r8, #16\n\t"
  78968. "lsl r7, r9, #16\n\t"
  78969. "lsr r6, r6, #16\n\t"
  78970. "lsr r7, r7, #16\n\t"
  78971. "mul r7, r6, r7\n\t"
  78972. "adds r3, r3, r7\n\t"
  78973. "adcs r4, r4, #0\n\t"
  78974. "adc r5, r5, #0\n\t"
  78975. "lsr r7, r9, #16\n\t"
  78976. "mul r6, r7, r6\n\t"
  78977. "lsr r7, r6, #16\n\t"
  78978. "lsl r6, r6, #16\n\t"
  78979. "adds r3, r3, r6\n\t"
  78980. "adcs r4, r4, r7\n\t"
  78981. "adc r5, r5, #0\n\t"
  78982. "lsr r6, r8, #16\n\t"
  78983. "lsr r7, r9, #16\n\t"
  78984. "mul r7, r6, r7\n\t"
  78985. "adds r4, r4, r7\n\t"
  78986. "adc r5, r5, #0\n\t"
  78987. "lsl r7, r9, #16\n\t"
  78988. "lsr r7, r7, #16\n\t"
  78989. "mul r6, r7, r6\n\t"
  78990. "lsr r7, r6, #16\n\t"
  78991. "lsl r6, r6, #16\n\t"
  78992. "adds r3, r3, r6\n\t"
  78993. "adcs r4, r4, r7\n\t"
  78994. "adc r5, r5, #0\n\t"
  78995. #else
  78996. "umull r6, r7, r8, r9\n\t"
  78997. "adds r3, r3, r6\n\t"
  78998. "adcs r4, r4, r7\n\t"
  78999. "adc r5, r5, #0\n\t"
  79000. #endif
  79001. "str r3, [sp, #12]\n\t"
  79002. /* A[4] * B[0] */
  79003. "ldr r8, [%[a], #16]\n\t"
  79004. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79005. "lsl r6, r8, #16\n\t"
  79006. "lsl r7, r9, #16\n\t"
  79007. "lsr r6, r6, #16\n\t"
  79008. "lsr r7, r7, #16\n\t"
  79009. "mul r7, r6, r7\n\t"
  79010. "adds r4, r4, r7\n\t"
  79011. "adcs r5, r5, #0\n\t"
  79012. "mov r3, #0\n\t"
  79013. "adc r3, r3, #0\n\t"
  79014. "lsr r7, r9, #16\n\t"
  79015. "mul r6, r7, r6\n\t"
  79016. "lsr r7, r6, #16\n\t"
  79017. "lsl r6, r6, #16\n\t"
  79018. "adds r4, r4, r6\n\t"
  79019. "adcs r5, r5, r7\n\t"
  79020. "adc r3, r3, #0\n\t"
  79021. "lsr r6, r8, #16\n\t"
  79022. "lsr r7, r9, #16\n\t"
  79023. "mul r7, r6, r7\n\t"
  79024. "adds r5, r5, r7\n\t"
  79025. "adc r3, r3, #0\n\t"
  79026. "lsl r7, r9, #16\n\t"
  79027. "lsr r7, r7, #16\n\t"
  79028. "mul r6, r7, r6\n\t"
  79029. "lsr r7, r6, #16\n\t"
  79030. "lsl r6, r6, #16\n\t"
  79031. "adds r4, r4, r6\n\t"
  79032. "adcs r5, r5, r7\n\t"
  79033. "adc r3, r3, #0\n\t"
  79034. #else
  79035. "umull r6, r7, r8, r9\n\t"
  79036. "adds r4, r4, r6\n\t"
  79037. "adcs r5, r5, r7\n\t"
  79038. "mov r3, #0\n\t"
  79039. "adc r3, r3, #0\n\t"
  79040. #endif
  79041. /* A[3] * B[1] */
  79042. "ldr r8, [%[a], #12]\n\t"
  79043. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79044. "lsl r6, r8, #16\n\t"
  79045. "lsl r7, r12, #16\n\t"
  79046. "lsr r6, r6, #16\n\t"
  79047. "lsr r7, r7, #16\n\t"
  79048. "mul r7, r6, r7\n\t"
  79049. "adds r4, r4, r7\n\t"
  79050. "adcs r5, r5, #0\n\t"
  79051. "adc r3, r3, #0\n\t"
  79052. "lsr r7, r12, #16\n\t"
  79053. "mul r6, r7, r6\n\t"
  79054. "lsr r7, r6, #16\n\t"
  79055. "lsl r6, r6, #16\n\t"
  79056. "adds r4, r4, r6\n\t"
  79057. "adcs r5, r5, r7\n\t"
  79058. "adc r3, r3, #0\n\t"
  79059. "lsr r6, r8, #16\n\t"
  79060. "lsr r7, r12, #16\n\t"
  79061. "mul r7, r6, r7\n\t"
  79062. "adds r5, r5, r7\n\t"
  79063. "adc r3, r3, #0\n\t"
  79064. "lsl r7, r12, #16\n\t"
  79065. "lsr r7, r7, #16\n\t"
  79066. "mul r6, r7, r6\n\t"
  79067. "lsr r7, r6, #16\n\t"
  79068. "lsl r6, r6, #16\n\t"
  79069. "adds r4, r4, r6\n\t"
  79070. "adcs r5, r5, r7\n\t"
  79071. "adc r3, r3, #0\n\t"
  79072. #else
  79073. "umull r6, r7, r8, r12\n\t"
  79074. "adds r4, r4, r6\n\t"
  79075. "adcs r5, r5, r7\n\t"
  79076. "adc r3, r3, #0\n\t"
  79077. #endif
  79078. /* A[2] * B[2] */
  79079. "ldr r11, [%[a], #8]\n\t"
  79080. "ldr r12, [%[b], #8]\n\t"
  79081. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79082. "lsl r6, r11, #16\n\t"
  79083. "lsl r7, r12, #16\n\t"
  79084. "lsr r6, r6, #16\n\t"
  79085. "lsr r7, r7, #16\n\t"
  79086. "mul r7, r6, r7\n\t"
  79087. "adds r4, r4, r7\n\t"
  79088. "adcs r5, r5, #0\n\t"
  79089. "adc r3, r3, #0\n\t"
  79090. "lsr r7, r12, #16\n\t"
  79091. "mul r6, r7, r6\n\t"
  79092. "lsr r7, r6, #16\n\t"
  79093. "lsl r6, r6, #16\n\t"
  79094. "adds r4, r4, r6\n\t"
  79095. "adcs r5, r5, r7\n\t"
  79096. "adc r3, r3, #0\n\t"
  79097. "lsr r6, r11, #16\n\t"
  79098. "lsr r7, r12, #16\n\t"
  79099. "mul r7, r6, r7\n\t"
  79100. "adds r5, r5, r7\n\t"
  79101. "adc r3, r3, #0\n\t"
  79102. "lsl r7, r12, #16\n\t"
  79103. "lsr r7, r7, #16\n\t"
  79104. "mul r6, r7, r6\n\t"
  79105. "lsr r7, r6, #16\n\t"
  79106. "lsl r6, r6, #16\n\t"
  79107. "adds r4, r4, r6\n\t"
  79108. "adcs r5, r5, r7\n\t"
  79109. "adc r3, r3, #0\n\t"
  79110. #else
  79111. "umull r6, r7, r11, r12\n\t"
  79112. "adds r4, r4, r6\n\t"
  79113. "adcs r5, r5, r7\n\t"
  79114. "adc r3, r3, #0\n\t"
  79115. #endif
  79116. /* A[1] * B[3] */
  79117. "ldr r8, [%[a], #4]\n\t"
  79118. "ldr r9, [%[b], #12]\n\t"
  79119. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79120. "lsl r6, r8, #16\n\t"
  79121. "lsl r7, r9, #16\n\t"
  79122. "lsr r6, r6, #16\n\t"
  79123. "lsr r7, r7, #16\n\t"
  79124. "mul r7, r6, r7\n\t"
  79125. "adds r4, r4, r7\n\t"
  79126. "adcs r5, r5, #0\n\t"
  79127. "adc r3, r3, #0\n\t"
  79128. "lsr r7, r9, #16\n\t"
  79129. "mul r6, r7, r6\n\t"
  79130. "lsr r7, r6, #16\n\t"
  79131. "lsl r6, r6, #16\n\t"
  79132. "adds r4, r4, r6\n\t"
  79133. "adcs r5, r5, r7\n\t"
  79134. "adc r3, r3, #0\n\t"
  79135. "lsr r6, r8, #16\n\t"
  79136. "lsr r7, r9, #16\n\t"
  79137. "mul r7, r6, r7\n\t"
  79138. "adds r5, r5, r7\n\t"
  79139. "adc r3, r3, #0\n\t"
  79140. "lsl r7, r9, #16\n\t"
  79141. "lsr r7, r7, #16\n\t"
  79142. "mul r6, r7, r6\n\t"
  79143. "lsr r7, r6, #16\n\t"
  79144. "lsl r6, r6, #16\n\t"
  79145. "adds r4, r4, r6\n\t"
  79146. "adcs r5, r5, r7\n\t"
  79147. "adc r3, r3, #0\n\t"
  79148. #else
  79149. "umull r6, r7, r8, r9\n\t"
  79150. "adds r4, r4, r6\n\t"
  79151. "adcs r5, r5, r7\n\t"
  79152. "adc r3, r3, #0\n\t"
  79153. #endif
  79154. /* A[0] * B[4] */
  79155. "ldr r8, [%[a]]\n\t"
  79156. "ldr r9, [%[b], #16]\n\t"
  79157. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79158. "lsl r6, r8, #16\n\t"
  79159. "lsl r7, r9, #16\n\t"
  79160. "lsr r6, r6, #16\n\t"
  79161. "lsr r7, r7, #16\n\t"
  79162. "mul r7, r6, r7\n\t"
  79163. "adds r4, r4, r7\n\t"
  79164. "adcs r5, r5, #0\n\t"
  79165. "adc r3, r3, #0\n\t"
  79166. "lsr r7, r9, #16\n\t"
  79167. "mul r6, r7, r6\n\t"
  79168. "lsr r7, r6, #16\n\t"
  79169. "lsl r6, r6, #16\n\t"
  79170. "adds r4, r4, r6\n\t"
  79171. "adcs r5, r5, r7\n\t"
  79172. "adc r3, r3, #0\n\t"
  79173. "lsr r6, r8, #16\n\t"
  79174. "lsr r7, r9, #16\n\t"
  79175. "mul r7, r6, r7\n\t"
  79176. "adds r5, r5, r7\n\t"
  79177. "adc r3, r3, #0\n\t"
  79178. "lsl r7, r9, #16\n\t"
  79179. "lsr r7, r7, #16\n\t"
  79180. "mul r6, r7, r6\n\t"
  79181. "lsr r7, r6, #16\n\t"
  79182. "lsl r6, r6, #16\n\t"
  79183. "adds r4, r4, r6\n\t"
  79184. "adcs r5, r5, r7\n\t"
  79185. "adc r3, r3, #0\n\t"
  79186. #else
  79187. "umull r6, r7, r8, r9\n\t"
  79188. "adds r4, r4, r6\n\t"
  79189. "adcs r5, r5, r7\n\t"
  79190. "adc r3, r3, #0\n\t"
  79191. #endif
  79192. "str r4, [sp, #16]\n\t"
  79193. /* A[0] * B[5] */
  79194. "ldr r9, [%[b], #20]\n\t"
  79195. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79196. "lsl r6, r8, #16\n\t"
  79197. "lsl r7, r9, #16\n\t"
  79198. "lsr r6, r6, #16\n\t"
  79199. "lsr r7, r7, #16\n\t"
  79200. "mul r7, r6, r7\n\t"
  79201. "adds r5, r5, r7\n\t"
  79202. "adcs r3, r3, #0\n\t"
  79203. "mov r4, #0\n\t"
  79204. "adc r4, r4, #0\n\t"
  79205. "lsr r7, r9, #16\n\t"
  79206. "mul r6, r7, r6\n\t"
  79207. "lsr r7, r6, #16\n\t"
  79208. "lsl r6, r6, #16\n\t"
  79209. "adds r5, r5, r6\n\t"
  79210. "adcs r3, r3, r7\n\t"
  79211. "adc r4, r4, #0\n\t"
  79212. "lsr r6, r8, #16\n\t"
  79213. "lsr r7, r9, #16\n\t"
  79214. "mul r7, r6, r7\n\t"
  79215. "adds r3, r3, r7\n\t"
  79216. "adc r4, r4, #0\n\t"
  79217. "lsl r7, r9, #16\n\t"
  79218. "lsr r7, r7, #16\n\t"
  79219. "mul r6, r7, r6\n\t"
  79220. "lsr r7, r6, #16\n\t"
  79221. "lsl r6, r6, #16\n\t"
  79222. "adds r5, r5, r6\n\t"
  79223. "adcs r3, r3, r7\n\t"
  79224. "adc r4, r4, #0\n\t"
  79225. #else
  79226. "umull r6, r7, r8, r9\n\t"
  79227. "adds r5, r5, r6\n\t"
  79228. "adcs r3, r3, r7\n\t"
  79229. "mov r4, #0\n\t"
  79230. "adc r4, r4, #0\n\t"
  79231. #endif
  79232. /* A[1] * B[4] */
  79233. "ldr r8, [%[a], #4]\n\t"
  79234. "ldr r9, [%[b], #16]\n\t"
  79235. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79236. "lsl r6, r8, #16\n\t"
  79237. "lsl r7, r9, #16\n\t"
  79238. "lsr r6, r6, #16\n\t"
  79239. "lsr r7, r7, #16\n\t"
  79240. "mul r7, r6, r7\n\t"
  79241. "adds r5, r5, r7\n\t"
  79242. "adcs r3, r3, #0\n\t"
  79243. "adc r4, r4, #0\n\t"
  79244. "lsr r7, r9, #16\n\t"
  79245. "mul r6, r7, r6\n\t"
  79246. "lsr r7, r6, #16\n\t"
  79247. "lsl r6, r6, #16\n\t"
  79248. "adds r5, r5, r6\n\t"
  79249. "adcs r3, r3, r7\n\t"
  79250. "adc r4, r4, #0\n\t"
  79251. "lsr r6, r8, #16\n\t"
  79252. "lsr r7, r9, #16\n\t"
  79253. "mul r7, r6, r7\n\t"
  79254. "adds r3, r3, r7\n\t"
  79255. "adc r4, r4, #0\n\t"
  79256. "lsl r7, r9, #16\n\t"
  79257. "lsr r7, r7, #16\n\t"
  79258. "mul r6, r7, r6\n\t"
  79259. "lsr r7, r6, #16\n\t"
  79260. "lsl r6, r6, #16\n\t"
  79261. "adds r5, r5, r6\n\t"
  79262. "adcs r3, r3, r7\n\t"
  79263. "adc r4, r4, #0\n\t"
  79264. #else
  79265. "umull r6, r7, r8, r9\n\t"
  79266. "adds r5, r5, r6\n\t"
  79267. "adcs r3, r3, r7\n\t"
  79268. "adc r4, r4, #0\n\t"
  79269. #endif
  79270. /* A[2] * B[3] */
  79271. "ldr r9, [%[b], #12]\n\t"
  79272. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79273. "lsl r6, r11, #16\n\t"
  79274. "lsl r7, r9, #16\n\t"
  79275. "lsr r6, r6, #16\n\t"
  79276. "lsr r7, r7, #16\n\t"
  79277. "mul r7, r6, r7\n\t"
  79278. "adds r5, r5, r7\n\t"
  79279. "adcs r3, r3, #0\n\t"
  79280. "adc r4, r4, #0\n\t"
  79281. "lsr r7, r9, #16\n\t"
  79282. "mul r6, r7, r6\n\t"
  79283. "lsr r7, r6, #16\n\t"
  79284. "lsl r6, r6, #16\n\t"
  79285. "adds r5, r5, r6\n\t"
  79286. "adcs r3, r3, r7\n\t"
  79287. "adc r4, r4, #0\n\t"
  79288. "lsr r6, r11, #16\n\t"
  79289. "lsr r7, r9, #16\n\t"
  79290. "mul r7, r6, r7\n\t"
  79291. "adds r3, r3, r7\n\t"
  79292. "adc r4, r4, #0\n\t"
  79293. "lsl r7, r9, #16\n\t"
  79294. "lsr r7, r7, #16\n\t"
  79295. "mul r6, r7, r6\n\t"
  79296. "lsr r7, r6, #16\n\t"
  79297. "lsl r6, r6, #16\n\t"
  79298. "adds r5, r5, r6\n\t"
  79299. "adcs r3, r3, r7\n\t"
  79300. "adc r4, r4, #0\n\t"
  79301. #else
  79302. "umull r6, r7, r11, r9\n\t"
  79303. "adds r5, r5, r6\n\t"
  79304. "adcs r3, r3, r7\n\t"
  79305. "adc r4, r4, #0\n\t"
  79306. #endif
  79307. /* A[3] * B[2] */
  79308. "ldr r8, [%[a], #12]\n\t"
  79309. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79310. "lsl r6, r8, #16\n\t"
  79311. "lsl r7, r12, #16\n\t"
  79312. "lsr r6, r6, #16\n\t"
  79313. "lsr r7, r7, #16\n\t"
  79314. "mul r7, r6, r7\n\t"
  79315. "adds r5, r5, r7\n\t"
  79316. "adcs r3, r3, #0\n\t"
  79317. "adc r4, r4, #0\n\t"
  79318. "lsr r7, r12, #16\n\t"
  79319. "mul r6, r7, r6\n\t"
  79320. "lsr r7, r6, #16\n\t"
  79321. "lsl r6, r6, #16\n\t"
  79322. "adds r5, r5, r6\n\t"
  79323. "adcs r3, r3, r7\n\t"
  79324. "adc r4, r4, #0\n\t"
  79325. "lsr r6, r8, #16\n\t"
  79326. "lsr r7, r12, #16\n\t"
  79327. "mul r7, r6, r7\n\t"
  79328. "adds r3, r3, r7\n\t"
  79329. "adc r4, r4, #0\n\t"
  79330. "lsl r7, r12, #16\n\t"
  79331. "lsr r7, r7, #16\n\t"
  79332. "mul r6, r7, r6\n\t"
  79333. "lsr r7, r6, #16\n\t"
  79334. "lsl r6, r6, #16\n\t"
  79335. "adds r5, r5, r6\n\t"
  79336. "adcs r3, r3, r7\n\t"
  79337. "adc r4, r4, #0\n\t"
  79338. #else
  79339. "umull r6, r7, r8, r12\n\t"
  79340. "adds r5, r5, r6\n\t"
  79341. "adcs r3, r3, r7\n\t"
  79342. "adc r4, r4, #0\n\t"
  79343. #endif
  79344. /* A[4] * B[1] */
  79345. "ldr r8, [%[a], #16]\n\t"
  79346. "ldr r9, [%[b], #4]\n\t"
  79347. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79348. "lsl r6, r8, #16\n\t"
  79349. "lsl r7, r9, #16\n\t"
  79350. "lsr r6, r6, #16\n\t"
  79351. "lsr r7, r7, #16\n\t"
  79352. "mul r7, r6, r7\n\t"
  79353. "adds r5, r5, r7\n\t"
  79354. "adcs r3, r3, #0\n\t"
  79355. "adc r4, r4, #0\n\t"
  79356. "lsr r7, r9, #16\n\t"
  79357. "mul r6, r7, r6\n\t"
  79358. "lsr r7, r6, #16\n\t"
  79359. "lsl r6, r6, #16\n\t"
  79360. "adds r5, r5, r6\n\t"
  79361. "adcs r3, r3, r7\n\t"
  79362. "adc r4, r4, #0\n\t"
  79363. "lsr r6, r8, #16\n\t"
  79364. "lsr r7, r9, #16\n\t"
  79365. "mul r7, r6, r7\n\t"
  79366. "adds r3, r3, r7\n\t"
  79367. "adc r4, r4, #0\n\t"
  79368. "lsl r7, r9, #16\n\t"
  79369. "lsr r7, r7, #16\n\t"
  79370. "mul r6, r7, r6\n\t"
  79371. "lsr r7, r6, #16\n\t"
  79372. "lsl r6, r6, #16\n\t"
  79373. "adds r5, r5, r6\n\t"
  79374. "adcs r3, r3, r7\n\t"
  79375. "adc r4, r4, #0\n\t"
  79376. #else
  79377. "umull r6, r7, r8, r9\n\t"
  79378. "adds r5, r5, r6\n\t"
  79379. "adcs r3, r3, r7\n\t"
  79380. "adc r4, r4, #0\n\t"
  79381. #endif
  79382. /* A[5] * B[0] */
  79383. "ldr r8, [%[a], #20]\n\t"
  79384. "ldr r9, [%[b]]\n\t"
  79385. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79386. "lsl r6, r8, #16\n\t"
  79387. "lsl r7, r9, #16\n\t"
  79388. "lsr r6, r6, #16\n\t"
  79389. "lsr r7, r7, #16\n\t"
  79390. "mul r7, r6, r7\n\t"
  79391. "adds r5, r5, r7\n\t"
  79392. "adcs r3, r3, #0\n\t"
  79393. "adc r4, r4, #0\n\t"
  79394. "lsr r7, r9, #16\n\t"
  79395. "mul r6, r7, r6\n\t"
  79396. "lsr r7, r6, #16\n\t"
  79397. "lsl r6, r6, #16\n\t"
  79398. "adds r5, r5, r6\n\t"
  79399. "adcs r3, r3, r7\n\t"
  79400. "adc r4, r4, #0\n\t"
  79401. "lsr r6, r8, #16\n\t"
  79402. "lsr r7, r9, #16\n\t"
  79403. "mul r7, r6, r7\n\t"
  79404. "adds r3, r3, r7\n\t"
  79405. "adc r4, r4, #0\n\t"
  79406. "lsl r7, r9, #16\n\t"
  79407. "lsr r7, r7, #16\n\t"
  79408. "mul r6, r7, r6\n\t"
  79409. "lsr r7, r6, #16\n\t"
  79410. "lsl r6, r6, #16\n\t"
  79411. "adds r5, r5, r6\n\t"
  79412. "adcs r3, r3, r7\n\t"
  79413. "adc r4, r4, #0\n\t"
  79414. #else
  79415. "umull r6, r7, r8, r9\n\t"
  79416. "adds r5, r5, r6\n\t"
  79417. "adcs r3, r3, r7\n\t"
  79418. "adc r4, r4, #0\n\t"
  79419. #endif
  79420. "str r5, [sp, #20]\n\t"
  79421. /* A[6] * B[0] */
  79422. "ldr r8, [%[a], #24]\n\t"
  79423. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79424. "lsl r6, r8, #16\n\t"
  79425. "lsl r7, r9, #16\n\t"
  79426. "lsr r6, r6, #16\n\t"
  79427. "lsr r7, r7, #16\n\t"
  79428. "mul r7, r6, r7\n\t"
  79429. "adds r3, r3, r7\n\t"
  79430. "adcs r4, r4, #0\n\t"
  79431. "mov r5, #0\n\t"
  79432. "adc r5, r5, #0\n\t"
  79433. "lsr r7, r9, #16\n\t"
  79434. "mul r6, r7, r6\n\t"
  79435. "lsr r7, r6, #16\n\t"
  79436. "lsl r6, r6, #16\n\t"
  79437. "adds r3, r3, r6\n\t"
  79438. "adcs r4, r4, r7\n\t"
  79439. "adc r5, r5, #0\n\t"
  79440. "lsr r6, r8, #16\n\t"
  79441. "lsr r7, r9, #16\n\t"
  79442. "mul r7, r6, r7\n\t"
  79443. "adds r4, r4, r7\n\t"
  79444. "adc r5, r5, #0\n\t"
  79445. "lsl r7, r9, #16\n\t"
  79446. "lsr r7, r7, #16\n\t"
  79447. "mul r6, r7, r6\n\t"
  79448. "lsr r7, r6, #16\n\t"
  79449. "lsl r6, r6, #16\n\t"
  79450. "adds r3, r3, r6\n\t"
  79451. "adcs r4, r4, r7\n\t"
  79452. "adc r5, r5, #0\n\t"
  79453. #else
  79454. "umull r6, r7, r8, r9\n\t"
  79455. "adds r3, r3, r6\n\t"
  79456. "adcs r4, r4, r7\n\t"
  79457. "mov r5, #0\n\t"
  79458. "adc r5, r5, #0\n\t"
  79459. #endif
  79460. /* A[5] * B[1] */
  79461. "ldr r8, [%[a], #20]\n\t"
  79462. "ldr r9, [%[b], #4]\n\t"
  79463. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79464. "lsl r6, r8, #16\n\t"
  79465. "lsl r7, r9, #16\n\t"
  79466. "lsr r6, r6, #16\n\t"
  79467. "lsr r7, r7, #16\n\t"
  79468. "mul r7, r6, r7\n\t"
  79469. "adds r3, r3, r7\n\t"
  79470. "adcs r4, r4, #0\n\t"
  79471. "adc r5, r5, #0\n\t"
  79472. "lsr r7, r9, #16\n\t"
  79473. "mul r6, r7, r6\n\t"
  79474. "lsr r7, r6, #16\n\t"
  79475. "lsl r6, r6, #16\n\t"
  79476. "adds r3, r3, r6\n\t"
  79477. "adcs r4, r4, r7\n\t"
  79478. "adc r5, r5, #0\n\t"
  79479. "lsr r6, r8, #16\n\t"
  79480. "lsr r7, r9, #16\n\t"
  79481. "mul r7, r6, r7\n\t"
  79482. "adds r4, r4, r7\n\t"
  79483. "adc r5, r5, #0\n\t"
  79484. "lsl r7, r9, #16\n\t"
  79485. "lsr r7, r7, #16\n\t"
  79486. "mul r6, r7, r6\n\t"
  79487. "lsr r7, r6, #16\n\t"
  79488. "lsl r6, r6, #16\n\t"
  79489. "adds r3, r3, r6\n\t"
  79490. "adcs r4, r4, r7\n\t"
  79491. "adc r5, r5, #0\n\t"
  79492. #else
  79493. "umull r6, r7, r8, r9\n\t"
  79494. "adds r3, r3, r6\n\t"
  79495. "adcs r4, r4, r7\n\t"
  79496. "adc r5, r5, #0\n\t"
  79497. #endif
  79498. /* A[4] * B[2] */
  79499. "ldr r8, [%[a], #16]\n\t"
  79500. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79501. "lsl r6, r8, #16\n\t"
  79502. "lsl r7, r12, #16\n\t"
  79503. "lsr r6, r6, #16\n\t"
  79504. "lsr r7, r7, #16\n\t"
  79505. "mul r7, r6, r7\n\t"
  79506. "adds r3, r3, r7\n\t"
  79507. "adcs r4, r4, #0\n\t"
  79508. "adc r5, r5, #0\n\t"
  79509. "lsr r7, r12, #16\n\t"
  79510. "mul r6, r7, r6\n\t"
  79511. "lsr r7, r6, #16\n\t"
  79512. "lsl r6, r6, #16\n\t"
  79513. "adds r3, r3, r6\n\t"
  79514. "adcs r4, r4, r7\n\t"
  79515. "adc r5, r5, #0\n\t"
  79516. "lsr r6, r8, #16\n\t"
  79517. "lsr r7, r12, #16\n\t"
  79518. "mul r7, r6, r7\n\t"
  79519. "adds r4, r4, r7\n\t"
  79520. "adc r5, r5, #0\n\t"
  79521. "lsl r7, r12, #16\n\t"
  79522. "lsr r7, r7, #16\n\t"
  79523. "mul r6, r7, r6\n\t"
  79524. "lsr r7, r6, #16\n\t"
  79525. "lsl r6, r6, #16\n\t"
  79526. "adds r3, r3, r6\n\t"
  79527. "adcs r4, r4, r7\n\t"
  79528. "adc r5, r5, #0\n\t"
  79529. #else
  79530. "umull r6, r7, r8, r12\n\t"
  79531. "adds r3, r3, r6\n\t"
  79532. "adcs r4, r4, r7\n\t"
  79533. "adc r5, r5, #0\n\t"
  79534. #endif
  79535. /* A[3] * B[3] */
  79536. "ldr r11, [%[a], #12]\n\t"
  79537. "ldr r12, [%[b], #12]\n\t"
  79538. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79539. "lsl r6, r11, #16\n\t"
  79540. "lsl r7, r12, #16\n\t"
  79541. "lsr r6, r6, #16\n\t"
  79542. "lsr r7, r7, #16\n\t"
  79543. "mul r7, r6, r7\n\t"
  79544. "adds r3, r3, r7\n\t"
  79545. "adcs r4, r4, #0\n\t"
  79546. "adc r5, r5, #0\n\t"
  79547. "lsr r7, r12, #16\n\t"
  79548. "mul r6, r7, r6\n\t"
  79549. "lsr r7, r6, #16\n\t"
  79550. "lsl r6, r6, #16\n\t"
  79551. "adds r3, r3, r6\n\t"
  79552. "adcs r4, r4, r7\n\t"
  79553. "adc r5, r5, #0\n\t"
  79554. "lsr r6, r11, #16\n\t"
  79555. "lsr r7, r12, #16\n\t"
  79556. "mul r7, r6, r7\n\t"
  79557. "adds r4, r4, r7\n\t"
  79558. "adc r5, r5, #0\n\t"
  79559. "lsl r7, r12, #16\n\t"
  79560. "lsr r7, r7, #16\n\t"
  79561. "mul r6, r7, r6\n\t"
  79562. "lsr r7, r6, #16\n\t"
  79563. "lsl r6, r6, #16\n\t"
  79564. "adds r3, r3, r6\n\t"
  79565. "adcs r4, r4, r7\n\t"
  79566. "adc r5, r5, #0\n\t"
  79567. #else
  79568. "umull r6, r7, r11, r12\n\t"
  79569. "adds r3, r3, r6\n\t"
  79570. "adcs r4, r4, r7\n\t"
  79571. "adc r5, r5, #0\n\t"
  79572. #endif
  79573. /* A[2] * B[4] */
  79574. "ldr r8, [%[a], #8]\n\t"
  79575. "ldr r9, [%[b], #16]\n\t"
  79576. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79577. "lsl r6, r8, #16\n\t"
  79578. "lsl r7, r9, #16\n\t"
  79579. "lsr r6, r6, #16\n\t"
  79580. "lsr r7, r7, #16\n\t"
  79581. "mul r7, r6, r7\n\t"
  79582. "adds r3, r3, r7\n\t"
  79583. "adcs r4, r4, #0\n\t"
  79584. "adc r5, r5, #0\n\t"
  79585. "lsr r7, r9, #16\n\t"
  79586. "mul r6, r7, r6\n\t"
  79587. "lsr r7, r6, #16\n\t"
  79588. "lsl r6, r6, #16\n\t"
  79589. "adds r3, r3, r6\n\t"
  79590. "adcs r4, r4, r7\n\t"
  79591. "adc r5, r5, #0\n\t"
  79592. "lsr r6, r8, #16\n\t"
  79593. "lsr r7, r9, #16\n\t"
  79594. "mul r7, r6, r7\n\t"
  79595. "adds r4, r4, r7\n\t"
  79596. "adc r5, r5, #0\n\t"
  79597. "lsl r7, r9, #16\n\t"
  79598. "lsr r7, r7, #16\n\t"
  79599. "mul r6, r7, r6\n\t"
  79600. "lsr r7, r6, #16\n\t"
  79601. "lsl r6, r6, #16\n\t"
  79602. "adds r3, r3, r6\n\t"
  79603. "adcs r4, r4, r7\n\t"
  79604. "adc r5, r5, #0\n\t"
  79605. #else
  79606. "umull r6, r7, r8, r9\n\t"
  79607. "adds r3, r3, r6\n\t"
  79608. "adcs r4, r4, r7\n\t"
  79609. "adc r5, r5, #0\n\t"
  79610. #endif
  79611. /* A[1] * B[5] */
  79612. "ldr r8, [%[a], #4]\n\t"
  79613. "ldr r9, [%[b], #20]\n\t"
  79614. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79615. "lsl r6, r8, #16\n\t"
  79616. "lsl r7, r9, #16\n\t"
  79617. "lsr r6, r6, #16\n\t"
  79618. "lsr r7, r7, #16\n\t"
  79619. "mul r7, r6, r7\n\t"
  79620. "adds r3, r3, r7\n\t"
  79621. "adcs r4, r4, #0\n\t"
  79622. "adc r5, r5, #0\n\t"
  79623. "lsr r7, r9, #16\n\t"
  79624. "mul r6, r7, r6\n\t"
  79625. "lsr r7, r6, #16\n\t"
  79626. "lsl r6, r6, #16\n\t"
  79627. "adds r3, r3, r6\n\t"
  79628. "adcs r4, r4, r7\n\t"
  79629. "adc r5, r5, #0\n\t"
  79630. "lsr r6, r8, #16\n\t"
  79631. "lsr r7, r9, #16\n\t"
  79632. "mul r7, r6, r7\n\t"
  79633. "adds r4, r4, r7\n\t"
  79634. "adc r5, r5, #0\n\t"
  79635. "lsl r7, r9, #16\n\t"
  79636. "lsr r7, r7, #16\n\t"
  79637. "mul r6, r7, r6\n\t"
  79638. "lsr r7, r6, #16\n\t"
  79639. "lsl r6, r6, #16\n\t"
  79640. "adds r3, r3, r6\n\t"
  79641. "adcs r4, r4, r7\n\t"
  79642. "adc r5, r5, #0\n\t"
  79643. #else
  79644. "umull r6, r7, r8, r9\n\t"
  79645. "adds r3, r3, r6\n\t"
  79646. "adcs r4, r4, r7\n\t"
  79647. "adc r5, r5, #0\n\t"
  79648. #endif
  79649. /* A[0] * B[6] */
  79650. "ldr r8, [%[a]]\n\t"
  79651. "ldr r9, [%[b], #24]\n\t"
  79652. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79653. "lsl r6, r8, #16\n\t"
  79654. "lsl r7, r9, #16\n\t"
  79655. "lsr r6, r6, #16\n\t"
  79656. "lsr r7, r7, #16\n\t"
  79657. "mul r7, r6, r7\n\t"
  79658. "adds r3, r3, r7\n\t"
  79659. "adcs r4, r4, #0\n\t"
  79660. "adc r5, r5, #0\n\t"
  79661. "lsr r7, r9, #16\n\t"
  79662. "mul r6, r7, r6\n\t"
  79663. "lsr r7, r6, #16\n\t"
  79664. "lsl r6, r6, #16\n\t"
  79665. "adds r3, r3, r6\n\t"
  79666. "adcs r4, r4, r7\n\t"
  79667. "adc r5, r5, #0\n\t"
  79668. "lsr r6, r8, #16\n\t"
  79669. "lsr r7, r9, #16\n\t"
  79670. "mul r7, r6, r7\n\t"
  79671. "adds r4, r4, r7\n\t"
  79672. "adc r5, r5, #0\n\t"
  79673. "lsl r7, r9, #16\n\t"
  79674. "lsr r7, r7, #16\n\t"
  79675. "mul r6, r7, r6\n\t"
  79676. "lsr r7, r6, #16\n\t"
  79677. "lsl r6, r6, #16\n\t"
  79678. "adds r3, r3, r6\n\t"
  79679. "adcs r4, r4, r7\n\t"
  79680. "adc r5, r5, #0\n\t"
  79681. #else
  79682. "umull r6, r7, r8, r9\n\t"
  79683. "adds r3, r3, r6\n\t"
  79684. "adcs r4, r4, r7\n\t"
  79685. "adc r5, r5, #0\n\t"
  79686. #endif
  79687. "str r3, [sp, #24]\n\t"
  79688. /* A[0] * B[7] */
  79689. "ldr r9, [%[b], #28]\n\t"
  79690. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79691. "lsl r6, r8, #16\n\t"
  79692. "lsl r7, r9, #16\n\t"
  79693. "lsr r6, r6, #16\n\t"
  79694. "lsr r7, r7, #16\n\t"
  79695. "mul r7, r6, r7\n\t"
  79696. "adds r4, r4, r7\n\t"
  79697. "adcs r5, r5, #0\n\t"
  79698. "mov r3, #0\n\t"
  79699. "adc r3, r3, #0\n\t"
  79700. "lsr r7, r9, #16\n\t"
  79701. "mul r6, r7, r6\n\t"
  79702. "lsr r7, r6, #16\n\t"
  79703. "lsl r6, r6, #16\n\t"
  79704. "adds r4, r4, r6\n\t"
  79705. "adcs r5, r5, r7\n\t"
  79706. "adc r3, r3, #0\n\t"
  79707. "lsr r6, r8, #16\n\t"
  79708. "lsr r7, r9, #16\n\t"
  79709. "mul r7, r6, r7\n\t"
  79710. "adds r5, r5, r7\n\t"
  79711. "adc r3, r3, #0\n\t"
  79712. "lsl r7, r9, #16\n\t"
  79713. "lsr r7, r7, #16\n\t"
  79714. "mul r6, r7, r6\n\t"
  79715. "lsr r7, r6, #16\n\t"
  79716. "lsl r6, r6, #16\n\t"
  79717. "adds r4, r4, r6\n\t"
  79718. "adcs r5, r5, r7\n\t"
  79719. "adc r3, r3, #0\n\t"
  79720. #else
  79721. "umull r6, r7, r8, r9\n\t"
  79722. "adds r4, r4, r6\n\t"
  79723. "adcs r5, r5, r7\n\t"
  79724. "mov r3, #0\n\t"
  79725. "adc r3, r3, #0\n\t"
  79726. #endif
  79727. /* A[1] * B[6] */
  79728. "ldr r8, [%[a], #4]\n\t"
  79729. "ldr r9, [%[b], #24]\n\t"
  79730. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79731. "lsl r6, r8, #16\n\t"
  79732. "lsl r7, r9, #16\n\t"
  79733. "lsr r6, r6, #16\n\t"
  79734. "lsr r7, r7, #16\n\t"
  79735. "mul r7, r6, r7\n\t"
  79736. "adds r4, r4, r7\n\t"
  79737. "adcs r5, r5, #0\n\t"
  79738. "adc r3, r3, #0\n\t"
  79739. "lsr r7, r9, #16\n\t"
  79740. "mul r6, r7, r6\n\t"
  79741. "lsr r7, r6, #16\n\t"
  79742. "lsl r6, r6, #16\n\t"
  79743. "adds r4, r4, r6\n\t"
  79744. "adcs r5, r5, r7\n\t"
  79745. "adc r3, r3, #0\n\t"
  79746. "lsr r6, r8, #16\n\t"
  79747. "lsr r7, r9, #16\n\t"
  79748. "mul r7, r6, r7\n\t"
  79749. "adds r5, r5, r7\n\t"
  79750. "adc r3, r3, #0\n\t"
  79751. "lsl r7, r9, #16\n\t"
  79752. "lsr r7, r7, #16\n\t"
  79753. "mul r6, r7, r6\n\t"
  79754. "lsr r7, r6, #16\n\t"
  79755. "lsl r6, r6, #16\n\t"
  79756. "adds r4, r4, r6\n\t"
  79757. "adcs r5, r5, r7\n\t"
  79758. "adc r3, r3, #0\n\t"
  79759. #else
  79760. "umull r6, r7, r8, r9\n\t"
  79761. "adds r4, r4, r6\n\t"
  79762. "adcs r5, r5, r7\n\t"
  79763. "adc r3, r3, #0\n\t"
  79764. #endif
  79765. /* A[2] * B[5] */
  79766. "ldr r8, [%[a], #8]\n\t"
  79767. "ldr r9, [%[b], #20]\n\t"
  79768. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79769. "lsl r6, r8, #16\n\t"
  79770. "lsl r7, r9, #16\n\t"
  79771. "lsr r6, r6, #16\n\t"
  79772. "lsr r7, r7, #16\n\t"
  79773. "mul r7, r6, r7\n\t"
  79774. "adds r4, r4, r7\n\t"
  79775. "adcs r5, r5, #0\n\t"
  79776. "adc r3, r3, #0\n\t"
  79777. "lsr r7, r9, #16\n\t"
  79778. "mul r6, r7, r6\n\t"
  79779. "lsr r7, r6, #16\n\t"
  79780. "lsl r6, r6, #16\n\t"
  79781. "adds r4, r4, r6\n\t"
  79782. "adcs r5, r5, r7\n\t"
  79783. "adc r3, r3, #0\n\t"
  79784. "lsr r6, r8, #16\n\t"
  79785. "lsr r7, r9, #16\n\t"
  79786. "mul r7, r6, r7\n\t"
  79787. "adds r5, r5, r7\n\t"
  79788. "adc r3, r3, #0\n\t"
  79789. "lsl r7, r9, #16\n\t"
  79790. "lsr r7, r7, #16\n\t"
  79791. "mul r6, r7, r6\n\t"
  79792. "lsr r7, r6, #16\n\t"
  79793. "lsl r6, r6, #16\n\t"
  79794. "adds r4, r4, r6\n\t"
  79795. "adcs r5, r5, r7\n\t"
  79796. "adc r3, r3, #0\n\t"
  79797. #else
  79798. "umull r6, r7, r8, r9\n\t"
  79799. "adds r4, r4, r6\n\t"
  79800. "adcs r5, r5, r7\n\t"
  79801. "adc r3, r3, #0\n\t"
  79802. #endif
  79803. /* A[3] * B[4] */
  79804. "ldr r9, [%[b], #16]\n\t"
  79805. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79806. "lsl r6, r11, #16\n\t"
  79807. "lsl r7, r9, #16\n\t"
  79808. "lsr r6, r6, #16\n\t"
  79809. "lsr r7, r7, #16\n\t"
  79810. "mul r7, r6, r7\n\t"
  79811. "adds r4, r4, r7\n\t"
  79812. "adcs r5, r5, #0\n\t"
  79813. "adc r3, r3, #0\n\t"
  79814. "lsr r7, r9, #16\n\t"
  79815. "mul r6, r7, r6\n\t"
  79816. "lsr r7, r6, #16\n\t"
  79817. "lsl r6, r6, #16\n\t"
  79818. "adds r4, r4, r6\n\t"
  79819. "adcs r5, r5, r7\n\t"
  79820. "adc r3, r3, #0\n\t"
  79821. "lsr r6, r11, #16\n\t"
  79822. "lsr r7, r9, #16\n\t"
  79823. "mul r7, r6, r7\n\t"
  79824. "adds r5, r5, r7\n\t"
  79825. "adc r3, r3, #0\n\t"
  79826. "lsl r7, r9, #16\n\t"
  79827. "lsr r7, r7, #16\n\t"
  79828. "mul r6, r7, r6\n\t"
  79829. "lsr r7, r6, #16\n\t"
  79830. "lsl r6, r6, #16\n\t"
  79831. "adds r4, r4, r6\n\t"
  79832. "adcs r5, r5, r7\n\t"
  79833. "adc r3, r3, #0\n\t"
  79834. #else
  79835. "umull r6, r7, r11, r9\n\t"
  79836. "adds r4, r4, r6\n\t"
  79837. "adcs r5, r5, r7\n\t"
  79838. "adc r3, r3, #0\n\t"
  79839. #endif
  79840. /* A[4] * B[3] */
  79841. "ldr r8, [%[a], #16]\n\t"
  79842. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79843. "lsl r6, r8, #16\n\t"
  79844. "lsl r7, r12, #16\n\t"
  79845. "lsr r6, r6, #16\n\t"
  79846. "lsr r7, r7, #16\n\t"
  79847. "mul r7, r6, r7\n\t"
  79848. "adds r4, r4, r7\n\t"
  79849. "adcs r5, r5, #0\n\t"
  79850. "adc r3, r3, #0\n\t"
  79851. "lsr r7, r12, #16\n\t"
  79852. "mul r6, r7, r6\n\t"
  79853. "lsr r7, r6, #16\n\t"
  79854. "lsl r6, r6, #16\n\t"
  79855. "adds r4, r4, r6\n\t"
  79856. "adcs r5, r5, r7\n\t"
  79857. "adc r3, r3, #0\n\t"
  79858. "lsr r6, r8, #16\n\t"
  79859. "lsr r7, r12, #16\n\t"
  79860. "mul r7, r6, r7\n\t"
  79861. "adds r5, r5, r7\n\t"
  79862. "adc r3, r3, #0\n\t"
  79863. "lsl r7, r12, #16\n\t"
  79864. "lsr r7, r7, #16\n\t"
  79865. "mul r6, r7, r6\n\t"
  79866. "lsr r7, r6, #16\n\t"
  79867. "lsl r6, r6, #16\n\t"
  79868. "adds r4, r4, r6\n\t"
  79869. "adcs r5, r5, r7\n\t"
  79870. "adc r3, r3, #0\n\t"
  79871. #else
  79872. "umull r6, r7, r8, r12\n\t"
  79873. "adds r4, r4, r6\n\t"
  79874. "adcs r5, r5, r7\n\t"
  79875. "adc r3, r3, #0\n\t"
  79876. #endif
  79877. /* A[5] * B[2] */
  79878. "ldr r8, [%[a], #20]\n\t"
  79879. "ldr r9, [%[b], #8]\n\t"
  79880. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79881. "lsl r6, r8, #16\n\t"
  79882. "lsl r7, r9, #16\n\t"
  79883. "lsr r6, r6, #16\n\t"
  79884. "lsr r7, r7, #16\n\t"
  79885. "mul r7, r6, r7\n\t"
  79886. "adds r4, r4, r7\n\t"
  79887. "adcs r5, r5, #0\n\t"
  79888. "adc r3, r3, #0\n\t"
  79889. "lsr r7, r9, #16\n\t"
  79890. "mul r6, r7, r6\n\t"
  79891. "lsr r7, r6, #16\n\t"
  79892. "lsl r6, r6, #16\n\t"
  79893. "adds r4, r4, r6\n\t"
  79894. "adcs r5, r5, r7\n\t"
  79895. "adc r3, r3, #0\n\t"
  79896. "lsr r6, r8, #16\n\t"
  79897. "lsr r7, r9, #16\n\t"
  79898. "mul r7, r6, r7\n\t"
  79899. "adds r5, r5, r7\n\t"
  79900. "adc r3, r3, #0\n\t"
  79901. "lsl r7, r9, #16\n\t"
  79902. "lsr r7, r7, #16\n\t"
  79903. "mul r6, r7, r6\n\t"
  79904. "lsr r7, r6, #16\n\t"
  79905. "lsl r6, r6, #16\n\t"
  79906. "adds r4, r4, r6\n\t"
  79907. "adcs r5, r5, r7\n\t"
  79908. "adc r3, r3, #0\n\t"
  79909. #else
  79910. "umull r6, r7, r8, r9\n\t"
  79911. "adds r4, r4, r6\n\t"
  79912. "adcs r5, r5, r7\n\t"
  79913. "adc r3, r3, #0\n\t"
  79914. #endif
  79915. /* A[6] * B[1] */
  79916. "ldr r8, [%[a], #24]\n\t"
  79917. "ldr r9, [%[b], #4]\n\t"
  79918. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79919. "lsl r6, r8, #16\n\t"
  79920. "lsl r7, r9, #16\n\t"
  79921. "lsr r6, r6, #16\n\t"
  79922. "lsr r7, r7, #16\n\t"
  79923. "mul r7, r6, r7\n\t"
  79924. "adds r4, r4, r7\n\t"
  79925. "adcs r5, r5, #0\n\t"
  79926. "adc r3, r3, #0\n\t"
  79927. "lsr r7, r9, #16\n\t"
  79928. "mul r6, r7, r6\n\t"
  79929. "lsr r7, r6, #16\n\t"
  79930. "lsl r6, r6, #16\n\t"
  79931. "adds r4, r4, r6\n\t"
  79932. "adcs r5, r5, r7\n\t"
  79933. "adc r3, r3, #0\n\t"
  79934. "lsr r6, r8, #16\n\t"
  79935. "lsr r7, r9, #16\n\t"
  79936. "mul r7, r6, r7\n\t"
  79937. "adds r5, r5, r7\n\t"
  79938. "adc r3, r3, #0\n\t"
  79939. "lsl r7, r9, #16\n\t"
  79940. "lsr r7, r7, #16\n\t"
  79941. "mul r6, r7, r6\n\t"
  79942. "lsr r7, r6, #16\n\t"
  79943. "lsl r6, r6, #16\n\t"
  79944. "adds r4, r4, r6\n\t"
  79945. "adcs r5, r5, r7\n\t"
  79946. "adc r3, r3, #0\n\t"
  79947. #else
  79948. "umull r6, r7, r8, r9\n\t"
  79949. "adds r4, r4, r6\n\t"
  79950. "adcs r5, r5, r7\n\t"
  79951. "adc r3, r3, #0\n\t"
  79952. #endif
  79953. /* A[7] * B[0] */
  79954. "ldr r8, [%[a], #28]\n\t"
  79955. "ldr r9, [%[b]]\n\t"
  79956. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79957. "lsl r6, r8, #16\n\t"
  79958. "lsl r7, r9, #16\n\t"
  79959. "lsr r6, r6, #16\n\t"
  79960. "lsr r7, r7, #16\n\t"
  79961. "mul r7, r6, r7\n\t"
  79962. "adds r4, r4, r7\n\t"
  79963. "adcs r5, r5, #0\n\t"
  79964. "adc r3, r3, #0\n\t"
  79965. "lsr r7, r9, #16\n\t"
  79966. "mul r6, r7, r6\n\t"
  79967. "lsr r7, r6, #16\n\t"
  79968. "lsl r6, r6, #16\n\t"
  79969. "adds r4, r4, r6\n\t"
  79970. "adcs r5, r5, r7\n\t"
  79971. "adc r3, r3, #0\n\t"
  79972. "lsr r6, r8, #16\n\t"
  79973. "lsr r7, r9, #16\n\t"
  79974. "mul r7, r6, r7\n\t"
  79975. "adds r5, r5, r7\n\t"
  79976. "adc r3, r3, #0\n\t"
  79977. "lsl r7, r9, #16\n\t"
  79978. "lsr r7, r7, #16\n\t"
  79979. "mul r6, r7, r6\n\t"
  79980. "lsr r7, r6, #16\n\t"
  79981. "lsl r6, r6, #16\n\t"
  79982. "adds r4, r4, r6\n\t"
  79983. "adcs r5, r5, r7\n\t"
  79984. "adc r3, r3, #0\n\t"
  79985. #else
  79986. "umull r6, r7, r8, r9\n\t"
  79987. "adds r4, r4, r6\n\t"
  79988. "adcs r5, r5, r7\n\t"
  79989. "adc r3, r3, #0\n\t"
  79990. #endif
  79991. "str r4, [sp, #28]\n\t"
  79992. /* A[8] * B[0] */
  79993. "ldr r8, [%[a], #32]\n\t"
  79994. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  79995. "lsl r6, r8, #16\n\t"
  79996. "lsl r7, r9, #16\n\t"
  79997. "lsr r6, r6, #16\n\t"
  79998. "lsr r7, r7, #16\n\t"
  79999. "mul r7, r6, r7\n\t"
  80000. "adds r5, r5, r7\n\t"
  80001. "adcs r3, r3, #0\n\t"
  80002. "mov r4, #0\n\t"
  80003. "adc r4, r4, #0\n\t"
  80004. "lsr r7, r9, #16\n\t"
  80005. "mul r6, r7, r6\n\t"
  80006. "lsr r7, r6, #16\n\t"
  80007. "lsl r6, r6, #16\n\t"
  80008. "adds r5, r5, r6\n\t"
  80009. "adcs r3, r3, r7\n\t"
  80010. "adc r4, r4, #0\n\t"
  80011. "lsr r6, r8, #16\n\t"
  80012. "lsr r7, r9, #16\n\t"
  80013. "mul r7, r6, r7\n\t"
  80014. "adds r3, r3, r7\n\t"
  80015. "adc r4, r4, #0\n\t"
  80016. "lsl r7, r9, #16\n\t"
  80017. "lsr r7, r7, #16\n\t"
  80018. "mul r6, r7, r6\n\t"
  80019. "lsr r7, r6, #16\n\t"
  80020. "lsl r6, r6, #16\n\t"
  80021. "adds r5, r5, r6\n\t"
  80022. "adcs r3, r3, r7\n\t"
  80023. "adc r4, r4, #0\n\t"
  80024. #else
  80025. "umull r6, r7, r8, r9\n\t"
  80026. "adds r5, r5, r6\n\t"
  80027. "adcs r3, r3, r7\n\t"
  80028. "mov r4, #0\n\t"
  80029. "adc r4, r4, #0\n\t"
  80030. #endif
  80031. /* A[7] * B[1] */
  80032. "ldr r8, [%[a], #28]\n\t"
  80033. "ldr r9, [%[b], #4]\n\t"
  80034. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80035. "lsl r6, r8, #16\n\t"
  80036. "lsl r7, r9, #16\n\t"
  80037. "lsr r6, r6, #16\n\t"
  80038. "lsr r7, r7, #16\n\t"
  80039. "mul r7, r6, r7\n\t"
  80040. "adds r5, r5, r7\n\t"
  80041. "adcs r3, r3, #0\n\t"
  80042. "adc r4, r4, #0\n\t"
  80043. "lsr r7, r9, #16\n\t"
  80044. "mul r6, r7, r6\n\t"
  80045. "lsr r7, r6, #16\n\t"
  80046. "lsl r6, r6, #16\n\t"
  80047. "adds r5, r5, r6\n\t"
  80048. "adcs r3, r3, r7\n\t"
  80049. "adc r4, r4, #0\n\t"
  80050. "lsr r6, r8, #16\n\t"
  80051. "lsr r7, r9, #16\n\t"
  80052. "mul r7, r6, r7\n\t"
  80053. "adds r3, r3, r7\n\t"
  80054. "adc r4, r4, #0\n\t"
  80055. "lsl r7, r9, #16\n\t"
  80056. "lsr r7, r7, #16\n\t"
  80057. "mul r6, r7, r6\n\t"
  80058. "lsr r7, r6, #16\n\t"
  80059. "lsl r6, r6, #16\n\t"
  80060. "adds r5, r5, r6\n\t"
  80061. "adcs r3, r3, r7\n\t"
  80062. "adc r4, r4, #0\n\t"
  80063. #else
  80064. "umull r6, r7, r8, r9\n\t"
  80065. "adds r5, r5, r6\n\t"
  80066. "adcs r3, r3, r7\n\t"
  80067. "adc r4, r4, #0\n\t"
  80068. #endif
  80069. /* A[6] * B[2] */
  80070. "ldr r8, [%[a], #24]\n\t"
  80071. "ldr r9, [%[b], #8]\n\t"
  80072. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80073. "lsl r6, r8, #16\n\t"
  80074. "lsl r7, r9, #16\n\t"
  80075. "lsr r6, r6, #16\n\t"
  80076. "lsr r7, r7, #16\n\t"
  80077. "mul r7, r6, r7\n\t"
  80078. "adds r5, r5, r7\n\t"
  80079. "adcs r3, r3, #0\n\t"
  80080. "adc r4, r4, #0\n\t"
  80081. "lsr r7, r9, #16\n\t"
  80082. "mul r6, r7, r6\n\t"
  80083. "lsr r7, r6, #16\n\t"
  80084. "lsl r6, r6, #16\n\t"
  80085. "adds r5, r5, r6\n\t"
  80086. "adcs r3, r3, r7\n\t"
  80087. "adc r4, r4, #0\n\t"
  80088. "lsr r6, r8, #16\n\t"
  80089. "lsr r7, r9, #16\n\t"
  80090. "mul r7, r6, r7\n\t"
  80091. "adds r3, r3, r7\n\t"
  80092. "adc r4, r4, #0\n\t"
  80093. "lsl r7, r9, #16\n\t"
  80094. "lsr r7, r7, #16\n\t"
  80095. "mul r6, r7, r6\n\t"
  80096. "lsr r7, r6, #16\n\t"
  80097. "lsl r6, r6, #16\n\t"
  80098. "adds r5, r5, r6\n\t"
  80099. "adcs r3, r3, r7\n\t"
  80100. "adc r4, r4, #0\n\t"
  80101. #else
  80102. "umull r6, r7, r8, r9\n\t"
  80103. "adds r5, r5, r6\n\t"
  80104. "adcs r3, r3, r7\n\t"
  80105. "adc r4, r4, #0\n\t"
  80106. #endif
  80107. /* A[5] * B[3] */
  80108. "ldr r8, [%[a], #20]\n\t"
  80109. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80110. "lsl r6, r8, #16\n\t"
  80111. "lsl r7, r12, #16\n\t"
  80112. "lsr r6, r6, #16\n\t"
  80113. "lsr r7, r7, #16\n\t"
  80114. "mul r7, r6, r7\n\t"
  80115. "adds r5, r5, r7\n\t"
  80116. "adcs r3, r3, #0\n\t"
  80117. "adc r4, r4, #0\n\t"
  80118. "lsr r7, r12, #16\n\t"
  80119. "mul r6, r7, r6\n\t"
  80120. "lsr r7, r6, #16\n\t"
  80121. "lsl r6, r6, #16\n\t"
  80122. "adds r5, r5, r6\n\t"
  80123. "adcs r3, r3, r7\n\t"
  80124. "adc r4, r4, #0\n\t"
  80125. "lsr r6, r8, #16\n\t"
  80126. "lsr r7, r12, #16\n\t"
  80127. "mul r7, r6, r7\n\t"
  80128. "adds r3, r3, r7\n\t"
  80129. "adc r4, r4, #0\n\t"
  80130. "lsl r7, r12, #16\n\t"
  80131. "lsr r7, r7, #16\n\t"
  80132. "mul r6, r7, r6\n\t"
  80133. "lsr r7, r6, #16\n\t"
  80134. "lsl r6, r6, #16\n\t"
  80135. "adds r5, r5, r6\n\t"
  80136. "adcs r3, r3, r7\n\t"
  80137. "adc r4, r4, #0\n\t"
  80138. #else
  80139. "umull r6, r7, r8, r12\n\t"
  80140. "adds r5, r5, r6\n\t"
  80141. "adcs r3, r3, r7\n\t"
  80142. "adc r4, r4, #0\n\t"
  80143. #endif
  80144. /* A[4] * B[4] */
  80145. "ldr r11, [%[a], #16]\n\t"
  80146. "ldr r12, [%[b], #16]\n\t"
  80147. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80148. "lsl r6, r11, #16\n\t"
  80149. "lsl r7, r12, #16\n\t"
  80150. "lsr r6, r6, #16\n\t"
  80151. "lsr r7, r7, #16\n\t"
  80152. "mul r7, r6, r7\n\t"
  80153. "adds r5, r5, r7\n\t"
  80154. "adcs r3, r3, #0\n\t"
  80155. "adc r4, r4, #0\n\t"
  80156. "lsr r7, r12, #16\n\t"
  80157. "mul r6, r7, r6\n\t"
  80158. "lsr r7, r6, #16\n\t"
  80159. "lsl r6, r6, #16\n\t"
  80160. "adds r5, r5, r6\n\t"
  80161. "adcs r3, r3, r7\n\t"
  80162. "adc r4, r4, #0\n\t"
  80163. "lsr r6, r11, #16\n\t"
  80164. "lsr r7, r12, #16\n\t"
  80165. "mul r7, r6, r7\n\t"
  80166. "adds r3, r3, r7\n\t"
  80167. "adc r4, r4, #0\n\t"
  80168. "lsl r7, r12, #16\n\t"
  80169. "lsr r7, r7, #16\n\t"
  80170. "mul r6, r7, r6\n\t"
  80171. "lsr r7, r6, #16\n\t"
  80172. "lsl r6, r6, #16\n\t"
  80173. "adds r5, r5, r6\n\t"
  80174. "adcs r3, r3, r7\n\t"
  80175. "adc r4, r4, #0\n\t"
  80176. #else
  80177. "umull r6, r7, r11, r12\n\t"
  80178. "adds r5, r5, r6\n\t"
  80179. "adcs r3, r3, r7\n\t"
  80180. "adc r4, r4, #0\n\t"
  80181. #endif
  80182. /* A[3] * B[5] */
  80183. "ldr r8, [%[a], #12]\n\t"
  80184. "ldr r9, [%[b], #20]\n\t"
  80185. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80186. "lsl r6, r8, #16\n\t"
  80187. "lsl r7, r9, #16\n\t"
  80188. "lsr r6, r6, #16\n\t"
  80189. "lsr r7, r7, #16\n\t"
  80190. "mul r7, r6, r7\n\t"
  80191. "adds r5, r5, r7\n\t"
  80192. "adcs r3, r3, #0\n\t"
  80193. "adc r4, r4, #0\n\t"
  80194. "lsr r7, r9, #16\n\t"
  80195. "mul r6, r7, r6\n\t"
  80196. "lsr r7, r6, #16\n\t"
  80197. "lsl r6, r6, #16\n\t"
  80198. "adds r5, r5, r6\n\t"
  80199. "adcs r3, r3, r7\n\t"
  80200. "adc r4, r4, #0\n\t"
  80201. "lsr r6, r8, #16\n\t"
  80202. "lsr r7, r9, #16\n\t"
  80203. "mul r7, r6, r7\n\t"
  80204. "adds r3, r3, r7\n\t"
  80205. "adc r4, r4, #0\n\t"
  80206. "lsl r7, r9, #16\n\t"
  80207. "lsr r7, r7, #16\n\t"
  80208. "mul r6, r7, r6\n\t"
  80209. "lsr r7, r6, #16\n\t"
  80210. "lsl r6, r6, #16\n\t"
  80211. "adds r5, r5, r6\n\t"
  80212. "adcs r3, r3, r7\n\t"
  80213. "adc r4, r4, #0\n\t"
  80214. #else
  80215. "umull r6, r7, r8, r9\n\t"
  80216. "adds r5, r5, r6\n\t"
  80217. "adcs r3, r3, r7\n\t"
  80218. "adc r4, r4, #0\n\t"
  80219. #endif
  80220. /* A[2] * B[6] */
  80221. "ldr r8, [%[a], #8]\n\t"
  80222. "ldr r9, [%[b], #24]\n\t"
  80223. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80224. "lsl r6, r8, #16\n\t"
  80225. "lsl r7, r9, #16\n\t"
  80226. "lsr r6, r6, #16\n\t"
  80227. "lsr r7, r7, #16\n\t"
  80228. "mul r7, r6, r7\n\t"
  80229. "adds r5, r5, r7\n\t"
  80230. "adcs r3, r3, #0\n\t"
  80231. "adc r4, r4, #0\n\t"
  80232. "lsr r7, r9, #16\n\t"
  80233. "mul r6, r7, r6\n\t"
  80234. "lsr r7, r6, #16\n\t"
  80235. "lsl r6, r6, #16\n\t"
  80236. "adds r5, r5, r6\n\t"
  80237. "adcs r3, r3, r7\n\t"
  80238. "adc r4, r4, #0\n\t"
  80239. "lsr r6, r8, #16\n\t"
  80240. "lsr r7, r9, #16\n\t"
  80241. "mul r7, r6, r7\n\t"
  80242. "adds r3, r3, r7\n\t"
  80243. "adc r4, r4, #0\n\t"
  80244. "lsl r7, r9, #16\n\t"
  80245. "lsr r7, r7, #16\n\t"
  80246. "mul r6, r7, r6\n\t"
  80247. "lsr r7, r6, #16\n\t"
  80248. "lsl r6, r6, #16\n\t"
  80249. "adds r5, r5, r6\n\t"
  80250. "adcs r3, r3, r7\n\t"
  80251. "adc r4, r4, #0\n\t"
  80252. #else
  80253. "umull r6, r7, r8, r9\n\t"
  80254. "adds r5, r5, r6\n\t"
  80255. "adcs r3, r3, r7\n\t"
  80256. "adc r4, r4, #0\n\t"
  80257. #endif
  80258. /* A[1] * B[7] */
  80259. "ldr r8, [%[a], #4]\n\t"
  80260. "ldr r9, [%[b], #28]\n\t"
  80261. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80262. "lsl r6, r8, #16\n\t"
  80263. "lsl r7, r9, #16\n\t"
  80264. "lsr r6, r6, #16\n\t"
  80265. "lsr r7, r7, #16\n\t"
  80266. "mul r7, r6, r7\n\t"
  80267. "adds r5, r5, r7\n\t"
  80268. "adcs r3, r3, #0\n\t"
  80269. "adc r4, r4, #0\n\t"
  80270. "lsr r7, r9, #16\n\t"
  80271. "mul r6, r7, r6\n\t"
  80272. "lsr r7, r6, #16\n\t"
  80273. "lsl r6, r6, #16\n\t"
  80274. "adds r5, r5, r6\n\t"
  80275. "adcs r3, r3, r7\n\t"
  80276. "adc r4, r4, #0\n\t"
  80277. "lsr r6, r8, #16\n\t"
  80278. "lsr r7, r9, #16\n\t"
  80279. "mul r7, r6, r7\n\t"
  80280. "adds r3, r3, r7\n\t"
  80281. "adc r4, r4, #0\n\t"
  80282. "lsl r7, r9, #16\n\t"
  80283. "lsr r7, r7, #16\n\t"
  80284. "mul r6, r7, r6\n\t"
  80285. "lsr r7, r6, #16\n\t"
  80286. "lsl r6, r6, #16\n\t"
  80287. "adds r5, r5, r6\n\t"
  80288. "adcs r3, r3, r7\n\t"
  80289. "adc r4, r4, #0\n\t"
  80290. #else
  80291. "umull r6, r7, r8, r9\n\t"
  80292. "adds r5, r5, r6\n\t"
  80293. "adcs r3, r3, r7\n\t"
  80294. "adc r4, r4, #0\n\t"
  80295. #endif
  80296. /* A[0] * B[8] */
  80297. "ldr r8, [%[a]]\n\t"
  80298. "ldr r9, [%[b], #32]\n\t"
  80299. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80300. "lsl r6, r8, #16\n\t"
  80301. "lsl r7, r9, #16\n\t"
  80302. "lsr r6, r6, #16\n\t"
  80303. "lsr r7, r7, #16\n\t"
  80304. "mul r7, r6, r7\n\t"
  80305. "adds r5, r5, r7\n\t"
  80306. "adcs r3, r3, #0\n\t"
  80307. "adc r4, r4, #0\n\t"
  80308. "lsr r7, r9, #16\n\t"
  80309. "mul r6, r7, r6\n\t"
  80310. "lsr r7, r6, #16\n\t"
  80311. "lsl r6, r6, #16\n\t"
  80312. "adds r5, r5, r6\n\t"
  80313. "adcs r3, r3, r7\n\t"
  80314. "adc r4, r4, #0\n\t"
  80315. "lsr r6, r8, #16\n\t"
  80316. "lsr r7, r9, #16\n\t"
  80317. "mul r7, r6, r7\n\t"
  80318. "adds r3, r3, r7\n\t"
  80319. "adc r4, r4, #0\n\t"
  80320. "lsl r7, r9, #16\n\t"
  80321. "lsr r7, r7, #16\n\t"
  80322. "mul r6, r7, r6\n\t"
  80323. "lsr r7, r6, #16\n\t"
  80324. "lsl r6, r6, #16\n\t"
  80325. "adds r5, r5, r6\n\t"
  80326. "adcs r3, r3, r7\n\t"
  80327. "adc r4, r4, #0\n\t"
  80328. #else
  80329. "umull r6, r7, r8, r9\n\t"
  80330. "adds r5, r5, r6\n\t"
  80331. "adcs r3, r3, r7\n\t"
  80332. "adc r4, r4, #0\n\t"
  80333. #endif
  80334. "str r5, [sp, #32]\n\t"
  80335. /* A[0] * B[9] */
  80336. "ldr r9, [%[b], #36]\n\t"
  80337. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80338. "lsl r6, r8, #16\n\t"
  80339. "lsl r7, r9, #16\n\t"
  80340. "lsr r6, r6, #16\n\t"
  80341. "lsr r7, r7, #16\n\t"
  80342. "mul r7, r6, r7\n\t"
  80343. "adds r3, r3, r7\n\t"
  80344. "adcs r4, r4, #0\n\t"
  80345. "mov r5, #0\n\t"
  80346. "adc r5, r5, #0\n\t"
  80347. "lsr r7, r9, #16\n\t"
  80348. "mul r6, r7, r6\n\t"
  80349. "lsr r7, r6, #16\n\t"
  80350. "lsl r6, r6, #16\n\t"
  80351. "adds r3, r3, r6\n\t"
  80352. "adcs r4, r4, r7\n\t"
  80353. "adc r5, r5, #0\n\t"
  80354. "lsr r6, r8, #16\n\t"
  80355. "lsr r7, r9, #16\n\t"
  80356. "mul r7, r6, r7\n\t"
  80357. "adds r4, r4, r7\n\t"
  80358. "adc r5, r5, #0\n\t"
  80359. "lsl r7, r9, #16\n\t"
  80360. "lsr r7, r7, #16\n\t"
  80361. "mul r6, r7, r6\n\t"
  80362. "lsr r7, r6, #16\n\t"
  80363. "lsl r6, r6, #16\n\t"
  80364. "adds r3, r3, r6\n\t"
  80365. "adcs r4, r4, r7\n\t"
  80366. "adc r5, r5, #0\n\t"
  80367. #else
  80368. "umull r6, r7, r8, r9\n\t"
  80369. "adds r3, r3, r6\n\t"
  80370. "adcs r4, r4, r7\n\t"
  80371. "mov r5, #0\n\t"
  80372. "adc r5, r5, #0\n\t"
  80373. #endif
  80374. /* A[1] * B[8] */
  80375. "ldr r8, [%[a], #4]\n\t"
  80376. "ldr r9, [%[b], #32]\n\t"
  80377. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80378. "lsl r6, r8, #16\n\t"
  80379. "lsl r7, r9, #16\n\t"
  80380. "lsr r6, r6, #16\n\t"
  80381. "lsr r7, r7, #16\n\t"
  80382. "mul r7, r6, r7\n\t"
  80383. "adds r3, r3, r7\n\t"
  80384. "adcs r4, r4, #0\n\t"
  80385. "adc r5, r5, #0\n\t"
  80386. "lsr r7, r9, #16\n\t"
  80387. "mul r6, r7, r6\n\t"
  80388. "lsr r7, r6, #16\n\t"
  80389. "lsl r6, r6, #16\n\t"
  80390. "adds r3, r3, r6\n\t"
  80391. "adcs r4, r4, r7\n\t"
  80392. "adc r5, r5, #0\n\t"
  80393. "lsr r6, r8, #16\n\t"
  80394. "lsr r7, r9, #16\n\t"
  80395. "mul r7, r6, r7\n\t"
  80396. "adds r4, r4, r7\n\t"
  80397. "adc r5, r5, #0\n\t"
  80398. "lsl r7, r9, #16\n\t"
  80399. "lsr r7, r7, #16\n\t"
  80400. "mul r6, r7, r6\n\t"
  80401. "lsr r7, r6, #16\n\t"
  80402. "lsl r6, r6, #16\n\t"
  80403. "adds r3, r3, r6\n\t"
  80404. "adcs r4, r4, r7\n\t"
  80405. "adc r5, r5, #0\n\t"
  80406. #else
  80407. "umull r6, r7, r8, r9\n\t"
  80408. "adds r3, r3, r6\n\t"
  80409. "adcs r4, r4, r7\n\t"
  80410. "adc r5, r5, #0\n\t"
  80411. #endif
  80412. /* A[2] * B[7] */
  80413. "ldr r8, [%[a], #8]\n\t"
  80414. "ldr r9, [%[b], #28]\n\t"
  80415. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80416. "lsl r6, r8, #16\n\t"
  80417. "lsl r7, r9, #16\n\t"
  80418. "lsr r6, r6, #16\n\t"
  80419. "lsr r7, r7, #16\n\t"
  80420. "mul r7, r6, r7\n\t"
  80421. "adds r3, r3, r7\n\t"
  80422. "adcs r4, r4, #0\n\t"
  80423. "adc r5, r5, #0\n\t"
  80424. "lsr r7, r9, #16\n\t"
  80425. "mul r6, r7, r6\n\t"
  80426. "lsr r7, r6, #16\n\t"
  80427. "lsl r6, r6, #16\n\t"
  80428. "adds r3, r3, r6\n\t"
  80429. "adcs r4, r4, r7\n\t"
  80430. "adc r5, r5, #0\n\t"
  80431. "lsr r6, r8, #16\n\t"
  80432. "lsr r7, r9, #16\n\t"
  80433. "mul r7, r6, r7\n\t"
  80434. "adds r4, r4, r7\n\t"
  80435. "adc r5, r5, #0\n\t"
  80436. "lsl r7, r9, #16\n\t"
  80437. "lsr r7, r7, #16\n\t"
  80438. "mul r6, r7, r6\n\t"
  80439. "lsr r7, r6, #16\n\t"
  80440. "lsl r6, r6, #16\n\t"
  80441. "adds r3, r3, r6\n\t"
  80442. "adcs r4, r4, r7\n\t"
  80443. "adc r5, r5, #0\n\t"
  80444. #else
  80445. "umull r6, r7, r8, r9\n\t"
  80446. "adds r3, r3, r6\n\t"
  80447. "adcs r4, r4, r7\n\t"
  80448. "adc r5, r5, #0\n\t"
  80449. #endif
  80450. /* A[3] * B[6] */
  80451. "ldr r8, [%[a], #12]\n\t"
  80452. "ldr r9, [%[b], #24]\n\t"
  80453. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80454. "lsl r6, r8, #16\n\t"
  80455. "lsl r7, r9, #16\n\t"
  80456. "lsr r6, r6, #16\n\t"
  80457. "lsr r7, r7, #16\n\t"
  80458. "mul r7, r6, r7\n\t"
  80459. "adds r3, r3, r7\n\t"
  80460. "adcs r4, r4, #0\n\t"
  80461. "adc r5, r5, #0\n\t"
  80462. "lsr r7, r9, #16\n\t"
  80463. "mul r6, r7, r6\n\t"
  80464. "lsr r7, r6, #16\n\t"
  80465. "lsl r6, r6, #16\n\t"
  80466. "adds r3, r3, r6\n\t"
  80467. "adcs r4, r4, r7\n\t"
  80468. "adc r5, r5, #0\n\t"
  80469. "lsr r6, r8, #16\n\t"
  80470. "lsr r7, r9, #16\n\t"
  80471. "mul r7, r6, r7\n\t"
  80472. "adds r4, r4, r7\n\t"
  80473. "adc r5, r5, #0\n\t"
  80474. "lsl r7, r9, #16\n\t"
  80475. "lsr r7, r7, #16\n\t"
  80476. "mul r6, r7, r6\n\t"
  80477. "lsr r7, r6, #16\n\t"
  80478. "lsl r6, r6, #16\n\t"
  80479. "adds r3, r3, r6\n\t"
  80480. "adcs r4, r4, r7\n\t"
  80481. "adc r5, r5, #0\n\t"
  80482. #else
  80483. "umull r6, r7, r8, r9\n\t"
  80484. "adds r3, r3, r6\n\t"
  80485. "adcs r4, r4, r7\n\t"
  80486. "adc r5, r5, #0\n\t"
  80487. #endif
  80488. /* A[4] * B[5] */
  80489. "ldr r9, [%[b], #20]\n\t"
  80490. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80491. "lsl r6, r11, #16\n\t"
  80492. "lsl r7, r9, #16\n\t"
  80493. "lsr r6, r6, #16\n\t"
  80494. "lsr r7, r7, #16\n\t"
  80495. "mul r7, r6, r7\n\t"
  80496. "adds r3, r3, r7\n\t"
  80497. "adcs r4, r4, #0\n\t"
  80498. "adc r5, r5, #0\n\t"
  80499. "lsr r7, r9, #16\n\t"
  80500. "mul r6, r7, r6\n\t"
  80501. "lsr r7, r6, #16\n\t"
  80502. "lsl r6, r6, #16\n\t"
  80503. "adds r3, r3, r6\n\t"
  80504. "adcs r4, r4, r7\n\t"
  80505. "adc r5, r5, #0\n\t"
  80506. "lsr r6, r11, #16\n\t"
  80507. "lsr r7, r9, #16\n\t"
  80508. "mul r7, r6, r7\n\t"
  80509. "adds r4, r4, r7\n\t"
  80510. "adc r5, r5, #0\n\t"
  80511. "lsl r7, r9, #16\n\t"
  80512. "lsr r7, r7, #16\n\t"
  80513. "mul r6, r7, r6\n\t"
  80514. "lsr r7, r6, #16\n\t"
  80515. "lsl r6, r6, #16\n\t"
  80516. "adds r3, r3, r6\n\t"
  80517. "adcs r4, r4, r7\n\t"
  80518. "adc r5, r5, #0\n\t"
  80519. #else
  80520. "umull r6, r7, r11, r9\n\t"
  80521. "adds r3, r3, r6\n\t"
  80522. "adcs r4, r4, r7\n\t"
  80523. "adc r5, r5, #0\n\t"
  80524. #endif
  80525. /* A[5] * B[4] */
  80526. "ldr r8, [%[a], #20]\n\t"
  80527. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80528. "lsl r6, r8, #16\n\t"
  80529. "lsl r7, r12, #16\n\t"
  80530. "lsr r6, r6, #16\n\t"
  80531. "lsr r7, r7, #16\n\t"
  80532. "mul r7, r6, r7\n\t"
  80533. "adds r3, r3, r7\n\t"
  80534. "adcs r4, r4, #0\n\t"
  80535. "adc r5, r5, #0\n\t"
  80536. "lsr r7, r12, #16\n\t"
  80537. "mul r6, r7, r6\n\t"
  80538. "lsr r7, r6, #16\n\t"
  80539. "lsl r6, r6, #16\n\t"
  80540. "adds r3, r3, r6\n\t"
  80541. "adcs r4, r4, r7\n\t"
  80542. "adc r5, r5, #0\n\t"
  80543. "lsr r6, r8, #16\n\t"
  80544. "lsr r7, r12, #16\n\t"
  80545. "mul r7, r6, r7\n\t"
  80546. "adds r4, r4, r7\n\t"
  80547. "adc r5, r5, #0\n\t"
  80548. "lsl r7, r12, #16\n\t"
  80549. "lsr r7, r7, #16\n\t"
  80550. "mul r6, r7, r6\n\t"
  80551. "lsr r7, r6, #16\n\t"
  80552. "lsl r6, r6, #16\n\t"
  80553. "adds r3, r3, r6\n\t"
  80554. "adcs r4, r4, r7\n\t"
  80555. "adc r5, r5, #0\n\t"
  80556. #else
  80557. "umull r6, r7, r8, r12\n\t"
  80558. "adds r3, r3, r6\n\t"
  80559. "adcs r4, r4, r7\n\t"
  80560. "adc r5, r5, #0\n\t"
  80561. #endif
  80562. /* A[6] * B[3] */
  80563. "ldr r8, [%[a], #24]\n\t"
  80564. "ldr r9, [%[b], #12]\n\t"
  80565. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80566. "lsl r6, r8, #16\n\t"
  80567. "lsl r7, r9, #16\n\t"
  80568. "lsr r6, r6, #16\n\t"
  80569. "lsr r7, r7, #16\n\t"
  80570. "mul r7, r6, r7\n\t"
  80571. "adds r3, r3, r7\n\t"
  80572. "adcs r4, r4, #0\n\t"
  80573. "adc r5, r5, #0\n\t"
  80574. "lsr r7, r9, #16\n\t"
  80575. "mul r6, r7, r6\n\t"
  80576. "lsr r7, r6, #16\n\t"
  80577. "lsl r6, r6, #16\n\t"
  80578. "adds r3, r3, r6\n\t"
  80579. "adcs r4, r4, r7\n\t"
  80580. "adc r5, r5, #0\n\t"
  80581. "lsr r6, r8, #16\n\t"
  80582. "lsr r7, r9, #16\n\t"
  80583. "mul r7, r6, r7\n\t"
  80584. "adds r4, r4, r7\n\t"
  80585. "adc r5, r5, #0\n\t"
  80586. "lsl r7, r9, #16\n\t"
  80587. "lsr r7, r7, #16\n\t"
  80588. "mul r6, r7, r6\n\t"
  80589. "lsr r7, r6, #16\n\t"
  80590. "lsl r6, r6, #16\n\t"
  80591. "adds r3, r3, r6\n\t"
  80592. "adcs r4, r4, r7\n\t"
  80593. "adc r5, r5, #0\n\t"
  80594. #else
  80595. "umull r6, r7, r8, r9\n\t"
  80596. "adds r3, r3, r6\n\t"
  80597. "adcs r4, r4, r7\n\t"
  80598. "adc r5, r5, #0\n\t"
  80599. #endif
  80600. /* A[7] * B[2] */
  80601. "ldr r8, [%[a], #28]\n\t"
  80602. "ldr r9, [%[b], #8]\n\t"
  80603. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80604. "lsl r6, r8, #16\n\t"
  80605. "lsl r7, r9, #16\n\t"
  80606. "lsr r6, r6, #16\n\t"
  80607. "lsr r7, r7, #16\n\t"
  80608. "mul r7, r6, r7\n\t"
  80609. "adds r3, r3, r7\n\t"
  80610. "adcs r4, r4, #0\n\t"
  80611. "adc r5, r5, #0\n\t"
  80612. "lsr r7, r9, #16\n\t"
  80613. "mul r6, r7, r6\n\t"
  80614. "lsr r7, r6, #16\n\t"
  80615. "lsl r6, r6, #16\n\t"
  80616. "adds r3, r3, r6\n\t"
  80617. "adcs r4, r4, r7\n\t"
  80618. "adc r5, r5, #0\n\t"
  80619. "lsr r6, r8, #16\n\t"
  80620. "lsr r7, r9, #16\n\t"
  80621. "mul r7, r6, r7\n\t"
  80622. "adds r4, r4, r7\n\t"
  80623. "adc r5, r5, #0\n\t"
  80624. "lsl r7, r9, #16\n\t"
  80625. "lsr r7, r7, #16\n\t"
  80626. "mul r6, r7, r6\n\t"
  80627. "lsr r7, r6, #16\n\t"
  80628. "lsl r6, r6, #16\n\t"
  80629. "adds r3, r3, r6\n\t"
  80630. "adcs r4, r4, r7\n\t"
  80631. "adc r5, r5, #0\n\t"
  80632. #else
  80633. "umull r6, r7, r8, r9\n\t"
  80634. "adds r3, r3, r6\n\t"
  80635. "adcs r4, r4, r7\n\t"
  80636. "adc r5, r5, #0\n\t"
  80637. #endif
  80638. /* A[8] * B[1] */
  80639. "ldr r8, [%[a], #32]\n\t"
  80640. "ldr r9, [%[b], #4]\n\t"
  80641. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80642. "lsl r6, r8, #16\n\t"
  80643. "lsl r7, r9, #16\n\t"
  80644. "lsr r6, r6, #16\n\t"
  80645. "lsr r7, r7, #16\n\t"
  80646. "mul r7, r6, r7\n\t"
  80647. "adds r3, r3, r7\n\t"
  80648. "adcs r4, r4, #0\n\t"
  80649. "adc r5, r5, #0\n\t"
  80650. "lsr r7, r9, #16\n\t"
  80651. "mul r6, r7, r6\n\t"
  80652. "lsr r7, r6, #16\n\t"
  80653. "lsl r6, r6, #16\n\t"
  80654. "adds r3, r3, r6\n\t"
  80655. "adcs r4, r4, r7\n\t"
  80656. "adc r5, r5, #0\n\t"
  80657. "lsr r6, r8, #16\n\t"
  80658. "lsr r7, r9, #16\n\t"
  80659. "mul r7, r6, r7\n\t"
  80660. "adds r4, r4, r7\n\t"
  80661. "adc r5, r5, #0\n\t"
  80662. "lsl r7, r9, #16\n\t"
  80663. "lsr r7, r7, #16\n\t"
  80664. "mul r6, r7, r6\n\t"
  80665. "lsr r7, r6, #16\n\t"
  80666. "lsl r6, r6, #16\n\t"
  80667. "adds r3, r3, r6\n\t"
  80668. "adcs r4, r4, r7\n\t"
  80669. "adc r5, r5, #0\n\t"
  80670. #else
  80671. "umull r6, r7, r8, r9\n\t"
  80672. "adds r3, r3, r6\n\t"
  80673. "adcs r4, r4, r7\n\t"
  80674. "adc r5, r5, #0\n\t"
  80675. #endif
  80676. /* A[9] * B[0] */
  80677. "ldr r8, [%[a], #36]\n\t"
  80678. "ldr r9, [%[b]]\n\t"
  80679. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80680. "lsl r6, r8, #16\n\t"
  80681. "lsl r7, r9, #16\n\t"
  80682. "lsr r6, r6, #16\n\t"
  80683. "lsr r7, r7, #16\n\t"
  80684. "mul r7, r6, r7\n\t"
  80685. "adds r3, r3, r7\n\t"
  80686. "adcs r4, r4, #0\n\t"
  80687. "adc r5, r5, #0\n\t"
  80688. "lsr r7, r9, #16\n\t"
  80689. "mul r6, r7, r6\n\t"
  80690. "lsr r7, r6, #16\n\t"
  80691. "lsl r6, r6, #16\n\t"
  80692. "adds r3, r3, r6\n\t"
  80693. "adcs r4, r4, r7\n\t"
  80694. "adc r5, r5, #0\n\t"
  80695. "lsr r6, r8, #16\n\t"
  80696. "lsr r7, r9, #16\n\t"
  80697. "mul r7, r6, r7\n\t"
  80698. "adds r4, r4, r7\n\t"
  80699. "adc r5, r5, #0\n\t"
  80700. "lsl r7, r9, #16\n\t"
  80701. "lsr r7, r7, #16\n\t"
  80702. "mul r6, r7, r6\n\t"
  80703. "lsr r7, r6, #16\n\t"
  80704. "lsl r6, r6, #16\n\t"
  80705. "adds r3, r3, r6\n\t"
  80706. "adcs r4, r4, r7\n\t"
  80707. "adc r5, r5, #0\n\t"
  80708. #else
  80709. "umull r6, r7, r8, r9\n\t"
  80710. "adds r3, r3, r6\n\t"
  80711. "adcs r4, r4, r7\n\t"
  80712. "adc r5, r5, #0\n\t"
  80713. #endif
  80714. "str r3, [sp, #36]\n\t"
  80715. /* A[10] * B[0] */
  80716. "ldr r8, [%[a], #40]\n\t"
  80717. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80718. "lsl r6, r8, #16\n\t"
  80719. "lsl r7, r9, #16\n\t"
  80720. "lsr r6, r6, #16\n\t"
  80721. "lsr r7, r7, #16\n\t"
  80722. "mul r7, r6, r7\n\t"
  80723. "adds r4, r4, r7\n\t"
  80724. "adcs r5, r5, #0\n\t"
  80725. "mov r3, #0\n\t"
  80726. "adc r3, r3, #0\n\t"
  80727. "lsr r7, r9, #16\n\t"
  80728. "mul r6, r7, r6\n\t"
  80729. "lsr r7, r6, #16\n\t"
  80730. "lsl r6, r6, #16\n\t"
  80731. "adds r4, r4, r6\n\t"
  80732. "adcs r5, r5, r7\n\t"
  80733. "adc r3, r3, #0\n\t"
  80734. "lsr r6, r8, #16\n\t"
  80735. "lsr r7, r9, #16\n\t"
  80736. "mul r7, r6, r7\n\t"
  80737. "adds r5, r5, r7\n\t"
  80738. "adc r3, r3, #0\n\t"
  80739. "lsl r7, r9, #16\n\t"
  80740. "lsr r7, r7, #16\n\t"
  80741. "mul r6, r7, r6\n\t"
  80742. "lsr r7, r6, #16\n\t"
  80743. "lsl r6, r6, #16\n\t"
  80744. "adds r4, r4, r6\n\t"
  80745. "adcs r5, r5, r7\n\t"
  80746. "adc r3, r3, #0\n\t"
  80747. #else
  80748. "umull r6, r7, r8, r9\n\t"
  80749. "adds r4, r4, r6\n\t"
  80750. "adcs r5, r5, r7\n\t"
  80751. "mov r3, #0\n\t"
  80752. "adc r3, r3, #0\n\t"
  80753. #endif
  80754. /* A[9] * B[1] */
  80755. "ldr r8, [%[a], #36]\n\t"
  80756. "ldr r9, [%[b], #4]\n\t"
  80757. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80758. "lsl r6, r8, #16\n\t"
  80759. "lsl r7, r9, #16\n\t"
  80760. "lsr r6, r6, #16\n\t"
  80761. "lsr r7, r7, #16\n\t"
  80762. "mul r7, r6, r7\n\t"
  80763. "adds r4, r4, r7\n\t"
  80764. "adcs r5, r5, #0\n\t"
  80765. "adc r3, r3, #0\n\t"
  80766. "lsr r7, r9, #16\n\t"
  80767. "mul r6, r7, r6\n\t"
  80768. "lsr r7, r6, #16\n\t"
  80769. "lsl r6, r6, #16\n\t"
  80770. "adds r4, r4, r6\n\t"
  80771. "adcs r5, r5, r7\n\t"
  80772. "adc r3, r3, #0\n\t"
  80773. "lsr r6, r8, #16\n\t"
  80774. "lsr r7, r9, #16\n\t"
  80775. "mul r7, r6, r7\n\t"
  80776. "adds r5, r5, r7\n\t"
  80777. "adc r3, r3, #0\n\t"
  80778. "lsl r7, r9, #16\n\t"
  80779. "lsr r7, r7, #16\n\t"
  80780. "mul r6, r7, r6\n\t"
  80781. "lsr r7, r6, #16\n\t"
  80782. "lsl r6, r6, #16\n\t"
  80783. "adds r4, r4, r6\n\t"
  80784. "adcs r5, r5, r7\n\t"
  80785. "adc r3, r3, #0\n\t"
  80786. #else
  80787. "umull r6, r7, r8, r9\n\t"
  80788. "adds r4, r4, r6\n\t"
  80789. "adcs r5, r5, r7\n\t"
  80790. "adc r3, r3, #0\n\t"
  80791. #endif
  80792. /* A[8] * B[2] */
  80793. "ldr r8, [%[a], #32]\n\t"
  80794. "ldr r9, [%[b], #8]\n\t"
  80795. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80796. "lsl r6, r8, #16\n\t"
  80797. "lsl r7, r9, #16\n\t"
  80798. "lsr r6, r6, #16\n\t"
  80799. "lsr r7, r7, #16\n\t"
  80800. "mul r7, r6, r7\n\t"
  80801. "adds r4, r4, r7\n\t"
  80802. "adcs r5, r5, #0\n\t"
  80803. "adc r3, r3, #0\n\t"
  80804. "lsr r7, r9, #16\n\t"
  80805. "mul r6, r7, r6\n\t"
  80806. "lsr r7, r6, #16\n\t"
  80807. "lsl r6, r6, #16\n\t"
  80808. "adds r4, r4, r6\n\t"
  80809. "adcs r5, r5, r7\n\t"
  80810. "adc r3, r3, #0\n\t"
  80811. "lsr r6, r8, #16\n\t"
  80812. "lsr r7, r9, #16\n\t"
  80813. "mul r7, r6, r7\n\t"
  80814. "adds r5, r5, r7\n\t"
  80815. "adc r3, r3, #0\n\t"
  80816. "lsl r7, r9, #16\n\t"
  80817. "lsr r7, r7, #16\n\t"
  80818. "mul r6, r7, r6\n\t"
  80819. "lsr r7, r6, #16\n\t"
  80820. "lsl r6, r6, #16\n\t"
  80821. "adds r4, r4, r6\n\t"
  80822. "adcs r5, r5, r7\n\t"
  80823. "adc r3, r3, #0\n\t"
  80824. #else
  80825. "umull r6, r7, r8, r9\n\t"
  80826. "adds r4, r4, r6\n\t"
  80827. "adcs r5, r5, r7\n\t"
  80828. "adc r3, r3, #0\n\t"
  80829. #endif
  80830. /* A[7] * B[3] */
  80831. "ldr r8, [%[a], #28]\n\t"
  80832. "ldr r9, [%[b], #12]\n\t"
  80833. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80834. "lsl r6, r8, #16\n\t"
  80835. "lsl r7, r9, #16\n\t"
  80836. "lsr r6, r6, #16\n\t"
  80837. "lsr r7, r7, #16\n\t"
  80838. "mul r7, r6, r7\n\t"
  80839. "adds r4, r4, r7\n\t"
  80840. "adcs r5, r5, #0\n\t"
  80841. "adc r3, r3, #0\n\t"
  80842. "lsr r7, r9, #16\n\t"
  80843. "mul r6, r7, r6\n\t"
  80844. "lsr r7, r6, #16\n\t"
  80845. "lsl r6, r6, #16\n\t"
  80846. "adds r4, r4, r6\n\t"
  80847. "adcs r5, r5, r7\n\t"
  80848. "adc r3, r3, #0\n\t"
  80849. "lsr r6, r8, #16\n\t"
  80850. "lsr r7, r9, #16\n\t"
  80851. "mul r7, r6, r7\n\t"
  80852. "adds r5, r5, r7\n\t"
  80853. "adc r3, r3, #0\n\t"
  80854. "lsl r7, r9, #16\n\t"
  80855. "lsr r7, r7, #16\n\t"
  80856. "mul r6, r7, r6\n\t"
  80857. "lsr r7, r6, #16\n\t"
  80858. "lsl r6, r6, #16\n\t"
  80859. "adds r4, r4, r6\n\t"
  80860. "adcs r5, r5, r7\n\t"
  80861. "adc r3, r3, #0\n\t"
  80862. #else
  80863. "umull r6, r7, r8, r9\n\t"
  80864. "adds r4, r4, r6\n\t"
  80865. "adcs r5, r5, r7\n\t"
  80866. "adc r3, r3, #0\n\t"
  80867. #endif
  80868. /* A[6] * B[4] */
  80869. "ldr r8, [%[a], #24]\n\t"
  80870. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80871. "lsl r6, r8, #16\n\t"
  80872. "lsl r7, r12, #16\n\t"
  80873. "lsr r6, r6, #16\n\t"
  80874. "lsr r7, r7, #16\n\t"
  80875. "mul r7, r6, r7\n\t"
  80876. "adds r4, r4, r7\n\t"
  80877. "adcs r5, r5, #0\n\t"
  80878. "adc r3, r3, #0\n\t"
  80879. "lsr r7, r12, #16\n\t"
  80880. "mul r6, r7, r6\n\t"
  80881. "lsr r7, r6, #16\n\t"
  80882. "lsl r6, r6, #16\n\t"
  80883. "adds r4, r4, r6\n\t"
  80884. "adcs r5, r5, r7\n\t"
  80885. "adc r3, r3, #0\n\t"
  80886. "lsr r6, r8, #16\n\t"
  80887. "lsr r7, r12, #16\n\t"
  80888. "mul r7, r6, r7\n\t"
  80889. "adds r5, r5, r7\n\t"
  80890. "adc r3, r3, #0\n\t"
  80891. "lsl r7, r12, #16\n\t"
  80892. "lsr r7, r7, #16\n\t"
  80893. "mul r6, r7, r6\n\t"
  80894. "lsr r7, r6, #16\n\t"
  80895. "lsl r6, r6, #16\n\t"
  80896. "adds r4, r4, r6\n\t"
  80897. "adcs r5, r5, r7\n\t"
  80898. "adc r3, r3, #0\n\t"
  80899. #else
  80900. "umull r6, r7, r8, r12\n\t"
  80901. "adds r4, r4, r6\n\t"
  80902. "adcs r5, r5, r7\n\t"
  80903. "adc r3, r3, #0\n\t"
  80904. #endif
  80905. /* A[5] * B[5] */
  80906. "ldr r11, [%[a], #20]\n\t"
  80907. "ldr r12, [%[b], #20]\n\t"
  80908. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80909. "lsl r6, r11, #16\n\t"
  80910. "lsl r7, r12, #16\n\t"
  80911. "lsr r6, r6, #16\n\t"
  80912. "lsr r7, r7, #16\n\t"
  80913. "mul r7, r6, r7\n\t"
  80914. "adds r4, r4, r7\n\t"
  80915. "adcs r5, r5, #0\n\t"
  80916. "adc r3, r3, #0\n\t"
  80917. "lsr r7, r12, #16\n\t"
  80918. "mul r6, r7, r6\n\t"
  80919. "lsr r7, r6, #16\n\t"
  80920. "lsl r6, r6, #16\n\t"
  80921. "adds r4, r4, r6\n\t"
  80922. "adcs r5, r5, r7\n\t"
  80923. "adc r3, r3, #0\n\t"
  80924. "lsr r6, r11, #16\n\t"
  80925. "lsr r7, r12, #16\n\t"
  80926. "mul r7, r6, r7\n\t"
  80927. "adds r5, r5, r7\n\t"
  80928. "adc r3, r3, #0\n\t"
  80929. "lsl r7, r12, #16\n\t"
  80930. "lsr r7, r7, #16\n\t"
  80931. "mul r6, r7, r6\n\t"
  80932. "lsr r7, r6, #16\n\t"
  80933. "lsl r6, r6, #16\n\t"
  80934. "adds r4, r4, r6\n\t"
  80935. "adcs r5, r5, r7\n\t"
  80936. "adc r3, r3, #0\n\t"
  80937. #else
  80938. "umull r6, r7, r11, r12\n\t"
  80939. "adds r4, r4, r6\n\t"
  80940. "adcs r5, r5, r7\n\t"
  80941. "adc r3, r3, #0\n\t"
  80942. #endif
  80943. /* A[4] * B[6] */
  80944. "ldr r8, [%[a], #16]\n\t"
  80945. "ldr r9, [%[b], #24]\n\t"
  80946. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80947. "lsl r6, r8, #16\n\t"
  80948. "lsl r7, r9, #16\n\t"
  80949. "lsr r6, r6, #16\n\t"
  80950. "lsr r7, r7, #16\n\t"
  80951. "mul r7, r6, r7\n\t"
  80952. "adds r4, r4, r7\n\t"
  80953. "adcs r5, r5, #0\n\t"
  80954. "adc r3, r3, #0\n\t"
  80955. "lsr r7, r9, #16\n\t"
  80956. "mul r6, r7, r6\n\t"
  80957. "lsr r7, r6, #16\n\t"
  80958. "lsl r6, r6, #16\n\t"
  80959. "adds r4, r4, r6\n\t"
  80960. "adcs r5, r5, r7\n\t"
  80961. "adc r3, r3, #0\n\t"
  80962. "lsr r6, r8, #16\n\t"
  80963. "lsr r7, r9, #16\n\t"
  80964. "mul r7, r6, r7\n\t"
  80965. "adds r5, r5, r7\n\t"
  80966. "adc r3, r3, #0\n\t"
  80967. "lsl r7, r9, #16\n\t"
  80968. "lsr r7, r7, #16\n\t"
  80969. "mul r6, r7, r6\n\t"
  80970. "lsr r7, r6, #16\n\t"
  80971. "lsl r6, r6, #16\n\t"
  80972. "adds r4, r4, r6\n\t"
  80973. "adcs r5, r5, r7\n\t"
  80974. "adc r3, r3, #0\n\t"
  80975. #else
  80976. "umull r6, r7, r8, r9\n\t"
  80977. "adds r4, r4, r6\n\t"
  80978. "adcs r5, r5, r7\n\t"
  80979. "adc r3, r3, #0\n\t"
  80980. #endif
  80981. /* A[3] * B[7] */
  80982. "ldr r8, [%[a], #12]\n\t"
  80983. "ldr r9, [%[b], #28]\n\t"
  80984. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  80985. "lsl r6, r8, #16\n\t"
  80986. "lsl r7, r9, #16\n\t"
  80987. "lsr r6, r6, #16\n\t"
  80988. "lsr r7, r7, #16\n\t"
  80989. "mul r7, r6, r7\n\t"
  80990. "adds r4, r4, r7\n\t"
  80991. "adcs r5, r5, #0\n\t"
  80992. "adc r3, r3, #0\n\t"
  80993. "lsr r7, r9, #16\n\t"
  80994. "mul r6, r7, r6\n\t"
  80995. "lsr r7, r6, #16\n\t"
  80996. "lsl r6, r6, #16\n\t"
  80997. "adds r4, r4, r6\n\t"
  80998. "adcs r5, r5, r7\n\t"
  80999. "adc r3, r3, #0\n\t"
  81000. "lsr r6, r8, #16\n\t"
  81001. "lsr r7, r9, #16\n\t"
  81002. "mul r7, r6, r7\n\t"
  81003. "adds r5, r5, r7\n\t"
  81004. "adc r3, r3, #0\n\t"
  81005. "lsl r7, r9, #16\n\t"
  81006. "lsr r7, r7, #16\n\t"
  81007. "mul r6, r7, r6\n\t"
  81008. "lsr r7, r6, #16\n\t"
  81009. "lsl r6, r6, #16\n\t"
  81010. "adds r4, r4, r6\n\t"
  81011. "adcs r5, r5, r7\n\t"
  81012. "adc r3, r3, #0\n\t"
  81013. #else
  81014. "umull r6, r7, r8, r9\n\t"
  81015. "adds r4, r4, r6\n\t"
  81016. "adcs r5, r5, r7\n\t"
  81017. "adc r3, r3, #0\n\t"
  81018. #endif
  81019. /* A[2] * B[8] */
  81020. "ldr r8, [%[a], #8]\n\t"
  81021. "ldr r9, [%[b], #32]\n\t"
  81022. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81023. "lsl r6, r8, #16\n\t"
  81024. "lsl r7, r9, #16\n\t"
  81025. "lsr r6, r6, #16\n\t"
  81026. "lsr r7, r7, #16\n\t"
  81027. "mul r7, r6, r7\n\t"
  81028. "adds r4, r4, r7\n\t"
  81029. "adcs r5, r5, #0\n\t"
  81030. "adc r3, r3, #0\n\t"
  81031. "lsr r7, r9, #16\n\t"
  81032. "mul r6, r7, r6\n\t"
  81033. "lsr r7, r6, #16\n\t"
  81034. "lsl r6, r6, #16\n\t"
  81035. "adds r4, r4, r6\n\t"
  81036. "adcs r5, r5, r7\n\t"
  81037. "adc r3, r3, #0\n\t"
  81038. "lsr r6, r8, #16\n\t"
  81039. "lsr r7, r9, #16\n\t"
  81040. "mul r7, r6, r7\n\t"
  81041. "adds r5, r5, r7\n\t"
  81042. "adc r3, r3, #0\n\t"
  81043. "lsl r7, r9, #16\n\t"
  81044. "lsr r7, r7, #16\n\t"
  81045. "mul r6, r7, r6\n\t"
  81046. "lsr r7, r6, #16\n\t"
  81047. "lsl r6, r6, #16\n\t"
  81048. "adds r4, r4, r6\n\t"
  81049. "adcs r5, r5, r7\n\t"
  81050. "adc r3, r3, #0\n\t"
  81051. #else
  81052. "umull r6, r7, r8, r9\n\t"
  81053. "adds r4, r4, r6\n\t"
  81054. "adcs r5, r5, r7\n\t"
  81055. "adc r3, r3, #0\n\t"
  81056. #endif
  81057. /* A[1] * B[9] */
  81058. "ldr r8, [%[a], #4]\n\t"
  81059. "ldr r9, [%[b], #36]\n\t"
  81060. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81061. "lsl r6, r8, #16\n\t"
  81062. "lsl r7, r9, #16\n\t"
  81063. "lsr r6, r6, #16\n\t"
  81064. "lsr r7, r7, #16\n\t"
  81065. "mul r7, r6, r7\n\t"
  81066. "adds r4, r4, r7\n\t"
  81067. "adcs r5, r5, #0\n\t"
  81068. "adc r3, r3, #0\n\t"
  81069. "lsr r7, r9, #16\n\t"
  81070. "mul r6, r7, r6\n\t"
  81071. "lsr r7, r6, #16\n\t"
  81072. "lsl r6, r6, #16\n\t"
  81073. "adds r4, r4, r6\n\t"
  81074. "adcs r5, r5, r7\n\t"
  81075. "adc r3, r3, #0\n\t"
  81076. "lsr r6, r8, #16\n\t"
  81077. "lsr r7, r9, #16\n\t"
  81078. "mul r7, r6, r7\n\t"
  81079. "adds r5, r5, r7\n\t"
  81080. "adc r3, r3, #0\n\t"
  81081. "lsl r7, r9, #16\n\t"
  81082. "lsr r7, r7, #16\n\t"
  81083. "mul r6, r7, r6\n\t"
  81084. "lsr r7, r6, #16\n\t"
  81085. "lsl r6, r6, #16\n\t"
  81086. "adds r4, r4, r6\n\t"
  81087. "adcs r5, r5, r7\n\t"
  81088. "adc r3, r3, #0\n\t"
  81089. #else
  81090. "umull r6, r7, r8, r9\n\t"
  81091. "adds r4, r4, r6\n\t"
  81092. "adcs r5, r5, r7\n\t"
  81093. "adc r3, r3, #0\n\t"
  81094. #endif
  81095. /* A[0] * B[10] */
  81096. "ldr r8, [%[a]]\n\t"
  81097. "ldr r9, [%[b], #40]\n\t"
  81098. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81099. "lsl r6, r8, #16\n\t"
  81100. "lsl r7, r9, #16\n\t"
  81101. "lsr r6, r6, #16\n\t"
  81102. "lsr r7, r7, #16\n\t"
  81103. "mul r7, r6, r7\n\t"
  81104. "adds r4, r4, r7\n\t"
  81105. "adcs r5, r5, #0\n\t"
  81106. "adc r3, r3, #0\n\t"
  81107. "lsr r7, r9, #16\n\t"
  81108. "mul r6, r7, r6\n\t"
  81109. "lsr r7, r6, #16\n\t"
  81110. "lsl r6, r6, #16\n\t"
  81111. "adds r4, r4, r6\n\t"
  81112. "adcs r5, r5, r7\n\t"
  81113. "adc r3, r3, #0\n\t"
  81114. "lsr r6, r8, #16\n\t"
  81115. "lsr r7, r9, #16\n\t"
  81116. "mul r7, r6, r7\n\t"
  81117. "adds r5, r5, r7\n\t"
  81118. "adc r3, r3, #0\n\t"
  81119. "lsl r7, r9, #16\n\t"
  81120. "lsr r7, r7, #16\n\t"
  81121. "mul r6, r7, r6\n\t"
  81122. "lsr r7, r6, #16\n\t"
  81123. "lsl r6, r6, #16\n\t"
  81124. "adds r4, r4, r6\n\t"
  81125. "adcs r5, r5, r7\n\t"
  81126. "adc r3, r3, #0\n\t"
  81127. #else
  81128. "umull r6, r7, r8, r9\n\t"
  81129. "adds r4, r4, r6\n\t"
  81130. "adcs r5, r5, r7\n\t"
  81131. "adc r3, r3, #0\n\t"
  81132. #endif
  81133. "str r4, [sp, #40]\n\t"
  81134. /* A[0] * B[11] */
  81135. "ldr r9, [%[b], #44]\n\t"
  81136. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81137. "lsl r6, r8, #16\n\t"
  81138. "lsl r7, r9, #16\n\t"
  81139. "lsr r6, r6, #16\n\t"
  81140. "lsr r7, r7, #16\n\t"
  81141. "mul r7, r6, r7\n\t"
  81142. "adds r5, r5, r7\n\t"
  81143. "adcs r3, r3, #0\n\t"
  81144. "mov r4, #0\n\t"
  81145. "adc r4, r4, #0\n\t"
  81146. "lsr r7, r9, #16\n\t"
  81147. "mul r6, r7, r6\n\t"
  81148. "lsr r7, r6, #16\n\t"
  81149. "lsl r6, r6, #16\n\t"
  81150. "adds r5, r5, r6\n\t"
  81151. "adcs r3, r3, r7\n\t"
  81152. "adc r4, r4, #0\n\t"
  81153. "lsr r6, r8, #16\n\t"
  81154. "lsr r7, r9, #16\n\t"
  81155. "mul r7, r6, r7\n\t"
  81156. "adds r3, r3, r7\n\t"
  81157. "adc r4, r4, #0\n\t"
  81158. "lsl r7, r9, #16\n\t"
  81159. "lsr r7, r7, #16\n\t"
  81160. "mul r6, r7, r6\n\t"
  81161. "lsr r7, r6, #16\n\t"
  81162. "lsl r6, r6, #16\n\t"
  81163. "adds r5, r5, r6\n\t"
  81164. "adcs r3, r3, r7\n\t"
  81165. "adc r4, r4, #0\n\t"
  81166. #else
  81167. "umull r6, r7, r8, r9\n\t"
  81168. "adds r5, r5, r6\n\t"
  81169. "adcs r3, r3, r7\n\t"
  81170. "mov r4, #0\n\t"
  81171. "adc r4, r4, #0\n\t"
  81172. #endif
  81173. /* A[1] * B[10] */
  81174. "ldr r8, [%[a], #4]\n\t"
  81175. "ldr r9, [%[b], #40]\n\t"
  81176. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81177. "lsl r6, r8, #16\n\t"
  81178. "lsl r7, r9, #16\n\t"
  81179. "lsr r6, r6, #16\n\t"
  81180. "lsr r7, r7, #16\n\t"
  81181. "mul r7, r6, r7\n\t"
  81182. "adds r5, r5, r7\n\t"
  81183. "adcs r3, r3, #0\n\t"
  81184. "adc r4, r4, #0\n\t"
  81185. "lsr r7, r9, #16\n\t"
  81186. "mul r6, r7, r6\n\t"
  81187. "lsr r7, r6, #16\n\t"
  81188. "lsl r6, r6, #16\n\t"
  81189. "adds r5, r5, r6\n\t"
  81190. "adcs r3, r3, r7\n\t"
  81191. "adc r4, r4, #0\n\t"
  81192. "lsr r6, r8, #16\n\t"
  81193. "lsr r7, r9, #16\n\t"
  81194. "mul r7, r6, r7\n\t"
  81195. "adds r3, r3, r7\n\t"
  81196. "adc r4, r4, #0\n\t"
  81197. "lsl r7, r9, #16\n\t"
  81198. "lsr r7, r7, #16\n\t"
  81199. "mul r6, r7, r6\n\t"
  81200. "lsr r7, r6, #16\n\t"
  81201. "lsl r6, r6, #16\n\t"
  81202. "adds r5, r5, r6\n\t"
  81203. "adcs r3, r3, r7\n\t"
  81204. "adc r4, r4, #0\n\t"
  81205. #else
  81206. "umull r6, r7, r8, r9\n\t"
  81207. "adds r5, r5, r6\n\t"
  81208. "adcs r3, r3, r7\n\t"
  81209. "adc r4, r4, #0\n\t"
  81210. #endif
  81211. /* A[2] * B[9] */
  81212. "ldr r8, [%[a], #8]\n\t"
  81213. "ldr r9, [%[b], #36]\n\t"
  81214. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81215. "lsl r6, r8, #16\n\t"
  81216. "lsl r7, r9, #16\n\t"
  81217. "lsr r6, r6, #16\n\t"
  81218. "lsr r7, r7, #16\n\t"
  81219. "mul r7, r6, r7\n\t"
  81220. "adds r5, r5, r7\n\t"
  81221. "adcs r3, r3, #0\n\t"
  81222. "adc r4, r4, #0\n\t"
  81223. "lsr r7, r9, #16\n\t"
  81224. "mul r6, r7, r6\n\t"
  81225. "lsr r7, r6, #16\n\t"
  81226. "lsl r6, r6, #16\n\t"
  81227. "adds r5, r5, r6\n\t"
  81228. "adcs r3, r3, r7\n\t"
  81229. "adc r4, r4, #0\n\t"
  81230. "lsr r6, r8, #16\n\t"
  81231. "lsr r7, r9, #16\n\t"
  81232. "mul r7, r6, r7\n\t"
  81233. "adds r3, r3, r7\n\t"
  81234. "adc r4, r4, #0\n\t"
  81235. "lsl r7, r9, #16\n\t"
  81236. "lsr r7, r7, #16\n\t"
  81237. "mul r6, r7, r6\n\t"
  81238. "lsr r7, r6, #16\n\t"
  81239. "lsl r6, r6, #16\n\t"
  81240. "adds r5, r5, r6\n\t"
  81241. "adcs r3, r3, r7\n\t"
  81242. "adc r4, r4, #0\n\t"
  81243. #else
  81244. "umull r6, r7, r8, r9\n\t"
  81245. "adds r5, r5, r6\n\t"
  81246. "adcs r3, r3, r7\n\t"
  81247. "adc r4, r4, #0\n\t"
  81248. #endif
  81249. /* A[3] * B[8] */
  81250. "ldr r8, [%[a], #12]\n\t"
  81251. "ldr r9, [%[b], #32]\n\t"
  81252. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81253. "lsl r6, r8, #16\n\t"
  81254. "lsl r7, r9, #16\n\t"
  81255. "lsr r6, r6, #16\n\t"
  81256. "lsr r7, r7, #16\n\t"
  81257. "mul r7, r6, r7\n\t"
  81258. "adds r5, r5, r7\n\t"
  81259. "adcs r3, r3, #0\n\t"
  81260. "adc r4, r4, #0\n\t"
  81261. "lsr r7, r9, #16\n\t"
  81262. "mul r6, r7, r6\n\t"
  81263. "lsr r7, r6, #16\n\t"
  81264. "lsl r6, r6, #16\n\t"
  81265. "adds r5, r5, r6\n\t"
  81266. "adcs r3, r3, r7\n\t"
  81267. "adc r4, r4, #0\n\t"
  81268. "lsr r6, r8, #16\n\t"
  81269. "lsr r7, r9, #16\n\t"
  81270. "mul r7, r6, r7\n\t"
  81271. "adds r3, r3, r7\n\t"
  81272. "adc r4, r4, #0\n\t"
  81273. "lsl r7, r9, #16\n\t"
  81274. "lsr r7, r7, #16\n\t"
  81275. "mul r6, r7, r6\n\t"
  81276. "lsr r7, r6, #16\n\t"
  81277. "lsl r6, r6, #16\n\t"
  81278. "adds r5, r5, r6\n\t"
  81279. "adcs r3, r3, r7\n\t"
  81280. "adc r4, r4, #0\n\t"
  81281. #else
  81282. "umull r6, r7, r8, r9\n\t"
  81283. "adds r5, r5, r6\n\t"
  81284. "adcs r3, r3, r7\n\t"
  81285. "adc r4, r4, #0\n\t"
  81286. #endif
  81287. /* A[4] * B[7] */
  81288. "ldr r8, [%[a], #16]\n\t"
  81289. "ldr r9, [%[b], #28]\n\t"
  81290. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81291. "lsl r6, r8, #16\n\t"
  81292. "lsl r7, r9, #16\n\t"
  81293. "lsr r6, r6, #16\n\t"
  81294. "lsr r7, r7, #16\n\t"
  81295. "mul r7, r6, r7\n\t"
  81296. "adds r5, r5, r7\n\t"
  81297. "adcs r3, r3, #0\n\t"
  81298. "adc r4, r4, #0\n\t"
  81299. "lsr r7, r9, #16\n\t"
  81300. "mul r6, r7, r6\n\t"
  81301. "lsr r7, r6, #16\n\t"
  81302. "lsl r6, r6, #16\n\t"
  81303. "adds r5, r5, r6\n\t"
  81304. "adcs r3, r3, r7\n\t"
  81305. "adc r4, r4, #0\n\t"
  81306. "lsr r6, r8, #16\n\t"
  81307. "lsr r7, r9, #16\n\t"
  81308. "mul r7, r6, r7\n\t"
  81309. "adds r3, r3, r7\n\t"
  81310. "adc r4, r4, #0\n\t"
  81311. "lsl r7, r9, #16\n\t"
  81312. "lsr r7, r7, #16\n\t"
  81313. "mul r6, r7, r6\n\t"
  81314. "lsr r7, r6, #16\n\t"
  81315. "lsl r6, r6, #16\n\t"
  81316. "adds r5, r5, r6\n\t"
  81317. "adcs r3, r3, r7\n\t"
  81318. "adc r4, r4, #0\n\t"
  81319. #else
  81320. "umull r6, r7, r8, r9\n\t"
  81321. "adds r5, r5, r6\n\t"
  81322. "adcs r3, r3, r7\n\t"
  81323. "adc r4, r4, #0\n\t"
  81324. #endif
  81325. /* A[5] * B[6] */
  81326. "ldr r9, [%[b], #24]\n\t"
  81327. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81328. "lsl r6, r11, #16\n\t"
  81329. "lsl r7, r9, #16\n\t"
  81330. "lsr r6, r6, #16\n\t"
  81331. "lsr r7, r7, #16\n\t"
  81332. "mul r7, r6, r7\n\t"
  81333. "adds r5, r5, r7\n\t"
  81334. "adcs r3, r3, #0\n\t"
  81335. "adc r4, r4, #0\n\t"
  81336. "lsr r7, r9, #16\n\t"
  81337. "mul r6, r7, r6\n\t"
  81338. "lsr r7, r6, #16\n\t"
  81339. "lsl r6, r6, #16\n\t"
  81340. "adds r5, r5, r6\n\t"
  81341. "adcs r3, r3, r7\n\t"
  81342. "adc r4, r4, #0\n\t"
  81343. "lsr r6, r11, #16\n\t"
  81344. "lsr r7, r9, #16\n\t"
  81345. "mul r7, r6, r7\n\t"
  81346. "adds r3, r3, r7\n\t"
  81347. "adc r4, r4, #0\n\t"
  81348. "lsl r7, r9, #16\n\t"
  81349. "lsr r7, r7, #16\n\t"
  81350. "mul r6, r7, r6\n\t"
  81351. "lsr r7, r6, #16\n\t"
  81352. "lsl r6, r6, #16\n\t"
  81353. "adds r5, r5, r6\n\t"
  81354. "adcs r3, r3, r7\n\t"
  81355. "adc r4, r4, #0\n\t"
  81356. #else
  81357. "umull r6, r7, r11, r9\n\t"
  81358. "adds r5, r5, r6\n\t"
  81359. "adcs r3, r3, r7\n\t"
  81360. "adc r4, r4, #0\n\t"
  81361. #endif
  81362. /* A[6] * B[5] */
  81363. "ldr r8, [%[a], #24]\n\t"
  81364. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81365. "lsl r6, r8, #16\n\t"
  81366. "lsl r7, r12, #16\n\t"
  81367. "lsr r6, r6, #16\n\t"
  81368. "lsr r7, r7, #16\n\t"
  81369. "mul r7, r6, r7\n\t"
  81370. "adds r5, r5, r7\n\t"
  81371. "adcs r3, r3, #0\n\t"
  81372. "adc r4, r4, #0\n\t"
  81373. "lsr r7, r12, #16\n\t"
  81374. "mul r6, r7, r6\n\t"
  81375. "lsr r7, r6, #16\n\t"
  81376. "lsl r6, r6, #16\n\t"
  81377. "adds r5, r5, r6\n\t"
  81378. "adcs r3, r3, r7\n\t"
  81379. "adc r4, r4, #0\n\t"
  81380. "lsr r6, r8, #16\n\t"
  81381. "lsr r7, r12, #16\n\t"
  81382. "mul r7, r6, r7\n\t"
  81383. "adds r3, r3, r7\n\t"
  81384. "adc r4, r4, #0\n\t"
  81385. "lsl r7, r12, #16\n\t"
  81386. "lsr r7, r7, #16\n\t"
  81387. "mul r6, r7, r6\n\t"
  81388. "lsr r7, r6, #16\n\t"
  81389. "lsl r6, r6, #16\n\t"
  81390. "adds r5, r5, r6\n\t"
  81391. "adcs r3, r3, r7\n\t"
  81392. "adc r4, r4, #0\n\t"
  81393. #else
  81394. "umull r6, r7, r8, r12\n\t"
  81395. "adds r5, r5, r6\n\t"
  81396. "adcs r3, r3, r7\n\t"
  81397. "adc r4, r4, #0\n\t"
  81398. #endif
  81399. /* A[7] * B[4] */
  81400. "ldr r8, [%[a], #28]\n\t"
  81401. "ldr r9, [%[b], #16]\n\t"
  81402. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81403. "lsl r6, r8, #16\n\t"
  81404. "lsl r7, r9, #16\n\t"
  81405. "lsr r6, r6, #16\n\t"
  81406. "lsr r7, r7, #16\n\t"
  81407. "mul r7, r6, r7\n\t"
  81408. "adds r5, r5, r7\n\t"
  81409. "adcs r3, r3, #0\n\t"
  81410. "adc r4, r4, #0\n\t"
  81411. "lsr r7, r9, #16\n\t"
  81412. "mul r6, r7, r6\n\t"
  81413. "lsr r7, r6, #16\n\t"
  81414. "lsl r6, r6, #16\n\t"
  81415. "adds r5, r5, r6\n\t"
  81416. "adcs r3, r3, r7\n\t"
  81417. "adc r4, r4, #0\n\t"
  81418. "lsr r6, r8, #16\n\t"
  81419. "lsr r7, r9, #16\n\t"
  81420. "mul r7, r6, r7\n\t"
  81421. "adds r3, r3, r7\n\t"
  81422. "adc r4, r4, #0\n\t"
  81423. "lsl r7, r9, #16\n\t"
  81424. "lsr r7, r7, #16\n\t"
  81425. "mul r6, r7, r6\n\t"
  81426. "lsr r7, r6, #16\n\t"
  81427. "lsl r6, r6, #16\n\t"
  81428. "adds r5, r5, r6\n\t"
  81429. "adcs r3, r3, r7\n\t"
  81430. "adc r4, r4, #0\n\t"
  81431. #else
  81432. "umull r6, r7, r8, r9\n\t"
  81433. "adds r5, r5, r6\n\t"
  81434. "adcs r3, r3, r7\n\t"
  81435. "adc r4, r4, #0\n\t"
  81436. #endif
  81437. /* A[8] * B[3] */
  81438. "ldr r8, [%[a], #32]\n\t"
  81439. "ldr r9, [%[b], #12]\n\t"
  81440. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81441. "lsl r6, r8, #16\n\t"
  81442. "lsl r7, r9, #16\n\t"
  81443. "lsr r6, r6, #16\n\t"
  81444. "lsr r7, r7, #16\n\t"
  81445. "mul r7, r6, r7\n\t"
  81446. "adds r5, r5, r7\n\t"
  81447. "adcs r3, r3, #0\n\t"
  81448. "adc r4, r4, #0\n\t"
  81449. "lsr r7, r9, #16\n\t"
  81450. "mul r6, r7, r6\n\t"
  81451. "lsr r7, r6, #16\n\t"
  81452. "lsl r6, r6, #16\n\t"
  81453. "adds r5, r5, r6\n\t"
  81454. "adcs r3, r3, r7\n\t"
  81455. "adc r4, r4, #0\n\t"
  81456. "lsr r6, r8, #16\n\t"
  81457. "lsr r7, r9, #16\n\t"
  81458. "mul r7, r6, r7\n\t"
  81459. "adds r3, r3, r7\n\t"
  81460. "adc r4, r4, #0\n\t"
  81461. "lsl r7, r9, #16\n\t"
  81462. "lsr r7, r7, #16\n\t"
  81463. "mul r6, r7, r6\n\t"
  81464. "lsr r7, r6, #16\n\t"
  81465. "lsl r6, r6, #16\n\t"
  81466. "adds r5, r5, r6\n\t"
  81467. "adcs r3, r3, r7\n\t"
  81468. "adc r4, r4, #0\n\t"
  81469. #else
  81470. "umull r6, r7, r8, r9\n\t"
  81471. "adds r5, r5, r6\n\t"
  81472. "adcs r3, r3, r7\n\t"
  81473. "adc r4, r4, #0\n\t"
  81474. #endif
  81475. /* A[9] * B[2] */
  81476. "ldr r8, [%[a], #36]\n\t"
  81477. "ldr r9, [%[b], #8]\n\t"
  81478. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81479. "lsl r6, r8, #16\n\t"
  81480. "lsl r7, r9, #16\n\t"
  81481. "lsr r6, r6, #16\n\t"
  81482. "lsr r7, r7, #16\n\t"
  81483. "mul r7, r6, r7\n\t"
  81484. "adds r5, r5, r7\n\t"
  81485. "adcs r3, r3, #0\n\t"
  81486. "adc r4, r4, #0\n\t"
  81487. "lsr r7, r9, #16\n\t"
  81488. "mul r6, r7, r6\n\t"
  81489. "lsr r7, r6, #16\n\t"
  81490. "lsl r6, r6, #16\n\t"
  81491. "adds r5, r5, r6\n\t"
  81492. "adcs r3, r3, r7\n\t"
  81493. "adc r4, r4, #0\n\t"
  81494. "lsr r6, r8, #16\n\t"
  81495. "lsr r7, r9, #16\n\t"
  81496. "mul r7, r6, r7\n\t"
  81497. "adds r3, r3, r7\n\t"
  81498. "adc r4, r4, #0\n\t"
  81499. "lsl r7, r9, #16\n\t"
  81500. "lsr r7, r7, #16\n\t"
  81501. "mul r6, r7, r6\n\t"
  81502. "lsr r7, r6, #16\n\t"
  81503. "lsl r6, r6, #16\n\t"
  81504. "adds r5, r5, r6\n\t"
  81505. "adcs r3, r3, r7\n\t"
  81506. "adc r4, r4, #0\n\t"
  81507. #else
  81508. "umull r6, r7, r8, r9\n\t"
  81509. "adds r5, r5, r6\n\t"
  81510. "adcs r3, r3, r7\n\t"
  81511. "adc r4, r4, #0\n\t"
  81512. #endif
  81513. /* A[10] * B[1] */
  81514. "ldr r8, [%[a], #40]\n\t"
  81515. "ldr r9, [%[b], #4]\n\t"
  81516. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81517. "lsl r6, r8, #16\n\t"
  81518. "lsl r7, r9, #16\n\t"
  81519. "lsr r6, r6, #16\n\t"
  81520. "lsr r7, r7, #16\n\t"
  81521. "mul r7, r6, r7\n\t"
  81522. "adds r5, r5, r7\n\t"
  81523. "adcs r3, r3, #0\n\t"
  81524. "adc r4, r4, #0\n\t"
  81525. "lsr r7, r9, #16\n\t"
  81526. "mul r6, r7, r6\n\t"
  81527. "lsr r7, r6, #16\n\t"
  81528. "lsl r6, r6, #16\n\t"
  81529. "adds r5, r5, r6\n\t"
  81530. "adcs r3, r3, r7\n\t"
  81531. "adc r4, r4, #0\n\t"
  81532. "lsr r6, r8, #16\n\t"
  81533. "lsr r7, r9, #16\n\t"
  81534. "mul r7, r6, r7\n\t"
  81535. "adds r3, r3, r7\n\t"
  81536. "adc r4, r4, #0\n\t"
  81537. "lsl r7, r9, #16\n\t"
  81538. "lsr r7, r7, #16\n\t"
  81539. "mul r6, r7, r6\n\t"
  81540. "lsr r7, r6, #16\n\t"
  81541. "lsl r6, r6, #16\n\t"
  81542. "adds r5, r5, r6\n\t"
  81543. "adcs r3, r3, r7\n\t"
  81544. "adc r4, r4, #0\n\t"
  81545. #else
  81546. "umull r6, r7, r8, r9\n\t"
  81547. "adds r5, r5, r6\n\t"
  81548. "adcs r3, r3, r7\n\t"
  81549. "adc r4, r4, #0\n\t"
  81550. #endif
  81551. /* A[11] * B[0] */
  81552. "ldr r8, [%[a], #44]\n\t"
  81553. "ldr r9, [%[b]]\n\t"
  81554. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81555. "lsl r6, r8, #16\n\t"
  81556. "lsl r7, r9, #16\n\t"
  81557. "lsr r6, r6, #16\n\t"
  81558. "lsr r7, r7, #16\n\t"
  81559. "mul r7, r6, r7\n\t"
  81560. "adds r5, r5, r7\n\t"
  81561. "adcs r3, r3, #0\n\t"
  81562. "adc r4, r4, #0\n\t"
  81563. "lsr r7, r9, #16\n\t"
  81564. "mul r6, r7, r6\n\t"
  81565. "lsr r7, r6, #16\n\t"
  81566. "lsl r6, r6, #16\n\t"
  81567. "adds r5, r5, r6\n\t"
  81568. "adcs r3, r3, r7\n\t"
  81569. "adc r4, r4, #0\n\t"
  81570. "lsr r6, r8, #16\n\t"
  81571. "lsr r7, r9, #16\n\t"
  81572. "mul r7, r6, r7\n\t"
  81573. "adds r3, r3, r7\n\t"
  81574. "adc r4, r4, #0\n\t"
  81575. "lsl r7, r9, #16\n\t"
  81576. "lsr r7, r7, #16\n\t"
  81577. "mul r6, r7, r6\n\t"
  81578. "lsr r7, r6, #16\n\t"
  81579. "lsl r6, r6, #16\n\t"
  81580. "adds r5, r5, r6\n\t"
  81581. "adcs r3, r3, r7\n\t"
  81582. "adc r4, r4, #0\n\t"
  81583. #else
  81584. "umull r6, r7, r8, r9\n\t"
  81585. "adds r5, r5, r6\n\t"
  81586. "adcs r3, r3, r7\n\t"
  81587. "adc r4, r4, #0\n\t"
  81588. #endif
  81589. "str r5, [sp, #44]\n\t"
  81590. /* A[11] * B[1] */
  81591. "ldr r9, [%[b], #4]\n\t"
  81592. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81593. "lsl r6, r8, #16\n\t"
  81594. "lsl r7, r9, #16\n\t"
  81595. "lsr r6, r6, #16\n\t"
  81596. "lsr r7, r7, #16\n\t"
  81597. "mul r7, r6, r7\n\t"
  81598. "adds r3, r3, r7\n\t"
  81599. "adcs r4, r4, #0\n\t"
  81600. "mov r5, #0\n\t"
  81601. "adc r5, r5, #0\n\t"
  81602. "lsr r7, r9, #16\n\t"
  81603. "mul r6, r7, r6\n\t"
  81604. "lsr r7, r6, #16\n\t"
  81605. "lsl r6, r6, #16\n\t"
  81606. "adds r3, r3, r6\n\t"
  81607. "adcs r4, r4, r7\n\t"
  81608. "adc r5, r5, #0\n\t"
  81609. "lsr r6, r8, #16\n\t"
  81610. "lsr r7, r9, #16\n\t"
  81611. "mul r7, r6, r7\n\t"
  81612. "adds r4, r4, r7\n\t"
  81613. "adc r5, r5, #0\n\t"
  81614. "lsl r7, r9, #16\n\t"
  81615. "lsr r7, r7, #16\n\t"
  81616. "mul r6, r7, r6\n\t"
  81617. "lsr r7, r6, #16\n\t"
  81618. "lsl r6, r6, #16\n\t"
  81619. "adds r3, r3, r6\n\t"
  81620. "adcs r4, r4, r7\n\t"
  81621. "adc r5, r5, #0\n\t"
  81622. #else
  81623. "umull r6, r7, r8, r9\n\t"
  81624. "adds r3, r3, r6\n\t"
  81625. "adcs r4, r4, r7\n\t"
  81626. "mov r5, #0\n\t"
  81627. "adc r5, r5, #0\n\t"
  81628. #endif
  81629. /* A[10] * B[2] */
  81630. "ldr r8, [%[a], #40]\n\t"
  81631. "ldr r9, [%[b], #8]\n\t"
  81632. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81633. "lsl r6, r8, #16\n\t"
  81634. "lsl r7, r9, #16\n\t"
  81635. "lsr r6, r6, #16\n\t"
  81636. "lsr r7, r7, #16\n\t"
  81637. "mul r7, r6, r7\n\t"
  81638. "adds r3, r3, r7\n\t"
  81639. "adcs r4, r4, #0\n\t"
  81640. "adc r5, r5, #0\n\t"
  81641. "lsr r7, r9, #16\n\t"
  81642. "mul r6, r7, r6\n\t"
  81643. "lsr r7, r6, #16\n\t"
  81644. "lsl r6, r6, #16\n\t"
  81645. "adds r3, r3, r6\n\t"
  81646. "adcs r4, r4, r7\n\t"
  81647. "adc r5, r5, #0\n\t"
  81648. "lsr r6, r8, #16\n\t"
  81649. "lsr r7, r9, #16\n\t"
  81650. "mul r7, r6, r7\n\t"
  81651. "adds r4, r4, r7\n\t"
  81652. "adc r5, r5, #0\n\t"
  81653. "lsl r7, r9, #16\n\t"
  81654. "lsr r7, r7, #16\n\t"
  81655. "mul r6, r7, r6\n\t"
  81656. "lsr r7, r6, #16\n\t"
  81657. "lsl r6, r6, #16\n\t"
  81658. "adds r3, r3, r6\n\t"
  81659. "adcs r4, r4, r7\n\t"
  81660. "adc r5, r5, #0\n\t"
  81661. #else
  81662. "umull r6, r7, r8, r9\n\t"
  81663. "adds r3, r3, r6\n\t"
  81664. "adcs r4, r4, r7\n\t"
  81665. "adc r5, r5, #0\n\t"
  81666. #endif
  81667. /* A[9] * B[3] */
  81668. "ldr r8, [%[a], #36]\n\t"
  81669. "ldr r9, [%[b], #12]\n\t"
  81670. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81671. "lsl r6, r8, #16\n\t"
  81672. "lsl r7, r9, #16\n\t"
  81673. "lsr r6, r6, #16\n\t"
  81674. "lsr r7, r7, #16\n\t"
  81675. "mul r7, r6, r7\n\t"
  81676. "adds r3, r3, r7\n\t"
  81677. "adcs r4, r4, #0\n\t"
  81678. "adc r5, r5, #0\n\t"
  81679. "lsr r7, r9, #16\n\t"
  81680. "mul r6, r7, r6\n\t"
  81681. "lsr r7, r6, #16\n\t"
  81682. "lsl r6, r6, #16\n\t"
  81683. "adds r3, r3, r6\n\t"
  81684. "adcs r4, r4, r7\n\t"
  81685. "adc r5, r5, #0\n\t"
  81686. "lsr r6, r8, #16\n\t"
  81687. "lsr r7, r9, #16\n\t"
  81688. "mul r7, r6, r7\n\t"
  81689. "adds r4, r4, r7\n\t"
  81690. "adc r5, r5, #0\n\t"
  81691. "lsl r7, r9, #16\n\t"
  81692. "lsr r7, r7, #16\n\t"
  81693. "mul r6, r7, r6\n\t"
  81694. "lsr r7, r6, #16\n\t"
  81695. "lsl r6, r6, #16\n\t"
  81696. "adds r3, r3, r6\n\t"
  81697. "adcs r4, r4, r7\n\t"
  81698. "adc r5, r5, #0\n\t"
  81699. #else
  81700. "umull r6, r7, r8, r9\n\t"
  81701. "adds r3, r3, r6\n\t"
  81702. "adcs r4, r4, r7\n\t"
  81703. "adc r5, r5, #0\n\t"
  81704. #endif
  81705. /* A[8] * B[4] */
  81706. "ldr r8, [%[a], #32]\n\t"
  81707. "ldr r9, [%[b], #16]\n\t"
  81708. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81709. "lsl r6, r8, #16\n\t"
  81710. "lsl r7, r9, #16\n\t"
  81711. "lsr r6, r6, #16\n\t"
  81712. "lsr r7, r7, #16\n\t"
  81713. "mul r7, r6, r7\n\t"
  81714. "adds r3, r3, r7\n\t"
  81715. "adcs r4, r4, #0\n\t"
  81716. "adc r5, r5, #0\n\t"
  81717. "lsr r7, r9, #16\n\t"
  81718. "mul r6, r7, r6\n\t"
  81719. "lsr r7, r6, #16\n\t"
  81720. "lsl r6, r6, #16\n\t"
  81721. "adds r3, r3, r6\n\t"
  81722. "adcs r4, r4, r7\n\t"
  81723. "adc r5, r5, #0\n\t"
  81724. "lsr r6, r8, #16\n\t"
  81725. "lsr r7, r9, #16\n\t"
  81726. "mul r7, r6, r7\n\t"
  81727. "adds r4, r4, r7\n\t"
  81728. "adc r5, r5, #0\n\t"
  81729. "lsl r7, r9, #16\n\t"
  81730. "lsr r7, r7, #16\n\t"
  81731. "mul r6, r7, r6\n\t"
  81732. "lsr r7, r6, #16\n\t"
  81733. "lsl r6, r6, #16\n\t"
  81734. "adds r3, r3, r6\n\t"
  81735. "adcs r4, r4, r7\n\t"
  81736. "adc r5, r5, #0\n\t"
  81737. #else
  81738. "umull r6, r7, r8, r9\n\t"
  81739. "adds r3, r3, r6\n\t"
  81740. "adcs r4, r4, r7\n\t"
  81741. "adc r5, r5, #0\n\t"
  81742. #endif
  81743. /* A[7] * B[5] */
  81744. "ldr r8, [%[a], #28]\n\t"
  81745. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81746. "lsl r6, r8, #16\n\t"
  81747. "lsl r7, r12, #16\n\t"
  81748. "lsr r6, r6, #16\n\t"
  81749. "lsr r7, r7, #16\n\t"
  81750. "mul r7, r6, r7\n\t"
  81751. "adds r3, r3, r7\n\t"
  81752. "adcs r4, r4, #0\n\t"
  81753. "adc r5, r5, #0\n\t"
  81754. "lsr r7, r12, #16\n\t"
  81755. "mul r6, r7, r6\n\t"
  81756. "lsr r7, r6, #16\n\t"
  81757. "lsl r6, r6, #16\n\t"
  81758. "adds r3, r3, r6\n\t"
  81759. "adcs r4, r4, r7\n\t"
  81760. "adc r5, r5, #0\n\t"
  81761. "lsr r6, r8, #16\n\t"
  81762. "lsr r7, r12, #16\n\t"
  81763. "mul r7, r6, r7\n\t"
  81764. "adds r4, r4, r7\n\t"
  81765. "adc r5, r5, #0\n\t"
  81766. "lsl r7, r12, #16\n\t"
  81767. "lsr r7, r7, #16\n\t"
  81768. "mul r6, r7, r6\n\t"
  81769. "lsr r7, r6, #16\n\t"
  81770. "lsl r6, r6, #16\n\t"
  81771. "adds r3, r3, r6\n\t"
  81772. "adcs r4, r4, r7\n\t"
  81773. "adc r5, r5, #0\n\t"
  81774. #else
  81775. "umull r6, r7, r8, r12\n\t"
  81776. "adds r3, r3, r6\n\t"
  81777. "adcs r4, r4, r7\n\t"
  81778. "adc r5, r5, #0\n\t"
  81779. #endif
  81780. /* A[6] * B[6] */
  81781. "ldr r11, [%[a], #24]\n\t"
  81782. "ldr r12, [%[b], #24]\n\t"
  81783. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81784. "lsl r6, r11, #16\n\t"
  81785. "lsl r7, r12, #16\n\t"
  81786. "lsr r6, r6, #16\n\t"
  81787. "lsr r7, r7, #16\n\t"
  81788. "mul r7, r6, r7\n\t"
  81789. "adds r3, r3, r7\n\t"
  81790. "adcs r4, r4, #0\n\t"
  81791. "adc r5, r5, #0\n\t"
  81792. "lsr r7, r12, #16\n\t"
  81793. "mul r6, r7, r6\n\t"
  81794. "lsr r7, r6, #16\n\t"
  81795. "lsl r6, r6, #16\n\t"
  81796. "adds r3, r3, r6\n\t"
  81797. "adcs r4, r4, r7\n\t"
  81798. "adc r5, r5, #0\n\t"
  81799. "lsr r6, r11, #16\n\t"
  81800. "lsr r7, r12, #16\n\t"
  81801. "mul r7, r6, r7\n\t"
  81802. "adds r4, r4, r7\n\t"
  81803. "adc r5, r5, #0\n\t"
  81804. "lsl r7, r12, #16\n\t"
  81805. "lsr r7, r7, #16\n\t"
  81806. "mul r6, r7, r6\n\t"
  81807. "lsr r7, r6, #16\n\t"
  81808. "lsl r6, r6, #16\n\t"
  81809. "adds r3, r3, r6\n\t"
  81810. "adcs r4, r4, r7\n\t"
  81811. "adc r5, r5, #0\n\t"
  81812. #else
  81813. "umull r6, r7, r11, r12\n\t"
  81814. "adds r3, r3, r6\n\t"
  81815. "adcs r4, r4, r7\n\t"
  81816. "adc r5, r5, #0\n\t"
  81817. #endif
  81818. /* A[5] * B[7] */
  81819. "ldr r8, [%[a], #20]\n\t"
  81820. "ldr r9, [%[b], #28]\n\t"
  81821. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81822. "lsl r6, r8, #16\n\t"
  81823. "lsl r7, r9, #16\n\t"
  81824. "lsr r6, r6, #16\n\t"
  81825. "lsr r7, r7, #16\n\t"
  81826. "mul r7, r6, r7\n\t"
  81827. "adds r3, r3, r7\n\t"
  81828. "adcs r4, r4, #0\n\t"
  81829. "adc r5, r5, #0\n\t"
  81830. "lsr r7, r9, #16\n\t"
  81831. "mul r6, r7, r6\n\t"
  81832. "lsr r7, r6, #16\n\t"
  81833. "lsl r6, r6, #16\n\t"
  81834. "adds r3, r3, r6\n\t"
  81835. "adcs r4, r4, r7\n\t"
  81836. "adc r5, r5, #0\n\t"
  81837. "lsr r6, r8, #16\n\t"
  81838. "lsr r7, r9, #16\n\t"
  81839. "mul r7, r6, r7\n\t"
  81840. "adds r4, r4, r7\n\t"
  81841. "adc r5, r5, #0\n\t"
  81842. "lsl r7, r9, #16\n\t"
  81843. "lsr r7, r7, #16\n\t"
  81844. "mul r6, r7, r6\n\t"
  81845. "lsr r7, r6, #16\n\t"
  81846. "lsl r6, r6, #16\n\t"
  81847. "adds r3, r3, r6\n\t"
  81848. "adcs r4, r4, r7\n\t"
  81849. "adc r5, r5, #0\n\t"
  81850. #else
  81851. "umull r6, r7, r8, r9\n\t"
  81852. "adds r3, r3, r6\n\t"
  81853. "adcs r4, r4, r7\n\t"
  81854. "adc r5, r5, #0\n\t"
  81855. #endif
  81856. /* A[4] * B[8] */
  81857. "ldr r8, [%[a], #16]\n\t"
  81858. "ldr r9, [%[b], #32]\n\t"
  81859. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81860. "lsl r6, r8, #16\n\t"
  81861. "lsl r7, r9, #16\n\t"
  81862. "lsr r6, r6, #16\n\t"
  81863. "lsr r7, r7, #16\n\t"
  81864. "mul r7, r6, r7\n\t"
  81865. "adds r3, r3, r7\n\t"
  81866. "adcs r4, r4, #0\n\t"
  81867. "adc r5, r5, #0\n\t"
  81868. "lsr r7, r9, #16\n\t"
  81869. "mul r6, r7, r6\n\t"
  81870. "lsr r7, r6, #16\n\t"
  81871. "lsl r6, r6, #16\n\t"
  81872. "adds r3, r3, r6\n\t"
  81873. "adcs r4, r4, r7\n\t"
  81874. "adc r5, r5, #0\n\t"
  81875. "lsr r6, r8, #16\n\t"
  81876. "lsr r7, r9, #16\n\t"
  81877. "mul r7, r6, r7\n\t"
  81878. "adds r4, r4, r7\n\t"
  81879. "adc r5, r5, #0\n\t"
  81880. "lsl r7, r9, #16\n\t"
  81881. "lsr r7, r7, #16\n\t"
  81882. "mul r6, r7, r6\n\t"
  81883. "lsr r7, r6, #16\n\t"
  81884. "lsl r6, r6, #16\n\t"
  81885. "adds r3, r3, r6\n\t"
  81886. "adcs r4, r4, r7\n\t"
  81887. "adc r5, r5, #0\n\t"
  81888. #else
  81889. "umull r6, r7, r8, r9\n\t"
  81890. "adds r3, r3, r6\n\t"
  81891. "adcs r4, r4, r7\n\t"
  81892. "adc r5, r5, #0\n\t"
  81893. #endif
  81894. /* A[3] * B[9] */
  81895. "ldr r8, [%[a], #12]\n\t"
  81896. "ldr r9, [%[b], #36]\n\t"
  81897. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81898. "lsl r6, r8, #16\n\t"
  81899. "lsl r7, r9, #16\n\t"
  81900. "lsr r6, r6, #16\n\t"
  81901. "lsr r7, r7, #16\n\t"
  81902. "mul r7, r6, r7\n\t"
  81903. "adds r3, r3, r7\n\t"
  81904. "adcs r4, r4, #0\n\t"
  81905. "adc r5, r5, #0\n\t"
  81906. "lsr r7, r9, #16\n\t"
  81907. "mul r6, r7, r6\n\t"
  81908. "lsr r7, r6, #16\n\t"
  81909. "lsl r6, r6, #16\n\t"
  81910. "adds r3, r3, r6\n\t"
  81911. "adcs r4, r4, r7\n\t"
  81912. "adc r5, r5, #0\n\t"
  81913. "lsr r6, r8, #16\n\t"
  81914. "lsr r7, r9, #16\n\t"
  81915. "mul r7, r6, r7\n\t"
  81916. "adds r4, r4, r7\n\t"
  81917. "adc r5, r5, #0\n\t"
  81918. "lsl r7, r9, #16\n\t"
  81919. "lsr r7, r7, #16\n\t"
  81920. "mul r6, r7, r6\n\t"
  81921. "lsr r7, r6, #16\n\t"
  81922. "lsl r6, r6, #16\n\t"
  81923. "adds r3, r3, r6\n\t"
  81924. "adcs r4, r4, r7\n\t"
  81925. "adc r5, r5, #0\n\t"
  81926. #else
  81927. "umull r6, r7, r8, r9\n\t"
  81928. "adds r3, r3, r6\n\t"
  81929. "adcs r4, r4, r7\n\t"
  81930. "adc r5, r5, #0\n\t"
  81931. #endif
  81932. /* A[2] * B[10] */
  81933. "ldr r8, [%[a], #8]\n\t"
  81934. "ldr r9, [%[b], #40]\n\t"
  81935. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81936. "lsl r6, r8, #16\n\t"
  81937. "lsl r7, r9, #16\n\t"
  81938. "lsr r6, r6, #16\n\t"
  81939. "lsr r7, r7, #16\n\t"
  81940. "mul r7, r6, r7\n\t"
  81941. "adds r3, r3, r7\n\t"
  81942. "adcs r4, r4, #0\n\t"
  81943. "adc r5, r5, #0\n\t"
  81944. "lsr r7, r9, #16\n\t"
  81945. "mul r6, r7, r6\n\t"
  81946. "lsr r7, r6, #16\n\t"
  81947. "lsl r6, r6, #16\n\t"
  81948. "adds r3, r3, r6\n\t"
  81949. "adcs r4, r4, r7\n\t"
  81950. "adc r5, r5, #0\n\t"
  81951. "lsr r6, r8, #16\n\t"
  81952. "lsr r7, r9, #16\n\t"
  81953. "mul r7, r6, r7\n\t"
  81954. "adds r4, r4, r7\n\t"
  81955. "adc r5, r5, #0\n\t"
  81956. "lsl r7, r9, #16\n\t"
  81957. "lsr r7, r7, #16\n\t"
  81958. "mul r6, r7, r6\n\t"
  81959. "lsr r7, r6, #16\n\t"
  81960. "lsl r6, r6, #16\n\t"
  81961. "adds r3, r3, r6\n\t"
  81962. "adcs r4, r4, r7\n\t"
  81963. "adc r5, r5, #0\n\t"
  81964. #else
  81965. "umull r6, r7, r8, r9\n\t"
  81966. "adds r3, r3, r6\n\t"
  81967. "adcs r4, r4, r7\n\t"
  81968. "adc r5, r5, #0\n\t"
  81969. #endif
  81970. /* A[1] * B[11] */
  81971. "ldr r8, [%[a], #4]\n\t"
  81972. "ldr r9, [%[b], #44]\n\t"
  81973. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  81974. "lsl r6, r8, #16\n\t"
  81975. "lsl r7, r9, #16\n\t"
  81976. "lsr r6, r6, #16\n\t"
  81977. "lsr r7, r7, #16\n\t"
  81978. "mul r7, r6, r7\n\t"
  81979. "adds r3, r3, r7\n\t"
  81980. "adcs r4, r4, #0\n\t"
  81981. "adc r5, r5, #0\n\t"
  81982. "lsr r7, r9, #16\n\t"
  81983. "mul r6, r7, r6\n\t"
  81984. "lsr r7, r6, #16\n\t"
  81985. "lsl r6, r6, #16\n\t"
  81986. "adds r3, r3, r6\n\t"
  81987. "adcs r4, r4, r7\n\t"
  81988. "adc r5, r5, #0\n\t"
  81989. "lsr r6, r8, #16\n\t"
  81990. "lsr r7, r9, #16\n\t"
  81991. "mul r7, r6, r7\n\t"
  81992. "adds r4, r4, r7\n\t"
  81993. "adc r5, r5, #0\n\t"
  81994. "lsl r7, r9, #16\n\t"
  81995. "lsr r7, r7, #16\n\t"
  81996. "mul r6, r7, r6\n\t"
  81997. "lsr r7, r6, #16\n\t"
  81998. "lsl r6, r6, #16\n\t"
  81999. "adds r3, r3, r6\n\t"
  82000. "adcs r4, r4, r7\n\t"
  82001. "adc r5, r5, #0\n\t"
  82002. #else
  82003. "umull r6, r7, r8, r9\n\t"
  82004. "adds r3, r3, r6\n\t"
  82005. "adcs r4, r4, r7\n\t"
  82006. "adc r5, r5, #0\n\t"
  82007. #endif
  82008. "str r3, [%[r], #48]\n\t"
  82009. /* A[2] * B[11] */
  82010. "ldr r8, [%[a], #8]\n\t"
  82011. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82012. "lsl r6, r8, #16\n\t"
  82013. "lsl r7, r9, #16\n\t"
  82014. "lsr r6, r6, #16\n\t"
  82015. "lsr r7, r7, #16\n\t"
  82016. "mul r7, r6, r7\n\t"
  82017. "adds r4, r4, r7\n\t"
  82018. "adcs r5, r5, #0\n\t"
  82019. "mov r3, #0\n\t"
  82020. "adc r3, r3, #0\n\t"
  82021. "lsr r7, r9, #16\n\t"
  82022. "mul r6, r7, r6\n\t"
  82023. "lsr r7, r6, #16\n\t"
  82024. "lsl r6, r6, #16\n\t"
  82025. "adds r4, r4, r6\n\t"
  82026. "adcs r5, r5, r7\n\t"
  82027. "adc r3, r3, #0\n\t"
  82028. "lsr r6, r8, #16\n\t"
  82029. "lsr r7, r9, #16\n\t"
  82030. "mul r7, r6, r7\n\t"
  82031. "adds r5, r5, r7\n\t"
  82032. "adc r3, r3, #0\n\t"
  82033. "lsl r7, r9, #16\n\t"
  82034. "lsr r7, r7, #16\n\t"
  82035. "mul r6, r7, r6\n\t"
  82036. "lsr r7, r6, #16\n\t"
  82037. "lsl r6, r6, #16\n\t"
  82038. "adds r4, r4, r6\n\t"
  82039. "adcs r5, r5, r7\n\t"
  82040. "adc r3, r3, #0\n\t"
  82041. #else
  82042. "umull r6, r7, r8, r9\n\t"
  82043. "adds r4, r4, r6\n\t"
  82044. "adcs r5, r5, r7\n\t"
  82045. "mov r3, #0\n\t"
  82046. "adc r3, r3, #0\n\t"
  82047. #endif
  82048. /* A[3] * B[10] */
  82049. "ldr r8, [%[a], #12]\n\t"
  82050. "ldr r9, [%[b], #40]\n\t"
  82051. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82052. "lsl r6, r8, #16\n\t"
  82053. "lsl r7, r9, #16\n\t"
  82054. "lsr r6, r6, #16\n\t"
  82055. "lsr r7, r7, #16\n\t"
  82056. "mul r7, r6, r7\n\t"
  82057. "adds r4, r4, r7\n\t"
  82058. "adcs r5, r5, #0\n\t"
  82059. "adc r3, r3, #0\n\t"
  82060. "lsr r7, r9, #16\n\t"
  82061. "mul r6, r7, r6\n\t"
  82062. "lsr r7, r6, #16\n\t"
  82063. "lsl r6, r6, #16\n\t"
  82064. "adds r4, r4, r6\n\t"
  82065. "adcs r5, r5, r7\n\t"
  82066. "adc r3, r3, #0\n\t"
  82067. "lsr r6, r8, #16\n\t"
  82068. "lsr r7, r9, #16\n\t"
  82069. "mul r7, r6, r7\n\t"
  82070. "adds r5, r5, r7\n\t"
  82071. "adc r3, r3, #0\n\t"
  82072. "lsl r7, r9, #16\n\t"
  82073. "lsr r7, r7, #16\n\t"
  82074. "mul r6, r7, r6\n\t"
  82075. "lsr r7, r6, #16\n\t"
  82076. "lsl r6, r6, #16\n\t"
  82077. "adds r4, r4, r6\n\t"
  82078. "adcs r5, r5, r7\n\t"
  82079. "adc r3, r3, #0\n\t"
  82080. #else
  82081. "umull r6, r7, r8, r9\n\t"
  82082. "adds r4, r4, r6\n\t"
  82083. "adcs r5, r5, r7\n\t"
  82084. "adc r3, r3, #0\n\t"
  82085. #endif
  82086. /* A[4] * B[9] */
  82087. "ldr r8, [%[a], #16]\n\t"
  82088. "ldr r9, [%[b], #36]\n\t"
  82089. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82090. "lsl r6, r8, #16\n\t"
  82091. "lsl r7, r9, #16\n\t"
  82092. "lsr r6, r6, #16\n\t"
  82093. "lsr r7, r7, #16\n\t"
  82094. "mul r7, r6, r7\n\t"
  82095. "adds r4, r4, r7\n\t"
  82096. "adcs r5, r5, #0\n\t"
  82097. "adc r3, r3, #0\n\t"
  82098. "lsr r7, r9, #16\n\t"
  82099. "mul r6, r7, r6\n\t"
  82100. "lsr r7, r6, #16\n\t"
  82101. "lsl r6, r6, #16\n\t"
  82102. "adds r4, r4, r6\n\t"
  82103. "adcs r5, r5, r7\n\t"
  82104. "adc r3, r3, #0\n\t"
  82105. "lsr r6, r8, #16\n\t"
  82106. "lsr r7, r9, #16\n\t"
  82107. "mul r7, r6, r7\n\t"
  82108. "adds r5, r5, r7\n\t"
  82109. "adc r3, r3, #0\n\t"
  82110. "lsl r7, r9, #16\n\t"
  82111. "lsr r7, r7, #16\n\t"
  82112. "mul r6, r7, r6\n\t"
  82113. "lsr r7, r6, #16\n\t"
  82114. "lsl r6, r6, #16\n\t"
  82115. "adds r4, r4, r6\n\t"
  82116. "adcs r5, r5, r7\n\t"
  82117. "adc r3, r3, #0\n\t"
  82118. #else
  82119. "umull r6, r7, r8, r9\n\t"
  82120. "adds r4, r4, r6\n\t"
  82121. "adcs r5, r5, r7\n\t"
  82122. "adc r3, r3, #0\n\t"
  82123. #endif
  82124. /* A[5] * B[8] */
  82125. "ldr r8, [%[a], #20]\n\t"
  82126. "ldr r9, [%[b], #32]\n\t"
  82127. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82128. "lsl r6, r8, #16\n\t"
  82129. "lsl r7, r9, #16\n\t"
  82130. "lsr r6, r6, #16\n\t"
  82131. "lsr r7, r7, #16\n\t"
  82132. "mul r7, r6, r7\n\t"
  82133. "adds r4, r4, r7\n\t"
  82134. "adcs r5, r5, #0\n\t"
  82135. "adc r3, r3, #0\n\t"
  82136. "lsr r7, r9, #16\n\t"
  82137. "mul r6, r7, r6\n\t"
  82138. "lsr r7, r6, #16\n\t"
  82139. "lsl r6, r6, #16\n\t"
  82140. "adds r4, r4, r6\n\t"
  82141. "adcs r5, r5, r7\n\t"
  82142. "adc r3, r3, #0\n\t"
  82143. "lsr r6, r8, #16\n\t"
  82144. "lsr r7, r9, #16\n\t"
  82145. "mul r7, r6, r7\n\t"
  82146. "adds r5, r5, r7\n\t"
  82147. "adc r3, r3, #0\n\t"
  82148. "lsl r7, r9, #16\n\t"
  82149. "lsr r7, r7, #16\n\t"
  82150. "mul r6, r7, r6\n\t"
  82151. "lsr r7, r6, #16\n\t"
  82152. "lsl r6, r6, #16\n\t"
  82153. "adds r4, r4, r6\n\t"
  82154. "adcs r5, r5, r7\n\t"
  82155. "adc r3, r3, #0\n\t"
  82156. #else
  82157. "umull r6, r7, r8, r9\n\t"
  82158. "adds r4, r4, r6\n\t"
  82159. "adcs r5, r5, r7\n\t"
  82160. "adc r3, r3, #0\n\t"
  82161. #endif
  82162. /* A[6] * B[7] */
  82163. "ldr r9, [%[b], #28]\n\t"
  82164. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82165. "lsl r6, r11, #16\n\t"
  82166. "lsl r7, r9, #16\n\t"
  82167. "lsr r6, r6, #16\n\t"
  82168. "lsr r7, r7, #16\n\t"
  82169. "mul r7, r6, r7\n\t"
  82170. "adds r4, r4, r7\n\t"
  82171. "adcs r5, r5, #0\n\t"
  82172. "adc r3, r3, #0\n\t"
  82173. "lsr r7, r9, #16\n\t"
  82174. "mul r6, r7, r6\n\t"
  82175. "lsr r7, r6, #16\n\t"
  82176. "lsl r6, r6, #16\n\t"
  82177. "adds r4, r4, r6\n\t"
  82178. "adcs r5, r5, r7\n\t"
  82179. "adc r3, r3, #0\n\t"
  82180. "lsr r6, r11, #16\n\t"
  82181. "lsr r7, r9, #16\n\t"
  82182. "mul r7, r6, r7\n\t"
  82183. "adds r5, r5, r7\n\t"
  82184. "adc r3, r3, #0\n\t"
  82185. "lsl r7, r9, #16\n\t"
  82186. "lsr r7, r7, #16\n\t"
  82187. "mul r6, r7, r6\n\t"
  82188. "lsr r7, r6, #16\n\t"
  82189. "lsl r6, r6, #16\n\t"
  82190. "adds r4, r4, r6\n\t"
  82191. "adcs r5, r5, r7\n\t"
  82192. "adc r3, r3, #0\n\t"
  82193. #else
  82194. "umull r6, r7, r11, r9\n\t"
  82195. "adds r4, r4, r6\n\t"
  82196. "adcs r5, r5, r7\n\t"
  82197. "adc r3, r3, #0\n\t"
  82198. #endif
  82199. /* A[7] * B[6] */
  82200. "ldr r8, [%[a], #28]\n\t"
  82201. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82202. "lsl r6, r8, #16\n\t"
  82203. "lsl r7, r12, #16\n\t"
  82204. "lsr r6, r6, #16\n\t"
  82205. "lsr r7, r7, #16\n\t"
  82206. "mul r7, r6, r7\n\t"
  82207. "adds r4, r4, r7\n\t"
  82208. "adcs r5, r5, #0\n\t"
  82209. "adc r3, r3, #0\n\t"
  82210. "lsr r7, r12, #16\n\t"
  82211. "mul r6, r7, r6\n\t"
  82212. "lsr r7, r6, #16\n\t"
  82213. "lsl r6, r6, #16\n\t"
  82214. "adds r4, r4, r6\n\t"
  82215. "adcs r5, r5, r7\n\t"
  82216. "adc r3, r3, #0\n\t"
  82217. "lsr r6, r8, #16\n\t"
  82218. "lsr r7, r12, #16\n\t"
  82219. "mul r7, r6, r7\n\t"
  82220. "adds r5, r5, r7\n\t"
  82221. "adc r3, r3, #0\n\t"
  82222. "lsl r7, r12, #16\n\t"
  82223. "lsr r7, r7, #16\n\t"
  82224. "mul r6, r7, r6\n\t"
  82225. "lsr r7, r6, #16\n\t"
  82226. "lsl r6, r6, #16\n\t"
  82227. "adds r4, r4, r6\n\t"
  82228. "adcs r5, r5, r7\n\t"
  82229. "adc r3, r3, #0\n\t"
  82230. #else
  82231. "umull r6, r7, r8, r12\n\t"
  82232. "adds r4, r4, r6\n\t"
  82233. "adcs r5, r5, r7\n\t"
  82234. "adc r3, r3, #0\n\t"
  82235. #endif
  82236. /* A[8] * B[5] */
  82237. "ldr r8, [%[a], #32]\n\t"
  82238. "ldr r9, [%[b], #20]\n\t"
  82239. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82240. "lsl r6, r8, #16\n\t"
  82241. "lsl r7, r9, #16\n\t"
  82242. "lsr r6, r6, #16\n\t"
  82243. "lsr r7, r7, #16\n\t"
  82244. "mul r7, r6, r7\n\t"
  82245. "adds r4, r4, r7\n\t"
  82246. "adcs r5, r5, #0\n\t"
  82247. "adc r3, r3, #0\n\t"
  82248. "lsr r7, r9, #16\n\t"
  82249. "mul r6, r7, r6\n\t"
  82250. "lsr r7, r6, #16\n\t"
  82251. "lsl r6, r6, #16\n\t"
  82252. "adds r4, r4, r6\n\t"
  82253. "adcs r5, r5, r7\n\t"
  82254. "adc r3, r3, #0\n\t"
  82255. "lsr r6, r8, #16\n\t"
  82256. "lsr r7, r9, #16\n\t"
  82257. "mul r7, r6, r7\n\t"
  82258. "adds r5, r5, r7\n\t"
  82259. "adc r3, r3, #0\n\t"
  82260. "lsl r7, r9, #16\n\t"
  82261. "lsr r7, r7, #16\n\t"
  82262. "mul r6, r7, r6\n\t"
  82263. "lsr r7, r6, #16\n\t"
  82264. "lsl r6, r6, #16\n\t"
  82265. "adds r4, r4, r6\n\t"
  82266. "adcs r5, r5, r7\n\t"
  82267. "adc r3, r3, #0\n\t"
  82268. #else
  82269. "umull r6, r7, r8, r9\n\t"
  82270. "adds r4, r4, r6\n\t"
  82271. "adcs r5, r5, r7\n\t"
  82272. "adc r3, r3, #0\n\t"
  82273. #endif
  82274. /* A[9] * B[4] */
  82275. "ldr r8, [%[a], #36]\n\t"
  82276. "ldr r9, [%[b], #16]\n\t"
  82277. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82278. "lsl r6, r8, #16\n\t"
  82279. "lsl r7, r9, #16\n\t"
  82280. "lsr r6, r6, #16\n\t"
  82281. "lsr r7, r7, #16\n\t"
  82282. "mul r7, r6, r7\n\t"
  82283. "adds r4, r4, r7\n\t"
  82284. "adcs r5, r5, #0\n\t"
  82285. "adc r3, r3, #0\n\t"
  82286. "lsr r7, r9, #16\n\t"
  82287. "mul r6, r7, r6\n\t"
  82288. "lsr r7, r6, #16\n\t"
  82289. "lsl r6, r6, #16\n\t"
  82290. "adds r4, r4, r6\n\t"
  82291. "adcs r5, r5, r7\n\t"
  82292. "adc r3, r3, #0\n\t"
  82293. "lsr r6, r8, #16\n\t"
  82294. "lsr r7, r9, #16\n\t"
  82295. "mul r7, r6, r7\n\t"
  82296. "adds r5, r5, r7\n\t"
  82297. "adc r3, r3, #0\n\t"
  82298. "lsl r7, r9, #16\n\t"
  82299. "lsr r7, r7, #16\n\t"
  82300. "mul r6, r7, r6\n\t"
  82301. "lsr r7, r6, #16\n\t"
  82302. "lsl r6, r6, #16\n\t"
  82303. "adds r4, r4, r6\n\t"
  82304. "adcs r5, r5, r7\n\t"
  82305. "adc r3, r3, #0\n\t"
  82306. #else
  82307. "umull r6, r7, r8, r9\n\t"
  82308. "adds r4, r4, r6\n\t"
  82309. "adcs r5, r5, r7\n\t"
  82310. "adc r3, r3, #0\n\t"
  82311. #endif
  82312. /* A[10] * B[3] */
  82313. "ldr r8, [%[a], #40]\n\t"
  82314. "ldr r9, [%[b], #12]\n\t"
  82315. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82316. "lsl r6, r8, #16\n\t"
  82317. "lsl r7, r9, #16\n\t"
  82318. "lsr r6, r6, #16\n\t"
  82319. "lsr r7, r7, #16\n\t"
  82320. "mul r7, r6, r7\n\t"
  82321. "adds r4, r4, r7\n\t"
  82322. "adcs r5, r5, #0\n\t"
  82323. "adc r3, r3, #0\n\t"
  82324. "lsr r7, r9, #16\n\t"
  82325. "mul r6, r7, r6\n\t"
  82326. "lsr r7, r6, #16\n\t"
  82327. "lsl r6, r6, #16\n\t"
  82328. "adds r4, r4, r6\n\t"
  82329. "adcs r5, r5, r7\n\t"
  82330. "adc r3, r3, #0\n\t"
  82331. "lsr r6, r8, #16\n\t"
  82332. "lsr r7, r9, #16\n\t"
  82333. "mul r7, r6, r7\n\t"
  82334. "adds r5, r5, r7\n\t"
  82335. "adc r3, r3, #0\n\t"
  82336. "lsl r7, r9, #16\n\t"
  82337. "lsr r7, r7, #16\n\t"
  82338. "mul r6, r7, r6\n\t"
  82339. "lsr r7, r6, #16\n\t"
  82340. "lsl r6, r6, #16\n\t"
  82341. "adds r4, r4, r6\n\t"
  82342. "adcs r5, r5, r7\n\t"
  82343. "adc r3, r3, #0\n\t"
  82344. #else
  82345. "umull r6, r7, r8, r9\n\t"
  82346. "adds r4, r4, r6\n\t"
  82347. "adcs r5, r5, r7\n\t"
  82348. "adc r3, r3, #0\n\t"
  82349. #endif
  82350. /* A[11] * B[2] */
  82351. "ldr r8, [%[a], #44]\n\t"
  82352. "ldr r9, [%[b], #8]\n\t"
  82353. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82354. "lsl r6, r8, #16\n\t"
  82355. "lsl r7, r9, #16\n\t"
  82356. "lsr r6, r6, #16\n\t"
  82357. "lsr r7, r7, #16\n\t"
  82358. "mul r7, r6, r7\n\t"
  82359. "adds r4, r4, r7\n\t"
  82360. "adcs r5, r5, #0\n\t"
  82361. "adc r3, r3, #0\n\t"
  82362. "lsr r7, r9, #16\n\t"
  82363. "mul r6, r7, r6\n\t"
  82364. "lsr r7, r6, #16\n\t"
  82365. "lsl r6, r6, #16\n\t"
  82366. "adds r4, r4, r6\n\t"
  82367. "adcs r5, r5, r7\n\t"
  82368. "adc r3, r3, #0\n\t"
  82369. "lsr r6, r8, #16\n\t"
  82370. "lsr r7, r9, #16\n\t"
  82371. "mul r7, r6, r7\n\t"
  82372. "adds r5, r5, r7\n\t"
  82373. "adc r3, r3, #0\n\t"
  82374. "lsl r7, r9, #16\n\t"
  82375. "lsr r7, r7, #16\n\t"
  82376. "mul r6, r7, r6\n\t"
  82377. "lsr r7, r6, #16\n\t"
  82378. "lsl r6, r6, #16\n\t"
  82379. "adds r4, r4, r6\n\t"
  82380. "adcs r5, r5, r7\n\t"
  82381. "adc r3, r3, #0\n\t"
  82382. #else
  82383. "umull r6, r7, r8, r9\n\t"
  82384. "adds r4, r4, r6\n\t"
  82385. "adcs r5, r5, r7\n\t"
  82386. "adc r3, r3, #0\n\t"
  82387. #endif
  82388. "str r4, [%[r], #52]\n\t"
  82389. /* A[11] * B[3] */
  82390. "ldr r9, [%[b], #12]\n\t"
  82391. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82392. "lsl r6, r8, #16\n\t"
  82393. "lsl r7, r9, #16\n\t"
  82394. "lsr r6, r6, #16\n\t"
  82395. "lsr r7, r7, #16\n\t"
  82396. "mul r7, r6, r7\n\t"
  82397. "adds r5, r5, r7\n\t"
  82398. "adcs r3, r3, #0\n\t"
  82399. "mov r4, #0\n\t"
  82400. "adc r4, r4, #0\n\t"
  82401. "lsr r7, r9, #16\n\t"
  82402. "mul r6, r7, r6\n\t"
  82403. "lsr r7, r6, #16\n\t"
  82404. "lsl r6, r6, #16\n\t"
  82405. "adds r5, r5, r6\n\t"
  82406. "adcs r3, r3, r7\n\t"
  82407. "adc r4, r4, #0\n\t"
  82408. "lsr r6, r8, #16\n\t"
  82409. "lsr r7, r9, #16\n\t"
  82410. "mul r7, r6, r7\n\t"
  82411. "adds r3, r3, r7\n\t"
  82412. "adc r4, r4, #0\n\t"
  82413. "lsl r7, r9, #16\n\t"
  82414. "lsr r7, r7, #16\n\t"
  82415. "mul r6, r7, r6\n\t"
  82416. "lsr r7, r6, #16\n\t"
  82417. "lsl r6, r6, #16\n\t"
  82418. "adds r5, r5, r6\n\t"
  82419. "adcs r3, r3, r7\n\t"
  82420. "adc r4, r4, #0\n\t"
  82421. #else
  82422. "umull r6, r7, r8, r9\n\t"
  82423. "adds r5, r5, r6\n\t"
  82424. "adcs r3, r3, r7\n\t"
  82425. "mov r4, #0\n\t"
  82426. "adc r4, r4, #0\n\t"
  82427. #endif
  82428. /* A[10] * B[4] */
  82429. "ldr r8, [%[a], #40]\n\t"
  82430. "ldr r9, [%[b], #16]\n\t"
  82431. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82432. "lsl r6, r8, #16\n\t"
  82433. "lsl r7, r9, #16\n\t"
  82434. "lsr r6, r6, #16\n\t"
  82435. "lsr r7, r7, #16\n\t"
  82436. "mul r7, r6, r7\n\t"
  82437. "adds r5, r5, r7\n\t"
  82438. "adcs r3, r3, #0\n\t"
  82439. "adc r4, r4, #0\n\t"
  82440. "lsr r7, r9, #16\n\t"
  82441. "mul r6, r7, r6\n\t"
  82442. "lsr r7, r6, #16\n\t"
  82443. "lsl r6, r6, #16\n\t"
  82444. "adds r5, r5, r6\n\t"
  82445. "adcs r3, r3, r7\n\t"
  82446. "adc r4, r4, #0\n\t"
  82447. "lsr r6, r8, #16\n\t"
  82448. "lsr r7, r9, #16\n\t"
  82449. "mul r7, r6, r7\n\t"
  82450. "adds r3, r3, r7\n\t"
  82451. "adc r4, r4, #0\n\t"
  82452. "lsl r7, r9, #16\n\t"
  82453. "lsr r7, r7, #16\n\t"
  82454. "mul r6, r7, r6\n\t"
  82455. "lsr r7, r6, #16\n\t"
  82456. "lsl r6, r6, #16\n\t"
  82457. "adds r5, r5, r6\n\t"
  82458. "adcs r3, r3, r7\n\t"
  82459. "adc r4, r4, #0\n\t"
  82460. #else
  82461. "umull r6, r7, r8, r9\n\t"
  82462. "adds r5, r5, r6\n\t"
  82463. "adcs r3, r3, r7\n\t"
  82464. "adc r4, r4, #0\n\t"
  82465. #endif
  82466. /* A[9] * B[5] */
  82467. "ldr r8, [%[a], #36]\n\t"
  82468. "ldr r9, [%[b], #20]\n\t"
  82469. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82470. "lsl r6, r8, #16\n\t"
  82471. "lsl r7, r9, #16\n\t"
  82472. "lsr r6, r6, #16\n\t"
  82473. "lsr r7, r7, #16\n\t"
  82474. "mul r7, r6, r7\n\t"
  82475. "adds r5, r5, r7\n\t"
  82476. "adcs r3, r3, #0\n\t"
  82477. "adc r4, r4, #0\n\t"
  82478. "lsr r7, r9, #16\n\t"
  82479. "mul r6, r7, r6\n\t"
  82480. "lsr r7, r6, #16\n\t"
  82481. "lsl r6, r6, #16\n\t"
  82482. "adds r5, r5, r6\n\t"
  82483. "adcs r3, r3, r7\n\t"
  82484. "adc r4, r4, #0\n\t"
  82485. "lsr r6, r8, #16\n\t"
  82486. "lsr r7, r9, #16\n\t"
  82487. "mul r7, r6, r7\n\t"
  82488. "adds r3, r3, r7\n\t"
  82489. "adc r4, r4, #0\n\t"
  82490. "lsl r7, r9, #16\n\t"
  82491. "lsr r7, r7, #16\n\t"
  82492. "mul r6, r7, r6\n\t"
  82493. "lsr r7, r6, #16\n\t"
  82494. "lsl r6, r6, #16\n\t"
  82495. "adds r5, r5, r6\n\t"
  82496. "adcs r3, r3, r7\n\t"
  82497. "adc r4, r4, #0\n\t"
  82498. #else
  82499. "umull r6, r7, r8, r9\n\t"
  82500. "adds r5, r5, r6\n\t"
  82501. "adcs r3, r3, r7\n\t"
  82502. "adc r4, r4, #0\n\t"
  82503. #endif
  82504. /* A[8] * B[6] */
  82505. "ldr r8, [%[a], #32]\n\t"
  82506. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82507. "lsl r6, r8, #16\n\t"
  82508. "lsl r7, r12, #16\n\t"
  82509. "lsr r6, r6, #16\n\t"
  82510. "lsr r7, r7, #16\n\t"
  82511. "mul r7, r6, r7\n\t"
  82512. "adds r5, r5, r7\n\t"
  82513. "adcs r3, r3, #0\n\t"
  82514. "adc r4, r4, #0\n\t"
  82515. "lsr r7, r12, #16\n\t"
  82516. "mul r6, r7, r6\n\t"
  82517. "lsr r7, r6, #16\n\t"
  82518. "lsl r6, r6, #16\n\t"
  82519. "adds r5, r5, r6\n\t"
  82520. "adcs r3, r3, r7\n\t"
  82521. "adc r4, r4, #0\n\t"
  82522. "lsr r6, r8, #16\n\t"
  82523. "lsr r7, r12, #16\n\t"
  82524. "mul r7, r6, r7\n\t"
  82525. "adds r3, r3, r7\n\t"
  82526. "adc r4, r4, #0\n\t"
  82527. "lsl r7, r12, #16\n\t"
  82528. "lsr r7, r7, #16\n\t"
  82529. "mul r6, r7, r6\n\t"
  82530. "lsr r7, r6, #16\n\t"
  82531. "lsl r6, r6, #16\n\t"
  82532. "adds r5, r5, r6\n\t"
  82533. "adcs r3, r3, r7\n\t"
  82534. "adc r4, r4, #0\n\t"
  82535. #else
  82536. "umull r6, r7, r8, r12\n\t"
  82537. "adds r5, r5, r6\n\t"
  82538. "adcs r3, r3, r7\n\t"
  82539. "adc r4, r4, #0\n\t"
  82540. #endif
  82541. /* A[7] * B[7] */
  82542. "ldr r11, [%[a], #28]\n\t"
  82543. "ldr r12, [%[b], #28]\n\t"
  82544. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82545. "lsl r6, r11, #16\n\t"
  82546. "lsl r7, r12, #16\n\t"
  82547. "lsr r6, r6, #16\n\t"
  82548. "lsr r7, r7, #16\n\t"
  82549. "mul r7, r6, r7\n\t"
  82550. "adds r5, r5, r7\n\t"
  82551. "adcs r3, r3, #0\n\t"
  82552. "adc r4, r4, #0\n\t"
  82553. "lsr r7, r12, #16\n\t"
  82554. "mul r6, r7, r6\n\t"
  82555. "lsr r7, r6, #16\n\t"
  82556. "lsl r6, r6, #16\n\t"
  82557. "adds r5, r5, r6\n\t"
  82558. "adcs r3, r3, r7\n\t"
  82559. "adc r4, r4, #0\n\t"
  82560. "lsr r6, r11, #16\n\t"
  82561. "lsr r7, r12, #16\n\t"
  82562. "mul r7, r6, r7\n\t"
  82563. "adds r3, r3, r7\n\t"
  82564. "adc r4, r4, #0\n\t"
  82565. "lsl r7, r12, #16\n\t"
  82566. "lsr r7, r7, #16\n\t"
  82567. "mul r6, r7, r6\n\t"
  82568. "lsr r7, r6, #16\n\t"
  82569. "lsl r6, r6, #16\n\t"
  82570. "adds r5, r5, r6\n\t"
  82571. "adcs r3, r3, r7\n\t"
  82572. "adc r4, r4, #0\n\t"
  82573. #else
  82574. "umull r6, r7, r11, r12\n\t"
  82575. "adds r5, r5, r6\n\t"
  82576. "adcs r3, r3, r7\n\t"
  82577. "adc r4, r4, #0\n\t"
  82578. #endif
  82579. /* A[6] * B[8] */
  82580. "ldr r8, [%[a], #24]\n\t"
  82581. "ldr r9, [%[b], #32]\n\t"
  82582. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82583. "lsl r6, r8, #16\n\t"
  82584. "lsl r7, r9, #16\n\t"
  82585. "lsr r6, r6, #16\n\t"
  82586. "lsr r7, r7, #16\n\t"
  82587. "mul r7, r6, r7\n\t"
  82588. "adds r5, r5, r7\n\t"
  82589. "adcs r3, r3, #0\n\t"
  82590. "adc r4, r4, #0\n\t"
  82591. "lsr r7, r9, #16\n\t"
  82592. "mul r6, r7, r6\n\t"
  82593. "lsr r7, r6, #16\n\t"
  82594. "lsl r6, r6, #16\n\t"
  82595. "adds r5, r5, r6\n\t"
  82596. "adcs r3, r3, r7\n\t"
  82597. "adc r4, r4, #0\n\t"
  82598. "lsr r6, r8, #16\n\t"
  82599. "lsr r7, r9, #16\n\t"
  82600. "mul r7, r6, r7\n\t"
  82601. "adds r3, r3, r7\n\t"
  82602. "adc r4, r4, #0\n\t"
  82603. "lsl r7, r9, #16\n\t"
  82604. "lsr r7, r7, #16\n\t"
  82605. "mul r6, r7, r6\n\t"
  82606. "lsr r7, r6, #16\n\t"
  82607. "lsl r6, r6, #16\n\t"
  82608. "adds r5, r5, r6\n\t"
  82609. "adcs r3, r3, r7\n\t"
  82610. "adc r4, r4, #0\n\t"
  82611. #else
  82612. "umull r6, r7, r8, r9\n\t"
  82613. "adds r5, r5, r6\n\t"
  82614. "adcs r3, r3, r7\n\t"
  82615. "adc r4, r4, #0\n\t"
  82616. #endif
  82617. /* A[5] * B[9] */
  82618. "ldr r8, [%[a], #20]\n\t"
  82619. "ldr r9, [%[b], #36]\n\t"
  82620. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82621. "lsl r6, r8, #16\n\t"
  82622. "lsl r7, r9, #16\n\t"
  82623. "lsr r6, r6, #16\n\t"
  82624. "lsr r7, r7, #16\n\t"
  82625. "mul r7, r6, r7\n\t"
  82626. "adds r5, r5, r7\n\t"
  82627. "adcs r3, r3, #0\n\t"
  82628. "adc r4, r4, #0\n\t"
  82629. "lsr r7, r9, #16\n\t"
  82630. "mul r6, r7, r6\n\t"
  82631. "lsr r7, r6, #16\n\t"
  82632. "lsl r6, r6, #16\n\t"
  82633. "adds r5, r5, r6\n\t"
  82634. "adcs r3, r3, r7\n\t"
  82635. "adc r4, r4, #0\n\t"
  82636. "lsr r6, r8, #16\n\t"
  82637. "lsr r7, r9, #16\n\t"
  82638. "mul r7, r6, r7\n\t"
  82639. "adds r3, r3, r7\n\t"
  82640. "adc r4, r4, #0\n\t"
  82641. "lsl r7, r9, #16\n\t"
  82642. "lsr r7, r7, #16\n\t"
  82643. "mul r6, r7, r6\n\t"
  82644. "lsr r7, r6, #16\n\t"
  82645. "lsl r6, r6, #16\n\t"
  82646. "adds r5, r5, r6\n\t"
  82647. "adcs r3, r3, r7\n\t"
  82648. "adc r4, r4, #0\n\t"
  82649. #else
  82650. "umull r6, r7, r8, r9\n\t"
  82651. "adds r5, r5, r6\n\t"
  82652. "adcs r3, r3, r7\n\t"
  82653. "adc r4, r4, #0\n\t"
  82654. #endif
  82655. /* A[4] * B[10] */
  82656. "ldr r8, [%[a], #16]\n\t"
  82657. "ldr r9, [%[b], #40]\n\t"
  82658. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82659. "lsl r6, r8, #16\n\t"
  82660. "lsl r7, r9, #16\n\t"
  82661. "lsr r6, r6, #16\n\t"
  82662. "lsr r7, r7, #16\n\t"
  82663. "mul r7, r6, r7\n\t"
  82664. "adds r5, r5, r7\n\t"
  82665. "adcs r3, r3, #0\n\t"
  82666. "adc r4, r4, #0\n\t"
  82667. "lsr r7, r9, #16\n\t"
  82668. "mul r6, r7, r6\n\t"
  82669. "lsr r7, r6, #16\n\t"
  82670. "lsl r6, r6, #16\n\t"
  82671. "adds r5, r5, r6\n\t"
  82672. "adcs r3, r3, r7\n\t"
  82673. "adc r4, r4, #0\n\t"
  82674. "lsr r6, r8, #16\n\t"
  82675. "lsr r7, r9, #16\n\t"
  82676. "mul r7, r6, r7\n\t"
  82677. "adds r3, r3, r7\n\t"
  82678. "adc r4, r4, #0\n\t"
  82679. "lsl r7, r9, #16\n\t"
  82680. "lsr r7, r7, #16\n\t"
  82681. "mul r6, r7, r6\n\t"
  82682. "lsr r7, r6, #16\n\t"
  82683. "lsl r6, r6, #16\n\t"
  82684. "adds r5, r5, r6\n\t"
  82685. "adcs r3, r3, r7\n\t"
  82686. "adc r4, r4, #0\n\t"
  82687. #else
  82688. "umull r6, r7, r8, r9\n\t"
  82689. "adds r5, r5, r6\n\t"
  82690. "adcs r3, r3, r7\n\t"
  82691. "adc r4, r4, #0\n\t"
  82692. #endif
  82693. /* A[3] * B[11] */
  82694. "ldr r8, [%[a], #12]\n\t"
  82695. "ldr r9, [%[b], #44]\n\t"
  82696. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82697. "lsl r6, r8, #16\n\t"
  82698. "lsl r7, r9, #16\n\t"
  82699. "lsr r6, r6, #16\n\t"
  82700. "lsr r7, r7, #16\n\t"
  82701. "mul r7, r6, r7\n\t"
  82702. "adds r5, r5, r7\n\t"
  82703. "adcs r3, r3, #0\n\t"
  82704. "adc r4, r4, #0\n\t"
  82705. "lsr r7, r9, #16\n\t"
  82706. "mul r6, r7, r6\n\t"
  82707. "lsr r7, r6, #16\n\t"
  82708. "lsl r6, r6, #16\n\t"
  82709. "adds r5, r5, r6\n\t"
  82710. "adcs r3, r3, r7\n\t"
  82711. "adc r4, r4, #0\n\t"
  82712. "lsr r6, r8, #16\n\t"
  82713. "lsr r7, r9, #16\n\t"
  82714. "mul r7, r6, r7\n\t"
  82715. "adds r3, r3, r7\n\t"
  82716. "adc r4, r4, #0\n\t"
  82717. "lsl r7, r9, #16\n\t"
  82718. "lsr r7, r7, #16\n\t"
  82719. "mul r6, r7, r6\n\t"
  82720. "lsr r7, r6, #16\n\t"
  82721. "lsl r6, r6, #16\n\t"
  82722. "adds r5, r5, r6\n\t"
  82723. "adcs r3, r3, r7\n\t"
  82724. "adc r4, r4, #0\n\t"
  82725. #else
  82726. "umull r6, r7, r8, r9\n\t"
  82727. "adds r5, r5, r6\n\t"
  82728. "adcs r3, r3, r7\n\t"
  82729. "adc r4, r4, #0\n\t"
  82730. #endif
  82731. "str r5, [%[r], #56]\n\t"
  82732. /* A[4] * B[11] */
  82733. "ldr r8, [%[a], #16]\n\t"
  82734. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82735. "lsl r6, r8, #16\n\t"
  82736. "lsl r7, r9, #16\n\t"
  82737. "lsr r6, r6, #16\n\t"
  82738. "lsr r7, r7, #16\n\t"
  82739. "mul r7, r6, r7\n\t"
  82740. "adds r3, r3, r7\n\t"
  82741. "adcs r4, r4, #0\n\t"
  82742. "mov r5, #0\n\t"
  82743. "adc r5, r5, #0\n\t"
  82744. "lsr r7, r9, #16\n\t"
  82745. "mul r6, r7, r6\n\t"
  82746. "lsr r7, r6, #16\n\t"
  82747. "lsl r6, r6, #16\n\t"
  82748. "adds r3, r3, r6\n\t"
  82749. "adcs r4, r4, r7\n\t"
  82750. "adc r5, r5, #0\n\t"
  82751. "lsr r6, r8, #16\n\t"
  82752. "lsr r7, r9, #16\n\t"
  82753. "mul r7, r6, r7\n\t"
  82754. "adds r4, r4, r7\n\t"
  82755. "adc r5, r5, #0\n\t"
  82756. "lsl r7, r9, #16\n\t"
  82757. "lsr r7, r7, #16\n\t"
  82758. "mul r6, r7, r6\n\t"
  82759. "lsr r7, r6, #16\n\t"
  82760. "lsl r6, r6, #16\n\t"
  82761. "adds r3, r3, r6\n\t"
  82762. "adcs r4, r4, r7\n\t"
  82763. "adc r5, r5, #0\n\t"
  82764. #else
  82765. "umull r6, r7, r8, r9\n\t"
  82766. "adds r3, r3, r6\n\t"
  82767. "adcs r4, r4, r7\n\t"
  82768. "mov r5, #0\n\t"
  82769. "adc r5, r5, #0\n\t"
  82770. #endif
  82771. /* A[5] * B[10] */
  82772. "ldr r8, [%[a], #20]\n\t"
  82773. "ldr r9, [%[b], #40]\n\t"
  82774. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82775. "lsl r6, r8, #16\n\t"
  82776. "lsl r7, r9, #16\n\t"
  82777. "lsr r6, r6, #16\n\t"
  82778. "lsr r7, r7, #16\n\t"
  82779. "mul r7, r6, r7\n\t"
  82780. "adds r3, r3, r7\n\t"
  82781. "adcs r4, r4, #0\n\t"
  82782. "adc r5, r5, #0\n\t"
  82783. "lsr r7, r9, #16\n\t"
  82784. "mul r6, r7, r6\n\t"
  82785. "lsr r7, r6, #16\n\t"
  82786. "lsl r6, r6, #16\n\t"
  82787. "adds r3, r3, r6\n\t"
  82788. "adcs r4, r4, r7\n\t"
  82789. "adc r5, r5, #0\n\t"
  82790. "lsr r6, r8, #16\n\t"
  82791. "lsr r7, r9, #16\n\t"
  82792. "mul r7, r6, r7\n\t"
  82793. "adds r4, r4, r7\n\t"
  82794. "adc r5, r5, #0\n\t"
  82795. "lsl r7, r9, #16\n\t"
  82796. "lsr r7, r7, #16\n\t"
  82797. "mul r6, r7, r6\n\t"
  82798. "lsr r7, r6, #16\n\t"
  82799. "lsl r6, r6, #16\n\t"
  82800. "adds r3, r3, r6\n\t"
  82801. "adcs r4, r4, r7\n\t"
  82802. "adc r5, r5, #0\n\t"
  82803. #else
  82804. "umull r6, r7, r8, r9\n\t"
  82805. "adds r3, r3, r6\n\t"
  82806. "adcs r4, r4, r7\n\t"
  82807. "adc r5, r5, #0\n\t"
  82808. #endif
  82809. /* A[6] * B[9] */
  82810. "ldr r8, [%[a], #24]\n\t"
  82811. "ldr r9, [%[b], #36]\n\t"
  82812. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82813. "lsl r6, r8, #16\n\t"
  82814. "lsl r7, r9, #16\n\t"
  82815. "lsr r6, r6, #16\n\t"
  82816. "lsr r7, r7, #16\n\t"
  82817. "mul r7, r6, r7\n\t"
  82818. "adds r3, r3, r7\n\t"
  82819. "adcs r4, r4, #0\n\t"
  82820. "adc r5, r5, #0\n\t"
  82821. "lsr r7, r9, #16\n\t"
  82822. "mul r6, r7, r6\n\t"
  82823. "lsr r7, r6, #16\n\t"
  82824. "lsl r6, r6, #16\n\t"
  82825. "adds r3, r3, r6\n\t"
  82826. "adcs r4, r4, r7\n\t"
  82827. "adc r5, r5, #0\n\t"
  82828. "lsr r6, r8, #16\n\t"
  82829. "lsr r7, r9, #16\n\t"
  82830. "mul r7, r6, r7\n\t"
  82831. "adds r4, r4, r7\n\t"
  82832. "adc r5, r5, #0\n\t"
  82833. "lsl r7, r9, #16\n\t"
  82834. "lsr r7, r7, #16\n\t"
  82835. "mul r6, r7, r6\n\t"
  82836. "lsr r7, r6, #16\n\t"
  82837. "lsl r6, r6, #16\n\t"
  82838. "adds r3, r3, r6\n\t"
  82839. "adcs r4, r4, r7\n\t"
  82840. "adc r5, r5, #0\n\t"
  82841. #else
  82842. "umull r6, r7, r8, r9\n\t"
  82843. "adds r3, r3, r6\n\t"
  82844. "adcs r4, r4, r7\n\t"
  82845. "adc r5, r5, #0\n\t"
  82846. #endif
  82847. /* A[7] * B[8] */
  82848. "ldr r9, [%[b], #32]\n\t"
  82849. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82850. "lsl r6, r11, #16\n\t"
  82851. "lsl r7, r9, #16\n\t"
  82852. "lsr r6, r6, #16\n\t"
  82853. "lsr r7, r7, #16\n\t"
  82854. "mul r7, r6, r7\n\t"
  82855. "adds r3, r3, r7\n\t"
  82856. "adcs r4, r4, #0\n\t"
  82857. "adc r5, r5, #0\n\t"
  82858. "lsr r7, r9, #16\n\t"
  82859. "mul r6, r7, r6\n\t"
  82860. "lsr r7, r6, #16\n\t"
  82861. "lsl r6, r6, #16\n\t"
  82862. "adds r3, r3, r6\n\t"
  82863. "adcs r4, r4, r7\n\t"
  82864. "adc r5, r5, #0\n\t"
  82865. "lsr r6, r11, #16\n\t"
  82866. "lsr r7, r9, #16\n\t"
  82867. "mul r7, r6, r7\n\t"
  82868. "adds r4, r4, r7\n\t"
  82869. "adc r5, r5, #0\n\t"
  82870. "lsl r7, r9, #16\n\t"
  82871. "lsr r7, r7, #16\n\t"
  82872. "mul r6, r7, r6\n\t"
  82873. "lsr r7, r6, #16\n\t"
  82874. "lsl r6, r6, #16\n\t"
  82875. "adds r3, r3, r6\n\t"
  82876. "adcs r4, r4, r7\n\t"
  82877. "adc r5, r5, #0\n\t"
  82878. #else
  82879. "umull r6, r7, r11, r9\n\t"
  82880. "adds r3, r3, r6\n\t"
  82881. "adcs r4, r4, r7\n\t"
  82882. "adc r5, r5, #0\n\t"
  82883. #endif
  82884. /* A[8] * B[7] */
  82885. "ldr r8, [%[a], #32]\n\t"
  82886. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82887. "lsl r6, r8, #16\n\t"
  82888. "lsl r7, r12, #16\n\t"
  82889. "lsr r6, r6, #16\n\t"
  82890. "lsr r7, r7, #16\n\t"
  82891. "mul r7, r6, r7\n\t"
  82892. "adds r3, r3, r7\n\t"
  82893. "adcs r4, r4, #0\n\t"
  82894. "adc r5, r5, #0\n\t"
  82895. "lsr r7, r12, #16\n\t"
  82896. "mul r6, r7, r6\n\t"
  82897. "lsr r7, r6, #16\n\t"
  82898. "lsl r6, r6, #16\n\t"
  82899. "adds r3, r3, r6\n\t"
  82900. "adcs r4, r4, r7\n\t"
  82901. "adc r5, r5, #0\n\t"
  82902. "lsr r6, r8, #16\n\t"
  82903. "lsr r7, r12, #16\n\t"
  82904. "mul r7, r6, r7\n\t"
  82905. "adds r4, r4, r7\n\t"
  82906. "adc r5, r5, #0\n\t"
  82907. "lsl r7, r12, #16\n\t"
  82908. "lsr r7, r7, #16\n\t"
  82909. "mul r6, r7, r6\n\t"
  82910. "lsr r7, r6, #16\n\t"
  82911. "lsl r6, r6, #16\n\t"
  82912. "adds r3, r3, r6\n\t"
  82913. "adcs r4, r4, r7\n\t"
  82914. "adc r5, r5, #0\n\t"
  82915. #else
  82916. "umull r6, r7, r8, r12\n\t"
  82917. "adds r3, r3, r6\n\t"
  82918. "adcs r4, r4, r7\n\t"
  82919. "adc r5, r5, #0\n\t"
  82920. #endif
  82921. /* A[9] * B[6] */
  82922. "ldr r8, [%[a], #36]\n\t"
  82923. "ldr r9, [%[b], #24]\n\t"
  82924. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82925. "lsl r6, r8, #16\n\t"
  82926. "lsl r7, r9, #16\n\t"
  82927. "lsr r6, r6, #16\n\t"
  82928. "lsr r7, r7, #16\n\t"
  82929. "mul r7, r6, r7\n\t"
  82930. "adds r3, r3, r7\n\t"
  82931. "adcs r4, r4, #0\n\t"
  82932. "adc r5, r5, #0\n\t"
  82933. "lsr r7, r9, #16\n\t"
  82934. "mul r6, r7, r6\n\t"
  82935. "lsr r7, r6, #16\n\t"
  82936. "lsl r6, r6, #16\n\t"
  82937. "adds r3, r3, r6\n\t"
  82938. "adcs r4, r4, r7\n\t"
  82939. "adc r5, r5, #0\n\t"
  82940. "lsr r6, r8, #16\n\t"
  82941. "lsr r7, r9, #16\n\t"
  82942. "mul r7, r6, r7\n\t"
  82943. "adds r4, r4, r7\n\t"
  82944. "adc r5, r5, #0\n\t"
  82945. "lsl r7, r9, #16\n\t"
  82946. "lsr r7, r7, #16\n\t"
  82947. "mul r6, r7, r6\n\t"
  82948. "lsr r7, r6, #16\n\t"
  82949. "lsl r6, r6, #16\n\t"
  82950. "adds r3, r3, r6\n\t"
  82951. "adcs r4, r4, r7\n\t"
  82952. "adc r5, r5, #0\n\t"
  82953. #else
  82954. "umull r6, r7, r8, r9\n\t"
  82955. "adds r3, r3, r6\n\t"
  82956. "adcs r4, r4, r7\n\t"
  82957. "adc r5, r5, #0\n\t"
  82958. #endif
  82959. /* A[10] * B[5] */
  82960. "ldr r8, [%[a], #40]\n\t"
  82961. "ldr r9, [%[b], #20]\n\t"
  82962. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  82963. "lsl r6, r8, #16\n\t"
  82964. "lsl r7, r9, #16\n\t"
  82965. "lsr r6, r6, #16\n\t"
  82966. "lsr r7, r7, #16\n\t"
  82967. "mul r7, r6, r7\n\t"
  82968. "adds r3, r3, r7\n\t"
  82969. "adcs r4, r4, #0\n\t"
  82970. "adc r5, r5, #0\n\t"
  82971. "lsr r7, r9, #16\n\t"
  82972. "mul r6, r7, r6\n\t"
  82973. "lsr r7, r6, #16\n\t"
  82974. "lsl r6, r6, #16\n\t"
  82975. "adds r3, r3, r6\n\t"
  82976. "adcs r4, r4, r7\n\t"
  82977. "adc r5, r5, #0\n\t"
  82978. "lsr r6, r8, #16\n\t"
  82979. "lsr r7, r9, #16\n\t"
  82980. "mul r7, r6, r7\n\t"
  82981. "adds r4, r4, r7\n\t"
  82982. "adc r5, r5, #0\n\t"
  82983. "lsl r7, r9, #16\n\t"
  82984. "lsr r7, r7, #16\n\t"
  82985. "mul r6, r7, r6\n\t"
  82986. "lsr r7, r6, #16\n\t"
  82987. "lsl r6, r6, #16\n\t"
  82988. "adds r3, r3, r6\n\t"
  82989. "adcs r4, r4, r7\n\t"
  82990. "adc r5, r5, #0\n\t"
  82991. #else
  82992. "umull r6, r7, r8, r9\n\t"
  82993. "adds r3, r3, r6\n\t"
  82994. "adcs r4, r4, r7\n\t"
  82995. "adc r5, r5, #0\n\t"
  82996. #endif
  82997. /* A[11] * B[4] */
  82998. "ldr r8, [%[a], #44]\n\t"
  82999. "ldr r9, [%[b], #16]\n\t"
  83000. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83001. "lsl r6, r8, #16\n\t"
  83002. "lsl r7, r9, #16\n\t"
  83003. "lsr r6, r6, #16\n\t"
  83004. "lsr r7, r7, #16\n\t"
  83005. "mul r7, r6, r7\n\t"
  83006. "adds r3, r3, r7\n\t"
  83007. "adcs r4, r4, #0\n\t"
  83008. "adc r5, r5, #0\n\t"
  83009. "lsr r7, r9, #16\n\t"
  83010. "mul r6, r7, r6\n\t"
  83011. "lsr r7, r6, #16\n\t"
  83012. "lsl r6, r6, #16\n\t"
  83013. "adds r3, r3, r6\n\t"
  83014. "adcs r4, r4, r7\n\t"
  83015. "adc r5, r5, #0\n\t"
  83016. "lsr r6, r8, #16\n\t"
  83017. "lsr r7, r9, #16\n\t"
  83018. "mul r7, r6, r7\n\t"
  83019. "adds r4, r4, r7\n\t"
  83020. "adc r5, r5, #0\n\t"
  83021. "lsl r7, r9, #16\n\t"
  83022. "lsr r7, r7, #16\n\t"
  83023. "mul r6, r7, r6\n\t"
  83024. "lsr r7, r6, #16\n\t"
  83025. "lsl r6, r6, #16\n\t"
  83026. "adds r3, r3, r6\n\t"
  83027. "adcs r4, r4, r7\n\t"
  83028. "adc r5, r5, #0\n\t"
  83029. #else
  83030. "umull r6, r7, r8, r9\n\t"
  83031. "adds r3, r3, r6\n\t"
  83032. "adcs r4, r4, r7\n\t"
  83033. "adc r5, r5, #0\n\t"
  83034. #endif
  83035. "str r3, [%[r], #60]\n\t"
  83036. /* A[11] * B[5] */
  83037. "ldr r9, [%[b], #20]\n\t"
  83038. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83039. "lsl r6, r8, #16\n\t"
  83040. "lsl r7, r9, #16\n\t"
  83041. "lsr r6, r6, #16\n\t"
  83042. "lsr r7, r7, #16\n\t"
  83043. "mul r7, r6, r7\n\t"
  83044. "adds r4, r4, r7\n\t"
  83045. "adcs r5, r5, #0\n\t"
  83046. "mov r3, #0\n\t"
  83047. "adc r3, r3, #0\n\t"
  83048. "lsr r7, r9, #16\n\t"
  83049. "mul r6, r7, r6\n\t"
  83050. "lsr r7, r6, #16\n\t"
  83051. "lsl r6, r6, #16\n\t"
  83052. "adds r4, r4, r6\n\t"
  83053. "adcs r5, r5, r7\n\t"
  83054. "adc r3, r3, #0\n\t"
  83055. "lsr r6, r8, #16\n\t"
  83056. "lsr r7, r9, #16\n\t"
  83057. "mul r7, r6, r7\n\t"
  83058. "adds r5, r5, r7\n\t"
  83059. "adc r3, r3, #0\n\t"
  83060. "lsl r7, r9, #16\n\t"
  83061. "lsr r7, r7, #16\n\t"
  83062. "mul r6, r7, r6\n\t"
  83063. "lsr r7, r6, #16\n\t"
  83064. "lsl r6, r6, #16\n\t"
  83065. "adds r4, r4, r6\n\t"
  83066. "adcs r5, r5, r7\n\t"
  83067. "adc r3, r3, #0\n\t"
  83068. #else
  83069. "umull r6, r7, r8, r9\n\t"
  83070. "adds r4, r4, r6\n\t"
  83071. "adcs r5, r5, r7\n\t"
  83072. "mov r3, #0\n\t"
  83073. "adc r3, r3, #0\n\t"
  83074. #endif
  83075. /* A[10] * B[6] */
  83076. "ldr r8, [%[a], #40]\n\t"
  83077. "ldr r9, [%[b], #24]\n\t"
  83078. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83079. "lsl r6, r8, #16\n\t"
  83080. "lsl r7, r9, #16\n\t"
  83081. "lsr r6, r6, #16\n\t"
  83082. "lsr r7, r7, #16\n\t"
  83083. "mul r7, r6, r7\n\t"
  83084. "adds r4, r4, r7\n\t"
  83085. "adcs r5, r5, #0\n\t"
  83086. "adc r3, r3, #0\n\t"
  83087. "lsr r7, r9, #16\n\t"
  83088. "mul r6, r7, r6\n\t"
  83089. "lsr r7, r6, #16\n\t"
  83090. "lsl r6, r6, #16\n\t"
  83091. "adds r4, r4, r6\n\t"
  83092. "adcs r5, r5, r7\n\t"
  83093. "adc r3, r3, #0\n\t"
  83094. "lsr r6, r8, #16\n\t"
  83095. "lsr r7, r9, #16\n\t"
  83096. "mul r7, r6, r7\n\t"
  83097. "adds r5, r5, r7\n\t"
  83098. "adc r3, r3, #0\n\t"
  83099. "lsl r7, r9, #16\n\t"
  83100. "lsr r7, r7, #16\n\t"
  83101. "mul r6, r7, r6\n\t"
  83102. "lsr r7, r6, #16\n\t"
  83103. "lsl r6, r6, #16\n\t"
  83104. "adds r4, r4, r6\n\t"
  83105. "adcs r5, r5, r7\n\t"
  83106. "adc r3, r3, #0\n\t"
  83107. #else
  83108. "umull r6, r7, r8, r9\n\t"
  83109. "adds r4, r4, r6\n\t"
  83110. "adcs r5, r5, r7\n\t"
  83111. "adc r3, r3, #0\n\t"
  83112. #endif
  83113. /* A[9] * B[7] */
  83114. "ldr r8, [%[a], #36]\n\t"
  83115. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83116. "lsl r6, r8, #16\n\t"
  83117. "lsl r7, r12, #16\n\t"
  83118. "lsr r6, r6, #16\n\t"
  83119. "lsr r7, r7, #16\n\t"
  83120. "mul r7, r6, r7\n\t"
  83121. "adds r4, r4, r7\n\t"
  83122. "adcs r5, r5, #0\n\t"
  83123. "adc r3, r3, #0\n\t"
  83124. "lsr r7, r12, #16\n\t"
  83125. "mul r6, r7, r6\n\t"
  83126. "lsr r7, r6, #16\n\t"
  83127. "lsl r6, r6, #16\n\t"
  83128. "adds r4, r4, r6\n\t"
  83129. "adcs r5, r5, r7\n\t"
  83130. "adc r3, r3, #0\n\t"
  83131. "lsr r6, r8, #16\n\t"
  83132. "lsr r7, r12, #16\n\t"
  83133. "mul r7, r6, r7\n\t"
  83134. "adds r5, r5, r7\n\t"
  83135. "adc r3, r3, #0\n\t"
  83136. "lsl r7, r12, #16\n\t"
  83137. "lsr r7, r7, #16\n\t"
  83138. "mul r6, r7, r6\n\t"
  83139. "lsr r7, r6, #16\n\t"
  83140. "lsl r6, r6, #16\n\t"
  83141. "adds r4, r4, r6\n\t"
  83142. "adcs r5, r5, r7\n\t"
  83143. "adc r3, r3, #0\n\t"
  83144. #else
  83145. "umull r6, r7, r8, r12\n\t"
  83146. "adds r4, r4, r6\n\t"
  83147. "adcs r5, r5, r7\n\t"
  83148. "adc r3, r3, #0\n\t"
  83149. #endif
  83150. /* A[8] * B[8] */
  83151. "ldr r11, [%[a], #32]\n\t"
  83152. "ldr r12, [%[b], #32]\n\t"
  83153. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83154. "lsl r6, r11, #16\n\t"
  83155. "lsl r7, r12, #16\n\t"
  83156. "lsr r6, r6, #16\n\t"
  83157. "lsr r7, r7, #16\n\t"
  83158. "mul r7, r6, r7\n\t"
  83159. "adds r4, r4, r7\n\t"
  83160. "adcs r5, r5, #0\n\t"
  83161. "adc r3, r3, #0\n\t"
  83162. "lsr r7, r12, #16\n\t"
  83163. "mul r6, r7, r6\n\t"
  83164. "lsr r7, r6, #16\n\t"
  83165. "lsl r6, r6, #16\n\t"
  83166. "adds r4, r4, r6\n\t"
  83167. "adcs r5, r5, r7\n\t"
  83168. "adc r3, r3, #0\n\t"
  83169. "lsr r6, r11, #16\n\t"
  83170. "lsr r7, r12, #16\n\t"
  83171. "mul r7, r6, r7\n\t"
  83172. "adds r5, r5, r7\n\t"
  83173. "adc r3, r3, #0\n\t"
  83174. "lsl r7, r12, #16\n\t"
  83175. "lsr r7, r7, #16\n\t"
  83176. "mul r6, r7, r6\n\t"
  83177. "lsr r7, r6, #16\n\t"
  83178. "lsl r6, r6, #16\n\t"
  83179. "adds r4, r4, r6\n\t"
  83180. "adcs r5, r5, r7\n\t"
  83181. "adc r3, r3, #0\n\t"
  83182. #else
  83183. "umull r6, r7, r11, r12\n\t"
  83184. "adds r4, r4, r6\n\t"
  83185. "adcs r5, r5, r7\n\t"
  83186. "adc r3, r3, #0\n\t"
  83187. #endif
  83188. /* A[7] * B[9] */
  83189. "ldr r8, [%[a], #28]\n\t"
  83190. "ldr r9, [%[b], #36]\n\t"
  83191. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83192. "lsl r6, r8, #16\n\t"
  83193. "lsl r7, r9, #16\n\t"
  83194. "lsr r6, r6, #16\n\t"
  83195. "lsr r7, r7, #16\n\t"
  83196. "mul r7, r6, r7\n\t"
  83197. "adds r4, r4, r7\n\t"
  83198. "adcs r5, r5, #0\n\t"
  83199. "adc r3, r3, #0\n\t"
  83200. "lsr r7, r9, #16\n\t"
  83201. "mul r6, r7, r6\n\t"
  83202. "lsr r7, r6, #16\n\t"
  83203. "lsl r6, r6, #16\n\t"
  83204. "adds r4, r4, r6\n\t"
  83205. "adcs r5, r5, r7\n\t"
  83206. "adc r3, r3, #0\n\t"
  83207. "lsr r6, r8, #16\n\t"
  83208. "lsr r7, r9, #16\n\t"
  83209. "mul r7, r6, r7\n\t"
  83210. "adds r5, r5, r7\n\t"
  83211. "adc r3, r3, #0\n\t"
  83212. "lsl r7, r9, #16\n\t"
  83213. "lsr r7, r7, #16\n\t"
  83214. "mul r6, r7, r6\n\t"
  83215. "lsr r7, r6, #16\n\t"
  83216. "lsl r6, r6, #16\n\t"
  83217. "adds r4, r4, r6\n\t"
  83218. "adcs r5, r5, r7\n\t"
  83219. "adc r3, r3, #0\n\t"
  83220. #else
  83221. "umull r6, r7, r8, r9\n\t"
  83222. "adds r4, r4, r6\n\t"
  83223. "adcs r5, r5, r7\n\t"
  83224. "adc r3, r3, #0\n\t"
  83225. #endif
  83226. /* A[6] * B[10] */
  83227. "ldr r8, [%[a], #24]\n\t"
  83228. "ldr r9, [%[b], #40]\n\t"
  83229. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83230. "lsl r6, r8, #16\n\t"
  83231. "lsl r7, r9, #16\n\t"
  83232. "lsr r6, r6, #16\n\t"
  83233. "lsr r7, r7, #16\n\t"
  83234. "mul r7, r6, r7\n\t"
  83235. "adds r4, r4, r7\n\t"
  83236. "adcs r5, r5, #0\n\t"
  83237. "adc r3, r3, #0\n\t"
  83238. "lsr r7, r9, #16\n\t"
  83239. "mul r6, r7, r6\n\t"
  83240. "lsr r7, r6, #16\n\t"
  83241. "lsl r6, r6, #16\n\t"
  83242. "adds r4, r4, r6\n\t"
  83243. "adcs r5, r5, r7\n\t"
  83244. "adc r3, r3, #0\n\t"
  83245. "lsr r6, r8, #16\n\t"
  83246. "lsr r7, r9, #16\n\t"
  83247. "mul r7, r6, r7\n\t"
  83248. "adds r5, r5, r7\n\t"
  83249. "adc r3, r3, #0\n\t"
  83250. "lsl r7, r9, #16\n\t"
  83251. "lsr r7, r7, #16\n\t"
  83252. "mul r6, r7, r6\n\t"
  83253. "lsr r7, r6, #16\n\t"
  83254. "lsl r6, r6, #16\n\t"
  83255. "adds r4, r4, r6\n\t"
  83256. "adcs r5, r5, r7\n\t"
  83257. "adc r3, r3, #0\n\t"
  83258. #else
  83259. "umull r6, r7, r8, r9\n\t"
  83260. "adds r4, r4, r6\n\t"
  83261. "adcs r5, r5, r7\n\t"
  83262. "adc r3, r3, #0\n\t"
  83263. #endif
  83264. /* A[5] * B[11] */
  83265. "ldr r8, [%[a], #20]\n\t"
  83266. "ldr r9, [%[b], #44]\n\t"
  83267. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83268. "lsl r6, r8, #16\n\t"
  83269. "lsl r7, r9, #16\n\t"
  83270. "lsr r6, r6, #16\n\t"
  83271. "lsr r7, r7, #16\n\t"
  83272. "mul r7, r6, r7\n\t"
  83273. "adds r4, r4, r7\n\t"
  83274. "adcs r5, r5, #0\n\t"
  83275. "adc r3, r3, #0\n\t"
  83276. "lsr r7, r9, #16\n\t"
  83277. "mul r6, r7, r6\n\t"
  83278. "lsr r7, r6, #16\n\t"
  83279. "lsl r6, r6, #16\n\t"
  83280. "adds r4, r4, r6\n\t"
  83281. "adcs r5, r5, r7\n\t"
  83282. "adc r3, r3, #0\n\t"
  83283. "lsr r6, r8, #16\n\t"
  83284. "lsr r7, r9, #16\n\t"
  83285. "mul r7, r6, r7\n\t"
  83286. "adds r5, r5, r7\n\t"
  83287. "adc r3, r3, #0\n\t"
  83288. "lsl r7, r9, #16\n\t"
  83289. "lsr r7, r7, #16\n\t"
  83290. "mul r6, r7, r6\n\t"
  83291. "lsr r7, r6, #16\n\t"
  83292. "lsl r6, r6, #16\n\t"
  83293. "adds r4, r4, r6\n\t"
  83294. "adcs r5, r5, r7\n\t"
  83295. "adc r3, r3, #0\n\t"
  83296. #else
  83297. "umull r6, r7, r8, r9\n\t"
  83298. "adds r4, r4, r6\n\t"
  83299. "adcs r5, r5, r7\n\t"
  83300. "adc r3, r3, #0\n\t"
  83301. #endif
  83302. "str r4, [%[r], #64]\n\t"
  83303. /* A[6] * B[11] */
  83304. "ldr r8, [%[a], #24]\n\t"
  83305. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83306. "lsl r6, r8, #16\n\t"
  83307. "lsl r7, r9, #16\n\t"
  83308. "lsr r6, r6, #16\n\t"
  83309. "lsr r7, r7, #16\n\t"
  83310. "mul r7, r6, r7\n\t"
  83311. "adds r5, r5, r7\n\t"
  83312. "adcs r3, r3, #0\n\t"
  83313. "mov r4, #0\n\t"
  83314. "adc r4, r4, #0\n\t"
  83315. "lsr r7, r9, #16\n\t"
  83316. "mul r6, r7, r6\n\t"
  83317. "lsr r7, r6, #16\n\t"
  83318. "lsl r6, r6, #16\n\t"
  83319. "adds r5, r5, r6\n\t"
  83320. "adcs r3, r3, r7\n\t"
  83321. "adc r4, r4, #0\n\t"
  83322. "lsr r6, r8, #16\n\t"
  83323. "lsr r7, r9, #16\n\t"
  83324. "mul r7, r6, r7\n\t"
  83325. "adds r3, r3, r7\n\t"
  83326. "adc r4, r4, #0\n\t"
  83327. "lsl r7, r9, #16\n\t"
  83328. "lsr r7, r7, #16\n\t"
  83329. "mul r6, r7, r6\n\t"
  83330. "lsr r7, r6, #16\n\t"
  83331. "lsl r6, r6, #16\n\t"
  83332. "adds r5, r5, r6\n\t"
  83333. "adcs r3, r3, r7\n\t"
  83334. "adc r4, r4, #0\n\t"
  83335. #else
  83336. "umull r6, r7, r8, r9\n\t"
  83337. "adds r5, r5, r6\n\t"
  83338. "adcs r3, r3, r7\n\t"
  83339. "mov r4, #0\n\t"
  83340. "adc r4, r4, #0\n\t"
  83341. #endif
  83342. /* A[7] * B[10] */
  83343. "ldr r8, [%[a], #28]\n\t"
  83344. "ldr r9, [%[b], #40]\n\t"
  83345. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83346. "lsl r6, r8, #16\n\t"
  83347. "lsl r7, r9, #16\n\t"
  83348. "lsr r6, r6, #16\n\t"
  83349. "lsr r7, r7, #16\n\t"
  83350. "mul r7, r6, r7\n\t"
  83351. "adds r5, r5, r7\n\t"
  83352. "adcs r3, r3, #0\n\t"
  83353. "adc r4, r4, #0\n\t"
  83354. "lsr r7, r9, #16\n\t"
  83355. "mul r6, r7, r6\n\t"
  83356. "lsr r7, r6, #16\n\t"
  83357. "lsl r6, r6, #16\n\t"
  83358. "adds r5, r5, r6\n\t"
  83359. "adcs r3, r3, r7\n\t"
  83360. "adc r4, r4, #0\n\t"
  83361. "lsr r6, r8, #16\n\t"
  83362. "lsr r7, r9, #16\n\t"
  83363. "mul r7, r6, r7\n\t"
  83364. "adds r3, r3, r7\n\t"
  83365. "adc r4, r4, #0\n\t"
  83366. "lsl r7, r9, #16\n\t"
  83367. "lsr r7, r7, #16\n\t"
  83368. "mul r6, r7, r6\n\t"
  83369. "lsr r7, r6, #16\n\t"
  83370. "lsl r6, r6, #16\n\t"
  83371. "adds r5, r5, r6\n\t"
  83372. "adcs r3, r3, r7\n\t"
  83373. "adc r4, r4, #0\n\t"
  83374. #else
  83375. "umull r6, r7, r8, r9\n\t"
  83376. "adds r5, r5, r6\n\t"
  83377. "adcs r3, r3, r7\n\t"
  83378. "adc r4, r4, #0\n\t"
  83379. #endif
  83380. /* A[8] * B[9] */
  83381. "ldr r9, [%[b], #36]\n\t"
  83382. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83383. "lsl r6, r11, #16\n\t"
  83384. "lsl r7, r9, #16\n\t"
  83385. "lsr r6, r6, #16\n\t"
  83386. "lsr r7, r7, #16\n\t"
  83387. "mul r7, r6, r7\n\t"
  83388. "adds r5, r5, r7\n\t"
  83389. "adcs r3, r3, #0\n\t"
  83390. "adc r4, r4, #0\n\t"
  83391. "lsr r7, r9, #16\n\t"
  83392. "mul r6, r7, r6\n\t"
  83393. "lsr r7, r6, #16\n\t"
  83394. "lsl r6, r6, #16\n\t"
  83395. "adds r5, r5, r6\n\t"
  83396. "adcs r3, r3, r7\n\t"
  83397. "adc r4, r4, #0\n\t"
  83398. "lsr r6, r11, #16\n\t"
  83399. "lsr r7, r9, #16\n\t"
  83400. "mul r7, r6, r7\n\t"
  83401. "adds r3, r3, r7\n\t"
  83402. "adc r4, r4, #0\n\t"
  83403. "lsl r7, r9, #16\n\t"
  83404. "lsr r7, r7, #16\n\t"
  83405. "mul r6, r7, r6\n\t"
  83406. "lsr r7, r6, #16\n\t"
  83407. "lsl r6, r6, #16\n\t"
  83408. "adds r5, r5, r6\n\t"
  83409. "adcs r3, r3, r7\n\t"
  83410. "adc r4, r4, #0\n\t"
  83411. #else
  83412. "umull r6, r7, r11, r9\n\t"
  83413. "adds r5, r5, r6\n\t"
  83414. "adcs r3, r3, r7\n\t"
  83415. "adc r4, r4, #0\n\t"
  83416. #endif
  83417. /* A[9] * B[8] */
  83418. "ldr r8, [%[a], #36]\n\t"
  83419. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83420. "lsl r6, r8, #16\n\t"
  83421. "lsl r7, r12, #16\n\t"
  83422. "lsr r6, r6, #16\n\t"
  83423. "lsr r7, r7, #16\n\t"
  83424. "mul r7, r6, r7\n\t"
  83425. "adds r5, r5, r7\n\t"
  83426. "adcs r3, r3, #0\n\t"
  83427. "adc r4, r4, #0\n\t"
  83428. "lsr r7, r12, #16\n\t"
  83429. "mul r6, r7, r6\n\t"
  83430. "lsr r7, r6, #16\n\t"
  83431. "lsl r6, r6, #16\n\t"
  83432. "adds r5, r5, r6\n\t"
  83433. "adcs r3, r3, r7\n\t"
  83434. "adc r4, r4, #0\n\t"
  83435. "lsr r6, r8, #16\n\t"
  83436. "lsr r7, r12, #16\n\t"
  83437. "mul r7, r6, r7\n\t"
  83438. "adds r3, r3, r7\n\t"
  83439. "adc r4, r4, #0\n\t"
  83440. "lsl r7, r12, #16\n\t"
  83441. "lsr r7, r7, #16\n\t"
  83442. "mul r6, r7, r6\n\t"
  83443. "lsr r7, r6, #16\n\t"
  83444. "lsl r6, r6, #16\n\t"
  83445. "adds r5, r5, r6\n\t"
  83446. "adcs r3, r3, r7\n\t"
  83447. "adc r4, r4, #0\n\t"
  83448. #else
  83449. "umull r6, r7, r8, r12\n\t"
  83450. "adds r5, r5, r6\n\t"
  83451. "adcs r3, r3, r7\n\t"
  83452. "adc r4, r4, #0\n\t"
  83453. #endif
  83454. /* A[10] * B[7] */
  83455. "ldr r8, [%[a], #40]\n\t"
  83456. "ldr r9, [%[b], #28]\n\t"
  83457. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83458. "lsl r6, r8, #16\n\t"
  83459. "lsl r7, r9, #16\n\t"
  83460. "lsr r6, r6, #16\n\t"
  83461. "lsr r7, r7, #16\n\t"
  83462. "mul r7, r6, r7\n\t"
  83463. "adds r5, r5, r7\n\t"
  83464. "adcs r3, r3, #0\n\t"
  83465. "adc r4, r4, #0\n\t"
  83466. "lsr r7, r9, #16\n\t"
  83467. "mul r6, r7, r6\n\t"
  83468. "lsr r7, r6, #16\n\t"
  83469. "lsl r6, r6, #16\n\t"
  83470. "adds r5, r5, r6\n\t"
  83471. "adcs r3, r3, r7\n\t"
  83472. "adc r4, r4, #0\n\t"
  83473. "lsr r6, r8, #16\n\t"
  83474. "lsr r7, r9, #16\n\t"
  83475. "mul r7, r6, r7\n\t"
  83476. "adds r3, r3, r7\n\t"
  83477. "adc r4, r4, #0\n\t"
  83478. "lsl r7, r9, #16\n\t"
  83479. "lsr r7, r7, #16\n\t"
  83480. "mul r6, r7, r6\n\t"
  83481. "lsr r7, r6, #16\n\t"
  83482. "lsl r6, r6, #16\n\t"
  83483. "adds r5, r5, r6\n\t"
  83484. "adcs r3, r3, r7\n\t"
  83485. "adc r4, r4, #0\n\t"
  83486. #else
  83487. "umull r6, r7, r8, r9\n\t"
  83488. "adds r5, r5, r6\n\t"
  83489. "adcs r3, r3, r7\n\t"
  83490. "adc r4, r4, #0\n\t"
  83491. #endif
  83492. /* A[11] * B[6] */
  83493. "ldr r8, [%[a], #44]\n\t"
  83494. "ldr r9, [%[b], #24]\n\t"
  83495. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83496. "lsl r6, r8, #16\n\t"
  83497. "lsl r7, r9, #16\n\t"
  83498. "lsr r6, r6, #16\n\t"
  83499. "lsr r7, r7, #16\n\t"
  83500. "mul r7, r6, r7\n\t"
  83501. "adds r5, r5, r7\n\t"
  83502. "adcs r3, r3, #0\n\t"
  83503. "adc r4, r4, #0\n\t"
  83504. "lsr r7, r9, #16\n\t"
  83505. "mul r6, r7, r6\n\t"
  83506. "lsr r7, r6, #16\n\t"
  83507. "lsl r6, r6, #16\n\t"
  83508. "adds r5, r5, r6\n\t"
  83509. "adcs r3, r3, r7\n\t"
  83510. "adc r4, r4, #0\n\t"
  83511. "lsr r6, r8, #16\n\t"
  83512. "lsr r7, r9, #16\n\t"
  83513. "mul r7, r6, r7\n\t"
  83514. "adds r3, r3, r7\n\t"
  83515. "adc r4, r4, #0\n\t"
  83516. "lsl r7, r9, #16\n\t"
  83517. "lsr r7, r7, #16\n\t"
  83518. "mul r6, r7, r6\n\t"
  83519. "lsr r7, r6, #16\n\t"
  83520. "lsl r6, r6, #16\n\t"
  83521. "adds r5, r5, r6\n\t"
  83522. "adcs r3, r3, r7\n\t"
  83523. "adc r4, r4, #0\n\t"
  83524. #else
  83525. "umull r6, r7, r8, r9\n\t"
  83526. "adds r5, r5, r6\n\t"
  83527. "adcs r3, r3, r7\n\t"
  83528. "adc r4, r4, #0\n\t"
  83529. #endif
  83530. "str r5, [%[r], #68]\n\t"
  83531. /* A[11] * B[7] */
  83532. "ldr r9, [%[b], #28]\n\t"
  83533. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83534. "lsl r6, r8, #16\n\t"
  83535. "lsl r7, r9, #16\n\t"
  83536. "lsr r6, r6, #16\n\t"
  83537. "lsr r7, r7, #16\n\t"
  83538. "mul r7, r6, r7\n\t"
  83539. "adds r3, r3, r7\n\t"
  83540. "adcs r4, r4, #0\n\t"
  83541. "mov r5, #0\n\t"
  83542. "adc r5, r5, #0\n\t"
  83543. "lsr r7, r9, #16\n\t"
  83544. "mul r6, r7, r6\n\t"
  83545. "lsr r7, r6, #16\n\t"
  83546. "lsl r6, r6, #16\n\t"
  83547. "adds r3, r3, r6\n\t"
  83548. "adcs r4, r4, r7\n\t"
  83549. "adc r5, r5, #0\n\t"
  83550. "lsr r6, r8, #16\n\t"
  83551. "lsr r7, r9, #16\n\t"
  83552. "mul r7, r6, r7\n\t"
  83553. "adds r4, r4, r7\n\t"
  83554. "adc r5, r5, #0\n\t"
  83555. "lsl r7, r9, #16\n\t"
  83556. "lsr r7, r7, #16\n\t"
  83557. "mul r6, r7, r6\n\t"
  83558. "lsr r7, r6, #16\n\t"
  83559. "lsl r6, r6, #16\n\t"
  83560. "adds r3, r3, r6\n\t"
  83561. "adcs r4, r4, r7\n\t"
  83562. "adc r5, r5, #0\n\t"
  83563. #else
  83564. "umull r6, r7, r8, r9\n\t"
  83565. "adds r3, r3, r6\n\t"
  83566. "adcs r4, r4, r7\n\t"
  83567. "mov r5, #0\n\t"
  83568. "adc r5, r5, #0\n\t"
  83569. #endif
  83570. /* A[10] * B[8] */
  83571. "ldr r8, [%[a], #40]\n\t"
  83572. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83573. "lsl r6, r8, #16\n\t"
  83574. "lsl r7, r12, #16\n\t"
  83575. "lsr r6, r6, #16\n\t"
  83576. "lsr r7, r7, #16\n\t"
  83577. "mul r7, r6, r7\n\t"
  83578. "adds r3, r3, r7\n\t"
  83579. "adcs r4, r4, #0\n\t"
  83580. "adc r5, r5, #0\n\t"
  83581. "lsr r7, r12, #16\n\t"
  83582. "mul r6, r7, r6\n\t"
  83583. "lsr r7, r6, #16\n\t"
  83584. "lsl r6, r6, #16\n\t"
  83585. "adds r3, r3, r6\n\t"
  83586. "adcs r4, r4, r7\n\t"
  83587. "adc r5, r5, #0\n\t"
  83588. "lsr r6, r8, #16\n\t"
  83589. "lsr r7, r12, #16\n\t"
  83590. "mul r7, r6, r7\n\t"
  83591. "adds r4, r4, r7\n\t"
  83592. "adc r5, r5, #0\n\t"
  83593. "lsl r7, r12, #16\n\t"
  83594. "lsr r7, r7, #16\n\t"
  83595. "mul r6, r7, r6\n\t"
  83596. "lsr r7, r6, #16\n\t"
  83597. "lsl r6, r6, #16\n\t"
  83598. "adds r3, r3, r6\n\t"
  83599. "adcs r4, r4, r7\n\t"
  83600. "adc r5, r5, #0\n\t"
  83601. #else
  83602. "umull r6, r7, r8, r12\n\t"
  83603. "adds r3, r3, r6\n\t"
  83604. "adcs r4, r4, r7\n\t"
  83605. "adc r5, r5, #0\n\t"
  83606. #endif
  83607. /* A[9] * B[9] */
  83608. "ldr r11, [%[a], #36]\n\t"
  83609. "ldr r12, [%[b], #36]\n\t"
  83610. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83611. "lsl r6, r11, #16\n\t"
  83612. "lsl r7, r12, #16\n\t"
  83613. "lsr r6, r6, #16\n\t"
  83614. "lsr r7, r7, #16\n\t"
  83615. "mul r7, r6, r7\n\t"
  83616. "adds r3, r3, r7\n\t"
  83617. "adcs r4, r4, #0\n\t"
  83618. "adc r5, r5, #0\n\t"
  83619. "lsr r7, r12, #16\n\t"
  83620. "mul r6, r7, r6\n\t"
  83621. "lsr r7, r6, #16\n\t"
  83622. "lsl r6, r6, #16\n\t"
  83623. "adds r3, r3, r6\n\t"
  83624. "adcs r4, r4, r7\n\t"
  83625. "adc r5, r5, #0\n\t"
  83626. "lsr r6, r11, #16\n\t"
  83627. "lsr r7, r12, #16\n\t"
  83628. "mul r7, r6, r7\n\t"
  83629. "adds r4, r4, r7\n\t"
  83630. "adc r5, r5, #0\n\t"
  83631. "lsl r7, r12, #16\n\t"
  83632. "lsr r7, r7, #16\n\t"
  83633. "mul r6, r7, r6\n\t"
  83634. "lsr r7, r6, #16\n\t"
  83635. "lsl r6, r6, #16\n\t"
  83636. "adds r3, r3, r6\n\t"
  83637. "adcs r4, r4, r7\n\t"
  83638. "adc r5, r5, #0\n\t"
  83639. #else
  83640. "umull r6, r7, r11, r12\n\t"
  83641. "adds r3, r3, r6\n\t"
  83642. "adcs r4, r4, r7\n\t"
  83643. "adc r5, r5, #0\n\t"
  83644. #endif
  83645. /* A[8] * B[10] */
  83646. "ldr r8, [%[a], #32]\n\t"
  83647. "ldr r9, [%[b], #40]\n\t"
  83648. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83649. "lsl r6, r8, #16\n\t"
  83650. "lsl r7, r9, #16\n\t"
  83651. "lsr r6, r6, #16\n\t"
  83652. "lsr r7, r7, #16\n\t"
  83653. "mul r7, r6, r7\n\t"
  83654. "adds r3, r3, r7\n\t"
  83655. "adcs r4, r4, #0\n\t"
  83656. "adc r5, r5, #0\n\t"
  83657. "lsr r7, r9, #16\n\t"
  83658. "mul r6, r7, r6\n\t"
  83659. "lsr r7, r6, #16\n\t"
  83660. "lsl r6, r6, #16\n\t"
  83661. "adds r3, r3, r6\n\t"
  83662. "adcs r4, r4, r7\n\t"
  83663. "adc r5, r5, #0\n\t"
  83664. "lsr r6, r8, #16\n\t"
  83665. "lsr r7, r9, #16\n\t"
  83666. "mul r7, r6, r7\n\t"
  83667. "adds r4, r4, r7\n\t"
  83668. "adc r5, r5, #0\n\t"
  83669. "lsl r7, r9, #16\n\t"
  83670. "lsr r7, r7, #16\n\t"
  83671. "mul r6, r7, r6\n\t"
  83672. "lsr r7, r6, #16\n\t"
  83673. "lsl r6, r6, #16\n\t"
  83674. "adds r3, r3, r6\n\t"
  83675. "adcs r4, r4, r7\n\t"
  83676. "adc r5, r5, #0\n\t"
  83677. #else
  83678. "umull r6, r7, r8, r9\n\t"
  83679. "adds r3, r3, r6\n\t"
  83680. "adcs r4, r4, r7\n\t"
  83681. "adc r5, r5, #0\n\t"
  83682. #endif
  83683. /* A[7] * B[11] */
  83684. "ldr r8, [%[a], #28]\n\t"
  83685. "ldr r9, [%[b], #44]\n\t"
  83686. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83687. "lsl r6, r8, #16\n\t"
  83688. "lsl r7, r9, #16\n\t"
  83689. "lsr r6, r6, #16\n\t"
  83690. "lsr r7, r7, #16\n\t"
  83691. "mul r7, r6, r7\n\t"
  83692. "adds r3, r3, r7\n\t"
  83693. "adcs r4, r4, #0\n\t"
  83694. "adc r5, r5, #0\n\t"
  83695. "lsr r7, r9, #16\n\t"
  83696. "mul r6, r7, r6\n\t"
  83697. "lsr r7, r6, #16\n\t"
  83698. "lsl r6, r6, #16\n\t"
  83699. "adds r3, r3, r6\n\t"
  83700. "adcs r4, r4, r7\n\t"
  83701. "adc r5, r5, #0\n\t"
  83702. "lsr r6, r8, #16\n\t"
  83703. "lsr r7, r9, #16\n\t"
  83704. "mul r7, r6, r7\n\t"
  83705. "adds r4, r4, r7\n\t"
  83706. "adc r5, r5, #0\n\t"
  83707. "lsl r7, r9, #16\n\t"
  83708. "lsr r7, r7, #16\n\t"
  83709. "mul r6, r7, r6\n\t"
  83710. "lsr r7, r6, #16\n\t"
  83711. "lsl r6, r6, #16\n\t"
  83712. "adds r3, r3, r6\n\t"
  83713. "adcs r4, r4, r7\n\t"
  83714. "adc r5, r5, #0\n\t"
  83715. #else
  83716. "umull r6, r7, r8, r9\n\t"
  83717. "adds r3, r3, r6\n\t"
  83718. "adcs r4, r4, r7\n\t"
  83719. "adc r5, r5, #0\n\t"
  83720. #endif
  83721. "str r3, [%[r], #72]\n\t"
  83722. /* A[8] * B[11] */
  83723. "ldr r8, [%[a], #32]\n\t"
  83724. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83725. "lsl r6, r8, #16\n\t"
  83726. "lsl r7, r9, #16\n\t"
  83727. "lsr r6, r6, #16\n\t"
  83728. "lsr r7, r7, #16\n\t"
  83729. "mul r7, r6, r7\n\t"
  83730. "adds r4, r4, r7\n\t"
  83731. "adcs r5, r5, #0\n\t"
  83732. "mov r3, #0\n\t"
  83733. "adc r3, r3, #0\n\t"
  83734. "lsr r7, r9, #16\n\t"
  83735. "mul r6, r7, r6\n\t"
  83736. "lsr r7, r6, #16\n\t"
  83737. "lsl r6, r6, #16\n\t"
  83738. "adds r4, r4, r6\n\t"
  83739. "adcs r5, r5, r7\n\t"
  83740. "adc r3, r3, #0\n\t"
  83741. "lsr r6, r8, #16\n\t"
  83742. "lsr r7, r9, #16\n\t"
  83743. "mul r7, r6, r7\n\t"
  83744. "adds r5, r5, r7\n\t"
  83745. "adc r3, r3, #0\n\t"
  83746. "lsl r7, r9, #16\n\t"
  83747. "lsr r7, r7, #16\n\t"
  83748. "mul r6, r7, r6\n\t"
  83749. "lsr r7, r6, #16\n\t"
  83750. "lsl r6, r6, #16\n\t"
  83751. "adds r4, r4, r6\n\t"
  83752. "adcs r5, r5, r7\n\t"
  83753. "adc r3, r3, #0\n\t"
  83754. #else
  83755. "umull r6, r7, r8, r9\n\t"
  83756. "adds r4, r4, r6\n\t"
  83757. "adcs r5, r5, r7\n\t"
  83758. "mov r3, #0\n\t"
  83759. "adc r3, r3, #0\n\t"
  83760. #endif
  83761. /* A[9] * B[10] */
  83762. "ldr r9, [%[b], #40]\n\t"
  83763. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83764. "lsl r6, r11, #16\n\t"
  83765. "lsl r7, r9, #16\n\t"
  83766. "lsr r6, r6, #16\n\t"
  83767. "lsr r7, r7, #16\n\t"
  83768. "mul r7, r6, r7\n\t"
  83769. "adds r4, r4, r7\n\t"
  83770. "adcs r5, r5, #0\n\t"
  83771. "adc r3, r3, #0\n\t"
  83772. "lsr r7, r9, #16\n\t"
  83773. "mul r6, r7, r6\n\t"
  83774. "lsr r7, r6, #16\n\t"
  83775. "lsl r6, r6, #16\n\t"
  83776. "adds r4, r4, r6\n\t"
  83777. "adcs r5, r5, r7\n\t"
  83778. "adc r3, r3, #0\n\t"
  83779. "lsr r6, r11, #16\n\t"
  83780. "lsr r7, r9, #16\n\t"
  83781. "mul r7, r6, r7\n\t"
  83782. "adds r5, r5, r7\n\t"
  83783. "adc r3, r3, #0\n\t"
  83784. "lsl r7, r9, #16\n\t"
  83785. "lsr r7, r7, #16\n\t"
  83786. "mul r6, r7, r6\n\t"
  83787. "lsr r7, r6, #16\n\t"
  83788. "lsl r6, r6, #16\n\t"
  83789. "adds r4, r4, r6\n\t"
  83790. "adcs r5, r5, r7\n\t"
  83791. "adc r3, r3, #0\n\t"
  83792. #else
  83793. "umull r6, r7, r11, r9\n\t"
  83794. "adds r4, r4, r6\n\t"
  83795. "adcs r5, r5, r7\n\t"
  83796. "adc r3, r3, #0\n\t"
  83797. #endif
  83798. /* A[10] * B[9] */
  83799. "ldr r8, [%[a], #40]\n\t"
  83800. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83801. "lsl r6, r8, #16\n\t"
  83802. "lsl r7, r12, #16\n\t"
  83803. "lsr r6, r6, #16\n\t"
  83804. "lsr r7, r7, #16\n\t"
  83805. "mul r7, r6, r7\n\t"
  83806. "adds r4, r4, r7\n\t"
  83807. "adcs r5, r5, #0\n\t"
  83808. "adc r3, r3, #0\n\t"
  83809. "lsr r7, r12, #16\n\t"
  83810. "mul r6, r7, r6\n\t"
  83811. "lsr r7, r6, #16\n\t"
  83812. "lsl r6, r6, #16\n\t"
  83813. "adds r4, r4, r6\n\t"
  83814. "adcs r5, r5, r7\n\t"
  83815. "adc r3, r3, #0\n\t"
  83816. "lsr r6, r8, #16\n\t"
  83817. "lsr r7, r12, #16\n\t"
  83818. "mul r7, r6, r7\n\t"
  83819. "adds r5, r5, r7\n\t"
  83820. "adc r3, r3, #0\n\t"
  83821. "lsl r7, r12, #16\n\t"
  83822. "lsr r7, r7, #16\n\t"
  83823. "mul r6, r7, r6\n\t"
  83824. "lsr r7, r6, #16\n\t"
  83825. "lsl r6, r6, #16\n\t"
  83826. "adds r4, r4, r6\n\t"
  83827. "adcs r5, r5, r7\n\t"
  83828. "adc r3, r3, #0\n\t"
  83829. #else
  83830. "umull r6, r7, r8, r12\n\t"
  83831. "adds r4, r4, r6\n\t"
  83832. "adcs r5, r5, r7\n\t"
  83833. "adc r3, r3, #0\n\t"
  83834. #endif
  83835. /* A[11] * B[8] */
  83836. "ldr r8, [%[a], #44]\n\t"
  83837. "ldr r9, [%[b], #32]\n\t"
  83838. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83839. "lsl r6, r8, #16\n\t"
  83840. "lsl r7, r9, #16\n\t"
  83841. "lsr r6, r6, #16\n\t"
  83842. "lsr r7, r7, #16\n\t"
  83843. "mul r7, r6, r7\n\t"
  83844. "adds r4, r4, r7\n\t"
  83845. "adcs r5, r5, #0\n\t"
  83846. "adc r3, r3, #0\n\t"
  83847. "lsr r7, r9, #16\n\t"
  83848. "mul r6, r7, r6\n\t"
  83849. "lsr r7, r6, #16\n\t"
  83850. "lsl r6, r6, #16\n\t"
  83851. "adds r4, r4, r6\n\t"
  83852. "adcs r5, r5, r7\n\t"
  83853. "adc r3, r3, #0\n\t"
  83854. "lsr r6, r8, #16\n\t"
  83855. "lsr r7, r9, #16\n\t"
  83856. "mul r7, r6, r7\n\t"
  83857. "adds r5, r5, r7\n\t"
  83858. "adc r3, r3, #0\n\t"
  83859. "lsl r7, r9, #16\n\t"
  83860. "lsr r7, r7, #16\n\t"
  83861. "mul r6, r7, r6\n\t"
  83862. "lsr r7, r6, #16\n\t"
  83863. "lsl r6, r6, #16\n\t"
  83864. "adds r4, r4, r6\n\t"
  83865. "adcs r5, r5, r7\n\t"
  83866. "adc r3, r3, #0\n\t"
  83867. #else
  83868. "umull r6, r7, r8, r9\n\t"
  83869. "adds r4, r4, r6\n\t"
  83870. "adcs r5, r5, r7\n\t"
  83871. "adc r3, r3, #0\n\t"
  83872. #endif
  83873. "str r4, [%[r], #76]\n\t"
  83874. /* A[11] * B[9] */
  83875. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83876. "lsl r6, r8, #16\n\t"
  83877. "lsl r7, r12, #16\n\t"
  83878. "lsr r6, r6, #16\n\t"
  83879. "lsr r7, r7, #16\n\t"
  83880. "mul r7, r6, r7\n\t"
  83881. "adds r5, r5, r7\n\t"
  83882. "adcs r3, r3, #0\n\t"
  83883. "mov r4, #0\n\t"
  83884. "adc r4, r4, #0\n\t"
  83885. "lsr r7, r12, #16\n\t"
  83886. "mul r6, r7, r6\n\t"
  83887. "lsr r7, r6, #16\n\t"
  83888. "lsl r6, r6, #16\n\t"
  83889. "adds r5, r5, r6\n\t"
  83890. "adcs r3, r3, r7\n\t"
  83891. "adc r4, r4, #0\n\t"
  83892. "lsr r6, r8, #16\n\t"
  83893. "lsr r7, r12, #16\n\t"
  83894. "mul r7, r6, r7\n\t"
  83895. "adds r3, r3, r7\n\t"
  83896. "adc r4, r4, #0\n\t"
  83897. "lsl r7, r12, #16\n\t"
  83898. "lsr r7, r7, #16\n\t"
  83899. "mul r6, r7, r6\n\t"
  83900. "lsr r7, r6, #16\n\t"
  83901. "lsl r6, r6, #16\n\t"
  83902. "adds r5, r5, r6\n\t"
  83903. "adcs r3, r3, r7\n\t"
  83904. "adc r4, r4, #0\n\t"
  83905. #else
  83906. "umull r6, r7, r8, r12\n\t"
  83907. "adds r5, r5, r6\n\t"
  83908. "adcs r3, r3, r7\n\t"
  83909. "mov r4, #0\n\t"
  83910. "adc r4, r4, #0\n\t"
  83911. #endif
  83912. /* A[10] * B[10] */
  83913. "ldr r11, [%[a], #40]\n\t"
  83914. "ldr r12, [%[b], #40]\n\t"
  83915. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83916. "lsl r6, r11, #16\n\t"
  83917. "lsl r7, r12, #16\n\t"
  83918. "lsr r6, r6, #16\n\t"
  83919. "lsr r7, r7, #16\n\t"
  83920. "mul r7, r6, r7\n\t"
  83921. "adds r5, r5, r7\n\t"
  83922. "adcs r3, r3, #0\n\t"
  83923. "adc r4, r4, #0\n\t"
  83924. "lsr r7, r12, #16\n\t"
  83925. "mul r6, r7, r6\n\t"
  83926. "lsr r7, r6, #16\n\t"
  83927. "lsl r6, r6, #16\n\t"
  83928. "adds r5, r5, r6\n\t"
  83929. "adcs r3, r3, r7\n\t"
  83930. "adc r4, r4, #0\n\t"
  83931. "lsr r6, r11, #16\n\t"
  83932. "lsr r7, r12, #16\n\t"
  83933. "mul r7, r6, r7\n\t"
  83934. "adds r3, r3, r7\n\t"
  83935. "adc r4, r4, #0\n\t"
  83936. "lsl r7, r12, #16\n\t"
  83937. "lsr r7, r7, #16\n\t"
  83938. "mul r6, r7, r6\n\t"
  83939. "lsr r7, r6, #16\n\t"
  83940. "lsl r6, r6, #16\n\t"
  83941. "adds r5, r5, r6\n\t"
  83942. "adcs r3, r3, r7\n\t"
  83943. "adc r4, r4, #0\n\t"
  83944. #else
  83945. "umull r6, r7, r11, r12\n\t"
  83946. "adds r5, r5, r6\n\t"
  83947. "adcs r3, r3, r7\n\t"
  83948. "adc r4, r4, #0\n\t"
  83949. #endif
  83950. /* A[9] * B[11] */
  83951. "ldr r8, [%[a], #36]\n\t"
  83952. "ldr r9, [%[b], #44]\n\t"
  83953. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83954. "lsl r6, r8, #16\n\t"
  83955. "lsl r7, r9, #16\n\t"
  83956. "lsr r6, r6, #16\n\t"
  83957. "lsr r7, r7, #16\n\t"
  83958. "mul r7, r6, r7\n\t"
  83959. "adds r5, r5, r7\n\t"
  83960. "adcs r3, r3, #0\n\t"
  83961. "adc r4, r4, #0\n\t"
  83962. "lsr r7, r9, #16\n\t"
  83963. "mul r6, r7, r6\n\t"
  83964. "lsr r7, r6, #16\n\t"
  83965. "lsl r6, r6, #16\n\t"
  83966. "adds r5, r5, r6\n\t"
  83967. "adcs r3, r3, r7\n\t"
  83968. "adc r4, r4, #0\n\t"
  83969. "lsr r6, r8, #16\n\t"
  83970. "lsr r7, r9, #16\n\t"
  83971. "mul r7, r6, r7\n\t"
  83972. "adds r3, r3, r7\n\t"
  83973. "adc r4, r4, #0\n\t"
  83974. "lsl r7, r9, #16\n\t"
  83975. "lsr r7, r7, #16\n\t"
  83976. "mul r6, r7, r6\n\t"
  83977. "lsr r7, r6, #16\n\t"
  83978. "lsl r6, r6, #16\n\t"
  83979. "adds r5, r5, r6\n\t"
  83980. "adcs r3, r3, r7\n\t"
  83981. "adc r4, r4, #0\n\t"
  83982. #else
  83983. "umull r6, r7, r8, r9\n\t"
  83984. "adds r5, r5, r6\n\t"
  83985. "adcs r3, r3, r7\n\t"
  83986. "adc r4, r4, #0\n\t"
  83987. #endif
  83988. "str r5, [%[r], #80]\n\t"
  83989. /* A[10] * B[11] */
  83990. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  83991. "lsl r6, r11, #16\n\t"
  83992. "lsl r7, r9, #16\n\t"
  83993. "lsr r6, r6, #16\n\t"
  83994. "lsr r7, r7, #16\n\t"
  83995. "mul r7, r6, r7\n\t"
  83996. "adds r3, r3, r7\n\t"
  83997. "adcs r4, r4, #0\n\t"
  83998. "mov r5, #0\n\t"
  83999. "adc r5, r5, #0\n\t"
  84000. "lsr r7, r9, #16\n\t"
  84001. "mul r6, r7, r6\n\t"
  84002. "lsr r7, r6, #16\n\t"
  84003. "lsl r6, r6, #16\n\t"
  84004. "adds r3, r3, r6\n\t"
  84005. "adcs r4, r4, r7\n\t"
  84006. "adc r5, r5, #0\n\t"
  84007. "lsr r6, r11, #16\n\t"
  84008. "lsr r7, r9, #16\n\t"
  84009. "mul r7, r6, r7\n\t"
  84010. "adds r4, r4, r7\n\t"
  84011. "adc r5, r5, #0\n\t"
  84012. "lsl r7, r9, #16\n\t"
  84013. "lsr r7, r7, #16\n\t"
  84014. "mul r6, r7, r6\n\t"
  84015. "lsr r7, r6, #16\n\t"
  84016. "lsl r6, r6, #16\n\t"
  84017. "adds r3, r3, r6\n\t"
  84018. "adcs r4, r4, r7\n\t"
  84019. "adc r5, r5, #0\n\t"
  84020. #else
  84021. "umull r6, r7, r11, r9\n\t"
  84022. "adds r3, r3, r6\n\t"
  84023. "adcs r4, r4, r7\n\t"
  84024. "mov r5, #0\n\t"
  84025. "adc r5, r5, #0\n\t"
  84026. #endif
  84027. /* A[11] * B[10] */
  84028. "ldr r8, [%[a], #44]\n\t"
  84029. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84030. "lsl r6, r8, #16\n\t"
  84031. "lsl r7, r12, #16\n\t"
  84032. "lsr r6, r6, #16\n\t"
  84033. "lsr r7, r7, #16\n\t"
  84034. "mul r7, r6, r7\n\t"
  84035. "adds r3, r3, r7\n\t"
  84036. "adcs r4, r4, #0\n\t"
  84037. "adc r5, r5, #0\n\t"
  84038. "lsr r7, r12, #16\n\t"
  84039. "mul r6, r7, r6\n\t"
  84040. "lsr r7, r6, #16\n\t"
  84041. "lsl r6, r6, #16\n\t"
  84042. "adds r3, r3, r6\n\t"
  84043. "adcs r4, r4, r7\n\t"
  84044. "adc r5, r5, #0\n\t"
  84045. "lsr r6, r8, #16\n\t"
  84046. "lsr r7, r12, #16\n\t"
  84047. "mul r7, r6, r7\n\t"
  84048. "adds r4, r4, r7\n\t"
  84049. "adc r5, r5, #0\n\t"
  84050. "lsl r7, r12, #16\n\t"
  84051. "lsr r7, r7, #16\n\t"
  84052. "mul r6, r7, r6\n\t"
  84053. "lsr r7, r6, #16\n\t"
  84054. "lsl r6, r6, #16\n\t"
  84055. "adds r3, r3, r6\n\t"
  84056. "adcs r4, r4, r7\n\t"
  84057. "adc r5, r5, #0\n\t"
  84058. #else
  84059. "umull r6, r7, r8, r12\n\t"
  84060. "adds r3, r3, r6\n\t"
  84061. "adcs r4, r4, r7\n\t"
  84062. "adc r5, r5, #0\n\t"
  84063. #endif
  84064. "str r3, [%[r], #84]\n\t"
  84065. /* A[11] * B[11] */
  84066. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84067. "lsl r6, r8, #16\n\t"
  84068. "lsl r7, r9, #16\n\t"
  84069. "lsr r6, r6, #16\n\t"
  84070. "lsr r7, r7, #16\n\t"
  84071. "mul r7, r6, r7\n\t"
  84072. "adds r4, r4, r7\n\t"
  84073. "adc r5, r5, #0\n\t"
  84074. "lsr r7, r9, #16\n\t"
  84075. "mul r6, r7, r6\n\t"
  84076. "lsr r7, r6, #16\n\t"
  84077. "lsl r6, r6, #16\n\t"
  84078. "adds r4, r4, r6\n\t"
  84079. "adc r5, r5, r7\n\t"
  84080. "lsr r6, r8, #16\n\t"
  84081. "lsr r7, r9, #16\n\t"
  84082. "mul r7, r6, r7\n\t"
  84083. "add r5, r5, r7\n\t"
  84084. "lsl r7, r9, #16\n\t"
  84085. "lsr r7, r7, #16\n\t"
  84086. "mul r6, r7, r6\n\t"
  84087. "lsr r7, r6, #16\n\t"
  84088. "lsl r6, r6, #16\n\t"
  84089. "adds r4, r4, r6\n\t"
  84090. "adc r5, r5, r7\n\t"
  84091. #else
  84092. "umlal r4, r5, r8, r9\n\t"
  84093. #endif
  84094. "str r4, [%[r], #88]\n\t"
  84095. "str r5, [%[r], #92]\n\t"
  84096. "ldm sp!, {r3, r4, r5, r6}\n\t"
  84097. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  84098. "ldm sp!, {r3, r4, r5, r6}\n\t"
  84099. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  84100. "ldm sp!, {r3, r4, r5, r6}\n\t"
  84101. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  84102. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  84103. :
  84104. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  84105. );
  84106. }
  84107. #endif /* WOLFSSL_SP_SMALL */
  84108. #ifdef WOLFSSL_SP_SMALL
  84109. /* Square a and put result in r. (r = a * a)
  84110. *
  84111. * r A single precision integer.
  84112. * a A single precision integer.
  84113. */
  84114. static void sp_384_sqr_12(sp_digit* r_p, const sp_digit* a_p)
  84115. {
  84116. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  84117. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  84118. __asm__ __volatile__ (
  84119. "sub sp, sp, #0x60\n\t"
  84120. "ldr lr, [%[a]]\n\t"
  84121. "umull r8, r6, lr, lr\n\t"
  84122. "str r8, [sp]\n\t"
  84123. "mov r7, #0\n\t"
  84124. "mov r8, #0\n\t"
  84125. "mov r5, #4\n\t"
  84126. "\n"
  84127. "L_sp_384_sqr_12_outer_%=: \n\t"
  84128. "subs r3, r5, #44\n\t"
  84129. "it cc\n\t"
  84130. "movcc r3, #0\n\t"
  84131. "sub r4, r5, r3\n\t"
  84132. "\n"
  84133. "L_sp_384_sqr_12_inner_%=: \n\t"
  84134. "ldr lr, [%[a], r3]\n\t"
  84135. "ldr r11, [%[a], r4]\n\t"
  84136. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84137. "lsl r9, lr, #16\n\t"
  84138. "lsl r10, r11, #16\n\t"
  84139. "lsr r9, r9, #16\n\t"
  84140. "lsr r10, r10, #16\n\t"
  84141. "mul r10, r9, r10\n\t"
  84142. "adds r6, r6, r10\n\t"
  84143. "adcs r7, r7, #0\n\t"
  84144. "adc r8, r8, #0\n\t"
  84145. "adds r6, r6, r10\n\t"
  84146. "adcs r7, r7, #0\n\t"
  84147. "adc r8, r8, #0\n\t"
  84148. "lsr r10, r11, #16\n\t"
  84149. "mul r9, r10, r9\n\t"
  84150. "lsr r10, r9, #16\n\t"
  84151. "lsl r9, r9, #16\n\t"
  84152. "adds r6, r6, r9\n\t"
  84153. "adcs r7, r7, r10\n\t"
  84154. "adc r8, r8, #0\n\t"
  84155. "adds r6, r6, r9\n\t"
  84156. "adcs r7, r7, r10\n\t"
  84157. "adc r8, r8, #0\n\t"
  84158. "lsr r9, lr, #16\n\t"
  84159. "lsr r10, r11, #16\n\t"
  84160. "mul r10, r9, r10\n\t"
  84161. "adds r7, r7, r10\n\t"
  84162. "adc r8, r8, #0\n\t"
  84163. "adds r7, r7, r10\n\t"
  84164. "adc r8, r8, #0\n\t"
  84165. "lsl r10, r11, #16\n\t"
  84166. "lsr r10, r10, #16\n\t"
  84167. "mul r9, r10, r9\n\t"
  84168. "lsr r10, r9, #16\n\t"
  84169. "lsl r9, r9, #16\n\t"
  84170. "adds r6, r6, r9\n\t"
  84171. "adcs r7, r7, r10\n\t"
  84172. "adc r8, r8, #0\n\t"
  84173. "adds r6, r6, r9\n\t"
  84174. "adcs r7, r7, r10\n\t"
  84175. "adc r8, r8, #0\n\t"
  84176. #else
  84177. "umull r9, r10, lr, r11\n\t"
  84178. "adds r6, r6, r9\n\t"
  84179. "adcs r7, r7, r10\n\t"
  84180. "adc r8, r8, #0\n\t"
  84181. "adds r6, r6, r9\n\t"
  84182. "adcs r7, r7, r10\n\t"
  84183. "adc r8, r8, #0\n\t"
  84184. #endif
  84185. "add r3, r3, #4\n\t"
  84186. "sub r4, r4, #4\n\t"
  84187. "cmp r3, r4\n\t"
  84188. "bgt L_sp_384_sqr_12_inner_done_%=\n\t"
  84189. "blt L_sp_384_sqr_12_inner_%=\n\t"
  84190. "ldr lr, [%[a], r3]\n\t"
  84191. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84192. "lsl r9, lr, #16\n\t"
  84193. "lsr r10, lr, #16\n\t"
  84194. "lsr r9, r9, #16\n\t"
  84195. "mov r11, r9\n\t"
  84196. "mul r9, r11, r9\n\t"
  84197. "mov r11, r10\n\t"
  84198. "mul r10, r11, r10\n\t"
  84199. "adds r6, r6, r9\n\t"
  84200. "adcs r7, r7, r10\n\t"
  84201. "adc r8, r8, #0\n\t"
  84202. "lsr r10, lr, #16\n\t"
  84203. "lsl r9, lr, #16\n\t"
  84204. "lsr r9, r9, #16\n\t"
  84205. "mul r9, r10, r9\n\t"
  84206. "lsr r10, r9, #15\n\t"
  84207. "lsl r9, r9, #17\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, lr\n\t"
  84213. "adds r6, r6, r9\n\t"
  84214. "adcs r7, r7, r10\n\t"
  84215. "adc r8, r8, #0\n\t"
  84216. #endif
  84217. "\n"
  84218. "L_sp_384_sqr_12_inner_done_%=: \n\t"
  84219. "str r6, [sp, r5]\n\t"
  84220. "mov r6, r7\n\t"
  84221. "mov r7, r8\n\t"
  84222. "mov r8, #0\n\t"
  84223. "add r5, r5, #4\n\t"
  84224. "cmp r5, #0x54\n\t"
  84225. "ble L_sp_384_sqr_12_outer_%=\n\t"
  84226. "ldr lr, [%[a], #44]\n\t"
  84227. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84228. "lsl r9, lr, #16\n\t"
  84229. "lsr r10, lr, #16\n\t"
  84230. "lsr r9, r9, #16\n\t"
  84231. "mov r11, r9\n\t"
  84232. "mul r9, r11, r9\n\t"
  84233. "mov r11, r10\n\t"
  84234. "mul r10, r11, r10\n\t"
  84235. "adds r6, r6, r9\n\t"
  84236. "adc r7, r7, r10\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. "adc r7, r7, r10\n\t"
  84245. #else
  84246. "umull r9, r10, lr, lr\n\t"
  84247. "adds r6, r6, r9\n\t"
  84248. "adc r7, r7, r10\n\t"
  84249. #endif
  84250. "str r6, [sp, r5]\n\t"
  84251. "add r5, r5, #4\n\t"
  84252. "str r7, [sp, r5]\n\t"
  84253. "\n"
  84254. "L_sp_384_sqr_12_store_%=: \n\t"
  84255. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  84256. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  84257. "subs r5, r5, #32\n\t"
  84258. "bgt L_sp_384_sqr_12_store_%=\n\t"
  84259. : [r] "+r" (r), [a] "+r" (a)
  84260. :
  84261. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  84262. );
  84263. }
  84264. #else
  84265. /* Square a and put result in r. (r = a * a)
  84266. *
  84267. * r A single precision integer.
  84268. * a A single precision integer.
  84269. */
  84270. static void sp_384_sqr_12(sp_digit* r_p, const sp_digit* a_p)
  84271. {
  84272. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  84273. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  84274. __asm__ __volatile__ (
  84275. "sub sp, sp, #48\n\t"
  84276. /* A[0] * A[0] */
  84277. "ldr r10, [%[a]]\n\t"
  84278. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84279. "lsr r9, r10, #16\n\t"
  84280. "lsl r2, r10, #16\n\t"
  84281. "lsr r2, r2, #16\n\t"
  84282. "mul r8, r2, r2\n\t"
  84283. "mul r3, r9, r9\n\t"
  84284. "mul r2, r9, r2\n\t"
  84285. "lsr r9, r2, #15\n\t"
  84286. "lsl r2, r2, #17\n\t"
  84287. "adds r8, r8, r2\n\t"
  84288. "adc r3, r3, r9\n\t"
  84289. #else
  84290. "umull r8, r3, r10, r10\n\t"
  84291. #endif
  84292. "mov r4, #0\n\t"
  84293. "str r8, [sp]\n\t"
  84294. /* A[0] * A[1] */
  84295. "ldr r10, [%[a], #4]\n\t"
  84296. "ldr r12, [%[a]]\n\t"
  84297. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84298. "lsl r8, r10, #16\n\t"
  84299. "lsl r9, r12, #16\n\t"
  84300. "lsr r8, r8, #16\n\t"
  84301. "lsr r9, r9, #16\n\t"
  84302. "mul r9, r8, r9\n\t"
  84303. "adds r3, r3, r9\n\t"
  84304. "adcs r4, r4, #0\n\t"
  84305. "mov r2, #0\n\t"
  84306. "adc r2, r2, #0\n\t"
  84307. "adds r3, r3, r9\n\t"
  84308. "adcs r4, r4, #0\n\t"
  84309. "adc r2, r2, #0\n\t"
  84310. "lsr r9, r12, #16\n\t"
  84311. "mul r8, r9, r8\n\t"
  84312. "lsr r9, r8, #16\n\t"
  84313. "lsl r8, r8, #16\n\t"
  84314. "adds r3, r3, r8\n\t"
  84315. "adcs r4, r4, r9\n\t"
  84316. "adc r2, r2, #0\n\t"
  84317. "adds r3, r3, r8\n\t"
  84318. "adcs r4, r4, r9\n\t"
  84319. "adc r2, r2, #0\n\t"
  84320. "lsr r8, r10, #16\n\t"
  84321. "lsr r9, r12, #16\n\t"
  84322. "mul r9, r8, r9\n\t"
  84323. "adds r4, r4, r9\n\t"
  84324. "adc r2, r2, #0\n\t"
  84325. "adds r4, r4, r9\n\t"
  84326. "adc r2, r2, #0\n\t"
  84327. "lsl r9, r12, #16\n\t"
  84328. "lsr r9, r9, #16\n\t"
  84329. "mul r8, r9, r8\n\t"
  84330. "lsr r9, r8, #16\n\t"
  84331. "lsl r8, r8, #16\n\t"
  84332. "adds r3, r3, r8\n\t"
  84333. "adcs r4, r4, r9\n\t"
  84334. "adc r2, r2, #0\n\t"
  84335. "adds r3, r3, r8\n\t"
  84336. "adcs r4, r4, r9\n\t"
  84337. "adc r2, r2, #0\n\t"
  84338. #else
  84339. "umull r8, r9, r10, r12\n\t"
  84340. "adds r3, r3, r8\n\t"
  84341. "adcs r4, r4, r9\n\t"
  84342. "mov r2, #0\n\t"
  84343. "adc r2, r2, #0\n\t"
  84344. "adds r3, r3, r8\n\t"
  84345. "adcs r4, r4, r9\n\t"
  84346. "mov r2, #0\n\t"
  84347. "adc r2, r2, #0\n\t"
  84348. #endif
  84349. "str r3, [sp, #4]\n\t"
  84350. /* A[0] * A[2] */
  84351. "ldr r10, [%[a], #8]\n\t"
  84352. "ldr r12, [%[a]]\n\t"
  84353. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84354. "lsl r8, r10, #16\n\t"
  84355. "lsl r9, r12, #16\n\t"
  84356. "lsr r8, r8, #16\n\t"
  84357. "lsr r9, r9, #16\n\t"
  84358. "mul r9, r8, r9\n\t"
  84359. "adds r4, r4, r9\n\t"
  84360. "adcs r2, r2, #0\n\t"
  84361. "mov r3, #0\n\t"
  84362. "adc r3, r3, #0\n\t"
  84363. "adds r4, r4, r9\n\t"
  84364. "adcs r2, r2, #0\n\t"
  84365. "adc r3, r3, #0\n\t"
  84366. "lsr r9, r12, #16\n\t"
  84367. "mul r8, r9, r8\n\t"
  84368. "lsr r9, r8, #16\n\t"
  84369. "lsl r8, r8, #16\n\t"
  84370. "adds r4, r4, r8\n\t"
  84371. "adcs r2, r2, r9\n\t"
  84372. "adc r3, r3, #0\n\t"
  84373. "adds r4, r4, r8\n\t"
  84374. "adcs r2, r2, r9\n\t"
  84375. "adc r3, r3, #0\n\t"
  84376. "lsr r8, r10, #16\n\t"
  84377. "lsr r9, r12, #16\n\t"
  84378. "mul r9, r8, r9\n\t"
  84379. "adds r2, r2, r9\n\t"
  84380. "adc r3, r3, #0\n\t"
  84381. "adds r2, r2, r9\n\t"
  84382. "adc r3, r3, #0\n\t"
  84383. "lsl r9, r12, #16\n\t"
  84384. "lsr r9, r9, #16\n\t"
  84385. "mul r8, r9, r8\n\t"
  84386. "lsr r9, r8, #16\n\t"
  84387. "lsl r8, r8, #16\n\t"
  84388. "adds r4, r4, r8\n\t"
  84389. "adcs r2, r2, r9\n\t"
  84390. "adc r3, r3, #0\n\t"
  84391. "adds r4, r4, r8\n\t"
  84392. "adcs r2, r2, r9\n\t"
  84393. "adc r3, r3, #0\n\t"
  84394. #else
  84395. "umull r8, r9, r10, r12\n\t"
  84396. "adds r4, r4, r8\n\t"
  84397. "adcs r2, r2, r9\n\t"
  84398. "mov r3, #0\n\t"
  84399. "adc r3, r3, #0\n\t"
  84400. "adds r4, r4, r8\n\t"
  84401. "adcs r2, r2, r9\n\t"
  84402. "mov r3, #0\n\t"
  84403. "adc r3, r3, #0\n\t"
  84404. #endif
  84405. /* A[1] * A[1] */
  84406. "ldr r10, [%[a], #4]\n\t"
  84407. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84408. "lsl r8, r10, #16\n\t"
  84409. "lsr r9, r10, #16\n\t"
  84410. "lsr r8, r8, #16\n\t"
  84411. "mov r12, r8\n\t"
  84412. "mul r8, r12, r8\n\t"
  84413. "mov r12, r9\n\t"
  84414. "mul r9, r12, r9\n\t"
  84415. "adds r4, r4, r8\n\t"
  84416. "adcs r2, r2, r9\n\t"
  84417. "adc r3, r3, #0\n\t"
  84418. "lsr r9, r10, #16\n\t"
  84419. "lsl r8, r10, #16\n\t"
  84420. "lsr r8, r8, #16\n\t"
  84421. "mul r8, r9, r8\n\t"
  84422. "lsr r9, r8, #15\n\t"
  84423. "lsl r8, r8, #17\n\t"
  84424. "adds r4, r4, r8\n\t"
  84425. "adcs r2, r2, r9\n\t"
  84426. "adc r3, r3, #0\n\t"
  84427. #else
  84428. "umull r8, r9, r10, r10\n\t"
  84429. "adds r4, r4, r8\n\t"
  84430. "adcs r2, r2, r9\n\t"
  84431. "adc r3, r3, #0\n\t"
  84432. #endif
  84433. "str r4, [sp, #8]\n\t"
  84434. /* A[0] * A[3] */
  84435. "ldr r10, [%[a], #12]\n\t"
  84436. "ldr r12, [%[a]]\n\t"
  84437. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84438. "lsl r8, r10, #16\n\t"
  84439. "lsl r9, r12, #16\n\t"
  84440. "lsr r8, r8, #16\n\t"
  84441. "lsr r9, r9, #16\n\t"
  84442. "mul r9, r8, r9\n\t"
  84443. "adds r2, r2, r9\n\t"
  84444. "adcs r3, r3, #0\n\t"
  84445. "mov r4, #0\n\t"
  84446. "adc r4, r4, #0\n\t"
  84447. "adds r2, r2, r9\n\t"
  84448. "adcs r3, r3, #0\n\t"
  84449. "adc r4, r4, #0\n\t"
  84450. "lsr r9, r12, #16\n\t"
  84451. "mul r8, r9, r8\n\t"
  84452. "lsr r9, r8, #16\n\t"
  84453. "lsl r8, r8, #16\n\t"
  84454. "adds r2, r2, r8\n\t"
  84455. "adcs r3, r3, r9\n\t"
  84456. "adc r4, r4, #0\n\t"
  84457. "adds r2, r2, r8\n\t"
  84458. "adcs r3, r3, r9\n\t"
  84459. "adc r4, r4, #0\n\t"
  84460. "lsr r8, r10, #16\n\t"
  84461. "lsr r9, r12, #16\n\t"
  84462. "mul r9, r8, r9\n\t"
  84463. "adds r3, r3, r9\n\t"
  84464. "adc r4, r4, #0\n\t"
  84465. "adds r3, r3, r9\n\t"
  84466. "adc r4, r4, #0\n\t"
  84467. "lsl r9, r12, #16\n\t"
  84468. "lsr r9, r9, #16\n\t"
  84469. "mul r8, r9, r8\n\t"
  84470. "lsr r9, r8, #16\n\t"
  84471. "lsl r8, r8, #16\n\t"
  84472. "adds r2, r2, r8\n\t"
  84473. "adcs r3, r3, r9\n\t"
  84474. "adc r4, r4, #0\n\t"
  84475. "adds r2, r2, r8\n\t"
  84476. "adcs r3, r3, r9\n\t"
  84477. "adc r4, r4, #0\n\t"
  84478. #else
  84479. "umull r8, r9, r10, r12\n\t"
  84480. "adds r2, r2, r8\n\t"
  84481. "adcs r3, r3, r9\n\t"
  84482. "mov r4, #0\n\t"
  84483. "adc r4, r4, #0\n\t"
  84484. "adds r2, r2, r8\n\t"
  84485. "adcs r3, r3, r9\n\t"
  84486. "mov r4, #0\n\t"
  84487. "adc r4, r4, #0\n\t"
  84488. #endif
  84489. /* A[1] * A[2] */
  84490. "ldr r10, [%[a], #8]\n\t"
  84491. "ldr r12, [%[a], #4]\n\t"
  84492. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84493. "lsl r8, r10, #16\n\t"
  84494. "lsl r9, r12, #16\n\t"
  84495. "lsr r8, r8, #16\n\t"
  84496. "lsr r9, r9, #16\n\t"
  84497. "mul r9, r8, r9\n\t"
  84498. "adds r2, r2, r9\n\t"
  84499. "adcs r3, r3, #0\n\t"
  84500. "adc r4, r4, #0\n\t"
  84501. "adds r2, r2, r9\n\t"
  84502. "adcs r3, r3, #0\n\t"
  84503. "adc r4, r4, #0\n\t"
  84504. "lsr r9, r12, #16\n\t"
  84505. "mul r8, r9, r8\n\t"
  84506. "lsr r9, r8, #16\n\t"
  84507. "lsl r8, r8, #16\n\t"
  84508. "adds r2, r2, r8\n\t"
  84509. "adcs r3, r3, r9\n\t"
  84510. "adc r4, r4, #0\n\t"
  84511. "adds r2, r2, r8\n\t"
  84512. "adcs r3, r3, r9\n\t"
  84513. "adc r4, r4, #0\n\t"
  84514. "lsr r8, r10, #16\n\t"
  84515. "lsr r9, r12, #16\n\t"
  84516. "mul r9, r8, r9\n\t"
  84517. "adds r3, r3, r9\n\t"
  84518. "adc r4, r4, #0\n\t"
  84519. "adds r3, r3, r9\n\t"
  84520. "adc r4, r4, #0\n\t"
  84521. "lsl r9, r12, #16\n\t"
  84522. "lsr r9, r9, #16\n\t"
  84523. "mul r8, r9, r8\n\t"
  84524. "lsr r9, r8, #16\n\t"
  84525. "lsl r8, r8, #16\n\t"
  84526. "adds r2, r2, r8\n\t"
  84527. "adcs r3, r3, r9\n\t"
  84528. "adc r4, r4, #0\n\t"
  84529. "adds r2, r2, r8\n\t"
  84530. "adcs r3, r3, r9\n\t"
  84531. "adc r4, r4, #0\n\t"
  84532. #else
  84533. "umull r8, r9, r10, r12\n\t"
  84534. "adds r2, r2, r8\n\t"
  84535. "adcs r3, r3, r9\n\t"
  84536. "adc r4, r4, #0\n\t"
  84537. "adds r2, r2, r8\n\t"
  84538. "adcs r3, r3, r9\n\t"
  84539. "adc r4, r4, #0\n\t"
  84540. #endif
  84541. "str r2, [sp, #12]\n\t"
  84542. /* A[0] * A[4] */
  84543. "ldr r10, [%[a], #16]\n\t"
  84544. "ldr r12, [%[a]]\n\t"
  84545. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84546. "lsl r8, r10, #16\n\t"
  84547. "lsl r9, r12, #16\n\t"
  84548. "lsr r8, r8, #16\n\t"
  84549. "lsr r9, r9, #16\n\t"
  84550. "mul r9, r8, r9\n\t"
  84551. "adds r3, r3, r9\n\t"
  84552. "adcs r4, r4, #0\n\t"
  84553. "mov r2, #0\n\t"
  84554. "adc r2, r2, #0\n\t"
  84555. "adds r3, r3, r9\n\t"
  84556. "adcs r4, r4, #0\n\t"
  84557. "adc r2, r2, #0\n\t"
  84558. "lsr r9, r12, #16\n\t"
  84559. "mul r8, r9, r8\n\t"
  84560. "lsr r9, r8, #16\n\t"
  84561. "lsl r8, r8, #16\n\t"
  84562. "adds r3, r3, r8\n\t"
  84563. "adcs r4, r4, r9\n\t"
  84564. "adc r2, r2, #0\n\t"
  84565. "adds r3, r3, r8\n\t"
  84566. "adcs r4, r4, r9\n\t"
  84567. "adc r2, r2, #0\n\t"
  84568. "lsr r8, r10, #16\n\t"
  84569. "lsr r9, r12, #16\n\t"
  84570. "mul r9, r8, r9\n\t"
  84571. "adds r4, r4, r9\n\t"
  84572. "adc r2, r2, #0\n\t"
  84573. "adds r4, r4, r9\n\t"
  84574. "adc r2, r2, #0\n\t"
  84575. "lsl r9, r12, #16\n\t"
  84576. "lsr r9, r9, #16\n\t"
  84577. "mul r8, r9, r8\n\t"
  84578. "lsr r9, r8, #16\n\t"
  84579. "lsl r8, r8, #16\n\t"
  84580. "adds r3, r3, r8\n\t"
  84581. "adcs r4, r4, r9\n\t"
  84582. "adc r2, r2, #0\n\t"
  84583. "adds r3, r3, r8\n\t"
  84584. "adcs r4, r4, r9\n\t"
  84585. "adc r2, r2, #0\n\t"
  84586. #else
  84587. "umull r8, r9, r10, r12\n\t"
  84588. "adds r3, r3, r8\n\t"
  84589. "adcs r4, r4, r9\n\t"
  84590. "mov r2, #0\n\t"
  84591. "adc r2, r2, #0\n\t"
  84592. "adds r3, r3, r8\n\t"
  84593. "adcs r4, r4, r9\n\t"
  84594. "mov r2, #0\n\t"
  84595. "adc r2, r2, #0\n\t"
  84596. #endif
  84597. /* A[1] * A[3] */
  84598. "ldr r10, [%[a], #12]\n\t"
  84599. "ldr r12, [%[a], #4]\n\t"
  84600. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84601. "lsl r8, r10, #16\n\t"
  84602. "lsl r9, r12, #16\n\t"
  84603. "lsr r8, r8, #16\n\t"
  84604. "lsr r9, r9, #16\n\t"
  84605. "mul r9, r8, r9\n\t"
  84606. "adds r3, r3, r9\n\t"
  84607. "adcs r4, r4, #0\n\t"
  84608. "adc r2, r2, #0\n\t"
  84609. "adds r3, r3, r9\n\t"
  84610. "adcs r4, r4, #0\n\t"
  84611. "adc r2, r2, #0\n\t"
  84612. "lsr r9, r12, #16\n\t"
  84613. "mul r8, r9, r8\n\t"
  84614. "lsr r9, r8, #16\n\t"
  84615. "lsl r8, r8, #16\n\t"
  84616. "adds r3, r3, r8\n\t"
  84617. "adcs r4, r4, r9\n\t"
  84618. "adc r2, r2, #0\n\t"
  84619. "adds r3, r3, r8\n\t"
  84620. "adcs r4, r4, r9\n\t"
  84621. "adc r2, r2, #0\n\t"
  84622. "lsr r8, r10, #16\n\t"
  84623. "lsr r9, r12, #16\n\t"
  84624. "mul r9, r8, r9\n\t"
  84625. "adds r4, r4, r9\n\t"
  84626. "adc r2, r2, #0\n\t"
  84627. "adds r4, r4, r9\n\t"
  84628. "adc r2, r2, #0\n\t"
  84629. "lsl r9, r12, #16\n\t"
  84630. "lsr r9, r9, #16\n\t"
  84631. "mul r8, r9, r8\n\t"
  84632. "lsr r9, r8, #16\n\t"
  84633. "lsl r8, r8, #16\n\t"
  84634. "adds r3, r3, r8\n\t"
  84635. "adcs r4, r4, r9\n\t"
  84636. "adc r2, r2, #0\n\t"
  84637. "adds r3, r3, r8\n\t"
  84638. "adcs r4, r4, r9\n\t"
  84639. "adc r2, r2, #0\n\t"
  84640. #else
  84641. "umull r8, r9, r10, r12\n\t"
  84642. "adds r3, r3, r8\n\t"
  84643. "adcs r4, r4, r9\n\t"
  84644. "adc r2, r2, #0\n\t"
  84645. "adds r3, r3, r8\n\t"
  84646. "adcs r4, r4, r9\n\t"
  84647. "adc r2, r2, #0\n\t"
  84648. #endif
  84649. /* A[2] * A[2] */
  84650. "ldr r10, [%[a], #8]\n\t"
  84651. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84652. "lsl r8, r10, #16\n\t"
  84653. "lsr r9, r10, #16\n\t"
  84654. "lsr r8, r8, #16\n\t"
  84655. "mov r12, r8\n\t"
  84656. "mul r8, r12, r8\n\t"
  84657. "mov r12, r9\n\t"
  84658. "mul r9, r12, r9\n\t"
  84659. "adds r3, r3, r8\n\t"
  84660. "adcs r4, r4, r9\n\t"
  84661. "adc r2, r2, #0\n\t"
  84662. "lsr r9, r10, #16\n\t"
  84663. "lsl r8, r10, #16\n\t"
  84664. "lsr r8, r8, #16\n\t"
  84665. "mul r8, r9, r8\n\t"
  84666. "lsr r9, r8, #15\n\t"
  84667. "lsl r8, r8, #17\n\t"
  84668. "adds r3, r3, r8\n\t"
  84669. "adcs r4, r4, r9\n\t"
  84670. "adc r2, r2, #0\n\t"
  84671. #else
  84672. "umull r8, r9, r10, r10\n\t"
  84673. "adds r3, r3, r8\n\t"
  84674. "adcs r4, r4, r9\n\t"
  84675. "adc r2, r2, #0\n\t"
  84676. #endif
  84677. "str r3, [sp, #16]\n\t"
  84678. /* A[0] * A[5] */
  84679. "ldr r10, [%[a], #20]\n\t"
  84680. "ldr r12, [%[a]]\n\t"
  84681. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84682. "lsl r8, r10, #16\n\t"
  84683. "lsl r5, r12, #16\n\t"
  84684. "lsr r8, r8, #16\n\t"
  84685. "lsr r5, r5, #16\n\t"
  84686. "mul r5, r8, r5\n\t"
  84687. "lsr r9, r12, #16\n\t"
  84688. "mul r8, r9, r8\n\t"
  84689. "lsr r6, r8, #16\n\t"
  84690. "lsl r8, r8, #16\n\t"
  84691. "adds r5, r5, r8\n\t"
  84692. "adc r6, r6, #0\n\t"
  84693. "lsr r8, r10, #16\n\t"
  84694. "mul r9, r8, r9\n\t"
  84695. "add r6, r6, r9\n\t"
  84696. "lsl r9, r12, #16\n\t"
  84697. "lsr r9, r9, #16\n\t"
  84698. "mul r8, r9, r8\n\t"
  84699. "lsr r9, r8, #16\n\t"
  84700. "lsl r8, r8, #16\n\t"
  84701. "adds r5, r5, r8\n\t"
  84702. "adc r6, r6, r9\n\t"
  84703. #else
  84704. "umull r5, r6, r10, r12\n\t"
  84705. #endif
  84706. "mov r3, #0\n\t"
  84707. "mov r7, #0\n\t"
  84708. /* A[1] * A[4] */
  84709. "ldr r10, [%[a], #16]\n\t"
  84710. "ldr r12, [%[a], #4]\n\t"
  84711. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84712. "lsl r8, r10, #16\n\t"
  84713. "lsl r9, r12, #16\n\t"
  84714. "lsr r8, r8, #16\n\t"
  84715. "lsr r9, r9, #16\n\t"
  84716. "mul r9, r8, r9\n\t"
  84717. "adds r5, r5, r9\n\t"
  84718. "adcs r6, r6, #0\n\t"
  84719. "adc r7, r7, #0\n\t"
  84720. "lsr r9, r12, #16\n\t"
  84721. "mul r8, r9, r8\n\t"
  84722. "lsr r9, r8, #16\n\t"
  84723. "lsl r8, r8, #16\n\t"
  84724. "adds r5, r5, r8\n\t"
  84725. "adcs r6, r6, r9\n\t"
  84726. "adc r7, r7, #0\n\t"
  84727. "lsr r8, r10, #16\n\t"
  84728. "lsr r9, r12, #16\n\t"
  84729. "mul r9, r8, r9\n\t"
  84730. "adds r6, r6, r9\n\t"
  84731. "adc r7, r7, #0\n\t"
  84732. "lsl r9, r12, #16\n\t"
  84733. "lsr r9, r9, #16\n\t"
  84734. "mul r8, r9, r8\n\t"
  84735. "lsr r9, r8, #16\n\t"
  84736. "lsl r8, r8, #16\n\t"
  84737. "adds r5, r5, r8\n\t"
  84738. "adcs r6, r6, r9\n\t"
  84739. "adc r7, r7, #0\n\t"
  84740. #else
  84741. "umull r8, r9, r10, r12\n\t"
  84742. "adds r5, r5, r8\n\t"
  84743. "adcs r6, r6, r9\n\t"
  84744. "adc r7, r7, #0\n\t"
  84745. #endif
  84746. /* A[2] * A[3] */
  84747. "ldr r10, [%[a], #12]\n\t"
  84748. "ldr r12, [%[a], #8]\n\t"
  84749. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84750. "lsl r8, r10, #16\n\t"
  84751. "lsl r9, r12, #16\n\t"
  84752. "lsr r8, r8, #16\n\t"
  84753. "lsr r9, r9, #16\n\t"
  84754. "mul r9, r8, r9\n\t"
  84755. "adds r5, r5, r9\n\t"
  84756. "adcs r6, r6, #0\n\t"
  84757. "adc r7, r7, #0\n\t"
  84758. "lsr r9, r12, #16\n\t"
  84759. "mul r8, r9, r8\n\t"
  84760. "lsr r9, r8, #16\n\t"
  84761. "lsl r8, r8, #16\n\t"
  84762. "adds r5, r5, r8\n\t"
  84763. "adcs r6, r6, r9\n\t"
  84764. "adc r7, r7, #0\n\t"
  84765. "lsr r8, r10, #16\n\t"
  84766. "lsr r9, r12, #16\n\t"
  84767. "mul r9, r8, r9\n\t"
  84768. "adds r6, r6, r9\n\t"
  84769. "adc r7, r7, #0\n\t"
  84770. "lsl r9, r12, #16\n\t"
  84771. "lsr r9, r9, #16\n\t"
  84772. "mul r8, r9, r8\n\t"
  84773. "lsr r9, r8, #16\n\t"
  84774. "lsl r8, r8, #16\n\t"
  84775. "adds r5, r5, r8\n\t"
  84776. "adcs r6, r6, r9\n\t"
  84777. "adc r7, r7, #0\n\t"
  84778. #else
  84779. "umull r8, r9, r10, r12\n\t"
  84780. "adds r5, r5, r8\n\t"
  84781. "adcs r6, r6, r9\n\t"
  84782. "adc r7, r7, #0\n\t"
  84783. #endif
  84784. "adds r5, r5, r5\n\t"
  84785. "adcs r6, r6, r6\n\t"
  84786. "adc r7, r7, r7\n\t"
  84787. "adds r4, r4, r5\n\t"
  84788. "adcs r2, r2, r6\n\t"
  84789. "adc r3, r3, r7\n\t"
  84790. "str r4, [sp, #20]\n\t"
  84791. /* A[0] * A[6] */
  84792. "ldr r10, [%[a], #24]\n\t"
  84793. "ldr r12, [%[a]]\n\t"
  84794. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84795. "lsl r8, r10, #16\n\t"
  84796. "lsl r5, r12, #16\n\t"
  84797. "lsr r8, r8, #16\n\t"
  84798. "lsr r5, r5, #16\n\t"
  84799. "mul r5, r8, r5\n\t"
  84800. "lsr r9, r12, #16\n\t"
  84801. "mul r8, r9, r8\n\t"
  84802. "lsr r6, r8, #16\n\t"
  84803. "lsl r8, r8, #16\n\t"
  84804. "adds r5, r5, r8\n\t"
  84805. "adc r6, r6, #0\n\t"
  84806. "lsr r8, r10, #16\n\t"
  84807. "mul r9, r8, r9\n\t"
  84808. "add r6, r6, r9\n\t"
  84809. "lsl r9, r12, #16\n\t"
  84810. "lsr r9, r9, #16\n\t"
  84811. "mul r8, r9, r8\n\t"
  84812. "lsr r9, r8, #16\n\t"
  84813. "lsl r8, r8, #16\n\t"
  84814. "adds r5, r5, r8\n\t"
  84815. "adc r6, r6, r9\n\t"
  84816. #else
  84817. "umull r5, r6, r10, r12\n\t"
  84818. #endif
  84819. "mov r4, #0\n\t"
  84820. "mov r7, #0\n\t"
  84821. /* A[1] * A[5] */
  84822. "ldr r10, [%[a], #20]\n\t"
  84823. "ldr r12, [%[a], #4]\n\t"
  84824. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84825. "lsl r8, r10, #16\n\t"
  84826. "lsl r9, r12, #16\n\t"
  84827. "lsr r8, r8, #16\n\t"
  84828. "lsr r9, r9, #16\n\t"
  84829. "mul r9, r8, r9\n\t"
  84830. "adds r5, r5, r9\n\t"
  84831. "adcs r6, r6, #0\n\t"
  84832. "adc r7, r7, #0\n\t"
  84833. "lsr r9, r12, #16\n\t"
  84834. "mul r8, r9, r8\n\t"
  84835. "lsr r9, r8, #16\n\t"
  84836. "lsl r8, r8, #16\n\t"
  84837. "adds r5, r5, r8\n\t"
  84838. "adcs r6, r6, r9\n\t"
  84839. "adc r7, r7, #0\n\t"
  84840. "lsr r8, r10, #16\n\t"
  84841. "lsr r9, r12, #16\n\t"
  84842. "mul r9, r8, r9\n\t"
  84843. "adds r6, r6, r9\n\t"
  84844. "adc r7, r7, #0\n\t"
  84845. "lsl r9, r12, #16\n\t"
  84846. "lsr r9, r9, #16\n\t"
  84847. "mul r8, r9, r8\n\t"
  84848. "lsr r9, r8, #16\n\t"
  84849. "lsl r8, r8, #16\n\t"
  84850. "adds r5, r5, r8\n\t"
  84851. "adcs r6, r6, r9\n\t"
  84852. "adc r7, r7, #0\n\t"
  84853. #else
  84854. "umull r8, r9, r10, r12\n\t"
  84855. "adds r5, r5, r8\n\t"
  84856. "adcs r6, r6, r9\n\t"
  84857. "adc r7, r7, #0\n\t"
  84858. #endif
  84859. /* A[2] * A[4] */
  84860. "ldr r10, [%[a], #16]\n\t"
  84861. "ldr r12, [%[a], #8]\n\t"
  84862. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84863. "lsl r8, r10, #16\n\t"
  84864. "lsl r9, r12, #16\n\t"
  84865. "lsr r8, r8, #16\n\t"
  84866. "lsr r9, r9, #16\n\t"
  84867. "mul r9, r8, r9\n\t"
  84868. "adds r5, r5, r9\n\t"
  84869. "adcs r6, r6, #0\n\t"
  84870. "adc r7, r7, #0\n\t"
  84871. "lsr r9, r12, #16\n\t"
  84872. "mul r8, r9, r8\n\t"
  84873. "lsr r9, r8, #16\n\t"
  84874. "lsl r8, r8, #16\n\t"
  84875. "adds r5, r5, r8\n\t"
  84876. "adcs r6, r6, r9\n\t"
  84877. "adc r7, r7, #0\n\t"
  84878. "lsr r8, r10, #16\n\t"
  84879. "lsr r9, r12, #16\n\t"
  84880. "mul r9, r8, r9\n\t"
  84881. "adds r6, r6, r9\n\t"
  84882. "adc r7, r7, #0\n\t"
  84883. "lsl r9, r12, #16\n\t"
  84884. "lsr r9, r9, #16\n\t"
  84885. "mul r8, r9, r8\n\t"
  84886. "lsr r9, r8, #16\n\t"
  84887. "lsl r8, r8, #16\n\t"
  84888. "adds r5, r5, r8\n\t"
  84889. "adcs r6, r6, r9\n\t"
  84890. "adc r7, r7, #0\n\t"
  84891. #else
  84892. "umull r8, r9, r10, r12\n\t"
  84893. "adds r5, r5, r8\n\t"
  84894. "adcs r6, r6, r9\n\t"
  84895. "adc r7, r7, #0\n\t"
  84896. #endif
  84897. /* A[3] * A[3] */
  84898. "ldr r10, [%[a], #12]\n\t"
  84899. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84900. "lsl r8, r10, #16\n\t"
  84901. "lsr r9, r10, #16\n\t"
  84902. "lsr r8, r8, #16\n\t"
  84903. "mov r12, r8\n\t"
  84904. "mul r8, r12, r8\n\t"
  84905. "mov r12, r9\n\t"
  84906. "mul r9, r12, r9\n\t"
  84907. "adds r2, r2, r8\n\t"
  84908. "adcs r3, r3, r9\n\t"
  84909. "adc r4, r4, #0\n\t"
  84910. "lsr r9, r10, #16\n\t"
  84911. "lsl r8, r10, #16\n\t"
  84912. "lsr r8, r8, #16\n\t"
  84913. "mul r8, r9, r8\n\t"
  84914. "lsr r9, r8, #15\n\t"
  84915. "lsl r8, r8, #17\n\t"
  84916. "adds r2, r2, r8\n\t"
  84917. "adcs r3, r3, r9\n\t"
  84918. "adc r4, r4, #0\n\t"
  84919. "adds r5, r5, r5\n\t"
  84920. "adcs r6, r6, r6\n\t"
  84921. "adc r7, r7, r7\n\t"
  84922. #else
  84923. "umull r8, r9, r10, r10\n\t"
  84924. "adds r5, r5, r5\n\t"
  84925. "adcs r6, r6, r6\n\t"
  84926. "adc r7, r7, r7\n\t"
  84927. "adds r2, r2, r8\n\t"
  84928. "adcs r3, r3, r9\n\t"
  84929. "adc r4, r4, #0\n\t"
  84930. #endif
  84931. "adds r2, r2, r5\n\t"
  84932. "adcs r3, r3, r6\n\t"
  84933. "adc r4, r4, r7\n\t"
  84934. "str r2, [sp, #24]\n\t"
  84935. /* A[0] * A[7] */
  84936. "ldr r10, [%[a], #28]\n\t"
  84937. "ldr r12, [%[a]]\n\t"
  84938. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84939. "lsl r8, r10, #16\n\t"
  84940. "lsl r5, r12, #16\n\t"
  84941. "lsr r8, r8, #16\n\t"
  84942. "lsr r5, r5, #16\n\t"
  84943. "mul r5, r8, r5\n\t"
  84944. "lsr r9, r12, #16\n\t"
  84945. "mul r8, r9, r8\n\t"
  84946. "lsr r6, r8, #16\n\t"
  84947. "lsl r8, r8, #16\n\t"
  84948. "adds r5, r5, r8\n\t"
  84949. "adc r6, r6, #0\n\t"
  84950. "lsr r8, r10, #16\n\t"
  84951. "mul r9, r8, r9\n\t"
  84952. "add r6, r6, r9\n\t"
  84953. "lsl r9, r12, #16\n\t"
  84954. "lsr r9, r9, #16\n\t"
  84955. "mul r8, r9, r8\n\t"
  84956. "lsr r9, r8, #16\n\t"
  84957. "lsl r8, r8, #16\n\t"
  84958. "adds r5, r5, r8\n\t"
  84959. "adc r6, r6, r9\n\t"
  84960. #else
  84961. "umull r5, r6, r10, r12\n\t"
  84962. #endif
  84963. "mov r2, #0\n\t"
  84964. "mov r7, #0\n\t"
  84965. /* A[1] * A[6] */
  84966. "ldr r10, [%[a], #24]\n\t"
  84967. "ldr r12, [%[a], #4]\n\t"
  84968. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  84969. "lsl r8, r10, #16\n\t"
  84970. "lsl r9, r12, #16\n\t"
  84971. "lsr r8, r8, #16\n\t"
  84972. "lsr r9, r9, #16\n\t"
  84973. "mul r9, r8, r9\n\t"
  84974. "adds r5, r5, r9\n\t"
  84975. "adcs r6, r6, #0\n\t"
  84976. "adc r7, r7, #0\n\t"
  84977. "lsr r9, r12, #16\n\t"
  84978. "mul r8, r9, r8\n\t"
  84979. "lsr r9, r8, #16\n\t"
  84980. "lsl r8, r8, #16\n\t"
  84981. "adds r5, r5, r8\n\t"
  84982. "adcs r6, r6, r9\n\t"
  84983. "adc r7, r7, #0\n\t"
  84984. "lsr r8, r10, #16\n\t"
  84985. "lsr r9, r12, #16\n\t"
  84986. "mul r9, r8, r9\n\t"
  84987. "adds r6, r6, r9\n\t"
  84988. "adc r7, r7, #0\n\t"
  84989. "lsl r9, r12, #16\n\t"
  84990. "lsr r9, r9, #16\n\t"
  84991. "mul r8, r9, r8\n\t"
  84992. "lsr r9, r8, #16\n\t"
  84993. "lsl r8, r8, #16\n\t"
  84994. "adds r5, r5, r8\n\t"
  84995. "adcs r6, r6, r9\n\t"
  84996. "adc r7, r7, #0\n\t"
  84997. #else
  84998. "umull r8, r9, r10, r12\n\t"
  84999. "adds r5, r5, r8\n\t"
  85000. "adcs r6, r6, r9\n\t"
  85001. "adc r7, r7, #0\n\t"
  85002. #endif
  85003. /* A[2] * A[5] */
  85004. "ldr r10, [%[a], #20]\n\t"
  85005. "ldr r12, [%[a], #8]\n\t"
  85006. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85007. "lsl r8, r10, #16\n\t"
  85008. "lsl r9, r12, #16\n\t"
  85009. "lsr r8, r8, #16\n\t"
  85010. "lsr r9, r9, #16\n\t"
  85011. "mul r9, r8, r9\n\t"
  85012. "adds r5, r5, r9\n\t"
  85013. "adcs r6, r6, #0\n\t"
  85014. "adc r7, r7, #0\n\t"
  85015. "lsr r9, r12, #16\n\t"
  85016. "mul r8, r9, r8\n\t"
  85017. "lsr r9, r8, #16\n\t"
  85018. "lsl r8, r8, #16\n\t"
  85019. "adds r5, r5, r8\n\t"
  85020. "adcs r6, r6, r9\n\t"
  85021. "adc r7, r7, #0\n\t"
  85022. "lsr r8, r10, #16\n\t"
  85023. "lsr r9, r12, #16\n\t"
  85024. "mul r9, r8, r9\n\t"
  85025. "adds r6, r6, r9\n\t"
  85026. "adc r7, r7, #0\n\t"
  85027. "lsl r9, r12, #16\n\t"
  85028. "lsr r9, r9, #16\n\t"
  85029. "mul r8, r9, r8\n\t"
  85030. "lsr r9, r8, #16\n\t"
  85031. "lsl r8, r8, #16\n\t"
  85032. "adds r5, r5, r8\n\t"
  85033. "adcs r6, r6, r9\n\t"
  85034. "adc r7, r7, #0\n\t"
  85035. #else
  85036. "umull r8, r9, r10, r12\n\t"
  85037. "adds r5, r5, r8\n\t"
  85038. "adcs r6, r6, r9\n\t"
  85039. "adc r7, r7, #0\n\t"
  85040. #endif
  85041. /* A[3] * A[4] */
  85042. "ldr r10, [%[a], #16]\n\t"
  85043. "ldr r12, [%[a], #12]\n\t"
  85044. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85045. "lsl r8, r10, #16\n\t"
  85046. "lsl r9, r12, #16\n\t"
  85047. "lsr r8, r8, #16\n\t"
  85048. "lsr r9, r9, #16\n\t"
  85049. "mul r9, r8, r9\n\t"
  85050. "adds r5, r5, r9\n\t"
  85051. "adcs r6, r6, #0\n\t"
  85052. "adc r7, r7, #0\n\t"
  85053. "lsr r9, r12, #16\n\t"
  85054. "mul r8, r9, r8\n\t"
  85055. "lsr r9, r8, #16\n\t"
  85056. "lsl r8, r8, #16\n\t"
  85057. "adds r5, r5, r8\n\t"
  85058. "adcs r6, r6, r9\n\t"
  85059. "adc r7, r7, #0\n\t"
  85060. "lsr r8, r10, #16\n\t"
  85061. "lsr r9, r12, #16\n\t"
  85062. "mul r9, r8, r9\n\t"
  85063. "adds r6, r6, r9\n\t"
  85064. "adc r7, r7, #0\n\t"
  85065. "lsl r9, r12, #16\n\t"
  85066. "lsr r9, r9, #16\n\t"
  85067. "mul r8, r9, r8\n\t"
  85068. "lsr r9, r8, #16\n\t"
  85069. "lsl r8, r8, #16\n\t"
  85070. "adds r5, r5, r8\n\t"
  85071. "adcs r6, r6, r9\n\t"
  85072. "adc r7, r7, #0\n\t"
  85073. #else
  85074. "umull r8, r9, r10, r12\n\t"
  85075. "adds r5, r5, r8\n\t"
  85076. "adcs r6, r6, r9\n\t"
  85077. "adc r7, r7, #0\n\t"
  85078. #endif
  85079. "adds r5, r5, r5\n\t"
  85080. "adcs r6, r6, r6\n\t"
  85081. "adc r7, r7, r7\n\t"
  85082. "adds r3, r3, r5\n\t"
  85083. "adcs r4, r4, r6\n\t"
  85084. "adc r2, r2, r7\n\t"
  85085. "str r3, [sp, #28]\n\t"
  85086. /* A[0] * A[8] */
  85087. "ldr r10, [%[a], #32]\n\t"
  85088. "ldr r12, [%[a]]\n\t"
  85089. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85090. "lsl r8, r10, #16\n\t"
  85091. "lsl r5, r12, #16\n\t"
  85092. "lsr r8, r8, #16\n\t"
  85093. "lsr r5, r5, #16\n\t"
  85094. "mul r5, r8, r5\n\t"
  85095. "lsr r9, r12, #16\n\t"
  85096. "mul r8, r9, r8\n\t"
  85097. "lsr r6, r8, #16\n\t"
  85098. "lsl r8, r8, #16\n\t"
  85099. "adds r5, r5, r8\n\t"
  85100. "adc r6, r6, #0\n\t"
  85101. "lsr r8, r10, #16\n\t"
  85102. "mul r9, r8, r9\n\t"
  85103. "add r6, r6, r9\n\t"
  85104. "lsl r9, r12, #16\n\t"
  85105. "lsr r9, r9, #16\n\t"
  85106. "mul r8, r9, r8\n\t"
  85107. "lsr r9, r8, #16\n\t"
  85108. "lsl r8, r8, #16\n\t"
  85109. "adds r5, r5, r8\n\t"
  85110. "adc r6, r6, r9\n\t"
  85111. #else
  85112. "umull r5, r6, r10, r12\n\t"
  85113. #endif
  85114. "mov r3, #0\n\t"
  85115. "mov r7, #0\n\t"
  85116. /* A[1] * A[7] */
  85117. "ldr r10, [%[a], #28]\n\t"
  85118. "ldr r12, [%[a], #4]\n\t"
  85119. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85120. "lsl r8, r10, #16\n\t"
  85121. "lsl r9, r12, #16\n\t"
  85122. "lsr r8, r8, #16\n\t"
  85123. "lsr r9, r9, #16\n\t"
  85124. "mul r9, r8, r9\n\t"
  85125. "adds r5, r5, r9\n\t"
  85126. "adcs r6, r6, #0\n\t"
  85127. "adc r7, r7, #0\n\t"
  85128. "lsr r9, r12, #16\n\t"
  85129. "mul r8, r9, r8\n\t"
  85130. "lsr r9, r8, #16\n\t"
  85131. "lsl r8, r8, #16\n\t"
  85132. "adds r5, r5, r8\n\t"
  85133. "adcs r6, r6, r9\n\t"
  85134. "adc r7, r7, #0\n\t"
  85135. "lsr r8, r10, #16\n\t"
  85136. "lsr r9, r12, #16\n\t"
  85137. "mul r9, r8, r9\n\t"
  85138. "adds r6, r6, r9\n\t"
  85139. "adc r7, r7, #0\n\t"
  85140. "lsl r9, r12, #16\n\t"
  85141. "lsr r9, r9, #16\n\t"
  85142. "mul r8, r9, r8\n\t"
  85143. "lsr r9, r8, #16\n\t"
  85144. "lsl r8, r8, #16\n\t"
  85145. "adds r5, r5, r8\n\t"
  85146. "adcs r6, r6, r9\n\t"
  85147. "adc r7, r7, #0\n\t"
  85148. #else
  85149. "umull r8, r9, r10, r12\n\t"
  85150. "adds r5, r5, r8\n\t"
  85151. "adcs r6, r6, r9\n\t"
  85152. "adc r7, r7, #0\n\t"
  85153. #endif
  85154. /* A[2] * A[6] */
  85155. "ldr r10, [%[a], #24]\n\t"
  85156. "ldr r12, [%[a], #8]\n\t"
  85157. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85158. "lsl r8, r10, #16\n\t"
  85159. "lsl r9, r12, #16\n\t"
  85160. "lsr r8, r8, #16\n\t"
  85161. "lsr r9, r9, #16\n\t"
  85162. "mul r9, r8, r9\n\t"
  85163. "adds r5, r5, r9\n\t"
  85164. "adcs r6, r6, #0\n\t"
  85165. "adc r7, r7, #0\n\t"
  85166. "lsr r9, r12, #16\n\t"
  85167. "mul r8, r9, r8\n\t"
  85168. "lsr r9, r8, #16\n\t"
  85169. "lsl r8, r8, #16\n\t"
  85170. "adds r5, r5, r8\n\t"
  85171. "adcs r6, r6, r9\n\t"
  85172. "adc r7, r7, #0\n\t"
  85173. "lsr r8, r10, #16\n\t"
  85174. "lsr r9, r12, #16\n\t"
  85175. "mul r9, r8, r9\n\t"
  85176. "adds r6, r6, r9\n\t"
  85177. "adc r7, r7, #0\n\t"
  85178. "lsl r9, r12, #16\n\t"
  85179. "lsr r9, r9, #16\n\t"
  85180. "mul r8, r9, r8\n\t"
  85181. "lsr r9, r8, #16\n\t"
  85182. "lsl r8, r8, #16\n\t"
  85183. "adds r5, r5, r8\n\t"
  85184. "adcs r6, r6, r9\n\t"
  85185. "adc r7, r7, #0\n\t"
  85186. #else
  85187. "umull r8, r9, r10, r12\n\t"
  85188. "adds r5, r5, r8\n\t"
  85189. "adcs r6, r6, r9\n\t"
  85190. "adc r7, r7, #0\n\t"
  85191. #endif
  85192. /* A[3] * A[5] */
  85193. "ldr r10, [%[a], #20]\n\t"
  85194. "ldr r12, [%[a], #12]\n\t"
  85195. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85196. "lsl r8, r10, #16\n\t"
  85197. "lsl r9, r12, #16\n\t"
  85198. "lsr r8, r8, #16\n\t"
  85199. "lsr r9, r9, #16\n\t"
  85200. "mul r9, r8, r9\n\t"
  85201. "adds r5, r5, r9\n\t"
  85202. "adcs r6, r6, #0\n\t"
  85203. "adc r7, r7, #0\n\t"
  85204. "lsr r9, r12, #16\n\t"
  85205. "mul r8, r9, r8\n\t"
  85206. "lsr r9, r8, #16\n\t"
  85207. "lsl r8, r8, #16\n\t"
  85208. "adds r5, r5, r8\n\t"
  85209. "adcs r6, r6, r9\n\t"
  85210. "adc r7, r7, #0\n\t"
  85211. "lsr r8, r10, #16\n\t"
  85212. "lsr r9, r12, #16\n\t"
  85213. "mul r9, r8, r9\n\t"
  85214. "adds r6, r6, r9\n\t"
  85215. "adc r7, r7, #0\n\t"
  85216. "lsl r9, r12, #16\n\t"
  85217. "lsr r9, r9, #16\n\t"
  85218. "mul r8, r9, r8\n\t"
  85219. "lsr r9, r8, #16\n\t"
  85220. "lsl r8, r8, #16\n\t"
  85221. "adds r5, r5, r8\n\t"
  85222. "adcs r6, r6, r9\n\t"
  85223. "adc r7, r7, #0\n\t"
  85224. #else
  85225. "umull r8, r9, r10, r12\n\t"
  85226. "adds r5, r5, r8\n\t"
  85227. "adcs r6, r6, r9\n\t"
  85228. "adc r7, r7, #0\n\t"
  85229. #endif
  85230. /* A[4] * A[4] */
  85231. "ldr r10, [%[a], #16]\n\t"
  85232. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85233. "lsl r8, r10, #16\n\t"
  85234. "lsr r9, r10, #16\n\t"
  85235. "lsr r8, r8, #16\n\t"
  85236. "mov r12, r8\n\t"
  85237. "mul r8, r12, r8\n\t"
  85238. "mov r12, r9\n\t"
  85239. "mul r9, r12, r9\n\t"
  85240. "adds r4, r4, r8\n\t"
  85241. "adcs r2, r2, r9\n\t"
  85242. "adc r3, r3, #0\n\t"
  85243. "lsr r9, r10, #16\n\t"
  85244. "lsl r8, r10, #16\n\t"
  85245. "lsr r8, r8, #16\n\t"
  85246. "mul r8, r9, r8\n\t"
  85247. "lsr r9, r8, #15\n\t"
  85248. "lsl r8, r8, #17\n\t"
  85249. "adds r4, r4, r8\n\t"
  85250. "adcs r2, r2, r9\n\t"
  85251. "adc r3, r3, #0\n\t"
  85252. "adds r5, r5, r5\n\t"
  85253. "adcs r6, r6, r6\n\t"
  85254. "adc r7, r7, r7\n\t"
  85255. #else
  85256. "umull r8, r9, r10, r10\n\t"
  85257. "adds r5, r5, r5\n\t"
  85258. "adcs r6, r6, r6\n\t"
  85259. "adc r7, r7, r7\n\t"
  85260. "adds r4, r4, r8\n\t"
  85261. "adcs r2, r2, r9\n\t"
  85262. "adc r3, r3, #0\n\t"
  85263. #endif
  85264. "adds r4, r4, r5\n\t"
  85265. "adcs r2, r2, r6\n\t"
  85266. "adc r3, r3, r7\n\t"
  85267. "str r4, [sp, #32]\n\t"
  85268. /* A[0] * A[9] */
  85269. "ldr r10, [%[a], #36]\n\t"
  85270. "ldr r12, [%[a]]\n\t"
  85271. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85272. "lsl r8, r10, #16\n\t"
  85273. "lsl r5, r12, #16\n\t"
  85274. "lsr r8, r8, #16\n\t"
  85275. "lsr r5, r5, #16\n\t"
  85276. "mul r5, r8, r5\n\t"
  85277. "lsr r9, r12, #16\n\t"
  85278. "mul r8, r9, r8\n\t"
  85279. "lsr r6, r8, #16\n\t"
  85280. "lsl r8, r8, #16\n\t"
  85281. "adds r5, r5, r8\n\t"
  85282. "adc r6, r6, #0\n\t"
  85283. "lsr r8, r10, #16\n\t"
  85284. "mul r9, r8, r9\n\t"
  85285. "add r6, r6, r9\n\t"
  85286. "lsl r9, r12, #16\n\t"
  85287. "lsr r9, r9, #16\n\t"
  85288. "mul r8, r9, r8\n\t"
  85289. "lsr r9, r8, #16\n\t"
  85290. "lsl r8, r8, #16\n\t"
  85291. "adds r5, r5, r8\n\t"
  85292. "adc r6, r6, r9\n\t"
  85293. #else
  85294. "umull r5, r6, r10, r12\n\t"
  85295. #endif
  85296. "mov r4, #0\n\t"
  85297. "mov r7, #0\n\t"
  85298. /* A[1] * A[8] */
  85299. "ldr r10, [%[a], #32]\n\t"
  85300. "ldr r12, [%[a], #4]\n\t"
  85301. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85302. "lsl r8, r10, #16\n\t"
  85303. "lsl r9, r12, #16\n\t"
  85304. "lsr r8, r8, #16\n\t"
  85305. "lsr r9, r9, #16\n\t"
  85306. "mul r9, r8, r9\n\t"
  85307. "adds r5, r5, r9\n\t"
  85308. "adcs r6, r6, #0\n\t"
  85309. "adc r7, r7, #0\n\t"
  85310. "lsr r9, r12, #16\n\t"
  85311. "mul r8, r9, r8\n\t"
  85312. "lsr r9, r8, #16\n\t"
  85313. "lsl r8, r8, #16\n\t"
  85314. "adds r5, r5, r8\n\t"
  85315. "adcs r6, r6, r9\n\t"
  85316. "adc r7, r7, #0\n\t"
  85317. "lsr r8, r10, #16\n\t"
  85318. "lsr r9, r12, #16\n\t"
  85319. "mul r9, r8, r9\n\t"
  85320. "adds r6, r6, r9\n\t"
  85321. "adc r7, r7, #0\n\t"
  85322. "lsl r9, r12, #16\n\t"
  85323. "lsr r9, r9, #16\n\t"
  85324. "mul r8, r9, r8\n\t"
  85325. "lsr r9, r8, #16\n\t"
  85326. "lsl r8, r8, #16\n\t"
  85327. "adds r5, r5, r8\n\t"
  85328. "adcs r6, r6, r9\n\t"
  85329. "adc r7, r7, #0\n\t"
  85330. #else
  85331. "umull r8, r9, r10, r12\n\t"
  85332. "adds r5, r5, r8\n\t"
  85333. "adcs r6, r6, r9\n\t"
  85334. "adc r7, r7, #0\n\t"
  85335. #endif
  85336. /* A[2] * A[7] */
  85337. "ldr r10, [%[a], #28]\n\t"
  85338. "ldr r12, [%[a], #8]\n\t"
  85339. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85340. "lsl r8, r10, #16\n\t"
  85341. "lsl r9, r12, #16\n\t"
  85342. "lsr r8, r8, #16\n\t"
  85343. "lsr r9, r9, #16\n\t"
  85344. "mul r9, r8, r9\n\t"
  85345. "adds r5, r5, r9\n\t"
  85346. "adcs r6, r6, #0\n\t"
  85347. "adc r7, r7, #0\n\t"
  85348. "lsr r9, r12, #16\n\t"
  85349. "mul r8, r9, r8\n\t"
  85350. "lsr r9, r8, #16\n\t"
  85351. "lsl r8, r8, #16\n\t"
  85352. "adds r5, r5, r8\n\t"
  85353. "adcs r6, r6, r9\n\t"
  85354. "adc r7, r7, #0\n\t"
  85355. "lsr r8, r10, #16\n\t"
  85356. "lsr r9, r12, #16\n\t"
  85357. "mul r9, r8, r9\n\t"
  85358. "adds r6, r6, r9\n\t"
  85359. "adc r7, r7, #0\n\t"
  85360. "lsl r9, r12, #16\n\t"
  85361. "lsr r9, r9, #16\n\t"
  85362. "mul r8, r9, r8\n\t"
  85363. "lsr r9, r8, #16\n\t"
  85364. "lsl r8, r8, #16\n\t"
  85365. "adds r5, r5, r8\n\t"
  85366. "adcs r6, r6, r9\n\t"
  85367. "adc r7, r7, #0\n\t"
  85368. #else
  85369. "umull r8, r9, r10, r12\n\t"
  85370. "adds r5, r5, r8\n\t"
  85371. "adcs r6, r6, r9\n\t"
  85372. "adc r7, r7, #0\n\t"
  85373. #endif
  85374. /* A[3] * A[6] */
  85375. "ldr r10, [%[a], #24]\n\t"
  85376. "ldr r12, [%[a], #12]\n\t"
  85377. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85378. "lsl r8, r10, #16\n\t"
  85379. "lsl r9, r12, #16\n\t"
  85380. "lsr r8, r8, #16\n\t"
  85381. "lsr r9, r9, #16\n\t"
  85382. "mul r9, r8, r9\n\t"
  85383. "adds r5, r5, r9\n\t"
  85384. "adcs r6, r6, #0\n\t"
  85385. "adc r7, r7, #0\n\t"
  85386. "lsr r9, r12, #16\n\t"
  85387. "mul r8, r9, r8\n\t"
  85388. "lsr r9, r8, #16\n\t"
  85389. "lsl r8, r8, #16\n\t"
  85390. "adds r5, r5, r8\n\t"
  85391. "adcs r6, r6, r9\n\t"
  85392. "adc r7, r7, #0\n\t"
  85393. "lsr r8, r10, #16\n\t"
  85394. "lsr r9, r12, #16\n\t"
  85395. "mul r9, r8, r9\n\t"
  85396. "adds r6, r6, r9\n\t"
  85397. "adc r7, r7, #0\n\t"
  85398. "lsl r9, r12, #16\n\t"
  85399. "lsr r9, r9, #16\n\t"
  85400. "mul r8, r9, r8\n\t"
  85401. "lsr r9, r8, #16\n\t"
  85402. "lsl r8, r8, #16\n\t"
  85403. "adds r5, r5, r8\n\t"
  85404. "adcs r6, r6, r9\n\t"
  85405. "adc r7, r7, #0\n\t"
  85406. #else
  85407. "umull r8, r9, r10, r12\n\t"
  85408. "adds r5, r5, r8\n\t"
  85409. "adcs r6, r6, r9\n\t"
  85410. "adc r7, r7, #0\n\t"
  85411. #endif
  85412. /* A[4] * A[5] */
  85413. "ldr r10, [%[a], #20]\n\t"
  85414. "ldr r12, [%[a], #16]\n\t"
  85415. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85416. "lsl r8, r10, #16\n\t"
  85417. "lsl r9, r12, #16\n\t"
  85418. "lsr r8, r8, #16\n\t"
  85419. "lsr r9, r9, #16\n\t"
  85420. "mul r9, r8, r9\n\t"
  85421. "adds r5, r5, r9\n\t"
  85422. "adcs r6, r6, #0\n\t"
  85423. "adc r7, r7, #0\n\t"
  85424. "lsr r9, r12, #16\n\t"
  85425. "mul r8, r9, r8\n\t"
  85426. "lsr r9, r8, #16\n\t"
  85427. "lsl r8, r8, #16\n\t"
  85428. "adds r5, r5, r8\n\t"
  85429. "adcs r6, r6, r9\n\t"
  85430. "adc r7, r7, #0\n\t"
  85431. "lsr r8, r10, #16\n\t"
  85432. "lsr r9, r12, #16\n\t"
  85433. "mul r9, r8, r9\n\t"
  85434. "adds r6, r6, r9\n\t"
  85435. "adc r7, r7, #0\n\t"
  85436. "lsl r9, r12, #16\n\t"
  85437. "lsr r9, r9, #16\n\t"
  85438. "mul r8, r9, r8\n\t"
  85439. "lsr r9, r8, #16\n\t"
  85440. "lsl r8, r8, #16\n\t"
  85441. "adds r5, r5, r8\n\t"
  85442. "adcs r6, r6, r9\n\t"
  85443. "adc r7, r7, #0\n\t"
  85444. #else
  85445. "umull r8, r9, r10, r12\n\t"
  85446. "adds r5, r5, r8\n\t"
  85447. "adcs r6, r6, r9\n\t"
  85448. "adc r7, r7, #0\n\t"
  85449. #endif
  85450. "adds r5, r5, r5\n\t"
  85451. "adcs r6, r6, r6\n\t"
  85452. "adc r7, r7, r7\n\t"
  85453. "adds r2, r2, r5\n\t"
  85454. "adcs r3, r3, r6\n\t"
  85455. "adc r4, r4, r7\n\t"
  85456. "str r2, [sp, #36]\n\t"
  85457. /* A[0] * A[10] */
  85458. "ldr r10, [%[a], #40]\n\t"
  85459. "ldr r12, [%[a]]\n\t"
  85460. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85461. "lsl r8, r10, #16\n\t"
  85462. "lsl r5, r12, #16\n\t"
  85463. "lsr r8, r8, #16\n\t"
  85464. "lsr r5, r5, #16\n\t"
  85465. "mul r5, r8, r5\n\t"
  85466. "lsr r9, r12, #16\n\t"
  85467. "mul r8, r9, r8\n\t"
  85468. "lsr r6, r8, #16\n\t"
  85469. "lsl r8, r8, #16\n\t"
  85470. "adds r5, r5, r8\n\t"
  85471. "adc r6, r6, #0\n\t"
  85472. "lsr r8, r10, #16\n\t"
  85473. "mul r9, r8, r9\n\t"
  85474. "add r6, r6, r9\n\t"
  85475. "lsl r9, r12, #16\n\t"
  85476. "lsr r9, r9, #16\n\t"
  85477. "mul r8, r9, r8\n\t"
  85478. "lsr r9, r8, #16\n\t"
  85479. "lsl r8, r8, #16\n\t"
  85480. "adds r5, r5, r8\n\t"
  85481. "adc r6, r6, r9\n\t"
  85482. #else
  85483. "umull r5, r6, r10, r12\n\t"
  85484. #endif
  85485. "mov r2, #0\n\t"
  85486. "mov r7, #0\n\t"
  85487. /* A[1] * A[9] */
  85488. "ldr r10, [%[a], #36]\n\t"
  85489. "ldr r12, [%[a], #4]\n\t"
  85490. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85491. "lsl r8, r10, #16\n\t"
  85492. "lsl r9, r12, #16\n\t"
  85493. "lsr r8, r8, #16\n\t"
  85494. "lsr r9, r9, #16\n\t"
  85495. "mul r9, r8, r9\n\t"
  85496. "adds r5, r5, r9\n\t"
  85497. "adcs r6, r6, #0\n\t"
  85498. "adc r7, r7, #0\n\t"
  85499. "lsr r9, r12, #16\n\t"
  85500. "mul r8, r9, r8\n\t"
  85501. "lsr r9, r8, #16\n\t"
  85502. "lsl r8, r8, #16\n\t"
  85503. "adds r5, r5, r8\n\t"
  85504. "adcs r6, r6, r9\n\t"
  85505. "adc r7, r7, #0\n\t"
  85506. "lsr r8, r10, #16\n\t"
  85507. "lsr r9, r12, #16\n\t"
  85508. "mul r9, r8, r9\n\t"
  85509. "adds r6, r6, r9\n\t"
  85510. "adc r7, r7, #0\n\t"
  85511. "lsl r9, r12, #16\n\t"
  85512. "lsr r9, r9, #16\n\t"
  85513. "mul r8, r9, r8\n\t"
  85514. "lsr r9, r8, #16\n\t"
  85515. "lsl r8, r8, #16\n\t"
  85516. "adds r5, r5, r8\n\t"
  85517. "adcs r6, r6, r9\n\t"
  85518. "adc r7, r7, #0\n\t"
  85519. #else
  85520. "umull r8, r9, r10, r12\n\t"
  85521. "adds r5, r5, r8\n\t"
  85522. "adcs r6, r6, r9\n\t"
  85523. "adc r7, r7, #0\n\t"
  85524. #endif
  85525. /* A[2] * A[8] */
  85526. "ldr r10, [%[a], #32]\n\t"
  85527. "ldr r12, [%[a], #8]\n\t"
  85528. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85529. "lsl r8, r10, #16\n\t"
  85530. "lsl r9, r12, #16\n\t"
  85531. "lsr r8, r8, #16\n\t"
  85532. "lsr r9, r9, #16\n\t"
  85533. "mul r9, r8, r9\n\t"
  85534. "adds r5, r5, r9\n\t"
  85535. "adcs r6, r6, #0\n\t"
  85536. "adc r7, r7, #0\n\t"
  85537. "lsr r9, r12, #16\n\t"
  85538. "mul r8, r9, r8\n\t"
  85539. "lsr r9, r8, #16\n\t"
  85540. "lsl r8, r8, #16\n\t"
  85541. "adds r5, r5, r8\n\t"
  85542. "adcs r6, r6, r9\n\t"
  85543. "adc r7, r7, #0\n\t"
  85544. "lsr r8, r10, #16\n\t"
  85545. "lsr r9, r12, #16\n\t"
  85546. "mul r9, r8, r9\n\t"
  85547. "adds r6, r6, r9\n\t"
  85548. "adc r7, r7, #0\n\t"
  85549. "lsl r9, r12, #16\n\t"
  85550. "lsr r9, r9, #16\n\t"
  85551. "mul r8, r9, r8\n\t"
  85552. "lsr r9, r8, #16\n\t"
  85553. "lsl r8, r8, #16\n\t"
  85554. "adds r5, r5, r8\n\t"
  85555. "adcs r6, r6, r9\n\t"
  85556. "adc r7, r7, #0\n\t"
  85557. #else
  85558. "umull r8, r9, r10, r12\n\t"
  85559. "adds r5, r5, r8\n\t"
  85560. "adcs r6, r6, r9\n\t"
  85561. "adc r7, r7, #0\n\t"
  85562. #endif
  85563. /* A[3] * A[7] */
  85564. "ldr r10, [%[a], #28]\n\t"
  85565. "ldr r12, [%[a], #12]\n\t"
  85566. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85567. "lsl r8, r10, #16\n\t"
  85568. "lsl r9, r12, #16\n\t"
  85569. "lsr r8, r8, #16\n\t"
  85570. "lsr r9, r9, #16\n\t"
  85571. "mul r9, r8, r9\n\t"
  85572. "adds r5, r5, r9\n\t"
  85573. "adcs r6, r6, #0\n\t"
  85574. "adc r7, r7, #0\n\t"
  85575. "lsr r9, r12, #16\n\t"
  85576. "mul r8, r9, r8\n\t"
  85577. "lsr r9, r8, #16\n\t"
  85578. "lsl r8, r8, #16\n\t"
  85579. "adds r5, r5, r8\n\t"
  85580. "adcs r6, r6, r9\n\t"
  85581. "adc r7, r7, #0\n\t"
  85582. "lsr r8, r10, #16\n\t"
  85583. "lsr r9, r12, #16\n\t"
  85584. "mul r9, r8, r9\n\t"
  85585. "adds r6, r6, r9\n\t"
  85586. "adc r7, r7, #0\n\t"
  85587. "lsl r9, r12, #16\n\t"
  85588. "lsr r9, r9, #16\n\t"
  85589. "mul r8, r9, r8\n\t"
  85590. "lsr r9, r8, #16\n\t"
  85591. "lsl r8, r8, #16\n\t"
  85592. "adds r5, r5, r8\n\t"
  85593. "adcs r6, r6, r9\n\t"
  85594. "adc r7, r7, #0\n\t"
  85595. #else
  85596. "umull r8, r9, r10, r12\n\t"
  85597. "adds r5, r5, r8\n\t"
  85598. "adcs r6, r6, r9\n\t"
  85599. "adc r7, r7, #0\n\t"
  85600. #endif
  85601. /* A[4] * A[6] */
  85602. "ldr r10, [%[a], #24]\n\t"
  85603. "ldr r12, [%[a], #16]\n\t"
  85604. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85605. "lsl r8, r10, #16\n\t"
  85606. "lsl r9, r12, #16\n\t"
  85607. "lsr r8, r8, #16\n\t"
  85608. "lsr r9, r9, #16\n\t"
  85609. "mul r9, r8, r9\n\t"
  85610. "adds r5, r5, r9\n\t"
  85611. "adcs r6, r6, #0\n\t"
  85612. "adc r7, r7, #0\n\t"
  85613. "lsr r9, r12, #16\n\t"
  85614. "mul r8, r9, r8\n\t"
  85615. "lsr r9, r8, #16\n\t"
  85616. "lsl r8, r8, #16\n\t"
  85617. "adds r5, r5, r8\n\t"
  85618. "adcs r6, r6, r9\n\t"
  85619. "adc r7, r7, #0\n\t"
  85620. "lsr r8, r10, #16\n\t"
  85621. "lsr r9, r12, #16\n\t"
  85622. "mul r9, r8, r9\n\t"
  85623. "adds r6, r6, r9\n\t"
  85624. "adc r7, r7, #0\n\t"
  85625. "lsl r9, r12, #16\n\t"
  85626. "lsr r9, r9, #16\n\t"
  85627. "mul r8, r9, r8\n\t"
  85628. "lsr r9, r8, #16\n\t"
  85629. "lsl r8, r8, #16\n\t"
  85630. "adds r5, r5, r8\n\t"
  85631. "adcs r6, r6, r9\n\t"
  85632. "adc r7, r7, #0\n\t"
  85633. #else
  85634. "umull r8, r9, r10, r12\n\t"
  85635. "adds r5, r5, r8\n\t"
  85636. "adcs r6, r6, r9\n\t"
  85637. "adc r7, r7, #0\n\t"
  85638. #endif
  85639. /* A[5] * A[5] */
  85640. "ldr r10, [%[a], #20]\n\t"
  85641. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85642. "lsl r8, r10, #16\n\t"
  85643. "lsr r9, r10, #16\n\t"
  85644. "lsr r8, r8, #16\n\t"
  85645. "mov r12, r8\n\t"
  85646. "mul r8, r12, r8\n\t"
  85647. "mov r12, r9\n\t"
  85648. "mul r9, r12, r9\n\t"
  85649. "adds r3, r3, r8\n\t"
  85650. "adcs r4, r4, r9\n\t"
  85651. "adc r2, r2, #0\n\t"
  85652. "lsr r9, r10, #16\n\t"
  85653. "lsl r8, r10, #16\n\t"
  85654. "lsr r8, r8, #16\n\t"
  85655. "mul r8, r9, r8\n\t"
  85656. "lsr r9, r8, #15\n\t"
  85657. "lsl r8, r8, #17\n\t"
  85658. "adds r3, r3, r8\n\t"
  85659. "adcs r4, r4, r9\n\t"
  85660. "adc r2, r2, #0\n\t"
  85661. "adds r5, r5, r5\n\t"
  85662. "adcs r6, r6, r6\n\t"
  85663. "adc r7, r7, r7\n\t"
  85664. #else
  85665. "umull r8, r9, r10, r10\n\t"
  85666. "adds r5, r5, r5\n\t"
  85667. "adcs r6, r6, r6\n\t"
  85668. "adc r7, r7, r7\n\t"
  85669. "adds r3, r3, r8\n\t"
  85670. "adcs r4, r4, r9\n\t"
  85671. "adc r2, r2, #0\n\t"
  85672. #endif
  85673. "adds r3, r3, r5\n\t"
  85674. "adcs r4, r4, r6\n\t"
  85675. "adc r2, r2, r7\n\t"
  85676. "str r3, [sp, #40]\n\t"
  85677. /* A[0] * A[11] */
  85678. "ldr r10, [%[a], #44]\n\t"
  85679. "ldr r12, [%[a]]\n\t"
  85680. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85681. "lsl r8, r10, #16\n\t"
  85682. "lsl r5, r12, #16\n\t"
  85683. "lsr r8, r8, #16\n\t"
  85684. "lsr r5, r5, #16\n\t"
  85685. "mul r5, r8, r5\n\t"
  85686. "lsr r9, r12, #16\n\t"
  85687. "mul r8, r9, r8\n\t"
  85688. "lsr r6, r8, #16\n\t"
  85689. "lsl r8, r8, #16\n\t"
  85690. "adds r5, r5, r8\n\t"
  85691. "adc r6, r6, #0\n\t"
  85692. "lsr r8, r10, #16\n\t"
  85693. "mul r9, r8, r9\n\t"
  85694. "add r6, r6, r9\n\t"
  85695. "lsl r9, r12, #16\n\t"
  85696. "lsr r9, r9, #16\n\t"
  85697. "mul r8, r9, r8\n\t"
  85698. "lsr r9, r8, #16\n\t"
  85699. "lsl r8, r8, #16\n\t"
  85700. "adds r5, r5, r8\n\t"
  85701. "adc r6, r6, r9\n\t"
  85702. #else
  85703. "umull r5, r6, r10, r12\n\t"
  85704. #endif
  85705. "mov r3, #0\n\t"
  85706. "mov r7, #0\n\t"
  85707. /* A[1] * A[10] */
  85708. "ldr r10, [%[a], #40]\n\t"
  85709. "ldr r12, [%[a], #4]\n\t"
  85710. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85711. "lsl r8, r10, #16\n\t"
  85712. "lsl r9, r12, #16\n\t"
  85713. "lsr r8, r8, #16\n\t"
  85714. "lsr r9, r9, #16\n\t"
  85715. "mul r9, r8, r9\n\t"
  85716. "adds r5, r5, r9\n\t"
  85717. "adcs r6, r6, #0\n\t"
  85718. "adc r7, r7, #0\n\t"
  85719. "lsr r9, r12, #16\n\t"
  85720. "mul r8, r9, r8\n\t"
  85721. "lsr r9, r8, #16\n\t"
  85722. "lsl r8, r8, #16\n\t"
  85723. "adds r5, r5, r8\n\t"
  85724. "adcs r6, r6, r9\n\t"
  85725. "adc r7, r7, #0\n\t"
  85726. "lsr r8, r10, #16\n\t"
  85727. "lsr r9, r12, #16\n\t"
  85728. "mul r9, r8, r9\n\t"
  85729. "adds r6, r6, r9\n\t"
  85730. "adc r7, r7, #0\n\t"
  85731. "lsl r9, r12, #16\n\t"
  85732. "lsr r9, r9, #16\n\t"
  85733. "mul r8, r9, r8\n\t"
  85734. "lsr r9, r8, #16\n\t"
  85735. "lsl r8, r8, #16\n\t"
  85736. "adds r5, r5, r8\n\t"
  85737. "adcs r6, r6, r9\n\t"
  85738. "adc r7, r7, #0\n\t"
  85739. #else
  85740. "umull r8, r9, r10, r12\n\t"
  85741. "adds r5, r5, r8\n\t"
  85742. "adcs r6, r6, r9\n\t"
  85743. "adc r7, r7, #0\n\t"
  85744. #endif
  85745. /* A[2] * A[9] */
  85746. "ldr r10, [%[a], #36]\n\t"
  85747. "ldr r12, [%[a], #8]\n\t"
  85748. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85749. "lsl r8, r10, #16\n\t"
  85750. "lsl r9, r12, #16\n\t"
  85751. "lsr r8, r8, #16\n\t"
  85752. "lsr r9, r9, #16\n\t"
  85753. "mul r9, r8, r9\n\t"
  85754. "adds r5, r5, r9\n\t"
  85755. "adcs r6, r6, #0\n\t"
  85756. "adc r7, r7, #0\n\t"
  85757. "lsr r9, r12, #16\n\t"
  85758. "mul r8, r9, r8\n\t"
  85759. "lsr r9, r8, #16\n\t"
  85760. "lsl r8, r8, #16\n\t"
  85761. "adds r5, r5, r8\n\t"
  85762. "adcs r6, r6, r9\n\t"
  85763. "adc r7, r7, #0\n\t"
  85764. "lsr r8, r10, #16\n\t"
  85765. "lsr r9, r12, #16\n\t"
  85766. "mul r9, r8, r9\n\t"
  85767. "adds r6, r6, r9\n\t"
  85768. "adc r7, r7, #0\n\t"
  85769. "lsl r9, r12, #16\n\t"
  85770. "lsr r9, r9, #16\n\t"
  85771. "mul r8, r9, r8\n\t"
  85772. "lsr r9, r8, #16\n\t"
  85773. "lsl r8, r8, #16\n\t"
  85774. "adds r5, r5, r8\n\t"
  85775. "adcs r6, r6, r9\n\t"
  85776. "adc r7, r7, #0\n\t"
  85777. #else
  85778. "umull r8, r9, r10, r12\n\t"
  85779. "adds r5, r5, r8\n\t"
  85780. "adcs r6, r6, r9\n\t"
  85781. "adc r7, r7, #0\n\t"
  85782. #endif
  85783. /* A[3] * A[8] */
  85784. "ldr r10, [%[a], #32]\n\t"
  85785. "ldr r12, [%[a], #12]\n\t"
  85786. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85787. "lsl r8, r10, #16\n\t"
  85788. "lsl r9, r12, #16\n\t"
  85789. "lsr r8, r8, #16\n\t"
  85790. "lsr r9, r9, #16\n\t"
  85791. "mul r9, r8, r9\n\t"
  85792. "adds r5, r5, r9\n\t"
  85793. "adcs r6, r6, #0\n\t"
  85794. "adc r7, r7, #0\n\t"
  85795. "lsr r9, r12, #16\n\t"
  85796. "mul r8, r9, r8\n\t"
  85797. "lsr r9, r8, #16\n\t"
  85798. "lsl r8, r8, #16\n\t"
  85799. "adds r5, r5, r8\n\t"
  85800. "adcs r6, r6, r9\n\t"
  85801. "adc r7, r7, #0\n\t"
  85802. "lsr r8, r10, #16\n\t"
  85803. "lsr r9, r12, #16\n\t"
  85804. "mul r9, r8, r9\n\t"
  85805. "adds r6, r6, r9\n\t"
  85806. "adc r7, r7, #0\n\t"
  85807. "lsl r9, r12, #16\n\t"
  85808. "lsr r9, r9, #16\n\t"
  85809. "mul r8, r9, r8\n\t"
  85810. "lsr r9, r8, #16\n\t"
  85811. "lsl r8, r8, #16\n\t"
  85812. "adds r5, r5, r8\n\t"
  85813. "adcs r6, r6, r9\n\t"
  85814. "adc r7, r7, #0\n\t"
  85815. #else
  85816. "umull r8, r9, r10, r12\n\t"
  85817. "adds r5, r5, r8\n\t"
  85818. "adcs r6, r6, r9\n\t"
  85819. "adc r7, r7, #0\n\t"
  85820. #endif
  85821. /* A[4] * A[7] */
  85822. "ldr r10, [%[a], #28]\n\t"
  85823. "ldr r12, [%[a], #16]\n\t"
  85824. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85825. "lsl r8, r10, #16\n\t"
  85826. "lsl r9, r12, #16\n\t"
  85827. "lsr r8, r8, #16\n\t"
  85828. "lsr r9, r9, #16\n\t"
  85829. "mul r9, r8, r9\n\t"
  85830. "adds r5, r5, r9\n\t"
  85831. "adcs r6, r6, #0\n\t"
  85832. "adc r7, r7, #0\n\t"
  85833. "lsr r9, r12, #16\n\t"
  85834. "mul r8, r9, r8\n\t"
  85835. "lsr r9, r8, #16\n\t"
  85836. "lsl r8, r8, #16\n\t"
  85837. "adds r5, r5, r8\n\t"
  85838. "adcs r6, r6, r9\n\t"
  85839. "adc r7, r7, #0\n\t"
  85840. "lsr r8, r10, #16\n\t"
  85841. "lsr r9, r12, #16\n\t"
  85842. "mul r9, r8, r9\n\t"
  85843. "adds r6, r6, r9\n\t"
  85844. "adc r7, r7, #0\n\t"
  85845. "lsl r9, r12, #16\n\t"
  85846. "lsr r9, r9, #16\n\t"
  85847. "mul r8, r9, r8\n\t"
  85848. "lsr r9, r8, #16\n\t"
  85849. "lsl r8, r8, #16\n\t"
  85850. "adds r5, r5, r8\n\t"
  85851. "adcs r6, r6, r9\n\t"
  85852. "adc r7, r7, #0\n\t"
  85853. #else
  85854. "umull r8, r9, r10, r12\n\t"
  85855. "adds r5, r5, r8\n\t"
  85856. "adcs r6, r6, r9\n\t"
  85857. "adc r7, r7, #0\n\t"
  85858. #endif
  85859. /* A[5] * A[6] */
  85860. "ldr r10, [%[a], #24]\n\t"
  85861. "ldr r12, [%[a], #20]\n\t"
  85862. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85863. "lsl r8, r10, #16\n\t"
  85864. "lsl r9, r12, #16\n\t"
  85865. "lsr r8, r8, #16\n\t"
  85866. "lsr r9, r9, #16\n\t"
  85867. "mul r9, r8, r9\n\t"
  85868. "adds r5, r5, r9\n\t"
  85869. "adcs r6, r6, #0\n\t"
  85870. "adc r7, r7, #0\n\t"
  85871. "lsr r9, r12, #16\n\t"
  85872. "mul r8, r9, r8\n\t"
  85873. "lsr r9, r8, #16\n\t"
  85874. "lsl r8, r8, #16\n\t"
  85875. "adds r5, r5, r8\n\t"
  85876. "adcs r6, r6, r9\n\t"
  85877. "adc r7, r7, #0\n\t"
  85878. "lsr r8, r10, #16\n\t"
  85879. "lsr r9, r12, #16\n\t"
  85880. "mul r9, r8, r9\n\t"
  85881. "adds r6, r6, r9\n\t"
  85882. "adc r7, r7, #0\n\t"
  85883. "lsl r9, r12, #16\n\t"
  85884. "lsr r9, r9, #16\n\t"
  85885. "mul r8, r9, r8\n\t"
  85886. "lsr r9, r8, #16\n\t"
  85887. "lsl r8, r8, #16\n\t"
  85888. "adds r5, r5, r8\n\t"
  85889. "adcs r6, r6, r9\n\t"
  85890. "adc r7, r7, #0\n\t"
  85891. #else
  85892. "umull r8, r9, r10, r12\n\t"
  85893. "adds r5, r5, r8\n\t"
  85894. "adcs r6, r6, r9\n\t"
  85895. "adc r7, r7, #0\n\t"
  85896. #endif
  85897. "adds r5, r5, r5\n\t"
  85898. "adcs r6, r6, r6\n\t"
  85899. "adc r7, r7, r7\n\t"
  85900. "adds r4, r4, r5\n\t"
  85901. "adcs r2, r2, r6\n\t"
  85902. "adc r3, r3, r7\n\t"
  85903. "str r4, [sp, #44]\n\t"
  85904. /* A[1] * A[11] */
  85905. "ldr r10, [%[a], #44]\n\t"
  85906. "ldr r12, [%[a], #4]\n\t"
  85907. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85908. "lsl r8, r10, #16\n\t"
  85909. "lsl r5, r12, #16\n\t"
  85910. "lsr r8, r8, #16\n\t"
  85911. "lsr r5, r5, #16\n\t"
  85912. "mul r5, r8, r5\n\t"
  85913. "lsr r9, r12, #16\n\t"
  85914. "mul r8, r9, r8\n\t"
  85915. "lsr r6, r8, #16\n\t"
  85916. "lsl r8, r8, #16\n\t"
  85917. "adds r5, r5, r8\n\t"
  85918. "adc r6, r6, #0\n\t"
  85919. "lsr r8, r10, #16\n\t"
  85920. "mul r9, r8, r9\n\t"
  85921. "add r6, r6, r9\n\t"
  85922. "lsl r9, r12, #16\n\t"
  85923. "lsr r9, r9, #16\n\t"
  85924. "mul r8, r9, r8\n\t"
  85925. "lsr r9, r8, #16\n\t"
  85926. "lsl r8, r8, #16\n\t"
  85927. "adds r5, r5, r8\n\t"
  85928. "adc r6, r6, r9\n\t"
  85929. #else
  85930. "umull r5, r6, r10, r12\n\t"
  85931. #endif
  85932. "mov r4, #0\n\t"
  85933. "mov r7, #0\n\t"
  85934. /* A[2] * A[10] */
  85935. "ldr r10, [%[a], #40]\n\t"
  85936. "ldr r12, [%[a], #8]\n\t"
  85937. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85938. "lsl r8, r10, #16\n\t"
  85939. "lsl r9, r12, #16\n\t"
  85940. "lsr r8, r8, #16\n\t"
  85941. "lsr r9, r9, #16\n\t"
  85942. "mul r9, r8, r9\n\t"
  85943. "adds r5, r5, r9\n\t"
  85944. "adcs r6, r6, #0\n\t"
  85945. "adc r7, r7, #0\n\t"
  85946. "lsr r9, r12, #16\n\t"
  85947. "mul r8, r9, r8\n\t"
  85948. "lsr r9, r8, #16\n\t"
  85949. "lsl r8, r8, #16\n\t"
  85950. "adds r5, r5, r8\n\t"
  85951. "adcs r6, r6, r9\n\t"
  85952. "adc r7, r7, #0\n\t"
  85953. "lsr r8, r10, #16\n\t"
  85954. "lsr r9, r12, #16\n\t"
  85955. "mul r9, r8, r9\n\t"
  85956. "adds r6, r6, r9\n\t"
  85957. "adc r7, r7, #0\n\t"
  85958. "lsl r9, r12, #16\n\t"
  85959. "lsr r9, r9, #16\n\t"
  85960. "mul r8, r9, r8\n\t"
  85961. "lsr r9, r8, #16\n\t"
  85962. "lsl r8, r8, #16\n\t"
  85963. "adds r5, r5, r8\n\t"
  85964. "adcs r6, r6, r9\n\t"
  85965. "adc r7, r7, #0\n\t"
  85966. #else
  85967. "umull r8, r9, r10, r12\n\t"
  85968. "adds r5, r5, r8\n\t"
  85969. "adcs r6, r6, r9\n\t"
  85970. "adc r7, r7, #0\n\t"
  85971. #endif
  85972. /* A[3] * A[9] */
  85973. "ldr r10, [%[a], #36]\n\t"
  85974. "ldr r12, [%[a], #12]\n\t"
  85975. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  85976. "lsl r8, r10, #16\n\t"
  85977. "lsl r9, r12, #16\n\t"
  85978. "lsr r8, r8, #16\n\t"
  85979. "lsr r9, r9, #16\n\t"
  85980. "mul r9, r8, r9\n\t"
  85981. "adds r5, r5, r9\n\t"
  85982. "adcs r6, r6, #0\n\t"
  85983. "adc r7, r7, #0\n\t"
  85984. "lsr r9, r12, #16\n\t"
  85985. "mul r8, r9, r8\n\t"
  85986. "lsr r9, r8, #16\n\t"
  85987. "lsl r8, r8, #16\n\t"
  85988. "adds r5, r5, r8\n\t"
  85989. "adcs r6, r6, r9\n\t"
  85990. "adc r7, r7, #0\n\t"
  85991. "lsr r8, r10, #16\n\t"
  85992. "lsr r9, r12, #16\n\t"
  85993. "mul r9, r8, r9\n\t"
  85994. "adds r6, r6, r9\n\t"
  85995. "adc r7, r7, #0\n\t"
  85996. "lsl r9, r12, #16\n\t"
  85997. "lsr r9, r9, #16\n\t"
  85998. "mul r8, r9, r8\n\t"
  85999. "lsr r9, r8, #16\n\t"
  86000. "lsl r8, r8, #16\n\t"
  86001. "adds r5, r5, r8\n\t"
  86002. "adcs r6, r6, r9\n\t"
  86003. "adc r7, r7, #0\n\t"
  86004. #else
  86005. "umull r8, r9, r10, r12\n\t"
  86006. "adds r5, r5, r8\n\t"
  86007. "adcs r6, r6, r9\n\t"
  86008. "adc r7, r7, #0\n\t"
  86009. #endif
  86010. /* A[4] * A[8] */
  86011. "ldr r10, [%[a], #32]\n\t"
  86012. "ldr r12, [%[a], #16]\n\t"
  86013. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86014. "lsl r8, r10, #16\n\t"
  86015. "lsl r9, r12, #16\n\t"
  86016. "lsr r8, r8, #16\n\t"
  86017. "lsr r9, r9, #16\n\t"
  86018. "mul r9, r8, r9\n\t"
  86019. "adds r5, r5, r9\n\t"
  86020. "adcs r6, r6, #0\n\t"
  86021. "adc r7, r7, #0\n\t"
  86022. "lsr r9, r12, #16\n\t"
  86023. "mul r8, r9, r8\n\t"
  86024. "lsr r9, r8, #16\n\t"
  86025. "lsl r8, r8, #16\n\t"
  86026. "adds r5, r5, r8\n\t"
  86027. "adcs r6, r6, r9\n\t"
  86028. "adc r7, r7, #0\n\t"
  86029. "lsr r8, r10, #16\n\t"
  86030. "lsr r9, r12, #16\n\t"
  86031. "mul r9, r8, r9\n\t"
  86032. "adds r6, r6, r9\n\t"
  86033. "adc r7, r7, #0\n\t"
  86034. "lsl r9, r12, #16\n\t"
  86035. "lsr r9, r9, #16\n\t"
  86036. "mul r8, r9, r8\n\t"
  86037. "lsr r9, r8, #16\n\t"
  86038. "lsl r8, r8, #16\n\t"
  86039. "adds r5, r5, r8\n\t"
  86040. "adcs r6, r6, r9\n\t"
  86041. "adc r7, r7, #0\n\t"
  86042. #else
  86043. "umull r8, r9, r10, r12\n\t"
  86044. "adds r5, r5, r8\n\t"
  86045. "adcs r6, r6, r9\n\t"
  86046. "adc r7, r7, #0\n\t"
  86047. #endif
  86048. /* A[5] * A[7] */
  86049. "ldr r10, [%[a], #28]\n\t"
  86050. "ldr r12, [%[a], #20]\n\t"
  86051. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86052. "lsl r8, r10, #16\n\t"
  86053. "lsl r9, r12, #16\n\t"
  86054. "lsr r8, r8, #16\n\t"
  86055. "lsr r9, r9, #16\n\t"
  86056. "mul r9, r8, r9\n\t"
  86057. "adds r5, r5, r9\n\t"
  86058. "adcs r6, r6, #0\n\t"
  86059. "adc r7, r7, #0\n\t"
  86060. "lsr r9, r12, #16\n\t"
  86061. "mul r8, r9, r8\n\t"
  86062. "lsr r9, r8, #16\n\t"
  86063. "lsl r8, r8, #16\n\t"
  86064. "adds r5, r5, r8\n\t"
  86065. "adcs r6, r6, r9\n\t"
  86066. "adc r7, r7, #0\n\t"
  86067. "lsr r8, r10, #16\n\t"
  86068. "lsr r9, r12, #16\n\t"
  86069. "mul r9, r8, r9\n\t"
  86070. "adds r6, r6, r9\n\t"
  86071. "adc r7, r7, #0\n\t"
  86072. "lsl r9, r12, #16\n\t"
  86073. "lsr r9, r9, #16\n\t"
  86074. "mul r8, r9, r8\n\t"
  86075. "lsr r9, r8, #16\n\t"
  86076. "lsl r8, r8, #16\n\t"
  86077. "adds r5, r5, r8\n\t"
  86078. "adcs r6, r6, r9\n\t"
  86079. "adc r7, r7, #0\n\t"
  86080. #else
  86081. "umull r8, r9, r10, r12\n\t"
  86082. "adds r5, r5, r8\n\t"
  86083. "adcs r6, r6, r9\n\t"
  86084. "adc r7, r7, #0\n\t"
  86085. #endif
  86086. /* A[6] * A[6] */
  86087. "ldr r10, [%[a], #24]\n\t"
  86088. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86089. "lsl r8, r10, #16\n\t"
  86090. "lsr r9, r10, #16\n\t"
  86091. "lsr r8, r8, #16\n\t"
  86092. "mov r12, r8\n\t"
  86093. "mul r8, r12, r8\n\t"
  86094. "mov r12, r9\n\t"
  86095. "mul r9, r12, r9\n\t"
  86096. "adds r2, r2, r8\n\t"
  86097. "adcs r3, r3, r9\n\t"
  86098. "adc r4, r4, #0\n\t"
  86099. "lsr r9, r10, #16\n\t"
  86100. "lsl r8, r10, #16\n\t"
  86101. "lsr r8, r8, #16\n\t"
  86102. "mul r8, r9, r8\n\t"
  86103. "lsr r9, r8, #15\n\t"
  86104. "lsl r8, r8, #17\n\t"
  86105. "adds r2, r2, r8\n\t"
  86106. "adcs r3, r3, r9\n\t"
  86107. "adc r4, r4, #0\n\t"
  86108. "adds r5, r5, r5\n\t"
  86109. "adcs r6, r6, r6\n\t"
  86110. "adc r7, r7, r7\n\t"
  86111. #else
  86112. "umull r8, r9, r10, r10\n\t"
  86113. "adds r5, r5, r5\n\t"
  86114. "adcs r6, r6, r6\n\t"
  86115. "adc r7, r7, r7\n\t"
  86116. "adds r2, r2, r8\n\t"
  86117. "adcs r3, r3, r9\n\t"
  86118. "adc r4, r4, #0\n\t"
  86119. #endif
  86120. "adds r2, r2, r5\n\t"
  86121. "adcs r3, r3, r6\n\t"
  86122. "adc r4, r4, r7\n\t"
  86123. "str r2, [%[r], #48]\n\t"
  86124. /* A[2] * A[11] */
  86125. "ldr r10, [%[a], #44]\n\t"
  86126. "ldr r12, [%[a], #8]\n\t"
  86127. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86128. "lsl r8, r10, #16\n\t"
  86129. "lsl r5, r12, #16\n\t"
  86130. "lsr r8, r8, #16\n\t"
  86131. "lsr r5, r5, #16\n\t"
  86132. "mul r5, r8, r5\n\t"
  86133. "lsr r9, r12, #16\n\t"
  86134. "mul r8, r9, r8\n\t"
  86135. "lsr r6, r8, #16\n\t"
  86136. "lsl r8, r8, #16\n\t"
  86137. "adds r5, r5, r8\n\t"
  86138. "adc r6, r6, #0\n\t"
  86139. "lsr r8, r10, #16\n\t"
  86140. "mul r9, r8, r9\n\t"
  86141. "add r6, r6, r9\n\t"
  86142. "lsl r9, r12, #16\n\t"
  86143. "lsr r9, r9, #16\n\t"
  86144. "mul r8, r9, r8\n\t"
  86145. "lsr r9, r8, #16\n\t"
  86146. "lsl r8, r8, #16\n\t"
  86147. "adds r5, r5, r8\n\t"
  86148. "adc r6, r6, r9\n\t"
  86149. #else
  86150. "umull r5, r6, r10, r12\n\t"
  86151. #endif
  86152. "mov r2, #0\n\t"
  86153. "mov r7, #0\n\t"
  86154. /* A[3] * A[10] */
  86155. "ldr r10, [%[a], #40]\n\t"
  86156. "ldr r12, [%[a], #12]\n\t"
  86157. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86158. "lsl r8, r10, #16\n\t"
  86159. "lsl r9, r12, #16\n\t"
  86160. "lsr r8, r8, #16\n\t"
  86161. "lsr r9, r9, #16\n\t"
  86162. "mul r9, r8, r9\n\t"
  86163. "adds r5, r5, r9\n\t"
  86164. "adcs r6, r6, #0\n\t"
  86165. "adc r7, r7, #0\n\t"
  86166. "lsr r9, r12, #16\n\t"
  86167. "mul r8, r9, r8\n\t"
  86168. "lsr r9, r8, #16\n\t"
  86169. "lsl r8, r8, #16\n\t"
  86170. "adds r5, r5, r8\n\t"
  86171. "adcs r6, r6, r9\n\t"
  86172. "adc r7, r7, #0\n\t"
  86173. "lsr r8, r10, #16\n\t"
  86174. "lsr r9, r12, #16\n\t"
  86175. "mul r9, r8, r9\n\t"
  86176. "adds r6, r6, r9\n\t"
  86177. "adc r7, r7, #0\n\t"
  86178. "lsl r9, r12, #16\n\t"
  86179. "lsr r9, r9, #16\n\t"
  86180. "mul r8, r9, r8\n\t"
  86181. "lsr r9, r8, #16\n\t"
  86182. "lsl r8, r8, #16\n\t"
  86183. "adds r5, r5, r8\n\t"
  86184. "adcs r6, r6, r9\n\t"
  86185. "adc r7, r7, #0\n\t"
  86186. #else
  86187. "umull r8, r9, r10, r12\n\t"
  86188. "adds r5, r5, r8\n\t"
  86189. "adcs r6, r6, r9\n\t"
  86190. "adc r7, r7, #0\n\t"
  86191. #endif
  86192. /* A[4] * A[9] */
  86193. "ldr r10, [%[a], #36]\n\t"
  86194. "ldr r12, [%[a], #16]\n\t"
  86195. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86196. "lsl r8, r10, #16\n\t"
  86197. "lsl r9, r12, #16\n\t"
  86198. "lsr r8, r8, #16\n\t"
  86199. "lsr r9, r9, #16\n\t"
  86200. "mul r9, r8, r9\n\t"
  86201. "adds r5, r5, r9\n\t"
  86202. "adcs r6, r6, #0\n\t"
  86203. "adc r7, r7, #0\n\t"
  86204. "lsr r9, r12, #16\n\t"
  86205. "mul r8, r9, r8\n\t"
  86206. "lsr r9, r8, #16\n\t"
  86207. "lsl r8, r8, #16\n\t"
  86208. "adds r5, r5, r8\n\t"
  86209. "adcs r6, r6, r9\n\t"
  86210. "adc r7, r7, #0\n\t"
  86211. "lsr r8, r10, #16\n\t"
  86212. "lsr r9, r12, #16\n\t"
  86213. "mul r9, r8, r9\n\t"
  86214. "adds r6, r6, r9\n\t"
  86215. "adc r7, r7, #0\n\t"
  86216. "lsl r9, r12, #16\n\t"
  86217. "lsr r9, r9, #16\n\t"
  86218. "mul r8, r9, r8\n\t"
  86219. "lsr r9, r8, #16\n\t"
  86220. "lsl r8, r8, #16\n\t"
  86221. "adds r5, r5, r8\n\t"
  86222. "adcs r6, r6, r9\n\t"
  86223. "adc r7, r7, #0\n\t"
  86224. #else
  86225. "umull r8, r9, r10, r12\n\t"
  86226. "adds r5, r5, r8\n\t"
  86227. "adcs r6, r6, r9\n\t"
  86228. "adc r7, r7, #0\n\t"
  86229. #endif
  86230. /* A[5] * A[8] */
  86231. "ldr r10, [%[a], #32]\n\t"
  86232. "ldr r12, [%[a], #20]\n\t"
  86233. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86234. "lsl r8, r10, #16\n\t"
  86235. "lsl r9, r12, #16\n\t"
  86236. "lsr r8, r8, #16\n\t"
  86237. "lsr r9, r9, #16\n\t"
  86238. "mul r9, r8, r9\n\t"
  86239. "adds r5, r5, r9\n\t"
  86240. "adcs r6, r6, #0\n\t"
  86241. "adc r7, r7, #0\n\t"
  86242. "lsr r9, r12, #16\n\t"
  86243. "mul r8, r9, r8\n\t"
  86244. "lsr r9, r8, #16\n\t"
  86245. "lsl r8, r8, #16\n\t"
  86246. "adds r5, r5, r8\n\t"
  86247. "adcs r6, r6, r9\n\t"
  86248. "adc r7, r7, #0\n\t"
  86249. "lsr r8, r10, #16\n\t"
  86250. "lsr r9, r12, #16\n\t"
  86251. "mul r9, r8, r9\n\t"
  86252. "adds r6, r6, r9\n\t"
  86253. "adc r7, r7, #0\n\t"
  86254. "lsl r9, r12, #16\n\t"
  86255. "lsr r9, r9, #16\n\t"
  86256. "mul r8, r9, r8\n\t"
  86257. "lsr r9, r8, #16\n\t"
  86258. "lsl r8, r8, #16\n\t"
  86259. "adds r5, r5, r8\n\t"
  86260. "adcs r6, r6, r9\n\t"
  86261. "adc r7, r7, #0\n\t"
  86262. #else
  86263. "umull r8, r9, r10, r12\n\t"
  86264. "adds r5, r5, r8\n\t"
  86265. "adcs r6, r6, r9\n\t"
  86266. "adc r7, r7, #0\n\t"
  86267. #endif
  86268. /* A[6] * A[7] */
  86269. "ldr r10, [%[a], #28]\n\t"
  86270. "ldr r12, [%[a], #24]\n\t"
  86271. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86272. "lsl r8, r10, #16\n\t"
  86273. "lsl r9, r12, #16\n\t"
  86274. "lsr r8, r8, #16\n\t"
  86275. "lsr r9, r9, #16\n\t"
  86276. "mul r9, r8, r9\n\t"
  86277. "adds r5, r5, r9\n\t"
  86278. "adcs r6, r6, #0\n\t"
  86279. "adc r7, r7, #0\n\t"
  86280. "lsr r9, r12, #16\n\t"
  86281. "mul r8, r9, r8\n\t"
  86282. "lsr r9, r8, #16\n\t"
  86283. "lsl r8, r8, #16\n\t"
  86284. "adds r5, r5, r8\n\t"
  86285. "adcs r6, r6, r9\n\t"
  86286. "adc r7, r7, #0\n\t"
  86287. "lsr r8, r10, #16\n\t"
  86288. "lsr r9, r12, #16\n\t"
  86289. "mul r9, r8, r9\n\t"
  86290. "adds r6, r6, r9\n\t"
  86291. "adc r7, r7, #0\n\t"
  86292. "lsl r9, r12, #16\n\t"
  86293. "lsr r9, r9, #16\n\t"
  86294. "mul r8, r9, r8\n\t"
  86295. "lsr r9, r8, #16\n\t"
  86296. "lsl r8, r8, #16\n\t"
  86297. "adds r5, r5, r8\n\t"
  86298. "adcs r6, r6, r9\n\t"
  86299. "adc r7, r7, #0\n\t"
  86300. #else
  86301. "umull r8, r9, r10, r12\n\t"
  86302. "adds r5, r5, r8\n\t"
  86303. "adcs r6, r6, r9\n\t"
  86304. "adc r7, r7, #0\n\t"
  86305. #endif
  86306. "adds r5, r5, r5\n\t"
  86307. "adcs r6, r6, r6\n\t"
  86308. "adc r7, r7, r7\n\t"
  86309. "adds r3, r3, r5\n\t"
  86310. "adcs r4, r4, r6\n\t"
  86311. "adc r2, r2, r7\n\t"
  86312. "str r3, [%[r], #52]\n\t"
  86313. /* A[3] * A[11] */
  86314. "ldr r10, [%[a], #44]\n\t"
  86315. "ldr r12, [%[a], #12]\n\t"
  86316. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86317. "lsl r8, r10, #16\n\t"
  86318. "lsl r5, r12, #16\n\t"
  86319. "lsr r8, r8, #16\n\t"
  86320. "lsr r5, r5, #16\n\t"
  86321. "mul r5, r8, r5\n\t"
  86322. "lsr r9, r12, #16\n\t"
  86323. "mul r8, r9, r8\n\t"
  86324. "lsr r6, r8, #16\n\t"
  86325. "lsl r8, r8, #16\n\t"
  86326. "adds r5, r5, r8\n\t"
  86327. "adc r6, r6, #0\n\t"
  86328. "lsr r8, r10, #16\n\t"
  86329. "mul r9, r8, r9\n\t"
  86330. "add r6, r6, r9\n\t"
  86331. "lsl r9, r12, #16\n\t"
  86332. "lsr r9, r9, #16\n\t"
  86333. "mul r8, r9, r8\n\t"
  86334. "lsr r9, r8, #16\n\t"
  86335. "lsl r8, r8, #16\n\t"
  86336. "adds r5, r5, r8\n\t"
  86337. "adc r6, r6, r9\n\t"
  86338. #else
  86339. "umull r5, r6, r10, r12\n\t"
  86340. #endif
  86341. "mov r3, #0\n\t"
  86342. "mov r7, #0\n\t"
  86343. /* A[4] * A[10] */
  86344. "ldr r10, [%[a], #40]\n\t"
  86345. "ldr r12, [%[a], #16]\n\t"
  86346. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86347. "lsl r8, r10, #16\n\t"
  86348. "lsl r9, r12, #16\n\t"
  86349. "lsr r8, r8, #16\n\t"
  86350. "lsr r9, r9, #16\n\t"
  86351. "mul r9, r8, r9\n\t"
  86352. "adds r5, r5, r9\n\t"
  86353. "adcs r6, r6, #0\n\t"
  86354. "adc r7, r7, #0\n\t"
  86355. "lsr r9, r12, #16\n\t"
  86356. "mul r8, r9, r8\n\t"
  86357. "lsr r9, r8, #16\n\t"
  86358. "lsl r8, r8, #16\n\t"
  86359. "adds r5, r5, r8\n\t"
  86360. "adcs r6, r6, r9\n\t"
  86361. "adc r7, r7, #0\n\t"
  86362. "lsr r8, r10, #16\n\t"
  86363. "lsr r9, r12, #16\n\t"
  86364. "mul r9, r8, r9\n\t"
  86365. "adds r6, r6, r9\n\t"
  86366. "adc r7, r7, #0\n\t"
  86367. "lsl r9, r12, #16\n\t"
  86368. "lsr r9, r9, #16\n\t"
  86369. "mul r8, r9, r8\n\t"
  86370. "lsr r9, r8, #16\n\t"
  86371. "lsl r8, r8, #16\n\t"
  86372. "adds r5, r5, r8\n\t"
  86373. "adcs r6, r6, r9\n\t"
  86374. "adc r7, r7, #0\n\t"
  86375. #else
  86376. "umull r8, r9, r10, r12\n\t"
  86377. "adds r5, r5, r8\n\t"
  86378. "adcs r6, r6, r9\n\t"
  86379. "adc r7, r7, #0\n\t"
  86380. #endif
  86381. /* A[5] * A[9] */
  86382. "ldr r10, [%[a], #36]\n\t"
  86383. "ldr r12, [%[a], #20]\n\t"
  86384. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86385. "lsl r8, r10, #16\n\t"
  86386. "lsl r9, r12, #16\n\t"
  86387. "lsr r8, r8, #16\n\t"
  86388. "lsr r9, r9, #16\n\t"
  86389. "mul r9, r8, r9\n\t"
  86390. "adds r5, r5, r9\n\t"
  86391. "adcs r6, r6, #0\n\t"
  86392. "adc r7, r7, #0\n\t"
  86393. "lsr r9, r12, #16\n\t"
  86394. "mul r8, r9, r8\n\t"
  86395. "lsr r9, r8, #16\n\t"
  86396. "lsl r8, r8, #16\n\t"
  86397. "adds r5, r5, r8\n\t"
  86398. "adcs r6, r6, r9\n\t"
  86399. "adc r7, r7, #0\n\t"
  86400. "lsr r8, r10, #16\n\t"
  86401. "lsr r9, r12, #16\n\t"
  86402. "mul r9, r8, r9\n\t"
  86403. "adds r6, r6, r9\n\t"
  86404. "adc r7, r7, #0\n\t"
  86405. "lsl r9, r12, #16\n\t"
  86406. "lsr r9, r9, #16\n\t"
  86407. "mul r8, r9, r8\n\t"
  86408. "lsr r9, r8, #16\n\t"
  86409. "lsl r8, r8, #16\n\t"
  86410. "adds r5, r5, r8\n\t"
  86411. "adcs r6, r6, r9\n\t"
  86412. "adc r7, r7, #0\n\t"
  86413. #else
  86414. "umull r8, r9, r10, r12\n\t"
  86415. "adds r5, r5, r8\n\t"
  86416. "adcs r6, r6, r9\n\t"
  86417. "adc r7, r7, #0\n\t"
  86418. #endif
  86419. /* A[6] * A[8] */
  86420. "ldr r10, [%[a], #32]\n\t"
  86421. "ldr r12, [%[a], #24]\n\t"
  86422. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86423. "lsl r8, r10, #16\n\t"
  86424. "lsl r9, r12, #16\n\t"
  86425. "lsr r8, r8, #16\n\t"
  86426. "lsr r9, r9, #16\n\t"
  86427. "mul r9, r8, r9\n\t"
  86428. "adds r5, r5, r9\n\t"
  86429. "adcs r6, r6, #0\n\t"
  86430. "adc r7, r7, #0\n\t"
  86431. "lsr r9, r12, #16\n\t"
  86432. "mul r8, r9, r8\n\t"
  86433. "lsr r9, r8, #16\n\t"
  86434. "lsl r8, r8, #16\n\t"
  86435. "adds r5, r5, r8\n\t"
  86436. "adcs r6, r6, r9\n\t"
  86437. "adc r7, r7, #0\n\t"
  86438. "lsr r8, r10, #16\n\t"
  86439. "lsr r9, r12, #16\n\t"
  86440. "mul r9, r8, r9\n\t"
  86441. "adds r6, r6, r9\n\t"
  86442. "adc r7, r7, #0\n\t"
  86443. "lsl r9, r12, #16\n\t"
  86444. "lsr r9, r9, #16\n\t"
  86445. "mul r8, r9, r8\n\t"
  86446. "lsr r9, r8, #16\n\t"
  86447. "lsl r8, r8, #16\n\t"
  86448. "adds r5, r5, r8\n\t"
  86449. "adcs r6, r6, r9\n\t"
  86450. "adc r7, r7, #0\n\t"
  86451. #else
  86452. "umull r8, r9, r10, r12\n\t"
  86453. "adds r5, r5, r8\n\t"
  86454. "adcs r6, r6, r9\n\t"
  86455. "adc r7, r7, #0\n\t"
  86456. #endif
  86457. /* A[7] * A[7] */
  86458. "ldr r10, [%[a], #28]\n\t"
  86459. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86460. "lsl r8, r10, #16\n\t"
  86461. "lsr r9, r10, #16\n\t"
  86462. "lsr r8, r8, #16\n\t"
  86463. "mov r12, r8\n\t"
  86464. "mul r8, r12, r8\n\t"
  86465. "mov r12, r9\n\t"
  86466. "mul r9, r12, r9\n\t"
  86467. "adds r4, r4, r8\n\t"
  86468. "adcs r2, r2, r9\n\t"
  86469. "adc r3, r3, #0\n\t"
  86470. "lsr r9, r10, #16\n\t"
  86471. "lsl r8, r10, #16\n\t"
  86472. "lsr r8, r8, #16\n\t"
  86473. "mul r8, r9, r8\n\t"
  86474. "lsr r9, r8, #15\n\t"
  86475. "lsl r8, r8, #17\n\t"
  86476. "adds r4, r4, r8\n\t"
  86477. "adcs r2, r2, r9\n\t"
  86478. "adc r3, r3, #0\n\t"
  86479. "adds r5, r5, r5\n\t"
  86480. "adcs r6, r6, r6\n\t"
  86481. "adc r7, r7, r7\n\t"
  86482. #else
  86483. "umull r8, r9, r10, r10\n\t"
  86484. "adds r5, r5, r5\n\t"
  86485. "adcs r6, r6, r6\n\t"
  86486. "adc r7, r7, r7\n\t"
  86487. "adds r4, r4, r8\n\t"
  86488. "adcs r2, r2, r9\n\t"
  86489. "adc r3, r3, #0\n\t"
  86490. #endif
  86491. "adds r4, r4, r5\n\t"
  86492. "adcs r2, r2, r6\n\t"
  86493. "adc r3, r3, r7\n\t"
  86494. "str r4, [%[r], #56]\n\t"
  86495. /* A[4] * A[11] */
  86496. "ldr r10, [%[a], #44]\n\t"
  86497. "ldr r12, [%[a], #16]\n\t"
  86498. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86499. "lsl r8, r10, #16\n\t"
  86500. "lsl r5, r12, #16\n\t"
  86501. "lsr r8, r8, #16\n\t"
  86502. "lsr r5, r5, #16\n\t"
  86503. "mul r5, r8, r5\n\t"
  86504. "lsr r9, r12, #16\n\t"
  86505. "mul r8, r9, r8\n\t"
  86506. "lsr r6, r8, #16\n\t"
  86507. "lsl r8, r8, #16\n\t"
  86508. "adds r5, r5, r8\n\t"
  86509. "adc r6, r6, #0\n\t"
  86510. "lsr r8, r10, #16\n\t"
  86511. "mul r9, r8, r9\n\t"
  86512. "add r6, r6, r9\n\t"
  86513. "lsl r9, r12, #16\n\t"
  86514. "lsr r9, r9, #16\n\t"
  86515. "mul r8, r9, r8\n\t"
  86516. "lsr r9, r8, #16\n\t"
  86517. "lsl r8, r8, #16\n\t"
  86518. "adds r5, r5, r8\n\t"
  86519. "adc r6, r6, r9\n\t"
  86520. #else
  86521. "umull r5, r6, r10, r12\n\t"
  86522. #endif
  86523. "mov r4, #0\n\t"
  86524. "mov r7, #0\n\t"
  86525. /* A[5] * A[10] */
  86526. "ldr r10, [%[a], #40]\n\t"
  86527. "ldr r12, [%[a], #20]\n\t"
  86528. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86529. "lsl r8, r10, #16\n\t"
  86530. "lsl r9, r12, #16\n\t"
  86531. "lsr r8, r8, #16\n\t"
  86532. "lsr r9, r9, #16\n\t"
  86533. "mul r9, r8, r9\n\t"
  86534. "adds r5, r5, r9\n\t"
  86535. "adcs r6, r6, #0\n\t"
  86536. "adc r7, r7, #0\n\t"
  86537. "lsr r9, r12, #16\n\t"
  86538. "mul r8, r9, r8\n\t"
  86539. "lsr r9, r8, #16\n\t"
  86540. "lsl r8, r8, #16\n\t"
  86541. "adds r5, r5, r8\n\t"
  86542. "adcs r6, r6, r9\n\t"
  86543. "adc r7, r7, #0\n\t"
  86544. "lsr r8, r10, #16\n\t"
  86545. "lsr r9, r12, #16\n\t"
  86546. "mul r9, r8, r9\n\t"
  86547. "adds r6, r6, r9\n\t"
  86548. "adc r7, r7, #0\n\t"
  86549. "lsl r9, r12, #16\n\t"
  86550. "lsr r9, r9, #16\n\t"
  86551. "mul r8, r9, r8\n\t"
  86552. "lsr r9, r8, #16\n\t"
  86553. "lsl r8, r8, #16\n\t"
  86554. "adds r5, r5, r8\n\t"
  86555. "adcs r6, r6, r9\n\t"
  86556. "adc r7, r7, #0\n\t"
  86557. #else
  86558. "umull r8, r9, r10, r12\n\t"
  86559. "adds r5, r5, r8\n\t"
  86560. "adcs r6, r6, r9\n\t"
  86561. "adc r7, r7, #0\n\t"
  86562. #endif
  86563. /* A[6] * A[9] */
  86564. "ldr r10, [%[a], #36]\n\t"
  86565. "ldr r12, [%[a], #24]\n\t"
  86566. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86567. "lsl r8, r10, #16\n\t"
  86568. "lsl r9, r12, #16\n\t"
  86569. "lsr r8, r8, #16\n\t"
  86570. "lsr r9, r9, #16\n\t"
  86571. "mul r9, r8, r9\n\t"
  86572. "adds r5, r5, r9\n\t"
  86573. "adcs r6, r6, #0\n\t"
  86574. "adc r7, r7, #0\n\t"
  86575. "lsr r9, r12, #16\n\t"
  86576. "mul r8, r9, r8\n\t"
  86577. "lsr r9, r8, #16\n\t"
  86578. "lsl r8, r8, #16\n\t"
  86579. "adds r5, r5, r8\n\t"
  86580. "adcs r6, r6, r9\n\t"
  86581. "adc r7, r7, #0\n\t"
  86582. "lsr r8, r10, #16\n\t"
  86583. "lsr r9, r12, #16\n\t"
  86584. "mul r9, r8, r9\n\t"
  86585. "adds r6, r6, r9\n\t"
  86586. "adc r7, r7, #0\n\t"
  86587. "lsl r9, r12, #16\n\t"
  86588. "lsr r9, r9, #16\n\t"
  86589. "mul r8, r9, r8\n\t"
  86590. "lsr r9, r8, #16\n\t"
  86591. "lsl r8, r8, #16\n\t"
  86592. "adds r5, r5, r8\n\t"
  86593. "adcs r6, r6, r9\n\t"
  86594. "adc r7, r7, #0\n\t"
  86595. #else
  86596. "umull r8, r9, r10, r12\n\t"
  86597. "adds r5, r5, r8\n\t"
  86598. "adcs r6, r6, r9\n\t"
  86599. "adc r7, r7, #0\n\t"
  86600. #endif
  86601. /* A[7] * A[8] */
  86602. "ldr r10, [%[a], #32]\n\t"
  86603. "ldr r12, [%[a], #28]\n\t"
  86604. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86605. "lsl r8, r10, #16\n\t"
  86606. "lsl r9, r12, #16\n\t"
  86607. "lsr r8, r8, #16\n\t"
  86608. "lsr r9, r9, #16\n\t"
  86609. "mul r9, r8, r9\n\t"
  86610. "adds r5, r5, r9\n\t"
  86611. "adcs r6, r6, #0\n\t"
  86612. "adc r7, r7, #0\n\t"
  86613. "lsr r9, r12, #16\n\t"
  86614. "mul r8, r9, r8\n\t"
  86615. "lsr r9, r8, #16\n\t"
  86616. "lsl r8, r8, #16\n\t"
  86617. "adds r5, r5, r8\n\t"
  86618. "adcs r6, r6, r9\n\t"
  86619. "adc r7, r7, #0\n\t"
  86620. "lsr r8, r10, #16\n\t"
  86621. "lsr r9, r12, #16\n\t"
  86622. "mul r9, r8, r9\n\t"
  86623. "adds r6, r6, r9\n\t"
  86624. "adc r7, r7, #0\n\t"
  86625. "lsl r9, r12, #16\n\t"
  86626. "lsr r9, r9, #16\n\t"
  86627. "mul r8, r9, r8\n\t"
  86628. "lsr r9, r8, #16\n\t"
  86629. "lsl r8, r8, #16\n\t"
  86630. "adds r5, r5, r8\n\t"
  86631. "adcs r6, r6, r9\n\t"
  86632. "adc r7, r7, #0\n\t"
  86633. #else
  86634. "umull r8, r9, r10, r12\n\t"
  86635. "adds r5, r5, r8\n\t"
  86636. "adcs r6, r6, r9\n\t"
  86637. "adc r7, r7, #0\n\t"
  86638. #endif
  86639. "adds r5, r5, r5\n\t"
  86640. "adcs r6, r6, r6\n\t"
  86641. "adc r7, r7, r7\n\t"
  86642. "adds r2, r2, r5\n\t"
  86643. "adcs r3, r3, r6\n\t"
  86644. "adc r4, r4, r7\n\t"
  86645. "str r2, [%[r], #60]\n\t"
  86646. /* A[5] * A[11] */
  86647. "ldr r10, [%[a], #44]\n\t"
  86648. "ldr r12, [%[a], #20]\n\t"
  86649. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86650. "lsl r8, r10, #16\n\t"
  86651. "lsl r5, r12, #16\n\t"
  86652. "lsr r8, r8, #16\n\t"
  86653. "lsr r5, r5, #16\n\t"
  86654. "mul r5, r8, r5\n\t"
  86655. "lsr r9, r12, #16\n\t"
  86656. "mul r8, r9, r8\n\t"
  86657. "lsr r6, r8, #16\n\t"
  86658. "lsl r8, r8, #16\n\t"
  86659. "adds r5, r5, r8\n\t"
  86660. "adc r6, r6, #0\n\t"
  86661. "lsr r8, r10, #16\n\t"
  86662. "mul r9, r8, r9\n\t"
  86663. "add r6, r6, r9\n\t"
  86664. "lsl r9, r12, #16\n\t"
  86665. "lsr r9, r9, #16\n\t"
  86666. "mul r8, r9, r8\n\t"
  86667. "lsr r9, r8, #16\n\t"
  86668. "lsl r8, r8, #16\n\t"
  86669. "adds r5, r5, r8\n\t"
  86670. "adc r6, r6, r9\n\t"
  86671. #else
  86672. "umull r5, r6, r10, r12\n\t"
  86673. #endif
  86674. "mov r2, #0\n\t"
  86675. "mov r7, #0\n\t"
  86676. /* A[6] * A[10] */
  86677. "ldr r10, [%[a], #40]\n\t"
  86678. "ldr r12, [%[a], #24]\n\t"
  86679. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86680. "lsl r8, r10, #16\n\t"
  86681. "lsl r9, r12, #16\n\t"
  86682. "lsr r8, r8, #16\n\t"
  86683. "lsr r9, r9, #16\n\t"
  86684. "mul r9, r8, r9\n\t"
  86685. "adds r5, r5, r9\n\t"
  86686. "adcs r6, r6, #0\n\t"
  86687. "adc r7, r7, #0\n\t"
  86688. "lsr r9, r12, #16\n\t"
  86689. "mul r8, r9, r8\n\t"
  86690. "lsr r9, r8, #16\n\t"
  86691. "lsl r8, r8, #16\n\t"
  86692. "adds r5, r5, r8\n\t"
  86693. "adcs r6, r6, r9\n\t"
  86694. "adc r7, r7, #0\n\t"
  86695. "lsr r8, r10, #16\n\t"
  86696. "lsr r9, r12, #16\n\t"
  86697. "mul r9, r8, r9\n\t"
  86698. "adds r6, r6, r9\n\t"
  86699. "adc r7, r7, #0\n\t"
  86700. "lsl r9, r12, #16\n\t"
  86701. "lsr r9, r9, #16\n\t"
  86702. "mul r8, r9, r8\n\t"
  86703. "lsr r9, r8, #16\n\t"
  86704. "lsl r8, r8, #16\n\t"
  86705. "adds r5, r5, r8\n\t"
  86706. "adcs r6, r6, r9\n\t"
  86707. "adc r7, r7, #0\n\t"
  86708. #else
  86709. "umull r8, r9, r10, r12\n\t"
  86710. "adds r5, r5, r8\n\t"
  86711. "adcs r6, r6, r9\n\t"
  86712. "adc r7, r7, #0\n\t"
  86713. #endif
  86714. /* A[7] * A[9] */
  86715. "ldr r10, [%[a], #36]\n\t"
  86716. "ldr r12, [%[a], #28]\n\t"
  86717. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86718. "lsl r8, r10, #16\n\t"
  86719. "lsl r9, r12, #16\n\t"
  86720. "lsr r8, r8, #16\n\t"
  86721. "lsr r9, r9, #16\n\t"
  86722. "mul r9, r8, r9\n\t"
  86723. "adds r5, r5, r9\n\t"
  86724. "adcs r6, r6, #0\n\t"
  86725. "adc r7, r7, #0\n\t"
  86726. "lsr r9, r12, #16\n\t"
  86727. "mul r8, r9, r8\n\t"
  86728. "lsr r9, r8, #16\n\t"
  86729. "lsl r8, r8, #16\n\t"
  86730. "adds r5, r5, r8\n\t"
  86731. "adcs r6, r6, r9\n\t"
  86732. "adc r7, r7, #0\n\t"
  86733. "lsr r8, r10, #16\n\t"
  86734. "lsr r9, r12, #16\n\t"
  86735. "mul r9, r8, r9\n\t"
  86736. "adds r6, r6, r9\n\t"
  86737. "adc r7, r7, #0\n\t"
  86738. "lsl r9, r12, #16\n\t"
  86739. "lsr r9, r9, #16\n\t"
  86740. "mul r8, r9, r8\n\t"
  86741. "lsr r9, r8, #16\n\t"
  86742. "lsl r8, r8, #16\n\t"
  86743. "adds r5, r5, r8\n\t"
  86744. "adcs r6, r6, r9\n\t"
  86745. "adc r7, r7, #0\n\t"
  86746. #else
  86747. "umull r8, r9, r10, r12\n\t"
  86748. "adds r5, r5, r8\n\t"
  86749. "adcs r6, r6, r9\n\t"
  86750. "adc r7, r7, #0\n\t"
  86751. #endif
  86752. /* A[8] * A[8] */
  86753. "ldr r10, [%[a], #32]\n\t"
  86754. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86755. "lsl r8, r10, #16\n\t"
  86756. "lsr r9, r10, #16\n\t"
  86757. "lsr r8, r8, #16\n\t"
  86758. "mov r12, r8\n\t"
  86759. "mul r8, r12, r8\n\t"
  86760. "mov r12, r9\n\t"
  86761. "mul r9, r12, r9\n\t"
  86762. "adds r3, r3, r8\n\t"
  86763. "adcs r4, r4, r9\n\t"
  86764. "adc r2, r2, #0\n\t"
  86765. "lsr r9, r10, #16\n\t"
  86766. "lsl r8, r10, #16\n\t"
  86767. "lsr r8, r8, #16\n\t"
  86768. "mul r8, r9, r8\n\t"
  86769. "lsr r9, r8, #15\n\t"
  86770. "lsl r8, r8, #17\n\t"
  86771. "adds r3, r3, r8\n\t"
  86772. "adcs r4, r4, r9\n\t"
  86773. "adc r2, r2, #0\n\t"
  86774. "adds r5, r5, r5\n\t"
  86775. "adcs r6, r6, r6\n\t"
  86776. "adc r7, r7, r7\n\t"
  86777. #else
  86778. "umull r8, r9, r10, r10\n\t"
  86779. "adds r5, r5, r5\n\t"
  86780. "adcs r6, r6, r6\n\t"
  86781. "adc r7, r7, r7\n\t"
  86782. "adds r3, r3, r8\n\t"
  86783. "adcs r4, r4, r9\n\t"
  86784. "adc r2, r2, #0\n\t"
  86785. #endif
  86786. "adds r3, r3, r5\n\t"
  86787. "adcs r4, r4, r6\n\t"
  86788. "adc r2, r2, r7\n\t"
  86789. "str r3, [%[r], #64]\n\t"
  86790. /* A[6] * A[11] */
  86791. "ldr r10, [%[a], #44]\n\t"
  86792. "ldr r12, [%[a], #24]\n\t"
  86793. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86794. "lsl r8, r10, #16\n\t"
  86795. "lsl r5, r12, #16\n\t"
  86796. "lsr r8, r8, #16\n\t"
  86797. "lsr r5, r5, #16\n\t"
  86798. "mul r5, r8, r5\n\t"
  86799. "lsr r9, r12, #16\n\t"
  86800. "mul r8, r9, r8\n\t"
  86801. "lsr r6, r8, #16\n\t"
  86802. "lsl r8, r8, #16\n\t"
  86803. "adds r5, r5, r8\n\t"
  86804. "adc r6, r6, #0\n\t"
  86805. "lsr r8, r10, #16\n\t"
  86806. "mul r9, r8, r9\n\t"
  86807. "add r6, r6, r9\n\t"
  86808. "lsl r9, r12, #16\n\t"
  86809. "lsr r9, r9, #16\n\t"
  86810. "mul r8, r9, r8\n\t"
  86811. "lsr r9, r8, #16\n\t"
  86812. "lsl r8, r8, #16\n\t"
  86813. "adds r5, r5, r8\n\t"
  86814. "adc r6, r6, r9\n\t"
  86815. #else
  86816. "umull r5, r6, r10, r12\n\t"
  86817. #endif
  86818. "mov r3, #0\n\t"
  86819. "mov r7, #0\n\t"
  86820. /* A[7] * A[10] */
  86821. "ldr r10, [%[a], #40]\n\t"
  86822. "ldr r12, [%[a], #28]\n\t"
  86823. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86824. "lsl r8, r10, #16\n\t"
  86825. "lsl r9, r12, #16\n\t"
  86826. "lsr r8, r8, #16\n\t"
  86827. "lsr r9, r9, #16\n\t"
  86828. "mul r9, r8, r9\n\t"
  86829. "adds r5, r5, r9\n\t"
  86830. "adcs r6, r6, #0\n\t"
  86831. "adc r7, r7, #0\n\t"
  86832. "lsr r9, r12, #16\n\t"
  86833. "mul r8, r9, r8\n\t"
  86834. "lsr r9, r8, #16\n\t"
  86835. "lsl r8, r8, #16\n\t"
  86836. "adds r5, r5, r8\n\t"
  86837. "adcs r6, r6, r9\n\t"
  86838. "adc r7, r7, #0\n\t"
  86839. "lsr r8, r10, #16\n\t"
  86840. "lsr r9, r12, #16\n\t"
  86841. "mul r9, r8, r9\n\t"
  86842. "adds r6, r6, r9\n\t"
  86843. "adc r7, r7, #0\n\t"
  86844. "lsl r9, r12, #16\n\t"
  86845. "lsr r9, r9, #16\n\t"
  86846. "mul r8, r9, r8\n\t"
  86847. "lsr r9, r8, #16\n\t"
  86848. "lsl r8, r8, #16\n\t"
  86849. "adds r5, r5, r8\n\t"
  86850. "adcs r6, r6, r9\n\t"
  86851. "adc r7, r7, #0\n\t"
  86852. #else
  86853. "umull r8, r9, r10, r12\n\t"
  86854. "adds r5, r5, r8\n\t"
  86855. "adcs r6, r6, r9\n\t"
  86856. "adc r7, r7, #0\n\t"
  86857. #endif
  86858. /* A[8] * A[9] */
  86859. "ldr r10, [%[a], #36]\n\t"
  86860. "ldr r12, [%[a], #32]\n\t"
  86861. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86862. "lsl r8, r10, #16\n\t"
  86863. "lsl r9, r12, #16\n\t"
  86864. "lsr r8, r8, #16\n\t"
  86865. "lsr r9, r9, #16\n\t"
  86866. "mul r9, r8, r9\n\t"
  86867. "adds r5, r5, r9\n\t"
  86868. "adcs r6, r6, #0\n\t"
  86869. "adc r7, r7, #0\n\t"
  86870. "lsr r9, r12, #16\n\t"
  86871. "mul r8, r9, r8\n\t"
  86872. "lsr r9, r8, #16\n\t"
  86873. "lsl r8, r8, #16\n\t"
  86874. "adds r5, r5, r8\n\t"
  86875. "adcs r6, r6, r9\n\t"
  86876. "adc r7, r7, #0\n\t"
  86877. "lsr r8, r10, #16\n\t"
  86878. "lsr r9, r12, #16\n\t"
  86879. "mul r9, r8, r9\n\t"
  86880. "adds r6, r6, r9\n\t"
  86881. "adc r7, r7, #0\n\t"
  86882. "lsl r9, r12, #16\n\t"
  86883. "lsr r9, r9, #16\n\t"
  86884. "mul r8, r9, r8\n\t"
  86885. "lsr r9, r8, #16\n\t"
  86886. "lsl r8, r8, #16\n\t"
  86887. "adds r5, r5, r8\n\t"
  86888. "adcs r6, r6, r9\n\t"
  86889. "adc r7, r7, #0\n\t"
  86890. #else
  86891. "umull r8, r9, r10, r12\n\t"
  86892. "adds r5, r5, r8\n\t"
  86893. "adcs r6, r6, r9\n\t"
  86894. "adc r7, r7, #0\n\t"
  86895. #endif
  86896. "adds r5, r5, r5\n\t"
  86897. "adcs r6, r6, r6\n\t"
  86898. "adc r7, r7, r7\n\t"
  86899. "adds r4, r4, r5\n\t"
  86900. "adcs r2, r2, r6\n\t"
  86901. "adc r3, r3, r7\n\t"
  86902. "str r4, [%[r], #68]\n\t"
  86903. /* A[7] * A[11] */
  86904. "ldr r10, [%[a], #44]\n\t"
  86905. "ldr r12, [%[a], #28]\n\t"
  86906. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86907. "lsl r8, r10, #16\n\t"
  86908. "lsl r9, r12, #16\n\t"
  86909. "lsr r8, r8, #16\n\t"
  86910. "lsr r9, r9, #16\n\t"
  86911. "mul r9, r8, r9\n\t"
  86912. "adds r2, r2, r9\n\t"
  86913. "adcs r3, r3, #0\n\t"
  86914. "mov r4, #0\n\t"
  86915. "adc r4, r4, #0\n\t"
  86916. "adds r2, r2, r9\n\t"
  86917. "adcs r3, r3, #0\n\t"
  86918. "adc r4, r4, #0\n\t"
  86919. "lsr r9, r12, #16\n\t"
  86920. "mul r8, r9, r8\n\t"
  86921. "lsr r9, r8, #16\n\t"
  86922. "lsl r8, r8, #16\n\t"
  86923. "adds r2, r2, r8\n\t"
  86924. "adcs r3, r3, r9\n\t"
  86925. "adc r4, r4, #0\n\t"
  86926. "adds r2, r2, r8\n\t"
  86927. "adcs r3, r3, r9\n\t"
  86928. "adc r4, r4, #0\n\t"
  86929. "lsr r8, r10, #16\n\t"
  86930. "lsr r9, r12, #16\n\t"
  86931. "mul r9, r8, r9\n\t"
  86932. "adds r3, r3, r9\n\t"
  86933. "adc r4, r4, #0\n\t"
  86934. "adds r3, r3, r9\n\t"
  86935. "adc r4, r4, #0\n\t"
  86936. "lsl r9, r12, #16\n\t"
  86937. "lsr r9, r9, #16\n\t"
  86938. "mul r8, r9, r8\n\t"
  86939. "lsr r9, r8, #16\n\t"
  86940. "lsl r8, r8, #16\n\t"
  86941. "adds r2, r2, r8\n\t"
  86942. "adcs r3, r3, r9\n\t"
  86943. "adc r4, r4, #0\n\t"
  86944. "adds r2, r2, r8\n\t"
  86945. "adcs r3, r3, r9\n\t"
  86946. "adc r4, r4, #0\n\t"
  86947. #else
  86948. "umull r8, r9, r10, r12\n\t"
  86949. "adds r2, r2, r8\n\t"
  86950. "adcs r3, r3, r9\n\t"
  86951. "mov r4, #0\n\t"
  86952. "adc r4, r4, #0\n\t"
  86953. "adds r2, r2, r8\n\t"
  86954. "adcs r3, r3, r9\n\t"
  86955. "mov r4, #0\n\t"
  86956. "adc r4, r4, #0\n\t"
  86957. #endif
  86958. /* A[8] * A[10] */
  86959. "ldr r10, [%[a], #40]\n\t"
  86960. "ldr r12, [%[a], #32]\n\t"
  86961. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  86962. "lsl r8, r10, #16\n\t"
  86963. "lsl r9, r12, #16\n\t"
  86964. "lsr r8, r8, #16\n\t"
  86965. "lsr r9, r9, #16\n\t"
  86966. "mul r9, r8, r9\n\t"
  86967. "adds r2, r2, r9\n\t"
  86968. "adcs r3, r3, #0\n\t"
  86969. "adc r4, r4, #0\n\t"
  86970. "adds r2, r2, r9\n\t"
  86971. "adcs r3, r3, #0\n\t"
  86972. "adc r4, r4, #0\n\t"
  86973. "lsr r9, r12, #16\n\t"
  86974. "mul r8, r9, r8\n\t"
  86975. "lsr r9, r8, #16\n\t"
  86976. "lsl r8, r8, #16\n\t"
  86977. "adds r2, r2, r8\n\t"
  86978. "adcs r3, r3, r9\n\t"
  86979. "adc r4, r4, #0\n\t"
  86980. "adds r2, r2, r8\n\t"
  86981. "adcs r3, r3, r9\n\t"
  86982. "adc r4, r4, #0\n\t"
  86983. "lsr r8, r10, #16\n\t"
  86984. "lsr r9, r12, #16\n\t"
  86985. "mul r9, r8, r9\n\t"
  86986. "adds r3, r3, r9\n\t"
  86987. "adc r4, r4, #0\n\t"
  86988. "adds r3, r3, r9\n\t"
  86989. "adc r4, r4, #0\n\t"
  86990. "lsl r9, r12, #16\n\t"
  86991. "lsr r9, r9, #16\n\t"
  86992. "mul r8, r9, r8\n\t"
  86993. "lsr r9, r8, #16\n\t"
  86994. "lsl r8, r8, #16\n\t"
  86995. "adds r2, r2, r8\n\t"
  86996. "adcs r3, r3, r9\n\t"
  86997. "adc r4, r4, #0\n\t"
  86998. "adds r2, r2, r8\n\t"
  86999. "adcs r3, r3, r9\n\t"
  87000. "adc r4, r4, #0\n\t"
  87001. #else
  87002. "umull r8, r9, r10, r12\n\t"
  87003. "adds r2, r2, r8\n\t"
  87004. "adcs r3, r3, r9\n\t"
  87005. "adc r4, r4, #0\n\t"
  87006. "adds r2, r2, r8\n\t"
  87007. "adcs r3, r3, r9\n\t"
  87008. "adc r4, r4, #0\n\t"
  87009. #endif
  87010. /* A[9] * A[9] */
  87011. "ldr r10, [%[a], #36]\n\t"
  87012. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87013. "lsl r8, r10, #16\n\t"
  87014. "lsr r9, r10, #16\n\t"
  87015. "lsr r8, r8, #16\n\t"
  87016. "mov r12, r8\n\t"
  87017. "mul r8, r12, r8\n\t"
  87018. "mov r12, r9\n\t"
  87019. "mul r9, r12, r9\n\t"
  87020. "adds r2, r2, r8\n\t"
  87021. "adcs r3, r3, r9\n\t"
  87022. "adc r4, r4, #0\n\t"
  87023. "lsr r9, r10, #16\n\t"
  87024. "lsl r8, r10, #16\n\t"
  87025. "lsr r8, r8, #16\n\t"
  87026. "mul r8, r9, r8\n\t"
  87027. "lsr r9, r8, #15\n\t"
  87028. "lsl r8, r8, #17\n\t"
  87029. "adds r2, r2, r8\n\t"
  87030. "adcs r3, r3, r9\n\t"
  87031. "adc r4, r4, #0\n\t"
  87032. #else
  87033. "umull r8, r9, r10, r10\n\t"
  87034. "adds r2, r2, r8\n\t"
  87035. "adcs r3, r3, r9\n\t"
  87036. "adc r4, r4, #0\n\t"
  87037. #endif
  87038. "str r2, [%[r], #72]\n\t"
  87039. /* A[8] * A[11] */
  87040. "ldr r10, [%[a], #44]\n\t"
  87041. "ldr r12, [%[a], #32]\n\t"
  87042. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87043. "lsl r8, r10, #16\n\t"
  87044. "lsl r9, r12, #16\n\t"
  87045. "lsr r8, r8, #16\n\t"
  87046. "lsr r9, r9, #16\n\t"
  87047. "mul r9, r8, r9\n\t"
  87048. "adds r3, r3, r9\n\t"
  87049. "adcs r4, r4, #0\n\t"
  87050. "mov r2, #0\n\t"
  87051. "adc r2, r2, #0\n\t"
  87052. "adds r3, r3, r9\n\t"
  87053. "adcs r4, r4, #0\n\t"
  87054. "adc r2, r2, #0\n\t"
  87055. "lsr r9, r12, #16\n\t"
  87056. "mul r8, r9, r8\n\t"
  87057. "lsr r9, r8, #16\n\t"
  87058. "lsl r8, r8, #16\n\t"
  87059. "adds r3, r3, r8\n\t"
  87060. "adcs r4, r4, r9\n\t"
  87061. "adc r2, r2, #0\n\t"
  87062. "adds r3, r3, r8\n\t"
  87063. "adcs r4, r4, r9\n\t"
  87064. "adc r2, r2, #0\n\t"
  87065. "lsr r8, r10, #16\n\t"
  87066. "lsr r9, r12, #16\n\t"
  87067. "mul r9, r8, r9\n\t"
  87068. "adds r4, r4, r9\n\t"
  87069. "adc r2, r2, #0\n\t"
  87070. "adds r4, r4, r9\n\t"
  87071. "adc r2, r2, #0\n\t"
  87072. "lsl r9, r12, #16\n\t"
  87073. "lsr r9, r9, #16\n\t"
  87074. "mul r8, r9, r8\n\t"
  87075. "lsr r9, r8, #16\n\t"
  87076. "lsl r8, r8, #16\n\t"
  87077. "adds r3, r3, r8\n\t"
  87078. "adcs r4, r4, r9\n\t"
  87079. "adc r2, r2, #0\n\t"
  87080. "adds r3, r3, r8\n\t"
  87081. "adcs r4, r4, r9\n\t"
  87082. "adc r2, r2, #0\n\t"
  87083. #else
  87084. "umull r8, r9, r10, r12\n\t"
  87085. "adds r3, r3, r8\n\t"
  87086. "adcs r4, r4, r9\n\t"
  87087. "mov r2, #0\n\t"
  87088. "adc r2, r2, #0\n\t"
  87089. "adds r3, r3, r8\n\t"
  87090. "adcs r4, r4, r9\n\t"
  87091. "mov r2, #0\n\t"
  87092. "adc r2, r2, #0\n\t"
  87093. #endif
  87094. /* A[9] * A[10] */
  87095. "ldr r10, [%[a], #40]\n\t"
  87096. "ldr r12, [%[a], #36]\n\t"
  87097. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87098. "lsl r8, r10, #16\n\t"
  87099. "lsl r9, r12, #16\n\t"
  87100. "lsr r8, r8, #16\n\t"
  87101. "lsr r9, r9, #16\n\t"
  87102. "mul r9, r8, r9\n\t"
  87103. "adds r3, r3, r9\n\t"
  87104. "adcs r4, r4, #0\n\t"
  87105. "adc r2, r2, #0\n\t"
  87106. "adds r3, r3, r9\n\t"
  87107. "adcs r4, r4, #0\n\t"
  87108. "adc r2, r2, #0\n\t"
  87109. "lsr r9, r12, #16\n\t"
  87110. "mul r8, r9, r8\n\t"
  87111. "lsr r9, r8, #16\n\t"
  87112. "lsl r8, r8, #16\n\t"
  87113. "adds r3, r3, r8\n\t"
  87114. "adcs r4, r4, r9\n\t"
  87115. "adc r2, r2, #0\n\t"
  87116. "adds r3, r3, r8\n\t"
  87117. "adcs r4, r4, r9\n\t"
  87118. "adc r2, r2, #0\n\t"
  87119. "lsr r8, r10, #16\n\t"
  87120. "lsr r9, r12, #16\n\t"
  87121. "mul r9, r8, r9\n\t"
  87122. "adds r4, r4, r9\n\t"
  87123. "adc r2, r2, #0\n\t"
  87124. "adds r4, r4, r9\n\t"
  87125. "adc r2, r2, #0\n\t"
  87126. "lsl r9, r12, #16\n\t"
  87127. "lsr r9, r9, #16\n\t"
  87128. "mul r8, r9, r8\n\t"
  87129. "lsr r9, r8, #16\n\t"
  87130. "lsl r8, r8, #16\n\t"
  87131. "adds r3, r3, r8\n\t"
  87132. "adcs r4, r4, r9\n\t"
  87133. "adc r2, r2, #0\n\t"
  87134. "adds r3, r3, r8\n\t"
  87135. "adcs r4, r4, r9\n\t"
  87136. "adc r2, r2, #0\n\t"
  87137. #else
  87138. "umull r8, r9, r10, r12\n\t"
  87139. "adds r3, r3, r8\n\t"
  87140. "adcs r4, r4, r9\n\t"
  87141. "adc r2, r2, #0\n\t"
  87142. "adds r3, r3, r8\n\t"
  87143. "adcs r4, r4, r9\n\t"
  87144. "adc r2, r2, #0\n\t"
  87145. #endif
  87146. "str r3, [%[r], #76]\n\t"
  87147. /* A[9] * A[11] */
  87148. "ldr r10, [%[a], #44]\n\t"
  87149. "ldr r12, [%[a], #36]\n\t"
  87150. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87151. "lsl r8, r10, #16\n\t"
  87152. "lsl r9, r12, #16\n\t"
  87153. "lsr r8, r8, #16\n\t"
  87154. "lsr r9, r9, #16\n\t"
  87155. "mul r9, r8, r9\n\t"
  87156. "adds r4, r4, r9\n\t"
  87157. "adcs r2, r2, #0\n\t"
  87158. "mov r3, #0\n\t"
  87159. "adc r3, r3, #0\n\t"
  87160. "adds r4, r4, r9\n\t"
  87161. "adcs r2, r2, #0\n\t"
  87162. "adc r3, r3, #0\n\t"
  87163. "lsr r9, r12, #16\n\t"
  87164. "mul r8, r9, r8\n\t"
  87165. "lsr r9, r8, #16\n\t"
  87166. "lsl r8, r8, #16\n\t"
  87167. "adds r4, r4, r8\n\t"
  87168. "adcs r2, r2, r9\n\t"
  87169. "adc r3, r3, #0\n\t"
  87170. "adds r4, r4, r8\n\t"
  87171. "adcs r2, r2, r9\n\t"
  87172. "adc r3, r3, #0\n\t"
  87173. "lsr r8, r10, #16\n\t"
  87174. "lsr r9, r12, #16\n\t"
  87175. "mul r9, r8, r9\n\t"
  87176. "adds r2, r2, r9\n\t"
  87177. "adc r3, r3, #0\n\t"
  87178. "adds r2, r2, r9\n\t"
  87179. "adc r3, r3, #0\n\t"
  87180. "lsl r9, r12, #16\n\t"
  87181. "lsr r9, r9, #16\n\t"
  87182. "mul r8, r9, r8\n\t"
  87183. "lsr r9, r8, #16\n\t"
  87184. "lsl r8, r8, #16\n\t"
  87185. "adds r4, r4, r8\n\t"
  87186. "adcs r2, r2, r9\n\t"
  87187. "adc r3, r3, #0\n\t"
  87188. "adds r4, r4, r8\n\t"
  87189. "adcs r2, r2, r9\n\t"
  87190. "adc r3, r3, #0\n\t"
  87191. #else
  87192. "umull r8, r9, r10, r12\n\t"
  87193. "adds r4, r4, r8\n\t"
  87194. "adcs r2, r2, r9\n\t"
  87195. "mov r3, #0\n\t"
  87196. "adc r3, r3, #0\n\t"
  87197. "adds r4, r4, r8\n\t"
  87198. "adcs r2, r2, r9\n\t"
  87199. "mov r3, #0\n\t"
  87200. "adc r3, r3, #0\n\t"
  87201. #endif
  87202. /* A[10] * A[10] */
  87203. "ldr r10, [%[a], #40]\n\t"
  87204. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87205. "lsl r8, r10, #16\n\t"
  87206. "lsr r9, r10, #16\n\t"
  87207. "lsr r8, r8, #16\n\t"
  87208. "mov r12, r8\n\t"
  87209. "mul r8, r12, r8\n\t"
  87210. "mov r12, r9\n\t"
  87211. "mul r9, r12, r9\n\t"
  87212. "adds r4, r4, r8\n\t"
  87213. "adcs r2, r2, r9\n\t"
  87214. "adc r3, r3, #0\n\t"
  87215. "lsr r9, r10, #16\n\t"
  87216. "lsl r8, r10, #16\n\t"
  87217. "lsr r8, r8, #16\n\t"
  87218. "mul r8, r9, r8\n\t"
  87219. "lsr r9, r8, #15\n\t"
  87220. "lsl r8, r8, #17\n\t"
  87221. "adds r4, r4, r8\n\t"
  87222. "adcs r2, r2, r9\n\t"
  87223. "adc r3, r3, #0\n\t"
  87224. #else
  87225. "umull r8, r9, r10, r10\n\t"
  87226. "adds r4, r4, r8\n\t"
  87227. "adcs r2, r2, r9\n\t"
  87228. "adc r3, r3, #0\n\t"
  87229. #endif
  87230. "str r4, [%[r], #80]\n\t"
  87231. /* A[10] * A[11] */
  87232. "ldr r10, [%[a], #44]\n\t"
  87233. "ldr r12, [%[a], #40]\n\t"
  87234. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87235. "lsl r8, r10, #16\n\t"
  87236. "lsl r9, r12, #16\n\t"
  87237. "lsr r8, r8, #16\n\t"
  87238. "lsr r9, r9, #16\n\t"
  87239. "mul r9, r8, r9\n\t"
  87240. "adds r2, r2, r9\n\t"
  87241. "adcs r3, r3, #0\n\t"
  87242. "mov r4, #0\n\t"
  87243. "adc r4, r4, #0\n\t"
  87244. "adds r2, r2, r9\n\t"
  87245. "adcs r3, r3, #0\n\t"
  87246. "adc r4, r4, #0\n\t"
  87247. "lsr r9, r12, #16\n\t"
  87248. "mul r8, r9, r8\n\t"
  87249. "lsr r9, r8, #16\n\t"
  87250. "lsl r8, r8, #16\n\t"
  87251. "adds r2, r2, r8\n\t"
  87252. "adcs r3, r3, r9\n\t"
  87253. "adc r4, r4, #0\n\t"
  87254. "adds r2, r2, r8\n\t"
  87255. "adcs r3, r3, r9\n\t"
  87256. "adc r4, r4, #0\n\t"
  87257. "lsr r8, r10, #16\n\t"
  87258. "lsr r9, r12, #16\n\t"
  87259. "mul r9, r8, r9\n\t"
  87260. "adds r3, r3, r9\n\t"
  87261. "adc r4, r4, #0\n\t"
  87262. "adds r3, r3, r9\n\t"
  87263. "adc r4, r4, #0\n\t"
  87264. "lsl r9, r12, #16\n\t"
  87265. "lsr r9, r9, #16\n\t"
  87266. "mul r8, r9, r8\n\t"
  87267. "lsr r9, r8, #16\n\t"
  87268. "lsl r8, r8, #16\n\t"
  87269. "adds r2, r2, r8\n\t"
  87270. "adcs r3, r3, r9\n\t"
  87271. "adc r4, r4, #0\n\t"
  87272. "adds r2, r2, r8\n\t"
  87273. "adcs r3, r3, r9\n\t"
  87274. "adc r4, r4, #0\n\t"
  87275. #else
  87276. "umull r8, r9, r10, r12\n\t"
  87277. "adds r2, r2, r8\n\t"
  87278. "adcs r3, r3, r9\n\t"
  87279. "mov r4, #0\n\t"
  87280. "adc r4, r4, #0\n\t"
  87281. "adds r2, r2, r8\n\t"
  87282. "adcs r3, r3, r9\n\t"
  87283. "mov r4, #0\n\t"
  87284. "adc r4, r4, #0\n\t"
  87285. #endif
  87286. "str r2, [%[r], #84]\n\t"
  87287. /* A[11] * A[11] */
  87288. "ldr r10, [%[a], #44]\n\t"
  87289. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87290. "lsl r8, r10, #16\n\t"
  87291. "lsr r9, r10, #16\n\t"
  87292. "lsr r8, r8, #16\n\t"
  87293. "mov r12, r8\n\t"
  87294. "mul r8, r12, r8\n\t"
  87295. "mov r12, r9\n\t"
  87296. "mul r9, r12, r9\n\t"
  87297. "adds r3, r3, r8\n\t"
  87298. "adc r4, r4, r9\n\t"
  87299. "lsr r9, r10, #16\n\t"
  87300. "lsl r8, r10, #16\n\t"
  87301. "lsr r8, r8, #16\n\t"
  87302. "mul r8, r9, r8\n\t"
  87303. "lsr r9, r8, #15\n\t"
  87304. "lsl r8, r8, #17\n\t"
  87305. "adds r3, r3, r8\n\t"
  87306. "adc r4, r4, r9\n\t"
  87307. #else
  87308. "umull r8, r9, r10, r10\n\t"
  87309. "adds r3, r3, r8\n\t"
  87310. "adc r4, r4, r9\n\t"
  87311. #endif
  87312. "str r3, [%[r], #88]\n\t"
  87313. "str r4, [%[r], #92]\n\t"
  87314. "ldm sp!, {r2, r3, r4, r8}\n\t"
  87315. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  87316. "ldm sp!, {r2, r3, r4, r8}\n\t"
  87317. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  87318. "ldm sp!, {r2, r3, r4, r8}\n\t"
  87319. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  87320. : [r] "+r" (r), [a] "+r" (a)
  87321. :
  87322. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  87323. );
  87324. }
  87325. #endif /* WOLFSSL_SP_SMALL */
  87326. #ifdef WOLFSSL_SP_SMALL
  87327. /* Add b to a into r. (r = a + b)
  87328. *
  87329. * r A single precision integer.
  87330. * a A single precision integer.
  87331. * b A single precision integer.
  87332. */
  87333. static sp_digit sp_384_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  87334. {
  87335. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  87336. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  87337. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  87338. __asm__ __volatile__ (
  87339. "mov r3, #0\n\t"
  87340. "add r12, %[a], #48\n\t"
  87341. "\n"
  87342. "L_sp_384_add_12_word_%=: \n\t"
  87343. "adds r3, r3, #-1\n\t"
  87344. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  87345. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  87346. "adcs r4, r4, r8\n\t"
  87347. "adcs r5, r5, r9\n\t"
  87348. "adcs r6, r6, r10\n\t"
  87349. "adcs r7, r7, r11\n\t"
  87350. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  87351. "mov r4, #0\n\t"
  87352. "adc r3, r4, #0\n\t"
  87353. "cmp %[a], r12\n\t"
  87354. "bne L_sp_384_add_12_word_%=\n\t"
  87355. "mov %[r], r3\n\t"
  87356. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  87357. :
  87358. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  87359. );
  87360. return (uint32_t)(size_t)r;
  87361. }
  87362. #else
  87363. /* Add b to a into r. (r = a + b)
  87364. *
  87365. * r A single precision integer.
  87366. * a A single precision integer.
  87367. * b A single precision integer.
  87368. */
  87369. static sp_digit sp_384_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  87370. {
  87371. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  87372. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  87373. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  87374. __asm__ __volatile__ (
  87375. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  87376. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  87377. "adds r3, r3, r7\n\t"
  87378. "adcs r4, r4, r8\n\t"
  87379. "adcs r5, r5, r9\n\t"
  87380. "adcs r6, r6, r10\n\t"
  87381. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  87382. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  87383. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  87384. "adcs r3, r3, r7\n\t"
  87385. "adcs r4, r4, r8\n\t"
  87386. "adcs r5, r5, r9\n\t"
  87387. "adcs r6, r6, r10\n\t"
  87388. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  87389. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  87390. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  87391. "adcs r3, r3, r7\n\t"
  87392. "adcs r4, r4, r8\n\t"
  87393. "adcs r5, r5, r9\n\t"
  87394. "adcs r6, r6, r10\n\t"
  87395. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  87396. "mov %[r], #0\n\t"
  87397. "adc %[r], %[r], #0\n\t"
  87398. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  87399. :
  87400. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  87401. );
  87402. return (uint32_t)(size_t)r;
  87403. }
  87404. #endif /* WOLFSSL_SP_SMALL */
  87405. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  87406. *
  87407. * r The resulting Montgomery form number.
  87408. * a The number to convert.
  87409. * m The modulus (prime).
  87410. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  87411. */
  87412. static int sp_384_mod_mul_norm_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  87413. {
  87414. #ifdef WOLFSSL_SP_SMALL_STACK
  87415. int64_t* t = NULL;
  87416. #else
  87417. int64_t t[12];
  87418. #endif
  87419. int64_t o;
  87420. int err = MP_OKAY;
  87421. (void)m;
  87422. #ifdef WOLFSSL_SP_SMALL_STACK
  87423. t = (int64_t*)XMALLOC(sizeof(int64_t) * 12, NULL, DYNAMIC_TYPE_ECC);
  87424. if (t == NULL) {
  87425. err = MEMORY_E;
  87426. }
  87427. #endif
  87428. if (err == MP_OKAY) {
  87429. /* 1 0 0 0 0 0 0 0 1 1 0 -1 */
  87430. t[0] = 0 + (int64_t)a[0] + (int64_t)a[8] + (int64_t)a[9] - (int64_t)a[11];
  87431. /* -1 1 0 0 0 0 0 0 -1 0 1 1 */
  87432. t[1] = 0 - (int64_t)a[0] + (int64_t)a[1] - (int64_t)a[8] + (int64_t)a[10] + (int64_t)a[11];
  87433. /* 0 -1 1 0 0 0 0 0 0 -1 0 1 */
  87434. t[2] = 0 - (int64_t)a[1] + (int64_t)a[2] - (int64_t)a[9] + (int64_t)a[11];
  87435. /* 1 0 -1 1 0 0 0 0 1 1 -1 -1 */
  87436. 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];
  87437. /* 1 1 0 -1 1 0 0 0 1 2 1 -2 */
  87438. 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];
  87439. /* 0 1 1 0 -1 1 0 0 0 1 2 1 */
  87440. 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];
  87441. /* 0 0 1 1 0 -1 1 0 0 0 1 2 */
  87442. 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];
  87443. /* 0 0 0 1 1 0 -1 1 0 0 0 1 */
  87444. t[7] = 0 + (int64_t)a[3] + (int64_t)a[4] - (int64_t)a[6] + (int64_t)a[7] + (int64_t)a[11];
  87445. /* 0 0 0 0 1 1 0 -1 1 0 0 0 */
  87446. t[8] = 0 + (int64_t)a[4] + (int64_t)a[5] - (int64_t)a[7] + (int64_t)a[8];
  87447. /* 0 0 0 0 0 1 1 0 -1 1 0 0 */
  87448. t[9] = 0 + (int64_t)a[5] + (int64_t)a[6] - (int64_t)a[8] + (int64_t)a[9];
  87449. /* 0 0 0 0 0 0 1 1 0 -1 1 0 */
  87450. t[10] = 0 + (int64_t)a[6] + (int64_t)a[7] - (int64_t)a[9] + (int64_t)a[10];
  87451. /* 0 0 0 0 0 0 0 1 1 0 -1 1 */
  87452. t[11] = 0 + (int64_t)a[7] + (int64_t)a[8] - (int64_t)a[10] + (int64_t)a[11];
  87453. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  87454. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  87455. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  87456. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  87457. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  87458. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  87459. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  87460. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  87461. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  87462. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  87463. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  87464. o = t[11] >> 32; t[11] &= 0xffffffff;
  87465. t[0] += o;
  87466. t[1] -= o;
  87467. t[3] += o;
  87468. t[4] += o;
  87469. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  87470. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  87471. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  87472. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  87473. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  87474. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  87475. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  87476. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  87477. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  87478. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  87479. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  87480. r[0] = (sp_digit)t[0];
  87481. r[1] = (sp_digit)t[1];
  87482. r[2] = (sp_digit)t[2];
  87483. r[3] = (sp_digit)t[3];
  87484. r[4] = (sp_digit)t[4];
  87485. r[5] = (sp_digit)t[5];
  87486. r[6] = (sp_digit)t[6];
  87487. r[7] = (sp_digit)t[7];
  87488. r[8] = (sp_digit)t[8];
  87489. r[9] = (sp_digit)t[9];
  87490. r[10] = (sp_digit)t[10];
  87491. r[11] = (sp_digit)t[11];
  87492. }
  87493. #ifdef WOLFSSL_SP_SMALL_STACK
  87494. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  87495. #endif
  87496. return err;
  87497. }
  87498. /* Convert an mp_int to an array of sp_digit.
  87499. *
  87500. * r A single precision integer.
  87501. * size Maximum number of bytes to convert
  87502. * a A multi-precision integer.
  87503. */
  87504. static void sp_384_from_mp(sp_digit* r, int size, const mp_int* a)
  87505. {
  87506. #if DIGIT_BIT == 32
  87507. int i;
  87508. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  87509. int o = 0;
  87510. for (i = 0; i < size; i++) {
  87511. sp_digit mask = (sp_digit)0 - (j >> 31);
  87512. r[i] = a->dp[o] & mask;
  87513. j++;
  87514. o += (int)(j >> 31);
  87515. }
  87516. #elif DIGIT_BIT > 32
  87517. unsigned int i;
  87518. int j = 0;
  87519. word32 s = 0;
  87520. r[0] = 0;
  87521. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  87522. r[j] |= ((sp_digit)a->dp[i] << s);
  87523. r[j] &= 0xffffffff;
  87524. s = 32U - s;
  87525. if (j + 1 >= size) {
  87526. break;
  87527. }
  87528. /* lint allow cast of mismatch word32 and mp_digit */
  87529. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  87530. while ((s + 32U) <= (word32)DIGIT_BIT) {
  87531. s += 32U;
  87532. r[j] &= 0xffffffff;
  87533. if (j + 1 >= size) {
  87534. break;
  87535. }
  87536. if (s < (word32)DIGIT_BIT) {
  87537. /* lint allow cast of mismatch word32 and mp_digit */
  87538. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  87539. }
  87540. else {
  87541. r[++j] = (sp_digit)0;
  87542. }
  87543. }
  87544. s = (word32)DIGIT_BIT - s;
  87545. }
  87546. for (j++; j < size; j++) {
  87547. r[j] = 0;
  87548. }
  87549. #else
  87550. unsigned int i;
  87551. int j = 0;
  87552. int s = 0;
  87553. r[0] = 0;
  87554. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  87555. r[j] |= ((sp_digit)a->dp[i]) << s;
  87556. if (s + DIGIT_BIT >= 32) {
  87557. r[j] &= 0xffffffff;
  87558. if (j + 1 >= size) {
  87559. break;
  87560. }
  87561. s = 32 - s;
  87562. if (s == DIGIT_BIT) {
  87563. r[++j] = 0;
  87564. s = 0;
  87565. }
  87566. else {
  87567. r[++j] = a->dp[i] >> s;
  87568. s = DIGIT_BIT - s;
  87569. }
  87570. }
  87571. else {
  87572. s += DIGIT_BIT;
  87573. }
  87574. }
  87575. for (j++; j < size; j++) {
  87576. r[j] = 0;
  87577. }
  87578. #endif
  87579. }
  87580. /* Convert a point of type ecc_point to type sp_point_384.
  87581. *
  87582. * p Point of type sp_point_384 (result).
  87583. * pm Point of type ecc_point.
  87584. */
  87585. static void sp_384_point_from_ecc_point_12(sp_point_384* p,
  87586. const ecc_point* pm)
  87587. {
  87588. XMEMSET(p->x, 0, sizeof(p->x));
  87589. XMEMSET(p->y, 0, sizeof(p->y));
  87590. XMEMSET(p->z, 0, sizeof(p->z));
  87591. sp_384_from_mp(p->x, 12, pm->x);
  87592. sp_384_from_mp(p->y, 12, pm->y);
  87593. sp_384_from_mp(p->z, 12, pm->z);
  87594. p->infinity = 0;
  87595. }
  87596. /* Convert an array of sp_digit to an mp_int.
  87597. *
  87598. * a A single precision integer.
  87599. * r A multi-precision integer.
  87600. */
  87601. static int sp_384_to_mp(const sp_digit* a, mp_int* r)
  87602. {
  87603. int err;
  87604. err = mp_grow(r, (384 + DIGIT_BIT - 1) / DIGIT_BIT);
  87605. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  87606. #if DIGIT_BIT == 32
  87607. XMEMCPY(r->dp, a, sizeof(sp_digit) * 12);
  87608. r->used = 12;
  87609. mp_clamp(r);
  87610. #elif DIGIT_BIT < 32
  87611. int i;
  87612. int j = 0;
  87613. int s = 0;
  87614. r->dp[0] = 0;
  87615. for (i = 0; i < 12; i++) {
  87616. r->dp[j] |= (mp_digit)(a[i] << s);
  87617. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  87618. s = DIGIT_BIT - s;
  87619. r->dp[++j] = (mp_digit)(a[i] >> s);
  87620. while (s + DIGIT_BIT <= 32) {
  87621. s += DIGIT_BIT;
  87622. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  87623. if (s == SP_WORD_SIZE) {
  87624. r->dp[j] = 0;
  87625. }
  87626. else {
  87627. r->dp[j] = (mp_digit)(a[i] >> s);
  87628. }
  87629. }
  87630. s = 32 - s;
  87631. }
  87632. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  87633. mp_clamp(r);
  87634. #else
  87635. int i;
  87636. int j = 0;
  87637. int s = 0;
  87638. r->dp[0] = 0;
  87639. for (i = 0; i < 12; i++) {
  87640. r->dp[j] |= ((mp_digit)a[i]) << s;
  87641. if (s + 32 >= DIGIT_BIT) {
  87642. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  87643. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  87644. #endif
  87645. s = DIGIT_BIT - s;
  87646. r->dp[++j] = a[i] >> s;
  87647. s = 32 - s;
  87648. }
  87649. else {
  87650. s += 32;
  87651. }
  87652. }
  87653. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  87654. mp_clamp(r);
  87655. #endif
  87656. }
  87657. return err;
  87658. }
  87659. /* Convert a point of type sp_point_384 to type ecc_point.
  87660. *
  87661. * p Point of type sp_point_384.
  87662. * pm Point of type ecc_point (result).
  87663. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  87664. * MP_OKAY.
  87665. */
  87666. static int sp_384_point_to_ecc_point_12(const sp_point_384* p, ecc_point* pm)
  87667. {
  87668. int err;
  87669. err = sp_384_to_mp(p->x, pm->x);
  87670. if (err == MP_OKAY) {
  87671. err = sp_384_to_mp(p->y, pm->y);
  87672. }
  87673. if (err == MP_OKAY) {
  87674. err = sp_384_to_mp(p->z, pm->z);
  87675. }
  87676. return err;
  87677. }
  87678. #ifdef WOLFSSL_SP_SMALL
  87679. /* Conditionally subtract b from a using the mask m.
  87680. * m is -1 to subtract and 0 when not copying.
  87681. *
  87682. * r A single precision number representing condition subtract result.
  87683. * a A single precision number to subtract from.
  87684. * b A single precision number to subtract.
  87685. * m Mask value to apply.
  87686. */
  87687. 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)
  87688. {
  87689. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  87690. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  87691. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  87692. register sp_digit m asm ("r3") = (sp_digit)m_p;
  87693. __asm__ __volatile__ (
  87694. "mov r6, #0\n\t"
  87695. "mov r12, #0\n\t"
  87696. "mov lr, #0\n\t"
  87697. "\n"
  87698. "L_sp_384_cond_sub_12_words_%=: \n\t"
  87699. "subs r12, r6, r12\n\t"
  87700. "ldr r4, [%[a], lr]\n\t"
  87701. "ldr r5, [%[b], lr]\n\t"
  87702. "and r5, r5, %[m]\n\t"
  87703. "sbcs r4, r4, r5\n\t"
  87704. "sbc r12, r6, r6\n\t"
  87705. "str r4, [%[r], lr]\n\t"
  87706. "add lr, lr, #4\n\t"
  87707. "cmp lr, #48\n\t"
  87708. "blt L_sp_384_cond_sub_12_words_%=\n\t"
  87709. "mov %[r], r12\n\t"
  87710. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  87711. :
  87712. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  87713. );
  87714. return (uint32_t)(size_t)r;
  87715. }
  87716. #else
  87717. /* Conditionally subtract b from a using the mask m.
  87718. * m is -1 to subtract and 0 when not copying.
  87719. *
  87720. * r A single precision number representing condition subtract result.
  87721. * a A single precision number to subtract from.
  87722. * b A single precision number to subtract.
  87723. * m Mask value to apply.
  87724. */
  87725. 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)
  87726. {
  87727. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  87728. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  87729. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  87730. register sp_digit m asm ("r3") = (sp_digit)m_p;
  87731. __asm__ __volatile__ (
  87732. "mov lr, #0\n\t"
  87733. "ldm %[a]!, {r4, r5}\n\t"
  87734. "ldm %[b]!, {r6, r7}\n\t"
  87735. "and r6, r6, %[m]\n\t"
  87736. "and r7, r7, %[m]\n\t"
  87737. "subs r4, r4, r6\n\t"
  87738. "sbcs r5, r5, r7\n\t"
  87739. "stm %[r]!, {r4, r5}\n\t"
  87740. "ldm %[a]!, {r4, r5}\n\t"
  87741. "ldm %[b]!, {r6, r7}\n\t"
  87742. "and r6, r6, %[m]\n\t"
  87743. "and r7, r7, %[m]\n\t"
  87744. "sbcs r4, r4, r6\n\t"
  87745. "sbcs r5, r5, r7\n\t"
  87746. "stm %[r]!, {r4, r5}\n\t"
  87747. "ldm %[a]!, {r4, r5}\n\t"
  87748. "ldm %[b]!, {r6, r7}\n\t"
  87749. "and r6, r6, %[m]\n\t"
  87750. "and r7, r7, %[m]\n\t"
  87751. "sbcs r4, r4, r6\n\t"
  87752. "sbcs r5, r5, r7\n\t"
  87753. "stm %[r]!, {r4, r5}\n\t"
  87754. "ldm %[a]!, {r4, r5}\n\t"
  87755. "ldm %[b]!, {r6, r7}\n\t"
  87756. "and r6, r6, %[m]\n\t"
  87757. "and r7, r7, %[m]\n\t"
  87758. "sbcs r4, r4, r6\n\t"
  87759. "sbcs r5, r5, r7\n\t"
  87760. "stm %[r]!, {r4, r5}\n\t"
  87761. "ldm %[a]!, {r4, r5}\n\t"
  87762. "ldm %[b]!, {r6, r7}\n\t"
  87763. "and r6, r6, %[m]\n\t"
  87764. "and r7, r7, %[m]\n\t"
  87765. "sbcs r4, r4, r6\n\t"
  87766. "sbcs r5, r5, r7\n\t"
  87767. "stm %[r]!, {r4, r5}\n\t"
  87768. "ldm %[a]!, {r4, r5}\n\t"
  87769. "ldm %[b]!, {r6, r7}\n\t"
  87770. "and r6, r6, %[m]\n\t"
  87771. "and r7, r7, %[m]\n\t"
  87772. "sbcs r4, r4, r6\n\t"
  87773. "sbcs r5, r5, r7\n\t"
  87774. "stm %[r]!, {r4, r5}\n\t"
  87775. "sbc %[r], lr, lr\n\t"
  87776. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  87777. :
  87778. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  87779. );
  87780. return (uint32_t)(size_t)r;
  87781. }
  87782. #endif /* WOLFSSL_SP_SMALL */
  87783. #define sp_384_mont_reduce_order_12 sp_384_mont_reduce_12
  87784. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87785. /* Reduce the number back to 384 bits using Montgomery reduction.
  87786. *
  87787. * a A single precision number to reduce in place.
  87788. * m The single precision number representing the modulus.
  87789. * mp The digit representing the negative inverse of m mod 2^n.
  87790. */
  87791. static SP_NOINLINE void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  87792. {
  87793. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  87794. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  87795. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  87796. __asm__ __volatile__ (
  87797. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  87798. "ldr r11, [%[m]]\n\t"
  87799. #endif
  87800. /* i = 0 */
  87801. "mov r9, #0\n\t"
  87802. "mov r3, #0\n\t"
  87803. "ldr r12, [%[a]]\n\t"
  87804. "ldr lr, [%[a], #4]\n\t"
  87805. "\n"
  87806. "L_sp_384_mont_reduce_12_word_%=: \n\t"
  87807. /* mu = a[i] * mp */
  87808. "mul r8, %[mp], r12\n\t"
  87809. /* a[i+0] += m[0] * mu */
  87810. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  87811. "ldr r11, [%[m]]\n\t"
  87812. #endif
  87813. "lsr r7, r11, #16\n\t"
  87814. "lsr r6, r8, #16\n\t"
  87815. "mul r5, r6, r7\n\t"
  87816. "lsl r7, r11, #16\n\t"
  87817. "lsr r7, r7, #16\n\t"
  87818. "mul r6, r7, r6\n\t"
  87819. "lsr r7, r6, #16\n\t"
  87820. "lsl r6, r6, #16\n\t"
  87821. "adds r12, r12, r6\n\t"
  87822. "adc r5, r5, r7\n\t"
  87823. "lsl r6, r8, #16\n\t"
  87824. "lsl r7, r11, #16\n\t"
  87825. "lsr r6, r6, #16\n\t"
  87826. "lsr r7, r7, #16\n\t"
  87827. "mul r7, r6, r7\n\t"
  87828. "adds r12, r12, r7\n\t"
  87829. "adc r5, r5, #0\n\t"
  87830. "lsr r7, r11, #16\n\t"
  87831. "mul r6, r7, r6\n\t"
  87832. "lsr r7, r6, #16\n\t"
  87833. "lsl r6, r6, #16\n\t"
  87834. "adds r12, r12, r6\n\t"
  87835. "adc r5, r5, r7\n\t"
  87836. /* a[i+1] += m[1] * mu */
  87837. "ldr r7, [%[m], #4]\n\t"
  87838. "lsr r10, r7, #16\n\t"
  87839. "lsr r6, r8, #16\n\t"
  87840. "mul r4, r6, r10\n\t"
  87841. "lsl r10, r7, #16\n\t"
  87842. "lsr r10, r10, #16\n\t"
  87843. "mul r6, r10, r6\n\t"
  87844. "lsr r10, r6, #16\n\t"
  87845. "lsl r6, r6, #16\n\t"
  87846. "adds lr, lr, r6\n\t"
  87847. "adc r4, r4, r10\n\t"
  87848. "lsl r6, r8, #16\n\t"
  87849. "lsl r10, r7, #16\n\t"
  87850. "lsr r6, r6, #16\n\t"
  87851. "lsr r10, r10, #16\n\t"
  87852. "mul r10, r6, r10\n\t"
  87853. "adds lr, lr, r10\n\t"
  87854. "adc r4, r4, #0\n\t"
  87855. "lsr r10, r7, #16\n\t"
  87856. "mul r6, r10, r6\n\t"
  87857. "lsr r10, r6, #16\n\t"
  87858. "lsl r6, r6, #16\n\t"
  87859. "adds lr, lr, r6\n\t"
  87860. "adc r4, r4, r10\n\t"
  87861. "mov r12, lr\n\t"
  87862. "adds r12, r12, r5\n\t"
  87863. "adc r4, r4, #0\n\t"
  87864. /* a[i+2] += m[2] * mu */
  87865. "ldr r7, [%[m], #8]\n\t"
  87866. "ldr lr, [%[a], #8]\n\t"
  87867. "lsr r10, r7, #16\n\t"
  87868. "lsr r6, r8, #16\n\t"
  87869. "mul r5, r6, r10\n\t"
  87870. "lsl r10, r7, #16\n\t"
  87871. "lsr r10, r10, #16\n\t"
  87872. "mul r6, r10, r6\n\t"
  87873. "lsr r10, r6, #16\n\t"
  87874. "lsl r6, r6, #16\n\t"
  87875. "adds lr, lr, r6\n\t"
  87876. "adc r5, r5, r10\n\t"
  87877. "lsl r6, r8, #16\n\t"
  87878. "lsl r10, r7, #16\n\t"
  87879. "lsr r6, r6, #16\n\t"
  87880. "lsr r10, r10, #16\n\t"
  87881. "mul r10, r6, r10\n\t"
  87882. "adds lr, lr, r10\n\t"
  87883. "adc r5, r5, #0\n\t"
  87884. "lsr r10, r7, #16\n\t"
  87885. "mul r6, r10, r6\n\t"
  87886. "lsr r10, r6, #16\n\t"
  87887. "lsl r6, r6, #16\n\t"
  87888. "adds lr, lr, r6\n\t"
  87889. "adc r5, r5, r10\n\t"
  87890. "adds lr, lr, r4\n\t"
  87891. "adc r5, r5, #0\n\t"
  87892. /* a[i+3] += m[3] * mu */
  87893. "ldr r7, [%[m], #12]\n\t"
  87894. "ldr r10, [%[a], #12]\n\t"
  87895. "lsr r11, r7, #16\n\t"
  87896. "lsr r6, r8, #16\n\t"
  87897. "mul r4, r6, r11\n\t"
  87898. "lsl r11, r7, #16\n\t"
  87899. "lsr r11, r11, #16\n\t"
  87900. "mul r6, r11, r6\n\t"
  87901. "lsr r11, r6, #16\n\t"
  87902. "lsl r6, r6, #16\n\t"
  87903. "adds r10, r10, r6\n\t"
  87904. "adc r4, r4, r11\n\t"
  87905. "lsl r6, r8, #16\n\t"
  87906. "lsl r11, r7, #16\n\t"
  87907. "lsr r6, r6, #16\n\t"
  87908. "lsr r11, r11, #16\n\t"
  87909. "mul r11, r6, r11\n\t"
  87910. "adds r10, r10, r11\n\t"
  87911. "adc r4, r4, #0\n\t"
  87912. "lsr r11, r7, #16\n\t"
  87913. "mul r6, r11, r6\n\t"
  87914. "lsr r11, r6, #16\n\t"
  87915. "lsl r6, r6, #16\n\t"
  87916. "adds r10, r10, r6\n\t"
  87917. "adc r4, r4, r11\n\t"
  87918. "adds r10, r10, r5\n\t"
  87919. "str r10, [%[a], #12]\n\t"
  87920. "adc r4, r4, #0\n\t"
  87921. /* a[i+4] += m[4] * mu */
  87922. "ldr r7, [%[m], #16]\n\t"
  87923. "ldr r10, [%[a], #16]\n\t"
  87924. "lsr r11, r7, #16\n\t"
  87925. "lsr r6, r8, #16\n\t"
  87926. "mul r5, r6, r11\n\t"
  87927. "lsl r11, r7, #16\n\t"
  87928. "lsr r11, r11, #16\n\t"
  87929. "mul r6, r11, r6\n\t"
  87930. "lsr r11, r6, #16\n\t"
  87931. "lsl r6, r6, #16\n\t"
  87932. "adds r10, r10, r6\n\t"
  87933. "adc r5, r5, r11\n\t"
  87934. "lsl r6, r8, #16\n\t"
  87935. "lsl r11, r7, #16\n\t"
  87936. "lsr r6, r6, #16\n\t"
  87937. "lsr r11, r11, #16\n\t"
  87938. "mul r11, r6, r11\n\t"
  87939. "adds r10, r10, r11\n\t"
  87940. "adc r5, r5, #0\n\t"
  87941. "lsr r11, r7, #16\n\t"
  87942. "mul r6, r11, r6\n\t"
  87943. "lsr r11, r6, #16\n\t"
  87944. "lsl r6, r6, #16\n\t"
  87945. "adds r10, r10, r6\n\t"
  87946. "adc r5, r5, r11\n\t"
  87947. "adds r10, r10, r4\n\t"
  87948. "str r10, [%[a], #16]\n\t"
  87949. "adc r5, r5, #0\n\t"
  87950. /* a[i+5] += m[5] * mu */
  87951. "ldr r7, [%[m], #20]\n\t"
  87952. "ldr r10, [%[a], #20]\n\t"
  87953. "lsr r11, r7, #16\n\t"
  87954. "lsr r6, r8, #16\n\t"
  87955. "mul r4, r6, r11\n\t"
  87956. "lsl r11, r7, #16\n\t"
  87957. "lsr r11, r11, #16\n\t"
  87958. "mul r6, r11, r6\n\t"
  87959. "lsr r11, r6, #16\n\t"
  87960. "lsl r6, r6, #16\n\t"
  87961. "adds r10, r10, r6\n\t"
  87962. "adc r4, r4, r11\n\t"
  87963. "lsl r6, r8, #16\n\t"
  87964. "lsl r11, r7, #16\n\t"
  87965. "lsr r6, r6, #16\n\t"
  87966. "lsr r11, r11, #16\n\t"
  87967. "mul r11, r6, r11\n\t"
  87968. "adds r10, r10, r11\n\t"
  87969. "adc r4, r4, #0\n\t"
  87970. "lsr r11, r7, #16\n\t"
  87971. "mul r6, r11, r6\n\t"
  87972. "lsr r11, r6, #16\n\t"
  87973. "lsl r6, r6, #16\n\t"
  87974. "adds r10, r10, r6\n\t"
  87975. "adc r4, r4, r11\n\t"
  87976. "adds r10, r10, r5\n\t"
  87977. "str r10, [%[a], #20]\n\t"
  87978. "adc r4, r4, #0\n\t"
  87979. /* a[i+6] += m[6] * mu */
  87980. "ldr r7, [%[m], #24]\n\t"
  87981. "ldr r10, [%[a], #24]\n\t"
  87982. "lsr r11, r7, #16\n\t"
  87983. "lsr r6, r8, #16\n\t"
  87984. "mul r5, r6, r11\n\t"
  87985. "lsl r11, r7, #16\n\t"
  87986. "lsr r11, r11, #16\n\t"
  87987. "mul r6, r11, r6\n\t"
  87988. "lsr r11, r6, #16\n\t"
  87989. "lsl r6, r6, #16\n\t"
  87990. "adds r10, r10, r6\n\t"
  87991. "adc r5, r5, r11\n\t"
  87992. "lsl r6, r8, #16\n\t"
  87993. "lsl r11, r7, #16\n\t"
  87994. "lsr r6, r6, #16\n\t"
  87995. "lsr r11, r11, #16\n\t"
  87996. "mul r11, r6, r11\n\t"
  87997. "adds r10, r10, r11\n\t"
  87998. "adc r5, r5, #0\n\t"
  87999. "lsr r11, r7, #16\n\t"
  88000. "mul r6, r11, r6\n\t"
  88001. "lsr r11, r6, #16\n\t"
  88002. "lsl r6, r6, #16\n\t"
  88003. "adds r10, r10, r6\n\t"
  88004. "adc r5, r5, r11\n\t"
  88005. "adds r10, r10, r4\n\t"
  88006. "str r10, [%[a], #24]\n\t"
  88007. "adc r5, r5, #0\n\t"
  88008. /* a[i+7] += m[7] * mu */
  88009. "ldr r7, [%[m], #28]\n\t"
  88010. "ldr r10, [%[a], #28]\n\t"
  88011. "lsr r11, r7, #16\n\t"
  88012. "lsr r6, r8, #16\n\t"
  88013. "mul r4, r6, r11\n\t"
  88014. "lsl r11, r7, #16\n\t"
  88015. "lsr r11, r11, #16\n\t"
  88016. "mul r6, r11, r6\n\t"
  88017. "lsr r11, r6, #16\n\t"
  88018. "lsl r6, r6, #16\n\t"
  88019. "adds r10, r10, r6\n\t"
  88020. "adc r4, r4, r11\n\t"
  88021. "lsl r6, r8, #16\n\t"
  88022. "lsl r11, r7, #16\n\t"
  88023. "lsr r6, r6, #16\n\t"
  88024. "lsr r11, r11, #16\n\t"
  88025. "mul r11, r6, r11\n\t"
  88026. "adds r10, r10, r11\n\t"
  88027. "adc r4, r4, #0\n\t"
  88028. "lsr r11, r7, #16\n\t"
  88029. "mul r6, r11, r6\n\t"
  88030. "lsr r11, r6, #16\n\t"
  88031. "lsl r6, r6, #16\n\t"
  88032. "adds r10, r10, r6\n\t"
  88033. "adc r4, r4, r11\n\t"
  88034. "adds r10, r10, r5\n\t"
  88035. "str r10, [%[a], #28]\n\t"
  88036. "adc r4, r4, #0\n\t"
  88037. /* a[i+8] += m[8] * mu */
  88038. "ldr r7, [%[m], #32]\n\t"
  88039. "ldr r10, [%[a], #32]\n\t"
  88040. "lsr r11, r7, #16\n\t"
  88041. "lsr r6, r8, #16\n\t"
  88042. "mul r5, r6, r11\n\t"
  88043. "lsl r11, r7, #16\n\t"
  88044. "lsr r11, r11, #16\n\t"
  88045. "mul r6, r11, r6\n\t"
  88046. "lsr r11, r6, #16\n\t"
  88047. "lsl r6, r6, #16\n\t"
  88048. "adds r10, r10, r6\n\t"
  88049. "adc r5, r5, r11\n\t"
  88050. "lsl r6, r8, #16\n\t"
  88051. "lsl r11, r7, #16\n\t"
  88052. "lsr r6, r6, #16\n\t"
  88053. "lsr r11, r11, #16\n\t"
  88054. "mul r11, r6, r11\n\t"
  88055. "adds r10, r10, r11\n\t"
  88056. "adc r5, r5, #0\n\t"
  88057. "lsr r11, r7, #16\n\t"
  88058. "mul r6, r11, r6\n\t"
  88059. "lsr r11, r6, #16\n\t"
  88060. "lsl r6, r6, #16\n\t"
  88061. "adds r10, r10, r6\n\t"
  88062. "adc r5, r5, r11\n\t"
  88063. "adds r10, r10, r4\n\t"
  88064. "str r10, [%[a], #32]\n\t"
  88065. "adc r5, r5, #0\n\t"
  88066. /* a[i+9] += m[9] * mu */
  88067. "ldr r7, [%[m], #36]\n\t"
  88068. "ldr r10, [%[a], #36]\n\t"
  88069. "lsr r11, r7, #16\n\t"
  88070. "lsr r6, r8, #16\n\t"
  88071. "mul r4, r6, r11\n\t"
  88072. "lsl r11, r7, #16\n\t"
  88073. "lsr r11, r11, #16\n\t"
  88074. "mul r6, r11, r6\n\t"
  88075. "lsr r11, r6, #16\n\t"
  88076. "lsl r6, r6, #16\n\t"
  88077. "adds r10, r10, r6\n\t"
  88078. "adc r4, r4, r11\n\t"
  88079. "lsl r6, r8, #16\n\t"
  88080. "lsl r11, r7, #16\n\t"
  88081. "lsr r6, r6, #16\n\t"
  88082. "lsr r11, r11, #16\n\t"
  88083. "mul r11, r6, r11\n\t"
  88084. "adds r10, r10, r11\n\t"
  88085. "adc r4, r4, #0\n\t"
  88086. "lsr r11, r7, #16\n\t"
  88087. "mul r6, r11, r6\n\t"
  88088. "lsr r11, r6, #16\n\t"
  88089. "lsl r6, r6, #16\n\t"
  88090. "adds r10, r10, r6\n\t"
  88091. "adc r4, r4, r11\n\t"
  88092. "adds r10, r10, r5\n\t"
  88093. "str r10, [%[a], #36]\n\t"
  88094. "adc r4, r4, #0\n\t"
  88095. /* a[i+10] += m[10] * mu */
  88096. "ldr r7, [%[m], #40]\n\t"
  88097. "ldr r10, [%[a], #40]\n\t"
  88098. "lsr r11, r7, #16\n\t"
  88099. "lsr r6, r8, #16\n\t"
  88100. "mul r5, r6, r11\n\t"
  88101. "lsl r11, r7, #16\n\t"
  88102. "lsr r11, r11, #16\n\t"
  88103. "mul r6, r11, r6\n\t"
  88104. "lsr r11, r6, #16\n\t"
  88105. "lsl r6, r6, #16\n\t"
  88106. "adds r10, r10, r6\n\t"
  88107. "adc r5, r5, r11\n\t"
  88108. "lsl r6, r8, #16\n\t"
  88109. "lsl r11, r7, #16\n\t"
  88110. "lsr r6, r6, #16\n\t"
  88111. "lsr r11, r11, #16\n\t"
  88112. "mul r11, r6, r11\n\t"
  88113. "adds r10, r10, r11\n\t"
  88114. "adc r5, r5, #0\n\t"
  88115. "lsr r11, r7, #16\n\t"
  88116. "mul r6, r11, r6\n\t"
  88117. "lsr r11, r6, #16\n\t"
  88118. "lsl r6, r6, #16\n\t"
  88119. "adds r10, r10, r6\n\t"
  88120. "adc r5, r5, r11\n\t"
  88121. "adds r10, r10, r4\n\t"
  88122. "str r10, [%[a], #40]\n\t"
  88123. "adc r5, r5, #0\n\t"
  88124. /* a[i+11] += m[11] * mu */
  88125. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  88126. "ldr r11, [%[m], #44]\n\t"
  88127. #else
  88128. "ldr r7, [%[m], #44]\n\t"
  88129. #endif
  88130. "ldr r10, [%[a], #44]\n\t"
  88131. "lsl r6, r8, #16\n\t"
  88132. "lsl r7, r11, #16\n\t"
  88133. "lsr r6, r6, #16\n\t"
  88134. "lsr r7, r7, #16\n\t"
  88135. "mul r7, r6, r7\n\t"
  88136. "adds r5, r5, r7\n\t"
  88137. "adcs r4, r3, #0\n\t"
  88138. "mov r3, #0\n\t"
  88139. "adc r3, r3, r3\n\t"
  88140. "lsr r7, r11, #16\n\t"
  88141. "mul r6, r7, r6\n\t"
  88142. "lsr r7, r6, #16\n\t"
  88143. "lsl r6, r6, #16\n\t"
  88144. "adds r5, r5, r6\n\t"
  88145. "adcs r4, r4, r7\n\t"
  88146. "adc r3, r3, #0\n\t"
  88147. "mov r6, r8\n\t"
  88148. "lsr r7, r11, #16\n\t"
  88149. "lsr r6, r6, #16\n\t"
  88150. "mul r7, r6, r7\n\t"
  88151. "adds r4, r4, r7\n\t"
  88152. "lsl r7, r11, #16\n\t"
  88153. "adc r3, r3, #0\n\t"
  88154. "lsr r7, r7, #16\n\t"
  88155. "mul r6, r7, r6\n\t"
  88156. "lsr r7, r6, #16\n\t"
  88157. "lsl r6, r6, #16\n\t"
  88158. "adds r5, r5, r6\n\t"
  88159. "adcs r4, r4, r7\n\t"
  88160. "adc r3, r3, #0\n\t"
  88161. "adds r10, r10, r5\n\t"
  88162. "str r10, [%[a], #44]\n\t"
  88163. "ldr r10, [%[a], #48]\n\t"
  88164. "adcs r10, r10, r4\n\t"
  88165. "str r10, [%[a], #48]\n\t"
  88166. "adc r3, r3, #0\n\t"
  88167. /* i += 1 */
  88168. "add r9, r9, #4\n\t"
  88169. "add %[a], %[a], #4\n\t"
  88170. "cmp r9, #48\n\t"
  88171. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  88172. /* Loop Done */
  88173. "str r12, [%[a]]\n\t"
  88174. "str lr, [%[a], #4]\n\t"
  88175. "mov %[mp], r3\n\t"
  88176. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  88177. :
  88178. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  88179. );
  88180. sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp);
  88181. }
  88182. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  88183. /* Reduce the number back to 384 bits using Montgomery reduction.
  88184. *
  88185. * a A single precision number to reduce in place.
  88186. * m The single precision number representing the modulus.
  88187. * mp The digit representing the negative inverse of m mod 2^n.
  88188. */
  88189. static SP_NOINLINE void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  88190. {
  88191. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  88192. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  88193. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  88194. __asm__ __volatile__ (
  88195. "ldr r11, [%[m]]\n\t"
  88196. /* i = 0 */
  88197. "mov r9, #0\n\t"
  88198. "mov r3, #0\n\t"
  88199. "ldr r12, [%[a]]\n\t"
  88200. "ldr lr, [%[a], #4]\n\t"
  88201. "\n"
  88202. "L_sp_384_mont_reduce_12_word_%=: \n\t"
  88203. /* mu = a[i] * mp */
  88204. "mul r8, %[mp], r12\n\t"
  88205. /* a[i+0] += m[0] * mu */
  88206. "mov r5, #0\n\t"
  88207. "umlal r12, r5, r8, r11\n\t"
  88208. /* a[i+1] += m[1] * mu */
  88209. "ldr r7, [%[m], #4]\n\t"
  88210. "mov r4, #0\n\t"
  88211. "umlal lr, r4, r8, r7\n\t"
  88212. "mov r12, lr\n\t"
  88213. "adds r12, r12, r5\n\t"
  88214. "adc r4, r4, #0\n\t"
  88215. /* a[i+2] += m[2] * mu */
  88216. "ldr r7, [%[m], #8]\n\t"
  88217. "ldr lr, [%[a], #8]\n\t"
  88218. "mov r5, #0\n\t"
  88219. "umlal lr, r5, r8, r7\n\t"
  88220. "adds lr, lr, r4\n\t"
  88221. "adc r5, r5, #0\n\t"
  88222. /* a[i+3] += m[3] * mu */
  88223. "ldr r7, [%[m], #12]\n\t"
  88224. "ldr r10, [%[a], #12]\n\t"
  88225. "mov r4, #0\n\t"
  88226. "umlal r10, r4, r8, r7\n\t"
  88227. "adds r10, r10, r5\n\t"
  88228. "str r10, [%[a], #12]\n\t"
  88229. "adc r4, r4, #0\n\t"
  88230. /* a[i+4] += m[4] * mu */
  88231. "ldr r7, [%[m], #16]\n\t"
  88232. "ldr r10, [%[a], #16]\n\t"
  88233. "mov r5, #0\n\t"
  88234. "umlal r10, r5, r8, r7\n\t"
  88235. "adds r10, r10, r4\n\t"
  88236. "str r10, [%[a], #16]\n\t"
  88237. "adc r5, r5, #0\n\t"
  88238. /* a[i+5] += m[5] * mu */
  88239. "ldr r7, [%[m], #20]\n\t"
  88240. "ldr r10, [%[a], #20]\n\t"
  88241. "mov r4, #0\n\t"
  88242. "umlal r10, r4, r8, r7\n\t"
  88243. "adds r10, r10, r5\n\t"
  88244. "str r10, [%[a], #20]\n\t"
  88245. "adc r4, r4, #0\n\t"
  88246. /* a[i+6] += m[6] * mu */
  88247. "ldr r7, [%[m], #24]\n\t"
  88248. "ldr r10, [%[a], #24]\n\t"
  88249. "mov r5, #0\n\t"
  88250. "umlal r10, r5, r8, r7\n\t"
  88251. "adds r10, r10, r4\n\t"
  88252. "str r10, [%[a], #24]\n\t"
  88253. "adc r5, r5, #0\n\t"
  88254. /* a[i+7] += m[7] * mu */
  88255. "ldr r7, [%[m], #28]\n\t"
  88256. "ldr r10, [%[a], #28]\n\t"
  88257. "mov r4, #0\n\t"
  88258. "umlal r10, r4, r8, r7\n\t"
  88259. "adds r10, r10, r5\n\t"
  88260. "str r10, [%[a], #28]\n\t"
  88261. "adc r4, r4, #0\n\t"
  88262. /* a[i+8] += m[8] * mu */
  88263. "ldr r7, [%[m], #32]\n\t"
  88264. "ldr r10, [%[a], #32]\n\t"
  88265. "mov r5, #0\n\t"
  88266. "umlal r10, r5, r8, r7\n\t"
  88267. "adds r10, r10, r4\n\t"
  88268. "str r10, [%[a], #32]\n\t"
  88269. "adc r5, r5, #0\n\t"
  88270. /* a[i+9] += m[9] * mu */
  88271. "ldr r7, [%[m], #36]\n\t"
  88272. "ldr r10, [%[a], #36]\n\t"
  88273. "mov r4, #0\n\t"
  88274. "umlal r10, r4, r8, r7\n\t"
  88275. "adds r10, r10, r5\n\t"
  88276. "str r10, [%[a], #36]\n\t"
  88277. "adc r4, r4, #0\n\t"
  88278. /* a[i+10] += m[10] * mu */
  88279. "ldr r7, [%[m], #40]\n\t"
  88280. "ldr r10, [%[a], #40]\n\t"
  88281. "mov r5, #0\n\t"
  88282. "umlal r10, r5, r8, r7\n\t"
  88283. "adds r10, r10, r4\n\t"
  88284. "str r10, [%[a], #40]\n\t"
  88285. "adc r5, r5, #0\n\t"
  88286. /* a[i+11] += m[11] * mu */
  88287. "ldr r7, [%[m], #44]\n\t"
  88288. "ldr r10, [%[a], #44]\n\t"
  88289. "umull r6, r7, r8, r7\n\t"
  88290. "adds r5, r5, r6\n\t"
  88291. "adcs r4, r7, r3\n\t"
  88292. "mov r3, #0\n\t"
  88293. "adc r3, r3, r3\n\t"
  88294. "adds r10, r10, r5\n\t"
  88295. "str r10, [%[a], #44]\n\t"
  88296. "ldr r10, [%[a], #48]\n\t"
  88297. "adcs r10, r10, r4\n\t"
  88298. "str r10, [%[a], #48]\n\t"
  88299. "adc r3, r3, #0\n\t"
  88300. /* i += 1 */
  88301. "add r9, r9, #4\n\t"
  88302. "add %[a], %[a], #4\n\t"
  88303. "cmp r9, #48\n\t"
  88304. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  88305. /* Loop Done */
  88306. "str r12, [%[a]]\n\t"
  88307. "str lr, [%[a], #4]\n\t"
  88308. "mov %[mp], r3\n\t"
  88309. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  88310. :
  88311. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  88312. );
  88313. sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp);
  88314. }
  88315. #else
  88316. /* Reduce the number back to 384 bits using Montgomery reduction.
  88317. *
  88318. * a A single precision number to reduce in place.
  88319. * m The single precision number representing the modulus.
  88320. * mp The digit representing the negative inverse of m mod 2^n.
  88321. */
  88322. static SP_NOINLINE void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  88323. {
  88324. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  88325. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  88326. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  88327. __asm__ __volatile__ (
  88328. /* i = 0 */
  88329. "mov r12, #0\n\t"
  88330. "mov lr, #0\n\t"
  88331. "ldr r4, [%[a]]\n\t"
  88332. "ldr r5, [%[a], #4]\n\t"
  88333. "ldr r6, [%[a], #8]\n\t"
  88334. "ldr r7, [%[a], #12]\n\t"
  88335. "ldr r8, [%[a], #16]\n\t"
  88336. "\n"
  88337. "L_sp_384_mont_reduce_12_word_%=: \n\t"
  88338. /* mu = a[i] * mp */
  88339. "mul r11, %[mp], r4\n\t"
  88340. /* a[i+0] += m[0] * mu */
  88341. "ldr r10, [%[m]]\n\t"
  88342. "mov r3, #0\n\t"
  88343. "umaal r4, r3, r11, r10\n\t"
  88344. /* a[i+1] += m[1] * mu */
  88345. "ldr r10, [%[m], #4]\n\t"
  88346. "mov r4, r5\n\t"
  88347. "umaal r4, r3, r11, r10\n\t"
  88348. /* a[i+2] += m[2] * mu */
  88349. "ldr r10, [%[m], #8]\n\t"
  88350. "mov r5, r6\n\t"
  88351. "umaal r5, r3, r11, r10\n\t"
  88352. /* a[i+3] += m[3] * mu */
  88353. "ldr r10, [%[m], #12]\n\t"
  88354. "mov r6, r7\n\t"
  88355. "umaal r6, r3, r11, r10\n\t"
  88356. /* a[i+4] += m[4] * mu */
  88357. "ldr r10, [%[m], #16]\n\t"
  88358. "mov r7, r8\n\t"
  88359. "umaal r7, r3, r11, r10\n\t"
  88360. /* a[i+5] += m[5] * mu */
  88361. "ldr r10, [%[m], #20]\n\t"
  88362. "ldr r8, [%[a], #20]\n\t"
  88363. "umaal r8, r3, r11, r10\n\t"
  88364. /* a[i+6] += m[6] * mu */
  88365. "ldr r10, [%[m], #24]\n\t"
  88366. "ldr r9, [%[a], #24]\n\t"
  88367. "umaal r9, r3, r11, r10\n\t"
  88368. "str r9, [%[a], #24]\n\t"
  88369. /* a[i+7] += m[7] * mu */
  88370. "ldr r10, [%[m], #28]\n\t"
  88371. "ldr r9, [%[a], #28]\n\t"
  88372. "umaal r9, r3, r11, r10\n\t"
  88373. "str r9, [%[a], #28]\n\t"
  88374. /* a[i+8] += m[8] * mu */
  88375. "ldr r10, [%[m], #32]\n\t"
  88376. "ldr r9, [%[a], #32]\n\t"
  88377. "umaal r9, r3, r11, r10\n\t"
  88378. "str r9, [%[a], #32]\n\t"
  88379. /* a[i+9] += m[9] * mu */
  88380. "ldr r10, [%[m], #36]\n\t"
  88381. "ldr r9, [%[a], #36]\n\t"
  88382. "umaal r9, r3, r11, r10\n\t"
  88383. "str r9, [%[a], #36]\n\t"
  88384. /* a[i+10] += m[10] * mu */
  88385. "ldr r10, [%[m], #40]\n\t"
  88386. "ldr r9, [%[a], #40]\n\t"
  88387. "umaal r9, r3, r11, r10\n\t"
  88388. "str r9, [%[a], #40]\n\t"
  88389. /* a[i+11] += m[11] * mu */
  88390. "ldr r10, [%[m], #44]\n\t"
  88391. "ldr r9, [%[a], #44]\n\t"
  88392. "umaal r9, r3, r11, r10\n\t"
  88393. "ldr r11, [%[a], #48]\n\t"
  88394. "mov r10, #0\n\t"
  88395. "umaal r3, r11, r10, r10\n\t"
  88396. "str r9, [%[a], #44]\n\t"
  88397. "adds r3, r3, lr\n\t"
  88398. "adc lr, r11, #0\n\t"
  88399. "str r3, [%[a], #48]\n\t"
  88400. /* i += 1 */
  88401. "add r12, r12, #4\n\t"
  88402. "add %[a], %[a], #4\n\t"
  88403. "cmp r12, #48\n\t"
  88404. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  88405. /* Loop Done */
  88406. "str r4, [%[a]]\n\t"
  88407. "str r5, [%[a], #4]\n\t"
  88408. "str r6, [%[a], #8]\n\t"
  88409. "str r7, [%[a], #12]\n\t"
  88410. "str r8, [%[a], #16]\n\t"
  88411. "mov %[mp], lr\n\t"
  88412. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  88413. :
  88414. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  88415. );
  88416. sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp);
  88417. }
  88418. #endif
  88419. /* Multiply two Montgomery form numbers mod the modulus (prime).
  88420. * (r = a * b mod m)
  88421. *
  88422. * r Result of multiplication.
  88423. * a First number to multiply in Montgomery form.
  88424. * b Second number to multiply in Montgomery form.
  88425. * m Modulus (prime).
  88426. * mp Montgomery multiplier.
  88427. */
  88428. SP_NOINLINE static void sp_384_mont_mul_12(sp_digit* r, const sp_digit* a,
  88429. const sp_digit* b, const sp_digit* m, sp_digit mp)
  88430. {
  88431. sp_384_mul_12(r, a, b);
  88432. sp_384_mont_reduce_12(r, m, mp);
  88433. }
  88434. /* Square the Montgomery form number. (r = a * a mod m)
  88435. *
  88436. * r Result of squaring.
  88437. * a Number to square in Montgomery form.
  88438. * m Modulus (prime).
  88439. * mp Montgomery multiplier.
  88440. */
  88441. SP_NOINLINE static void sp_384_mont_sqr_12(sp_digit* r, const sp_digit* a,
  88442. const sp_digit* m, sp_digit mp)
  88443. {
  88444. sp_384_sqr_12(r, a);
  88445. sp_384_mont_reduce_12(r, m, mp);
  88446. }
  88447. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  88448. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  88449. *
  88450. * r Result of squaring.
  88451. * a Number to square in Montgomery form.
  88452. * n Number of times to square.
  88453. * m Modulus (prime).
  88454. * mp Montgomery multiplier.
  88455. */
  88456. SP_NOINLINE static void sp_384_mont_sqr_n_12(sp_digit* r,
  88457. const sp_digit* a, int n, const sp_digit* m, sp_digit mp)
  88458. {
  88459. sp_384_mont_sqr_12(r, a, m, mp);
  88460. for (; n > 1; n--) {
  88461. sp_384_mont_sqr_12(r, r, m, mp);
  88462. }
  88463. }
  88464. #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
  88465. #ifdef WOLFSSL_SP_SMALL
  88466. /* Mod-2 for the P384 curve. */
  88467. static const uint32_t p384_mod_minus_2[12] = {
  88468. 0xfffffffdU,0x00000000U,0x00000000U,0xffffffffU,0xfffffffeU,0xffffffffU,
  88469. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  88470. };
  88471. #endif /* !WOLFSSL_SP_SMALL */
  88472. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  88473. * P384 curve. (r = 1 / a mod m)
  88474. *
  88475. * r Inverse result.
  88476. * a Number to invert.
  88477. * td Temporary data.
  88478. */
  88479. static void sp_384_mont_inv_12(sp_digit* r, const sp_digit* a, sp_digit* td)
  88480. {
  88481. #ifdef WOLFSSL_SP_SMALL
  88482. sp_digit* t = td;
  88483. int i;
  88484. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  88485. for (i=382; i>=0; i--) {
  88486. sp_384_mont_sqr_12(t, t, p384_mod, p384_mp_mod);
  88487. if (p384_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  88488. sp_384_mont_mul_12(t, t, a, p384_mod, p384_mp_mod);
  88489. }
  88490. XMEMCPY(r, t, sizeof(sp_digit) * 12);
  88491. #else
  88492. sp_digit* t1 = td;
  88493. sp_digit* t2 = td + 2 * 12;
  88494. sp_digit* t3 = td + 4 * 12;
  88495. sp_digit* t4 = td + 6 * 12;
  88496. sp_digit* t5 = td + 8 * 12;
  88497. /* 0x2 */
  88498. sp_384_mont_sqr_12(t1, a, p384_mod, p384_mp_mod);
  88499. /* 0x3 */
  88500. sp_384_mont_mul_12(t5, t1, a, p384_mod, p384_mp_mod);
  88501. /* 0xc */
  88502. sp_384_mont_sqr_n_12(t1, t5, 2, p384_mod, p384_mp_mod);
  88503. /* 0xf */
  88504. sp_384_mont_mul_12(t2, t5, t1, p384_mod, p384_mp_mod);
  88505. /* 0x1e */
  88506. sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod);
  88507. /* 0x1f */
  88508. sp_384_mont_mul_12(t4, t1, a, p384_mod, p384_mp_mod);
  88509. /* 0x3e0 */
  88510. sp_384_mont_sqr_n_12(t1, t4, 5, p384_mod, p384_mp_mod);
  88511. /* 0x3ff */
  88512. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  88513. /* 0x7fe0 */
  88514. sp_384_mont_sqr_n_12(t1, t2, 5, p384_mod, p384_mp_mod);
  88515. /* 0x7fff */
  88516. sp_384_mont_mul_12(t4, t4, t1, p384_mod, p384_mp_mod);
  88517. /* 0x3fff8000 */
  88518. sp_384_mont_sqr_n_12(t1, t4, 15, p384_mod, p384_mp_mod);
  88519. /* 0x3fffffff */
  88520. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  88521. /* 0xfffffffc */
  88522. sp_384_mont_sqr_n_12(t3, t2, 2, p384_mod, p384_mp_mod);
  88523. /* 0xfffffffd */
  88524. sp_384_mont_mul_12(r, t3, a, p384_mod, p384_mp_mod);
  88525. /* 0xffffffff */
  88526. sp_384_mont_mul_12(t3, t5, t3, p384_mod, p384_mp_mod);
  88527. /* 0xfffffffc0000000 */
  88528. sp_384_mont_sqr_n_12(t1, t2, 30, p384_mod, p384_mp_mod);
  88529. /* 0xfffffffffffffff */
  88530. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  88531. /* 0xfffffffffffffff000000000000000 */
  88532. sp_384_mont_sqr_n_12(t1, t2, 60, p384_mod, p384_mp_mod);
  88533. /* 0xffffffffffffffffffffffffffffff */
  88534. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  88535. /* 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  88536. sp_384_mont_sqr_n_12(t1, t2, 120, p384_mod, p384_mp_mod);
  88537. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  88538. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  88539. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  88540. sp_384_mont_sqr_n_12(t1, t2, 15, p384_mod, p384_mp_mod);
  88541. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  88542. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  88543. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 */
  88544. sp_384_mont_sqr_n_12(t1, t2, 33, p384_mod, p384_mp_mod);
  88545. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff */
  88546. sp_384_mont_mul_12(t2, t3, t1, p384_mod, p384_mp_mod);
  88547. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000000000000 */
  88548. sp_384_mont_sqr_n_12(t1, t2, 96, p384_mod, p384_mp_mod);
  88549. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffd */
  88550. sp_384_mont_mul_12(r, r, t1, p384_mod, p384_mp_mod);
  88551. #endif /* WOLFSSL_SP_SMALL */
  88552. }
  88553. /* Compare a with b in constant time.
  88554. *
  88555. * a A single precision integer.
  88556. * b A single precision integer.
  88557. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  88558. * respectively.
  88559. */
  88560. static sp_int32 sp_384_cmp_12(const sp_digit* a_p, const sp_digit* b_p)
  88561. {
  88562. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  88563. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  88564. __asm__ __volatile__ (
  88565. "mov r2, #-1\n\t"
  88566. "mov r6, #1\n\t"
  88567. "mov r5, #0\n\t"
  88568. "mov r3, #-1\n\t"
  88569. #ifdef WOLFSSL_SP_SMALL
  88570. "mov r4, #44\n\t"
  88571. "\n"
  88572. "L_sp_384_cmp_12_words_%=: \n\t"
  88573. "ldr r12, [%[a], r4]\n\t"
  88574. "ldr lr, [%[b], r4]\n\t"
  88575. "and r12, r12, r3\n\t"
  88576. "and lr, lr, r3\n\t"
  88577. "subs r12, r12, lr\n\t"
  88578. "it hi\n\t"
  88579. "movhi r2, r6\n\t"
  88580. "it lo\n\t"
  88581. "movlo r2, r3\n\t"
  88582. "it ne\n\t"
  88583. "movne r3, r5\n\t"
  88584. "subs r4, r4, #4\n\t"
  88585. "bcs L_sp_384_cmp_12_words_%=\n\t"
  88586. "eor r2, r2, r3\n\t"
  88587. #else
  88588. "ldr r12, [%[a], #44]\n\t"
  88589. "ldr lr, [%[b], #44]\n\t"
  88590. "and r12, r12, r3\n\t"
  88591. "and lr, lr, r3\n\t"
  88592. "subs r12, r12, lr\n\t"
  88593. "it hi\n\t"
  88594. "movhi r2, r6\n\t"
  88595. "it lo\n\t"
  88596. "movlo r2, r3\n\t"
  88597. "it ne\n\t"
  88598. "movne r3, r5\n\t"
  88599. "ldr r12, [%[a], #40]\n\t"
  88600. "ldr lr, [%[b], #40]\n\t"
  88601. "and r12, r12, r3\n\t"
  88602. "and lr, lr, r3\n\t"
  88603. "subs r12, r12, lr\n\t"
  88604. "it hi\n\t"
  88605. "movhi r2, r6\n\t"
  88606. "it lo\n\t"
  88607. "movlo r2, r3\n\t"
  88608. "it ne\n\t"
  88609. "movne r3, r5\n\t"
  88610. "ldr r12, [%[a], #36]\n\t"
  88611. "ldr lr, [%[b], #36]\n\t"
  88612. "and r12, r12, r3\n\t"
  88613. "and lr, lr, r3\n\t"
  88614. "subs r12, r12, lr\n\t"
  88615. "it hi\n\t"
  88616. "movhi r2, r6\n\t"
  88617. "it lo\n\t"
  88618. "movlo r2, r3\n\t"
  88619. "it ne\n\t"
  88620. "movne r3, r5\n\t"
  88621. "ldr r12, [%[a], #32]\n\t"
  88622. "ldr lr, [%[b], #32]\n\t"
  88623. "and r12, r12, r3\n\t"
  88624. "and lr, lr, r3\n\t"
  88625. "subs r12, r12, lr\n\t"
  88626. "it hi\n\t"
  88627. "movhi r2, r6\n\t"
  88628. "it lo\n\t"
  88629. "movlo r2, r3\n\t"
  88630. "it ne\n\t"
  88631. "movne r3, r5\n\t"
  88632. "ldr r12, [%[a], #28]\n\t"
  88633. "ldr lr, [%[b], #28]\n\t"
  88634. "and r12, r12, r3\n\t"
  88635. "and lr, lr, r3\n\t"
  88636. "subs r12, r12, lr\n\t"
  88637. "it hi\n\t"
  88638. "movhi r2, r6\n\t"
  88639. "it lo\n\t"
  88640. "movlo r2, r3\n\t"
  88641. "it ne\n\t"
  88642. "movne r3, r5\n\t"
  88643. "ldr r12, [%[a], #24]\n\t"
  88644. "ldr lr, [%[b], #24]\n\t"
  88645. "and r12, r12, r3\n\t"
  88646. "and lr, lr, r3\n\t"
  88647. "subs r12, r12, lr\n\t"
  88648. "it hi\n\t"
  88649. "movhi r2, r6\n\t"
  88650. "it lo\n\t"
  88651. "movlo r2, r3\n\t"
  88652. "it ne\n\t"
  88653. "movne r3, r5\n\t"
  88654. "ldr r12, [%[a], #20]\n\t"
  88655. "ldr lr, [%[b], #20]\n\t"
  88656. "and r12, r12, r3\n\t"
  88657. "and lr, lr, r3\n\t"
  88658. "subs r12, r12, lr\n\t"
  88659. "it hi\n\t"
  88660. "movhi r2, r6\n\t"
  88661. "it lo\n\t"
  88662. "movlo r2, r3\n\t"
  88663. "it ne\n\t"
  88664. "movne r3, r5\n\t"
  88665. "ldr r12, [%[a], #16]\n\t"
  88666. "ldr lr, [%[b], #16]\n\t"
  88667. "and r12, r12, r3\n\t"
  88668. "and lr, lr, r3\n\t"
  88669. "subs r12, r12, lr\n\t"
  88670. "it hi\n\t"
  88671. "movhi r2, r6\n\t"
  88672. "it lo\n\t"
  88673. "movlo r2, r3\n\t"
  88674. "it ne\n\t"
  88675. "movne r3, r5\n\t"
  88676. "ldr r12, [%[a], #12]\n\t"
  88677. "ldr lr, [%[b], #12]\n\t"
  88678. "and r12, r12, r3\n\t"
  88679. "and lr, lr, r3\n\t"
  88680. "subs r12, r12, lr\n\t"
  88681. "it hi\n\t"
  88682. "movhi r2, r6\n\t"
  88683. "it lo\n\t"
  88684. "movlo r2, r3\n\t"
  88685. "it ne\n\t"
  88686. "movne r3, r5\n\t"
  88687. "ldr r12, [%[a], #8]\n\t"
  88688. "ldr lr, [%[b], #8]\n\t"
  88689. "and r12, r12, r3\n\t"
  88690. "and lr, lr, r3\n\t"
  88691. "subs r12, r12, lr\n\t"
  88692. "it hi\n\t"
  88693. "movhi r2, r6\n\t"
  88694. "it lo\n\t"
  88695. "movlo r2, r3\n\t"
  88696. "it ne\n\t"
  88697. "movne r3, r5\n\t"
  88698. "ldr r12, [%[a], #4]\n\t"
  88699. "ldr lr, [%[b], #4]\n\t"
  88700. "and r12, r12, r3\n\t"
  88701. "and lr, lr, r3\n\t"
  88702. "subs r12, r12, lr\n\t"
  88703. "it hi\n\t"
  88704. "movhi r2, r6\n\t"
  88705. "it lo\n\t"
  88706. "movlo r2, r3\n\t"
  88707. "it ne\n\t"
  88708. "movne r3, r5\n\t"
  88709. "ldr r12, [%[a]]\n\t"
  88710. "ldr lr, [%[b]]\n\t"
  88711. "and r12, r12, r3\n\t"
  88712. "and lr, lr, r3\n\t"
  88713. "subs r12, r12, lr\n\t"
  88714. "it hi\n\t"
  88715. "movhi r2, r6\n\t"
  88716. "it lo\n\t"
  88717. "movlo r2, r3\n\t"
  88718. "it ne\n\t"
  88719. "movne r3, r5\n\t"
  88720. "eor r2, r2, r3\n\t"
  88721. #endif /*WOLFSSL_SP_SMALL */
  88722. "mov %[a], r2\n\t"
  88723. : [a] "+r" (a), [b] "+r" (b)
  88724. :
  88725. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  88726. );
  88727. return (uint32_t)(size_t)a;
  88728. }
  88729. /* Normalize the values in each word to 32.
  88730. *
  88731. * a Array of sp_digit to normalize.
  88732. */
  88733. #define sp_384_norm_12(a)
  88734. /* Map the Montgomery form projective coordinate point to an affine point.
  88735. *
  88736. * r Resulting affine coordinate point.
  88737. * p Montgomery form projective coordinate point.
  88738. * t Temporary ordinate data.
  88739. */
  88740. static void sp_384_map_12(sp_point_384* r, const sp_point_384* p,
  88741. sp_digit* t)
  88742. {
  88743. sp_digit* t1 = t;
  88744. sp_digit* t2 = t + 2*12;
  88745. sp_int32 n;
  88746. sp_384_mont_inv_12(t1, p->z, t + 2*12);
  88747. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  88748. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  88749. /* x /= z^2 */
  88750. sp_384_mont_mul_12(r->x, p->x, t2, p384_mod, p384_mp_mod);
  88751. XMEMSET(r->x + 12, 0, sizeof(sp_digit) * 12U);
  88752. sp_384_mont_reduce_12(r->x, p384_mod, p384_mp_mod);
  88753. /* Reduce x to less than modulus */
  88754. n = sp_384_cmp_12(r->x, p384_mod);
  88755. sp_384_cond_sub_12(r->x, r->x, p384_mod, (sp_digit)~(n >> 31));
  88756. sp_384_norm_12(r->x);
  88757. /* y /= z^3 */
  88758. sp_384_mont_mul_12(r->y, p->y, t1, p384_mod, p384_mp_mod);
  88759. XMEMSET(r->y + 12, 0, sizeof(sp_digit) * 12U);
  88760. sp_384_mont_reduce_12(r->y, p384_mod, p384_mp_mod);
  88761. /* Reduce y to less than modulus */
  88762. n = sp_384_cmp_12(r->y, p384_mod);
  88763. sp_384_cond_sub_12(r->y, r->y, p384_mod, (sp_digit)~(n >> 31));
  88764. sp_384_norm_12(r->y);
  88765. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  88766. r->z[0] = 1;
  88767. }
  88768. /* Add two Montgomery form numbers (r = a + b % m).
  88769. *
  88770. * r Result of addition.
  88771. * a First number to add in Montgomery form.
  88772. * b Second number to add in Montgomery form.
  88773. * m Modulus (prime).
  88774. */
  88775. 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)
  88776. {
  88777. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88778. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88779. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  88780. register const sp_digit* m asm ("r3") = (const sp_digit*)m_p;
  88781. sp_digit o;
  88782. o = sp_384_add_12(r, a, b);
  88783. sp_384_cond_sub_12(r, r, m, 0 - o);
  88784. }
  88785. /* Double a Montgomery form number (r = a + a % m).
  88786. *
  88787. * r Result of doubling.
  88788. * a Number to double in Montgomery form.
  88789. * m Modulus (prime).
  88790. */
  88791. static void sp_384_mont_dbl_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  88792. {
  88793. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88794. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88795. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  88796. sp_digit o;
  88797. o = sp_384_add_12(r, a, a);
  88798. sp_384_cond_sub_12(r, r, m, 0 - o);
  88799. }
  88800. /* Triple a Montgomery form number (r = a + a + a % m).
  88801. *
  88802. * r Result of Tripling.
  88803. * a Number to triple in Montgomery form.
  88804. * m Modulus (prime).
  88805. */
  88806. static void sp_384_mont_tpl_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  88807. {
  88808. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88809. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88810. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  88811. sp_digit o;
  88812. o = sp_384_add_12(r, a, a);
  88813. sp_384_cond_sub_12(r, r, m, 0 - o);
  88814. o = sp_384_add_12(r, r, a);
  88815. sp_384_cond_sub_12(r, r, m, 0 - o);
  88816. }
  88817. #ifdef WOLFSSL_SP_SMALL
  88818. /* Sub b from a into r. (r = a - b)
  88819. *
  88820. * r A single precision integer.
  88821. * a A single precision integer.
  88822. * b A single precision integer.
  88823. */
  88824. static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  88825. {
  88826. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88827. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88828. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  88829. __asm__ __volatile__ (
  88830. "mov r12, #0\n\t"
  88831. "add lr, %[a], #48\n\t"
  88832. "\n"
  88833. "L_sp_384_sub_12_word_%=: \n\t"
  88834. "rsbs r12, r12, #0\n\t"
  88835. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  88836. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  88837. "sbcs r3, r3, r7\n\t"
  88838. "sbcs r4, r4, r8\n\t"
  88839. "sbcs r5, r5, r9\n\t"
  88840. "sbcs r6, r6, r10\n\t"
  88841. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  88842. "sbc r12, r3, r3\n\t"
  88843. "cmp %[a], lr\n\t"
  88844. "bne L_sp_384_sub_12_word_%=\n\t"
  88845. "mov %[r], r12\n\t"
  88846. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  88847. :
  88848. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  88849. );
  88850. return (uint32_t)(size_t)r;
  88851. }
  88852. #else
  88853. /* Sub b from a into r. (r = a - b)
  88854. *
  88855. * r A single precision integer.
  88856. * a A single precision integer.
  88857. * b A single precision integer.
  88858. */
  88859. static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  88860. {
  88861. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88862. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88863. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  88864. __asm__ __volatile__ (
  88865. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  88866. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  88867. "subs r3, r3, r7\n\t"
  88868. "sbcs r4, r4, r8\n\t"
  88869. "sbcs r5, r5, r9\n\t"
  88870. "sbcs r6, r6, r10\n\t"
  88871. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  88872. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  88873. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  88874. "sbcs r3, r3, r7\n\t"
  88875. "sbcs r4, r4, r8\n\t"
  88876. "sbcs r5, r5, r9\n\t"
  88877. "sbcs r6, r6, r10\n\t"
  88878. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  88879. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  88880. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  88881. "sbcs r3, r3, r7\n\t"
  88882. "sbcs r4, r4, r8\n\t"
  88883. "sbcs r5, r5, r9\n\t"
  88884. "sbcs r6, r6, r10\n\t"
  88885. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  88886. "sbc %[r], r6, r6\n\t"
  88887. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  88888. :
  88889. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  88890. );
  88891. return (uint32_t)(size_t)r;
  88892. }
  88893. #endif /* WOLFSSL_SP_SMALL */
  88894. #ifdef WOLFSSL_SP_SMALL
  88895. /* Conditionally add a and b using the mask m.
  88896. * m is -1 to add and 0 when not.
  88897. *
  88898. * r A single precision number representing conditional add result.
  88899. * a A single precision number to add with.
  88900. * b A single precision number to add.
  88901. * m Mask value to apply.
  88902. */
  88903. 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)
  88904. {
  88905. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88906. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88907. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  88908. register sp_digit m asm ("r3") = (sp_digit)m_p;
  88909. __asm__ __volatile__ (
  88910. "mov lr, #0\n\t"
  88911. "mov r6, #0\n\t"
  88912. "mov r12, #0\n\t"
  88913. "\n"
  88914. "L_sp_384_cond_add_12_words_%=: \n\t"
  88915. "adds lr, lr, #-1\n\t"
  88916. "ldr r4, [%[a], r12]\n\t"
  88917. "ldr r5, [%[b], r12]\n\t"
  88918. "and r5, r5, %[m]\n\t"
  88919. "adcs r4, r4, r5\n\t"
  88920. "adc lr, r6, r6\n\t"
  88921. "str r4, [%[r], r12]\n\t"
  88922. "add r12, r12, #4\n\t"
  88923. "cmp r12, #48\n\t"
  88924. "blt L_sp_384_cond_add_12_words_%=\n\t"
  88925. "mov %[r], lr\n\t"
  88926. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  88927. :
  88928. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  88929. );
  88930. return (uint32_t)(size_t)r;
  88931. }
  88932. #else
  88933. /* Conditionally add a and b using the mask m.
  88934. * m is -1 to add and 0 when not.
  88935. *
  88936. * r A single precision number representing conditional add result.
  88937. * a A single precision number to add with.
  88938. * b A single precision number to add.
  88939. * m Mask value to apply.
  88940. */
  88941. 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)
  88942. {
  88943. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  88944. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  88945. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  88946. register sp_digit m asm ("r3") = (sp_digit)m_p;
  88947. __asm__ __volatile__ (
  88948. "mov r8, #0\n\t"
  88949. "ldm %[a]!, {r4, r5}\n\t"
  88950. "ldm %[b]!, {r6, r7}\n\t"
  88951. "and r6, r6, %[m]\n\t"
  88952. "and r7, r7, %[m]\n\t"
  88953. "adds r4, r4, r6\n\t"
  88954. "adcs r5, r5, r7\n\t"
  88955. "stm %[r]!, {r4, r5}\n\t"
  88956. "ldm %[a]!, {r4, r5}\n\t"
  88957. "ldm %[b]!, {r6, r7}\n\t"
  88958. "and r6, r6, %[m]\n\t"
  88959. "and r7, r7, %[m]\n\t"
  88960. "adcs r4, r4, r6\n\t"
  88961. "adcs r5, r5, r7\n\t"
  88962. "stm %[r]!, {r4, r5}\n\t"
  88963. "ldm %[a]!, {r4, r5}\n\t"
  88964. "ldm %[b]!, {r6, r7}\n\t"
  88965. "and r6, r6, %[m]\n\t"
  88966. "and r7, r7, %[m]\n\t"
  88967. "adcs r4, r4, r6\n\t"
  88968. "adcs r5, r5, r7\n\t"
  88969. "stm %[r]!, {r4, r5}\n\t"
  88970. "ldm %[a]!, {r4, r5}\n\t"
  88971. "ldm %[b]!, {r6, r7}\n\t"
  88972. "and r6, r6, %[m]\n\t"
  88973. "and r7, r7, %[m]\n\t"
  88974. "adcs r4, r4, r6\n\t"
  88975. "adcs r5, r5, r7\n\t"
  88976. "stm %[r]!, {r4, r5}\n\t"
  88977. "ldm %[a]!, {r4, r5}\n\t"
  88978. "ldm %[b]!, {r6, r7}\n\t"
  88979. "and r6, r6, %[m]\n\t"
  88980. "and r7, r7, %[m]\n\t"
  88981. "adcs r4, r4, r6\n\t"
  88982. "adcs r5, r5, r7\n\t"
  88983. "stm %[r]!, {r4, r5}\n\t"
  88984. "ldm %[a]!, {r4, r5}\n\t"
  88985. "ldm %[b]!, {r6, r7}\n\t"
  88986. "and r6, r6, %[m]\n\t"
  88987. "and r7, r7, %[m]\n\t"
  88988. "adcs r4, r4, r6\n\t"
  88989. "adcs r5, r5, r7\n\t"
  88990. "stm %[r]!, {r4, r5}\n\t"
  88991. "adc %[r], r8, r8\n\t"
  88992. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  88993. :
  88994. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  88995. );
  88996. return (uint32_t)(size_t)r;
  88997. }
  88998. #endif /* WOLFSSL_SP_SMALL */
  88999. /* Subtract two Montgomery form numbers (r = a - b % m).
  89000. *
  89001. * r Result of subtration.
  89002. * a Number to subtract from in Montgomery form.
  89003. * b Number to subtract with in Montgomery form.
  89004. * m Modulus (prime).
  89005. */
  89006. 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)
  89007. {
  89008. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  89009. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  89010. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  89011. register const sp_digit* m asm ("r3") = (const sp_digit*)m_p;
  89012. sp_digit o;
  89013. o = sp_384_sub_12(r, a, b);
  89014. sp_384_cond_add_12(r, r, m, o);
  89015. }
  89016. #ifdef WOLFSSL_SP_SMALL
  89017. #else
  89018. #endif /* WOLFSSL_SP_SMALL */
  89019. static void sp_384_rshift1_12(sp_digit* r_p, const sp_digit* a_p)
  89020. {
  89021. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  89022. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  89023. __asm__ __volatile__ (
  89024. "ldm %[a], {r2, r3}\n\t"
  89025. "lsr r2, r2, #1\n\t"
  89026. "orr r2, r2, r3, lsl #31\n\t"
  89027. "lsr r3, r3, #1\n\t"
  89028. "ldr r4, [%[a], #8]\n\t"
  89029. "str r2, [%[r]]\n\t"
  89030. "orr r3, r3, r4, lsl #31\n\t"
  89031. "lsr r4, r4, #1\n\t"
  89032. "ldr r2, [%[a], #12]\n\t"
  89033. "str r3, [%[r], #4]\n\t"
  89034. "orr r4, r4, r2, lsl #31\n\t"
  89035. "lsr r2, r2, #1\n\t"
  89036. "ldr r3, [%[a], #16]\n\t"
  89037. "str r4, [%[r], #8]\n\t"
  89038. "orr r2, r2, r3, lsl #31\n\t"
  89039. "lsr r3, r3, #1\n\t"
  89040. "ldr r4, [%[a], #20]\n\t"
  89041. "str r2, [%[r], #12]\n\t"
  89042. "orr r3, r3, r4, lsl #31\n\t"
  89043. "lsr r4, r4, #1\n\t"
  89044. "ldr r2, [%[a], #24]\n\t"
  89045. "str r3, [%[r], #16]\n\t"
  89046. "orr r4, r4, r2, lsl #31\n\t"
  89047. "lsr r2, r2, #1\n\t"
  89048. "ldr r3, [%[a], #28]\n\t"
  89049. "str r4, [%[r], #20]\n\t"
  89050. "orr r2, r2, r3, lsl #31\n\t"
  89051. "lsr r3, r3, #1\n\t"
  89052. "ldr r4, [%[a], #32]\n\t"
  89053. "str r2, [%[r], #24]\n\t"
  89054. "orr r3, r3, r4, lsl #31\n\t"
  89055. "lsr r4, r4, #1\n\t"
  89056. "ldr r2, [%[a], #36]\n\t"
  89057. "str r3, [%[r], #28]\n\t"
  89058. "orr r4, r4, r2, lsl #31\n\t"
  89059. "lsr r2, r2, #1\n\t"
  89060. "ldr r3, [%[a], #40]\n\t"
  89061. "str r4, [%[r], #32]\n\t"
  89062. "orr r2, r2, r3, lsl #31\n\t"
  89063. "lsr r3, r3, #1\n\t"
  89064. "ldr r4, [%[a], #44]\n\t"
  89065. "str r2, [%[r], #36]\n\t"
  89066. "orr r3, r3, r4, lsl #31\n\t"
  89067. "lsr r4, r4, #1\n\t"
  89068. "str r3, [%[r], #40]\n\t"
  89069. "str r4, [%[r], #44]\n\t"
  89070. : [r] "+r" (r), [a] "+r" (a)
  89071. :
  89072. : "memory", "r2", "r3", "r4", "cc"
  89073. );
  89074. }
  89075. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  89076. *
  89077. * r Result of division by 2.
  89078. * a Number to divide.
  89079. * m Modulus (prime).
  89080. */
  89081. static void sp_384_mont_div2_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  89082. {
  89083. sp_digit o;
  89084. o = sp_384_cond_add_12(r, a, m, 0 - (a[0] & 1));
  89085. sp_384_rshift1_12(r, r);
  89086. r[11] |= o << 31;
  89087. }
  89088. /* Double the Montgomery form projective point p.
  89089. *
  89090. * r Result of doubling point.
  89091. * p Point to double.
  89092. * t Temporary ordinate data.
  89093. */
  89094. static void sp_384_proj_point_dbl_12(sp_point_384* r, const sp_point_384* p,
  89095. sp_digit* t)
  89096. {
  89097. sp_digit* t1 = t;
  89098. sp_digit* t2 = t + 2*12;
  89099. sp_digit* x;
  89100. sp_digit* y;
  89101. sp_digit* z;
  89102. x = r->x;
  89103. y = r->y;
  89104. z = r->z;
  89105. /* Put infinity into result. */
  89106. if (r != p) {
  89107. r->infinity = p->infinity;
  89108. }
  89109. /* T1 = Z * Z */
  89110. sp_384_mont_sqr_12(t1, p->z, p384_mod, p384_mp_mod);
  89111. /* Z = Y * Z */
  89112. sp_384_mont_mul_12(z, p->y, p->z, p384_mod, p384_mp_mod);
  89113. /* Z = 2Z */
  89114. sp_384_mont_dbl_12(z, z, p384_mod);
  89115. /* T2 = X - T1 */
  89116. sp_384_mont_sub_12(t2, p->x, t1, p384_mod);
  89117. /* T1 = X + T1 */
  89118. sp_384_mont_add_12(t1, p->x, t1, p384_mod);
  89119. /* T2 = T1 * T2 */
  89120. sp_384_mont_mul_12(t2, t1, t2, p384_mod, p384_mp_mod);
  89121. /* T1 = 3T2 */
  89122. sp_384_mont_tpl_12(t1, t2, p384_mod);
  89123. /* Y = 2Y */
  89124. sp_384_mont_dbl_12(y, p->y, p384_mod);
  89125. /* Y = Y * Y */
  89126. sp_384_mont_sqr_12(y, y, p384_mod, p384_mp_mod);
  89127. /* T2 = Y * Y */
  89128. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  89129. /* T2 = T2/2 */
  89130. sp_384_mont_div2_12(t2, t2, p384_mod);
  89131. /* Y = Y * X */
  89132. sp_384_mont_mul_12(y, y, p->x, p384_mod, p384_mp_mod);
  89133. /* X = T1 * T1 */
  89134. sp_384_mont_sqr_12(x, t1, p384_mod, p384_mp_mod);
  89135. /* X = X - Y */
  89136. sp_384_mont_sub_12(x, x, y, p384_mod);
  89137. /* X = X - Y */
  89138. sp_384_mont_sub_12(x, x, y, p384_mod);
  89139. /* Y = Y - X */
  89140. sp_384_mont_sub_12(y, y, x, p384_mod);
  89141. /* Y = Y * T1 */
  89142. sp_384_mont_mul_12(y, y, t1, p384_mod, p384_mp_mod);
  89143. /* Y = Y - T2 */
  89144. sp_384_mont_sub_12(y, y, t2, p384_mod);
  89145. }
  89146. #ifdef WOLFSSL_SP_NONBLOCK
  89147. typedef struct sp_384_proj_point_dbl_12_ctx {
  89148. int state;
  89149. sp_digit* t1;
  89150. sp_digit* t2;
  89151. sp_digit* x;
  89152. sp_digit* y;
  89153. sp_digit* z;
  89154. } sp_384_proj_point_dbl_12_ctx;
  89155. /* Double the Montgomery form projective point p.
  89156. *
  89157. * r Result of doubling point.
  89158. * p Point to double.
  89159. * t Temporary ordinate data.
  89160. */
  89161. static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
  89162. const sp_point_384* p, sp_digit* t)
  89163. {
  89164. int err = FP_WOULDBLOCK;
  89165. sp_384_proj_point_dbl_12_ctx* ctx = (sp_384_proj_point_dbl_12_ctx*)sp_ctx->data;
  89166. typedef char ctx_size_test[sizeof(sp_384_proj_point_dbl_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  89167. (void)sizeof(ctx_size_test);
  89168. switch (ctx->state) {
  89169. case 0:
  89170. ctx->t1 = t;
  89171. ctx->t2 = t + 2*12;
  89172. ctx->x = r->x;
  89173. ctx->y = r->y;
  89174. ctx->z = r->z;
  89175. /* Put infinity into result. */
  89176. if (r != p) {
  89177. r->infinity = p->infinity;
  89178. }
  89179. ctx->state = 1;
  89180. break;
  89181. case 1:
  89182. /* T1 = Z * Z */
  89183. sp_384_mont_sqr_12(ctx->t1, p->z, p384_mod, p384_mp_mod);
  89184. ctx->state = 2;
  89185. break;
  89186. case 2:
  89187. /* Z = Y * Z */
  89188. sp_384_mont_mul_12(ctx->z, p->y, p->z, p384_mod, p384_mp_mod);
  89189. ctx->state = 3;
  89190. break;
  89191. case 3:
  89192. /* Z = 2Z */
  89193. sp_384_mont_dbl_12(ctx->z, ctx->z, p384_mod);
  89194. ctx->state = 4;
  89195. break;
  89196. case 4:
  89197. /* T2 = X - T1 */
  89198. sp_384_mont_sub_12(ctx->t2, p->x, ctx->t1, p384_mod);
  89199. ctx->state = 5;
  89200. break;
  89201. case 5:
  89202. /* T1 = X + T1 */
  89203. sp_384_mont_add_12(ctx->t1, p->x, ctx->t1, p384_mod);
  89204. ctx->state = 6;
  89205. break;
  89206. case 6:
  89207. /* T2 = T1 * T2 */
  89208. sp_384_mont_mul_12(ctx->t2, ctx->t1, ctx->t2, p384_mod, p384_mp_mod);
  89209. ctx->state = 7;
  89210. break;
  89211. case 7:
  89212. /* T1 = 3T2 */
  89213. sp_384_mont_tpl_12(ctx->t1, ctx->t2, p384_mod);
  89214. ctx->state = 8;
  89215. break;
  89216. case 8:
  89217. /* Y = 2Y */
  89218. sp_384_mont_dbl_12(ctx->y, p->y, p384_mod);
  89219. ctx->state = 9;
  89220. break;
  89221. case 9:
  89222. /* Y = Y * Y */
  89223. sp_384_mont_sqr_12(ctx->y, ctx->y, p384_mod, p384_mp_mod);
  89224. ctx->state = 10;
  89225. break;
  89226. case 10:
  89227. /* T2 = Y * Y */
  89228. sp_384_mont_sqr_12(ctx->t2, ctx->y, p384_mod, p384_mp_mod);
  89229. ctx->state = 11;
  89230. break;
  89231. case 11:
  89232. /* T2 = T2/2 */
  89233. sp_384_mont_div2_12(ctx->t2, ctx->t2, p384_mod);
  89234. ctx->state = 12;
  89235. break;
  89236. case 12:
  89237. /* Y = Y * X */
  89238. sp_384_mont_mul_12(ctx->y, ctx->y, p->x, p384_mod, p384_mp_mod);
  89239. ctx->state = 13;
  89240. break;
  89241. case 13:
  89242. /* X = T1 * T1 */
  89243. sp_384_mont_sqr_12(ctx->x, ctx->t1, p384_mod, p384_mp_mod);
  89244. ctx->state = 14;
  89245. break;
  89246. case 14:
  89247. /* X = X - Y */
  89248. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  89249. ctx->state = 15;
  89250. break;
  89251. case 15:
  89252. /* X = X - Y */
  89253. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  89254. ctx->state = 16;
  89255. break;
  89256. case 16:
  89257. /* Y = Y - X */
  89258. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod);
  89259. ctx->state = 17;
  89260. break;
  89261. case 17:
  89262. /* Y = Y * T1 */
  89263. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t1, p384_mod, p384_mp_mod);
  89264. ctx->state = 18;
  89265. break;
  89266. case 18:
  89267. /* Y = Y - T2 */
  89268. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t2, p384_mod);
  89269. ctx->state = 19;
  89270. /* fall-through */
  89271. case 19:
  89272. err = MP_OKAY;
  89273. break;
  89274. }
  89275. if (err == MP_OKAY && ctx->state != 19) {
  89276. err = FP_WOULDBLOCK;
  89277. }
  89278. return err;
  89279. }
  89280. #endif /* WOLFSSL_SP_NONBLOCK */
  89281. /* Compare two numbers to determine if they are equal.
  89282. * Constant time implementation.
  89283. *
  89284. * a First number to compare.
  89285. * b Second number to compare.
  89286. * returns 1 when equal and 0 otherwise.
  89287. */
  89288. static int sp_384_cmp_equal_12(const sp_digit* a, const sp_digit* b)
  89289. {
  89290. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  89291. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  89292. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  89293. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11])) == 0;
  89294. }
  89295. /* Returns 1 if the number of zero.
  89296. * Implementation is constant time.
  89297. *
  89298. * a Number to check.
  89299. * returns 1 if the number is zero and 0 otherwise.
  89300. */
  89301. static int sp_384_iszero_12(const sp_digit* a)
  89302. {
  89303. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  89304. a[8] | a[9] | a[10] | a[11]) == 0;
  89305. }
  89306. /* Add two Montgomery form projective points.
  89307. *
  89308. * r Result of addition.
  89309. * p First point to add.
  89310. * q Second point to add.
  89311. * t Temporary ordinate data.
  89312. */
  89313. static void sp_384_proj_point_add_12(sp_point_384* r,
  89314. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  89315. {
  89316. sp_digit* t6 = t;
  89317. sp_digit* t1 = t + 2*12;
  89318. sp_digit* t2 = t + 4*12;
  89319. sp_digit* t3 = t + 6*12;
  89320. sp_digit* t4 = t + 8*12;
  89321. sp_digit* t5 = t + 10*12;
  89322. /* U1 = X1*Z2^2 */
  89323. sp_384_mont_sqr_12(t1, q->z, p384_mod, p384_mp_mod);
  89324. sp_384_mont_mul_12(t3, t1, q->z, p384_mod, p384_mp_mod);
  89325. sp_384_mont_mul_12(t1, t1, p->x, p384_mod, p384_mp_mod);
  89326. /* U2 = X2*Z1^2 */
  89327. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  89328. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  89329. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  89330. /* S1 = Y1*Z2^3 */
  89331. sp_384_mont_mul_12(t3, t3, p->y, p384_mod, p384_mp_mod);
  89332. /* S2 = Y2*Z1^3 */
  89333. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  89334. /* Check double */
  89335. if ((~p->infinity) & (~q->infinity) &
  89336. sp_384_cmp_equal_12(t2, t1) &
  89337. sp_384_cmp_equal_12(t4, t3)) {
  89338. sp_384_proj_point_dbl_12(r, p, t);
  89339. }
  89340. else {
  89341. sp_digit* x = t6;
  89342. sp_digit* y = t1;
  89343. sp_digit* z = t2;
  89344. /* H = U2 - U1 */
  89345. sp_384_mont_sub_12(t2, t2, t1, p384_mod);
  89346. /* R = S2 - S1 */
  89347. sp_384_mont_sub_12(t4, t4, t3, p384_mod);
  89348. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  89349. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  89350. sp_384_mont_mul_12(y, t1, t5, p384_mod, p384_mp_mod);
  89351. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  89352. /* Z3 = H*Z1*Z2 */
  89353. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  89354. sp_384_mont_mul_12(z, z, q->z, p384_mod, p384_mp_mod);
  89355. sp_384_mont_sqr_12(x, t4, p384_mod, p384_mp_mod);
  89356. sp_384_mont_sub_12(x, x, t5, p384_mod);
  89357. sp_384_mont_mul_12(t5, t5, t3, p384_mod, p384_mp_mod);
  89358. sp_384_mont_dbl_12(t3, y, p384_mod);
  89359. sp_384_mont_sub_12(x, x, t3, p384_mod);
  89360. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  89361. sp_384_mont_sub_12(y, y, x, p384_mod);
  89362. sp_384_mont_mul_12(y, y, t4, p384_mod, p384_mp_mod);
  89363. sp_384_mont_sub_12(y, y, t5, p384_mod);
  89364. {
  89365. int i;
  89366. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  89367. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  89368. sp_digit maskt = ~(maskp | maskq);
  89369. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  89370. for (i = 0; i < 12; i++) {
  89371. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  89372. (x[i] & maskt);
  89373. }
  89374. for (i = 0; i < 12; i++) {
  89375. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  89376. (y[i] & maskt);
  89377. }
  89378. for (i = 0; i < 12; i++) {
  89379. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  89380. (z[i] & maskt);
  89381. }
  89382. r->z[0] |= inf;
  89383. r->infinity = (int)inf;
  89384. }
  89385. }
  89386. }
  89387. #ifdef WOLFSSL_SP_NONBLOCK
  89388. typedef struct sp_384_proj_point_add_12_ctx {
  89389. int state;
  89390. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  89391. const sp_point_384* ap[2];
  89392. sp_point_384* rp[2];
  89393. sp_digit* t1;
  89394. sp_digit* t2;
  89395. sp_digit* t3;
  89396. sp_digit* t4;
  89397. sp_digit* t5;
  89398. sp_digit* t6;
  89399. sp_digit* x;
  89400. sp_digit* y;
  89401. sp_digit* z;
  89402. } sp_384_proj_point_add_12_ctx;
  89403. /* Add two Montgomery form projective points.
  89404. *
  89405. * r Result of addition.
  89406. * p First point to add.
  89407. * q Second point to add.
  89408. * t Temporary ordinate data.
  89409. */
  89410. static int sp_384_proj_point_add_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
  89411. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  89412. {
  89413. int err = FP_WOULDBLOCK;
  89414. sp_384_proj_point_add_12_ctx* ctx = (sp_384_proj_point_add_12_ctx*)sp_ctx->data;
  89415. /* Ensure only the first point is the same as the result. */
  89416. if (q == r) {
  89417. const sp_point_384* a = p;
  89418. p = q;
  89419. q = a;
  89420. }
  89421. typedef char ctx_size_test[sizeof(sp_384_proj_point_add_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  89422. (void)sizeof(ctx_size_test);
  89423. switch (ctx->state) {
  89424. case 0: /* INIT */
  89425. ctx->t6 = t;
  89426. ctx->t1 = t + 2*12;
  89427. ctx->t2 = t + 4*12;
  89428. ctx->t3 = t + 6*12;
  89429. ctx->t4 = t + 8*12;
  89430. ctx->t5 = t + 10*12;
  89431. ctx->x = ctx->t6;
  89432. ctx->y = ctx->t1;
  89433. ctx->z = ctx->t2;
  89434. ctx->state = 1;
  89435. break;
  89436. case 1:
  89437. /* U1 = X1*Z2^2 */
  89438. sp_384_mont_sqr_12(ctx->t1, q->z, p384_mod, p384_mp_mod);
  89439. ctx->state = 2;
  89440. break;
  89441. case 2:
  89442. sp_384_mont_mul_12(ctx->t3, ctx->t1, q->z, p384_mod, p384_mp_mod);
  89443. ctx->state = 3;
  89444. break;
  89445. case 3:
  89446. sp_384_mont_mul_12(ctx->t1, ctx->t1, p->x, p384_mod, p384_mp_mod);
  89447. ctx->state = 4;
  89448. break;
  89449. case 4:
  89450. /* U2 = X2*Z1^2 */
  89451. sp_384_mont_sqr_12(ctx->t2, p->z, p384_mod, p384_mp_mod);
  89452. ctx->state = 5;
  89453. break;
  89454. case 5:
  89455. sp_384_mont_mul_12(ctx->t4, ctx->t2, p->z, p384_mod, p384_mp_mod);
  89456. ctx->state = 6;
  89457. break;
  89458. case 6:
  89459. sp_384_mont_mul_12(ctx->t2, ctx->t2, q->x, p384_mod, p384_mp_mod);
  89460. ctx->state = 7;
  89461. break;
  89462. case 7:
  89463. /* S1 = Y1*Z2^3 */
  89464. sp_384_mont_mul_12(ctx->t3, ctx->t3, p->y, p384_mod, p384_mp_mod);
  89465. ctx->state = 8;
  89466. break;
  89467. case 8:
  89468. /* S2 = Y2*Z1^3 */
  89469. sp_384_mont_mul_12(ctx->t4, ctx->t4, q->y, p384_mod, p384_mp_mod);
  89470. ctx->state = 9;
  89471. break;
  89472. case 9:
  89473. /* Check double */
  89474. if ((~p->infinity) & (~q->infinity) &
  89475. sp_384_cmp_equal_12(ctx->t2, ctx->t1) &
  89476. sp_384_cmp_equal_12(ctx->t4, ctx->t3)) {
  89477. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  89478. sp_384_proj_point_dbl_12(r, p, t);
  89479. ctx->state = 25;
  89480. }
  89481. else {
  89482. ctx->state = 10;
  89483. }
  89484. break;
  89485. case 10:
  89486. /* H = U2 - U1 */
  89487. sp_384_mont_sub_12(ctx->t2, ctx->t2, ctx->t1, p384_mod);
  89488. ctx->state = 11;
  89489. break;
  89490. case 11:
  89491. /* R = S2 - S1 */
  89492. sp_384_mont_sub_12(ctx->t4, ctx->t4, ctx->t3, p384_mod);
  89493. ctx->state = 12;
  89494. break;
  89495. case 12:
  89496. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  89497. sp_384_mont_sqr_12(ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  89498. ctx->state = 13;
  89499. break;
  89500. case 13:
  89501. sp_384_mont_mul_12(ctx->y, ctx->t1, ctx->t5, p384_mod, p384_mp_mod);
  89502. ctx->state = 14;
  89503. break;
  89504. case 14:
  89505. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  89506. ctx->state = 15;
  89507. break;
  89508. case 15:
  89509. /* Z3 = H*Z1*Z2 */
  89510. sp_384_mont_mul_12(ctx->z, p->z, ctx->t2, p384_mod, p384_mp_mod);
  89511. ctx->state = 16;
  89512. break;
  89513. case 16:
  89514. sp_384_mont_mul_12(ctx->z, ctx->z, q->z, p384_mod, p384_mp_mod);
  89515. ctx->state = 17;
  89516. break;
  89517. case 17:
  89518. sp_384_mont_sqr_12(ctx->x, ctx->t4, p384_mod, p384_mp_mod);
  89519. ctx->state = 18;
  89520. break;
  89521. case 18:
  89522. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t5, p384_mod);
  89523. ctx->state = 19;
  89524. break;
  89525. case 19:
  89526. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t3, p384_mod, p384_mp_mod);
  89527. ctx->state = 20;
  89528. break;
  89529. case 20:
  89530. sp_384_mont_dbl_12(ctx->t3, ctx->y, p384_mod);
  89531. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t3, p384_mod);
  89532. ctx->state = 21;
  89533. break;
  89534. case 21:
  89535. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  89536. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod);
  89537. ctx->state = 22;
  89538. break;
  89539. case 22:
  89540. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t4, p384_mod, p384_mp_mod);
  89541. ctx->state = 23;
  89542. break;
  89543. case 23:
  89544. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t5, p384_mod);
  89545. ctx->state = 24;
  89546. break;
  89547. case 24:
  89548. {
  89549. {
  89550. int i;
  89551. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  89552. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  89553. sp_digit maskt = ~(maskp | maskq);
  89554. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  89555. for (i = 0; i < 12; i++) {
  89556. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  89557. (ctx->x[i] & maskt);
  89558. }
  89559. for (i = 0; i < 12; i++) {
  89560. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  89561. (ctx->y[i] & maskt);
  89562. }
  89563. for (i = 0; i < 12; i++) {
  89564. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  89565. (ctx->z[i] & maskt);
  89566. }
  89567. r->z[0] |= inf;
  89568. r->infinity = (int)inf;
  89569. }
  89570. ctx->state = 25;
  89571. break;
  89572. }
  89573. case 25:
  89574. err = MP_OKAY;
  89575. break;
  89576. }
  89577. if (err == MP_OKAY && ctx->state != 25) {
  89578. err = FP_WOULDBLOCK;
  89579. }
  89580. return err;
  89581. }
  89582. #endif /* WOLFSSL_SP_NONBLOCK */
  89583. #ifndef WC_NO_CACHE_RESISTANT
  89584. /* Touch each possible point that could be being copied.
  89585. *
  89586. * r Point to copy into.
  89587. * table Table - start of the entries to access
  89588. * idx Index of entry to retrieve.
  89589. */
  89590. static void sp_384_get_point_16_12(sp_point_384* r, const sp_point_384* table,
  89591. int idx)
  89592. {
  89593. int i;
  89594. sp_digit mask;
  89595. r->x[0] = 0;
  89596. r->x[1] = 0;
  89597. r->x[2] = 0;
  89598. r->x[3] = 0;
  89599. r->x[4] = 0;
  89600. r->x[5] = 0;
  89601. r->x[6] = 0;
  89602. r->x[7] = 0;
  89603. r->x[8] = 0;
  89604. r->x[9] = 0;
  89605. r->x[10] = 0;
  89606. r->x[11] = 0;
  89607. r->y[0] = 0;
  89608. r->y[1] = 0;
  89609. r->y[2] = 0;
  89610. r->y[3] = 0;
  89611. r->y[4] = 0;
  89612. r->y[5] = 0;
  89613. r->y[6] = 0;
  89614. r->y[7] = 0;
  89615. r->y[8] = 0;
  89616. r->y[9] = 0;
  89617. r->y[10] = 0;
  89618. r->y[11] = 0;
  89619. r->z[0] = 0;
  89620. r->z[1] = 0;
  89621. r->z[2] = 0;
  89622. r->z[3] = 0;
  89623. r->z[4] = 0;
  89624. r->z[5] = 0;
  89625. r->z[6] = 0;
  89626. r->z[7] = 0;
  89627. r->z[8] = 0;
  89628. r->z[9] = 0;
  89629. r->z[10] = 0;
  89630. r->z[11] = 0;
  89631. for (i = 1; i < 16; i++) {
  89632. mask = (sp_digit)0 - (i == idx);
  89633. r->x[0] |= mask & table[i].x[0];
  89634. r->x[1] |= mask & table[i].x[1];
  89635. r->x[2] |= mask & table[i].x[2];
  89636. r->x[3] |= mask & table[i].x[3];
  89637. r->x[4] |= mask & table[i].x[4];
  89638. r->x[5] |= mask & table[i].x[5];
  89639. r->x[6] |= mask & table[i].x[6];
  89640. r->x[7] |= mask & table[i].x[7];
  89641. r->x[8] |= mask & table[i].x[8];
  89642. r->x[9] |= mask & table[i].x[9];
  89643. r->x[10] |= mask & table[i].x[10];
  89644. r->x[11] |= mask & table[i].x[11];
  89645. r->y[0] |= mask & table[i].y[0];
  89646. r->y[1] |= mask & table[i].y[1];
  89647. r->y[2] |= mask & table[i].y[2];
  89648. r->y[3] |= mask & table[i].y[3];
  89649. r->y[4] |= mask & table[i].y[4];
  89650. r->y[5] |= mask & table[i].y[5];
  89651. r->y[6] |= mask & table[i].y[6];
  89652. r->y[7] |= mask & table[i].y[7];
  89653. r->y[8] |= mask & table[i].y[8];
  89654. r->y[9] |= mask & table[i].y[9];
  89655. r->y[10] |= mask & table[i].y[10];
  89656. r->y[11] |= mask & table[i].y[11];
  89657. r->z[0] |= mask & table[i].z[0];
  89658. r->z[1] |= mask & table[i].z[1];
  89659. r->z[2] |= mask & table[i].z[2];
  89660. r->z[3] |= mask & table[i].z[3];
  89661. r->z[4] |= mask & table[i].z[4];
  89662. r->z[5] |= mask & table[i].z[5];
  89663. r->z[6] |= mask & table[i].z[6];
  89664. r->z[7] |= mask & table[i].z[7];
  89665. r->z[8] |= mask & table[i].z[8];
  89666. r->z[9] |= mask & table[i].z[9];
  89667. r->z[10] |= mask & table[i].z[10];
  89668. r->z[11] |= mask & table[i].z[11];
  89669. }
  89670. }
  89671. #endif /* !WC_NO_CACHE_RESISTANT */
  89672. /* Multiply the point by the scalar and return the result.
  89673. * If map is true then convert result to affine coordinates.
  89674. *
  89675. * Fast implementation that generates a pre-computation table.
  89676. * 4 bits of window (no sliding!).
  89677. * Uses add and double for calculating table.
  89678. * 384 doubles.
  89679. * 108 adds.
  89680. *
  89681. * r Resulting point.
  89682. * g Point to multiply.
  89683. * k Scalar to multiply by.
  89684. * map Indicates whether to convert result to affine.
  89685. * ct Constant time required.
  89686. * heap Heap to use for allocation.
  89687. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  89688. */
  89689. static int sp_384_ecc_mulmod_fast_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  89690. int map, int ct, void* heap)
  89691. {
  89692. #ifdef WOLFSSL_SP_SMALL_STACK
  89693. sp_point_384* t = NULL;
  89694. sp_digit* tmp = NULL;
  89695. #else
  89696. sp_point_384 t[16 + 1];
  89697. sp_digit tmp[2 * 12 * 6];
  89698. #endif
  89699. sp_point_384* rt = NULL;
  89700. #ifndef WC_NO_CACHE_RESISTANT
  89701. #ifdef WOLFSSL_SP_SMALL_STACK
  89702. sp_point_384* p = NULL;
  89703. #else
  89704. sp_point_384 p[1];
  89705. #endif
  89706. #endif /* !WC_NO_CACHE_RESISTANT */
  89707. sp_digit n;
  89708. int i;
  89709. int c;
  89710. int y;
  89711. int err = MP_OKAY;
  89712. /* Constant time used for cache attack resistance implementation. */
  89713. (void)ct;
  89714. (void)heap;
  89715. #ifdef WOLFSSL_SP_SMALL_STACK
  89716. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (16 + 1),
  89717. heap, DYNAMIC_TYPE_ECC);
  89718. if (t == NULL)
  89719. err = MEMORY_E;
  89720. #ifndef WC_NO_CACHE_RESISTANT
  89721. if (err == MP_OKAY) {
  89722. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384),
  89723. heap, DYNAMIC_TYPE_ECC);
  89724. if (p == NULL)
  89725. err = MEMORY_E;
  89726. }
  89727. #endif
  89728. if (err == MP_OKAY) {
  89729. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  89730. DYNAMIC_TYPE_ECC);
  89731. if (tmp == NULL)
  89732. err = MEMORY_E;
  89733. }
  89734. #endif
  89735. if (err == MP_OKAY) {
  89736. rt = t + 16;
  89737. /* t[0] = {0, 0, 1} * norm */
  89738. XMEMSET(&t[0], 0, sizeof(t[0]));
  89739. t[0].infinity = 1;
  89740. /* t[1] = {g->x, g->y, g->z} * norm */
  89741. (void)sp_384_mod_mul_norm_12(t[1].x, g->x, p384_mod);
  89742. (void)sp_384_mod_mul_norm_12(t[1].y, g->y, p384_mod);
  89743. (void)sp_384_mod_mul_norm_12(t[1].z, g->z, p384_mod);
  89744. t[1].infinity = 0;
  89745. sp_384_proj_point_dbl_12(&t[ 2], &t[ 1], tmp);
  89746. t[ 2].infinity = 0;
  89747. sp_384_proj_point_add_12(&t[ 3], &t[ 2], &t[ 1], tmp);
  89748. t[ 3].infinity = 0;
  89749. sp_384_proj_point_dbl_12(&t[ 4], &t[ 2], tmp);
  89750. t[ 4].infinity = 0;
  89751. sp_384_proj_point_add_12(&t[ 5], &t[ 3], &t[ 2], tmp);
  89752. t[ 5].infinity = 0;
  89753. sp_384_proj_point_dbl_12(&t[ 6], &t[ 3], tmp);
  89754. t[ 6].infinity = 0;
  89755. sp_384_proj_point_add_12(&t[ 7], &t[ 4], &t[ 3], tmp);
  89756. t[ 7].infinity = 0;
  89757. sp_384_proj_point_dbl_12(&t[ 8], &t[ 4], tmp);
  89758. t[ 8].infinity = 0;
  89759. sp_384_proj_point_add_12(&t[ 9], &t[ 5], &t[ 4], tmp);
  89760. t[ 9].infinity = 0;
  89761. sp_384_proj_point_dbl_12(&t[10], &t[ 5], tmp);
  89762. t[10].infinity = 0;
  89763. sp_384_proj_point_add_12(&t[11], &t[ 6], &t[ 5], tmp);
  89764. t[11].infinity = 0;
  89765. sp_384_proj_point_dbl_12(&t[12], &t[ 6], tmp);
  89766. t[12].infinity = 0;
  89767. sp_384_proj_point_add_12(&t[13], &t[ 7], &t[ 6], tmp);
  89768. t[13].infinity = 0;
  89769. sp_384_proj_point_dbl_12(&t[14], &t[ 7], tmp);
  89770. t[14].infinity = 0;
  89771. sp_384_proj_point_add_12(&t[15], &t[ 8], &t[ 7], tmp);
  89772. t[15].infinity = 0;
  89773. i = 10;
  89774. n = k[i+1] << 0;
  89775. c = 28;
  89776. y = (int)(n >> 28);
  89777. #ifndef WC_NO_CACHE_RESISTANT
  89778. if (ct) {
  89779. sp_384_get_point_16_12(rt, t, y);
  89780. rt->infinity = !y;
  89781. }
  89782. else
  89783. #endif
  89784. {
  89785. XMEMCPY(rt, &t[y], sizeof(sp_point_384));
  89786. }
  89787. n <<= 4;
  89788. for (; i>=0 || c>=4; ) {
  89789. if (c < 4) {
  89790. n |= k[i--];
  89791. c += 32;
  89792. }
  89793. y = (n >> 28) & 0xf;
  89794. n <<= 4;
  89795. c -= 4;
  89796. sp_384_proj_point_dbl_12(rt, rt, tmp);
  89797. sp_384_proj_point_dbl_12(rt, rt, tmp);
  89798. sp_384_proj_point_dbl_12(rt, rt, tmp);
  89799. sp_384_proj_point_dbl_12(rt, rt, tmp);
  89800. #ifndef WC_NO_CACHE_RESISTANT
  89801. if (ct) {
  89802. sp_384_get_point_16_12(p, t, y);
  89803. p->infinity = !y;
  89804. sp_384_proj_point_add_12(rt, rt, p, tmp);
  89805. }
  89806. else
  89807. #endif
  89808. {
  89809. sp_384_proj_point_add_12(rt, rt, &t[y], tmp);
  89810. }
  89811. }
  89812. if (map != 0) {
  89813. sp_384_map_12(r, rt, tmp);
  89814. }
  89815. else {
  89816. XMEMCPY(r, rt, sizeof(sp_point_384));
  89817. }
  89818. }
  89819. #ifdef WOLFSSL_SP_SMALL_STACK
  89820. if (tmp != NULL)
  89821. #endif
  89822. {
  89823. ForceZero(tmp, sizeof(sp_digit) * 2 * 12 * 6);
  89824. #ifdef WOLFSSL_SP_SMALL_STACK
  89825. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  89826. #endif
  89827. }
  89828. #ifndef WC_NO_CACHE_RESISTANT
  89829. #ifdef WOLFSSL_SP_SMALL_STACK
  89830. if (p != NULL)
  89831. #endif
  89832. {
  89833. ForceZero(p, sizeof(sp_point_384));
  89834. #ifdef WOLFSSL_SP_SMALL_STACK
  89835. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  89836. #endif
  89837. }
  89838. #endif /* !WC_NO_CACHE_RESISTANT */
  89839. #ifdef WOLFSSL_SP_SMALL_STACK
  89840. if (t != NULL)
  89841. #endif
  89842. {
  89843. ForceZero(t, sizeof(sp_point_384) * 17);
  89844. #ifdef WOLFSSL_SP_SMALL_STACK
  89845. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  89846. #endif
  89847. }
  89848. return err;
  89849. }
  89850. #ifdef FP_ECC
  89851. /* Double the Montgomery form projective point p a number of times.
  89852. *
  89853. * r Result of repeated doubling of point.
  89854. * p Point to double.
  89855. * n Number of times to double
  89856. * t Temporary ordinate data.
  89857. */
  89858. static void sp_384_proj_point_dbl_n_12(sp_point_384* p, int i,
  89859. sp_digit* t)
  89860. {
  89861. sp_digit* w = t;
  89862. sp_digit* a = t + 2*12;
  89863. sp_digit* b = t + 4*12;
  89864. sp_digit* t1 = t + 6*12;
  89865. sp_digit* t2 = t + 8*12;
  89866. sp_digit* x;
  89867. sp_digit* y;
  89868. sp_digit* z;
  89869. volatile int n = i;
  89870. x = p->x;
  89871. y = p->y;
  89872. z = p->z;
  89873. /* Y = 2*Y */
  89874. sp_384_mont_dbl_12(y, y, p384_mod);
  89875. /* W = Z^4 */
  89876. sp_384_mont_sqr_12(w, z, p384_mod, p384_mp_mod);
  89877. sp_384_mont_sqr_12(w, w, p384_mod, p384_mp_mod);
  89878. #ifndef WOLFSSL_SP_SMALL
  89879. while (--n > 0)
  89880. #else
  89881. while (--n >= 0)
  89882. #endif
  89883. {
  89884. /* A = 3*(X^2 - W) */
  89885. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  89886. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  89887. sp_384_mont_tpl_12(a, t1, p384_mod);
  89888. /* B = X*Y^2 */
  89889. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  89890. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  89891. /* X = A^2 - 2B */
  89892. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  89893. sp_384_mont_dbl_12(t2, b, p384_mod);
  89894. sp_384_mont_sub_12(x, x, t2, p384_mod);
  89895. /* B = 2.(B - X) */
  89896. sp_384_mont_sub_12(t2, b, x, p384_mod);
  89897. sp_384_mont_dbl_12(b, t2, p384_mod);
  89898. /* Z = Z*Y */
  89899. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  89900. /* t1 = Y^4 */
  89901. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  89902. #ifdef WOLFSSL_SP_SMALL
  89903. if (n != 0)
  89904. #endif
  89905. {
  89906. /* W = W*Y^4 */
  89907. sp_384_mont_mul_12(w, w, t1, p384_mod, p384_mp_mod);
  89908. }
  89909. /* y = 2*A*(B - X) - Y^4 */
  89910. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  89911. sp_384_mont_sub_12(y, y, t1, p384_mod);
  89912. }
  89913. #ifndef WOLFSSL_SP_SMALL
  89914. /* A = 3*(X^2 - W) */
  89915. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  89916. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  89917. sp_384_mont_tpl_12(a, t1, p384_mod);
  89918. /* B = X*Y^2 */
  89919. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  89920. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  89921. /* X = A^2 - 2B */
  89922. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  89923. sp_384_mont_dbl_12(t2, b, p384_mod);
  89924. sp_384_mont_sub_12(x, x, t2, p384_mod);
  89925. /* B = 2.(B - X) */
  89926. sp_384_mont_sub_12(t2, b, x, p384_mod);
  89927. sp_384_mont_dbl_12(b, t2, p384_mod);
  89928. /* Z = Z*Y */
  89929. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  89930. /* t1 = Y^4 */
  89931. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  89932. /* y = 2*A*(B - X) - Y^4 */
  89933. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  89934. sp_384_mont_sub_12(y, y, t1, p384_mod);
  89935. #endif /* WOLFSSL_SP_SMALL */
  89936. /* Y = Y/2 */
  89937. sp_384_mont_div2_12(y, y, p384_mod);
  89938. }
  89939. /* Convert the projective point to affine.
  89940. * Ordinates are in Montgomery form.
  89941. *
  89942. * a Point to convert.
  89943. * t Temporary data.
  89944. */
  89945. static void sp_384_proj_to_affine_12(sp_point_384* a, sp_digit* t)
  89946. {
  89947. sp_digit* t1 = t;
  89948. sp_digit* t2 = t + 2 * 12;
  89949. sp_digit* tmp = t + 4 * 12;
  89950. sp_384_mont_inv_12(t1, a->z, tmp);
  89951. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  89952. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  89953. sp_384_mont_mul_12(a->x, a->x, t2, p384_mod, p384_mp_mod);
  89954. sp_384_mont_mul_12(a->y, a->y, t1, p384_mod, p384_mp_mod);
  89955. XMEMCPY(a->z, p384_norm_mod, sizeof(p384_norm_mod));
  89956. }
  89957. #endif /* FP_ECC */
  89958. /* A table entry for pre-computed points. */
  89959. typedef struct sp_table_entry_384 {
  89960. sp_digit x[12];
  89961. sp_digit y[12];
  89962. } sp_table_entry_384;
  89963. #ifdef FP_ECC
  89964. #endif /* FP_ECC */
  89965. /* Add two Montgomery form projective points. The second point has a q value of
  89966. * one.
  89967. * Only the first point can be the same pointer as the result point.
  89968. *
  89969. * r Result of addition.
  89970. * p First point to add.
  89971. * q Second point to add.
  89972. * t Temporary ordinate data.
  89973. */
  89974. static void sp_384_proj_point_add_qz1_12(sp_point_384* r,
  89975. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  89976. {
  89977. sp_digit* t2 = t;
  89978. sp_digit* t3 = t + 2*12;
  89979. sp_digit* t6 = t + 4*12;
  89980. sp_digit* t1 = t + 6*12;
  89981. sp_digit* t4 = t + 8*12;
  89982. sp_digit* t5 = t + 10*12;
  89983. /* Calculate values to subtract from P->x and P->y. */
  89984. /* U2 = X2*Z1^2 */
  89985. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  89986. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  89987. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  89988. /* S2 = Y2*Z1^3 */
  89989. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  89990. if ((~p->infinity) & (~q->infinity) &
  89991. sp_384_cmp_equal_12(p->x, t2) &
  89992. sp_384_cmp_equal_12(p->y, t4)) {
  89993. sp_384_proj_point_dbl_12(r, p, t);
  89994. }
  89995. else {
  89996. sp_digit* x = t2;
  89997. sp_digit* y = t3;
  89998. sp_digit* z = t6;
  89999. /* H = U2 - X1 */
  90000. sp_384_mont_sub_12(t2, t2, p->x, p384_mod);
  90001. /* R = S2 - Y1 */
  90002. sp_384_mont_sub_12(t4, t4, p->y, p384_mod);
  90003. /* Z3 = H*Z1 */
  90004. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  90005. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  90006. sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod);
  90007. sp_384_mont_mul_12(t3, p->x, t1, p384_mod, p384_mp_mod);
  90008. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  90009. sp_384_mont_sqr_12(t2, t4, p384_mod, p384_mp_mod);
  90010. sp_384_mont_sub_12(t2, t2, t1, p384_mod);
  90011. sp_384_mont_dbl_12(t5, t3, p384_mod);
  90012. sp_384_mont_sub_12(x, t2, t5, p384_mod);
  90013. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  90014. sp_384_mont_sub_12(t3, t3, x, p384_mod);
  90015. sp_384_mont_mul_12(t3, t3, t4, p384_mod, p384_mp_mod);
  90016. sp_384_mont_mul_12(t1, t1, p->y, p384_mod, p384_mp_mod);
  90017. sp_384_mont_sub_12(y, t3, t1, p384_mod);
  90018. {
  90019. int i;
  90020. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  90021. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  90022. sp_digit maskt = ~(maskp | maskq);
  90023. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  90024. for (i = 0; i < 12; i++) {
  90025. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  90026. (x[i] & maskt);
  90027. }
  90028. for (i = 0; i < 12; i++) {
  90029. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  90030. (y[i] & maskt);
  90031. }
  90032. for (i = 0; i < 12; i++) {
  90033. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  90034. (z[i] & maskt);
  90035. }
  90036. r->z[0] |= inf;
  90037. r->infinity = (int)inf;
  90038. }
  90039. }
  90040. }
  90041. #ifdef WOLFSSL_SP_SMALL
  90042. #ifdef FP_ECC
  90043. /* Generate the pre-computed table of points for the base point.
  90044. *
  90045. * width = 4
  90046. * 16 entries
  90047. * 96 bits between
  90048. *
  90049. * a The base point.
  90050. * table Place to store generated point data.
  90051. * tmp Temporary data.
  90052. * heap Heap to use for allocation.
  90053. */
  90054. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  90055. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  90056. {
  90057. #ifdef WOLFSSL_SP_SMALL_STACK
  90058. sp_point_384* t = NULL;
  90059. #else
  90060. sp_point_384 t[3];
  90061. #endif
  90062. sp_point_384* s1 = NULL;
  90063. sp_point_384* s2 = NULL;
  90064. int i;
  90065. int j;
  90066. int err = MP_OKAY;
  90067. (void)heap;
  90068. #ifdef WOLFSSL_SP_SMALL_STACK
  90069. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  90070. DYNAMIC_TYPE_ECC);
  90071. if (t == NULL)
  90072. err = MEMORY_E;
  90073. #endif
  90074. if (err == MP_OKAY) {
  90075. s1 = t + 1;
  90076. s2 = t + 2;
  90077. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  90078. }
  90079. if (err == MP_OKAY) {
  90080. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  90081. }
  90082. if (err == MP_OKAY) {
  90083. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  90084. }
  90085. if (err == MP_OKAY) {
  90086. t->infinity = 0;
  90087. sp_384_proj_to_affine_12(t, tmp);
  90088. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  90089. s1->infinity = 0;
  90090. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  90091. s2->infinity = 0;
  90092. /* table[0] = {0, 0, infinity} */
  90093. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  90094. /* table[1] = Affine version of 'a' in Montgomery form */
  90095. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  90096. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  90097. for (i=1; i<4; i++) {
  90098. sp_384_proj_point_dbl_n_12(t, 96, tmp);
  90099. sp_384_proj_to_affine_12(t, tmp);
  90100. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  90101. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  90102. }
  90103. for (i=1; i<4; i++) {
  90104. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  90105. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  90106. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  90107. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  90108. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  90109. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  90110. sp_384_proj_to_affine_12(t, tmp);
  90111. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  90112. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  90113. }
  90114. }
  90115. }
  90116. #ifdef WOLFSSL_SP_SMALL_STACK
  90117. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  90118. #endif
  90119. return err;
  90120. }
  90121. #endif /* FP_ECC */
  90122. #ifndef WC_NO_CACHE_RESISTANT
  90123. /* Touch each possible entry that could be being copied.
  90124. *
  90125. * r Point to copy into.
  90126. * table Table - start of the entries to access
  90127. * idx Index of entry to retrieve.
  90128. */
  90129. static void sp_384_get_entry_16_12(sp_point_384* r,
  90130. const sp_table_entry_384* table, int idx)
  90131. {
  90132. int i;
  90133. sp_digit mask;
  90134. r->x[0] = 0;
  90135. r->x[1] = 0;
  90136. r->x[2] = 0;
  90137. r->x[3] = 0;
  90138. r->x[4] = 0;
  90139. r->x[5] = 0;
  90140. r->x[6] = 0;
  90141. r->x[7] = 0;
  90142. r->x[8] = 0;
  90143. r->x[9] = 0;
  90144. r->x[10] = 0;
  90145. r->x[11] = 0;
  90146. r->y[0] = 0;
  90147. r->y[1] = 0;
  90148. r->y[2] = 0;
  90149. r->y[3] = 0;
  90150. r->y[4] = 0;
  90151. r->y[5] = 0;
  90152. r->y[6] = 0;
  90153. r->y[7] = 0;
  90154. r->y[8] = 0;
  90155. r->y[9] = 0;
  90156. r->y[10] = 0;
  90157. r->y[11] = 0;
  90158. for (i = 1; i < 16; i++) {
  90159. mask = (sp_digit)0 - (i == idx);
  90160. r->x[0] |= mask & table[i].x[0];
  90161. r->x[1] |= mask & table[i].x[1];
  90162. r->x[2] |= mask & table[i].x[2];
  90163. r->x[3] |= mask & table[i].x[3];
  90164. r->x[4] |= mask & table[i].x[4];
  90165. r->x[5] |= mask & table[i].x[5];
  90166. r->x[6] |= mask & table[i].x[6];
  90167. r->x[7] |= mask & table[i].x[7];
  90168. r->x[8] |= mask & table[i].x[8];
  90169. r->x[9] |= mask & table[i].x[9];
  90170. r->x[10] |= mask & table[i].x[10];
  90171. r->x[11] |= mask & table[i].x[11];
  90172. r->y[0] |= mask & table[i].y[0];
  90173. r->y[1] |= mask & table[i].y[1];
  90174. r->y[2] |= mask & table[i].y[2];
  90175. r->y[3] |= mask & table[i].y[3];
  90176. r->y[4] |= mask & table[i].y[4];
  90177. r->y[5] |= mask & table[i].y[5];
  90178. r->y[6] |= mask & table[i].y[6];
  90179. r->y[7] |= mask & table[i].y[7];
  90180. r->y[8] |= mask & table[i].y[8];
  90181. r->y[9] |= mask & table[i].y[9];
  90182. r->y[10] |= mask & table[i].y[10];
  90183. r->y[11] |= mask & table[i].y[11];
  90184. }
  90185. }
  90186. #endif /* !WC_NO_CACHE_RESISTANT */
  90187. /* Multiply the point by the scalar and return the result.
  90188. * If map is true then convert result to affine coordinates.
  90189. *
  90190. * Stripe implementation.
  90191. * Pre-generated: 2^0, 2^96, ...
  90192. * Pre-generated: products of all combinations of above.
  90193. * 4 doubles and adds (with qz=1)
  90194. *
  90195. * r Resulting point.
  90196. * k Scalar to multiply by.
  90197. * table Pre-computed table.
  90198. * map Indicates whether to convert result to affine.
  90199. * ct Constant time required.
  90200. * heap Heap to use for allocation.
  90201. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90202. */
  90203. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  90204. const sp_table_entry_384* table, const sp_digit* k, int map,
  90205. int ct, void* heap)
  90206. {
  90207. #ifdef WOLFSSL_SP_SMALL_STACK
  90208. sp_point_384* rt = NULL;
  90209. sp_digit* t = NULL;
  90210. #else
  90211. sp_point_384 rt[2];
  90212. sp_digit t[2 * 12 * 6];
  90213. #endif
  90214. sp_point_384* p = NULL;
  90215. int i;
  90216. int j;
  90217. int y;
  90218. int x;
  90219. int err = MP_OKAY;
  90220. (void)g;
  90221. /* Constant time used for cache attack resistance implementation. */
  90222. (void)ct;
  90223. (void)heap;
  90224. #ifdef WOLFSSL_SP_SMALL_STACK
  90225. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  90226. DYNAMIC_TYPE_ECC);
  90227. if (rt == NULL)
  90228. err = MEMORY_E;
  90229. if (err == MP_OKAY) {
  90230. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  90231. DYNAMIC_TYPE_ECC);
  90232. if (t == NULL)
  90233. err = MEMORY_E;
  90234. }
  90235. #endif
  90236. if (err == MP_OKAY) {
  90237. p = rt + 1;
  90238. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  90239. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  90240. y = 0;
  90241. x = 95;
  90242. for (j=0; j<4; j++) {
  90243. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  90244. x += 96;
  90245. }
  90246. #ifndef WC_NO_CACHE_RESISTANT
  90247. if (ct) {
  90248. sp_384_get_entry_16_12(rt, table, y);
  90249. } else
  90250. #endif
  90251. {
  90252. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  90253. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  90254. }
  90255. rt->infinity = !y;
  90256. for (i=94; i>=0; i--) {
  90257. y = 0;
  90258. x = i;
  90259. for (j=0; j<4; j++) {
  90260. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  90261. x += 96;
  90262. }
  90263. sp_384_proj_point_dbl_12(rt, rt, t);
  90264. #ifndef WC_NO_CACHE_RESISTANT
  90265. if (ct) {
  90266. sp_384_get_entry_16_12(p, table, y);
  90267. }
  90268. else
  90269. #endif
  90270. {
  90271. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  90272. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  90273. }
  90274. p->infinity = !y;
  90275. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  90276. }
  90277. if (map != 0) {
  90278. sp_384_map_12(r, rt, t);
  90279. }
  90280. else {
  90281. XMEMCPY(r, rt, sizeof(sp_point_384));
  90282. }
  90283. }
  90284. #ifdef WOLFSSL_SP_SMALL_STACK
  90285. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  90286. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  90287. #endif
  90288. return err;
  90289. }
  90290. #ifdef FP_ECC
  90291. #ifndef FP_ENTRIES
  90292. #define FP_ENTRIES 16
  90293. #endif
  90294. /* Cache entry - holds precomputation tables for a point. */
  90295. typedef struct sp_cache_384_t {
  90296. /* X ordinate of point that table was generated from. */
  90297. sp_digit x[12];
  90298. /* Y ordinate of point that table was generated from. */
  90299. sp_digit y[12];
  90300. /* Precomputation table for point. */
  90301. sp_table_entry_384 table[16];
  90302. /* Count of entries in table. */
  90303. uint32_t cnt;
  90304. /* Point and table set in entry. */
  90305. int set;
  90306. } sp_cache_384_t;
  90307. /* Cache of tables. */
  90308. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  90309. /* Index of last entry in cache. */
  90310. static THREAD_LS_T int sp_cache_384_last = -1;
  90311. /* Cache has been initialized. */
  90312. static THREAD_LS_T int sp_cache_384_inited = 0;
  90313. #ifndef HAVE_THREAD_LS
  90314. #ifndef WOLFSSL_MUTEX_INITIALIZER
  90315. static volatile int initCacheMutex_384 = 0;
  90316. #endif
  90317. static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock);
  90318. #endif
  90319. /* Get the cache entry for the point.
  90320. *
  90321. * g [in] Point scalar multiplying.
  90322. * cache [out] Cache table to use.
  90323. */
  90324. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  90325. {
  90326. int i;
  90327. int j;
  90328. uint32_t least;
  90329. if (sp_cache_384_inited == 0) {
  90330. for (i=0; i<FP_ENTRIES; i++) {
  90331. sp_cache_384[i].set = 0;
  90332. }
  90333. sp_cache_384_inited = 1;
  90334. }
  90335. /* Compare point with those in cache. */
  90336. for (i=0; i<FP_ENTRIES; i++) {
  90337. if (!sp_cache_384[i].set)
  90338. continue;
  90339. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  90340. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  90341. sp_cache_384[i].cnt++;
  90342. break;
  90343. }
  90344. }
  90345. /* No match. */
  90346. if (i == FP_ENTRIES) {
  90347. /* Find empty entry. */
  90348. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  90349. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  90350. if (!sp_cache_384[i].set) {
  90351. break;
  90352. }
  90353. }
  90354. /* Evict least used. */
  90355. if (i == sp_cache_384_last) {
  90356. least = sp_cache_384[0].cnt;
  90357. for (j=1; j<FP_ENTRIES; j++) {
  90358. if (sp_cache_384[j].cnt < least) {
  90359. i = j;
  90360. least = sp_cache_384[i].cnt;
  90361. }
  90362. }
  90363. }
  90364. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  90365. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  90366. sp_cache_384[i].set = 1;
  90367. sp_cache_384[i].cnt = 1;
  90368. }
  90369. *cache = &sp_cache_384[i];
  90370. sp_cache_384_last = i;
  90371. }
  90372. #endif /* FP_ECC */
  90373. /* Multiply the base point of P384 by the scalar and return the result.
  90374. * If map is true then convert result to affine coordinates.
  90375. *
  90376. * r Resulting point.
  90377. * g Point to multiply.
  90378. * k Scalar to multiply by.
  90379. * map Indicates whether to convert result to affine.
  90380. * ct Constant time required.
  90381. * heap Heap to use for allocation.
  90382. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90383. */
  90384. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g,
  90385. const sp_digit* k, int map, int ct, void* heap)
  90386. {
  90387. #ifndef FP_ECC
  90388. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  90389. #else
  90390. #ifdef WOLFSSL_SP_SMALL_STACK
  90391. sp_digit* tmp;
  90392. #else
  90393. sp_digit tmp[2 * 12 * 7];
  90394. #endif
  90395. sp_cache_384_t* cache;
  90396. int err = MP_OKAY;
  90397. #ifdef WOLFSSL_SP_SMALL_STACK
  90398. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 7, heap, DYNAMIC_TYPE_ECC);
  90399. if (tmp == NULL) {
  90400. err = MEMORY_E;
  90401. }
  90402. #endif
  90403. #ifndef HAVE_THREAD_LS
  90404. if (err == MP_OKAY) {
  90405. #ifndef WOLFSSL_MUTEX_INITIALIZER
  90406. if (initCacheMutex_384 == 0) {
  90407. wc_InitMutex(&sp_cache_384_lock);
  90408. initCacheMutex_384 = 1;
  90409. }
  90410. #endif
  90411. if (wc_LockMutex(&sp_cache_384_lock) != 0) {
  90412. err = BAD_MUTEX_E;
  90413. }
  90414. }
  90415. #endif /* HAVE_THREAD_LS */
  90416. if (err == MP_OKAY) {
  90417. sp_ecc_get_cache_384(g, &cache);
  90418. if (cache->cnt == 2)
  90419. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  90420. #ifndef HAVE_THREAD_LS
  90421. wc_UnLockMutex(&sp_cache_384_lock);
  90422. #endif /* HAVE_THREAD_LS */
  90423. if (cache->cnt < 2) {
  90424. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  90425. }
  90426. else {
  90427. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  90428. map, ct, heap);
  90429. }
  90430. }
  90431. #ifdef WOLFSSL_SP_SMALL_STACK
  90432. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  90433. #endif
  90434. return err;
  90435. #endif
  90436. }
  90437. #else
  90438. #ifdef FP_ECC
  90439. /* Generate the pre-computed table of points for the base point.
  90440. *
  90441. * width = 8
  90442. * 256 entries
  90443. * 48 bits between
  90444. *
  90445. * a The base point.
  90446. * table Place to store generated point data.
  90447. * tmp Temporary data.
  90448. * heap Heap to use for allocation.
  90449. */
  90450. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  90451. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  90452. {
  90453. #ifdef WOLFSSL_SP_SMALL_STACK
  90454. sp_point_384* t = NULL;
  90455. #else
  90456. sp_point_384 t[3];
  90457. #endif
  90458. sp_point_384* s1 = NULL;
  90459. sp_point_384* s2 = NULL;
  90460. int i;
  90461. int j;
  90462. int err = MP_OKAY;
  90463. (void)heap;
  90464. #ifdef WOLFSSL_SP_SMALL_STACK
  90465. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  90466. DYNAMIC_TYPE_ECC);
  90467. if (t == NULL)
  90468. err = MEMORY_E;
  90469. #endif
  90470. if (err == MP_OKAY) {
  90471. s1 = t + 1;
  90472. s2 = t + 2;
  90473. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  90474. }
  90475. if (err == MP_OKAY) {
  90476. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  90477. }
  90478. if (err == MP_OKAY) {
  90479. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  90480. }
  90481. if (err == MP_OKAY) {
  90482. t->infinity = 0;
  90483. sp_384_proj_to_affine_12(t, tmp);
  90484. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  90485. s1->infinity = 0;
  90486. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  90487. s2->infinity = 0;
  90488. /* table[0] = {0, 0, infinity} */
  90489. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  90490. /* table[1] = Affine version of 'a' in Montgomery form */
  90491. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  90492. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  90493. for (i=1; i<8; i++) {
  90494. sp_384_proj_point_dbl_n_12(t, 48, tmp);
  90495. sp_384_proj_to_affine_12(t, tmp);
  90496. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  90497. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  90498. }
  90499. for (i=1; i<8; i++) {
  90500. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  90501. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  90502. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  90503. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  90504. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  90505. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  90506. sp_384_proj_to_affine_12(t, tmp);
  90507. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  90508. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  90509. }
  90510. }
  90511. }
  90512. #ifdef WOLFSSL_SP_SMALL_STACK
  90513. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  90514. #endif
  90515. return err;
  90516. }
  90517. #endif /* FP_ECC */
  90518. #ifndef WC_NO_CACHE_RESISTANT
  90519. /* Touch each possible entry that could be being copied.
  90520. *
  90521. * r Point to copy into.
  90522. * table Table - start of the entries to access
  90523. * idx Index of entry to retrieve.
  90524. */
  90525. static void sp_384_get_entry_256_12(sp_point_384* r,
  90526. const sp_table_entry_384* table, int idx)
  90527. {
  90528. int i;
  90529. sp_digit mask;
  90530. r->x[0] = 0;
  90531. r->x[1] = 0;
  90532. r->x[2] = 0;
  90533. r->x[3] = 0;
  90534. r->x[4] = 0;
  90535. r->x[5] = 0;
  90536. r->x[6] = 0;
  90537. r->x[7] = 0;
  90538. r->x[8] = 0;
  90539. r->x[9] = 0;
  90540. r->x[10] = 0;
  90541. r->x[11] = 0;
  90542. r->y[0] = 0;
  90543. r->y[1] = 0;
  90544. r->y[2] = 0;
  90545. r->y[3] = 0;
  90546. r->y[4] = 0;
  90547. r->y[5] = 0;
  90548. r->y[6] = 0;
  90549. r->y[7] = 0;
  90550. r->y[8] = 0;
  90551. r->y[9] = 0;
  90552. r->y[10] = 0;
  90553. r->y[11] = 0;
  90554. for (i = 1; i < 256; i++) {
  90555. mask = (sp_digit)0 - (i == idx);
  90556. r->x[0] |= mask & table[i].x[0];
  90557. r->x[1] |= mask & table[i].x[1];
  90558. r->x[2] |= mask & table[i].x[2];
  90559. r->x[3] |= mask & table[i].x[3];
  90560. r->x[4] |= mask & table[i].x[4];
  90561. r->x[5] |= mask & table[i].x[5];
  90562. r->x[6] |= mask & table[i].x[6];
  90563. r->x[7] |= mask & table[i].x[7];
  90564. r->x[8] |= mask & table[i].x[8];
  90565. r->x[9] |= mask & table[i].x[9];
  90566. r->x[10] |= mask & table[i].x[10];
  90567. r->x[11] |= mask & table[i].x[11];
  90568. r->y[0] |= mask & table[i].y[0];
  90569. r->y[1] |= mask & table[i].y[1];
  90570. r->y[2] |= mask & table[i].y[2];
  90571. r->y[3] |= mask & table[i].y[3];
  90572. r->y[4] |= mask & table[i].y[4];
  90573. r->y[5] |= mask & table[i].y[5];
  90574. r->y[6] |= mask & table[i].y[6];
  90575. r->y[7] |= mask & table[i].y[7];
  90576. r->y[8] |= mask & table[i].y[8];
  90577. r->y[9] |= mask & table[i].y[9];
  90578. r->y[10] |= mask & table[i].y[10];
  90579. r->y[11] |= mask & table[i].y[11];
  90580. }
  90581. }
  90582. #endif /* !WC_NO_CACHE_RESISTANT */
  90583. /* Multiply the point by the scalar and return the result.
  90584. * If map is true then convert result to affine coordinates.
  90585. *
  90586. * Stripe implementation.
  90587. * Pre-generated: 2^0, 2^48, ...
  90588. * Pre-generated: products of all combinations of above.
  90589. * 8 doubles and adds (with qz=1)
  90590. *
  90591. * r Resulting point.
  90592. * k Scalar to multiply by.
  90593. * table Pre-computed table.
  90594. * map Indicates whether to convert result to affine.
  90595. * ct Constant time required.
  90596. * heap Heap to use for allocation.
  90597. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90598. */
  90599. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  90600. const sp_table_entry_384* table, const sp_digit* k, int map,
  90601. int ct, void* heap)
  90602. {
  90603. #ifdef WOLFSSL_SP_SMALL_STACK
  90604. sp_point_384* rt = NULL;
  90605. sp_digit* t = NULL;
  90606. #else
  90607. sp_point_384 rt[2];
  90608. sp_digit t[2 * 12 * 6];
  90609. #endif
  90610. sp_point_384* p = NULL;
  90611. int i;
  90612. int j;
  90613. int y;
  90614. int x;
  90615. int err = MP_OKAY;
  90616. (void)g;
  90617. /* Constant time used for cache attack resistance implementation. */
  90618. (void)ct;
  90619. (void)heap;
  90620. #ifdef WOLFSSL_SP_SMALL_STACK
  90621. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  90622. DYNAMIC_TYPE_ECC);
  90623. if (rt == NULL)
  90624. err = MEMORY_E;
  90625. if (err == MP_OKAY) {
  90626. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  90627. DYNAMIC_TYPE_ECC);
  90628. if (t == NULL)
  90629. err = MEMORY_E;
  90630. }
  90631. #endif
  90632. if (err == MP_OKAY) {
  90633. p = rt + 1;
  90634. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  90635. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  90636. y = 0;
  90637. x = 47;
  90638. for (j=0; j<8; j++) {
  90639. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  90640. x += 48;
  90641. }
  90642. #ifndef WC_NO_CACHE_RESISTANT
  90643. if (ct) {
  90644. sp_384_get_entry_256_12(rt, table, y);
  90645. } else
  90646. #endif
  90647. {
  90648. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  90649. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  90650. }
  90651. rt->infinity = !y;
  90652. for (i=46; i>=0; i--) {
  90653. y = 0;
  90654. x = i;
  90655. for (j=0; j<8; j++) {
  90656. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  90657. x += 48;
  90658. }
  90659. sp_384_proj_point_dbl_12(rt, rt, t);
  90660. #ifndef WC_NO_CACHE_RESISTANT
  90661. if (ct) {
  90662. sp_384_get_entry_256_12(p, table, y);
  90663. }
  90664. else
  90665. #endif
  90666. {
  90667. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  90668. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  90669. }
  90670. p->infinity = !y;
  90671. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  90672. }
  90673. if (map != 0) {
  90674. sp_384_map_12(r, rt, t);
  90675. }
  90676. else {
  90677. XMEMCPY(r, rt, sizeof(sp_point_384));
  90678. }
  90679. }
  90680. #ifdef WOLFSSL_SP_SMALL_STACK
  90681. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  90682. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  90683. #endif
  90684. return err;
  90685. }
  90686. #ifdef FP_ECC
  90687. #ifndef FP_ENTRIES
  90688. #define FP_ENTRIES 16
  90689. #endif
  90690. /* Cache entry - holds precomputation tables for a point. */
  90691. typedef struct sp_cache_384_t {
  90692. /* X ordinate of point that table was generated from. */
  90693. sp_digit x[12];
  90694. /* Y ordinate of point that table was generated from. */
  90695. sp_digit y[12];
  90696. /* Precomputation table for point. */
  90697. sp_table_entry_384 table[256];
  90698. /* Count of entries in table. */
  90699. uint32_t cnt;
  90700. /* Point and table set in entry. */
  90701. int set;
  90702. } sp_cache_384_t;
  90703. /* Cache of tables. */
  90704. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  90705. /* Index of last entry in cache. */
  90706. static THREAD_LS_T int sp_cache_384_last = -1;
  90707. /* Cache has been initialized. */
  90708. static THREAD_LS_T int sp_cache_384_inited = 0;
  90709. #ifndef HAVE_THREAD_LS
  90710. #ifndef WOLFSSL_MUTEX_INITIALIZER
  90711. static volatile int initCacheMutex_384 = 0;
  90712. #endif
  90713. static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock);
  90714. #endif
  90715. /* Get the cache entry for the point.
  90716. *
  90717. * g [in] Point scalar multiplying.
  90718. * cache [out] Cache table to use.
  90719. */
  90720. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  90721. {
  90722. int i;
  90723. int j;
  90724. uint32_t least;
  90725. if (sp_cache_384_inited == 0) {
  90726. for (i=0; i<FP_ENTRIES; i++) {
  90727. sp_cache_384[i].set = 0;
  90728. }
  90729. sp_cache_384_inited = 1;
  90730. }
  90731. /* Compare point with those in cache. */
  90732. for (i=0; i<FP_ENTRIES; i++) {
  90733. if (!sp_cache_384[i].set)
  90734. continue;
  90735. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  90736. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  90737. sp_cache_384[i].cnt++;
  90738. break;
  90739. }
  90740. }
  90741. /* No match. */
  90742. if (i == FP_ENTRIES) {
  90743. /* Find empty entry. */
  90744. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  90745. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  90746. if (!sp_cache_384[i].set) {
  90747. break;
  90748. }
  90749. }
  90750. /* Evict least used. */
  90751. if (i == sp_cache_384_last) {
  90752. least = sp_cache_384[0].cnt;
  90753. for (j=1; j<FP_ENTRIES; j++) {
  90754. if (sp_cache_384[j].cnt < least) {
  90755. i = j;
  90756. least = sp_cache_384[i].cnt;
  90757. }
  90758. }
  90759. }
  90760. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  90761. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  90762. sp_cache_384[i].set = 1;
  90763. sp_cache_384[i].cnt = 1;
  90764. }
  90765. *cache = &sp_cache_384[i];
  90766. sp_cache_384_last = i;
  90767. }
  90768. #endif /* FP_ECC */
  90769. /* Multiply the base point of P384 by the scalar and return the result.
  90770. * If map is true then convert result to affine coordinates.
  90771. *
  90772. * r Resulting point.
  90773. * g Point to multiply.
  90774. * k Scalar to multiply by.
  90775. * map Indicates whether to convert result to affine.
  90776. * ct Constant time required.
  90777. * heap Heap to use for allocation.
  90778. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90779. */
  90780. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g,
  90781. const sp_digit* k, int map, int ct, void* heap)
  90782. {
  90783. #ifndef FP_ECC
  90784. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  90785. #else
  90786. #ifdef WOLFSSL_SP_SMALL_STACK
  90787. sp_digit* tmp;
  90788. #else
  90789. sp_digit tmp[2 * 12 * 7];
  90790. #endif
  90791. sp_cache_384_t* cache;
  90792. int err = MP_OKAY;
  90793. #ifdef WOLFSSL_SP_SMALL_STACK
  90794. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 7, heap, DYNAMIC_TYPE_ECC);
  90795. if (tmp == NULL) {
  90796. err = MEMORY_E;
  90797. }
  90798. #endif
  90799. #ifndef HAVE_THREAD_LS
  90800. if (err == MP_OKAY) {
  90801. #ifndef WOLFSSL_MUTEX_INITIALIZER
  90802. if (initCacheMutex_384 == 0) {
  90803. wc_InitMutex(&sp_cache_384_lock);
  90804. initCacheMutex_384 = 1;
  90805. }
  90806. #endif
  90807. if (wc_LockMutex(&sp_cache_384_lock) != 0) {
  90808. err = BAD_MUTEX_E;
  90809. }
  90810. }
  90811. #endif /* HAVE_THREAD_LS */
  90812. if (err == MP_OKAY) {
  90813. sp_ecc_get_cache_384(g, &cache);
  90814. if (cache->cnt == 2)
  90815. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  90816. #ifndef HAVE_THREAD_LS
  90817. wc_UnLockMutex(&sp_cache_384_lock);
  90818. #endif /* HAVE_THREAD_LS */
  90819. if (cache->cnt < 2) {
  90820. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  90821. }
  90822. else {
  90823. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  90824. map, ct, heap);
  90825. }
  90826. }
  90827. #ifdef WOLFSSL_SP_SMALL_STACK
  90828. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  90829. #endif
  90830. return err;
  90831. #endif
  90832. }
  90833. #endif /* WOLFSSL_SP_SMALL */
  90834. /* Multiply the point by the scalar and return the result.
  90835. * If map is true then convert result to affine coordinates.
  90836. *
  90837. * km Scalar to multiply by.
  90838. * p Point to multiply.
  90839. * r Resulting point.
  90840. * map Indicates whether to convert result to affine.
  90841. * heap Heap to use for allocation.
  90842. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90843. */
  90844. int sp_ecc_mulmod_384(const mp_int* km, const ecc_point* gm, ecc_point* r,
  90845. int map, void* heap)
  90846. {
  90847. #ifdef WOLFSSL_SP_SMALL_STACK
  90848. sp_point_384* point = NULL;
  90849. sp_digit* k = NULL;
  90850. #else
  90851. sp_point_384 point[1];
  90852. sp_digit k[12];
  90853. #endif
  90854. int err = MP_OKAY;
  90855. #ifdef WOLFSSL_SP_SMALL_STACK
  90856. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  90857. DYNAMIC_TYPE_ECC);
  90858. if (point == NULL)
  90859. err = MEMORY_E;
  90860. if (err == MP_OKAY) {
  90861. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  90862. DYNAMIC_TYPE_ECC);
  90863. if (k == NULL)
  90864. err = MEMORY_E;
  90865. }
  90866. #endif
  90867. if (err == MP_OKAY) {
  90868. sp_384_from_mp(k, 12, km);
  90869. sp_384_point_from_ecc_point_12(point, gm);
  90870. err = sp_384_ecc_mulmod_12(point, point, k, map, 1, heap);
  90871. }
  90872. if (err == MP_OKAY) {
  90873. err = sp_384_point_to_ecc_point_12(point, r);
  90874. }
  90875. #ifdef WOLFSSL_SP_SMALL_STACK
  90876. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  90877. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  90878. #endif
  90879. return err;
  90880. }
  90881. /* Multiply the point by the scalar, add point a and return the result.
  90882. * If map is true then convert result to affine coordinates.
  90883. *
  90884. * km Scalar to multiply by.
  90885. * p Point to multiply.
  90886. * am Point to add to scalar multiply result.
  90887. * inMont Point to add is in montgomery form.
  90888. * r Resulting point.
  90889. * map Indicates whether to convert result to affine.
  90890. * heap Heap to use for allocation.
  90891. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90892. */
  90893. int sp_ecc_mulmod_add_384(const mp_int* km, const ecc_point* gm,
  90894. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  90895. {
  90896. #ifdef WOLFSSL_SP_SMALL_STACK
  90897. sp_point_384* point = NULL;
  90898. sp_digit* k = NULL;
  90899. #else
  90900. sp_point_384 point[2];
  90901. sp_digit k[12 + 12 * 2 * 6];
  90902. #endif
  90903. sp_point_384* addP = NULL;
  90904. sp_digit* tmp = NULL;
  90905. int err = MP_OKAY;
  90906. #ifdef WOLFSSL_SP_SMALL_STACK
  90907. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  90908. DYNAMIC_TYPE_ECC);
  90909. if (point == NULL)
  90910. err = MEMORY_E;
  90911. if (err == MP_OKAY) {
  90912. k = (sp_digit*)XMALLOC(
  90913. sizeof(sp_digit) * (12 + 12 * 2 * 6), heap,
  90914. DYNAMIC_TYPE_ECC);
  90915. if (k == NULL)
  90916. err = MEMORY_E;
  90917. }
  90918. #endif
  90919. if (err == MP_OKAY) {
  90920. addP = point + 1;
  90921. tmp = k + 12;
  90922. sp_384_from_mp(k, 12, km);
  90923. sp_384_point_from_ecc_point_12(point, gm);
  90924. sp_384_point_from_ecc_point_12(addP, am);
  90925. }
  90926. if ((err == MP_OKAY) && (!inMont)) {
  90927. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  90928. }
  90929. if ((err == MP_OKAY) && (!inMont)) {
  90930. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  90931. }
  90932. if ((err == MP_OKAY) && (!inMont)) {
  90933. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  90934. }
  90935. if (err == MP_OKAY) {
  90936. err = sp_384_ecc_mulmod_12(point, point, k, 0, 0, heap);
  90937. }
  90938. if (err == MP_OKAY) {
  90939. sp_384_proj_point_add_12(point, point, addP, tmp);
  90940. if (map) {
  90941. sp_384_map_12(point, point, tmp);
  90942. }
  90943. err = sp_384_point_to_ecc_point_12(point, r);
  90944. }
  90945. #ifdef WOLFSSL_SP_SMALL_STACK
  90946. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  90947. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  90948. #endif
  90949. return err;
  90950. }
  90951. #ifdef WOLFSSL_SP_SMALL
  90952. /* Striping precomputation table.
  90953. * 4 points combined into a table of 16 points.
  90954. * Distance of 96 between points.
  90955. */
  90956. static const sp_table_entry_384 p384_table[16] = {
  90957. /* 0 */
  90958. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  90959. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  90960. /* 1 */
  90961. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  90962. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  90963. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  90964. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  90965. /* 2 */
  90966. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  90967. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  90968. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  90969. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  90970. /* 3 */
  90971. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  90972. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  90973. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  90974. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  90975. /* 4 */
  90976. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  90977. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  90978. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  90979. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  90980. /* 5 */
  90981. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  90982. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  90983. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  90984. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  90985. /* 6 */
  90986. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  90987. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  90988. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  90989. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  90990. /* 7 */
  90991. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  90992. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  90993. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  90994. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  90995. /* 8 */
  90996. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  90997. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  90998. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  90999. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  91000. /* 9 */
  91001. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  91002. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  91003. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  91004. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  91005. /* 10 */
  91006. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  91007. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  91008. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  91009. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  91010. /* 11 */
  91011. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  91012. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  91013. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  91014. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  91015. /* 12 */
  91016. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  91017. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  91018. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  91019. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  91020. /* 13 */
  91021. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  91022. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  91023. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  91024. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  91025. /* 14 */
  91026. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  91027. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  91028. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  91029. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  91030. /* 15 */
  91031. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  91032. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  91033. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  91034. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  91035. };
  91036. /* Multiply the base point of P384 by the scalar and return the result.
  91037. * If map is true then convert result to affine coordinates.
  91038. *
  91039. * Stripe implementation.
  91040. * Pre-generated: 2^0, 2^96, ...
  91041. * Pre-generated: products of all combinations of above.
  91042. * 4 doubles and adds (with qz=1)
  91043. *
  91044. * r Resulting point.
  91045. * k Scalar to multiply by.
  91046. * map Indicates whether to convert result to affine.
  91047. * ct Constant time required.
  91048. * heap Heap to use for allocation.
  91049. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  91050. */
  91051. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  91052. int map, int ct, void* heap)
  91053. {
  91054. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  91055. k, map, ct, heap);
  91056. }
  91057. #else
  91058. /* Striping precomputation table.
  91059. * 8 points combined into a table of 256 points.
  91060. * Distance of 48 between points.
  91061. */
  91062. static const sp_table_entry_384 p384_table[256] = {
  91063. /* 0 */
  91064. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  91065. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  91066. /* 1 */
  91067. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  91068. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  91069. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  91070. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  91071. /* 2 */
  91072. { { 0x2b0c535b,0x29864753,0x70506296,0x90dd6953,0x216ab9ac,0x038cd6b4,
  91073. 0xbe12d76a,0x3df9b7b7,0x5f347bdb,0x13f4d978,0x13e94489,0x222c5c9c },
  91074. { 0x2680dc64,0x5f8e796f,0x58352417,0x120e7cb7,0xd10740b8,0x254b5d8a,
  91075. 0x5337dee6,0xc38b8efb,0x94f02247,0xf688c2e1,0x6c25bc4c,0x7b5c75f3 } },
  91076. /* 3 */
  91077. { { 0x9edffea5,0xe26a3cc3,0x37d7e9fc,0x35bbfd1c,0x9bde3ef6,0xf0e7700d,
  91078. 0x1a538f5a,0x0380eb47,0x05bf9eb3,0x2e9da8bb,0x1a460c3e,0xdbb93c73 },
  91079. { 0xf526b605,0x37dba260,0xfd785537,0x95d4978e,0xed72a04a,0x24ed793a,
  91080. 0x76005b1a,0x26948377,0x9e681f82,0x99f557b9,0xd64954ef,0xae5f9557 } },
  91081. /* 4 */
  91082. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  91083. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  91084. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  91085. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  91086. /* 5 */
  91087. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  91088. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  91089. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  91090. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  91091. /* 6 */
  91092. { { 0x4fc52870,0x28f9c07a,0x1a53a961,0xce0b3748,0x0e1828d9,0xd550fa18,
  91093. 0x6adb225a,0xa24abaf7,0x6e58a348,0xd11ed0a5,0x948acb62,0xf3d811e6 },
  91094. { 0x4c61ed22,0x8618dd77,0x80b47c9d,0x0bb747f9,0xde6b8559,0x22bf796f,
  91095. 0x680a21e9,0xfdfd1c6d,0x2af2c9dd,0xc0db1577,0xc1e90f3d,0xa09379e6 } },
  91096. /* 7 */
  91097. { { 0xe085c629,0x386c66ef,0x095bc89a,0x5fc2a461,0x203f4b41,0x1353d631,
  91098. 0x7e4bd8f5,0x7ca1972b,0xa7df8ce9,0xb077380a,0xee7e4ea3,0xd8a90389 },
  91099. { 0xe7b14461,0x1bc74dc7,0x0c9c4f78,0xdc2cb014,0x84ef0a10,0x52b4b3a6,
  91100. 0x20327fe2,0xbde6ea5d,0x660f9615,0xb71ec435,0xb8ad8173,0xeede5a04 } },
  91101. /* 8 */
  91102. { { 0x893b9a2d,0x5584cbb3,0x00850c5d,0x820c660b,0x7df2d43d,0x4126d826,
  91103. 0x0109e801,0xdd5bbbf0,0x38172f1c,0x85b92ee3,0xf31430d9,0x609d4f93 },
  91104. { 0xeadaf9d6,0x1e059a07,0x0f125fb0,0x70e6536c,0x560f20e7,0xd6220751,
  91105. 0x7aaf3a9a,0xa59489ae,0x64bae14e,0x7b70e2f6,0x76d08249,0x0dd03701 } },
  91106. /* 9 */
  91107. { { 0x8510521f,0x4cc13be8,0xf724cc17,0x87315ba9,0x353dc263,0xb49d83bb,
  91108. 0x0c279257,0x8b677efe,0xc93c9537,0x510a1c1c,0xa4702c99,0x33e30cd8 },
  91109. { 0x2208353f,0xf0ffc89d,0xced42b2b,0x0170fa8d,0x26e2a5f5,0x090851ed,
  91110. 0xecb52c96,0x81276455,0x7fe1adf4,0x0646c4e1,0xb0868eab,0x513f047e } },
  91111. /* 10 */
  91112. { { 0xdf5bdf53,0xc07611f4,0x58b11a6d,0x45d331a7,0x1c4ee394,0x58965daf,
  91113. 0x5a5878d1,0xba8bebe7,0x82dd3025,0xaecc0a18,0xa923eb8b,0xcf2a3899 },
  91114. { 0xd24fd048,0xf98c9281,0x8bbb025d,0x841bfb59,0xc9ab9d53,0xb8ddf8ce,
  91115. 0x7fef044e,0x538a4cb6,0x23236662,0x092ac21f,0x0b66f065,0xa919d385 } },
  91116. /* 11 */
  91117. { { 0x85d480d8,0x3db03b40,0x1b287a7d,0x8cd9f479,0x4a8f3bae,0x8f24dc75,
  91118. 0x3db41892,0x482eb800,0x9c56e0f5,0x38bf9eb3,0x9a91dc6f,0x8b977320 },
  91119. { 0x7209cfc2,0xa31b05b2,0x05b2db70,0x4c49bf85,0xd619527b,0x56462498,
  91120. 0x1fac51ba,0x3fe51039,0xab4b8342,0xfb04f55e,0x04c6eabf,0xc07c10dc } },
  91121. /* 12 */
  91122. { { 0xdb32f048,0xad22fe4c,0x475ed6df,0x5f23bf91,0xaa66b6cb,0xa50ce0c0,
  91123. 0xf03405c0,0xdf627a89,0xf95e2d6a,0x3674837d,0xba42e64e,0x081c95b6 },
  91124. { 0xe71d6ceb,0xeba3e036,0x6c6b0271,0xb45bcccf,0x0684701d,0x67b47e63,
  91125. 0xe712523f,0x60f8f942,0x5cd47adc,0x82423472,0x87649cbb,0x83027d79 } },
  91126. /* 13 */
  91127. { { 0x3615b0b8,0xb3929ea6,0xa54dac41,0xb41441fd,0xb5b6a368,0x8995d556,
  91128. 0x167ef05e,0xa80d4529,0x6d25a27f,0xf6bcb4a1,0x7bd55b68,0x210d6a4c },
  91129. { 0x25351130,0xf3804abb,0x903e37eb,0x1d2df699,0x084c25c8,0x5f201efc,
  91130. 0xa1c68e91,0x31a28c87,0x563f62a5,0x81dad253,0xd6c415d4,0x5dd6de70 } },
  91131. /* 14 */
  91132. { { 0x846612ce,0x29f470fd,0xda18d997,0x986f3eec,0x2f34af86,0x6b84c161,
  91133. 0x46ddaf8b,0x5ef0a408,0xe49e795f,0x14405a00,0xaa2f7a37,0x5f491b16 },
  91134. { 0xdb41b38d,0xc7f07ae4,0x18fbfcaa,0xef7d119e,0x14443b19,0x3a18e076,
  91135. 0x79a19926,0x4356841a,0xe2226fbe,0x91f4a91c,0x3cc88721,0xdc77248c } },
  91136. /* 15 */
  91137. { { 0xe4b1ec9d,0xd570ff1a,0xe7eef706,0x21d23e0e,0xca19e086,0x3cde40f4,
  91138. 0xcd4bb270,0x7d6523c4,0xbf13aa6c,0x16c1f06c,0xd14c4b60,0x5aa7245a },
  91139. { 0x44b74de8,0x37f81467,0x620a934e,0x839e7a17,0xde8b1aa1,0xf74d14e8,
  91140. 0xf30d75e2,0x8789fa51,0xc81c261e,0x09b24052,0x33c565ee,0x654e2678 } },
  91141. /* 16 */
  91142. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  91143. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  91144. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  91145. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  91146. /* 17 */
  91147. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  91148. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  91149. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  91150. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  91151. /* 18 */
  91152. { { 0x7d8c1bba,0x7ecbac01,0x90b0f3d5,0x6058f9c3,0xf6197d0f,0xaee116e3,
  91153. 0x4033b128,0xc4dd7068,0xc209b983,0xf084dba6,0x831dbc4a,0x97c7c2cf },
  91154. { 0xf96010e8,0x2f4e61dd,0x529faa17,0xd97e4e20,0x69d37f20,0x4ee66660,
  91155. 0x3d366d72,0xccc139ed,0x13488e0f,0x690b6ee2,0xf3a6d533,0x7cad1dc5 } },
  91156. /* 19 */
  91157. { { 0xda57a41f,0x660a9a81,0xec0039b6,0xe74a0412,0x5e1dad15,0x42343c6b,
  91158. 0x46681d4c,0x284f3ff5,0x63749e89,0xb51087f1,0x6f9f2f13,0x070f23cc },
  91159. { 0x5d186e14,0x542211da,0xfddb0dff,0x84748f37,0xdb1f4180,0x41a3aab4,
  91160. 0xa6402d0e,0x25ed667b,0x02f58355,0x2f2924a9,0xfa44a689,0x5844ee7c } },
  91161. /* 20 */
  91162. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  91163. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  91164. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  91165. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  91166. /* 21 */
  91167. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  91168. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  91169. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  91170. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  91171. /* 22 */
  91172. { { 0x104cbba5,0xc023780d,0xfa35dd4c,0x6207e747,0x1ca9b6a3,0x35c23928,
  91173. 0x97987b10,0x4ff19be8,0x8022eee8,0xb8476bbf,0xd3bbe74d,0xaa0a4a14 },
  91174. { 0x187d4543,0x20f94331,0x79f6e066,0x32153870,0xac7e82e1,0x83b0f74e,
  91175. 0x828f06ab,0xa7748ba2,0xc26ef35f,0xc5f0298a,0x8e9a7dbd,0x0f0c5070 } },
  91176. /* 23 */
  91177. { { 0xdef029dd,0x0c5c244c,0x850661b8,0x3dabc687,0xfe11d981,0x9992b865,
  91178. 0x6274dbad,0xe9801b8f,0x098da242,0xe54e6319,0x91a53d08,0x9929a91a },
  91179. { 0x35285887,0x37bffd72,0xf1418102,0xbc759425,0xfd2e6e20,0x9280cc35,
  91180. 0xfbc42ee5,0x735c600c,0x8837619a,0xb7ad2864,0xa778c57b,0xa3627231 } },
  91181. /* 24 */
  91182. { { 0x91361ed8,0xae799b5c,0x6c63366c,0x47d71b75,0x1b265a6a,0x54cdd521,
  91183. 0x98d77b74,0xe0215a59,0xbab29db0,0x4424d9b7,0x7fd9e536,0x8b0ffacc },
  91184. { 0x37b5d9ef,0x46d85d12,0xbfa91747,0x5b106d62,0x5f99ba2d,0xed0479f8,
  91185. 0x1d104de4,0x0e6f3923,0x25e8983f,0x83a84c84,0xf8105a70,0xa9507e0a } },
  91186. /* 25 */
  91187. { { 0x14cf381c,0xf6c68a6e,0xc22e31cc,0xaf9d27bd,0xaa8a5ccb,0x23568d4d,
  91188. 0xe338e4d2,0xe431eec0,0x8f52ad1f,0xf1a828fe,0xe86acd80,0xdb6a0579 },
  91189. { 0x4507832a,0x2885672e,0x887e5289,0x73fc275f,0x05610d08,0x65f80278,
  91190. 0x075ff5b0,0x8d9b4554,0x09f712b5,0x3a8e8fb1,0x2ebe9cf2,0x39f0ac86 } },
  91191. /* 26 */
  91192. { { 0x4c52edf5,0xd8fabf78,0xa589ae53,0xdcd737e5,0xd791ab17,0x94918bf0,
  91193. 0xbcff06c9,0xb5fbd956,0xdca46d45,0xf6d3032e,0x41a3e486,0x2cdff7e1 },
  91194. { 0x61f47ec8,0x6674b3ba,0xeef84608,0x8a882163,0x4c687f90,0xa257c705,
  91195. 0xf6cdf227,0xe30cb2ed,0x7f6ea846,0x2c4c64ca,0xcc6bcd3c,0x186fa17c } },
  91196. /* 27 */
  91197. { { 0x1dfcb91e,0x48a3f536,0x646d358a,0x83595e13,0x91128798,0xbd15827b,
  91198. 0x2187757a,0x3ce612b8,0x61bd7372,0x873150a1,0xb662f568,0xf4684530 },
  91199. { 0x401896f6,0x8833950b,0x77f3e090,0xe11cb89a,0x48e7f4a5,0xb2f12cac,
  91200. 0xf606677e,0x313dd769,0x16579f93,0xfdcf08b3,0x46b8f22b,0x6429cec9 } },
  91201. /* 28 */
  91202. { { 0xbb75f9a4,0x4984dd54,0x29d3b570,0x4aef06b9,0x3d6e4c1e,0xb5f84ca2,
  91203. 0xb083ef35,0x24c61c11,0x392ca9ff,0xce4a7392,0x6730a800,0x865d6517 },
  91204. { 0x722b4a2b,0xca3dfe76,0x7b083e0e,0x12c04bf9,0x1b86b8a5,0x803ce5b5,
  91205. 0x6a7e3e0c,0x3fc7632d,0xc81adbe4,0xc89970c2,0x120e16b1,0x3cbcd3ad } },
  91206. /* 29 */
  91207. { { 0xec30ce93,0xfbfb4cc7,0xb72720a2,0x10ed6c7d,0x47b55500,0xec675bf7,
  91208. 0x333ff7c3,0x90725903,0x5075bfc0,0xc7c3973e,0x07acf31b,0xb049ecb0 },
  91209. { 0x4f58839c,0xb4076eaf,0xa2b05e4f,0x101896da,0xab40c66e,0x3f6033b0,
  91210. 0xc8d864ba,0x19ee9eeb,0x47bf6d2a,0xeb6cf155,0xf826477d,0x8e5a9663 } },
  91211. /* 30 */
  91212. { { 0xf7fbd5e1,0x69e62fdd,0x76912b1d,0x38ecfe54,0xd1da3bfb,0x845a3d56,
  91213. 0x1c86f0d4,0x0494950e,0x3bc36ce8,0x83cadbf9,0x4fccc8d1,0x41fce572 },
  91214. { 0x8332c144,0x05f939c2,0x0871e46e,0xb17f248b,0x66e8aff6,0x3d8534e2,
  91215. 0x3b85c629,0x1d06f1dc,0xa3131b73,0xdb06a32e,0x8b3f64e5,0xf295184d } },
  91216. /* 31 */
  91217. { { 0x36ddc103,0xd9653ff7,0x95ef606f,0x25f43e37,0xfe06dce8,0x09e301fc,
  91218. 0x30b6eebf,0x85af2341,0x0ff56b20,0x79b12b53,0xfe9a3c6b,0x9b4fb499 },
  91219. { 0x51d27ac2,0x0154f892,0x56ca5389,0xd33167e3,0xafc065a6,0x7828ec1f,
  91220. 0x7f746c9b,0x0959a258,0x0c44f837,0xb18f1be3,0xc4132fdb,0xa7946117 } },
  91221. /* 32 */
  91222. { { 0x5e3c647b,0xc0426b77,0x8cf05348,0xbfcbd939,0x172c0d3d,0x31d312e3,
  91223. 0xee754737,0x5f49fde6,0x6da7ee61,0x895530f0,0xe8b3a5fb,0xcf281b0a },
  91224. { 0x41b8a543,0xfd149735,0x3080dd30,0x41a625a7,0x653908cf,0xe2baae07,
  91225. 0xba02a278,0xc3d01436,0x7b21b8f8,0xa0d0222e,0xd7ec1297,0xfdc270e9 } },
  91226. /* 33 */
  91227. { { 0xbc7f41d6,0x00873c0c,0x1b7ad641,0xd976113e,0x238443fb,0x2a536ff4,
  91228. 0x41e62e45,0x030d00e2,0x5f545fc6,0x532e9867,0x8e91208c,0xcd033108 },
  91229. { 0x9797612c,0xd1a04c99,0xeea674e2,0xd4393e02,0xe19742a1,0xd56fa69e,
  91230. 0x85f0590e,0xdd2ab480,0x48a2243d,0xa5cefc52,0x54383f41,0x48cc67b6 } },
  91231. /* 34 */
  91232. { { 0xfc14ab48,0x4e50430e,0x26706a74,0x195b7f4f,0xcc881ff6,0x2fe8a228,
  91233. 0xd945013d,0xb1b968e2,0x4b92162b,0x936aa579,0x364e754a,0x4fb766b7 },
  91234. { 0x31e1ff7f,0x13f93bca,0xce4f2691,0x696eb5ca,0xa2b09e02,0xff754bf8,
  91235. 0xe58e3ff8,0x58f13c9c,0x1678c0b0,0xb757346f,0xa86692b3,0xd54200db } },
  91236. /* 35 */
  91237. { { 0x6dda1265,0x9a030bbd,0xe89718dd,0xf7b4f3fc,0x936065b8,0xa6a4931f,
  91238. 0x5f72241c,0xbce72d87,0x65775857,0x6cbb51cb,0x4e993675,0xc7161815 },
  91239. { 0x2ee32189,0xe81a0f79,0x277dc0b2,0xef2fab26,0xb71f469f,0x9e64f6fe,
  91240. 0xdfdaf859,0xb448ce33,0xbe6b5df1,0x3f5c1c4c,0x1de45f7b,0xfb8dfb00 } },
  91241. /* 36 */
  91242. { { 0x4d5bb921,0xc7345fa7,0x4d2b667e,0x5c7e04be,0x282d7a3e,0x47ed3a80,
  91243. 0x7e47b2a4,0x5c2777f8,0x08488e2e,0x89b3b100,0xb2eb5b45,0x9aad77c2 },
  91244. { 0xdaac34ae,0xd681bca7,0x26afb326,0x2452e4e5,0x41a1ee14,0x0c887924,
  91245. 0xc2407ade,0x743b04d4,0xfc17a2ac,0xcb5e999b,0x4a701a06,0x4dca2f82 } },
  91246. /* 37 */
  91247. { { 0x1127bc1a,0x68e31ca6,0x17ead3be,0xa3edd59b,0xe25f5a15,0x67b6b645,
  91248. 0xa420e15e,0x76221794,0x4b1e872e,0x794fd83b,0xb2dece1b,0x7cab3f03 },
  91249. { 0xca9b3586,0x7119bf15,0x4d250bd7,0xa5545924,0xcc6bcf24,0x173633ea,
  91250. 0xb1b6f884,0x9bd308c2,0x447d38c3,0x3bae06f5,0xf341fe1c,0x54dcc135 } },
  91251. /* 38 */
  91252. { { 0x943caf0d,0x56d3598d,0x225ff133,0xce044ea9,0x563fadea,0x9edf6a7c,
  91253. 0x73e8dc27,0x632eb944,0x3190dcab,0x814b467e,0x6dbb1e31,0x2d4f4f31 },
  91254. { 0xa143b7ca,0x8d69811c,0xde7cf950,0x4ec1ac32,0x37b5fe82,0x223ab5fd,
  91255. 0x9390f1d9,0xe82616e4,0x75804610,0xabff4b20,0x875b08f0,0x11b9be15 } },
  91256. /* 39 */
  91257. { { 0x3bbe682c,0x4ae31a3d,0x74eef2dd,0xbc7c5d26,0x3c47dd40,0x92afd10a,
  91258. 0xc14ab9e1,0xec7e0a3b,0xb2e495e4,0x6a6c3dd1,0x309bcd85,0x085ee5e9 },
  91259. { 0x8c2e67fd,0xf381a908,0xe261eaf2,0x32083a80,0x96deee15,0x0fcd6a49,
  91260. 0x5e524c79,0xe3b8fb03,0x1d5b08b9,0x8dc360d9,0x7f26719f,0x3a06e2c8 } },
  91261. /* 40 */
  91262. { { 0x7237cac0,0x5cd9f5a8,0x43586794,0x93f0b59d,0xe94f6c4e,0x4384a764,
  91263. 0xb62782d3,0x8304ed2b,0xcde06015,0x0b8db8b3,0x5dbe190f,0x4336dd53 },
  91264. { 0x92ab473a,0x57443553,0xbe5ed046,0x031c7275,0x21909aa4,0x3e78678c,
  91265. 0x99202ddb,0x4ab7e04f,0x6977e635,0x2648d206,0x093198be,0xd427d184 } },
  91266. /* 41 */
  91267. { { 0x0f9b5a31,0x822848f5,0xbaadb62a,0xbb003468,0x3357559c,0x233a0472,
  91268. 0x79aee843,0x49ef6880,0xaeb9e1e3,0xa89867a0,0x1f6f9a55,0xc151931b },
  91269. { 0xad74251e,0xd264eb0b,0x4abf295e,0x37b9b263,0x04960d10,0xb600921b,
  91270. 0x4da77dc0,0x0de53dbc,0xd2b18697,0x01d9bab3,0xf7156ddf,0xad54ec7a } },
  91271. /* 42 */
  91272. { { 0x79efdc58,0x8e74dc35,0x4ff68ddb,0x456bd369,0xd32096a5,0x724e74cc,
  91273. 0x386783d0,0xe41cff42,0x7c70d8a4,0xa04c7f21,0xe61a19a2,0x41199d2f },
  91274. { 0x29c05dd2,0xd389a3e0,0xe7e3fda9,0x535f2a6b,0x7c2b4df8,0x26ecf72d,
  91275. 0xfe745294,0x678275f4,0x9d23f519,0x6319c9cc,0x88048fc4,0x1e05a02d } },
  91276. /* 43 */
  91277. { { 0xd4d5ffe8,0x75cc8e2e,0xdbea17f2,0xf8bb4896,0xcee3cb4a,0x35059790,
  91278. 0xa47c6165,0x4c06ee85,0x92935d2f,0xf98fff25,0x32ffd7c7,0x34c4a572 },
  91279. { 0xea0376a2,0xc4b14806,0x4f115e02,0x2ea5e750,0x1e55d7c0,0x532d76e2,
  91280. 0xf31044da,0x68dc9411,0x71b77993,0x9272e465,0x93a8cfd5,0xadaa38bb } },
  91281. /* 44 */
  91282. { { 0x7d4ed72a,0x4bf0c712,0xba1f79a3,0xda0e9264,0xf4c39ea4,0x48c0258b,
  91283. 0x2a715138,0xa5394ed8,0xbf06c660,0x4af511ce,0xec5c37cd,0xfcebceef },
  91284. { 0x779ae8c1,0xf23b75aa,0xad1e606e,0xdeff59cc,0x22755c82,0xf3f526fd,
  91285. 0xbb32cefd,0x64c5ab44,0x915bdefd,0xa96e11a2,0x1143813e,0xab19746a } },
  91286. /* 45 */
  91287. { { 0xec837d7d,0x43c78585,0xb8ee0ba4,0xca5b6fbc,0xd5dbb5ee,0x34e924d9,
  91288. 0xbb4f1ca5,0x3f4fa104,0x398640f7,0x15458b72,0xd7f407ea,0x4231faa9 },
  91289. { 0xf96e6896,0x53e0661e,0xd03b0f9d,0x554e4c69,0x9c7858d1,0xd4fcb07b,
  91290. 0x52cb04fa,0x7e952793,0x8974e7f7,0x5f5f1574,0x6b6d57c8,0x2e3fa558 } },
  91291. /* 46 */
  91292. { { 0x6a9951a8,0x42cd4803,0x42792ad0,0xa8b15b88,0xabb29a73,0x18e8bcf9,
  91293. 0x409933e8,0xbfd9a092,0xefb88dc4,0x760a3594,0x40724458,0x14418863 },
  91294. { 0x99caedc7,0x162a56ee,0x91d101c9,0x8fb12ecd,0x393202da,0xea671967,
  91295. 0xa4ccd796,0x1aac8c4a,0x1cf185a8,0x7db05036,0x8cfd095a,0x0c9f86cd } },
  91296. /* 47 */
  91297. { { 0x10b2a556,0x9a728147,0x327b70b2,0x767ca964,0x5e3799b7,0x04ed9e12,
  91298. 0x22a3eb2a,0x6781d2dc,0x0d9450ac,0x5bd116eb,0xa7ebe08a,0xeccac1fc },
  91299. { 0xdc2d6e94,0xde68444f,0x35ecf21b,0x3621f429,0x29e03a2c,0x14e2d543,
  91300. 0x7d3e7f0a,0x53e42cd5,0x73ed00b9,0xbba26c09,0xc57d2272,0x00297c39 } },
  91301. /* 48 */
  91302. { { 0xb8243a7d,0x3aaaab10,0x8fa58c5b,0x6eeef93e,0x9ae7f764,0xf866fca3,
  91303. 0x61ab04d3,0x64105a26,0x03945d66,0xa3578d8a,0x791b848c,0xb08cd3e4 },
  91304. { 0x756d2411,0x45edc5f8,0xa755128c,0xd4a790d9,0x49e5f6a0,0xc2cf0963,
  91305. 0xf649beaa,0xc66d267d,0x8467039e,0x3ce6d968,0x42f7816f,0x50046c6b } },
  91306. /* 49 */
  91307. { { 0x66425043,0x92ae1602,0xf08db890,0x1ff66afd,0x8f162ce5,0x386f5a7f,
  91308. 0xfcf5598f,0x18d2dea0,0x1a8ca18e,0x78372b3a,0x8cd0e6f7,0xdf0d20eb },
  91309. { 0x75bb4045,0x7edd5e1d,0xb96d94b7,0x252a47ce,0x2c626776,0xbdb29358,
  91310. 0x40dd1031,0x853c3943,0x7d5f47fd,0x9dc9becf,0xbae4044a,0x27c2302f } },
  91311. /* 50 */
  91312. { { 0x8f2d49ce,0x2d1d208a,0x162df0a2,0x0d91aa02,0x09a07f65,0x9c5cce87,
  91313. 0x84339012,0xdf07238b,0x419442cd,0x5028e2c8,0x72062aba,0x2dcbd358 },
  91314. { 0xe4680967,0xb5fbc3cb,0x9f92d72c,0x2a7bc645,0x116c369d,0x806c76e1,
  91315. 0x3177e8d8,0x5c50677a,0x4569df57,0x753739eb,0x36c3f40b,0x2d481ef6 } },
  91316. /* 51 */
  91317. { { 0xfea1103e,0x1a2d39fd,0x95f81b17,0xeaae5592,0xf59b264a,0xdbd0aa18,
  91318. 0xcb592ee0,0x90c39c1a,0x9750cca3,0xdf62f80d,0xdf97cc6c,0xda4d8283 },
  91319. { 0x1e201067,0x0a6dd346,0x69fb1f6b,0x1531f859,0x1d60121f,0x4895e552,
  91320. 0x4c041c91,0x0b21aab0,0xbcc1ccf8,0x9d896c46,0x3141bde7,0xd24da3b3 } },
  91321. /* 52 */
  91322. { { 0x53b0a354,0x575a0537,0x0c6ddcd8,0x392ff2f4,0x56157b94,0x0b8e8cff,
  91323. 0x3b1b80d1,0x073e57bd,0x3fedee15,0x2a75e0f0,0xaa8e6f19,0x752380e4 },
  91324. { 0x6558ffe9,0x1f4e227c,0x19ec5415,0x3a348618,0xf7997085,0xab382d5e,
  91325. 0xddc46ac2,0x5e6deaff,0xfc8d094c,0xe5144078,0xf60e37c6,0xf674fe51 } },
  91326. /* 53 */
  91327. { { 0xaf63408f,0x6fb87ae5,0xcd75a737,0xa39c36a9,0xcf4c618d,0x7833313f,
  91328. 0xf034c88d,0xfbcd4482,0x39b35288,0x4469a761,0x66b5d9c9,0x77a711c5 },
  91329. { 0x944f8d65,0x4a695dc7,0x161aaba8,0xe6da5f65,0x24601669,0x8654e9c3,
  91330. 0x28ae7491,0xbc8b93f5,0x8f5580d8,0x5f1d1e83,0xcea32cc8,0x8ccf9a1a } },
  91331. /* 54 */
  91332. { { 0x7196fee2,0x28ab110c,0x874c8945,0x75799d63,0x29aedadd,0xa2629348,
  91333. 0x2be88ff4,0x9714cc7b,0xd58d60d6,0xf71293cf,0x32a564e9,0xda6b6cb3 },
  91334. { 0x3dd821c2,0xf43fddb1,0x90dd323d,0xf2f2785f,0x048489f8,0x91246419,
  91335. 0xd24c6749,0x61660f26,0xc803c15c,0x961d9e8c,0xfaadc4c9,0x631c6158 } },
  91336. /* 55 */
  91337. { { 0xfd752366,0xacf2ebe0,0x139be88b,0xb93c340e,0x0f20179e,0x98f66485,
  91338. 0xff1da785,0x14820254,0x4f85c16e,0x5278e276,0x7aab1913,0xa246ee45 },
  91339. { 0x53763b33,0x43861eb4,0x45c0bc0d,0xc49f03fc,0xad6b1ea1,0xafff16bc,
  91340. 0x6fd49c99,0xce33908b,0xf7fde8c3,0x5c51e9bf,0xff142c5e,0x076a7a39 } },
  91341. /* 56 */
  91342. { { 0x9e338d10,0x04639dfe,0xf42b411b,0x8ee6996f,0xa875cef2,0x960461d1,
  91343. 0x95b4d0ba,0x1057b6d6,0xa906e0bc,0x27639252,0xe1c20f8a,0x2c19f09a },
  91344. { 0xeef4c43d,0x5b8fc3f0,0x07a84aa9,0xe2e1b1a8,0x835d2bdb,0x5f455528,
  91345. 0x207132dd,0x0f4aee4d,0x3907f675,0xe9f8338c,0x0e0531f0,0x7a874dc9 } },
  91346. /* 57 */
  91347. { { 0x97c27050,0x84b22d45,0x59e70bf8,0xbd0b8df7,0x79738b9b,0xb4d67405,
  91348. 0xcd917c4f,0x47f4d5f5,0x13ce6e33,0x9099c4ce,0x521d0f8b,0x942bfd39 },
  91349. { 0xa43b566d,0x5028f0f6,0x21bff7de,0xaf6e8669,0xc44232cd,0x83f6f856,
  91350. 0xf915069a,0x65680579,0xecfecb85,0xd12095a2,0xdb01ba16,0xcf7f06ae } },
  91351. /* 58 */
  91352. { { 0x8ef96c80,0x0f56e3c4,0x3ddb609c,0xd521f2b3,0x7dc1450d,0x2be94102,
  91353. 0x02a91fe2,0x2d21a071,0x1efa37de,0x2e6f74fa,0x156c28a1,0x9a9a90b8 },
  91354. { 0x9dc7dfcb,0xc54ea9ea,0x2c2c1d62,0xc74e66fc,0x49d3e067,0x9f23f967,
  91355. 0x54dd38ad,0x1c7c3a46,0x5946cee3,0xc7005884,0x45cc045d,0x89856368 } },
  91356. /* 59 */
  91357. { { 0xfce73946,0x29da7cd4,0x23168563,0x8f697db5,0xcba92ec6,0x8e235e9c,
  91358. 0x9f91d3ea,0x55d4655f,0xaa50a6cd,0xf3689f23,0x21e6a1a0,0xdcf21c26 },
  91359. { 0x61b818bf,0xcffbc82e,0xda47a243,0xc74a2f96,0x8bc1a0cf,0x234e980a,
  91360. 0x7929cb6d,0xf35fd6b5,0xefe17d6c,0x81468e12,0x58b2dafb,0xddea6ae5 } },
  91361. /* 60 */
  91362. { { 0x7e787b2e,0x294de887,0x39a9310d,0x258acc1f,0xac14265d,0x92d9714a,
  91363. 0x708b48a0,0x18b5591c,0xe1abbf71,0x27cc6bb0,0x568307b9,0xc0581fa3 },
  91364. { 0xf24d4d58,0x9e0f58a3,0xe0ce2327,0xfebe9bb8,0x9d1be702,0x91fd6a41,
  91365. 0xfacac993,0x9a7d8a45,0x9e50d66d,0xabc0a08c,0x06498201,0x02c342f7 } },
  91366. /* 61 */
  91367. { { 0x157bdbc2,0xccd71407,0xad0e1605,0x72fa89c6,0xb92a015f,0xb1d3da2b,
  91368. 0xa0a3fe56,0x8ad9e7cd,0x24f06737,0x160edcbd,0x61275be6,0x79d4db33 },
  91369. { 0x5f3497c4,0xd3d31fd9,0x04192fb0,0x8cafeaee,0x13a50af3,0xe13ca745,
  91370. 0x8c85aae5,0x18826167,0x9eb556ff,0xce06cea8,0xbdb549f3,0x2eef1995 } },
  91371. /* 62 */
  91372. { { 0x50596edc,0x8ed7d3eb,0x905243a2,0xaa359362,0xa4b6d02b,0xa212c2c2,
  91373. 0xc4fbec68,0x611fd727,0xb84f733d,0x8a0b8ff7,0x5f0daf0e,0xd85a6b90 },
  91374. { 0xd4091cf7,0x60e899f5,0x2eff2768,0x4fef2b67,0x10c33964,0xc1f195cb,
  91375. 0x93626a8f,0x8275d369,0x0d6c840a,0xc77904f4,0x7a868acd,0x88d8b7fd } },
  91376. /* 63 */
  91377. { { 0x7bd98425,0x85f23723,0xc70b154e,0xd4463992,0x96687a2e,0xcbb00ee2,
  91378. 0xc83214fd,0x905fdbf7,0x13593684,0x2019d293,0xef51218e,0x0428c393 },
  91379. { 0x981e909a,0x40c7623f,0x7be192da,0x92513385,0x4010907e,0x48fe480f,
  91380. 0x3120b459,0xdd7a187c,0xa1fd8f3c,0xc9d7702d,0xe358efc5,0x66e4753b } },
  91381. /* 64 */
  91382. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  91383. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  91384. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  91385. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  91386. /* 65 */
  91387. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  91388. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  91389. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  91390. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  91391. /* 66 */
  91392. { { 0xc6a2123f,0xb1a358f5,0xfe28df6d,0x927b2d95,0xf199d2f9,0x89702753,
  91393. 0x1a3f82dc,0x0a73754c,0x777affe1,0x063d029d,0xdae6d34d,0x5439817e },
  91394. { 0x6b8b83c4,0xf7979eef,0x9d945682,0x615cb214,0xc5e57eae,0x8f0e4fac,
  91395. 0x113047dd,0x042b89b8,0x93f36508,0x888356dc,0x5fd1f32f,0xbf008d18 } },
  91396. /* 67 */
  91397. { { 0x4e8068db,0x8012aa24,0xa5729a47,0xc72cc641,0x43f0691d,0x3c33df2c,
  91398. 0x1d92145f,0xfa057347,0xb97f7946,0xaefc0f2f,0x2f8121bf,0x813d75cb },
  91399. { 0x4383bba6,0x05613c72,0xa4224b3f,0xa924ce70,0x5f2179a6,0xe59cecbe,
  91400. 0x79f62b61,0x78e2e8aa,0x53ad8079,0x3ac2cc3b,0xd8f4fa96,0x55518d71 } },
  91401. /* 68 */
  91402. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  91403. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  91404. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  91405. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  91406. /* 69 */
  91407. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  91408. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  91409. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  91410. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  91411. /* 70 */
  91412. { { 0xb0ab9645,0xb5e405d3,0xd5f1f711,0xaeec7f98,0x585c2a6e,0x8ad42311,
  91413. 0x512c6944,0x045acb9e,0xa90db1c6,0xae106c4e,0x898e6563,0xb89f33d5 },
  91414. { 0x7fed2ce4,0x43b07cd9,0xdd815b20,0xf9934e17,0x0a81a349,0x6778d4d5,
  91415. 0x52918061,0x9e616ade,0xd7e67112,0xfa06db06,0x88488091,0x1da23cf1 } },
  91416. /* 71 */
  91417. { { 0x42f2c4b5,0x821c46b3,0x66059e47,0x931513ef,0x66f50cd1,0x7030ae43,
  91418. 0x43e7b127,0x43b536c9,0x5fca5360,0x006258cf,0x6b557abf,0xe4e3ee79 },
  91419. { 0x24c8b22f,0xbb6b3900,0xfcbf1054,0x2eb5e2c1,0x567492af,0x937b18c9,
  91420. 0xacf53957,0xf09432e4,0x1dbf3a56,0x585f5a9d,0xbe0887cf,0xf86751fd } },
  91421. /* 72 */
  91422. { { 0x9d10e0b2,0x157399cb,0x60dc51b7,0x1c0d5956,0x1f583090,0x1d496b8a,
  91423. 0x88590484,0x6658bc26,0x03213f28,0x88c08ab7,0x7ae58de4,0x8d2e0f73 },
  91424. { 0x486cfee6,0x9b79bc95,0xe9e5bc57,0x036a26c7,0xcd8ae97a,0x1ad03601,
  91425. 0xff3a0494,0x06907f87,0x2c7eb584,0x078f4bbf,0x7e8d0a5a,0xe3731bf5 } },
  91426. /* 73 */
  91427. { { 0xe1cd0abe,0x72f2282b,0x87efefa2,0xd4f9015e,0x6c3834bd,0x9d189806,
  91428. 0xb8a29ced,0x9c8cdcc1,0xfee82ebc,0x0601b9f4,0x7206a756,0x371052bc },
  91429. { 0x46f32562,0x76fa1092,0x17351bb4,0xdaad534c,0xb3636bb5,0xc3d64c37,
  91430. 0x45d54e00,0x038a8c51,0x32c09e7c,0x301e6180,0x95735151,0x9764eae7 } },
  91431. /* 74 */
  91432. { { 0xcbd5256a,0x8791b19f,0x6ca13a3b,0x4007e0f2,0x4cf06904,0x03b79460,
  91433. 0xb6c17589,0xb18a9c22,0x81d45908,0xa1cb7d7d,0x21bb68f1,0x6e13fa9d },
  91434. { 0xa71e6e16,0x47183c62,0xe18749ed,0x5cf0ef8e,0x2e5ed409,0x2c9c7f9b,
  91435. 0xe6e117e1,0x042eeacc,0x13fb5a7f,0xb86d4816,0xc9e5feb1,0xea1cf0ed } },
  91436. /* 75 */
  91437. { { 0xcea4cc9b,0x6e6573c9,0xafcec8f3,0x5417961d,0xa438b6f6,0x804bf02a,
  91438. 0xdcd4ea88,0xb894b03c,0x3799571f,0xd0f807e9,0x862156e8,0x3466a7f5 },
  91439. { 0x56515664,0x51e59acd,0xa3c5eb0b,0x55b0f93c,0x6a4279db,0x84a06b02,
  91440. 0xc5fae08e,0x5c850579,0xa663a1a2,0xcf07b8db,0xf46ffc8d,0x49a36bbc } },
  91441. /* 76 */
  91442. { { 0x46d93106,0xe47f5acc,0xaa897c9c,0x65b7ade0,0x12d7e4be,0x37cf4c94,
  91443. 0xd4b2caa9,0xa2ae9b80,0xe60357a3,0x5e7ce09c,0xc8ecd5f9,0x29f77667 },
  91444. { 0xa8a0b1c5,0xdf6868f5,0x62978ad8,0x240858cf,0xdc0002a1,0x0f7ac101,
  91445. 0xffe9aa05,0x1d28a9d7,0x5b962c97,0x744984d6,0x3d28c8b2,0xa8a7c00b } },
  91446. /* 77 */
  91447. { { 0xae11a338,0x7c58a852,0xd1af96e7,0xa78613f1,0x5355cc73,0x7e9767d2,
  91448. 0x792a2de6,0x6ba37009,0x124386b2,0x7d60f618,0x11157674,0xab09b531 },
  91449. { 0x98eb9dd0,0x95a04841,0x15070328,0xe6c17acc,0x489c6e49,0xafc6da45,
  91450. 0xbb211530,0xab45a60a,0x7d7ea933,0xc58d6592,0x095642c6,0xa3ef3c65 } },
  91451. /* 78 */
  91452. { { 0xdf010879,0x89d420e9,0x39576179,0x9d25255d,0xe39513b6,0x9cdefd50,
  91453. 0xd5d1c313,0xe4efe45b,0x3f7af771,0xc0149de7,0x340ab06b,0x55a6b4f4 },
  91454. { 0xebeaf771,0xf1325251,0x878d4288,0x2ab44128,0x18e05afe,0xfcd5832e,
  91455. 0xcc1fb62b,0xef52a348,0xc1c4792a,0x2bd08274,0x877c6dc7,0x345c5846 } },
  91456. /* 79 */
  91457. { { 0xbea65e90,0xde15ceb0,0x2416d99c,0x0987f72b,0xfd863dec,0x44db578d,
  91458. 0xac6a3578,0xf617b74b,0xdb48e999,0x9e62bd7a,0xeab1a1be,0x877cae61 },
  91459. { 0x3a358610,0x23adddaa,0x325e2b07,0x2fc4d6d1,0x1585754e,0x897198f5,
  91460. 0xb392b584,0xf741852c,0xb55f7de1,0x9927804c,0x1aa8efae,0xe9e6c4ed } },
  91461. /* 80 */
  91462. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  91463. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  91464. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  91465. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  91466. /* 81 */
  91467. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  91468. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  91469. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  91470. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  91471. /* 82 */
  91472. { { 0xf8e60f5b,0x511188b4,0x48aa2ada,0x7fe67015,0x381abca2,0xdb333cb8,
  91473. 0xdaf3fc97,0xb15e6d9d,0x36aabc03,0x4b24f6eb,0x72a748b4,0xc59789df },
  91474. { 0x29cf5279,0x26fcb8a5,0x01ad9a6c,0x7a3c6bfc,0x4b8bac9b,0x866cf88d,
  91475. 0x9c80d041,0xf4c89989,0x70add148,0xf0a04241,0x45d81a41,0x5a02f479 } },
  91476. /* 83 */
  91477. { { 0xc1c90202,0xfa5c877c,0xf8ac7570,0xd099d440,0xd17881f7,0x428a5b1b,
  91478. 0x5b2501d7,0x61e267db,0xf2e4465b,0xf889bf04,0x76aa4cb8,0x4da3ae08 },
  91479. { 0xe3e66861,0x3ef0fe26,0x3318b86d,0x5e772953,0x747396df,0xc3c35fbc,
  91480. 0x439ffd37,0x5115a29c,0xb2d70374,0xbfc4bd97,0x56246b9d,0x088630ea } },
  91481. /* 84 */
  91482. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  91483. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  91484. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  91485. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  91486. /* 85 */
  91487. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  91488. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  91489. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  91490. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  91491. /* 86 */
  91492. { { 0xfecf5b9b,0x34e0f9d1,0xf206966a,0xa115b12b,0x1eaa0534,0x5591cf3b,
  91493. 0xfb1558f9,0x5f0293cb,0x1bc703a5,0x1c8507a4,0x862c1f81,0x92e6b81c },
  91494. { 0xcdaf24e3,0xcc9ebc66,0x72fcfc70,0x68917ecd,0x8157ba48,0x6dc9a930,
  91495. 0xb06ab2b2,0x5d425c08,0x36e929c4,0x362f8ce7,0x62e89324,0x09f6f57c } },
  91496. /* 87 */
  91497. { { 0xd29375fb,0x1c7d6b78,0xe35d1157,0xfabd851e,0x4243ea47,0xf6f62dcd,
  91498. 0x8fe30b0f,0x1dd92460,0xffc6e709,0x08166dfa,0x0881e6a7,0xc6c4c693 },
  91499. { 0xd6a53fb0,0x20368f87,0x9eb4d1f9,0x38718e9f,0xafd7e790,0x03f08acd,
  91500. 0x72fe2a1c,0x0835eb44,0x88076e5d,0x7e050903,0xa638e731,0x538f765e } },
  91501. /* 88 */
  91502. { { 0xc2663b4b,0x0e0249d9,0x47cd38dd,0xe700ab5b,0x2c46559f,0xb192559d,
  91503. 0x4bcde66d,0x8f9f74a8,0x3e2aced5,0xad161523,0x3dd03a5b,0xc155c047 },
  91504. { 0x3be454eb,0x346a8799,0x83b7dccd,0x66ee94db,0xab9d2abe,0x1f6d8378,
  91505. 0x7733f355,0x4a396dd2,0xf53553c2,0x419bd40a,0x731dd943,0xd0ead98d } },
  91506. /* 89 */
  91507. { { 0xec142408,0x908e0b0e,0x4114b310,0x98943cb9,0x1742b1d7,0x03dbf7d8,
  91508. 0x693412f4,0xd270df6b,0x8f69e20c,0xc5065494,0x697e43a1,0xa76a90c3 },
  91509. { 0x4624825a,0xe0fa3384,0x8acc34c2,0x82e48c0b,0xe9a14f2b,0x7b24bd14,
  91510. 0x4db30803,0x4f5dd5e2,0x932da0a3,0x0c77a9e7,0x74c653dc,0x20db90f2 } },
  91511. /* 90 */
  91512. { { 0x0e6c5fd9,0x261179b7,0x6c982eea,0xf8bec123,0xd4957b7e,0x47683338,
  91513. 0x0a72f66a,0xcc47e664,0x1bad9350,0xbd54bf6a,0xf454e95a,0xdfbf4c6a },
  91514. { 0x6907f4fa,0x3f7a7afa,0x865ca735,0x7311fae0,0x2a496ada,0x24737ab8,
  91515. 0x15feb79b,0x13e425f1,0xa1b93c21,0xe9e97c50,0x4ddd3eb5,0xb26b6eac } },
  91516. /* 91 */
  91517. { { 0x2a2e5f2b,0x81cab9f5,0xbf385ac4,0xf93caf29,0xc909963a,0xf4bf35c3,
  91518. 0x74c9143c,0x081e7300,0xc281b4c5,0x3ea57fa8,0x9b340741,0xe497905c },
  91519. { 0x55ab3cfb,0xf556dd8a,0x518db6ad,0xd444b96b,0x5ef4b955,0x34f5425a,
  91520. 0xecd26aa3,0xdda7a3ac,0xda655e97,0xb57da11b,0xc2024c70,0x02da3eff } },
  91521. /* 92 */
  91522. { { 0x6481d0d9,0xe24b0036,0x818fdfe2,0x3740dbe5,0x190fda00,0xc1fc1f45,
  91523. 0x3cf27fde,0x329c9280,0x6934f43e,0x7435cb53,0x7884e8fe,0x2b505a5d },
  91524. { 0x711adcc9,0x6cfcc6a6,0x531e21e1,0xf034325c,0x9b2a8a99,0xa2f4a967,
  91525. 0x3c21bdff,0x9d5f3842,0x31b57d66,0xb25c7811,0x0b8093b9,0xdb5344d8 } },
  91526. /* 93 */
  91527. { { 0xae50a2f5,0x0d72e667,0xe4a861d1,0x9b7f8d8a,0x330df1cb,0xa129f70f,
  91528. 0xe04fefc3,0xe90aa5d7,0xe72c3ae1,0xff561ecb,0xcdb955fa,0x0d8fb428 },
  91529. { 0xd7663784,0xd2235f73,0x7e2c456a,0xc05baec6,0x2adbfccc,0xe5c292e4,
  91530. 0xefb110d5,0x4fd17988,0xd19d49f3,0x27e57734,0x84f679fe,0x188ac4ce } },
  91531. /* 94 */
  91532. { { 0xa796c53e,0x7ee344cf,0x0868009b,0xbbf6074d,0x474a1295,0x1f1594f7,
  91533. 0xac11632d,0x66776edc,0x04e2fa5a,0x1862278b,0xc854a89a,0x52665cf2 },
  91534. { 0x8104ab58,0x7e376464,0x7204fd6d,0x16775913,0x44ea1199,0x86ca06a5,
  91535. 0x1c9240dd,0xaa3f765b,0x24746149,0x5f8501a9,0xdcd251d7,0x7b982e30 } },
  91536. /* 95 */
  91537. { { 0xc15f3060,0xe44e9efc,0xa87ebbe6,0x5ad62f2e,0xc79500d4,0x36499d41,
  91538. 0x336fa9d1,0xa66d6dc0,0x5afd3b1f,0xf8afc495,0xe5c9822b,0x1d8ccb24 },
  91539. { 0x79d7584b,0x4031422b,0xea3f20dd,0xc54a0580,0x958468c5,0x3f837c8f,
  91540. 0xfbea7735,0x3d82f110,0x7dffe2fc,0x679a8778,0x20704803,0x48eba63b } },
  91541. /* 96 */
  91542. { { 0xdf46e2f6,0x89b10d41,0x19514367,0x13ab57f8,0x1d469c87,0x067372b9,
  91543. 0x4f6c5798,0x0c195afa,0x272c9acf,0xea43a12a,0x678abdac,0x9dadd8cb },
  91544. { 0xe182579a,0xcce56c6b,0x2d26c2d8,0x86febadb,0x2a44745c,0x1c668ee1,
  91545. 0x98dc047a,0x580acd86,0x51b9ec2d,0x5a2b79cc,0x4054f6a0,0x007da608 } },
  91546. /* 97 */
  91547. { { 0x17b00dd0,0x9e3ca352,0x0e81a7a6,0x046779cb,0xd482d871,0xb999fef3,
  91548. 0xd9233fbc,0xe6f38134,0xf48cd0e0,0x112c3001,0x3c6c66ae,0x934e7576 },
  91549. { 0xd73234dc,0xb44d4fc3,0x864eafc1,0xfcae2062,0x26bef21a,0x843afe25,
  91550. 0xf3b75fdf,0x61355107,0x794c2e6b,0x8367a5aa,0x8548a372,0x3d2629b1 } },
  91551. /* 98 */
  91552. { { 0x437cfaf8,0x6230618f,0x2032c299,0x5b8742cb,0x2293643a,0x949f7247,
  91553. 0x09464f79,0xb8040f1a,0x4f254143,0x049462d2,0x366c7e76,0xabd6b522 },
  91554. { 0xd5338f55,0x119b392b,0x01495a0c,0x1a80a9ce,0xf8d7537e,0xf3118ca7,
  91555. 0x6bf4b762,0xb715adc2,0xa8482b6c,0x24506165,0x96a7c84d,0xd958d7c6 } },
  91556. /* 99 */
  91557. { { 0xbdc21f31,0x9ad8aa87,0x8063e58c,0xadb3cab4,0xb07dd7b8,0xefd86283,
  91558. 0x1be7c6b4,0xc7b9b762,0x015582de,0x2ef58741,0x299addf3,0xc970c52e },
  91559. { 0x22f24d66,0x78f02e2a,0x74cc100a,0xefec1d10,0x09316e1a,0xaf2a6a39,
  91560. 0x5849dd49,0xce7c2205,0x96bffc4c,0x9c1fe75c,0x7ba06ec0,0xcad98fd2 } },
  91561. /* 100 */
  91562. { { 0xb648b73e,0xed76e2d0,0x1cfd285e,0xa9f92ce5,0x2ed13de1,0xa8c86c06,
  91563. 0xa5191a93,0x1d3a574e,0x1ad1b8bf,0x385cdf8b,0x47d2cfe3,0xbbecc28a },
  91564. { 0x69cec548,0x98d326c0,0xf240a0b2,0x4f5bc1dd,0x29057236,0x241a7062,
  91565. 0xc68294a4,0x0fc6e9c5,0xa319f17a,0x4d04838b,0x9ffc1c6f,0x8b612cf1 } },
  91566. /* 101 */
  91567. { { 0x4c3830eb,0x9bb0b501,0x8ee0d0c5,0x3d08f83c,0x79ba9389,0xa4a62642,
  91568. 0x9cbc2914,0x5d5d4044,0x074c46f0,0xae9eb83e,0x74ead7d6,0x63bb758f },
  91569. { 0xc6bb29e0,0x1c40d2ea,0x4b02f41e,0x95aa2d87,0x53cb199a,0x92989175,
  91570. 0x51584f6d,0xdd91bafe,0x31a1aaec,0x3715efb9,0x46780f9e,0xc1b6ae5b } },
  91571. /* 102 */
  91572. { { 0x42772f41,0xcded3e4b,0x3bcb79d1,0x3a700d5d,0x80feee60,0x4430d50e,
  91573. 0xf5e5d4bb,0x444ef1fc,0xe6e358ff,0xc660194f,0x6a91b43c,0xe68a2f32 },
  91574. { 0x977fe4d2,0x5842775c,0x7e2a41eb,0x78fdef5c,0xff8df00e,0x5f3bec02,
  91575. 0x5852525d,0xf4b840cd,0x4e6988bd,0x0870483a,0xcc64b837,0x39499e39 } },
  91576. /* 103 */
  91577. { { 0xb08df5fe,0xfc05de80,0x63ba0362,0x0c12957c,0xd5cf1428,0xea379414,
  91578. 0x54ef6216,0xc559132a,0xb9e65cf8,0x33d5f12f,0x1695d663,0x09c60278 },
  91579. { 0x61f7a2fb,0x3ac1ced4,0xd4f5eeb8,0xdd838444,0x8318fcad,0x82a38c6c,
  91580. 0xe9f1a864,0x315be2e5,0x442daf47,0x317b5771,0x95aa5f9e,0x81b5904a } },
  91581. /* 104 */
  91582. { { 0x8b21d232,0x6b6b1c50,0x8c2cba75,0x87f3dbc0,0xae9f0faf,0xa7e74b46,
  91583. 0xbb7b8079,0x036a0985,0x8d974a25,0x4f185b90,0xd9af5ec9,0x5aa7cef0 },
  91584. { 0x57dcfffc,0xe0566a70,0xb8453225,0x6ea311da,0x23368aa9,0x72ea1a8d,
  91585. 0x48cd552d,0xed9b2083,0xc80ea435,0xb987967c,0x6c104173,0xad735c75 } },
  91586. /* 105 */
  91587. { { 0xcee76ef4,0xaea85ab3,0xaf1d2b93,0x44997444,0xeacb923f,0x0851929b,
  91588. 0x51e3bc0c,0xb080b590,0x59be68a2,0xc4ee1d86,0x64b26cda,0xf00de219 },
  91589. { 0xf2e90d4d,0x8d7fb5c0,0x77d9ec64,0x00e219a7,0x5d1c491c,0xc4e6febd,
  91590. 0x1a8f4585,0x080e3754,0x48d2af9c,0x4a9b86c8,0xb6679851,0x2ed70db6 } },
  91591. /* 106 */
  91592. { { 0x586f25cb,0xaee44116,0xa0fcf70f,0xf7b6861f,0x18a350e8,0x55d2cd20,
  91593. 0x92dc286f,0x861bf3e5,0x6226aba7,0x9ab18ffa,0xa9857b03,0xd15827be },
  91594. { 0x92e6acef,0x26c1f547,0xac1fbac3,0x422c63c8,0xfcbfd71d,0xa2d8760d,
  91595. 0xb2511224,0x35f6a539,0x048d1a21,0xbaa88fa1,0xebf999db,0x49f1abe9 } },
  91596. /* 107 */
  91597. { { 0xf7492b73,0x16f9f4f4,0xcb392b1a,0xcf28ec1e,0x69ca6ffc,0x45b130d4,
  91598. 0xb72efa58,0x28ba8d40,0x5ca066f5,0xace987c7,0x4ad022eb,0x3e399246 },
  91599. { 0x752555bb,0x63a2d84e,0x9c2ae394,0xaaa93b4a,0xc89539ca,0xcd80424e,
  91600. 0xaa119a99,0x6d6b5a6d,0x379f2629,0xbd50334c,0xef3cc7d3,0x899e925e } },
  91601. /* 108 */
  91602. { { 0xbf825dc4,0xb7ff3651,0x40b9c462,0x0f741cc4,0x5cc4fb5b,0x771ff5a9,
  91603. 0x47fd56fe,0xcb9e9c9b,0x5626c0d3,0xbdf053db,0xf7e14098,0xa97ce675 },
  91604. { 0x6c934f5e,0x68afe5a3,0xccefc46f,0x6cd5e148,0xd7a88586,0xc7758570,
  91605. 0xdd558d40,0x49978f5e,0x64ae00c1,0xa1d5088a,0xf1d65bb2,0x58f2a720 } },
  91606. /* 109 */
  91607. { { 0x3e4daedb,0x66fdda4a,0x65d1b052,0x38318c12,0x4c4bbf5c,0x28d910a2,
  91608. 0x78a9cd14,0x762fe5c4,0xd2cc0aee,0x08e5ebaa,0xca0c654c,0xd2cdf257 },
  91609. { 0x08b717d2,0x48f7c58b,0x386cd07a,0x3807184a,0xae7d0112,0x3240f626,
  91610. 0xc43917b0,0x03e9361b,0x20aea018,0xf261a876,0x7e1e6372,0x53f556a4 } },
  91611. /* 110 */
  91612. { { 0x2f512a90,0xc84cee56,0x1b0ea9f1,0x24b3c004,0xe26cc1ea,0x0ee15d2d,
  91613. 0xf0c9ef7d,0xd848762c,0xd5341435,0x1026e9c5,0xfdb16b31,0x8f5b73dc },
  91614. { 0xd2c75d95,0x1f69bef2,0xbe064dda,0x8d33d581,0x57ed35e6,0x8c024c12,
  91615. 0xc309c281,0xf8d435f9,0xd6960193,0xfd295061,0xe9e49541,0x66618d78 } },
  91616. /* 111 */
  91617. { { 0x8ce382de,0x571cfd45,0xde900dde,0x175806ee,0x34aba3b5,0x61849965,
  91618. 0xde7aec95,0xe899778a,0xff4aa97f,0xe8f00f6e,0x010b0c6d,0xae971cb5 },
  91619. { 0x3af788f1,0x1827eebc,0xe413fe2d,0xd46229ff,0x4741c9b4,0x8a15455b,
  91620. 0xf8e424eb,0x5f02e690,0xdae87712,0x40a1202e,0x64944f6d,0x49b3bda2 } },
  91621. /* 112 */
  91622. { { 0x035b2d69,0xd63c6067,0x6bed91b0,0xb507150d,0x7afb39b2,0x1f35f82f,
  91623. 0x16012b66,0xb9bd9c01,0xed0a5f50,0x00d97960,0x2716f7c9,0xed705451 },
  91624. { 0x127abdb4,0x1576eff4,0xf01e701c,0x6850d698,0x3fc87e2f,0x9fa7d749,
  91625. 0xb0ce3e48,0x0b6bcc6f,0xf7d8c1c0,0xf4fbe1f5,0x02719cc6,0xcf75230e } },
  91626. /* 113 */
  91627. { { 0x722d94ed,0x6761d6c2,0x3718820e,0xd1ec3f21,0x25d0e7c6,0x65a40b70,
  91628. 0xbaf3cf31,0xd67f830e,0xb93ea430,0x633b3807,0x0bc96c69,0x17faa0ea },
  91629. { 0xdf866b98,0xe6bf3482,0xa9db52d4,0x205c1ee9,0xff9ab869,0x51ef9bbd,
  91630. 0x75eeb985,0x3863dad1,0xd3cf442a,0xef216c3b,0xf9c8e321,0x3fb228e3 } },
  91631. /* 114 */
  91632. { { 0x0760ac07,0x94f9b70c,0x9d79bf4d,0xf3c9ccae,0xc5ffc83d,0x73cea084,
  91633. 0xdc49c38e,0xef50f943,0xbc9e7330,0xf467a2ae,0x44ea7fba,0x5ee534b6 },
  91634. { 0x03609e7f,0x20cb6272,0x62fdc9f0,0x09844355,0x0f1457f7,0xaf5c8e58,
  91635. 0xb4b25941,0xd1f50a6c,0x2ec82395,0x77cb247c,0xda3dca33,0xa5f3e1e5 } },
  91636. /* 115 */
  91637. { { 0x7d85fa94,0x023489d6,0x2db9ce47,0x0ba40537,0xaed7aad1,0x0fdf7a1f,
  91638. 0x9a4ccb40,0xa57b0d73,0x5b18967c,0x48fcec99,0xb7274d24,0xf30b5b6e },
  91639. { 0xc81c5338,0x7ccb4773,0xa3ed6bd0,0xb85639e6,0x1d56eada,0x7d9df95f,
  91640. 0x0a1607ad,0xe256d57f,0x957574d6,0x6da7ffdc,0x01c7a8c4,0x65f84046 } },
  91641. /* 116 */
  91642. { { 0xcba1e7f1,0x8d45d0cb,0x02b55f64,0xef0a08c0,0x17e19892,0x771ca31b,
  91643. 0x4885907e,0xe1843ecb,0x364ce16a,0x67797ebc,0x8df4b338,0x816d2b2d },
  91644. { 0x39aa8671,0xe870b0e5,0xc102b5f5,0x9f0db3e4,0x1720c697,0x34296659,
  91645. 0x613c0d2a,0x0ad4c89e,0x418ddd61,0x1af900b2,0xd336e20e,0xe087ca72 } },
  91646. /* 117 */
  91647. { { 0xaba10079,0x222831ff,0x6d64fff2,0x0dc5f87b,0x3e8cb330,0x44547907,
  91648. 0x702a33fb,0xe815aaa2,0x5fba3215,0x338d6b2e,0x79f549c8,0x0f7535cb },
  91649. { 0x2ee95923,0x471ecd97,0xc6d1c09f,0x1e868b37,0xc666ef4e,0x2bc7b8ec,
  91650. 0x808a4bfc,0xf5416589,0x3fbc4d2e,0xf23e9ee2,0x2d75125b,0x4357236c } },
  91651. /* 118 */
  91652. { { 0xba9cdb1b,0xfe176d95,0x2f82791e,0x45a1ca01,0x4de4cca2,0x97654af2,
  91653. 0x5cc4bcb9,0xbdbf9d0e,0xad97ac0a,0xf6a7df50,0x61359fd6,0xc52112b0 },
  91654. { 0x4f05eae3,0x696d9ce3,0xe943ac2b,0x903adc02,0x0848be17,0xa9075347,
  91655. 0x2a3973e5,0x1e20f170,0x6feb67e9,0xe1aacc1c,0xe16bc6b9,0x2ca0ac32 } },
  91656. /* 119 */
  91657. { { 0xef871eb5,0xffea12e4,0xa8bf0a7a,0x94c2f25d,0x78134eaa,0x4d1e4c2a,
  91658. 0x0360fb10,0x11ed16fb,0x85fc11be,0x4029b6db,0xf4d390fa,0x5e9f7ab7 },
  91659. { 0x30646612,0x5076d72f,0xdda1d0d8,0xa0afed1d,0x85a1d103,0x29022257,
  91660. 0x4e276bcd,0xcb499e17,0x51246c3d,0x16d1da71,0x589a0443,0xc72d56d3 } },
  91661. /* 120 */
  91662. { { 0xdae5bb45,0xdf5ffc74,0x261bd6dc,0x99068c4a,0xaa98ec7b,0xdc0afa7a,
  91663. 0xf121e96d,0xedd2ee00,0x1414045c,0x163cc7be,0x335af50e,0xb0b1bbce },
  91664. { 0x01a06293,0xd440d785,0x6552e644,0xcdebab7c,0x8c757e46,0x48cb8dbc,
  91665. 0x3cabe3cb,0x81f9cf78,0xb123f59a,0xddd02611,0xeeb3784d,0x3dc7b88e } },
  91666. /* 121 */
  91667. { { 0xc4741456,0xe1b8d398,0x6032a121,0xa9dfa902,0x1263245b,0x1cbfc86d,
  91668. 0x5244718c,0xf411c762,0x05b0fc54,0x96521d54,0xdbaa4985,0x1afab46e },
  91669. { 0x8674b4ad,0xa75902ba,0x5ad87d12,0x486b43ad,0x36e0d099,0x72b1c736,
  91670. 0xbb6cd6d6,0x39890e07,0x59bace4e,0x8128999c,0x7b535e33,0xd8da430b } },
  91671. /* 122 */
  91672. { { 0xc6b75791,0x39f65642,0x21806bfb,0x050947a6,0x1362ef84,0x0ca3e370,
  91673. 0x8c3d2391,0x9bc60aed,0x732e1ddc,0x9b488671,0xa98ee077,0x12d10d9e },
  91674. { 0x3651b7dc,0xb6f2822d,0x80abd138,0x6345a5ba,0x472d3c84,0x62033262,
  91675. 0xacc57527,0xd54a1d40,0x424447cb,0x6ea46b3a,0x2fb1a496,0x5bc41057 } },
  91676. /* 123 */
  91677. { { 0xa751cd0e,0xe70c57a3,0xeba3c7d6,0x190d8419,0x9d47d55a,0xb1c3bee7,
  91678. 0xf912c6d8,0xda941266,0x407a6ad6,0x12e9aacc,0x6e838911,0xd6ce5f11 },
  91679. { 0x70e1f2ce,0x063ca97b,0x8213d434,0xa3e47c72,0x84df810a,0xa016e241,
  91680. 0xdfd881a4,0x688ad7b0,0xa89bf0ad,0xa37d99fc,0xa23c2d23,0xd8e3f339 } },
  91681. /* 124 */
  91682. { { 0x750bed6f,0xbdf53163,0x83e68b0a,0x808abc32,0x5bb08a33,0x85a36627,
  91683. 0x6b0e4abe,0xf72a3a0f,0xfaf0c6ad,0xf7716d19,0x5379b25f,0x22dcc020 },
  91684. { 0xf9a56e11,0x7400bf8d,0x56a47f21,0x6cb8bad7,0x7a6eb644,0x7c97176f,
  91685. 0xd1f5b646,0xe8fd84f7,0x44ddb054,0x98320a94,0x1dde86f5,0x07071ba3 } },
  91686. /* 125 */
  91687. { { 0x98f8fcb9,0x6fdfa0e5,0x94d0d70c,0x89cec8e0,0x106d20a8,0xa0899397,
  91688. 0xba8acc9c,0x915bfb9a,0x5507e01c,0x1370c94b,0x8a821ffb,0x83246a60 },
  91689. { 0xbe3c378f,0xa8273a9f,0x35a25be9,0x7e544789,0x4dd929d7,0x6cfa4972,
  91690. 0x365bd878,0x987fed9d,0x5c29a7ae,0x4982ac94,0x5ddd7ec5,0x4589a5d7 } },
  91691. /* 126 */
  91692. { { 0xa95540a9,0x9fabb174,0x0162c5b0,0x7cfb886f,0xea3dee18,0x17be766b,
  91693. 0xe88e624c,0xff7da41f,0x8b919c38,0xad0b71eb,0xf31ff9a9,0x86a522e0 },
  91694. { 0x868bc259,0xbc8e6f72,0x3ccef9e4,0x6130c638,0x9a466555,0x09f1f454,
  91695. 0x19b2bfb4,0x8e6c0f09,0x0ca7bb22,0x945c46c9,0x4dafb67b,0xacd87168 } },
  91696. /* 127 */
  91697. { { 0x10c53841,0x090c72ca,0x55a4fced,0xc20ae01b,0xe10234ad,0x03f7ebd5,
  91698. 0x85892064,0xb3f42a6a,0xb4a14722,0xbdbc30c0,0x8ca124cc,0x971bc437 },
  91699. { 0x517ff2ff,0x6f79f46d,0xecba947b,0x6a9c96e2,0x62925122,0x5e79f2f4,
  91700. 0x6a4e91f1,0x30a96bb1,0x2d4c72da,0x1147c923,0x5811e4df,0x65bc311f } },
  91701. /* 128 */
  91702. { { 0x139b3239,0x87c7dd7d,0x4d833bae,0x8b57824e,0x9fff0015,0xbcbc4878,
  91703. 0x909eaf1a,0x8ffcef8b,0xf1443a78,0x9905f4ee,0xe15cbfed,0x020dd4a2 },
  91704. { 0xa306d695,0xca2969ec,0xb93caf60,0xdf940cad,0x87ea6e39,0x67f7fab7,
  91705. 0xf98c4fe5,0x0d0ee10f,0xc19cb91e,0xc646879a,0x7d1d7ab4,0x4b4ea50c } },
  91706. /* 129 */
  91707. { { 0x7a0db57e,0x19e40945,0x9a8c9702,0xe6017cad,0x1be5cff9,0xdbf739e5,
  91708. 0xa7a938a2,0x3646b3cd,0x68350dfc,0x04511085,0x56e098b5,0xad3bd6f3 },
  91709. { 0xee2e3e3e,0x935ebabf,0x473926cb,0xfbd01702,0x9e9fb5aa,0x7c735b02,
  91710. 0x2e3feff0,0xc52a1b85,0x046b405a,0x9199abd3,0x39039971,0xe306fcec } },
  91711. /* 130 */
  91712. { { 0x23e4712c,0xd6d9aec8,0xc3c198ee,0x7ca8376c,0x31bebd8a,0xe6d83187,
  91713. 0xd88bfef3,0xed57aff3,0xcf44edc7,0x72a645ee,0x5cbb1517,0xd4e63d0b },
  91714. { 0xceee0ecf,0x98ce7a1c,0x5383ee8e,0x8f012633,0xa6b455e8,0x3b879078,
  91715. 0xc7658c06,0xcbcd3d96,0x0783336a,0x721d6fe7,0x5a677136,0xf21a7263 } },
  91716. /* 131 */
  91717. { { 0x9586ba11,0x19d8b3cd,0x8a5c0480,0xd9e0aeb2,0x2230ef5c,0xe4261dbf,
  91718. 0x02e6bf09,0x095a9dee,0x80dc7784,0x8963723c,0x145157b1,0x5c97dbaf },
  91719. { 0x4bc4503e,0x97e74434,0x85a6b370,0x0fb1cb31,0xcd205d4b,0x3e8df2be,
  91720. 0xf8f765da,0x497dd1bc,0x6c988a1a,0x92ef95c7,0x64dc4cfa,0x3f924baa } },
  91721. /* 132 */
  91722. { { 0x7268b448,0x6bf1b8dd,0xefd79b94,0xd4c28ba1,0xe4e3551f,0x2fa1f8c8,
  91723. 0x5c9187a9,0x769e3ad4,0x40326c0d,0x28843b4d,0x50d5d669,0xfefc8094 },
  91724. { 0x90339366,0x30c85bfd,0x5ccf6c3a,0x4eeb56f1,0x28ccd1dc,0x0e72b149,
  91725. 0xf2ce978e,0x73ee85b5,0x3165bb23,0xcdeb2bf3,0x4e410abf,0x8106c923 } },
  91726. /* 133 */
  91727. { { 0x7d02f4ee,0xc8df0161,0x18e21225,0x8a781547,0x6acf9e40,0x4ea895eb,
  91728. 0x6e5a633d,0x8b000cb5,0x7e981ffb,0xf31d86d5,0x4475bc32,0xf5c8029c },
  91729. { 0x1b568973,0x764561ce,0xa62996ec,0x2f809b81,0xda085408,0x9e513d64,
  91730. 0xe61ce309,0xc27d815d,0x272999e0,0x0da6ff99,0xfead73f7,0xbd284779 } },
  91731. /* 134 */
  91732. { { 0x9b1cdf2b,0x6033c2f9,0xbc5fa151,0x2a99cf06,0x12177b3b,0x7d27d259,
  91733. 0xc4485483,0xb1f15273,0x102e2297,0x5fd57d81,0xc7f6acb7,0x3d43e017 },
  91734. { 0x3a70eb28,0x41a8bb0b,0x3e80b06b,0x67de2d8e,0x70c28de5,0x09245a41,
  91735. 0xa7b26023,0xad7dbcb1,0x2cbc6c1e,0x70b08a35,0x9b33041f,0xb504fb66 } },
  91736. /* 135 */
  91737. { { 0xf97a27c2,0xa8e85ab5,0xc10a011b,0x6ac5ec8b,0xffbcf161,0x55745533,
  91738. 0x65790a60,0x01780e85,0x99ee75b0,0xe451bf85,0x39c29881,0x8907a63b },
  91739. { 0x260189ed,0x76d46738,0x47bd35cb,0x284a4436,0x20cab61e,0xd74e8c40,
  91740. 0x416cf20a,0x6264bf8c,0x5fd820ce,0xfa5a6c95,0xf24bb5fc,0xfa7154d0 } },
  91741. /* 136 */
  91742. { { 0x9b3f5034,0x18482cec,0xcd9e68fd,0x962d445a,0x95746f23,0x266fb1d6,
  91743. 0x58c94a4b,0xc66ade5a,0xed68a5b6,0xdbbda826,0x7ab0d6ae,0x05664a4d },
  91744. { 0x025e32fc,0xbcd4fe51,0xa96df252,0x61a5aebf,0x31592a31,0xd88a07e2,
  91745. 0x98905517,0x5d9d94de,0x5fd440e7,0x96bb4010,0xe807db4c,0x1b0c47a2 } },
  91746. /* 137 */
  91747. { { 0x08223878,0x5c2a6ac8,0xe65a5558,0xba08c269,0x9bbc27fd,0xd22b1b9b,
  91748. 0x72b9607d,0x919171bf,0xe588dc58,0x9ab455f9,0x23662d93,0x6d54916e },
  91749. { 0x3b1de0c1,0x8da8e938,0x804f278f,0xa84d186a,0xd3461695,0xbf4988cc,
  91750. 0xe10eb0cb,0xf5eae3be,0xbf2a66ed,0x1ff8b68f,0xc305b570,0xa68daf67 } },
  91751. /* 138 */
  91752. { { 0x44b2e045,0xc1004cff,0x4b1c05d4,0x91b5e136,0x88a48a07,0x53ae4090,
  91753. 0xea11bb1a,0x73fb2995,0x3d93a4ea,0x32048570,0x3bfc8a5f,0xcce45de8 },
  91754. { 0xc2b3106e,0xaff4a97e,0xb6848b4f,0x9069c630,0xed76241c,0xeda837a6,
  91755. 0x6cc3f6cf,0x8a0daf13,0x3da018a8,0x199d049d,0xd9093ba3,0xf867c6b1 } },
  91756. /* 139 */
  91757. { { 0x56527296,0xe4d42a56,0xce71178d,0xae26c73d,0x6c251664,0x70a0adac,
  91758. 0x5dc0ae1d,0x813483ae,0xdaab2daf,0x7574eacd,0xc2d55f4f,0xc56b52dc },
  91759. { 0x95f32923,0x872bc167,0x5bdd2a89,0x4be17581,0xa7699f00,0x9b57f1e7,
  91760. 0x3ac2de02,0x5fcd9c72,0x92377739,0x83af3ba1,0xfc50b97f,0xa64d4e2b } },
  91761. /* 140 */
  91762. { { 0x0e552b40,0x2172dae2,0xd34d52e8,0x62f49725,0x07958f98,0x7930ee40,
  91763. 0x751fdd74,0x56da2a90,0xf53e48c3,0xf1192834,0x8e53c343,0x34d2ac26 },
  91764. { 0x13111286,0x1073c218,0xda9d9827,0x201dac14,0xee95d378,0xec2c29db,
  91765. 0x1f3ee0b1,0x9316f119,0x544ce71c,0x7890c9f0,0x27612127,0xd77138af } },
  91766. /* 141 */
  91767. { { 0x3b4ad1cd,0x78045e6d,0x4aa49bc1,0xcd86b94e,0xfd677a16,0x57e51f1d,
  91768. 0xfa613697,0xd9290935,0x34f4d893,0x7a3f9593,0x5d5fcf9b,0x8c9c248b },
  91769. { 0x6f70d4e9,0x9f23a482,0x63190ae9,0x17273454,0x5b081a48,0x4bdd7c13,
  91770. 0x28d65271,0x1e2de389,0xe5841d1f,0x0bbaaa25,0x746772e5,0xc4c18a79 } },
  91771. /* 142 */
  91772. { { 0x593375ac,0x10ee2681,0x7dd5e113,0x4f3288be,0x240f3538,0x9a97b2fb,
  91773. 0x1de6b1e2,0xfa11089f,0x1351bc58,0x516da562,0x2dfa85b5,0x573b6119 },
  91774. { 0x6cba7df5,0x89e96683,0x8c28ab40,0xf299be15,0xad43fcbf,0xe91c9348,
  91775. 0x9a1cefb3,0xe9bbc7cc,0x738b2775,0xc8add876,0x775eaa01,0x6e3b1f2e } },
  91776. /* 143 */
  91777. { { 0xb677788b,0x0365a888,0x3fd6173c,0x634ae8c4,0x9e498dbe,0x30498761,
  91778. 0xc8f779ab,0x08c43e6d,0x4c09aca9,0x068ae384,0x2018d170,0x2380c70b },
  91779. { 0xa297c5ec,0xcf77fbc3,0xca457948,0xdacbc853,0x336bec7e,0x3690de04,
  91780. 0x14eec461,0x26bbac64,0x1f713abf,0xd1c23c7e,0xe6fd569e,0xf08bbfcd } },
  91781. /* 144 */
  91782. { { 0x84770ee3,0x5f8163f4,0x744a1706,0x0e0c7f94,0xe1b2d46d,0x9c8f05f7,
  91783. 0xd01fd99a,0x417eafe7,0x11440e5b,0x2ba15df5,0x91a6fbcf,0xdc5c552a },
  91784. { 0xa270f721,0x86271d74,0xa004485b,0x32c0a075,0x8defa075,0x9d1a87e3,
  91785. 0xbf0d20fe,0xb590a7ac,0x8feda1f5,0x430c41c2,0x58f6ec24,0x454d2879 } },
  91786. /* 145 */
  91787. { { 0x7c525435,0x52b7a635,0x37c4bdbc,0x3d9ef57f,0xdffcc475,0x2bb93e9e,
  91788. 0x7710f3be,0xf7b8ba98,0x21b727de,0x42ee86da,0x2e490d01,0x55ac3f19 },
  91789. { 0xc0c1c390,0x487e3a6e,0x446cde7b,0x036fb345,0x496ae951,0x089eb276,
  91790. 0x71ed1234,0xedfed4d9,0x900f0b46,0x661b0dd5,0x8582f0d3,0x11bd6f1b } },
  91791. /* 146 */
  91792. { { 0x076bc9d1,0x5cf9350f,0xcf3cd2c3,0x15d903be,0x25af031c,0x21cfc8c2,
  91793. 0x8b1cc657,0xe0ad3248,0x70014e87,0xdd9fb963,0x297f1658,0xf0f3a5a1 },
  91794. { 0xf1f703aa,0xbb908fba,0x2f6760ba,0x2f9cc420,0x66a38b51,0x00ceec66,
  91795. 0x05d645da,0x4deda330,0xf7de3394,0xb9cf5c72,0x1ad4c906,0xaeef6502 } },
  91796. /* 147 */
  91797. { { 0x7a19045d,0x0583c8b1,0xd052824c,0xae7c3102,0xff6cfa58,0x2a234979,
  91798. 0x62c733c0,0xfe9dffc9,0x9c0c4b09,0x3a7fa250,0x4fe21805,0x516437bb },
  91799. { 0xc2a23ddb,0x9454e3d5,0x289c104e,0x0726d887,0x4fd15243,0x8977d918,
  91800. 0x6d7790ba,0xc559e73f,0x465af85f,0x8fd3e87d,0x5feee46b,0xa2615c74 } },
  91801. /* 148 */
  91802. { { 0x4335167d,0xc8d607a8,0xe0f5c887,0x8b42d804,0x398d11f9,0x5f9f13df,
  91803. 0x20740c67,0x5aaa5087,0xa3d9234b,0x83da9a6a,0x2a54bad1,0xbd3a5c4e },
  91804. { 0x2db0f658,0xdd13914c,0x5a3f373a,0x29dcb66e,0x5245a72b,0xbfd62df5,
  91805. 0x91e40847,0x19d18023,0xb136b1ae,0xd9df74db,0x3f93bc5b,0x72a06b6b } },
  91806. /* 149 */
  91807. { { 0xad19d96f,0x6da19ec3,0xfb2a4099,0xb342daa4,0x662271ea,0x0e61633a,
  91808. 0xce8c054b,0x3bcece81,0x8bd62dc6,0x7cc8e061,0xee578d8b,0xae189e19 },
  91809. { 0xdced1eed,0x73e7a25d,0x7875d3ab,0xc1257f0a,0x1cfef026,0x2cb2d5a2,
  91810. 0xb1fdf61c,0xd98ef39b,0x24e83e6c,0xcd8e6f69,0xc7b7088b,0xd71e7076 } },
  91811. /* 150 */
  91812. { { 0x9d4245bf,0x33936830,0x2ac2953b,0x22d96217,0x56c3c3cd,0xb3bf5a82,
  91813. 0x0d0699e8,0x50c9be91,0x8f366459,0xec094463,0x513b7c35,0x6c056dba },
  91814. { 0x045ab0e3,0x687a6a83,0x445c9295,0x8d40b57f,0xa16f5954,0x0f345048,
  91815. 0x3d8f0a87,0x64b5c639,0x9f71c5e2,0x106353a2,0x874f0dd4,0xdd58b475 } },
  91816. /* 151 */
  91817. { { 0x62230c72,0x67ec084f,0x481385e3,0xf14f6cca,0x4cda7774,0xf58bb407,
  91818. 0xaa2dbb6b,0xe15011b1,0x0c035ab1,0xd488369d,0x8245f2fd,0xef83c24a },
  91819. { 0x9fdc2538,0xfb57328f,0x191fe46a,0x79808293,0x32ede548,0xe28f5c44,
  91820. 0xea1a022c,0x1b3cda99,0x3df2ec7f,0x39e639b7,0x760e9a18,0x77b6272b } },
  91821. /* 152 */
  91822. { { 0xa65d56d5,0x2b1d51bd,0x7ea696e0,0x3a9b71f9,0x9904f4c4,0x95250ecc,
  91823. 0xe75774b7,0x8bc4d6eb,0xeaeeb9aa,0x0e343f8a,0x930e04cb,0xc473c1d1 },
  91824. { 0x064cd8ae,0x282321b1,0x5562221c,0xf4b4371e,0xd1bf1221,0xc1cc81ec,
  91825. 0xe2c8082f,0xa52a07a9,0xba64a958,0x350d8e59,0x6fb32c9a,0x29e4f3de } },
  91826. /* 153 */
  91827. { { 0xba89aaa5,0x0aa9d56c,0xc4c6059e,0xf0208ac0,0xbd6ddca4,0x7400d9c6,
  91828. 0xf2c2f74a,0xb384e475,0xb1562dd3,0x4c1061fc,0x2e153b8d,0x3924e248 },
  91829. { 0x849808ab,0xf38b8d98,0xa491aa36,0x29bf3260,0x88220ede,0x85159ada,
  91830. 0xbe5bc422,0x8b47915b,0xd7300967,0xa934d72e,0x2e515d0d,0xc4f30398 } },
  91831. /* 154 */
  91832. { { 0x1b1de38b,0xe3e9ee42,0x42636760,0xa124e25a,0x90165b1a,0x90bf73c0,
  91833. 0x146434c5,0x21802a34,0x2e1fa109,0x54aa83f2,0xed9c51e9,0x1d4bd03c },
  91834. { 0x798751e6,0xc2d96a38,0x8c3507f5,0xed27235f,0xc8c24f88,0xb5fb80e2,
  91835. 0xd37f4f78,0xf873eefa,0xf224ba96,0x7229fd74,0x9edd7149,0x9dcd9199 } },
  91836. /* 155 */
  91837. { { 0x4e94f22a,0xee9f81a6,0xf71ec341,0xe5609892,0xa998284e,0x6c818ddd,
  91838. 0x3b54b098,0x9fd47295,0x0e8a7cc9,0x47a6ac03,0xb207a382,0xde684e5e },
  91839. { 0x2b6b956b,0x4bdd1ecd,0xf01b3583,0x09084414,0x55233b14,0xe2f80b32,
  91840. 0xef5ebc5e,0x5a0fec54,0xbf8b29a2,0x74cf25e6,0x7f29e014,0x1c757fa0 } },
  91841. /* 156 */
  91842. { { 0xeb0fdfe4,0x1bcb5c4a,0xf0899367,0xd7c649b3,0x05bc083b,0xaef68e3f,
  91843. 0xa78aa607,0x57a06e46,0x21223a44,0xa2136ecc,0x52f5a50b,0x89bd6484 },
  91844. { 0x4455f15a,0x724411b9,0x08a9c0fd,0x23dfa970,0x6db63bef,0x7b0da4d1,
  91845. 0xfb162443,0x6f8a7ec1,0xe98284fb,0xc1ac9cee,0x33566022,0x085a582b } },
  91846. /* 157 */
  91847. { { 0xec1f138a,0x15cb61f9,0x668f0c28,0x11c9a230,0xdf93f38f,0xac829729,
  91848. 0x4048848d,0xcef25698,0x2bba8fbf,0x3f686da0,0x111c619a,0xed5fea78 },
  91849. { 0xd6d1c833,0x9b4f73bc,0x86e7bf80,0x50951606,0x042b1d51,0xa2a73508,
  91850. 0x5fb89ec2,0x9ef6ea49,0x5ef8b892,0xf1008ce9,0x9ae8568b,0x78a7e684 } },
  91851. /* 158 */
  91852. { { 0x10470cd8,0x3fe83a7c,0xf86df000,0x92734682,0xda9409b5,0xb5dac06b,
  91853. 0x94939c5f,0x1e7a9660,0x5cc116dc,0xdec6c150,0x66bac8cc,0x1a52b408 },
  91854. { 0x6e864045,0x5303a365,0x9139efc1,0x45eae72a,0x6f31d54f,0x83bec646,
  91855. 0x6e958a6d,0x2fb4a86f,0x4ff44030,0x6760718e,0xe91ae0df,0x008117e3 } },
  91856. /* 159 */
  91857. { { 0x384310a2,0x5d5833ba,0x1fd6c9fc,0xbdfb4edc,0x849c4fb8,0xb9a4f102,
  91858. 0x581c1e1f,0xe5fb239a,0xd0a9746d,0xba44b2e7,0x3bd942b9,0x78f7b768 },
  91859. { 0xc87607ae,0x076c8ca1,0xd5caaa7e,0x82b23c2e,0x2763e461,0x6a581f39,
  91860. 0x3886df11,0xca8a5e4a,0x264e7f22,0xc87e90cf,0x215cfcfc,0x04f74870 } },
  91861. /* 160 */
  91862. { { 0x141d161c,0x5285d116,0x93c4ed17,0x67cd2e0e,0x7c36187e,0x12c62a64,
  91863. 0xed2584ca,0xf5329539,0x42fbbd69,0xc4c777c4,0x1bdfc50a,0x107de776 },
  91864. { 0xe96beebd,0x9976dcc5,0xa865a151,0xbe2aff95,0x9d8872af,0x0e0a9da1,
  91865. 0xa63c17cc,0x5e357a3d,0xe15cc67c,0xd31fdfd8,0x7970c6d8,0xc44bbefd } },
  91866. /* 161 */
  91867. { { 0x4c0c62f1,0x703f83e2,0x4e195572,0x9b1e28ee,0xfe26cced,0x6a82858b,
  91868. 0xc43638fa,0xd381c84b,0xa5ba43d8,0x94f72867,0x10b82743,0x3b4a783d },
  91869. { 0x7576451e,0xee1ad7b5,0x14b6b5c8,0xc3d0b597,0xfcacc1b8,0x3dc30954,
  91870. 0x472c9d7b,0x55df110e,0x02f8a328,0x97c86ed7,0x88dc098f,0xd0433413 } },
  91871. /* 162 */
  91872. { { 0x2ca8f2fe,0x1a60d152,0x491bd41f,0x61640948,0x58dfe035,0x6dae29a5,
  91873. 0x278e4863,0x9a615bea,0x9ad7c8e5,0xbbdb4477,0x2ceac2fc,0x1c706630 },
  91874. { 0x99699b4b,0x5e2b54c6,0x239e17e8,0xb509ca6d,0xea063a82,0x728165fe,
  91875. 0xb6a22e02,0x6b5e609d,0xb26ee1df,0x12813905,0x439491fa,0x07b9f722 } },
  91876. /* 163 */
  91877. { { 0x48ff4e49,0x1592ec14,0x6d644129,0x3e4e9f17,0x1156acc0,0x7acf8288,
  91878. 0xbb092b0b,0x5aa34ba8,0x7d38393d,0xcd0f9022,0xea4f8187,0x416724dd },
  91879. { 0xc0139e73,0x3c4e641c,0x91e4d87d,0xe0fe46cf,0xcab61f8a,0xedb3c792,
  91880. 0xd3868753,0x4cb46de4,0x20f1098a,0xe449c21d,0xf5b8ea6e,0x5e5fd059 } },
  91881. /* 164 */
  91882. { { 0x75856031,0x7fcadd46,0xeaf2fbd0,0x89c7a4cd,0x7a87c480,0x1af523ce,
  91883. 0x61d9ae90,0xe5fc1095,0xbcdb95f5,0x3fb5864f,0xbb5b2c7d,0xbeb5188e },
  91884. { 0x3ae65825,0x3d1563c3,0x0e57d641,0x116854c4,0x1942ebd3,0x11f73d34,
  91885. 0xc06955b3,0x24dc5904,0x995a0a62,0x8a0d4c83,0x5d577b7d,0xfb26b86d } },
  91886. /* 165 */
  91887. { { 0xc686ae17,0xc53108e7,0xd1c1da56,0x9090d739,0x9aec50ae,0x4583b013,
  91888. 0xa49a6ab2,0xdd9a088b,0xf382f850,0x28192eea,0xf5fe910e,0xcc8df756 },
  91889. { 0x9cab7630,0x877823a3,0xfb8e7fc1,0x64984a9a,0x364bfc16,0x5448ef9c,
  91890. 0xc44e2a9a,0xbbb4f871,0x435c95e9,0x901a41ab,0xaaa50a06,0xc6c23e5f } },
  91891. /* 166 */
  91892. { { 0x9034d8dd,0xb78016c1,0x0b13e79b,0x856bb44b,0xb3241a05,0x85c6409a,
  91893. 0x2d78ed21,0x8d2fe19a,0x726eddf2,0xdcc7c26d,0x25104f04,0x3ccaff5f },
  91894. { 0x6b21f843,0x397d7edc,0xe975de4c,0xda88e4dd,0x4f5ab69e,0x5273d396,
  91895. 0x9aae6cc0,0x537680e3,0x3e6f9461,0xf749cce5,0x957bffd3,0x021ddbd9 } },
  91896. /* 167 */
  91897. { { 0x777233cf,0x7b64585f,0x0942a6f0,0xfe6771f6,0xdfe6eef0,0x636aba7a,
  91898. 0x86038029,0x63bbeb56,0xde8fcf36,0xacee5842,0xd4a20524,0x48d9aa99 },
  91899. { 0x0da5e57a,0xcff7a74c,0xe549d6c9,0xc232593c,0xf0f2287b,0x68504bcc,
  91900. 0xbc8360b5,0x6d7d098d,0x5b402f41,0xeac5f149,0xb87d1bf1,0x61936f11 } },
  91901. /* 168 */
  91902. { { 0xb8153a9d,0xaa9da167,0x9e83ecf0,0xa49fe3ac,0x1b661384,0x14c18f8e,
  91903. 0x38434de1,0x61c24dab,0x283dae96,0x3d973c3a,0x82754fc9,0xc99baa01 },
  91904. { 0x4c26b1e3,0x477d198f,0xa7516202,0x12e8e186,0x362addfa,0x386e52f6,
  91905. 0xc3962853,0x31e8f695,0x6aaedb60,0xdec2af13,0x29cf74ac,0xfcfdb4c6 } },
  91906. /* 169 */
  91907. { { 0xcca40298,0x6b3ee958,0xf2f5d195,0xc3878153,0xed2eae5b,0x0c565630,
  91908. 0x3a697cf2,0xd089b37e,0xad5029ea,0xc2ed2ac7,0x0f0dda6a,0x7e5cdfad },
  91909. { 0xd9b86202,0xf98426df,0x4335e054,0xed1960b1,0x3f14639e,0x1fdb0246,
  91910. 0x0db6c670,0x17f709c3,0x773421e1,0xbfc687ae,0x26c1a8ac,0x13fefc4a } },
  91911. /* 170 */
  91912. { { 0x7ffa0a5f,0xe361a198,0xc63fe109,0xf4b26102,0x6c74e111,0x264acbc5,
  91913. 0x77abebaf,0x4af445fa,0x24cddb75,0x448c4fdd,0x44506eea,0x0b13157d },
  91914. { 0x72e9993d,0x22a6b159,0x85e5ecbe,0x2c3c57e4,0xfd83e1a1,0xa673560b,
  91915. 0xc3b8c83b,0x6be23f82,0x40bbe38e,0x40b13a96,0xad17399b,0x66eea033 } },
  91916. /* 171 */
  91917. { { 0xb4c6c693,0x49fc6e95,0x36af7d38,0xefc735de,0x35fe42fc,0xe053343d,
  91918. 0x6a9ab7c3,0xf0aa427c,0x4a0fcb24,0xc79f0436,0x93ebbc50,0x16287243 },
  91919. { 0x16927e1e,0x5c3d6bd0,0x673b984c,0x40158ed2,0x4cd48b9a,0xa7f86fc8,
  91920. 0x60ea282d,0x1643eda6,0xe2a1beed,0x45b393ea,0x19571a94,0x664c839e } },
  91921. /* 172 */
  91922. { { 0x27eeaf94,0x57745750,0xea99e1e7,0x2875c925,0x5086adea,0xc127e7ba,
  91923. 0x86fe424f,0x765252a0,0x2b6c0281,0x1143cc6c,0xd671312d,0xc9bb2989 },
  91924. { 0x51acb0a5,0x880c337c,0xd3c60f78,0xa3710915,0x9262b6ed,0x496113c0,
  91925. 0x9ce48182,0x5d25d9f8,0xb3813586,0x53b6ad72,0x4c0e159c,0x0ea3bebc } },
  91926. /* 173 */
  91927. { { 0xc5e49bea,0xcaba450a,0x7c05da59,0x684e5415,0xde7ac36c,0xa2e9cab9,
  91928. 0x2e6f957b,0x4ca79b5f,0x09b817b1,0xef7b0247,0x7d89df0f,0xeb304990 },
  91929. { 0x46fe5096,0x508f7307,0x2e04eaaf,0x695810e8,0x3512f76c,0x88ef1bd9,
  91930. 0x3ebca06b,0x77661351,0xccf158b7,0xf7d4863a,0x94ee57da,0xb2a81e44 } },
  91931. /* 174 */
  91932. { { 0x6d53e6ba,0xff288e5b,0x14484ea2,0xa90de1a9,0xed33c8ec,0x2fadb60c,
  91933. 0x28b66a40,0x579d6ef3,0xec24372d,0x4f2dd6dd,0x1d66ec7d,0xe9e33fc9 },
  91934. { 0x039eab6e,0x110899d2,0x3e97bb5e,0xa31a667a,0xcfdce68e,0x6200166d,
  91935. 0x5137d54b,0xbe83ebae,0x4800acdf,0x085f7d87,0x0c6f8c86,0xcf4ab133 } },
  91936. /* 175 */
  91937. { { 0x931e08fb,0x03f65845,0x1506e2c0,0x6438551e,0x9c36961f,0x5791f0dc,
  91938. 0xe3dcc916,0x68107b29,0xf495d2ca,0x83242374,0x6ee5895b,0xd8cfb663 },
  91939. { 0xa0349b1b,0x525e0f16,0x4a0fab86,0x33cd2c6c,0x2af8dda9,0x46c12ee8,
  91940. 0x71e97ad3,0x7cc424ba,0x37621eb0,0x69766ddf,0xa5f0d390,0x95565f56 } },
  91941. /* 176 */
  91942. { { 0x1a0f5e94,0xe0e7bbf2,0x1d82d327,0xf771e115,0xceb111fa,0x10033e3d,
  91943. 0xd3426638,0xd269744d,0x00d01ef6,0xbdf2d9da,0xa049ceaf,0x1cb80c71 },
  91944. { 0x9e21c677,0x17f18328,0x19c8f98b,0x6452af05,0x80b67997,0x35b9c5f7,
  91945. 0x40f8f3d4,0x5c2e1cbe,0x66d667ca,0x43f91656,0xcf9d6e79,0x9faaa059 } },
  91946. /* 177 */
  91947. { { 0x0a078fe6,0x8ad24618,0x464fd1dd,0xf6cc73e6,0xc3e37448,0x4d2ce34d,
  91948. 0xe3271b5f,0x624950c5,0xefc5af72,0x62910f5e,0xaa132bc6,0x8b585bf8 },
  91949. { 0xa839327f,0x11723985,0x4aac252f,0x34e2d27d,0x6296cc4e,0x402f59ef,
  91950. 0x47053de9,0x00ae055c,0x28b4f09b,0xfc22a972,0xfa0c180e,0xa9e86264 } },
  91951. /* 178 */
  91952. { { 0xbc310ecc,0x0b7b6224,0x67fa14ed,0x8a1a74f1,0x7214395c,0x87dd0960,
  91953. 0xf5c91128,0xdf1b3d09,0x86b264a8,0x39ff23c6,0x3e58d4c5,0xdc2d49d0 },
  91954. { 0xa9d6f501,0x2152b7d3,0xc04094f7,0xf4c32e24,0xd938990f,0xc6366596,
  91955. 0x94fb207f,0x084d078f,0x328594cb,0xfd99f1d7,0xcb2d96b3,0x36defa64 } },
  91956. /* 179 */
  91957. { { 0x13ed7cbe,0x4619b781,0x9784bd0e,0x95e50015,0x2c7705fe,0x2a32251c,
  91958. 0x5f0dd083,0xa376af99,0x0361a45b,0x55425c6c,0x1f291e7b,0x812d2cef },
  91959. { 0x5fd94972,0xccf581a0,0xe56dc383,0x26e20e39,0x63dbfbf0,0x0093685d,
  91960. 0x36b8c575,0x1fc164cc,0x390ef5e7,0xb9c5ab81,0x26908c66,0x40086beb } },
  91961. /* 180 */
  91962. { { 0x37e3c115,0xe5e54f79,0xc1445a8a,0x69b8ee8c,0xb7659709,0x79aedff2,
  91963. 0x1b46fbe6,0xe288e163,0xd18d7bb7,0xdb4844f0,0x48aa6424,0xe0ea23d0 },
  91964. { 0xf3d80a73,0x714c0e4e,0x3bd64f98,0x87a0aa9e,0x2ec63080,0x8844b8a8,
  91965. 0x255d81a3,0xe0ac9c30,0x455397fc,0x86151237,0x2f820155,0x0b979464 } },
  91966. /* 181 */
  91967. { { 0x4ae03080,0x127a255a,0x580a89fb,0x232306b4,0x6416f539,0x04e8cd6a,
  91968. 0x13b02a0e,0xaeb70dee,0x4c09684a,0xa3038cf8,0x28e433ee,0xa710ec3c },
  91969. { 0x681b1f7d,0x77a72567,0x2fc28170,0x86fbce95,0xf5735ac8,0xd3408683,
  91970. 0x6bd68e93,0x3a324e2a,0xc027d155,0x7ec74353,0xd4427177,0xab60354c } },
  91971. /* 182 */
  91972. { { 0xef4c209d,0x32a5342a,0x08d62704,0x2ba75274,0xc825d5fe,0x4bb4af6f,
  91973. 0xd28e7ff1,0x1c3919ce,0xde0340f6,0x1dfc2fdc,0x29f33ba9,0xc6580baf },
  91974. { 0x41d442cb,0xae121e75,0x3a4724e4,0x4c7727fd,0x524f3474,0xe556d6a4,
  91975. 0x785642a2,0x87e13cc7,0xa17845fd,0x182efbb1,0x4e144857,0xdcec0cf1 } },
  91976. /* 183 */
  91977. { { 0xe9539819,0x1cb89541,0x9d94dbf1,0xc8cb3b4f,0x417da578,0x1d353f63,
  91978. 0x8053a09e,0xb7a697fb,0xc35d8b78,0x8d841731,0xb656a7a9,0x85748d6f },
  91979. { 0xc1859c5d,0x1fd03947,0x535d22a2,0x6ce965c1,0x0ca3aadc,0x1966a13e,
  91980. 0x4fb14eff,0x9802e41d,0x76dd3fcd,0xa9048cbb,0xe9455bba,0x89b182b5 } },
  91981. /* 184 */
  91982. { { 0x43360710,0xd777ad6a,0x55e9936b,0x841287ef,0x04a21b24,0xbaf5c670,
  91983. 0x35ad86f1,0xf2c0725f,0xc707e72e,0x338fa650,0xd8883e52,0x2bf8ed2e },
  91984. { 0xb56e0d6a,0xb0212cf4,0x6843290c,0x50537e12,0x98b3dc6f,0xd8b184a1,
  91985. 0x0210b722,0xd2be9a35,0x559781ee,0x407406db,0x0bc18534,0x5a78d591 } },
  91986. /* 185 */
  91987. { { 0xd748b02c,0x4d57aa2a,0xa12b3b95,0xbe5b3451,0x64711258,0xadca7a45,
  91988. 0x322153db,0x597e091a,0x32eb1eab,0xf3271006,0x2873f301,0xbd9adcba },
  91989. { 0x38543f7f,0xd1dc79d1,0x921b1fef,0x00022092,0x1e5df8ed,0x86db3ef5,
  91990. 0x9e6b944a,0x888cae04,0x791a32b4,0x71bd29ec,0xa6d1c13e,0xd3516206 } },
  91991. /* 186 */
  91992. { { 0x55924f43,0x2ef6b952,0x4f9de8d5,0xd2f401ae,0xadc68042,0xfc73e8d7,
  91993. 0x0d9d1bb4,0x627ea70c,0xbbf35679,0xc3bb3e3e,0xd882dee4,0x7e8a254a },
  91994. { 0xb5924407,0x08906f50,0xa1ad444a,0xf14a0e61,0x65f3738e,0xaa0efa21,
  91995. 0xae71f161,0xd60c7dd6,0xf175894d,0x9e8390fa,0x149f4c00,0xd115cd20 } },
  91996. /* 187 */
  91997. { { 0xa52abf77,0x2f2e2c1d,0x54232568,0xc2a0dca5,0x54966dcc,0xed423ea2,
  91998. 0xcd0dd039,0xe48c93c7,0x176405c7,0x1e54a225,0x70d58f2e,0x1efb5b16 },
  91999. { 0x94fb1471,0xa751f9d9,0x67d2941d,0xfdb31e1f,0x53733698,0xa6c74eb2,
  92000. 0x89a0f64a,0xd3155d11,0xa4b8d2b6,0x4414cfe4,0xf7a8e9e3,0x8d5a4be8 } },
  92001. /* 188 */
  92002. { { 0x52669e98,0x5c96b4d4,0x8fd42a03,0x4547f922,0xd285174e,0xcf5c1319,
  92003. 0x064bffa0,0x805cd1ae,0x246d27e7,0x50e8bc4f,0xd5781e11,0xf89ef98f },
  92004. { 0xdee0b63f,0xb4ff95f6,0x222663a4,0xad850047,0x4d23ce9c,0x02691860,
  92005. 0x50019f59,0x3e5309ce,0x69a508ae,0x27e6f722,0x267ba52c,0xe9376652 } },
  92006. /* 189 */
  92007. { { 0xc0368708,0xa04d289c,0x5e306e1d,0xc458872f,0x33112fea,0x76fa23de,
  92008. 0x6efde42e,0x718e3974,0x1d206091,0xf0c98cdc,0x14a71987,0x5fa3ca62 },
  92009. { 0xdcaa9f2a,0xeee8188b,0x589a860d,0x312cc732,0xc63aeb1f,0xf9808dd6,
  92010. 0x4ea62b53,0x70fd43db,0x890b6e97,0x2c2bfe34,0xfa426aa6,0x105f863c } },
  92011. /* 190 */
  92012. { { 0xb38059ad,0x0b29795d,0x90647ea0,0x5686b77e,0xdb473a3e,0xeff0470e,
  92013. 0xf9b6d1e2,0x278d2340,0xbd594ec7,0xebbff95b,0xd3a7f23d,0xf4b72334 },
  92014. { 0xa5a83f0b,0x2a285980,0x9716a8b3,0x0786c41a,0x22511812,0x138901bd,
  92015. 0xe2fede6e,0xd1b55221,0xdf4eb590,0x0806e264,0x762e462e,0x6c4c897e } },
  92016. /* 191 */
  92017. { { 0xb4b41d9d,0xd10b905f,0x4523a65b,0x826ca466,0xb699fa37,0x535bbd13,
  92018. 0x73bc8f90,0x5b9933d7,0xcd2118ad,0x9332d61f,0xd4a65fd0,0x158c693e },
  92019. { 0xe6806e63,0x4ddfb2a8,0xb5de651b,0xe31ed3ec,0x819bc69a,0xf9460e51,
  92020. 0x2c76b1f8,0x6229c0d6,0x901970a3,0xbb78f231,0x9cee72b8,0x31f3820f } },
  92021. /* 192 */
  92022. { { 0xc09e1c72,0xe931caf2,0x12990cf4,0x0715f298,0x943262d8,0x33aad81d,
  92023. 0x73048d3f,0x5d292b7a,0xdc7415f6,0xb152aaa4,0x0fd19587,0xc3d10fd9 },
  92024. { 0x75ddadd0,0xf76b35c5,0x1e7b694c,0x9f5f4a51,0xc0663025,0x2f1ab7eb,
  92025. 0x920260b0,0x01c9cc87,0x05d39da6,0xc4b1f61a,0xeb4a9c4e,0x6dcd76c4 } },
  92026. /* 193 */
  92027. { { 0xfdc83f01,0x0ba0916f,0x9553e4f9,0x354c8b44,0xffc5e622,0xa6cc511a,
  92028. 0xe95be787,0xb954726a,0x75b41a62,0xcb048115,0xebfde989,0xfa2ae6cd },
  92029. { 0x0f24659a,0x6376bbc7,0x4c289c43,0x13a999fd,0xec9abd8b,0xc7134184,
  92030. 0xa789ab04,0x28c02bf6,0xd3e526ec,0xff841ebc,0x640893a8,0x442b191e } },
  92031. /* 194 */
  92032. { { 0xfa2b6e20,0x4cac6c62,0xf6d69861,0x97f29e9b,0xbc96d12d,0x228ab1db,
  92033. 0x5e8e108d,0x6eb91327,0x40771245,0xd4b3d4d1,0xca8a803a,0x61b20623 },
  92034. { 0xa6a560b1,0x2c2f3b41,0x3859fcf4,0x879e1d40,0x024dbfc3,0x7cdb5145,
  92035. 0x3bfa5315,0x55d08f15,0xaa93823a,0x2f57d773,0xc6a2c9a2,0xa97f259c } },
  92036. /* 195 */
  92037. { { 0xe58edbbb,0xc306317b,0x79dfdf13,0x25ade51c,0x16d83dd6,0x6b5beaf1,
  92038. 0x1dd8f925,0xe8038a44,0xb2a87b6b,0x7f00143c,0xf5b438de,0xa885d00d },
  92039. { 0xcf9e48bd,0xe9f76790,0xa5162768,0xf0bdf9f0,0xad7b57cb,0x0436709f,
  92040. 0xf7c15db7,0x7e151c12,0x5d90ee3b,0x3514f022,0x2c361a8d,0x2e84e803 } },
  92041. /* 196 */
  92042. { { 0x563ec8d8,0x2277607d,0xe3934cb7,0xa661811f,0xf58fd5de,0x3ca72e7a,
  92043. 0x62294c6a,0x7989da04,0xf6bbefe9,0x88b3708b,0x53ed7c82,0x0d524cf7 },
  92044. { 0x2f30c073,0x69f699ca,0x9dc1dcf3,0xf0fa264b,0x05f0aaf6,0x44ca4568,
  92045. 0xd19b9baf,0x0f5b23c7,0xeabd1107,0x39193f41,0x2a7c9b83,0x9e3e10ad } },
  92046. /* 197 */
  92047. { { 0xd4ae972f,0xa90824f0,0xc6e846e7,0x43eef02b,0x29d2160a,0x7e460612,
  92048. 0xfe604e91,0x29a178ac,0x4eb184b2,0x23056f04,0xeb54cdf4,0x4fcad55f },
  92049. { 0xae728d15,0xa0ff96f3,0xc6a00331,0x8a2680c6,0x7ee52556,0x5f84cae0,
  92050. 0xc5a65dad,0x5e462c3a,0xe2d23f4f,0x5d2b81df,0xc5b1eb07,0x6e47301b } },
  92051. /* 198 */
  92052. { { 0xaf8219b9,0x77411d68,0x51b1907a,0xcb883ce6,0x101383b5,0x25c87e57,
  92053. 0x982f970d,0x9c7d9859,0x118305d2,0xaa6abca5,0x9013a5db,0x725fed2f },
  92054. { 0xababd109,0x487cdbaf,0x87586528,0xc0f8cf56,0x8ad58254,0xa02591e6,
  92055. 0xdebbd526,0xc071b1d1,0x961e7e31,0x927dfe8b,0x9263dfe1,0x55f895f9 } },
  92056. /* 199 */
  92057. { { 0xb175645b,0xf899b00d,0xb65b4b92,0x51f3a627,0xb67399ef,0xa2f3ac8d,
  92058. 0xe400bc20,0xe717867f,0x1967b952,0x42cc9020,0x3ecd1de1,0x3d596751 },
  92059. { 0xdb979775,0xd41ebcde,0x6a2e7e88,0x99ba61bc,0x321504f2,0x039149a5,
  92060. 0x27ba2fad,0xe7dc2314,0xb57d8368,0x9f556308,0x57da80a7,0x2b6d16c9 } },
  92061. /* 200 */
  92062. { { 0x279ad982,0x84af5e76,0x9c8b81a6,0x9bb4c92d,0x0e698e67,0xd79ad44e,
  92063. 0x265fc167,0xe8be9048,0x0c3a4ccc,0xf135f7e6,0xb8863a33,0xa0a10d38 },
  92064. { 0xd386efd9,0xe197247c,0xb52346c2,0x0eefd3f9,0x78607bc8,0xc22415f9,
  92065. 0x508674ce,0xa2a8f862,0xc8c9d607,0xa72ad09e,0x50fa764f,0xcd9f0ede } },
  92066. /* 201 */
  92067. { { 0xd1a46d4d,0x063391c7,0x9eb01693,0x2df51c11,0x849e83de,0xc5849800,
  92068. 0x8ad08382,0x48fd09aa,0xaa742736,0xa405d873,0xe1f9600c,0xee49e61e },
  92069. { 0x48c76f73,0xd76676be,0x01274b2a,0xd9c100f6,0x83f8718d,0x110bb67c,
  92070. 0x02fc0d73,0xec85a420,0x744656ad,0xc0449e1e,0x37d9939b,0x28ce7376 } },
  92071. /* 202 */
  92072. { { 0x44544ac7,0x97e9af72,0xba010426,0xf2c658d5,0xfb3adfbd,0x732dec39,
  92073. 0xa2df0b07,0xd12faf91,0x2171e208,0x8ac26725,0x5b24fa54,0xf820cdc8 },
  92074. { 0x94f4cf77,0x307a6eea,0x944a33c6,0x18c783d2,0x0b741ac5,0x4b939d4c,
  92075. 0x3ffbb6e4,0x1d7acd15,0x7a255e44,0x06a24858,0xce336d50,0x14fbc494 } },
  92076. /* 203 */
  92077. { { 0x51584e3c,0x9b920c0c,0xf7e54027,0xc7733c59,0x88422bbe,0xe24ce139,
  92078. 0x523bd6ab,0x11ada812,0xb88e6def,0xde068800,0xfe8c582d,0x7b872671 },
  92079. { 0x7de53510,0x4e746f28,0xf7971968,0x492f8b99,0x7d928ac2,0x1ec80bc7,
  92080. 0x432eb1b5,0xb3913e48,0x32028f6e,0xad084866,0x8fc2f38b,0x122bb835 } },
  92081. /* 204 */
  92082. { { 0x3b0b29c3,0x0a9f3b1e,0x4fa44151,0x837b6432,0x17b28ea7,0xb9905c92,
  92083. 0x98451750,0xf39bc937,0xce8b6da1,0xcd383c24,0x010620b2,0x299f57db },
  92084. { 0x58afdce3,0x7b6ac396,0x3d05ef47,0xa15206b3,0xb9bb02ff,0xa0ae37e2,
  92085. 0x9db3964c,0x107760ab,0x67954bea,0xe29de9a0,0x431c3f82,0x446a1ad8 } },
  92086. /* 205 */
  92087. { { 0x5c6b8195,0xc6fecea0,0xf49e71b9,0xd744a7c5,0x177a7ae7,0xa8e96acc,
  92088. 0x358773a7,0x1a05746c,0x37567369,0xa4162146,0x87d1c971,0xaa0217f7 },
  92089. { 0x77fd3226,0x61e9d158,0xe4f600be,0x0f6f2304,0x7a6dff07,0xa9c4cebc,
  92090. 0x09f12a24,0xd15afa01,0x8c863ee9,0x2bbadb22,0xe5eb8c78,0xa28290e4 } },
  92091. /* 206 */
  92092. { { 0x3e9de330,0x55b87fa0,0x195c145b,0x12b26066,0xa920bef0,0xe08536e0,
  92093. 0x4d195adc,0x7bff6f2c,0x945f4187,0x7f319e9d,0xf892ce47,0xf9848863 },
  92094. { 0x4fe37657,0xd0efc1d3,0x5cf0e45a,0x3c58de82,0x8b0ccbbe,0x626ad21a,
  92095. 0xaf952fc5,0xd2a31208,0xeb437357,0x81791995,0x98e95d4f,0x5f19d30f } },
  92096. /* 207 */
  92097. { { 0x0e6865bb,0x72e83d9a,0xf63456a6,0x22f5af3b,0x463c8d9e,0x409e9c73,
  92098. 0xdfe6970e,0x40e9e578,0x711b91ca,0x876b6efa,0x942625a3,0x895512cf },
  92099. { 0xcb4e462b,0x84c8eda8,0x4412e7c8,0x84c0154a,0xceb7b71f,0x04325db1,
  92100. 0x66f70877,0x1537dde3,0x1992b9ac,0xf3a09399,0xd498ae77,0xa7316606 } },
  92101. /* 208 */
  92102. { { 0xcad260f5,0x13990d2f,0xeec0e8c0,0x76c3be29,0x0f7bd7d5,0x7dc5bee0,
  92103. 0xefebda4b,0x9be167d2,0x9122b87e,0xcce3dde6,0x82b5415c,0x75a28b09 },
  92104. { 0xe84607a6,0xf6810bcd,0x6f4dbf0d,0xc6d58128,0x1b4dafeb,0xfead577d,
  92105. 0x066b28eb,0x9bc440b2,0x8b17e84b,0x53f1da97,0xcda9a575,0x0459504b } },
  92106. /* 209 */
  92107. { { 0x329e5836,0x13e39a02,0xf717269d,0x2c9e7d51,0xf26c963b,0xc5ac58d6,
  92108. 0x79967bf5,0x3b0c6c43,0x55908d9d,0x60bbea3f,0xf07c9ad1,0xd84811e7 },
  92109. { 0x5bd20e4a,0xfe7609a7,0x0a70baa8,0xe4325dd2,0xb3600386,0x3711f370,
  92110. 0xd0924302,0x97f9562f,0x4acc4436,0x040dc0c3,0xde79cdd4,0xfd6d725c } },
  92111. /* 210 */
  92112. { { 0xcf13eafb,0xb3efd0e3,0x5aa0ae5f,0x21009cbb,0x79022279,0xe480c553,
  92113. 0xb2fc9a6d,0x755cf334,0x07096ae7,0x8564a5bf,0xbd238139,0xddd649d0 },
  92114. { 0x8a045041,0xd0de10b1,0xc957d572,0x6e05b413,0x4e0fb25c,0x5c5ff806,
  92115. 0x641162fb,0xd933179b,0xe57439f9,0x42d48485,0x8a8d72aa,0x70c5bd0a } },
  92116. /* 211 */
  92117. { { 0x97bdf646,0xa7671738,0xab329f7c,0xaa1485b4,0xf8f25fdf,0xce3e11d6,
  92118. 0xc6221824,0x76a3fc7e,0xf3924740,0x045f281f,0x96d13a9a,0x24557d4e },
  92119. { 0xdd4c27cd,0x875c804b,0x0f5c7fea,0x11c5f0f4,0xdc55ff7e,0xac8c880b,
  92120. 0x1103f101,0x2acddec5,0xf99faa89,0x38341a21,0xce9d6b57,0xc7b67a2c } },
  92121. /* 212 */
  92122. { { 0x8e357586,0x9a0d724f,0xdf648da0,0x1d7f4ff5,0xfdee62a5,0x9c3e6c9b,
  92123. 0x0389b372,0x0499cef0,0x98eab879,0xe904050d,0x6c051617,0xe8eef1b6 },
  92124. { 0xc37e3ca9,0xebf5bfeb,0xa4e0b91d,0x7c5e946d,0x2c4bea28,0x79097314,
  92125. 0xee67b2b7,0x81f6c109,0xdafc5ede,0xaf237d9b,0x2abb04c7,0xd2e60201 } },
  92126. /* 213 */
  92127. { { 0x8a4f57bf,0x6156060c,0xff11182a,0xf9758696,0x6296ef00,0x8336773c,
  92128. 0xff666899,0x9c054bce,0x719cd11c,0xd6a11611,0xdbe1acfa,0x9824a641 },
  92129. { 0xba89fd01,0x0b7b7a5f,0x889f79d8,0xf8d3b809,0xf578285c,0xc5e1ea08,
  92130. 0xae6d8288,0x7ac74536,0x7521ef5f,0x5d37a200,0xb260a25d,0x5ecc4184 } },
  92131. /* 214 */
  92132. { { 0xa708c8d3,0xddcebb19,0xc63f81ec,0xe63ed04f,0x11873f95,0xd045f5a0,
  92133. 0x79f276d5,0x3b5ad544,0x425ae5b3,0x81272a3d,0x10ce1605,0x8bfeb501 },
  92134. { 0x888228bf,0x4233809c,0xb2aff7df,0x4bd82acf,0x0cbd4a7f,0x9c68f180,
  92135. 0x6b44323d,0xfcd77124,0x891db957,0x60c0fcf6,0x04da8f7f,0xcfbb4d89 } },
  92136. /* 215 */
  92137. { { 0x3b26139a,0x9a6a5df9,0xb2cc7eb8,0x3e076a83,0x5a964bcd,0x47a8e82d,
  92138. 0xb9278d6b,0x8a4e2a39,0xe4443549,0x93506c98,0xf1e0d566,0x06497a8f },
  92139. { 0x2b1efa05,0x3dee8d99,0x45393e33,0x2da63ca8,0xcf0579ad,0xa4af7277,
  92140. 0x3236d8ea,0xaf4b4639,0x32b617f5,0x6ccad95b,0xb88bb124,0xce76d8b8 } },
  92141. /* 216 */
  92142. { { 0x083843dc,0x63d2537a,0x1e4153b4,0x89eb3514,0xea9afc94,0x5175ebc4,
  92143. 0x8ed1aed7,0x7a652580,0xd85e8297,0x67295611,0xb584b73d,0x8dd2d68b },
  92144. { 0x0133c3a4,0x237139e6,0x4bd278ea,0x9de838ab,0xc062fcd9,0xe829b072,
  92145. 0x63ba8706,0x70730d4f,0xd3cd05ec,0x6080483f,0x0c85f84d,0x872ab5b8 } },
  92146. /* 217 */
  92147. { { 0x999d4d49,0xfc0776d3,0xec3f45e7,0xa3eb59de,0x0dae1fc1,0xbc990e44,
  92148. 0xa15371ff,0x33596b1e,0x9bc7ab25,0xd447dcb2,0x35979582,0xcd5b63e9 },
  92149. { 0x77d1ff11,0xae3366fa,0xedee6903,0x59f28f05,0xa4433bf2,0x6f43fed1,
  92150. 0xdf9ce00e,0x15409c9b,0xaca9c5dc,0x21b5cded,0x82d7bdb4,0xf9f33595 } },
  92151. /* 218 */
  92152. { { 0x9422c792,0x95944378,0xc958b8bf,0x239ea923,0xdf076541,0x4b61a247,
  92153. 0xbb9fc544,0x4d29ce85,0x0b424559,0x9a692a67,0x0e486900,0x6e0ca5a0 },
  92154. { 0x85b3bece,0x6b79a782,0xc61f9892,0x41f35e39,0xae747f82,0xff82099a,
  92155. 0xd0ca59d6,0x58c8ae3f,0x99406b5f,0x4ac930e2,0x9df24243,0x2ce04eb9 } },
  92156. /* 219 */
  92157. { { 0x1ac37b82,0x4366b994,0x25b04d83,0xff0c728d,0x19c47b7c,0x1f551361,
  92158. 0xbeff13e7,0xdbf2d5ed,0xe12a683d,0xf78efd51,0x989cf9c4,0x82cd85b9 },
  92159. { 0xe0cb5d37,0xe23c6db6,0x72ee1a15,0x818aeebd,0x28771b14,0x8212aafd,
  92160. 0x1def817d,0x7bc221d9,0x9445c51f,0xdac403a2,0x12c3746b,0x711b0517 } },
  92161. /* 220 */
  92162. { { 0x5ea99ecc,0x0ed9ed48,0xb8cab5e1,0xf799500d,0xb570cbdc,0xa8ec87dc,
  92163. 0xd35dfaec,0x52cfb2c2,0x6e4d80a4,0x8d31fae2,0xdcdeabe5,0xe6a37dc9 },
  92164. { 0x1deca452,0x5d365a34,0x0d68b44e,0x09a5f8a5,0xa60744b1,0x59238ea5,
  92165. 0xbb4249e9,0xf2fedc0d,0xa909b2e3,0xe395c74e,0x39388250,0xe156d1a5 } },
  92166. /* 221 */
  92167. { { 0x47181ae9,0xd796b3d0,0x44197808,0xbaf44ba8,0x34cf3fac,0xe6933094,
  92168. 0xc3bd5c46,0x41aa6ade,0xeed947c6,0x4fda75d8,0x9ea5a525,0xacd9d412 },
  92169. { 0xd430301b,0x65cc55a3,0x7b52ea49,0x3c9a5bcf,0x159507f0,0x22d319cf,
  92170. 0xde74a8dd,0x2ee0b9b5,0x877ac2b6,0x20c26a1e,0x92e7c314,0x387d73da } },
  92171. /* 222 */
  92172. { { 0x8cd3fdac,0x13c4833e,0x332e5b8e,0x76fcd473,0xe2fe1fd3,0xff671b4b,
  92173. 0x5d98d8ec,0x4d734e8b,0x514bbc11,0xb1ead3c6,0x7b390494,0xd14ca858 },
  92174. { 0x5d2d37e9,0x95a443af,0x00464622,0x73c6ea73,0x15755044,0xa44aeb4b,
  92175. 0xfab58fee,0xba3f8575,0xdc680a6f,0x9779dbc9,0x7b37ddfc,0xe1ee5f5a } },
  92176. /* 223 */
  92177. { { 0x12d29f46,0xcd0b4648,0x0ed53137,0x93295b0b,0x80bef6c9,0xbfe26094,
  92178. 0x54248b00,0xa6565788,0x80e7f9c4,0x69c43fca,0xbe141ea1,0x2190837b },
  92179. { 0xa1b26cfb,0x875e159a,0x7affe852,0x90ca9f87,0x92ca598e,0x15e6550d,
  92180. 0x1938ad11,0xe3e0945d,0x366ef937,0xef7636bb,0xb39869e5,0xb6034d0b } },
  92181. /* 224 */
  92182. { { 0x26d8356e,0x4d255e30,0xd314626f,0xf83666ed,0xd0c8ed64,0x421ddf61,
  92183. 0x26677b61,0x96e473c5,0x9e9b18b3,0xdad4af7e,0xa9393f75,0xfceffd4a },
  92184. { 0x11c731d5,0x843138a1,0xb2f141d9,0x05bcb3a1,0x617b7671,0x20e1fa95,
  92185. 0x88ccec7b,0xbefce812,0x90f1b568,0x582073dc,0x1f055cb7,0xf572261a } },
  92186. /* 225 */
  92187. { { 0x36973088,0xf3148277,0x86a9f980,0xc008e708,0xe046c261,0x1b795947,
  92188. 0xca76bca0,0xdf1e6a7d,0x71acddf0,0xabafd886,0x1364d8f4,0xff7054d9 },
  92189. { 0xe2260594,0x2cf63547,0xd73b277e,0x468a5372,0xef9bd35e,0xc7419e24,
  92190. 0x24043cc3,0x2b4a1c20,0x890b39cd,0xa28f047a,0x46f9a2e3,0xdca2cea1 } },
  92191. /* 226 */
  92192. { { 0x53277538,0xab788736,0xcf697738,0xa734e225,0x6b22e2c1,0x66ee1d1e,
  92193. 0xebe1d212,0x2c615389,0x02bb0766,0xf36cad40,0x3e64f207,0x120885c3 },
  92194. { 0x90fbfec2,0x59e77d56,0xd7a574ae,0xf9e781aa,0x5d045e53,0x801410b0,
  92195. 0xa91b5f0e,0xd3b5f0aa,0x7fbb3521,0xb3d1df00,0xc72bee9a,0x11c4b33e } },
  92196. /* 227 */
  92197. { { 0x83c3a7f3,0xd32b9832,0x88d8a354,0x8083abcf,0x50f4ec5a,0xdeb16404,
  92198. 0x641e2907,0x18d747f0,0xf1bbf03e,0x4e8978ae,0x88a0cd89,0x932447dc },
  92199. { 0xcf3d5897,0x561e0feb,0x13600e6d,0xfc3a682f,0xd16a6b73,0xc78b9d73,
  92200. 0xd29bf580,0xe713fede,0x08d69e5c,0x0a225223,0x1ff7fda4,0x3a924a57 } },
  92201. /* 228 */
  92202. { { 0xb4093bee,0xfb64554c,0xa58c6ec0,0xa6d65a25,0x43d0ed37,0x4126994d,
  92203. 0x55152d44,0xa5689a51,0x284caa8d,0xb8e5ea8c,0xd1f25538,0x33f05d4f },
  92204. { 0x1b615d6e,0xe0fdfe09,0x705507da,0x2ded7e8f,0x17bbcc80,0xdd5631e5,
  92205. 0x267fd11f,0x4f87453e,0xff89d62d,0xc6da723f,0xe3cda21d,0x55cbcae2 } },
  92206. /* 229 */
  92207. { { 0x6b4e84f3,0x336bc94e,0x4ef72c35,0x72863031,0xeeb57f99,0x6d85fdee,
  92208. 0xa42ece1b,0x7f4e3272,0x36f0320a,0x7f86cbb5,0x923331e6,0xf09b6a2b },
  92209. { 0x56778435,0x21d3ecf1,0x8323b2d2,0x2977ba99,0x1704bc0f,0x6a1b57fb,
  92210. 0x389f048a,0xd777cf8b,0xac6b42cd,0x9ce2174f,0x09e6c55a,0x404e2bff } },
  92211. /* 230 */
  92212. { { 0x204c5ddb,0x9b9b135e,0x3eff550e,0x9dbfe044,0xec3be0f6,0x35eab4bf,
  92213. 0x0a43e56f,0x8b4c3f0d,0x0e73f9b3,0x4c1c6673,0x2c78c905,0x92ed38bd },
  92214. { 0xa386e27c,0xc7003f6a,0xaced8507,0xb9c4f46f,0x59df5464,0xea024ec8,
  92215. 0x429572ea,0x4af96152,0xe1fc1194,0x279cd5e2,0x281e358c,0xaa376a03 } },
  92216. /* 231 */
  92217. { { 0x3cdbc95c,0x07859223,0xef2e337a,0xaae1aa6a,0x472a8544,0xc040108d,
  92218. 0x8d037b7d,0x80c853e6,0x8c7eee24,0xd221315c,0x8ee47752,0x195d3856 },
  92219. { 0xdacd7fbe,0xd4b1ba03,0xd3e0c52b,0x4b5ac61e,0x6aab7b52,0x68d3c052,
  92220. 0x660e3fea,0xf0d7248c,0x3145efb4,0xafdb3f89,0x8f40936d,0xa73fd9a3 } },
  92221. /* 232 */
  92222. { { 0xbb1b17ce,0x891b9ef3,0xc6127f31,0x14023667,0x305521fd,0x12b2e58d,
  92223. 0xe3508088,0x3a47e449,0xff751507,0xe49fc84b,0x5310d16e,0x4023f722 },
  92224. { 0xb73399fa,0xa608e5ed,0xd532aa3e,0xf12632d8,0x845e8415,0x13a2758e,
  92225. 0x1fc2d861,0xae4b6f85,0x339d02f2,0x3879f5b1,0x80d99ebd,0x446d22a6 } },
  92226. /* 233 */
  92227. { { 0x4be164f1,0x0f502302,0x88b81920,0x8d09d2d6,0x984aceff,0x514056f1,
  92228. 0x75e9e80d,0xa5c4ddf0,0xdf496a93,0x38cb47e6,0x38df6bf7,0x899e1d6b },
  92229. { 0xb59eb2a6,0x69e87e88,0x9b47f38b,0x280d9d63,0x3654e955,0x599411ea,
  92230. 0x969aa581,0xcf8dd4fd,0x530742a7,0xff5c2baf,0x1a373085,0xa4391536 } },
  92231. /* 234 */
  92232. { { 0xa8a4bdd2,0x6ace72a3,0xb68ef702,0xc656cdd1,0x90c4dad8,0xd4a33e7e,
  92233. 0x9d951c50,0x4aece08a,0x085d68e6,0xea8005ae,0x6f7502b8,0xfdd7a7d7 },
  92234. { 0x98d6fa45,0xce6fb0a6,0x1104eb8c,0x228f8672,0xda09d7dc,0xd23d8787,
  92235. 0x2ae93065,0x5521428b,0xea56c366,0x95faba3d,0x0a88aca5,0xedbe5039 } },
  92236. /* 235 */
  92237. { { 0xbfb26c82,0xd64da0ad,0x952c2f9c,0xe5d70b3c,0xf7e77f68,0xf5e8f365,
  92238. 0x08f2d695,0x7234e002,0xd12e7be6,0xfaf900ee,0x4acf734e,0x27dc6934 },
  92239. { 0xc260a46a,0x80e4ff5e,0x2dc31c28,0x7da5ebce,0xca69f552,0x485c5d73,
  92240. 0x69cc84c2,0xcdfb6b29,0xed6d4eca,0x031c5afe,0x22247637,0xc7bbf4c8 } },
  92241. /* 236 */
  92242. { { 0x49fe01b2,0x9d5b72c7,0x793a91b8,0x34785186,0xcf460438,0xa3ba3c54,
  92243. 0x3ab21b6f,0x73e8e43d,0xbe57b8ab,0x50cde8e0,0xdd204264,0x6488b3a7 },
  92244. { 0xdddc4582,0xa9e398b3,0x5bec46fe,0x1698c1a9,0x156d3843,0x7f1446ef,
  92245. 0x770329a2,0x3fd25dd8,0x2c710668,0x05b1221a,0xa72ee6cf,0x65b2dc2a } },
  92246. /* 237 */
  92247. { { 0xcd021d63,0x21a885f7,0xfea61f08,0x3f344b15,0xc5cf73e6,0xad5ba6dd,
  92248. 0x227a8b23,0x154d0d8f,0xdc559311,0x9b74373c,0x98620fa1,0x4feab715 },
  92249. { 0x7d9ec924,0x5098938e,0x6d47e550,0x84d54a5e,0x1b617506,0x1a2d1bdc,
  92250. 0x615868a4,0x99fe1782,0x3005a924,0x171da780,0x7d8f79b6,0xa70bf5ed } },
  92251. /* 238 */
  92252. { { 0xfe2216c5,0x0bc1250d,0x7601b351,0x2c37e250,0xd6f06b7e,0xb6300175,
  92253. 0x8bfeb9b7,0x4dde8ca1,0xb82f843d,0x4f210432,0xb1ac0afd,0x8d70e2f9 },
  92254. { 0xaae91abb,0x25c73b78,0x863028f2,0x0230dca3,0xe5cf30b7,0x8b923ecf,
  92255. 0x5506f265,0xed754ec2,0x729a5e39,0x8e41b88c,0xbabf889b,0xee67cec2 } },
  92256. /* 239 */
  92257. { { 0x1be46c65,0xe183acf5,0xe7565d7a,0x9789538f,0xd9627b4e,0x87873391,
  92258. 0x9f1d9187,0xbf4ac4c1,0x4691f5c8,0x5db99f63,0x74a1fb98,0xa68df803 },
  92259. { 0xbf92b5fa,0x3c448ed1,0x3e0bdc32,0xa098c841,0x79bf016c,0x8e74cd55,
  92260. 0x115e244d,0x5df0d09c,0x3410b66e,0x9418ad01,0x17a02130,0x8b6124cb } },
  92261. /* 240 */
  92262. { { 0xc26e3392,0x425ec3af,0xa1722e00,0xc07f8470,0xe2356b43,0xdcc28190,
  92263. 0xb1ef59a6,0x4ed97dff,0xc63028c1,0xc22b3ad1,0x68c18988,0x070723c2 },
  92264. { 0x4cf49e7d,0x70da302f,0x3f12a522,0xc5e87c93,0x18594148,0x74acdd1d,
  92265. 0xca74124c,0xad5f73ab,0xd69fd478,0xe72e4a3e,0x7b117cc3,0x61593868 } },
  92266. /* 241 */
  92267. { { 0xa9aa0486,0x7b7b9577,0xa063d557,0x6e41fb35,0xda9047d7,0xb017d5c7,
  92268. 0x68a87ba9,0x8c748280,0xdf08ad93,0xab45fa5c,0x4c288a28,0xcd9fb217 },
  92269. { 0x5747843d,0x59544642,0xa56111e3,0x34d64c6c,0x4bfce8d5,0x12e47ea1,
  92270. 0x6169267f,0x17740e05,0xeed03fb5,0x5c49438e,0x4fc3f513,0x9da30add } },
  92271. /* 242 */
  92272. { { 0xccfa5200,0xc4e85282,0x6a19b13d,0x2707608f,0xf5726e2f,0xdcb9a53d,
  92273. 0xe9427de5,0x612407c9,0xd54d582a,0x3e5a17e1,0x655ae118,0xb99877de },
  92274. { 0x015254de,0x6f0e972b,0xf0a6f7c5,0x92a56db1,0xa656f8b2,0xd297e4e1,
  92275. 0xad981983,0x99fe0052,0x07cfed84,0xd3652d2f,0x843c1738,0xc784352e } },
  92276. /* 243 */
  92277. { { 0x7e9b2d8a,0x6ee90af0,0x57cf1964,0xac8d7018,0x71f28efc,0xf6ed9031,
  92278. 0x6812b20e,0x7f70d5a9,0xf1c61eee,0x27b557f4,0xc6263758,0xf1c9bd57 },
  92279. { 0x2a1a6194,0x5cf7d014,0x1890ab84,0xdd614e0b,0x0e93c2a6,0x3ef9de10,
  92280. 0xe0cd91c5,0xf98cf575,0x14befc32,0x504ec0c6,0x6279d68c,0xd0513a66 } },
  92281. /* 244 */
  92282. { { 0xa859fb6a,0xa8eadbad,0xdb283666,0xcf8346e7,0x3e22e355,0x7b35e61a,
  92283. 0x99639c6b,0x293ece2c,0x56f241c8,0xfa0162e2,0xbf7a1dda,0xd2e6c7b9 },
  92284. { 0x40075e63,0xd0de6253,0xf9ec8286,0x2405aa61,0x8fe45494,0x2237830a,
  92285. 0x364e9c8c,0x4fd01ac7,0x904ba750,0x4d9c3d21,0xaf1b520b,0xd589be14 } },
  92286. /* 245 */
  92287. { { 0x4662e53b,0x13576a4f,0xf9077676,0x35ec2f51,0x97c0af97,0x66297d13,
  92288. 0x9e598b58,0xed3201fe,0x5e70f604,0x49bc752a,0xbb12d951,0xb54af535 },
  92289. { 0x212c1c76,0x36ea4c2b,0xeb250dfd,0x18f5bbc7,0x9a0a1a46,0xa0d466cc,
  92290. 0xdac2d917,0x52564da4,0x8e95fab5,0x206559f4,0x9ca67a33,0x7487c190 } },
  92291. /* 246 */
  92292. { { 0xdde98e9c,0x75abfe37,0x2a411199,0x99b90b26,0xdcdb1f7c,0x1b410996,
  92293. 0x8b3b5675,0xab346f11,0xf1f8ae1e,0x04852193,0x6b8b98c1,0x1ec4d227 },
  92294. { 0x45452baa,0xba3bc926,0xacc4a572,0x387d1858,0xe51f171e,0x9478eff6,
  92295. 0x931e1c00,0xf357077d,0xe54c8ca8,0xffee77cd,0x551dc9a4,0xfb4892ff } },
  92296. /* 247 */
  92297. { { 0x2db8dff8,0x5b1bdad0,0x5a2285a2,0xd462f4fd,0xda00b461,0x1d6aad8e,
  92298. 0x41306d1b,0x43fbefcf,0x6a13fe19,0x428e86f3,0x17f89404,0xc8b2f118 },
  92299. { 0xf0d51afb,0x762528aa,0x549b1d06,0xa3e2fea4,0xea3ddf66,0x86fad8f2,
  92300. 0x4fbdd206,0x0d9ccc4b,0xc189ff5a,0xcde97d4c,0x199f19a6,0xc36793d6 } },
  92301. /* 248 */
  92302. { { 0x51b85197,0xea38909b,0xb4c92895,0xffb17dd0,0x1ddb3f3f,0x0eb0878b,
  92303. 0xc57cf0f2,0xb05d28ff,0x1abd57e2,0xd8bde2e7,0xc40c1b20,0x7f2be28d },
  92304. { 0x299a2d48,0x6554dca2,0x8377982d,0x5130ba2e,0x1071971a,0x8863205f,
  92305. 0x7cf2825d,0x15ee6282,0x03748f2b,0xd4b6c57f,0x430385a0,0xa9e3f4da } },
  92306. /* 249 */
  92307. { { 0x83fbc9c6,0x33eb7cec,0x4541777e,0x24a311c7,0x4f0767fc,0xc81377f7,
  92308. 0x4ab702da,0x12adae36,0x2a779696,0xb7fcb6db,0x01cea6ad,0x4a6fb284 },
  92309. { 0xcdfc73de,0x5e8b1d2a,0x1b02fd32,0xd0efae8d,0xd81d8519,0x3f99c190,
  92310. 0xfc808971,0x3c18f7fa,0x51b7ae7b,0x41f713e7,0xf07fc3f8,0x0a4b3435 } },
  92311. /* 250 */
  92312. { { 0x019b7d2e,0x7dda3c4c,0xd4dc4b89,0x631c8d1a,0x1cdb313c,0x5489cd6e,
  92313. 0x4c07bb06,0xd44aed10,0x75f000d1,0x8f97e13a,0xdda5df4d,0x0e9ee64f },
  92314. { 0x3e346910,0xeaa99f3b,0xfa294ad7,0x622f6921,0x0d0b2fe9,0x22aaa20d,
  92315. 0x1e5881ba,0x4fed2f99,0xc1571802,0x9af3b2d6,0xdc7ee17c,0x919e67a8 } },
  92316. /* 251 */
  92317. { { 0x76250533,0xc724fe4c,0x7d817ef8,0x8a2080e5,0x172c9751,0xa2afb0f4,
  92318. 0x17c0702e,0x9b10cdeb,0xc9b7e3e9,0xbf3975e3,0x1cd0cdc5,0x206117df },
  92319. { 0xbe05ebd5,0xfb049e61,0x16c782c0,0xeb0bb55c,0xab7fed09,0x13a331b8,
  92320. 0x632863f0,0xf6c58b1d,0x4d3b6195,0x6264ef6e,0x9a53f116,0x92c51b63 } },
  92321. /* 252 */
  92322. { { 0x288b364d,0xa57c7bc8,0x7b41e5c4,0x4a562e08,0x698a9a11,0x699d21c6,
  92323. 0xf3f849b9,0xa4ed9581,0x9eb726ba,0xa223eef3,0xcc2884f9,0x13159c23 },
  92324. { 0x3a3f4963,0x73931e58,0x0ada6a81,0x96500389,0x5ab2950b,0x3ee8a1c6,
  92325. 0x775fab52,0xeedf4949,0x4f2671b6,0x63d652e1,0x3c4e2f55,0xfed4491c } },
  92326. /* 253 */
  92327. { { 0xf4eb453e,0x335eadc3,0xcadd1a5b,0x5ff74b63,0x5d84a91a,0x6933d0d7,
  92328. 0xb49ba337,0x9ca3eeb9,0xc04c15b8,0x1f6facce,0xdc09a7e4,0x4ef19326 },
  92329. { 0x3dca3233,0x53d2d324,0xa2259d4b,0x0ee40590,0x5546f002,0x18c22edb,
  92330. 0x09ea6b71,0x92429801,0xb0e91e61,0xaada0add,0x99963c50,0x5fe53ef4 } },
  92331. /* 254 */
  92332. { { 0x90c28c65,0x372dd06b,0x119ce47d,0x1765242c,0x6b22fc82,0xc041fb80,
  92333. 0xb0a7ccc1,0x667edf07,0x1261bece,0xc79599e7,0x19cff22a,0xbc69d9ba },
  92334. { 0x13c06819,0x009d77cd,0xe282b79d,0x635a66ae,0x225b1be8,0x4edac4a6,
  92335. 0x524008f9,0x57d4f4e4,0xb056af84,0xee299ac5,0x3a0bc386,0xcc38444c } },
  92336. /* 255 */
  92337. { { 0xcd4c2356,0x490643b1,0x750547be,0x740a4851,0xd4944c04,0x643eaf29,
  92338. 0x299a98a0,0xba572479,0xee05fdf9,0x48b29f16,0x089b2d7b,0x33fb4f61 },
  92339. { 0xa950f955,0x86704902,0xfedc3ddf,0x97e1034d,0x05fbb6a2,0x211320b6,
  92340. 0x432299bb,0x23d7b93f,0x8590e4a3,0x1fe1a057,0xf58c0ce6,0x8e1d0586 } },
  92341. };
  92342. /* Multiply the base point of P384 by the scalar and return the result.
  92343. * If map is true then convert result to affine coordinates.
  92344. *
  92345. * Stripe implementation.
  92346. * Pre-generated: 2^0, 2^48, ...
  92347. * Pre-generated: products of all combinations of above.
  92348. * 8 doubles and adds (with qz=1)
  92349. *
  92350. * r Resulting point.
  92351. * k Scalar to multiply by.
  92352. * map Indicates whether to convert result to affine.
  92353. * ct Constant time required.
  92354. * heap Heap to use for allocation.
  92355. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  92356. */
  92357. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  92358. int map, int ct, void* heap)
  92359. {
  92360. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  92361. k, map, ct, heap);
  92362. }
  92363. #endif
  92364. /* Multiply the base point of P384 by the scalar and return the result.
  92365. * If map is true then convert result to affine coordinates.
  92366. *
  92367. * km Scalar to multiply by.
  92368. * r Resulting point.
  92369. * map Indicates whether to convert result to affine.
  92370. * heap Heap to use for allocation.
  92371. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  92372. */
  92373. int sp_ecc_mulmod_base_384(const mp_int* km, ecc_point* r, int map, void* heap)
  92374. {
  92375. #ifdef WOLFSSL_SP_SMALL_STACK
  92376. sp_point_384* point = NULL;
  92377. sp_digit* k = NULL;
  92378. #else
  92379. sp_point_384 point[1];
  92380. sp_digit k[12];
  92381. #endif
  92382. int err = MP_OKAY;
  92383. #ifdef WOLFSSL_SP_SMALL_STACK
  92384. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  92385. DYNAMIC_TYPE_ECC);
  92386. if (point == NULL)
  92387. err = MEMORY_E;
  92388. if (err == MP_OKAY) {
  92389. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  92390. DYNAMIC_TYPE_ECC);
  92391. if (k == NULL)
  92392. err = MEMORY_E;
  92393. }
  92394. #endif
  92395. if (err == MP_OKAY) {
  92396. sp_384_from_mp(k, 12, km);
  92397. err = sp_384_ecc_mulmod_base_12(point, k, map, 1, heap);
  92398. }
  92399. if (err == MP_OKAY) {
  92400. err = sp_384_point_to_ecc_point_12(point, r);
  92401. }
  92402. #ifdef WOLFSSL_SP_SMALL_STACK
  92403. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  92404. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  92405. #endif
  92406. return err;
  92407. }
  92408. /* Multiply the base point of P384 by the scalar, add point a and return
  92409. * the result. If map is true then convert result to affine coordinates.
  92410. *
  92411. * km Scalar to multiply by.
  92412. * am Point to add to scalar multiply result.
  92413. * inMont Point to add is in montgomery form.
  92414. * r Resulting point.
  92415. * map Indicates whether to convert result to affine.
  92416. * heap Heap to use for allocation.
  92417. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  92418. */
  92419. int sp_ecc_mulmod_base_add_384(const mp_int* km, const ecc_point* am,
  92420. int inMont, ecc_point* r, int map, void* heap)
  92421. {
  92422. #ifdef WOLFSSL_SP_SMALL_STACK
  92423. sp_point_384* point = NULL;
  92424. sp_digit* k = NULL;
  92425. #else
  92426. sp_point_384 point[2];
  92427. sp_digit k[12 + 12 * 2 * 6];
  92428. #endif
  92429. sp_point_384* addP = NULL;
  92430. sp_digit* tmp = NULL;
  92431. int err = MP_OKAY;
  92432. #ifdef WOLFSSL_SP_SMALL_STACK
  92433. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  92434. DYNAMIC_TYPE_ECC);
  92435. if (point == NULL)
  92436. err = MEMORY_E;
  92437. if (err == MP_OKAY) {
  92438. k = (sp_digit*)XMALLOC(
  92439. sizeof(sp_digit) * (12 + 12 * 2 * 6),
  92440. heap, DYNAMIC_TYPE_ECC);
  92441. if (k == NULL)
  92442. err = MEMORY_E;
  92443. }
  92444. #endif
  92445. if (err == MP_OKAY) {
  92446. addP = point + 1;
  92447. tmp = k + 12;
  92448. sp_384_from_mp(k, 12, km);
  92449. sp_384_point_from_ecc_point_12(addP, am);
  92450. }
  92451. if ((err == MP_OKAY) && (!inMont)) {
  92452. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  92453. }
  92454. if ((err == MP_OKAY) && (!inMont)) {
  92455. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  92456. }
  92457. if ((err == MP_OKAY) && (!inMont)) {
  92458. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  92459. }
  92460. if (err == MP_OKAY) {
  92461. err = sp_384_ecc_mulmod_base_12(point, k, 0, 0, heap);
  92462. }
  92463. if (err == MP_OKAY) {
  92464. sp_384_proj_point_add_12(point, point, addP, tmp);
  92465. if (map) {
  92466. sp_384_map_12(point, point, tmp);
  92467. }
  92468. err = sp_384_point_to_ecc_point_12(point, r);
  92469. }
  92470. #ifdef WOLFSSL_SP_SMALL_STACK
  92471. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  92472. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  92473. #endif
  92474. return err;
  92475. }
  92476. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  92477. defined(HAVE_ECC_VERIFY)
  92478. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  92479. /* Add 1 to a. (a = a + 1)
  92480. *
  92481. * a A single precision integer.
  92482. */
  92483. static void sp_384_add_one_12(sp_digit* a_p)
  92484. {
  92485. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  92486. __asm__ __volatile__ (
  92487. "ldm %[a], {r1, r2, r3, r4}\n\t"
  92488. "adds r1, r1, #1\n\t"
  92489. "adcs r2, r2, #0\n\t"
  92490. "adcs r3, r3, #0\n\t"
  92491. "adcs r4, r4, #0\n\t"
  92492. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  92493. "ldm %[a], {r1, r2, r3, r4}\n\t"
  92494. "adcs r1, r1, #0\n\t"
  92495. "adcs r2, r2, #0\n\t"
  92496. "adcs r3, r3, #0\n\t"
  92497. "adcs r4, r4, #0\n\t"
  92498. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  92499. "ldm %[a], {r1, r2, r3, r4}\n\t"
  92500. "adcs r1, r1, #0\n\t"
  92501. "adcs r2, r2, #0\n\t"
  92502. "adcs r3, r3, #0\n\t"
  92503. "adcs r4, r4, #0\n\t"
  92504. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  92505. : [a] "+r" (a)
  92506. :
  92507. : "memory", "r1", "r2", "r3", "r4", "cc"
  92508. );
  92509. }
  92510. /* Read big endian unsigned byte array into r.
  92511. *
  92512. * r A single precision integer.
  92513. * size Maximum number of bytes to convert
  92514. * a Byte array.
  92515. * n Number of bytes in array to read.
  92516. */
  92517. static void sp_384_from_bin(sp_digit* r, int size, const byte* a, int n)
  92518. {
  92519. int i;
  92520. int j;
  92521. byte* d;
  92522. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  92523. r[j] = ((sp_digit)a[i - 0] << 0) |
  92524. ((sp_digit)a[i - 1] << 8) |
  92525. ((sp_digit)a[i - 2] << 16) |
  92526. ((sp_digit)a[i - 3] << 24);
  92527. j++;
  92528. }
  92529. if (i >= 0) {
  92530. r[j] = 0;
  92531. d = (byte*)r;
  92532. switch (i) {
  92533. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  92534. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  92535. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  92536. }
  92537. j++;
  92538. }
  92539. for (; j < size; j++) {
  92540. r[j] = 0;
  92541. }
  92542. }
  92543. /* Generates a scalar that is in the range 1..order-1.
  92544. *
  92545. * rng Random number generator.
  92546. * k Scalar value.
  92547. * returns RNG failures, MEMORY_E when memory allocation fails and
  92548. * MP_OKAY on success.
  92549. */
  92550. static int sp_384_ecc_gen_k_12(WC_RNG* rng, sp_digit* k)
  92551. {
  92552. #ifndef WC_NO_RNG
  92553. int err;
  92554. byte buf[48];
  92555. do {
  92556. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  92557. if (err == 0) {
  92558. sp_384_from_bin(k, 12, buf, (int)sizeof(buf));
  92559. if (sp_384_cmp_12(k, p384_order2) <= 0) {
  92560. sp_384_add_one_12(k);
  92561. break;
  92562. }
  92563. }
  92564. }
  92565. while (err == 0);
  92566. return err;
  92567. #else
  92568. (void)rng;
  92569. (void)k;
  92570. return NOT_COMPILED_IN;
  92571. #endif
  92572. }
  92573. /* Makes a random EC key pair.
  92574. *
  92575. * rng Random number generator.
  92576. * priv Generated private value.
  92577. * pub Generated public point.
  92578. * heap Heap to use for allocation.
  92579. * returns ECC_INF_E when the point does not have the correct order, RNG
  92580. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  92581. */
  92582. int sp_ecc_make_key_384(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  92583. {
  92584. #ifdef WOLFSSL_SP_SMALL_STACK
  92585. sp_point_384* point = NULL;
  92586. sp_digit* k = NULL;
  92587. #else
  92588. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92589. sp_point_384 point[2];
  92590. #else
  92591. sp_point_384 point[1];
  92592. #endif
  92593. sp_digit k[12];
  92594. #endif
  92595. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92596. sp_point_384* infinity = NULL;
  92597. #endif
  92598. int err = MP_OKAY;
  92599. (void)heap;
  92600. #ifdef WOLFSSL_SP_SMALL_STACK
  92601. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92602. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC);
  92603. #else
  92604. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC);
  92605. #endif
  92606. if (point == NULL)
  92607. err = MEMORY_E;
  92608. if (err == MP_OKAY) {
  92609. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  92610. DYNAMIC_TYPE_ECC);
  92611. if (k == NULL)
  92612. err = MEMORY_E;
  92613. }
  92614. #endif
  92615. if (err == MP_OKAY) {
  92616. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92617. infinity = point + 1;
  92618. #endif
  92619. err = sp_384_ecc_gen_k_12(rng, k);
  92620. }
  92621. if (err == MP_OKAY) {
  92622. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, NULL);
  92623. }
  92624. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92625. if (err == MP_OKAY) {
  92626. err = sp_384_ecc_mulmod_12(infinity, point, p384_order, 1, 1, NULL);
  92627. }
  92628. if (err == MP_OKAY) {
  92629. if (sp_384_iszero_12(point->x) || sp_384_iszero_12(point->y)) {
  92630. err = ECC_INF_E;
  92631. }
  92632. }
  92633. #endif
  92634. if (err == MP_OKAY) {
  92635. err = sp_384_to_mp(k, priv);
  92636. }
  92637. if (err == MP_OKAY) {
  92638. err = sp_384_point_to_ecc_point_12(point, pub);
  92639. }
  92640. #ifdef WOLFSSL_SP_SMALL_STACK
  92641. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  92642. /* point is not sensitive, so no need to zeroize */
  92643. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  92644. #endif
  92645. return err;
  92646. }
  92647. #ifdef WOLFSSL_SP_NONBLOCK
  92648. typedef struct sp_ecc_key_gen_384_ctx {
  92649. int state;
  92650. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  92651. sp_digit k[12];
  92652. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92653. sp_point_384 point[2];
  92654. #else
  92655. sp_point_384 point[1];
  92656. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  92657. } sp_ecc_key_gen_384_ctx;
  92658. int sp_ecc_make_key_384_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  92659. ecc_point* pub, void* heap)
  92660. {
  92661. int err = FP_WOULDBLOCK;
  92662. sp_ecc_key_gen_384_ctx* ctx = (sp_ecc_key_gen_384_ctx*)sp_ctx->data;
  92663. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92664. sp_point_384* infinity = ctx->point + 1;
  92665. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  92666. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_384_ctx)
  92667. >= sizeof(*sp_ctx) ? -1 : 1];
  92668. (void)sizeof(ctx_size_test);
  92669. switch (ctx->state) {
  92670. case 0:
  92671. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  92672. if (err == MP_OKAY) {
  92673. err = FP_WOULDBLOCK;
  92674. ctx->state = 1;
  92675. }
  92676. break;
  92677. case 1:
  92678. err = sp_384_ecc_mulmod_base_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  92679. ctx->point, ctx->k, 1, 1, heap);
  92680. if (err == MP_OKAY) {
  92681. err = FP_WOULDBLOCK;
  92682. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92683. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  92684. ctx->state = 2;
  92685. #else
  92686. ctx->state = 3;
  92687. #endif
  92688. }
  92689. break;
  92690. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  92691. case 2:
  92692. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  92693. infinity, ctx->point, p384_order, 1, 1);
  92694. if (err == MP_OKAY) {
  92695. if (sp_384_iszero_12(ctx->point->x) ||
  92696. sp_384_iszero_12(ctx->point->y)) {
  92697. err = ECC_INF_E;
  92698. }
  92699. else {
  92700. err = FP_WOULDBLOCK;
  92701. ctx->state = 3;
  92702. }
  92703. }
  92704. break;
  92705. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  92706. case 3:
  92707. err = sp_384_to_mp(ctx->k, priv);
  92708. if (err == MP_OKAY) {
  92709. err = sp_384_point_to_ecc_point_12(ctx->point, pub);
  92710. }
  92711. break;
  92712. }
  92713. if (err != FP_WOULDBLOCK) {
  92714. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_384_ctx));
  92715. }
  92716. return err;
  92717. }
  92718. #endif /* WOLFSSL_SP_NONBLOCK */
  92719. #ifdef HAVE_ECC_DHE
  92720. /* Write r as big endian to byte array.
  92721. * Fixed length number of bytes written: 48
  92722. *
  92723. * r A single precision integer.
  92724. * a Byte array.
  92725. */
  92726. static void sp_384_to_bin_12(sp_digit* r, byte* a)
  92727. {
  92728. int i;
  92729. int j = 0;
  92730. for (i = 11; i >= 0; i--) {
  92731. a[j++] = r[i] >> 24;
  92732. a[j++] = r[i] >> 16;
  92733. a[j++] = r[i] >> 8;
  92734. a[j++] = r[i] >> 0;
  92735. }
  92736. }
  92737. /* Multiply the point by the scalar and serialize the X ordinate.
  92738. * The number is 0 padded to maximum size on output.
  92739. *
  92740. * priv Scalar to multiply the point by.
  92741. * pub Point to multiply.
  92742. * out Buffer to hold X ordinate.
  92743. * outLen On entry, size of the buffer in bytes.
  92744. * On exit, length of data in buffer in bytes.
  92745. * heap Heap to use for allocation.
  92746. * returns BUFFER_E if the buffer is to small for output size,
  92747. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  92748. */
  92749. int sp_ecc_secret_gen_384(const mp_int* priv, const ecc_point* pub, byte* out,
  92750. word32* outLen, void* heap)
  92751. {
  92752. #ifdef WOLFSSL_SP_SMALL_STACK
  92753. sp_point_384* point = NULL;
  92754. sp_digit* k = NULL;
  92755. #else
  92756. sp_point_384 point[1];
  92757. sp_digit k[12];
  92758. #endif
  92759. int err = MP_OKAY;
  92760. if (*outLen < 48U) {
  92761. err = BUFFER_E;
  92762. }
  92763. #ifdef WOLFSSL_SP_SMALL_STACK
  92764. if (err == MP_OKAY) {
  92765. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  92766. DYNAMIC_TYPE_ECC);
  92767. if (point == NULL)
  92768. err = MEMORY_E;
  92769. }
  92770. if (err == MP_OKAY) {
  92771. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  92772. DYNAMIC_TYPE_ECC);
  92773. if (k == NULL)
  92774. err = MEMORY_E;
  92775. }
  92776. #endif
  92777. if (err == MP_OKAY) {
  92778. sp_384_from_mp(k, 12, priv);
  92779. sp_384_point_from_ecc_point_12(point, pub);
  92780. err = sp_384_ecc_mulmod_12(point, point, k, 1, 1, heap);
  92781. }
  92782. if (err == MP_OKAY) {
  92783. sp_384_to_bin_12(point->x, out);
  92784. *outLen = 48;
  92785. }
  92786. #ifdef WOLFSSL_SP_SMALL_STACK
  92787. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  92788. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  92789. #endif
  92790. return err;
  92791. }
  92792. #ifdef WOLFSSL_SP_NONBLOCK
  92793. typedef struct sp_ecc_sec_gen_384_ctx {
  92794. int state;
  92795. union {
  92796. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  92797. };
  92798. sp_digit k[12];
  92799. sp_point_384 point;
  92800. } sp_ecc_sec_gen_384_ctx;
  92801. int sp_ecc_secret_gen_384_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  92802. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  92803. {
  92804. int err = FP_WOULDBLOCK;
  92805. sp_ecc_sec_gen_384_ctx* ctx = (sp_ecc_sec_gen_384_ctx*)sp_ctx->data;
  92806. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  92807. (void)sizeof(ctx_size_test);
  92808. if (*outLen < 32U) {
  92809. err = BUFFER_E;
  92810. }
  92811. switch (ctx->state) {
  92812. case 0:
  92813. sp_384_from_mp(ctx->k, 12, priv);
  92814. sp_384_point_from_ecc_point_12(&ctx->point, pub);
  92815. ctx->state = 1;
  92816. break;
  92817. case 1:
  92818. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  92819. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  92820. if (err == MP_OKAY) {
  92821. sp_384_to_bin_12(ctx->point.x, out);
  92822. *outLen = 48;
  92823. }
  92824. break;
  92825. }
  92826. if (err == MP_OKAY && ctx->state != 1) {
  92827. err = FP_WOULDBLOCK;
  92828. }
  92829. if (err != FP_WOULDBLOCK) {
  92830. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_384_ctx));
  92831. }
  92832. return err;
  92833. }
  92834. #endif /* WOLFSSL_SP_NONBLOCK */
  92835. #endif /* HAVE_ECC_DHE */
  92836. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  92837. #endif
  92838. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  92839. #endif
  92840. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  92841. #ifdef WOLFSSL_SP_SMALL
  92842. /* Sub b from a into a. (a -= b)
  92843. *
  92844. * a A single precision integer.
  92845. * b A single precision integer.
  92846. */
  92847. static sp_digit sp_384_sub_in_place_12(sp_digit* a_p, const sp_digit* b_p)
  92848. {
  92849. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  92850. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  92851. __asm__ __volatile__ (
  92852. "mov r12, #0\n\t"
  92853. "add lr, %[a], #48\n\t"
  92854. "\n"
  92855. "L_sp_384_sub_in_pkace_12_word_%=: \n\t"
  92856. "rsbs r12, r12, #0\n\t"
  92857. "ldm %[a], {r2, r3, r4, r5}\n\t"
  92858. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  92859. "sbcs r2, r2, r6\n\t"
  92860. "sbcs r3, r3, r7\n\t"
  92861. "sbcs r4, r4, r8\n\t"
  92862. "sbcs r5, r5, r9\n\t"
  92863. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  92864. "sbc r12, r12, r12\n\t"
  92865. "cmp %[a], lr\n\t"
  92866. "bne L_sp_384_sub_in_pkace_12_word_%=\n\t"
  92867. "mov %[a], r12\n\t"
  92868. : [a] "+r" (a), [b] "+r" (b)
  92869. :
  92870. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  92871. );
  92872. return (uint32_t)(size_t)a;
  92873. }
  92874. #else
  92875. /* Sub b from a into a. (a -= b)
  92876. *
  92877. * a A single precision integer and result.
  92878. * b A single precision integer.
  92879. */
  92880. static sp_digit sp_384_sub_in_place_12(sp_digit* a_p, const sp_digit* b_p)
  92881. {
  92882. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  92883. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  92884. __asm__ __volatile__ (
  92885. "ldm %[a], {r2, r3, r4, r5}\n\t"
  92886. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  92887. "subs r2, r2, r6\n\t"
  92888. "sbcs r3, r3, r7\n\t"
  92889. "sbcs r4, r4, r8\n\t"
  92890. "sbcs r5, r5, r9\n\t"
  92891. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  92892. "ldm %[a], {r2, r3, r4, r5}\n\t"
  92893. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  92894. "sbcs r2, r2, r6\n\t"
  92895. "sbcs r3, r3, r7\n\t"
  92896. "sbcs r4, r4, r8\n\t"
  92897. "sbcs r5, r5, r9\n\t"
  92898. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  92899. "ldm %[a], {r2, r3, r4, r5}\n\t"
  92900. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  92901. "sbcs r2, r2, r6\n\t"
  92902. "sbcs r3, r3, r7\n\t"
  92903. "sbcs r4, r4, r8\n\t"
  92904. "sbcs r5, r5, r9\n\t"
  92905. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  92906. "sbc %[a], r9, r9\n\t"
  92907. : [a] "+r" (a), [b] "+r" (b)
  92908. :
  92909. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  92910. );
  92911. return (uint32_t)(size_t)a;
  92912. }
  92913. #endif /* WOLFSSL_SP_SMALL */
  92914. #ifdef WOLFSSL_SP_SMALL
  92915. /* Mul a by digit b into r. (r = a * b)
  92916. *
  92917. * r A single precision integer.
  92918. * a A single precision integer.
  92919. * b A single precision digit.
  92920. */
  92921. static void sp_384_mul_d_12(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  92922. {
  92923. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  92924. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  92925. register sp_digit b asm ("r2") = (sp_digit)b_p;
  92926. __asm__ __volatile__ (
  92927. /* A[0] * B */
  92928. "ldr r8, [%[a]]\n\t"
  92929. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  92930. "lsl r6, %[b], #16\n\t"
  92931. "lsl r5, r8, #16\n\t"
  92932. "lsr r6, r6, #16\n\t"
  92933. "lsr r5, r5, #16\n\t"
  92934. "mul r5, r6, r5\n\t"
  92935. "lsr r7, r8, #16\n\t"
  92936. "mul r6, r7, r6\n\t"
  92937. "lsr r3, r6, #16\n\t"
  92938. "lsl r6, r6, #16\n\t"
  92939. "adds r5, r5, r6\n\t"
  92940. "adc r3, r3, #0\n\t"
  92941. "lsr r6, %[b], #16\n\t"
  92942. "mul r7, r6, r7\n\t"
  92943. "add r3, r3, r7\n\t"
  92944. "lsl r7, r8, #16\n\t"
  92945. "lsr r7, r7, #16\n\t"
  92946. "mul r6, r7, r6\n\t"
  92947. "lsr r7, r6, #16\n\t"
  92948. "lsl r6, r6, #16\n\t"
  92949. "adds r5, r5, r6\n\t"
  92950. "adc r3, r3, r7\n\t"
  92951. #else
  92952. "umull r5, r3, %[b], r8\n\t"
  92953. #endif
  92954. "mov r4, #0\n\t"
  92955. "str r5, [%[r]]\n\t"
  92956. "mov r5, #0\n\t"
  92957. "mov r9, #4\n\t"
  92958. "\n"
  92959. "L_sp_384_mul_d_12_word_%=: \n\t"
  92960. /* A[i] * B */
  92961. "ldr r8, [%[a], r9]\n\t"
  92962. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  92963. "lsl r6, %[b], #16\n\t"
  92964. "lsl r7, r8, #16\n\t"
  92965. "lsr r6, r6, #16\n\t"
  92966. "lsr r7, r7, #16\n\t"
  92967. "mul r7, r6, r7\n\t"
  92968. "adds r3, r3, r7\n\t"
  92969. "adcs r4, r4, #0\n\t"
  92970. "adc r5, r5, #0\n\t"
  92971. "lsr r7, r8, #16\n\t"
  92972. "mul r6, r7, r6\n\t"
  92973. "lsr r7, r6, #16\n\t"
  92974. "lsl r6, r6, #16\n\t"
  92975. "adds r3, r3, r6\n\t"
  92976. "adcs r4, r4, r7\n\t"
  92977. "adc r5, r5, #0\n\t"
  92978. "lsr r6, %[b], #16\n\t"
  92979. "lsr r7, r8, #16\n\t"
  92980. "mul r7, r6, r7\n\t"
  92981. "adds r4, r4, r7\n\t"
  92982. "adc r5, r5, #0\n\t"
  92983. "lsl r7, r8, #16\n\t"
  92984. "lsr r7, r7, #16\n\t"
  92985. "mul r6, r7, r6\n\t"
  92986. "lsr r7, r6, #16\n\t"
  92987. "lsl r6, r6, #16\n\t"
  92988. "adds r3, r3, r6\n\t"
  92989. "adcs r4, r4, r7\n\t"
  92990. "adc r5, r5, #0\n\t"
  92991. #else
  92992. "umull r6, r7, %[b], r8\n\t"
  92993. "adds r3, r3, r6\n\t"
  92994. "adcs r4, r4, r7\n\t"
  92995. "adc r5, r5, #0\n\t"
  92996. #endif
  92997. "str r3, [%[r], r9]\n\t"
  92998. "mov r3, r4\n\t"
  92999. "mov r4, r5\n\t"
  93000. "mov r5, #0\n\t"
  93001. "add r9, r9, #4\n\t"
  93002. "cmp r9, #48\n\t"
  93003. "blt L_sp_384_mul_d_12_word_%=\n\t"
  93004. "str r3, [%[r], #48]\n\t"
  93005. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  93006. :
  93007. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  93008. );
  93009. }
  93010. #else
  93011. /* Mul a by digit b into r. (r = a * b)
  93012. *
  93013. * r A single precision integer.
  93014. * a A single precision integer.
  93015. * b A single precision digit.
  93016. */
  93017. static void sp_384_mul_d_12(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  93018. {
  93019. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  93020. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  93021. register sp_digit b asm ("r2") = (sp_digit)b_p;
  93022. __asm__ __volatile__ (
  93023. /* A[0] * B */
  93024. "ldm %[a]!, {r8}\n\t"
  93025. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93026. "lsl r6, %[b], #16\n\t"
  93027. "lsl r3, r8, #16\n\t"
  93028. "lsr r6, r6, #16\n\t"
  93029. "lsr r3, r3, #16\n\t"
  93030. "mul r3, r6, r3\n\t"
  93031. "lsr r7, r8, #16\n\t"
  93032. "mul r6, r7, r6\n\t"
  93033. "lsr r4, r6, #16\n\t"
  93034. "lsl r6, r6, #16\n\t"
  93035. "adds r3, r3, r6\n\t"
  93036. "adc r4, r4, #0\n\t"
  93037. "lsr r6, %[b], #16\n\t"
  93038. "mul r7, r6, r7\n\t"
  93039. "add r4, r4, r7\n\t"
  93040. "lsl r7, r8, #16\n\t"
  93041. "lsr r7, r7, #16\n\t"
  93042. "mul r6, r7, r6\n\t"
  93043. "lsr r7, r6, #16\n\t"
  93044. "lsl r6, r6, #16\n\t"
  93045. "adds r3, r3, r6\n\t"
  93046. "adc r4, r4, r7\n\t"
  93047. #else
  93048. "umull r3, r4, %[b], r8\n\t"
  93049. #endif
  93050. "stm %[r]!, {r3}\n\t"
  93051. "mov r5, #0\n\t"
  93052. /* A[1] * B */
  93053. "ldm %[a]!, {r8}\n\t"
  93054. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93055. "lsl r6, %[b], #16\n\t"
  93056. "lsl r7, r8, #16\n\t"
  93057. "lsr r6, r6, #16\n\t"
  93058. "lsr r7, r7, #16\n\t"
  93059. "mul r7, r6, r7\n\t"
  93060. "adds r4, r4, r7\n\t"
  93061. "adc r5, r5, #0\n\t"
  93062. "lsr r7, r8, #16\n\t"
  93063. "mul r6, r7, r6\n\t"
  93064. "lsr r7, r6, #16\n\t"
  93065. "lsl r6, r6, #16\n\t"
  93066. "adds r4, r4, r6\n\t"
  93067. "adc r5, r5, r7\n\t"
  93068. "lsr r6, %[b], #16\n\t"
  93069. "lsr r7, r8, #16\n\t"
  93070. "mul r7, r6, r7\n\t"
  93071. "add r5, r5, r7\n\t"
  93072. "lsl r7, r8, #16\n\t"
  93073. "lsr r7, r7, #16\n\t"
  93074. "mul r6, r7, r6\n\t"
  93075. "lsr r7, r6, #16\n\t"
  93076. "lsl r6, r6, #16\n\t"
  93077. "adds r4, r4, r6\n\t"
  93078. "adc r5, r5, r7\n\t"
  93079. #else
  93080. "umlal r4, r5, %[b], r8\n\t"
  93081. #endif
  93082. "stm %[r]!, {r4}\n\t"
  93083. "mov r3, #0\n\t"
  93084. /* A[2] * B */
  93085. "ldm %[a]!, {r8}\n\t"
  93086. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93087. "lsl r6, %[b], #16\n\t"
  93088. "lsl r7, r8, #16\n\t"
  93089. "lsr r6, r6, #16\n\t"
  93090. "lsr r7, r7, #16\n\t"
  93091. "mul r7, r6, r7\n\t"
  93092. "adds r5, r5, r7\n\t"
  93093. "adc r3, r3, #0\n\t"
  93094. "lsr r7, r8, #16\n\t"
  93095. "mul r6, r7, r6\n\t"
  93096. "lsr r7, r6, #16\n\t"
  93097. "lsl r6, r6, #16\n\t"
  93098. "adds r5, r5, r6\n\t"
  93099. "adc r3, r3, r7\n\t"
  93100. "lsr r6, %[b], #16\n\t"
  93101. "lsr r7, r8, #16\n\t"
  93102. "mul r7, r6, r7\n\t"
  93103. "add r3, r3, r7\n\t"
  93104. "lsl r7, r8, #16\n\t"
  93105. "lsr r7, r7, #16\n\t"
  93106. "mul r6, r7, r6\n\t"
  93107. "lsr r7, r6, #16\n\t"
  93108. "lsl r6, r6, #16\n\t"
  93109. "adds r5, r5, r6\n\t"
  93110. "adc r3, r3, r7\n\t"
  93111. #else
  93112. "umlal r5, r3, %[b], r8\n\t"
  93113. #endif
  93114. "stm %[r]!, {r5}\n\t"
  93115. "mov r4, #0\n\t"
  93116. /* A[3] * B */
  93117. "ldm %[a]!, {r8}\n\t"
  93118. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93119. "lsl r6, %[b], #16\n\t"
  93120. "lsl r7, r8, #16\n\t"
  93121. "lsr r6, r6, #16\n\t"
  93122. "lsr r7, r7, #16\n\t"
  93123. "mul r7, r6, r7\n\t"
  93124. "adds r3, r3, r7\n\t"
  93125. "adc r4, r4, #0\n\t"
  93126. "lsr r7, r8, #16\n\t"
  93127. "mul r6, r7, r6\n\t"
  93128. "lsr r7, r6, #16\n\t"
  93129. "lsl r6, r6, #16\n\t"
  93130. "adds r3, r3, r6\n\t"
  93131. "adc r4, r4, r7\n\t"
  93132. "lsr r6, %[b], #16\n\t"
  93133. "lsr r7, r8, #16\n\t"
  93134. "mul r7, r6, r7\n\t"
  93135. "add r4, r4, r7\n\t"
  93136. "lsl r7, r8, #16\n\t"
  93137. "lsr r7, r7, #16\n\t"
  93138. "mul r6, r7, r6\n\t"
  93139. "lsr r7, r6, #16\n\t"
  93140. "lsl r6, r6, #16\n\t"
  93141. "adds r3, r3, r6\n\t"
  93142. "adc r4, r4, r7\n\t"
  93143. #else
  93144. "umlal r3, r4, %[b], r8\n\t"
  93145. #endif
  93146. "stm %[r]!, {r3}\n\t"
  93147. "mov r5, #0\n\t"
  93148. /* A[4] * B */
  93149. "ldm %[a]!, {r8}\n\t"
  93150. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93151. "lsl r6, %[b], #16\n\t"
  93152. "lsl r7, r8, #16\n\t"
  93153. "lsr r6, r6, #16\n\t"
  93154. "lsr r7, r7, #16\n\t"
  93155. "mul r7, r6, r7\n\t"
  93156. "adds r4, r4, r7\n\t"
  93157. "adc r5, r5, #0\n\t"
  93158. "lsr r7, r8, #16\n\t"
  93159. "mul r6, r7, r6\n\t"
  93160. "lsr r7, r6, #16\n\t"
  93161. "lsl r6, r6, #16\n\t"
  93162. "adds r4, r4, r6\n\t"
  93163. "adc r5, r5, r7\n\t"
  93164. "lsr r6, %[b], #16\n\t"
  93165. "lsr r7, r8, #16\n\t"
  93166. "mul r7, r6, r7\n\t"
  93167. "add r5, r5, r7\n\t"
  93168. "lsl r7, r8, #16\n\t"
  93169. "lsr r7, r7, #16\n\t"
  93170. "mul r6, r7, r6\n\t"
  93171. "lsr r7, r6, #16\n\t"
  93172. "lsl r6, r6, #16\n\t"
  93173. "adds r4, r4, r6\n\t"
  93174. "adc r5, r5, r7\n\t"
  93175. #else
  93176. "umlal r4, r5, %[b], r8\n\t"
  93177. #endif
  93178. "stm %[r]!, {r4}\n\t"
  93179. "mov r3, #0\n\t"
  93180. /* A[5] * B */
  93181. "ldm %[a]!, {r8}\n\t"
  93182. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93183. "lsl r6, %[b], #16\n\t"
  93184. "lsl r7, r8, #16\n\t"
  93185. "lsr r6, r6, #16\n\t"
  93186. "lsr r7, r7, #16\n\t"
  93187. "mul r7, r6, r7\n\t"
  93188. "adds r5, r5, r7\n\t"
  93189. "adc r3, r3, #0\n\t"
  93190. "lsr r7, r8, #16\n\t"
  93191. "mul r6, r7, r6\n\t"
  93192. "lsr r7, r6, #16\n\t"
  93193. "lsl r6, r6, #16\n\t"
  93194. "adds r5, r5, r6\n\t"
  93195. "adc r3, r3, r7\n\t"
  93196. "lsr r6, %[b], #16\n\t"
  93197. "lsr r7, r8, #16\n\t"
  93198. "mul r7, r6, r7\n\t"
  93199. "add r3, r3, r7\n\t"
  93200. "lsl r7, r8, #16\n\t"
  93201. "lsr r7, r7, #16\n\t"
  93202. "mul r6, r7, r6\n\t"
  93203. "lsr r7, r6, #16\n\t"
  93204. "lsl r6, r6, #16\n\t"
  93205. "adds r5, r5, r6\n\t"
  93206. "adc r3, r3, r7\n\t"
  93207. #else
  93208. "umlal r5, r3, %[b], r8\n\t"
  93209. #endif
  93210. "stm %[r]!, {r5}\n\t"
  93211. "mov r4, #0\n\t"
  93212. /* A[6] * B */
  93213. "ldm %[a]!, {r8}\n\t"
  93214. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93215. "lsl r6, %[b], #16\n\t"
  93216. "lsl r7, r8, #16\n\t"
  93217. "lsr r6, r6, #16\n\t"
  93218. "lsr r7, r7, #16\n\t"
  93219. "mul r7, r6, r7\n\t"
  93220. "adds r3, r3, r7\n\t"
  93221. "adc r4, r4, #0\n\t"
  93222. "lsr r7, r8, #16\n\t"
  93223. "mul r6, r7, r6\n\t"
  93224. "lsr r7, r6, #16\n\t"
  93225. "lsl r6, r6, #16\n\t"
  93226. "adds r3, r3, r6\n\t"
  93227. "adc r4, r4, r7\n\t"
  93228. "lsr r6, %[b], #16\n\t"
  93229. "lsr r7, r8, #16\n\t"
  93230. "mul r7, r6, r7\n\t"
  93231. "add r4, r4, r7\n\t"
  93232. "lsl r7, r8, #16\n\t"
  93233. "lsr r7, r7, #16\n\t"
  93234. "mul r6, r7, r6\n\t"
  93235. "lsr r7, r6, #16\n\t"
  93236. "lsl r6, r6, #16\n\t"
  93237. "adds r3, r3, r6\n\t"
  93238. "adc r4, r4, r7\n\t"
  93239. #else
  93240. "umlal r3, r4, %[b], r8\n\t"
  93241. #endif
  93242. "stm %[r]!, {r3}\n\t"
  93243. "mov r5, #0\n\t"
  93244. /* A[7] * B */
  93245. "ldm %[a]!, {r8}\n\t"
  93246. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93247. "lsl r6, %[b], #16\n\t"
  93248. "lsl r7, r8, #16\n\t"
  93249. "lsr r6, r6, #16\n\t"
  93250. "lsr r7, r7, #16\n\t"
  93251. "mul r7, r6, r7\n\t"
  93252. "adds r4, r4, r7\n\t"
  93253. "adc r5, r5, #0\n\t"
  93254. "lsr r7, r8, #16\n\t"
  93255. "mul r6, r7, r6\n\t"
  93256. "lsr r7, r6, #16\n\t"
  93257. "lsl r6, r6, #16\n\t"
  93258. "adds r4, r4, r6\n\t"
  93259. "adc r5, r5, r7\n\t"
  93260. "lsr r6, %[b], #16\n\t"
  93261. "lsr r7, r8, #16\n\t"
  93262. "mul r7, r6, r7\n\t"
  93263. "add r5, r5, r7\n\t"
  93264. "lsl r7, r8, #16\n\t"
  93265. "lsr r7, r7, #16\n\t"
  93266. "mul r6, r7, r6\n\t"
  93267. "lsr r7, r6, #16\n\t"
  93268. "lsl r6, r6, #16\n\t"
  93269. "adds r4, r4, r6\n\t"
  93270. "adc r5, r5, r7\n\t"
  93271. #else
  93272. "umlal r4, r5, %[b], r8\n\t"
  93273. #endif
  93274. "stm %[r]!, {r4}\n\t"
  93275. "mov r3, #0\n\t"
  93276. /* A[8] * B */
  93277. "ldm %[a]!, {r8}\n\t"
  93278. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93279. "lsl r6, %[b], #16\n\t"
  93280. "lsl r7, r8, #16\n\t"
  93281. "lsr r6, r6, #16\n\t"
  93282. "lsr r7, r7, #16\n\t"
  93283. "mul r7, r6, r7\n\t"
  93284. "adds r5, r5, r7\n\t"
  93285. "adc r3, r3, #0\n\t"
  93286. "lsr r7, r8, #16\n\t"
  93287. "mul r6, r7, r6\n\t"
  93288. "lsr r7, r6, #16\n\t"
  93289. "lsl r6, r6, #16\n\t"
  93290. "adds r5, r5, r6\n\t"
  93291. "adc r3, r3, r7\n\t"
  93292. "lsr r6, %[b], #16\n\t"
  93293. "lsr r7, r8, #16\n\t"
  93294. "mul r7, r6, r7\n\t"
  93295. "add r3, r3, r7\n\t"
  93296. "lsl r7, r8, #16\n\t"
  93297. "lsr r7, r7, #16\n\t"
  93298. "mul r6, r7, r6\n\t"
  93299. "lsr r7, r6, #16\n\t"
  93300. "lsl r6, r6, #16\n\t"
  93301. "adds r5, r5, r6\n\t"
  93302. "adc r3, r3, r7\n\t"
  93303. #else
  93304. "umlal r5, r3, %[b], r8\n\t"
  93305. #endif
  93306. "stm %[r]!, {r5}\n\t"
  93307. "mov r4, #0\n\t"
  93308. /* A[9] * B */
  93309. "ldm %[a]!, {r8}\n\t"
  93310. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93311. "lsl r6, %[b], #16\n\t"
  93312. "lsl r7, r8, #16\n\t"
  93313. "lsr r6, r6, #16\n\t"
  93314. "lsr r7, r7, #16\n\t"
  93315. "mul r7, r6, r7\n\t"
  93316. "adds r3, r3, r7\n\t"
  93317. "adc r4, r4, #0\n\t"
  93318. "lsr r7, r8, #16\n\t"
  93319. "mul r6, r7, r6\n\t"
  93320. "lsr r7, r6, #16\n\t"
  93321. "lsl r6, r6, #16\n\t"
  93322. "adds r3, r3, r6\n\t"
  93323. "adc r4, r4, r7\n\t"
  93324. "lsr r6, %[b], #16\n\t"
  93325. "lsr r7, r8, #16\n\t"
  93326. "mul r7, r6, r7\n\t"
  93327. "add r4, r4, r7\n\t"
  93328. "lsl r7, r8, #16\n\t"
  93329. "lsr r7, r7, #16\n\t"
  93330. "mul r6, r7, r6\n\t"
  93331. "lsr r7, r6, #16\n\t"
  93332. "lsl r6, r6, #16\n\t"
  93333. "adds r3, r3, r6\n\t"
  93334. "adc r4, r4, r7\n\t"
  93335. #else
  93336. "umlal r3, r4, %[b], r8\n\t"
  93337. #endif
  93338. "stm %[r]!, {r3}\n\t"
  93339. "mov r5, #0\n\t"
  93340. /* A[10] * B */
  93341. "ldm %[a]!, {r8}\n\t"
  93342. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93343. "lsl r6, %[b], #16\n\t"
  93344. "lsl r7, r8, #16\n\t"
  93345. "lsr r6, r6, #16\n\t"
  93346. "lsr r7, r7, #16\n\t"
  93347. "mul r7, r6, r7\n\t"
  93348. "adds r4, r4, r7\n\t"
  93349. "adc r5, r5, #0\n\t"
  93350. "lsr r7, r8, #16\n\t"
  93351. "mul r6, r7, r6\n\t"
  93352. "lsr r7, r6, #16\n\t"
  93353. "lsl r6, r6, #16\n\t"
  93354. "adds r4, r4, r6\n\t"
  93355. "adc r5, r5, r7\n\t"
  93356. "lsr r6, %[b], #16\n\t"
  93357. "lsr r7, r8, #16\n\t"
  93358. "mul r7, r6, r7\n\t"
  93359. "add r5, r5, r7\n\t"
  93360. "lsl r7, r8, #16\n\t"
  93361. "lsr r7, r7, #16\n\t"
  93362. "mul r6, r7, r6\n\t"
  93363. "lsr r7, r6, #16\n\t"
  93364. "lsl r6, r6, #16\n\t"
  93365. "adds r4, r4, r6\n\t"
  93366. "adc r5, r5, r7\n\t"
  93367. #else
  93368. "umlal r4, r5, %[b], r8\n\t"
  93369. #endif
  93370. "stm %[r]!, {r4}\n\t"
  93371. "mov r3, #0\n\t"
  93372. /* A[11] * B */
  93373. "ldm %[a]!, {r8}\n\t"
  93374. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93375. "lsl r6, %[b], #16\n\t"
  93376. "lsl r7, r8, #16\n\t"
  93377. "lsr r6, r6, #16\n\t"
  93378. "lsr r7, r7, #16\n\t"
  93379. "mul r7, r6, r7\n\t"
  93380. "adds r5, r5, r7\n\t"
  93381. "adc r3, r3, #0\n\t"
  93382. "lsr r7, r8, #16\n\t"
  93383. "mul r6, r7, r6\n\t"
  93384. "lsr r7, r6, #16\n\t"
  93385. "lsl r6, r6, #16\n\t"
  93386. "adds r5, r5, r6\n\t"
  93387. "adc r3, r3, r7\n\t"
  93388. "lsr r6, %[b], #16\n\t"
  93389. "lsr r7, r8, #16\n\t"
  93390. "mul r7, r6, r7\n\t"
  93391. "add r3, r3, r7\n\t"
  93392. "lsl r7, r8, #16\n\t"
  93393. "lsr r7, r7, #16\n\t"
  93394. "mul r6, r7, r6\n\t"
  93395. "lsr r7, r6, #16\n\t"
  93396. "lsl r6, r6, #16\n\t"
  93397. "adds r5, r5, r6\n\t"
  93398. "adc r3, r3, r7\n\t"
  93399. #else
  93400. "umlal r5, r3, %[b], r8\n\t"
  93401. #endif
  93402. "stm %[r]!, {r5}\n\t"
  93403. "str r3, [%[r]]\n\t"
  93404. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  93405. :
  93406. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  93407. );
  93408. }
  93409. #endif /* WOLFSSL_SP_SMALL */
  93410. #ifdef WOLFSSL_SP_USE_UDIV
  93411. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  93412. *
  93413. * d1 The high order half of the number to divide.
  93414. * d0 The low order half of the number to divide.
  93415. * div The divisor.
  93416. * returns the result of the division.
  93417. *
  93418. * Note that this is an approximate div. It may give an answer 1 larger.
  93419. */
  93420. static sp_digit div_384_word_12(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  93421. {
  93422. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  93423. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  93424. register sp_digit div asm ("r2") = (sp_digit)div_p;
  93425. __asm__ __volatile__ (
  93426. "lsr r6, %[div], #16\n\t"
  93427. "add lr, r6, #1\n\t"
  93428. "udiv r4, %[d1], lr\n\t"
  93429. "lsl r5, %[div], #16\n\t"
  93430. "lsl r4, r4, #16\n\t"
  93431. "umull r3, r12, %[div], r4\n\t"
  93432. "subs %[d0], %[d0], r3\n\t"
  93433. "sbc %[d1], %[d1], r12\n\t"
  93434. "subs r3, %[d1], lr\n\t"
  93435. "sbc r7, r7, r7\n\t"
  93436. "add r7, r7, #1\n\t"
  93437. "rsb r8, r7, #0\n\t"
  93438. "lsl r7, r7, #16\n\t"
  93439. "and r5, r5, r8\n\t"
  93440. "and r6, r6, r8\n\t"
  93441. "subs %[d0], %[d0], r5\n\t"
  93442. "add r4, r4, r7\n\t"
  93443. "sbc %[d1], %[d1], r6\n\t"
  93444. "lsl r12, %[d1], #16\n\t"
  93445. "lsr r3, %[d0], #16\n\t"
  93446. "orr r3, r3, r12\n\t"
  93447. "udiv r3, r3, lr\n\t"
  93448. "add r4, r4, r3\n\t"
  93449. "umull r3, r12, %[div], r3\n\t"
  93450. "subs %[d0], %[d0], r3\n\t"
  93451. "sbc %[d1], %[d1], r12\n\t"
  93452. "lsl r12, %[d1], #16\n\t"
  93453. "lsr r3, %[d0], #16\n\t"
  93454. "orr r3, r3, r12\n\t"
  93455. "udiv r3, r3, lr\n\t"
  93456. "add r4, r4, r3\n\t"
  93457. "mul r3, %[div], r3\n\t"
  93458. "sub %[d0], %[d0], r3\n\t"
  93459. "udiv r3, %[d0], %[div]\n\t"
  93460. "add %[d1], r4, r3\n\t"
  93461. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  93462. :
  93463. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  93464. );
  93465. return (uint32_t)(size_t)d1;
  93466. }
  93467. #else
  93468. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  93469. *
  93470. * d1 The high order half of the number to divide.
  93471. * d0 The low order half of the number to divide.
  93472. * div The divisor.
  93473. * returns the result of the division.
  93474. *
  93475. * Note that this is an approximate div. It may give an answer 1 larger.
  93476. */
  93477. static sp_digit div_384_word_12(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  93478. {
  93479. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  93480. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  93481. register sp_digit div asm ("r2") = (sp_digit)div_p;
  93482. __asm__ __volatile__ (
  93483. "lsr lr, %[div], #1\n\t"
  93484. "add lr, lr, #1\n\t"
  93485. "mov r4, %[d0]\n\t"
  93486. "mov r5, %[d1]\n\t"
  93487. /* Do top 32 */
  93488. "subs r6, lr, r5\n\t"
  93489. "sbc r6, r6, r6\n\t"
  93490. "mov r3, #0\n\t"
  93491. "sub r3, r3, r6\n\t"
  93492. "and r6, r6, lr\n\t"
  93493. "subs r5, r5, r6\n\t"
  93494. /* Next 30 bits */
  93495. "mov r12, #29\n\t"
  93496. "\n"
  93497. "L_div_384_word_12_bit_%=: \n\t"
  93498. "lsls r4, r4, #1\n\t"
  93499. "adc r5, r5, r5\n\t"
  93500. "subs r6, lr, r5\n\t"
  93501. "sbc r6, r6, r6\n\t"
  93502. "add r3, r3, r3\n\t"
  93503. "sub r3, r3, r6\n\t"
  93504. "and r6, r6, lr\n\t"
  93505. "subs r5, r5, r6\n\t"
  93506. "subs r12, r12, #1\n\t"
  93507. "bpl L_div_384_word_12_bit_%=\n\t"
  93508. "add r3, r3, r3\n\t"
  93509. "add r3, r3, #1\n\t"
  93510. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93511. "lsl r7, r3, #16\n\t"
  93512. "lsl r4, %[div], #16\n\t"
  93513. "lsr r7, r7, #16\n\t"
  93514. "lsr r4, r4, #16\n\t"
  93515. "mul r4, r7, r4\n\t"
  93516. "lsr r8, %[div], #16\n\t"
  93517. "mul r7, r8, r7\n\t"
  93518. "lsr r5, r7, #16\n\t"
  93519. "lsl r7, r7, #16\n\t"
  93520. "adds r4, r4, r7\n\t"
  93521. "adc r5, r5, #0\n\t"
  93522. "lsr r7, r3, #16\n\t"
  93523. "mul r8, r7, r8\n\t"
  93524. "add r5, r5, r8\n\t"
  93525. "lsl r8, %[div], #16\n\t"
  93526. "lsr r8, r8, #16\n\t"
  93527. "mul r7, r8, r7\n\t"
  93528. "lsr r8, r7, #16\n\t"
  93529. "lsl r7, r7, #16\n\t"
  93530. "adds r4, r4, r7\n\t"
  93531. "adc r5, r5, r8\n\t"
  93532. #else
  93533. "umull r4, r5, r3, %[div]\n\t"
  93534. #endif
  93535. "subs r7, %[d0], r4\n\t"
  93536. "sbc r8, %[d1], r5\n\t"
  93537. "add r3, r3, r8\n\t"
  93538. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93539. "lsl r7, r3, #16\n\t"
  93540. "lsl r4, %[div], #16\n\t"
  93541. "lsr r7, r7, #16\n\t"
  93542. "lsr r4, r4, #16\n\t"
  93543. "mul r4, r7, r4\n\t"
  93544. "lsr r8, %[div], #16\n\t"
  93545. "mul r7, r8, r7\n\t"
  93546. "lsr r5, r7, #16\n\t"
  93547. "lsl r7, r7, #16\n\t"
  93548. "adds r4, r4, r7\n\t"
  93549. "adc r5, r5, #0\n\t"
  93550. "lsr r7, r3, #16\n\t"
  93551. "mul r8, r7, r8\n\t"
  93552. "add r5, r5, r8\n\t"
  93553. "lsl r8, %[div], #16\n\t"
  93554. "lsr r8, r8, #16\n\t"
  93555. "mul r7, r8, r7\n\t"
  93556. "lsr r8, r7, #16\n\t"
  93557. "lsl r7, r7, #16\n\t"
  93558. "adds r4, r4, r7\n\t"
  93559. "adc r5, r5, r8\n\t"
  93560. #else
  93561. "umull r4, r5, r3, %[div]\n\t"
  93562. #endif
  93563. "subs r7, %[d0], r4\n\t"
  93564. "sbc r8, %[d1], r5\n\t"
  93565. "add r3, r3, r8\n\t"
  93566. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  93567. "lsl r7, r3, #16\n\t"
  93568. "lsl r4, %[div], #16\n\t"
  93569. "lsr r7, r7, #16\n\t"
  93570. "lsr r4, r4, #16\n\t"
  93571. "mul r4, r7, r4\n\t"
  93572. "lsr r8, %[div], #16\n\t"
  93573. "mul r7, r8, r7\n\t"
  93574. "lsr r5, r7, #16\n\t"
  93575. "lsl r7, r7, #16\n\t"
  93576. "adds r4, r4, r7\n\t"
  93577. "adc r5, r5, #0\n\t"
  93578. "lsr r7, r3, #16\n\t"
  93579. "mul r8, r7, r8\n\t"
  93580. "add r5, r5, r8\n\t"
  93581. "lsl r8, %[div], #16\n\t"
  93582. "lsr r8, r8, #16\n\t"
  93583. "mul r7, r8, r7\n\t"
  93584. "lsr r8, r7, #16\n\t"
  93585. "lsl r7, r7, #16\n\t"
  93586. "adds r4, r4, r7\n\t"
  93587. "adc r5, r5, r8\n\t"
  93588. #else
  93589. "umull r4, r5, r3, %[div]\n\t"
  93590. #endif
  93591. "subs r7, %[d0], r4\n\t"
  93592. "sbc r8, %[d1], r5\n\t"
  93593. "add r3, r3, r8\n\t"
  93594. "subs r6, %[div], r7\n\t"
  93595. "sbc r6, r6, r6\n\t"
  93596. "sub %[d1], r3, r6\n\t"
  93597. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  93598. :
  93599. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  93600. );
  93601. return (uint32_t)(size_t)d1;
  93602. }
  93603. #endif
  93604. /* AND m into each word of a and store in r.
  93605. *
  93606. * r A single precision integer.
  93607. * a A single precision integer.
  93608. * m Mask to AND against each digit.
  93609. */
  93610. static void sp_384_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  93611. {
  93612. #ifdef WOLFSSL_SP_SMALL
  93613. int i;
  93614. for (i=0; i<12; i++) {
  93615. r[i] = a[i] & m;
  93616. }
  93617. #else
  93618. r[0] = a[0] & m;
  93619. r[1] = a[1] & m;
  93620. r[2] = a[2] & m;
  93621. r[3] = a[3] & m;
  93622. r[4] = a[4] & m;
  93623. r[5] = a[5] & m;
  93624. r[6] = a[6] & m;
  93625. r[7] = a[7] & m;
  93626. r[8] = a[8] & m;
  93627. r[9] = a[9] & m;
  93628. r[10] = a[10] & m;
  93629. r[11] = a[11] & m;
  93630. #endif
  93631. }
  93632. /* Divide d in a and put remainder into r (m*d + r = a)
  93633. * m is not calculated as it is not needed at this time.
  93634. *
  93635. * a Number to be divided.
  93636. * d Number to divide with.
  93637. * m Multiplier result.
  93638. * r Remainder from the division.
  93639. * returns MP_OKAY indicating success.
  93640. */
  93641. static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d,
  93642. sp_digit* m, sp_digit* r)
  93643. {
  93644. sp_digit t1[24], t2[13];
  93645. sp_digit div, r1;
  93646. int i;
  93647. (void)m;
  93648. div = d[11];
  93649. XMEMCPY(t1, a, sizeof(*t1) * 2 * 12);
  93650. r1 = sp_384_cmp_12(&t1[12], d) >= 0;
  93651. sp_384_cond_sub_12(&t1[12], &t1[12], d, (sp_digit)0 - r1);
  93652. for (i = 11; i >= 0; i--) {
  93653. volatile sp_digit mask = (sp_digit)0 - (t1[12 + i] == div);
  93654. sp_digit hi = t1[12 + i] + mask;
  93655. r1 = div_384_word_12(hi, t1[12 + i - 1], div);
  93656. r1 |= mask;
  93657. sp_384_mul_d_12(t2, d, r1);
  93658. t1[12 + i] += sp_384_sub_in_place_12(&t1[i], t2);
  93659. t1[12 + i] -= t2[12];
  93660. sp_384_mask_12(t2, d, t1[12 + i]);
  93661. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  93662. sp_384_mask_12(t2, d, t1[12 + i]);
  93663. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  93664. }
  93665. r1 = sp_384_cmp_12(t1, d) >= 0;
  93666. sp_384_cond_sub_12(r, t1, d, (sp_digit)0 - r1);
  93667. return MP_OKAY;
  93668. }
  93669. /* Reduce a modulo m into r. (r = a mod m)
  93670. *
  93671. * r A single precision number that is the reduced result.
  93672. * a A single precision number that is to be reduced.
  93673. * m A single precision number that is the modulus to reduce with.
  93674. * returns MP_OKAY indicating success.
  93675. */
  93676. static WC_INLINE int sp_384_mod_12(sp_digit* r, const sp_digit* a,
  93677. const sp_digit* m)
  93678. {
  93679. return sp_384_div_12(a, m, NULL, r);
  93680. }
  93681. #endif
  93682. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  93683. /* Multiply two number mod the order of P384 curve. (r = a * b mod order)
  93684. *
  93685. * r Result of the multiplication.
  93686. * a First operand of the multiplication.
  93687. * b Second operand of the multiplication.
  93688. */
  93689. static void sp_384_mont_mul_order_12(sp_digit* r, const sp_digit* a, const sp_digit* b)
  93690. {
  93691. sp_384_mul_12(r, a, b);
  93692. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  93693. }
  93694. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  93695. #ifdef WOLFSSL_SP_SMALL
  93696. /* Order-2 for the P384 curve. */
  93697. static const uint32_t p384_order_minus_2[12] = {
  93698. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U,
  93699. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  93700. };
  93701. #else
  93702. /* The low half of the order-2 of the P384 curve. */
  93703. static const uint32_t p384_order_low[6] = {
  93704. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U
  93705. };
  93706. #endif /* WOLFSSL_SP_SMALL */
  93707. /* Square number mod the order of P384 curve. (r = a * a mod order)
  93708. *
  93709. * r Result of the squaring.
  93710. * a Number to square.
  93711. */
  93712. static void sp_384_mont_sqr_order_12(sp_digit* r, const sp_digit* a)
  93713. {
  93714. sp_384_sqr_12(r, a);
  93715. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  93716. }
  93717. #ifndef WOLFSSL_SP_SMALL
  93718. /* Square number mod the order of P384 curve a number of times.
  93719. * (r = a ^ n mod order)
  93720. *
  93721. * r Result of the squaring.
  93722. * a Number to square.
  93723. */
  93724. static void sp_384_mont_sqr_n_order_12(sp_digit* r, const sp_digit* a, int n)
  93725. {
  93726. int i;
  93727. sp_384_mont_sqr_order_12(r, a);
  93728. for (i=1; i<n; i++) {
  93729. sp_384_mont_sqr_order_12(r, r);
  93730. }
  93731. }
  93732. #endif /* !WOLFSSL_SP_SMALL */
  93733. /* Invert the number, in Montgomery form, modulo the order of the P384 curve.
  93734. * (r = 1 / a mod order)
  93735. *
  93736. * r Inverse result.
  93737. * a Number to invert.
  93738. * td Temporary data.
  93739. */
  93740. #ifdef WOLFSSL_SP_NONBLOCK
  93741. typedef struct sp_384_mont_inv_order_12_ctx {
  93742. int state;
  93743. int i;
  93744. } sp_384_mont_inv_order_12_ctx;
  93745. static int sp_384_mont_inv_order_12_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  93746. sp_digit* t)
  93747. {
  93748. int err = FP_WOULDBLOCK;
  93749. sp_384_mont_inv_order_12_ctx* ctx = (sp_384_mont_inv_order_12_ctx*)sp_ctx;
  93750. typedef char ctx_size_test[sizeof(sp_384_mont_inv_order_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  93751. (void)sizeof(ctx_size_test);
  93752. switch (ctx->state) {
  93753. case 0:
  93754. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  93755. ctx->i = 382;
  93756. ctx->state = 1;
  93757. break;
  93758. case 1:
  93759. sp_384_mont_sqr_order_12(t, t);
  93760. ctx->state = 2;
  93761. break;
  93762. case 2:
  93763. if ((p384_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  93764. sp_384_mont_mul_order_12(t, t, a);
  93765. }
  93766. ctx->i--;
  93767. ctx->state = (ctx->i == 0) ? 3 : 1;
  93768. break;
  93769. case 3:
  93770. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  93771. err = MP_OKAY;
  93772. break;
  93773. }
  93774. return err;
  93775. }
  93776. #endif /* WOLFSSL_SP_NONBLOCK */
  93777. static void sp_384_mont_inv_order_12(sp_digit* r, const sp_digit* a,
  93778. sp_digit* td)
  93779. {
  93780. #ifdef WOLFSSL_SP_SMALL
  93781. sp_digit* t = td;
  93782. int i;
  93783. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  93784. for (i=382; i>=0; i--) {
  93785. sp_384_mont_sqr_order_12(t, t);
  93786. if ((p384_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  93787. sp_384_mont_mul_order_12(t, t, a);
  93788. }
  93789. }
  93790. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  93791. #else
  93792. sp_digit* t = td;
  93793. sp_digit* t2 = td + 2 * 12;
  93794. sp_digit* t3 = td + 4 * 12;
  93795. int i;
  93796. /* t = a^2 */
  93797. sp_384_mont_sqr_order_12(t, a);
  93798. /* t = a^3 = t * a */
  93799. sp_384_mont_mul_order_12(t, t, a);
  93800. /* t2= a^c = t ^ 2 ^ 2 */
  93801. sp_384_mont_sqr_n_order_12(t2, t, 2);
  93802. /* t = a^f = t2 * t */
  93803. sp_384_mont_mul_order_12(t, t2, t);
  93804. /* t2= a^f0 = t ^ 2 ^ 4 */
  93805. sp_384_mont_sqr_n_order_12(t2, t, 4);
  93806. /* t = a^ff = t2 * t */
  93807. sp_384_mont_mul_order_12(t, t2, t);
  93808. /* t2= a^ff00 = t ^ 2 ^ 8 */
  93809. sp_384_mont_sqr_n_order_12(t2, t, 8);
  93810. /* t3= a^ffff = t2 * t */
  93811. sp_384_mont_mul_order_12(t3, t2, t);
  93812. /* t2= a^ffff0000 = t3 ^ 2 ^ 16 */
  93813. sp_384_mont_sqr_n_order_12(t2, t3, 16);
  93814. /* t = a^ffffffff = t2 * t3 */
  93815. sp_384_mont_mul_order_12(t, t2, t3);
  93816. /* t2= a^ffffffff0000 = t ^ 2 ^ 16 */
  93817. sp_384_mont_sqr_n_order_12(t2, t, 16);
  93818. /* t = a^ffffffffffff = t2 * t3 */
  93819. sp_384_mont_mul_order_12(t, t2, t3);
  93820. /* t2= a^ffffffffffff000000000000 = t ^ 2 ^ 48 */
  93821. sp_384_mont_sqr_n_order_12(t2, t, 48);
  93822. /* t= a^fffffffffffffffffffffffff = t2 * t */
  93823. sp_384_mont_mul_order_12(t, t2, t);
  93824. /* t2= a^ffffffffffffffffffffffff000000000000000000000000 */
  93825. sp_384_mont_sqr_n_order_12(t2, t, 96);
  93826. /* t2= a^ffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  93827. sp_384_mont_mul_order_12(t2, t2, t);
  93828. for (i=191; i>=1; i--) {
  93829. sp_384_mont_sqr_order_12(t2, t2);
  93830. if ((p384_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  93831. sp_384_mont_mul_order_12(t2, t2, a);
  93832. }
  93833. }
  93834. sp_384_mont_sqr_order_12(t2, t2);
  93835. sp_384_mont_mul_order_12(r, t2, a);
  93836. #endif /* WOLFSSL_SP_SMALL */
  93837. }
  93838. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  93839. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  93840. #ifdef HAVE_ECC_SIGN
  93841. #ifndef SP_ECC_MAX_SIG_GEN
  93842. #define SP_ECC_MAX_SIG_GEN 64
  93843. #endif
  93844. /* Calculate second signature value S from R, k and private value.
  93845. *
  93846. * s = (r * x + e) / k
  93847. *
  93848. * s Signature value.
  93849. * r First signature value.
  93850. * k Ephemeral private key.
  93851. * x Private key as a number.
  93852. * e Hash of message as a number.
  93853. * tmp Temporary storage for intermediate numbers.
  93854. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  93855. */
  93856. static int sp_384_calc_s_12(sp_digit* s, const sp_digit* r, sp_digit* k,
  93857. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  93858. {
  93859. int err;
  93860. sp_digit carry;
  93861. sp_int32 c;
  93862. sp_digit* kInv = k;
  93863. /* Conv k to Montgomery form (mod order) */
  93864. sp_384_mul_12(k, k, p384_norm_order);
  93865. err = sp_384_mod_12(k, k, p384_order);
  93866. if (err == MP_OKAY) {
  93867. sp_384_norm_12(k);
  93868. /* kInv = 1/k mod order */
  93869. sp_384_mont_inv_order_12(kInv, k, tmp);
  93870. sp_384_norm_12(kInv);
  93871. /* s = r * x + e */
  93872. sp_384_mul_12(x, x, r);
  93873. err = sp_384_mod_12(x, x, p384_order);
  93874. }
  93875. if (err == MP_OKAY) {
  93876. sp_384_norm_12(x);
  93877. carry = sp_384_add_12(s, e, x);
  93878. sp_384_cond_sub_12(s, s, p384_order, 0 - carry);
  93879. sp_384_norm_12(s);
  93880. c = sp_384_cmp_12(s, p384_order);
  93881. sp_384_cond_sub_12(s, s, p384_order,
  93882. (sp_digit)0 - (sp_digit)(c >= 0));
  93883. sp_384_norm_12(s);
  93884. /* s = s * k^-1 mod order */
  93885. sp_384_mont_mul_order_12(s, s, kInv);
  93886. sp_384_norm_12(s);
  93887. }
  93888. return err;
  93889. }
  93890. /* Sign the hash using the private key.
  93891. * e = [hash, 384 bits] from binary
  93892. * r = (k.G)->x mod order
  93893. * s = (r * x + e) / k mod order
  93894. * The hash is truncated to the first 384 bits.
  93895. *
  93896. * hash Hash to sign.
  93897. * hashLen Length of the hash data.
  93898. * rng Random number generator.
  93899. * priv Private part of key - scalar.
  93900. * rm First part of result as an mp_int.
  93901. * sm Sirst part of result as an mp_int.
  93902. * heap Heap to use for allocation.
  93903. * returns RNG failures, MEMORY_E when memory allocation fails and
  93904. * MP_OKAY on success.
  93905. */
  93906. int sp_ecc_sign_384(const byte* hash, word32 hashLen, WC_RNG* rng,
  93907. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  93908. {
  93909. #ifdef WOLFSSL_SP_SMALL_STACK
  93910. sp_digit* e = NULL;
  93911. sp_point_384* point = NULL;
  93912. #else
  93913. sp_digit e[7 * 2 * 12];
  93914. sp_point_384 point[1];
  93915. #endif
  93916. sp_digit* x = NULL;
  93917. sp_digit* k = NULL;
  93918. sp_digit* r = NULL;
  93919. sp_digit* tmp = NULL;
  93920. sp_digit* s = NULL;
  93921. sp_int32 c;
  93922. int err = MP_OKAY;
  93923. int i;
  93924. (void)heap;
  93925. #ifdef WOLFSSL_SP_SMALL_STACK
  93926. if (err == MP_OKAY) {
  93927. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  93928. DYNAMIC_TYPE_ECC);
  93929. if (point == NULL)
  93930. err = MEMORY_E;
  93931. }
  93932. if (err == MP_OKAY) {
  93933. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 12, heap,
  93934. DYNAMIC_TYPE_ECC);
  93935. if (e == NULL)
  93936. err = MEMORY_E;
  93937. }
  93938. #endif
  93939. if (err == MP_OKAY) {
  93940. x = e + 2 * 12;
  93941. k = e + 4 * 12;
  93942. r = e + 6 * 12;
  93943. tmp = e + 8 * 12;
  93944. s = e;
  93945. if (hashLen > 48U) {
  93946. hashLen = 48U;
  93947. }
  93948. }
  93949. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  93950. /* New random point. */
  93951. if (km == NULL || mp_iszero(km)) {
  93952. err = sp_384_ecc_gen_k_12(rng, k);
  93953. }
  93954. else {
  93955. sp_384_from_mp(k, 12, km);
  93956. mp_zero(km);
  93957. }
  93958. if (err == MP_OKAY) {
  93959. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, heap);
  93960. }
  93961. if (err == MP_OKAY) {
  93962. /* r = point->x mod order */
  93963. XMEMCPY(r, point->x, sizeof(sp_digit) * 12U);
  93964. sp_384_norm_12(r);
  93965. c = sp_384_cmp_12(r, p384_order);
  93966. sp_384_cond_sub_12(r, r, p384_order,
  93967. (sp_digit)0 - (sp_digit)(c >= 0));
  93968. sp_384_norm_12(r);
  93969. if (!sp_384_iszero_12(r)) {
  93970. /* x is modified in calculation of s. */
  93971. sp_384_from_mp(x, 12, priv);
  93972. /* s ptr == e ptr, e is modified in calculation of s. */
  93973. sp_384_from_bin(e, 12, hash, (int)hashLen);
  93974. err = sp_384_calc_s_12(s, r, k, x, e, tmp);
  93975. /* Check that signature is usable. */
  93976. if ((err == MP_OKAY) && (!sp_384_iszero_12(s))) {
  93977. break;
  93978. }
  93979. }
  93980. }
  93981. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  93982. i = 1;
  93983. #endif
  93984. }
  93985. if (i == 0) {
  93986. err = RNG_FAILURE_E;
  93987. }
  93988. if (err == MP_OKAY) {
  93989. err = sp_384_to_mp(r, rm);
  93990. }
  93991. if (err == MP_OKAY) {
  93992. err = sp_384_to_mp(s, sm);
  93993. }
  93994. #ifdef WOLFSSL_SP_SMALL_STACK
  93995. if (e != NULL)
  93996. #endif
  93997. {
  93998. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 12);
  93999. #ifdef WOLFSSL_SP_SMALL_STACK
  94000. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  94001. #endif
  94002. }
  94003. #ifdef WOLFSSL_SP_SMALL_STACK
  94004. if (point != NULL)
  94005. #endif
  94006. {
  94007. ForceZero(point, sizeof(sp_point_384));
  94008. #ifdef WOLFSSL_SP_SMALL_STACK
  94009. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  94010. #endif
  94011. }
  94012. return err;
  94013. }
  94014. #ifdef WOLFSSL_SP_NONBLOCK
  94015. typedef struct sp_ecc_sign_384_ctx {
  94016. int state;
  94017. union {
  94018. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  94019. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  94020. };
  94021. sp_digit e[2*12];
  94022. sp_digit x[2*12];
  94023. sp_digit k[2*12];
  94024. sp_digit r[2*12];
  94025. sp_digit tmp[3 * 2*12];
  94026. sp_point_384 point;
  94027. sp_digit* s;
  94028. sp_digit* kInv;
  94029. int i;
  94030. } sp_ecc_sign_384_ctx;
  94031. int sp_ecc_sign_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  94032. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  94033. {
  94034. int err = FP_WOULDBLOCK;
  94035. sp_ecc_sign_384_ctx* ctx = (sp_ecc_sign_384_ctx*)sp_ctx->data;
  94036. typedef char ctx_size_test[sizeof(sp_ecc_sign_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  94037. (void)sizeof(ctx_size_test);
  94038. switch (ctx->state) {
  94039. case 0: /* INIT */
  94040. ctx->s = ctx->e;
  94041. ctx->kInv = ctx->k;
  94042. ctx->i = SP_ECC_MAX_SIG_GEN;
  94043. ctx->state = 1;
  94044. break;
  94045. case 1: /* GEN */
  94046. /* New random point. */
  94047. if (km == NULL || mp_iszero(km)) {
  94048. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  94049. }
  94050. else {
  94051. sp_384_from_mp(ctx->k, 12, km);
  94052. mp_zero(km);
  94053. }
  94054. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  94055. ctx->state = 2;
  94056. break;
  94057. case 2: /* MULMOD */
  94058. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  94059. &ctx->point, &p384_base, ctx->k, 1, 1, heap);
  94060. if (err == MP_OKAY) {
  94061. ctx->state = 3;
  94062. }
  94063. break;
  94064. case 3: /* MODORDER */
  94065. {
  94066. sp_int32 c;
  94067. /* r = point->x mod order */
  94068. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 12U);
  94069. sp_384_norm_12(ctx->r);
  94070. c = sp_384_cmp_12(ctx->r, p384_order);
  94071. sp_384_cond_sub_12(ctx->r, ctx->r, p384_order,
  94072. (sp_digit)0 - (sp_digit)(c >= 0));
  94073. sp_384_norm_12(ctx->r);
  94074. if (hashLen > 48U) {
  94075. hashLen = 48U;
  94076. }
  94077. sp_384_from_mp(ctx->x, 12, priv);
  94078. sp_384_from_bin(ctx->e, 12, hash, (int)hashLen);
  94079. ctx->state = 4;
  94080. break;
  94081. }
  94082. case 4: /* KMODORDER */
  94083. /* Conv k to Montgomery form (mod order) */
  94084. sp_384_mul_12(ctx->k, ctx->k, p384_norm_order);
  94085. err = sp_384_mod_12(ctx->k, ctx->k, p384_order);
  94086. if (err == MP_OKAY) {
  94087. sp_384_norm_12(ctx->k);
  94088. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  94089. ctx->state = 5;
  94090. }
  94091. break;
  94092. case 5: /* KINV */
  94093. /* kInv = 1/k mod order */
  94094. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  94095. if (err == MP_OKAY) {
  94096. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  94097. ctx->state = 6;
  94098. }
  94099. break;
  94100. case 6: /* KINVNORM */
  94101. sp_384_norm_12(ctx->kInv);
  94102. ctx->state = 7;
  94103. break;
  94104. case 7: /* R */
  94105. /* s = r * x + e */
  94106. sp_384_mul_12(ctx->x, ctx->x, ctx->r);
  94107. ctx->state = 8;
  94108. break;
  94109. case 8: /* S1 */
  94110. err = sp_384_mod_12(ctx->x, ctx->x, p384_order);
  94111. if (err == MP_OKAY)
  94112. ctx->state = 9;
  94113. break;
  94114. case 9: /* S2 */
  94115. {
  94116. sp_digit carry;
  94117. sp_int32 c;
  94118. sp_384_norm_12(ctx->x);
  94119. carry = sp_384_add_12(ctx->s, ctx->e, ctx->x);
  94120. sp_384_cond_sub_12(ctx->s, ctx->s,
  94121. p384_order, 0 - carry);
  94122. sp_384_norm_12(ctx->s);
  94123. c = sp_384_cmp_12(ctx->s, p384_order);
  94124. sp_384_cond_sub_12(ctx->s, ctx->s, p384_order,
  94125. (sp_digit)0 - (sp_digit)(c >= 0));
  94126. sp_384_norm_12(ctx->s);
  94127. /* s = s * k^-1 mod order */
  94128. sp_384_mont_mul_order_12(ctx->s, ctx->s, ctx->kInv);
  94129. sp_384_norm_12(ctx->s);
  94130. /* Check that signature is usable. */
  94131. if (sp_384_iszero_12(ctx->s) == 0) {
  94132. ctx->state = 10;
  94133. break;
  94134. }
  94135. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  94136. ctx->i = 1;
  94137. #endif
  94138. /* not usable gen, try again */
  94139. ctx->i--;
  94140. if (ctx->i == 0) {
  94141. err = RNG_FAILURE_E;
  94142. }
  94143. ctx->state = 1;
  94144. break;
  94145. }
  94146. case 10: /* RES */
  94147. err = sp_384_to_mp(ctx->r, rm);
  94148. if (err == MP_OKAY) {
  94149. err = sp_384_to_mp(ctx->s, sm);
  94150. }
  94151. break;
  94152. }
  94153. if (err == MP_OKAY && ctx->state != 10) {
  94154. err = FP_WOULDBLOCK;
  94155. }
  94156. if (err != FP_WOULDBLOCK) {
  94157. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 12U);
  94158. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 12U);
  94159. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 12U);
  94160. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 12U);
  94161. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 12U);
  94162. }
  94163. return err;
  94164. }
  94165. #endif /* WOLFSSL_SP_NONBLOCK */
  94166. #endif /* HAVE_ECC_SIGN */
  94167. #ifndef WOLFSSL_SP_SMALL
  94168. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  94169. *
  94170. * r Result of division by 2.
  94171. * a Number to divide.
  94172. * m Modulus.
  94173. */
  94174. static void sp_384_div2_mod_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  94175. {
  94176. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  94177. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  94178. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  94179. __asm__ __volatile__ (
  94180. "ldm %[a]!, {r4}\n\t"
  94181. "ands r3, r4, #1\n\t"
  94182. "beq L_sp_384_div2_mod_12_even_%=\n\t"
  94183. "mov r12, #0\n\t"
  94184. "ldm %[a]!, {r5, r6, r7}\n\t"
  94185. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  94186. "adds r4, r4, r8\n\t"
  94187. "adcs r5, r5, r9\n\t"
  94188. "adcs r6, r6, r10\n\t"
  94189. "adcs r7, r7, r11\n\t"
  94190. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94191. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  94192. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  94193. "adcs r4, r4, r8\n\t"
  94194. "adcs r5, r5, r9\n\t"
  94195. "adcs r6, r6, r10\n\t"
  94196. "adcs r7, r7, r11\n\t"
  94197. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94198. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  94199. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  94200. "adcs r4, r4, r8\n\t"
  94201. "adcs r5, r5, r9\n\t"
  94202. "adcs r6, r6, r10\n\t"
  94203. "adcs r7, r7, r11\n\t"
  94204. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94205. "adc r3, r12, r12\n\t"
  94206. "b L_sp_384_div2_mod_12_div2_%=\n\t"
  94207. "\n"
  94208. "L_sp_384_div2_mod_12_even_%=: \n\t"
  94209. "ldm %[a]!, {r5, r6, r7}\n\t"
  94210. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94211. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  94212. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94213. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  94214. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  94215. "\n"
  94216. "L_sp_384_div2_mod_12_div2_%=: \n\t"
  94217. "sub %[r], %[r], #48\n\t"
  94218. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94219. "ldr r8, [%[r]]\n\t"
  94220. "ldr r9, [%[r], #4]\n\t"
  94221. #else
  94222. "ldrd r8, r9, [%[r]]\n\t"
  94223. #endif
  94224. "lsr r8, r8, #1\n\t"
  94225. "orr r8, r8, r9, lsl #31\n\t"
  94226. "lsr r9, r9, #1\n\t"
  94227. "ldr r10, [%[r], #8]\n\t"
  94228. "str r8, [%[r]]\n\t"
  94229. "orr r9, r9, r10, lsl #31\n\t"
  94230. "lsr r10, r10, #1\n\t"
  94231. "ldr r8, [%[r], #12]\n\t"
  94232. "str r9, [%[r], #4]\n\t"
  94233. "orr r10, r10, r8, lsl #31\n\t"
  94234. "lsr r8, r8, #1\n\t"
  94235. "ldr r9, [%[r], #16]\n\t"
  94236. "str r10, [%[r], #8]\n\t"
  94237. "orr r8, r8, r9, lsl #31\n\t"
  94238. "lsr r9, r9, #1\n\t"
  94239. "ldr r10, [%[r], #20]\n\t"
  94240. "str r8, [%[r], #12]\n\t"
  94241. "orr r9, r9, r10, lsl #31\n\t"
  94242. "lsr r10, r10, #1\n\t"
  94243. "ldr r8, [%[r], #24]\n\t"
  94244. "str r9, [%[r], #16]\n\t"
  94245. "orr r10, r10, r8, lsl #31\n\t"
  94246. "lsr r8, r8, #1\n\t"
  94247. "ldr r9, [%[r], #28]\n\t"
  94248. "str r10, [%[r], #20]\n\t"
  94249. "orr r8, r8, r9, lsl #31\n\t"
  94250. "lsr r9, r9, #1\n\t"
  94251. "ldr r10, [%[r], #32]\n\t"
  94252. "str r8, [%[r], #24]\n\t"
  94253. "orr r9, r9, r10, lsl #31\n\t"
  94254. "lsr r10, r10, #1\n\t"
  94255. "ldr r8, [%[r], #36]\n\t"
  94256. "str r9, [%[r], #28]\n\t"
  94257. "orr r10, r10, r8, lsl #31\n\t"
  94258. "lsr r8, r8, #1\n\t"
  94259. "ldr r9, [%[r], #40]\n\t"
  94260. "str r10, [%[r], #32]\n\t"
  94261. "orr r8, r8, r9, lsl #31\n\t"
  94262. "lsr r9, r9, #1\n\t"
  94263. "ldr r10, [%[r], #44]\n\t"
  94264. "str r8, [%[r], #36]\n\t"
  94265. "orr r9, r9, r10, lsl #31\n\t"
  94266. "lsr r10, r10, #1\n\t"
  94267. "orr r10, r10, r3, lsl #31\n\t"
  94268. "str r9, [%[r], #40]\n\t"
  94269. "str r10, [%[r], #44]\n\t"
  94270. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  94271. :
  94272. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  94273. );
  94274. }
  94275. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94276. static const unsigned char L_sp_384_num_bits_12_table[] = {
  94277. 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03,
  94278. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  94279. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  94280. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  94281. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  94282. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  94283. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  94284. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  94285. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94286. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94287. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94288. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94289. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94290. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94291. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94292. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  94293. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94294. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94295. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94296. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94297. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94298. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94299. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94300. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94301. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94302. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94303. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94304. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94305. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94306. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94307. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94308. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  94309. };
  94310. static int sp_384_num_bits_12(const sp_digit* a_p)
  94311. {
  94312. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  94313. register unsigned char* L_sp_384_num_bits_12_table_c asm ("r1") = (unsigned char*)&L_sp_384_num_bits_12_table;
  94314. __asm__ __volatile__ (
  94315. "mov lr, %[L_sp_384_num_bits_12_table]\n\t"
  94316. "ldr r1, [%[a], #44]\n\t"
  94317. "cmp r1, #0\n\t"
  94318. "beq L_sp_384_num_bits_12_11_%=\n\t"
  94319. "lsr r3, r1, #24\n\t"
  94320. "cmp r3, #0\n\t"
  94321. "beq L_sp_384_num_bits_12_11_3_%=\n\t"
  94322. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94323. "mov r2, #0x1\n\t"
  94324. "lsl r2, r2, #8\n\t"
  94325. "add r2, r2, #0x78\n\t"
  94326. #else
  94327. "mov r2, #0x178\n\t"
  94328. #endif
  94329. "ldrb r12, [lr, r3]\n\t"
  94330. "add r12, r2, r12\n\t"
  94331. "b L_sp_384_num_bits_12_13_%=\n\t"
  94332. "\n"
  94333. "L_sp_384_num_bits_12_11_3_%=: \n\t"
  94334. "lsr r3, r1, #16\n\t"
  94335. "and r3, r3, #0xff\n\t"
  94336. "cmp r3, #0\n\t"
  94337. "beq L_sp_384_num_bits_12_11_2_%=\n\t"
  94338. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94339. "mov r2, #0x1\n\t"
  94340. "lsl r2, r2, #8\n\t"
  94341. "add r2, r2, #0x70\n\t"
  94342. #else
  94343. "mov r2, #0x170\n\t"
  94344. #endif
  94345. "ldrb r12, [lr, r3]\n\t"
  94346. "add r12, r2, r12\n\t"
  94347. "b L_sp_384_num_bits_12_13_%=\n\t"
  94348. "\n"
  94349. "L_sp_384_num_bits_12_11_2_%=: \n\t"
  94350. "lsr r3, r1, #8\n\t"
  94351. "and r3, r3, #0xff\n\t"
  94352. "cmp r3, #0\n\t"
  94353. "beq L_sp_384_num_bits_12_11_1_%=\n\t"
  94354. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94355. "mov r2, #0x1\n\t"
  94356. "lsl r2, r2, #8\n\t"
  94357. "add r2, r2, #0x68\n\t"
  94358. #else
  94359. "mov r2, #0x168\n\t"
  94360. #endif
  94361. "ldrb r12, [lr, r3]\n\t"
  94362. "add r12, r2, r12\n\t"
  94363. "b L_sp_384_num_bits_12_13_%=\n\t"
  94364. "\n"
  94365. "L_sp_384_num_bits_12_11_1_%=: \n\t"
  94366. "and r3, r1, #0xff\n\t"
  94367. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94368. "mov r2, #0x1\n\t"
  94369. "lsl r2, r2, #8\n\t"
  94370. "add r2, r2, #0x60\n\t"
  94371. #else
  94372. "mov r2, #0x160\n\t"
  94373. #endif
  94374. "ldrb r12, [lr, r3]\n\t"
  94375. "add r12, r2, r12\n\t"
  94376. "b L_sp_384_num_bits_12_13_%=\n\t"
  94377. "\n"
  94378. "L_sp_384_num_bits_12_11_%=: \n\t"
  94379. "ldr r1, [%[a], #40]\n\t"
  94380. "cmp r1, #0\n\t"
  94381. "beq L_sp_384_num_bits_12_10_%=\n\t"
  94382. "lsr r3, r1, #24\n\t"
  94383. "cmp r3, #0\n\t"
  94384. "beq L_sp_384_num_bits_12_10_3_%=\n\t"
  94385. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94386. "mov r2, #0x1\n\t"
  94387. "lsl r2, r2, #8\n\t"
  94388. "add r2, r2, #0x58\n\t"
  94389. #else
  94390. "mov r2, #0x158\n\t"
  94391. #endif
  94392. "ldrb r12, [lr, r3]\n\t"
  94393. "add r12, r2, r12\n\t"
  94394. "b L_sp_384_num_bits_12_13_%=\n\t"
  94395. "\n"
  94396. "L_sp_384_num_bits_12_10_3_%=: \n\t"
  94397. "lsr r3, r1, #16\n\t"
  94398. "and r3, r3, #0xff\n\t"
  94399. "cmp r3, #0\n\t"
  94400. "beq L_sp_384_num_bits_12_10_2_%=\n\t"
  94401. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94402. "mov r2, #0x1\n\t"
  94403. "lsl r2, r2, #8\n\t"
  94404. "add r2, r2, #0x50\n\t"
  94405. #else
  94406. "mov r2, #0x150\n\t"
  94407. #endif
  94408. "ldrb r12, [lr, r3]\n\t"
  94409. "add r12, r2, r12\n\t"
  94410. "b L_sp_384_num_bits_12_13_%=\n\t"
  94411. "\n"
  94412. "L_sp_384_num_bits_12_10_2_%=: \n\t"
  94413. "lsr r3, r1, #8\n\t"
  94414. "and r3, r3, #0xff\n\t"
  94415. "cmp r3, #0\n\t"
  94416. "beq L_sp_384_num_bits_12_10_1_%=\n\t"
  94417. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94418. "mov r2, #0x1\n\t"
  94419. "lsl r2, r2, #8\n\t"
  94420. "add r2, r2, #0x48\n\t"
  94421. #else
  94422. "mov r2, #0x148\n\t"
  94423. #endif
  94424. "ldrb r12, [lr, r3]\n\t"
  94425. "add r12, r2, r12\n\t"
  94426. "b L_sp_384_num_bits_12_13_%=\n\t"
  94427. "\n"
  94428. "L_sp_384_num_bits_12_10_1_%=: \n\t"
  94429. "and r3, r1, #0xff\n\t"
  94430. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94431. "mov r2, #0x1\n\t"
  94432. "lsl r2, r2, #8\n\t"
  94433. "add r2, r2, #0x40\n\t"
  94434. #else
  94435. "mov r2, #0x140\n\t"
  94436. #endif
  94437. "ldrb r12, [lr, r3]\n\t"
  94438. "add r12, r2, r12\n\t"
  94439. "b L_sp_384_num_bits_12_13_%=\n\t"
  94440. "\n"
  94441. "L_sp_384_num_bits_12_10_%=: \n\t"
  94442. "ldr r1, [%[a], #36]\n\t"
  94443. "cmp r1, #0\n\t"
  94444. "beq L_sp_384_num_bits_12_9_%=\n\t"
  94445. "lsr r3, r1, #24\n\t"
  94446. "cmp r3, #0\n\t"
  94447. "beq L_sp_384_num_bits_12_9_3_%=\n\t"
  94448. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94449. "mov r2, #0x1\n\t"
  94450. "lsl r2, r2, #8\n\t"
  94451. "add r2, r2, #0x38\n\t"
  94452. #else
  94453. "mov r2, #0x138\n\t"
  94454. #endif
  94455. "ldrb r12, [lr, r3]\n\t"
  94456. "add r12, r2, r12\n\t"
  94457. "b L_sp_384_num_bits_12_13_%=\n\t"
  94458. "\n"
  94459. "L_sp_384_num_bits_12_9_3_%=: \n\t"
  94460. "lsr r3, r1, #16\n\t"
  94461. "and r3, r3, #0xff\n\t"
  94462. "cmp r3, #0\n\t"
  94463. "beq L_sp_384_num_bits_12_9_2_%=\n\t"
  94464. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94465. "mov r2, #0x1\n\t"
  94466. "lsl r2, r2, #8\n\t"
  94467. "add r2, r2, #0x30\n\t"
  94468. #else
  94469. "mov r2, #0x130\n\t"
  94470. #endif
  94471. "ldrb r12, [lr, r3]\n\t"
  94472. "add r12, r2, r12\n\t"
  94473. "b L_sp_384_num_bits_12_13_%=\n\t"
  94474. "\n"
  94475. "L_sp_384_num_bits_12_9_2_%=: \n\t"
  94476. "lsr r3, r1, #8\n\t"
  94477. "and r3, r3, #0xff\n\t"
  94478. "cmp r3, #0\n\t"
  94479. "beq L_sp_384_num_bits_12_9_1_%=\n\t"
  94480. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94481. "mov r2, #0x1\n\t"
  94482. "lsl r2, r2, #8\n\t"
  94483. "add r2, r2, #0x28\n\t"
  94484. #else
  94485. "mov r2, #0x128\n\t"
  94486. #endif
  94487. "ldrb r12, [lr, r3]\n\t"
  94488. "add r12, r2, r12\n\t"
  94489. "b L_sp_384_num_bits_12_13_%=\n\t"
  94490. "\n"
  94491. "L_sp_384_num_bits_12_9_1_%=: \n\t"
  94492. "and r3, r1, #0xff\n\t"
  94493. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94494. "mov r2, #0x1\n\t"
  94495. "lsl r2, r2, #8\n\t"
  94496. "add r2, r2, #0x20\n\t"
  94497. #else
  94498. "mov r2, #0x120\n\t"
  94499. #endif
  94500. "ldrb r12, [lr, r3]\n\t"
  94501. "add r12, r2, r12\n\t"
  94502. "b L_sp_384_num_bits_12_13_%=\n\t"
  94503. "\n"
  94504. "L_sp_384_num_bits_12_9_%=: \n\t"
  94505. "ldr r1, [%[a], #32]\n\t"
  94506. "cmp r1, #0\n\t"
  94507. "beq L_sp_384_num_bits_12_8_%=\n\t"
  94508. "lsr r3, r1, #24\n\t"
  94509. "cmp r3, #0\n\t"
  94510. "beq L_sp_384_num_bits_12_8_3_%=\n\t"
  94511. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94512. "mov r2, #0x1\n\t"
  94513. "lsl r2, r2, #8\n\t"
  94514. "add r2, r2, #0x18\n\t"
  94515. #else
  94516. "mov r2, #0x118\n\t"
  94517. #endif
  94518. "ldrb r12, [lr, r3]\n\t"
  94519. "add r12, r2, r12\n\t"
  94520. "b L_sp_384_num_bits_12_13_%=\n\t"
  94521. "\n"
  94522. "L_sp_384_num_bits_12_8_3_%=: \n\t"
  94523. "lsr r3, r1, #16\n\t"
  94524. "and r3, r3, #0xff\n\t"
  94525. "cmp r3, #0\n\t"
  94526. "beq L_sp_384_num_bits_12_8_2_%=\n\t"
  94527. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94528. "mov r2, #0x1\n\t"
  94529. "lsl r2, r2, #8\n\t"
  94530. "add r2, r2, #0x10\n\t"
  94531. #else
  94532. "mov r2, #0x110\n\t"
  94533. #endif
  94534. "ldrb r12, [lr, r3]\n\t"
  94535. "add r12, r2, r12\n\t"
  94536. "b L_sp_384_num_bits_12_13_%=\n\t"
  94537. "\n"
  94538. "L_sp_384_num_bits_12_8_2_%=: \n\t"
  94539. "lsr r3, r1, #8\n\t"
  94540. "and r3, r3, #0xff\n\t"
  94541. "cmp r3, #0\n\t"
  94542. "beq L_sp_384_num_bits_12_8_1_%=\n\t"
  94543. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94544. "mov r2, #0x1\n\t"
  94545. "lsl r2, r2, #8\n\t"
  94546. "add r2, r2, #0x8\n\t"
  94547. #else
  94548. "mov r2, #0x108\n\t"
  94549. #endif
  94550. "ldrb r12, [lr, r3]\n\t"
  94551. "add r12, r2, r12\n\t"
  94552. "b L_sp_384_num_bits_12_13_%=\n\t"
  94553. "\n"
  94554. "L_sp_384_num_bits_12_8_1_%=: \n\t"
  94555. "and r3, r1, #0xff\n\t"
  94556. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94557. "mov r2, #0x1\n\t"
  94558. "lsl r2, r2, #8\n\t"
  94559. "add r2, r2, #0x0\n\t"
  94560. #else
  94561. "mov r2, #0x100\n\t"
  94562. #endif
  94563. "ldrb r12, [lr, r3]\n\t"
  94564. "add r12, r2, r12\n\t"
  94565. "b L_sp_384_num_bits_12_13_%=\n\t"
  94566. "\n"
  94567. "L_sp_384_num_bits_12_8_%=: \n\t"
  94568. "ldr r1, [%[a], #28]\n\t"
  94569. "cmp r1, #0\n\t"
  94570. "beq L_sp_384_num_bits_12_7_%=\n\t"
  94571. "lsr r3, r1, #24\n\t"
  94572. "cmp r3, #0\n\t"
  94573. "beq L_sp_384_num_bits_12_7_3_%=\n\t"
  94574. "mov r2, #0xf8\n\t"
  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_7_3_%=: \n\t"
  94580. "lsr r3, r1, #16\n\t"
  94581. "and r3, r3, #0xff\n\t"
  94582. "cmp r3, #0\n\t"
  94583. "beq L_sp_384_num_bits_12_7_2_%=\n\t"
  94584. "mov r2, #0xf0\n\t"
  94585. "ldrb r12, [lr, r3]\n\t"
  94586. "add r12, r2, r12\n\t"
  94587. "b L_sp_384_num_bits_12_13_%=\n\t"
  94588. "\n"
  94589. "L_sp_384_num_bits_12_7_2_%=: \n\t"
  94590. "lsr r3, r1, #8\n\t"
  94591. "and r3, r3, #0xff\n\t"
  94592. "cmp r3, #0\n\t"
  94593. "beq L_sp_384_num_bits_12_7_1_%=\n\t"
  94594. "mov r2, #0xe8\n\t"
  94595. "ldrb r12, [lr, r3]\n\t"
  94596. "add r12, r2, r12\n\t"
  94597. "b L_sp_384_num_bits_12_13_%=\n\t"
  94598. "\n"
  94599. "L_sp_384_num_bits_12_7_1_%=: \n\t"
  94600. "and r3, r1, #0xff\n\t"
  94601. "mov r2, #0xe0\n\t"
  94602. "ldrb r12, [lr, r3]\n\t"
  94603. "add r12, r2, r12\n\t"
  94604. "b L_sp_384_num_bits_12_13_%=\n\t"
  94605. "\n"
  94606. "L_sp_384_num_bits_12_7_%=: \n\t"
  94607. "ldr r1, [%[a], #24]\n\t"
  94608. "cmp r1, #0\n\t"
  94609. "beq L_sp_384_num_bits_12_6_%=\n\t"
  94610. "lsr r3, r1, #24\n\t"
  94611. "cmp r3, #0\n\t"
  94612. "beq L_sp_384_num_bits_12_6_3_%=\n\t"
  94613. "mov r2, #0xd8\n\t"
  94614. "ldrb r12, [lr, r3]\n\t"
  94615. "add r12, r2, r12\n\t"
  94616. "b L_sp_384_num_bits_12_13_%=\n\t"
  94617. "\n"
  94618. "L_sp_384_num_bits_12_6_3_%=: \n\t"
  94619. "lsr r3, r1, #16\n\t"
  94620. "and r3, r3, #0xff\n\t"
  94621. "cmp r3, #0\n\t"
  94622. "beq L_sp_384_num_bits_12_6_2_%=\n\t"
  94623. "mov r2, #0xd0\n\t"
  94624. "ldrb r12, [lr, r3]\n\t"
  94625. "add r12, r2, r12\n\t"
  94626. "b L_sp_384_num_bits_12_13_%=\n\t"
  94627. "\n"
  94628. "L_sp_384_num_bits_12_6_2_%=: \n\t"
  94629. "lsr r3, r1, #8\n\t"
  94630. "and r3, r3, #0xff\n\t"
  94631. "cmp r3, #0\n\t"
  94632. "beq L_sp_384_num_bits_12_6_1_%=\n\t"
  94633. "mov r2, #0xc8\n\t"
  94634. "ldrb r12, [lr, r3]\n\t"
  94635. "add r12, r2, r12\n\t"
  94636. "b L_sp_384_num_bits_12_13_%=\n\t"
  94637. "\n"
  94638. "L_sp_384_num_bits_12_6_1_%=: \n\t"
  94639. "and r3, r1, #0xff\n\t"
  94640. "mov r2, #0xc0\n\t"
  94641. "ldrb r12, [lr, r3]\n\t"
  94642. "add r12, r2, r12\n\t"
  94643. "b L_sp_384_num_bits_12_13_%=\n\t"
  94644. "\n"
  94645. "L_sp_384_num_bits_12_6_%=: \n\t"
  94646. "ldr r1, [%[a], #20]\n\t"
  94647. "cmp r1, #0\n\t"
  94648. "beq L_sp_384_num_bits_12_5_%=\n\t"
  94649. "lsr r3, r1, #24\n\t"
  94650. "cmp r3, #0\n\t"
  94651. "beq L_sp_384_num_bits_12_5_3_%=\n\t"
  94652. "mov r2, #0xb8\n\t"
  94653. "ldrb r12, [lr, r3]\n\t"
  94654. "add r12, r2, r12\n\t"
  94655. "b L_sp_384_num_bits_12_13_%=\n\t"
  94656. "\n"
  94657. "L_sp_384_num_bits_12_5_3_%=: \n\t"
  94658. "lsr r3, r1, #16\n\t"
  94659. "and r3, r3, #0xff\n\t"
  94660. "cmp r3, #0\n\t"
  94661. "beq L_sp_384_num_bits_12_5_2_%=\n\t"
  94662. "mov r2, #0xb0\n\t"
  94663. "ldrb r12, [lr, r3]\n\t"
  94664. "add r12, r2, r12\n\t"
  94665. "b L_sp_384_num_bits_12_13_%=\n\t"
  94666. "\n"
  94667. "L_sp_384_num_bits_12_5_2_%=: \n\t"
  94668. "lsr r3, r1, #8\n\t"
  94669. "and r3, r3, #0xff\n\t"
  94670. "cmp r3, #0\n\t"
  94671. "beq L_sp_384_num_bits_12_5_1_%=\n\t"
  94672. "mov r2, #0xa8\n\t"
  94673. "ldrb r12, [lr, r3]\n\t"
  94674. "add r12, r2, r12\n\t"
  94675. "b L_sp_384_num_bits_12_13_%=\n\t"
  94676. "\n"
  94677. "L_sp_384_num_bits_12_5_1_%=: \n\t"
  94678. "and r3, r1, #0xff\n\t"
  94679. "mov r2, #0xa0\n\t"
  94680. "ldrb r12, [lr, r3]\n\t"
  94681. "add r12, r2, r12\n\t"
  94682. "b L_sp_384_num_bits_12_13_%=\n\t"
  94683. "\n"
  94684. "L_sp_384_num_bits_12_5_%=: \n\t"
  94685. "ldr r1, [%[a], #16]\n\t"
  94686. "cmp r1, #0\n\t"
  94687. "beq L_sp_384_num_bits_12_4_%=\n\t"
  94688. "lsr r3, r1, #24\n\t"
  94689. "cmp r3, #0\n\t"
  94690. "beq L_sp_384_num_bits_12_4_3_%=\n\t"
  94691. "mov r2, #0x98\n\t"
  94692. "ldrb r12, [lr, r3]\n\t"
  94693. "add r12, r2, r12\n\t"
  94694. "b L_sp_384_num_bits_12_13_%=\n\t"
  94695. "\n"
  94696. "L_sp_384_num_bits_12_4_3_%=: \n\t"
  94697. "lsr r3, r1, #16\n\t"
  94698. "and r3, r3, #0xff\n\t"
  94699. "cmp r3, #0\n\t"
  94700. "beq L_sp_384_num_bits_12_4_2_%=\n\t"
  94701. "mov r2, #0x90\n\t"
  94702. "ldrb r12, [lr, r3]\n\t"
  94703. "add r12, r2, r12\n\t"
  94704. "b L_sp_384_num_bits_12_13_%=\n\t"
  94705. "\n"
  94706. "L_sp_384_num_bits_12_4_2_%=: \n\t"
  94707. "lsr r3, r1, #8\n\t"
  94708. "and r3, r3, #0xff\n\t"
  94709. "cmp r3, #0\n\t"
  94710. "beq L_sp_384_num_bits_12_4_1_%=\n\t"
  94711. "mov r2, #0x88\n\t"
  94712. "ldrb r12, [lr, r3]\n\t"
  94713. "add r12, r2, r12\n\t"
  94714. "b L_sp_384_num_bits_12_13_%=\n\t"
  94715. "\n"
  94716. "L_sp_384_num_bits_12_4_1_%=: \n\t"
  94717. "and r3, r1, #0xff\n\t"
  94718. "mov r2, #0x80\n\t"
  94719. "ldrb r12, [lr, r3]\n\t"
  94720. "add r12, r2, r12\n\t"
  94721. "b L_sp_384_num_bits_12_13_%=\n\t"
  94722. "\n"
  94723. "L_sp_384_num_bits_12_4_%=: \n\t"
  94724. "ldr r1, [%[a], #12]\n\t"
  94725. "cmp r1, #0\n\t"
  94726. "beq L_sp_384_num_bits_12_3_%=\n\t"
  94727. "lsr r3, r1, #24\n\t"
  94728. "cmp r3, #0\n\t"
  94729. "beq L_sp_384_num_bits_12_3_3_%=\n\t"
  94730. "mov r2, #0x78\n\t"
  94731. "ldrb r12, [lr, r3]\n\t"
  94732. "add r12, r2, r12\n\t"
  94733. "b L_sp_384_num_bits_12_13_%=\n\t"
  94734. "\n"
  94735. "L_sp_384_num_bits_12_3_3_%=: \n\t"
  94736. "lsr r3, r1, #16\n\t"
  94737. "and r3, r3, #0xff\n\t"
  94738. "cmp r3, #0\n\t"
  94739. "beq L_sp_384_num_bits_12_3_2_%=\n\t"
  94740. "mov r2, #0x70\n\t"
  94741. "ldrb r12, [lr, r3]\n\t"
  94742. "add r12, r2, r12\n\t"
  94743. "b L_sp_384_num_bits_12_13_%=\n\t"
  94744. "\n"
  94745. "L_sp_384_num_bits_12_3_2_%=: \n\t"
  94746. "lsr r3, r1, #8\n\t"
  94747. "and r3, r3, #0xff\n\t"
  94748. "cmp r3, #0\n\t"
  94749. "beq L_sp_384_num_bits_12_3_1_%=\n\t"
  94750. "mov r2, #0x68\n\t"
  94751. "ldrb r12, [lr, r3]\n\t"
  94752. "add r12, r2, r12\n\t"
  94753. "b L_sp_384_num_bits_12_13_%=\n\t"
  94754. "\n"
  94755. "L_sp_384_num_bits_12_3_1_%=: \n\t"
  94756. "and r3, r1, #0xff\n\t"
  94757. "mov r2, #0x60\n\t"
  94758. "ldrb r12, [lr, r3]\n\t"
  94759. "add r12, r2, r12\n\t"
  94760. "b L_sp_384_num_bits_12_13_%=\n\t"
  94761. "\n"
  94762. "L_sp_384_num_bits_12_3_%=: \n\t"
  94763. "ldr r1, [%[a], #8]\n\t"
  94764. "cmp r1, #0\n\t"
  94765. "beq L_sp_384_num_bits_12_2_%=\n\t"
  94766. "lsr r3, r1, #24\n\t"
  94767. "cmp r3, #0\n\t"
  94768. "beq L_sp_384_num_bits_12_2_3_%=\n\t"
  94769. "mov r2, #0x58\n\t"
  94770. "ldrb r12, [lr, r3]\n\t"
  94771. "add r12, r2, r12\n\t"
  94772. "b L_sp_384_num_bits_12_13_%=\n\t"
  94773. "\n"
  94774. "L_sp_384_num_bits_12_2_3_%=: \n\t"
  94775. "lsr r3, r1, #16\n\t"
  94776. "and r3, r3, #0xff\n\t"
  94777. "cmp r3, #0\n\t"
  94778. "beq L_sp_384_num_bits_12_2_2_%=\n\t"
  94779. "mov r2, #0x50\n\t"
  94780. "ldrb r12, [lr, r3]\n\t"
  94781. "add r12, r2, r12\n\t"
  94782. "b L_sp_384_num_bits_12_13_%=\n\t"
  94783. "\n"
  94784. "L_sp_384_num_bits_12_2_2_%=: \n\t"
  94785. "lsr r3, r1, #8\n\t"
  94786. "and r3, r3, #0xff\n\t"
  94787. "cmp r3, #0\n\t"
  94788. "beq L_sp_384_num_bits_12_2_1_%=\n\t"
  94789. "mov r2, #0x48\n\t"
  94790. "ldrb r12, [lr, r3]\n\t"
  94791. "add r12, r2, r12\n\t"
  94792. "b L_sp_384_num_bits_12_13_%=\n\t"
  94793. "\n"
  94794. "L_sp_384_num_bits_12_2_1_%=: \n\t"
  94795. "and r3, r1, #0xff\n\t"
  94796. "mov r2, #0x40\n\t"
  94797. "ldrb r12, [lr, r3]\n\t"
  94798. "add r12, r2, r12\n\t"
  94799. "b L_sp_384_num_bits_12_13_%=\n\t"
  94800. "\n"
  94801. "L_sp_384_num_bits_12_2_%=: \n\t"
  94802. "ldr r1, [%[a], #4]\n\t"
  94803. "cmp r1, #0\n\t"
  94804. "beq L_sp_384_num_bits_12_1_%=\n\t"
  94805. "lsr r3, r1, #24\n\t"
  94806. "cmp r3, #0\n\t"
  94807. "beq L_sp_384_num_bits_12_1_3_%=\n\t"
  94808. "mov r2, #56\n\t"
  94809. "ldrb r12, [lr, r3]\n\t"
  94810. "add r12, r2, r12\n\t"
  94811. "b L_sp_384_num_bits_12_13_%=\n\t"
  94812. "\n"
  94813. "L_sp_384_num_bits_12_1_3_%=: \n\t"
  94814. "lsr r3, r1, #16\n\t"
  94815. "and r3, r3, #0xff\n\t"
  94816. "cmp r3, #0\n\t"
  94817. "beq L_sp_384_num_bits_12_1_2_%=\n\t"
  94818. "mov r2, #48\n\t"
  94819. "ldrb r12, [lr, r3]\n\t"
  94820. "add r12, r2, r12\n\t"
  94821. "b L_sp_384_num_bits_12_13_%=\n\t"
  94822. "\n"
  94823. "L_sp_384_num_bits_12_1_2_%=: \n\t"
  94824. "lsr r3, r1, #8\n\t"
  94825. "and r3, r3, #0xff\n\t"
  94826. "cmp r3, #0\n\t"
  94827. "beq L_sp_384_num_bits_12_1_1_%=\n\t"
  94828. "mov r2, #40\n\t"
  94829. "ldrb r12, [lr, r3]\n\t"
  94830. "add r12, r2, r12\n\t"
  94831. "b L_sp_384_num_bits_12_13_%=\n\t"
  94832. "\n"
  94833. "L_sp_384_num_bits_12_1_1_%=: \n\t"
  94834. "and r3, r1, #0xff\n\t"
  94835. "mov r2, #32\n\t"
  94836. "ldrb r12, [lr, r3]\n\t"
  94837. "add r12, r2, r12\n\t"
  94838. "b L_sp_384_num_bits_12_13_%=\n\t"
  94839. "\n"
  94840. "L_sp_384_num_bits_12_1_%=: \n\t"
  94841. "ldr r1, [%[a]]\n\t"
  94842. "lsr r3, r1, #24\n\t"
  94843. "cmp r3, #0\n\t"
  94844. "beq L_sp_384_num_bits_12_0_3_%=\n\t"
  94845. "mov r2, #24\n\t"
  94846. "ldrb r12, [lr, r3]\n\t"
  94847. "add r12, r2, r12\n\t"
  94848. "b L_sp_384_num_bits_12_13_%=\n\t"
  94849. "\n"
  94850. "L_sp_384_num_bits_12_0_3_%=: \n\t"
  94851. "lsr r3, r1, #16\n\t"
  94852. "and r3, r3, #0xff\n\t"
  94853. "cmp r3, #0\n\t"
  94854. "beq L_sp_384_num_bits_12_0_2_%=\n\t"
  94855. "mov r2, #16\n\t"
  94856. "ldrb r12, [lr, r3]\n\t"
  94857. "add r12, r2, r12\n\t"
  94858. "b L_sp_384_num_bits_12_13_%=\n\t"
  94859. "\n"
  94860. "L_sp_384_num_bits_12_0_2_%=: \n\t"
  94861. "lsr r3, r1, #8\n\t"
  94862. "and r3, r3, #0xff\n\t"
  94863. "cmp r3, #0\n\t"
  94864. "beq L_sp_384_num_bits_12_0_1_%=\n\t"
  94865. "mov r2, #8\n\t"
  94866. "ldrb r12, [lr, r3]\n\t"
  94867. "add r12, r2, r12\n\t"
  94868. "b L_sp_384_num_bits_12_13_%=\n\t"
  94869. "\n"
  94870. "L_sp_384_num_bits_12_0_1_%=: \n\t"
  94871. "and r3, r1, #0xff\n\t"
  94872. "ldrb r12, [lr, r3]\n\t"
  94873. "\n"
  94874. "L_sp_384_num_bits_12_13_%=: \n\t"
  94875. "mov %[a], r12\n\t"
  94876. : [a] "+r" (a), [L_sp_384_num_bits_12_table] "+r" (L_sp_384_num_bits_12_table_c)
  94877. :
  94878. : "memory", "r2", "r3", "r12", "lr", "cc"
  94879. );
  94880. return (uint32_t)(size_t)a;
  94881. }
  94882. #else
  94883. static int sp_384_num_bits_12(const sp_digit* a_p)
  94884. {
  94885. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  94886. __asm__ __volatile__ (
  94887. "ldr r1, [%[a], #44]\n\t"
  94888. "cmp r1, #0\n\t"
  94889. "beq L_sp_384_num_bits_12_11_%=\n\t"
  94890. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94891. "mov r2, #0x1\n\t"
  94892. "lsl r2, r2, #8\n\t"
  94893. "add r2, r2, #0x80\n\t"
  94894. #else
  94895. "mov r2, #0x180\n\t"
  94896. #endif
  94897. "clz r12, r1\n\t"
  94898. "sub 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_11_%=: \n\t"
  94902. "ldr r1, [%[a], #40]\n\t"
  94903. "cmp r1, #0\n\t"
  94904. "beq L_sp_384_num_bits_12_10_%=\n\t"
  94905. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94906. "mov r2, #0x1\n\t"
  94907. "lsl r2, r2, #8\n\t"
  94908. "add r2, r2, #0x60\n\t"
  94909. #else
  94910. "mov r2, #0x160\n\t"
  94911. #endif
  94912. "clz r12, r1\n\t"
  94913. "sub r12, r2, r12\n\t"
  94914. "b L_sp_384_num_bits_12_13_%=\n\t"
  94915. "\n"
  94916. "L_sp_384_num_bits_12_10_%=: \n\t"
  94917. "ldr r1, [%[a], #36]\n\t"
  94918. "cmp r1, #0\n\t"
  94919. "beq L_sp_384_num_bits_12_9_%=\n\t"
  94920. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94921. "mov r2, #0x1\n\t"
  94922. "lsl r2, r2, #8\n\t"
  94923. "add r2, r2, #0x40\n\t"
  94924. #else
  94925. "mov r2, #0x140\n\t"
  94926. #endif
  94927. "clz r12, r1\n\t"
  94928. "sub r12, r2, r12\n\t"
  94929. "b L_sp_384_num_bits_12_13_%=\n\t"
  94930. "\n"
  94931. "L_sp_384_num_bits_12_9_%=: \n\t"
  94932. "ldr r1, [%[a], #32]\n\t"
  94933. "cmp r1, #0\n\t"
  94934. "beq L_sp_384_num_bits_12_8_%=\n\t"
  94935. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94936. "mov r2, #0x1\n\t"
  94937. "lsl r2, r2, #8\n\t"
  94938. "add r2, r2, #0x20\n\t"
  94939. #else
  94940. "mov r2, #0x120\n\t"
  94941. #endif
  94942. "clz r12, r1\n\t"
  94943. "sub r12, r2, r12\n\t"
  94944. "b L_sp_384_num_bits_12_13_%=\n\t"
  94945. "\n"
  94946. "L_sp_384_num_bits_12_8_%=: \n\t"
  94947. "ldr r1, [%[a], #28]\n\t"
  94948. "cmp r1, #0\n\t"
  94949. "beq L_sp_384_num_bits_12_7_%=\n\t"
  94950. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  94951. "mov r2, #0x1\n\t"
  94952. "lsl r2, r2, #8\n\t"
  94953. "add r2, r2, #0x0\n\t"
  94954. #else
  94955. "mov r2, #0x100\n\t"
  94956. #endif
  94957. "clz r12, r1\n\t"
  94958. "sub r12, r2, r12\n\t"
  94959. "b L_sp_384_num_bits_12_13_%=\n\t"
  94960. "\n"
  94961. "L_sp_384_num_bits_12_7_%=: \n\t"
  94962. "ldr r1, [%[a], #24]\n\t"
  94963. "cmp r1, #0\n\t"
  94964. "beq L_sp_384_num_bits_12_6_%=\n\t"
  94965. "mov r2, #0xe0\n\t"
  94966. "clz r12, r1\n\t"
  94967. "sub r12, r2, r12\n\t"
  94968. "b L_sp_384_num_bits_12_13_%=\n\t"
  94969. "\n"
  94970. "L_sp_384_num_bits_12_6_%=: \n\t"
  94971. "ldr r1, [%[a], #20]\n\t"
  94972. "cmp r1, #0\n\t"
  94973. "beq L_sp_384_num_bits_12_5_%=\n\t"
  94974. "mov r2, #0xc0\n\t"
  94975. "clz r12, r1\n\t"
  94976. "sub r12, r2, r12\n\t"
  94977. "b L_sp_384_num_bits_12_13_%=\n\t"
  94978. "\n"
  94979. "L_sp_384_num_bits_12_5_%=: \n\t"
  94980. "ldr r1, [%[a], #16]\n\t"
  94981. "cmp r1, #0\n\t"
  94982. "beq L_sp_384_num_bits_12_4_%=\n\t"
  94983. "mov r2, #0xa0\n\t"
  94984. "clz r12, r1\n\t"
  94985. "sub r12, r2, r12\n\t"
  94986. "b L_sp_384_num_bits_12_13_%=\n\t"
  94987. "\n"
  94988. "L_sp_384_num_bits_12_4_%=: \n\t"
  94989. "ldr r1, [%[a], #12]\n\t"
  94990. "cmp r1, #0\n\t"
  94991. "beq L_sp_384_num_bits_12_3_%=\n\t"
  94992. "mov r2, #0x80\n\t"
  94993. "clz r12, r1\n\t"
  94994. "sub r12, r2, r12\n\t"
  94995. "b L_sp_384_num_bits_12_13_%=\n\t"
  94996. "\n"
  94997. "L_sp_384_num_bits_12_3_%=: \n\t"
  94998. "ldr r1, [%[a], #8]\n\t"
  94999. "cmp r1, #0\n\t"
  95000. "beq L_sp_384_num_bits_12_2_%=\n\t"
  95001. "mov r2, #0x60\n\t"
  95002. "clz r12, r1\n\t"
  95003. "sub r12, r2, r12\n\t"
  95004. "b L_sp_384_num_bits_12_13_%=\n\t"
  95005. "\n"
  95006. "L_sp_384_num_bits_12_2_%=: \n\t"
  95007. "ldr r1, [%[a], #4]\n\t"
  95008. "cmp r1, #0\n\t"
  95009. "beq L_sp_384_num_bits_12_1_%=\n\t"
  95010. "mov r2, #0x40\n\t"
  95011. "clz r12, r1\n\t"
  95012. "sub r12, r2, r12\n\t"
  95013. "b L_sp_384_num_bits_12_13_%=\n\t"
  95014. "\n"
  95015. "L_sp_384_num_bits_12_1_%=: \n\t"
  95016. "ldr r1, [%[a]]\n\t"
  95017. "mov r2, #32\n\t"
  95018. "clz r12, r1\n\t"
  95019. "sub r12, r2, r12\n\t"
  95020. "\n"
  95021. "L_sp_384_num_bits_12_13_%=: \n\t"
  95022. "mov %[a], r12\n\t"
  95023. : [a] "+r" (a)
  95024. :
  95025. : "memory", "r1", "r2", "r3", "r12", "lr", "cc"
  95026. );
  95027. return (uint32_t)(size_t)a;
  95028. }
  95029. #endif /* WOLFSSL_ARM_ARCH && (WOLFSSL_ARM_ARCH < 7) */
  95030. /* Non-constant time modular inversion.
  95031. *
  95032. * @param [out] r Resulting number.
  95033. * @param [in] a Number to invert.
  95034. * @param [in] m Modulus.
  95035. * @return MP_OKAY on success.
  95036. */
  95037. static int sp_384_mod_inv_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  95038. {
  95039. sp_digit u[12];
  95040. sp_digit v[12];
  95041. sp_digit b[12];
  95042. sp_digit d[12];
  95043. int ut, vt;
  95044. sp_digit o;
  95045. XMEMCPY(u, m, sizeof(u));
  95046. XMEMCPY(v, a, sizeof(v));
  95047. ut = sp_384_num_bits_12(u);
  95048. vt = sp_384_num_bits_12(v);
  95049. XMEMSET(b, 0, sizeof(b));
  95050. if ((v[0] & 1) == 0) {
  95051. sp_384_rshift1_12(v, v);
  95052. XMEMCPY(d, m, sizeof(u));
  95053. d[0] += 1;
  95054. sp_384_rshift1_12(d, d);
  95055. vt--;
  95056. while ((v[0] & 1) == 0) {
  95057. sp_384_rshift1_12(v, v);
  95058. sp_384_div2_mod_12(d, d, m);
  95059. vt--;
  95060. }
  95061. }
  95062. else {
  95063. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  95064. d[0] = 1;
  95065. }
  95066. while (ut > 1 && vt > 1) {
  95067. if ((ut > vt) || ((ut == vt) && (sp_384_cmp_12(u, v) >= 0))) {
  95068. sp_384_sub_12(u, u, v);
  95069. o = sp_384_sub_12(b, b, d);
  95070. if (o != 0)
  95071. sp_384_add_12(b, b, m);
  95072. ut = sp_384_num_bits_12(u);
  95073. do {
  95074. sp_384_rshift1_12(u, u);
  95075. sp_384_div2_mod_12(b, b, m);
  95076. ut--;
  95077. }
  95078. while (ut > 0 && (u[0] & 1) == 0);
  95079. }
  95080. else {
  95081. sp_384_sub_12(v, v, u);
  95082. o = sp_384_sub_12(d, d, b);
  95083. if (o != 0)
  95084. sp_384_add_12(d, d, m);
  95085. vt = sp_384_num_bits_12(v);
  95086. do {
  95087. sp_384_rshift1_12(v, v);
  95088. sp_384_div2_mod_12(d, d, m);
  95089. vt--;
  95090. }
  95091. while (vt > 0 && (v[0] & 1) == 0);
  95092. }
  95093. }
  95094. if (ut == 1)
  95095. XMEMCPY(r, b, sizeof(b));
  95096. else
  95097. XMEMCPY(r, d, sizeof(d));
  95098. return MP_OKAY;
  95099. }
  95100. #endif /* WOLFSSL_SP_SMALL */
  95101. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  95102. *
  95103. * p1 First point to add and holds result.
  95104. * p2 Second point to add.
  95105. * tmp Temporary storage for intermediate numbers.
  95106. */
  95107. static void sp_384_add_points_12(sp_point_384* p1, const sp_point_384* p2,
  95108. sp_digit* tmp)
  95109. {
  95110. sp_384_proj_point_add_12(p1, p1, p2, tmp);
  95111. if (sp_384_iszero_12(p1->z)) {
  95112. if (sp_384_iszero_12(p1->x) && sp_384_iszero_12(p1->y)) {
  95113. sp_384_proj_point_dbl_12(p1, p2, tmp);
  95114. }
  95115. else {
  95116. /* Y ordinate is not used from here - don't set. */
  95117. p1->x[0] = 0;
  95118. p1->x[1] = 0;
  95119. p1->x[2] = 0;
  95120. p1->x[3] = 0;
  95121. p1->x[4] = 0;
  95122. p1->x[5] = 0;
  95123. p1->x[6] = 0;
  95124. p1->x[7] = 0;
  95125. p1->x[8] = 0;
  95126. p1->x[9] = 0;
  95127. p1->x[10] = 0;
  95128. p1->x[11] = 0;
  95129. XMEMCPY(p1->z, p384_norm_mod, sizeof(p384_norm_mod));
  95130. }
  95131. }
  95132. }
  95133. /* Calculate the verification point: [e/s]G + [r/s]Q
  95134. *
  95135. * p1 Calculated point.
  95136. * p2 Public point and temporary.
  95137. * s Second part of signature as a number.
  95138. * u1 Temporary number.
  95139. * u2 Temporary number.
  95140. * heap Heap to use for allocation.
  95141. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  95142. */
  95143. static int sp_384_calc_vfy_point_12(sp_point_384* p1, sp_point_384* p2,
  95144. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  95145. {
  95146. int err;
  95147. #ifndef WOLFSSL_SP_SMALL
  95148. err = sp_384_mod_inv_12(s, s, p384_order);
  95149. if (err == MP_OKAY)
  95150. #endif /* !WOLFSSL_SP_SMALL */
  95151. {
  95152. sp_384_mul_12(s, s, p384_norm_order);
  95153. err = sp_384_mod_12(s, s, p384_order);
  95154. }
  95155. if (err == MP_OKAY) {
  95156. sp_384_norm_12(s);
  95157. #ifdef WOLFSSL_SP_SMALL
  95158. {
  95159. sp_384_mont_inv_order_12(s, s, tmp);
  95160. sp_384_mont_mul_order_12(u1, u1, s);
  95161. sp_384_mont_mul_order_12(u2, u2, s);
  95162. }
  95163. #else
  95164. {
  95165. sp_384_mont_mul_order_12(u1, u1, s);
  95166. sp_384_mont_mul_order_12(u2, u2, s);
  95167. }
  95168. #endif /* WOLFSSL_SP_SMALL */
  95169. {
  95170. err = sp_384_ecc_mulmod_base_12(p1, u1, 0, 0, heap);
  95171. }
  95172. }
  95173. if ((err == MP_OKAY) && sp_384_iszero_12(p1->z)) {
  95174. p1->infinity = 1;
  95175. }
  95176. if (err == MP_OKAY) {
  95177. err = sp_384_ecc_mulmod_12(p2, p2, u2, 0, 0, heap);
  95178. }
  95179. if ((err == MP_OKAY) && sp_384_iszero_12(p2->z)) {
  95180. p2->infinity = 1;
  95181. }
  95182. if (err == MP_OKAY) {
  95183. sp_384_add_points_12(p1, p2, tmp);
  95184. }
  95185. return err;
  95186. }
  95187. #ifdef HAVE_ECC_VERIFY
  95188. /* Verify the signature values with the hash and public key.
  95189. * e = Truncate(hash, 384)
  95190. * u1 = e/s mod order
  95191. * u2 = r/s mod order
  95192. * r == (u1.G + u2.Q)->x mod order
  95193. * Optimization: Leave point in projective form.
  95194. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  95195. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  95196. * The hash is truncated to the first 384 bits.
  95197. *
  95198. * hash Hash to sign.
  95199. * hashLen Length of the hash data.
  95200. * rng Random number generator.
  95201. * priv Private part of key - scalar.
  95202. * rm First part of result as an mp_int.
  95203. * sm Sirst part of result as an mp_int.
  95204. * heap Heap to use for allocation.
  95205. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  95206. */
  95207. int sp_ecc_verify_384(const byte* hash, word32 hashLen, const mp_int* pX,
  95208. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  95209. int* res, void* heap)
  95210. {
  95211. #ifdef WOLFSSL_SP_SMALL_STACK
  95212. sp_digit* u1 = NULL;
  95213. sp_point_384* p1 = NULL;
  95214. #else
  95215. sp_digit u1[18 * 12];
  95216. sp_point_384 p1[2];
  95217. #endif
  95218. sp_digit* u2 = NULL;
  95219. sp_digit* s = NULL;
  95220. sp_digit* tmp = NULL;
  95221. sp_point_384* p2 = NULL;
  95222. sp_digit carry;
  95223. sp_int32 c = 0;
  95224. int err = MP_OKAY;
  95225. #ifdef WOLFSSL_SP_SMALL_STACK
  95226. if (err == MP_OKAY) {
  95227. p1 = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  95228. DYNAMIC_TYPE_ECC);
  95229. if (p1 == NULL)
  95230. err = MEMORY_E;
  95231. }
  95232. if (err == MP_OKAY) {
  95233. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 12, heap,
  95234. DYNAMIC_TYPE_ECC);
  95235. if (u1 == NULL)
  95236. err = MEMORY_E;
  95237. }
  95238. #endif
  95239. if (err == MP_OKAY) {
  95240. u2 = u1 + 2 * 12;
  95241. s = u1 + 4 * 12;
  95242. tmp = u1 + 6 * 12;
  95243. p2 = p1 + 1;
  95244. if (hashLen > 48U) {
  95245. hashLen = 48U;
  95246. }
  95247. sp_384_from_bin(u1, 12, hash, (int)hashLen);
  95248. sp_384_from_mp(u2, 12, rm);
  95249. sp_384_from_mp(s, 12, sm);
  95250. sp_384_from_mp(p2->x, 12, pX);
  95251. sp_384_from_mp(p2->y, 12, pY);
  95252. sp_384_from_mp(p2->z, 12, pZ);
  95253. err = sp_384_calc_vfy_point_12(p1, p2, s, u1, u2, tmp, heap);
  95254. }
  95255. if (err == MP_OKAY) {
  95256. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  95257. /* Reload r and convert to Montgomery form. */
  95258. sp_384_from_mp(u2, 12, rm);
  95259. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  95260. }
  95261. if (err == MP_OKAY) {
  95262. /* u1 = r.z'.z' mod prime */
  95263. sp_384_mont_sqr_12(p1->z, p1->z, p384_mod, p384_mp_mod);
  95264. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  95265. *res = (int)(sp_384_cmp_12(p1->x, u1) == 0);
  95266. if (*res == 0) {
  95267. /* Reload r and add order. */
  95268. sp_384_from_mp(u2, 12, rm);
  95269. carry = sp_384_add_12(u2, u2, p384_order);
  95270. /* Carry means result is greater than mod and is not valid. */
  95271. if (carry == 0) {
  95272. sp_384_norm_12(u2);
  95273. /* Compare with mod and if greater or equal then not valid. */
  95274. c = sp_384_cmp_12(u2, p384_mod);
  95275. }
  95276. }
  95277. if ((*res == 0) && (c < 0)) {
  95278. /* Convert to Montogomery form */
  95279. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  95280. if (err == MP_OKAY) {
  95281. /* u1 = (r + 1*order).z'.z' mod prime */
  95282. {
  95283. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  95284. }
  95285. *res = (sp_384_cmp_12(p1->x, u1) == 0);
  95286. }
  95287. }
  95288. }
  95289. #ifdef WOLFSSL_SP_SMALL_STACK
  95290. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  95291. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  95292. #endif
  95293. return err;
  95294. }
  95295. #ifdef WOLFSSL_SP_NONBLOCK
  95296. typedef struct sp_ecc_verify_384_ctx {
  95297. int state;
  95298. union {
  95299. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  95300. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  95301. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  95302. sp_384_proj_point_add_12_ctx add_ctx;
  95303. };
  95304. sp_digit u1[2*12];
  95305. sp_digit u2[2*12];
  95306. sp_digit s[2*12];
  95307. sp_digit tmp[2*12 * 6];
  95308. sp_point_384 p1;
  95309. sp_point_384 p2;
  95310. } sp_ecc_verify_384_ctx;
  95311. int sp_ecc_verify_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  95312. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  95313. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  95314. {
  95315. int err = FP_WOULDBLOCK;
  95316. sp_ecc_verify_384_ctx* ctx = (sp_ecc_verify_384_ctx*)sp_ctx->data;
  95317. typedef char ctx_size_test[sizeof(sp_ecc_verify_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  95318. (void)sizeof(ctx_size_test);
  95319. switch (ctx->state) {
  95320. case 0: /* INIT */
  95321. if (hashLen > 48U) {
  95322. hashLen = 48U;
  95323. }
  95324. sp_384_from_bin(ctx->u1, 12, hash, (int)hashLen);
  95325. sp_384_from_mp(ctx->u2, 12, rm);
  95326. sp_384_from_mp(ctx->s, 12, sm);
  95327. sp_384_from_mp(ctx->p2.x, 12, pX);
  95328. sp_384_from_mp(ctx->p2.y, 12, pY);
  95329. sp_384_from_mp(ctx->p2.z, 12, pZ);
  95330. ctx->state = 1;
  95331. break;
  95332. case 1: /* NORMS0 */
  95333. sp_384_mul_12(ctx->s, ctx->s, p384_norm_order);
  95334. err = sp_384_mod_12(ctx->s, ctx->s, p384_order);
  95335. if (err == MP_OKAY)
  95336. ctx->state = 2;
  95337. break;
  95338. case 2: /* NORMS1 */
  95339. sp_384_norm_12(ctx->s);
  95340. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  95341. ctx->state = 3;
  95342. break;
  95343. case 3: /* NORMS2 */
  95344. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  95345. if (err == MP_OKAY) {
  95346. ctx->state = 4;
  95347. }
  95348. break;
  95349. case 4: /* NORMS3 */
  95350. sp_384_mont_mul_order_12(ctx->u1, ctx->u1, ctx->s);
  95351. ctx->state = 5;
  95352. break;
  95353. case 5: /* NORMS4 */
  95354. sp_384_mont_mul_order_12(ctx->u2, ctx->u2, ctx->s);
  95355. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  95356. ctx->state = 6;
  95357. break;
  95358. case 6: /* MULBASE */
  95359. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p384_base, ctx->u1, 0, 0, heap);
  95360. if (err == MP_OKAY) {
  95361. if (sp_384_iszero_12(ctx->p1.z)) {
  95362. ctx->p1.infinity = 1;
  95363. }
  95364. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  95365. ctx->state = 7;
  95366. }
  95367. break;
  95368. case 7: /* MULMOD */
  95369. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  95370. if (err == MP_OKAY) {
  95371. if (sp_384_iszero_12(ctx->p2.z)) {
  95372. ctx->p2.infinity = 1;
  95373. }
  95374. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  95375. ctx->state = 8;
  95376. }
  95377. break;
  95378. case 8: /* ADD */
  95379. err = sp_384_proj_point_add_12_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  95380. if (err == MP_OKAY)
  95381. ctx->state = 9;
  95382. break;
  95383. case 9: /* MONT */
  95384. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  95385. /* Reload r and convert to Montgomery form. */
  95386. sp_384_from_mp(ctx->u2, 12, rm);
  95387. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  95388. if (err == MP_OKAY)
  95389. ctx->state = 10;
  95390. break;
  95391. case 10: /* SQR */
  95392. /* u1 = r.z'.z' mod prime */
  95393. sp_384_mont_sqr_12(ctx->p1.z, ctx->p1.z, p384_mod, p384_mp_mod);
  95394. ctx->state = 11;
  95395. break;
  95396. case 11: /* MUL */
  95397. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod, p384_mp_mod);
  95398. ctx->state = 12;
  95399. break;
  95400. case 12: /* RES */
  95401. {
  95402. sp_int32 c = 0;
  95403. err = MP_OKAY; /* math okay, now check result */
  95404. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  95405. if (*res == 0) {
  95406. sp_digit carry;
  95407. /* Reload r and add order. */
  95408. sp_384_from_mp(ctx->u2, 12, rm);
  95409. carry = sp_384_add_12(ctx->u2, ctx->u2, p384_order);
  95410. /* Carry means result is greater than mod and is not valid. */
  95411. if (carry == 0) {
  95412. sp_384_norm_12(ctx->u2);
  95413. /* Compare with mod and if greater or equal then not valid. */
  95414. c = sp_384_cmp_12(ctx->u2, p384_mod);
  95415. }
  95416. }
  95417. if ((*res == 0) && (c < 0)) {
  95418. /* Convert to Montogomery form */
  95419. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  95420. if (err == MP_OKAY) {
  95421. /* u1 = (r + 1*order).z'.z' mod prime */
  95422. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod,
  95423. p384_mp_mod);
  95424. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  95425. }
  95426. }
  95427. break;
  95428. }
  95429. } /* switch */
  95430. if (err == MP_OKAY && ctx->state != 12) {
  95431. err = FP_WOULDBLOCK;
  95432. }
  95433. return err;
  95434. }
  95435. #endif /* WOLFSSL_SP_NONBLOCK */
  95436. #endif /* HAVE_ECC_VERIFY */
  95437. #ifdef HAVE_ECC_CHECK_KEY
  95438. /* Check that the x and y ordinates are a valid point on the curve.
  95439. *
  95440. * point EC point.
  95441. * heap Heap to use if dynamically allocating.
  95442. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  95443. * not on the curve and MP_OKAY otherwise.
  95444. */
  95445. static int sp_384_ecc_is_point_12(const sp_point_384* point,
  95446. void* heap)
  95447. {
  95448. #ifdef WOLFSSL_SP_SMALL_STACK
  95449. sp_digit* t1 = NULL;
  95450. #else
  95451. sp_digit t1[12 * 4];
  95452. #endif
  95453. sp_digit* t2 = NULL;
  95454. int err = MP_OKAY;
  95455. #ifdef WOLFSSL_SP_SMALL_STACK
  95456. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12 * 4, heap, DYNAMIC_TYPE_ECC);
  95457. if (t1 == NULL)
  95458. err = MEMORY_E;
  95459. #endif
  95460. (void)heap;
  95461. if (err == MP_OKAY) {
  95462. t2 = t1 + 2 * 12;
  95463. /* y^2 - x^3 - a.x = b */
  95464. sp_384_sqr_12(t1, point->y);
  95465. (void)sp_384_mod_12(t1, t1, p384_mod);
  95466. sp_384_sqr_12(t2, point->x);
  95467. (void)sp_384_mod_12(t2, t2, p384_mod);
  95468. sp_384_mul_12(t2, t2, point->x);
  95469. (void)sp_384_mod_12(t2, t2, p384_mod);
  95470. sp_384_mont_sub_12(t1, t1, t2, p384_mod);
  95471. /* y^2 - x^3 + 3.x = b, when a = -3 */
  95472. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  95473. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  95474. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  95475. if (sp_384_cmp_12(t1, p384_b) != 0) {
  95476. err = MP_VAL;
  95477. }
  95478. }
  95479. #ifdef WOLFSSL_SP_SMALL_STACK
  95480. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  95481. #endif
  95482. return err;
  95483. }
  95484. /* Check that the x and y ordinates are a valid point on the curve.
  95485. *
  95486. * pX X ordinate of EC point.
  95487. * pY Y ordinate of EC point.
  95488. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  95489. * not on the curve and MP_OKAY otherwise.
  95490. */
  95491. int sp_ecc_is_point_384(const mp_int* pX, const mp_int* pY)
  95492. {
  95493. #ifdef WOLFSSL_SP_SMALL_STACK
  95494. sp_point_384* pub = NULL;
  95495. #else
  95496. sp_point_384 pub[1];
  95497. #endif
  95498. const byte one[1] = { 1 };
  95499. int err = MP_OKAY;
  95500. #ifdef WOLFSSL_SP_SMALL_STACK
  95501. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  95502. DYNAMIC_TYPE_ECC);
  95503. if (pub == NULL)
  95504. err = MEMORY_E;
  95505. #endif
  95506. if (err == MP_OKAY) {
  95507. sp_384_from_mp(pub->x, 12, pX);
  95508. sp_384_from_mp(pub->y, 12, pY);
  95509. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  95510. err = sp_384_ecc_is_point_12(pub, NULL);
  95511. }
  95512. #ifdef WOLFSSL_SP_SMALL_STACK
  95513. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  95514. #endif
  95515. return err;
  95516. }
  95517. /* Check that the private scalar generates the EC point (px, py), the point is
  95518. * on the curve and the point has the correct order.
  95519. *
  95520. * pX X ordinate of EC point.
  95521. * pY Y ordinate of EC point.
  95522. * privm Private scalar that generates EC point.
  95523. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  95524. * not on the curve, ECC_INF_E if the point does not have the correct order,
  95525. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  95526. * MP_OKAY otherwise.
  95527. */
  95528. int sp_ecc_check_key_384(const mp_int* pX, const mp_int* pY,
  95529. const mp_int* privm, void* heap)
  95530. {
  95531. #ifdef WOLFSSL_SP_SMALL_STACK
  95532. sp_digit* priv = NULL;
  95533. sp_point_384* pub = NULL;
  95534. #else
  95535. sp_digit priv[12];
  95536. sp_point_384 pub[2];
  95537. #endif
  95538. sp_point_384* p = NULL;
  95539. const byte one[1] = { 1 };
  95540. int err = MP_OKAY;
  95541. /* Quick check the lengs of public key ordinates and private key are in
  95542. * range. Proper check later.
  95543. */
  95544. if (((mp_count_bits(pX) > 384) ||
  95545. (mp_count_bits(pY) > 384) ||
  95546. ((privm != NULL) && (mp_count_bits(privm) > 384)))) {
  95547. err = ECC_OUT_OF_RANGE_E;
  95548. }
  95549. #ifdef WOLFSSL_SP_SMALL_STACK
  95550. if (err == MP_OKAY) {
  95551. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  95552. DYNAMIC_TYPE_ECC);
  95553. if (pub == NULL)
  95554. err = MEMORY_E;
  95555. }
  95556. if (err == MP_OKAY && privm) {
  95557. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  95558. DYNAMIC_TYPE_ECC);
  95559. if (priv == NULL)
  95560. err = MEMORY_E;
  95561. }
  95562. #endif
  95563. if (err == MP_OKAY) {
  95564. p = pub + 1;
  95565. sp_384_from_mp(pub->x, 12, pX);
  95566. sp_384_from_mp(pub->y, 12, pY);
  95567. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  95568. if (privm)
  95569. sp_384_from_mp(priv, 12, privm);
  95570. /* Check point at infinitiy. */
  95571. if ((sp_384_iszero_12(pub->x) != 0) &&
  95572. (sp_384_iszero_12(pub->y) != 0)) {
  95573. err = ECC_INF_E;
  95574. }
  95575. }
  95576. /* Check range of X and Y */
  95577. if ((err == MP_OKAY) &&
  95578. ((sp_384_cmp_12(pub->x, p384_mod) >= 0) ||
  95579. (sp_384_cmp_12(pub->y, p384_mod) >= 0))) {
  95580. err = ECC_OUT_OF_RANGE_E;
  95581. }
  95582. if (err == MP_OKAY) {
  95583. /* Check point is on curve */
  95584. err = sp_384_ecc_is_point_12(pub, heap);
  95585. }
  95586. if (err == MP_OKAY) {
  95587. /* Point * order = infinity */
  95588. err = sp_384_ecc_mulmod_12(p, pub, p384_order, 1, 1, heap);
  95589. }
  95590. /* Check result is infinity */
  95591. if ((err == MP_OKAY) && ((sp_384_iszero_12(p->x) == 0) ||
  95592. (sp_384_iszero_12(p->y) == 0))) {
  95593. err = ECC_INF_E;
  95594. }
  95595. if (privm) {
  95596. if (err == MP_OKAY) {
  95597. /* Base * private = point */
  95598. err = sp_384_ecc_mulmod_base_12(p, priv, 1, 1, heap);
  95599. }
  95600. /* Check result is public key */
  95601. if ((err == MP_OKAY) &&
  95602. ((sp_384_cmp_12(p->x, pub->x) != 0) ||
  95603. (sp_384_cmp_12(p->y, pub->y) != 0))) {
  95604. err = ECC_PRIV_KEY_E;
  95605. }
  95606. }
  95607. #ifdef WOLFSSL_SP_SMALL_STACK
  95608. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  95609. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  95610. #endif
  95611. return err;
  95612. }
  95613. #endif
  95614. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  95615. /* Add two projective EC points together.
  95616. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  95617. *
  95618. * pX First EC point's X ordinate.
  95619. * pY First EC point's Y ordinate.
  95620. * pZ First EC point's Z ordinate.
  95621. * qX Second EC point's X ordinate.
  95622. * qY Second EC point's Y ordinate.
  95623. * qZ Second EC point's Z ordinate.
  95624. * rX Resultant EC point's X ordinate.
  95625. * rY Resultant EC point's Y ordinate.
  95626. * rZ Resultant EC point's Z ordinate.
  95627. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  95628. */
  95629. int sp_ecc_proj_add_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  95630. mp_int* qX, mp_int* qY, mp_int* qZ,
  95631. mp_int* rX, mp_int* rY, mp_int* rZ)
  95632. {
  95633. #ifdef WOLFSSL_SP_SMALL_STACK
  95634. sp_digit* tmp = NULL;
  95635. sp_point_384* p = NULL;
  95636. #else
  95637. sp_digit tmp[2 * 12 * 6];
  95638. sp_point_384 p[2];
  95639. #endif
  95640. sp_point_384* q = NULL;
  95641. int err = MP_OKAY;
  95642. #ifdef WOLFSSL_SP_SMALL_STACK
  95643. if (err == MP_OKAY) {
  95644. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, NULL,
  95645. DYNAMIC_TYPE_ECC);
  95646. if (p == NULL)
  95647. err = MEMORY_E;
  95648. }
  95649. if (err == MP_OKAY) {
  95650. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  95651. DYNAMIC_TYPE_ECC);
  95652. if (tmp == NULL) {
  95653. err = MEMORY_E;
  95654. }
  95655. }
  95656. #endif
  95657. if (err == MP_OKAY) {
  95658. q = p + 1;
  95659. sp_384_from_mp(p->x, 12, pX);
  95660. sp_384_from_mp(p->y, 12, pY);
  95661. sp_384_from_mp(p->z, 12, pZ);
  95662. sp_384_from_mp(q->x, 12, qX);
  95663. sp_384_from_mp(q->y, 12, qY);
  95664. sp_384_from_mp(q->z, 12, qZ);
  95665. p->infinity = sp_384_iszero_12(p->x) &
  95666. sp_384_iszero_12(p->y);
  95667. q->infinity = sp_384_iszero_12(q->x) &
  95668. sp_384_iszero_12(q->y);
  95669. sp_384_proj_point_add_12(p, p, q, tmp);
  95670. }
  95671. if (err == MP_OKAY) {
  95672. err = sp_384_to_mp(p->x, rX);
  95673. }
  95674. if (err == MP_OKAY) {
  95675. err = sp_384_to_mp(p->y, rY);
  95676. }
  95677. if (err == MP_OKAY) {
  95678. err = sp_384_to_mp(p->z, rZ);
  95679. }
  95680. #ifdef WOLFSSL_SP_SMALL_STACK
  95681. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  95682. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  95683. #endif
  95684. return err;
  95685. }
  95686. /* Double a projective EC point.
  95687. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  95688. *
  95689. * pX EC point's X ordinate.
  95690. * pY EC point's Y ordinate.
  95691. * pZ EC point's Z ordinate.
  95692. * rX Resultant EC point's X ordinate.
  95693. * rY Resultant EC point's Y ordinate.
  95694. * rZ Resultant EC point's Z ordinate.
  95695. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  95696. */
  95697. int sp_ecc_proj_dbl_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  95698. mp_int* rX, mp_int* rY, mp_int* rZ)
  95699. {
  95700. #ifdef WOLFSSL_SP_SMALL_STACK
  95701. sp_digit* tmp = NULL;
  95702. sp_point_384* p = NULL;
  95703. #else
  95704. sp_digit tmp[2 * 12 * 2];
  95705. sp_point_384 p[1];
  95706. #endif
  95707. int err = MP_OKAY;
  95708. #ifdef WOLFSSL_SP_SMALL_STACK
  95709. if (err == MP_OKAY) {
  95710. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  95711. DYNAMIC_TYPE_ECC);
  95712. if (p == NULL)
  95713. err = MEMORY_E;
  95714. }
  95715. if (err == MP_OKAY) {
  95716. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 2, NULL,
  95717. DYNAMIC_TYPE_ECC);
  95718. if (tmp == NULL)
  95719. err = MEMORY_E;
  95720. }
  95721. #endif
  95722. if (err == MP_OKAY) {
  95723. sp_384_from_mp(p->x, 12, pX);
  95724. sp_384_from_mp(p->y, 12, pY);
  95725. sp_384_from_mp(p->z, 12, pZ);
  95726. p->infinity = sp_384_iszero_12(p->x) &
  95727. sp_384_iszero_12(p->y);
  95728. sp_384_proj_point_dbl_12(p, p, tmp);
  95729. }
  95730. if (err == MP_OKAY) {
  95731. err = sp_384_to_mp(p->x, rX);
  95732. }
  95733. if (err == MP_OKAY) {
  95734. err = sp_384_to_mp(p->y, rY);
  95735. }
  95736. if (err == MP_OKAY) {
  95737. err = sp_384_to_mp(p->z, rZ);
  95738. }
  95739. #ifdef WOLFSSL_SP_SMALL_STACK
  95740. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  95741. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  95742. #endif
  95743. return err;
  95744. }
  95745. /* Map a projective EC point to affine in place.
  95746. * pZ will be one.
  95747. *
  95748. * pX EC point's X ordinate.
  95749. * pY EC point's Y ordinate.
  95750. * pZ EC point's Z ordinate.
  95751. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  95752. */
  95753. int sp_ecc_map_384(mp_int* pX, mp_int* pY, mp_int* pZ)
  95754. {
  95755. #ifdef WOLFSSL_SP_SMALL_STACK
  95756. sp_digit* tmp = NULL;
  95757. sp_point_384* p = NULL;
  95758. #else
  95759. sp_digit tmp[2 * 12 * 6];
  95760. sp_point_384 p[1];
  95761. #endif
  95762. int err = MP_OKAY;
  95763. #ifdef WOLFSSL_SP_SMALL_STACK
  95764. if (err == MP_OKAY) {
  95765. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  95766. DYNAMIC_TYPE_ECC);
  95767. if (p == NULL)
  95768. err = MEMORY_E;
  95769. }
  95770. if (err == MP_OKAY) {
  95771. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  95772. DYNAMIC_TYPE_ECC);
  95773. if (tmp == NULL)
  95774. err = MEMORY_E;
  95775. }
  95776. #endif
  95777. if (err == MP_OKAY) {
  95778. sp_384_from_mp(p->x, 12, pX);
  95779. sp_384_from_mp(p->y, 12, pY);
  95780. sp_384_from_mp(p->z, 12, pZ);
  95781. p->infinity = sp_384_iszero_12(p->x) &
  95782. sp_384_iszero_12(p->y);
  95783. sp_384_map_12(p, p, tmp);
  95784. }
  95785. if (err == MP_OKAY) {
  95786. err = sp_384_to_mp(p->x, pX);
  95787. }
  95788. if (err == MP_OKAY) {
  95789. err = sp_384_to_mp(p->y, pY);
  95790. }
  95791. if (err == MP_OKAY) {
  95792. err = sp_384_to_mp(p->z, pZ);
  95793. }
  95794. #ifdef WOLFSSL_SP_SMALL_STACK
  95795. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  95796. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  95797. #endif
  95798. return err;
  95799. }
  95800. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  95801. #ifdef HAVE_COMP_KEY
  95802. /* Find the square root of a number mod the prime of the curve.
  95803. *
  95804. * y The number to operate on and the result.
  95805. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  95806. */
  95807. static int sp_384_mont_sqrt_12(sp_digit* y)
  95808. {
  95809. #ifdef WOLFSSL_SP_SMALL_STACK
  95810. sp_digit* t1 = NULL;
  95811. #else
  95812. sp_digit t1[5 * 2 * 12];
  95813. #endif
  95814. sp_digit* t2 = NULL;
  95815. sp_digit* t3 = NULL;
  95816. sp_digit* t4 = NULL;
  95817. sp_digit* t5 = NULL;
  95818. int err = MP_OKAY;
  95819. #ifdef WOLFSSL_SP_SMALL_STACK
  95820. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 5 * 2 * 12, NULL, DYNAMIC_TYPE_ECC);
  95821. if (t1 == NULL)
  95822. err = MEMORY_E;
  95823. #endif
  95824. if (err == MP_OKAY) {
  95825. t2 = t1 + 2 * 12;
  95826. t3 = t1 + 4 * 12;
  95827. t4 = t1 + 6 * 12;
  95828. t5 = t1 + 8 * 12;
  95829. {
  95830. /* t2 = y ^ 0x2 */
  95831. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  95832. /* t1 = y ^ 0x3 */
  95833. sp_384_mont_mul_12(t1, t2, y, p384_mod, p384_mp_mod);
  95834. /* t5 = y ^ 0xc */
  95835. sp_384_mont_sqr_n_12(t5, t1, 2, p384_mod, p384_mp_mod);
  95836. /* t1 = y ^ 0xf */
  95837. sp_384_mont_mul_12(t1, t1, t5, p384_mod, p384_mp_mod);
  95838. /* t2 = y ^ 0x1e */
  95839. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  95840. /* t3 = y ^ 0x1f */
  95841. sp_384_mont_mul_12(t3, t2, y, p384_mod, p384_mp_mod);
  95842. /* t2 = y ^ 0x3e0 */
  95843. sp_384_mont_sqr_n_12(t2, t3, 5, p384_mod, p384_mp_mod);
  95844. /* t1 = y ^ 0x3ff */
  95845. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  95846. /* t2 = y ^ 0x7fe0 */
  95847. sp_384_mont_sqr_n_12(t2, t1, 5, p384_mod, p384_mp_mod);
  95848. /* t3 = y ^ 0x7fff */
  95849. sp_384_mont_mul_12(t3, t3, t2, p384_mod, p384_mp_mod);
  95850. /* t2 = y ^ 0x3fff800 */
  95851. sp_384_mont_sqr_n_12(t2, t3, 15, p384_mod, p384_mp_mod);
  95852. /* t4 = y ^ 0x3ffffff */
  95853. sp_384_mont_mul_12(t4, t3, t2, p384_mod, p384_mp_mod);
  95854. /* t2 = y ^ 0xffffffc000000 */
  95855. sp_384_mont_sqr_n_12(t2, t4, 30, p384_mod, p384_mp_mod);
  95856. /* t1 = y ^ 0xfffffffffffff */
  95857. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  95858. /* t2 = y ^ 0xfffffffffffffff000000000000000 */
  95859. sp_384_mont_sqr_n_12(t2, t1, 60, p384_mod, p384_mp_mod);
  95860. /* t1 = y ^ 0xffffffffffffffffffffffffffffff */
  95861. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  95862. /* t2 = y ^ 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  95863. sp_384_mont_sqr_n_12(t2, t1, 120, p384_mod, p384_mp_mod);
  95864. /* t1 = y ^ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  95865. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  95866. /* t2 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  95867. sp_384_mont_sqr_n_12(t2, t1, 15, p384_mod, p384_mp_mod);
  95868. /* t1 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  95869. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  95870. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000 */
  95871. sp_384_mont_sqr_n_12(t2, t1, 31, p384_mod, p384_mp_mod);
  95872. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff */
  95873. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  95874. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff0 */
  95875. sp_384_mont_sqr_n_12(t2, t1, 4, p384_mod, p384_mp_mod);
  95876. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc */
  95877. sp_384_mont_mul_12(t1, t5, t2, p384_mod, p384_mp_mod);
  95878. /* t2 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000 */
  95879. sp_384_mont_sqr_n_12(t2, t1, 62, p384_mod, p384_mp_mod);
  95880. /* t1 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001 */
  95881. sp_384_mont_mul_12(t1, y, t2, p384_mod, p384_mp_mod);
  95882. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000040000000 */
  95883. sp_384_mont_sqr_n_12(y, t1, 30, p384_mod, p384_mp_mod);
  95884. }
  95885. }
  95886. #ifdef WOLFSSL_SP_SMALL_STACK
  95887. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  95888. #endif
  95889. return err;
  95890. }
  95891. /* Uncompress the point given the X ordinate.
  95892. *
  95893. * xm X ordinate.
  95894. * odd Whether the Y ordinate is odd.
  95895. * ym Calculated Y ordinate.
  95896. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  95897. */
  95898. int sp_ecc_uncompress_384(mp_int* xm, int odd, mp_int* ym)
  95899. {
  95900. #ifdef WOLFSSL_SP_SMALL_STACK
  95901. sp_digit* x = NULL;
  95902. #else
  95903. sp_digit x[4 * 12];
  95904. #endif
  95905. sp_digit* y = NULL;
  95906. int err = MP_OKAY;
  95907. #ifdef WOLFSSL_SP_SMALL_STACK
  95908. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 12, NULL, DYNAMIC_TYPE_ECC);
  95909. if (x == NULL)
  95910. err = MEMORY_E;
  95911. #endif
  95912. if (err == MP_OKAY) {
  95913. y = x + 2 * 12;
  95914. sp_384_from_mp(x, 12, xm);
  95915. err = sp_384_mod_mul_norm_12(x, x, p384_mod);
  95916. }
  95917. if (err == MP_OKAY) {
  95918. /* y = x^3 */
  95919. {
  95920. sp_384_mont_sqr_12(y, x, p384_mod, p384_mp_mod);
  95921. sp_384_mont_mul_12(y, y, x, p384_mod, p384_mp_mod);
  95922. }
  95923. /* y = x^3 - 3x */
  95924. sp_384_mont_sub_12(y, y, x, p384_mod);
  95925. sp_384_mont_sub_12(y, y, x, p384_mod);
  95926. sp_384_mont_sub_12(y, y, x, p384_mod);
  95927. /* y = x^3 - 3x + b */
  95928. err = sp_384_mod_mul_norm_12(x, p384_b, p384_mod);
  95929. }
  95930. if (err == MP_OKAY) {
  95931. sp_384_mont_add_12(y, y, x, p384_mod);
  95932. /* y = sqrt(x^3 - 3x + b) */
  95933. err = sp_384_mont_sqrt_12(y);
  95934. }
  95935. if (err == MP_OKAY) {
  95936. XMEMSET(y + 12, 0, 12U * sizeof(sp_digit));
  95937. sp_384_mont_reduce_12(y, p384_mod, p384_mp_mod);
  95938. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  95939. sp_384_mont_sub_12(y, p384_mod, y, p384_mod);
  95940. }
  95941. err = sp_384_to_mp(y, ym);
  95942. }
  95943. #ifdef WOLFSSL_SP_SMALL_STACK
  95944. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  95945. #endif
  95946. return err;
  95947. }
  95948. #endif
  95949. #endif /* WOLFSSL_SP_384 */
  95950. #ifdef WOLFSSL_SP_521
  95951. /* Point structure to use. */
  95952. typedef struct sp_point_521 {
  95953. /* X ordinate of point. */
  95954. sp_digit x[2 * 17];
  95955. /* Y ordinate of point. */
  95956. sp_digit y[2 * 17];
  95957. /* Z ordinate of point. */
  95958. sp_digit z[2 * 17];
  95959. /* Indicates point is at infinity. */
  95960. int infinity;
  95961. } sp_point_521;
  95962. /* The modulus (prime) of the curve P521. */
  95963. static const sp_digit p521_mod[17] = {
  95964. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  95965. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  95966. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  95967. };
  95968. /* The Montgomery normalizer for modulus of the curve P521. */
  95969. static const sp_digit p521_norm_mod[17] = {
  95970. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  95971. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  95972. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  95973. };
  95974. /* The Montgomery multiplier for modulus of the curve P521. */
  95975. static sp_digit p521_mp_mod = 0x00000001;
  95976. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  95977. defined(HAVE_ECC_VERIFY)
  95978. /* The order of the curve P521. */
  95979. static const sp_digit p521_order[17] = {
  95980. 0x91386409,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  95981. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  95982. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  95983. };
  95984. #endif
  95985. /* The order of the curve P521 minus 2. */
  95986. static const sp_digit p521_order2[17] = {
  95987. 0x91386407,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  95988. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  95989. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  95990. };
  95991. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  95992. /* The Montgomery normalizer for order of the curve P521. */
  95993. static const sp_digit p521_norm_order[17] = {
  95994. 0x6ec79bf7,0x449048e1,0x7663b851,0xc44a3647,0x08f65a2f,0x8033feb7,
  95995. 0x40d06994,0xae79787c,0x00000005,0x00000000,0x00000000,0x00000000,
  95996. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  95997. };
  95998. #endif
  95999. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  96000. /* The Montgomery multiplier for order of the curve P521. */
  96001. static sp_digit p521_mp_order = 0x79a995c7;
  96002. #endif
  96003. /* The base point of curve P521. */
  96004. static const sp_point_521 p521_base = {
  96005. /* X ordinate */
  96006. {
  96007. 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  96008. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  96009. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6,
  96010. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96011. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96012. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96013. (sp_digit)0, (sp_digit)0
  96014. },
  96015. /* Y ordinate */
  96016. {
  96017. 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  96018. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  96019. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118,
  96020. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96021. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96022. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96023. (sp_digit)0, (sp_digit)0
  96024. },
  96025. /* Z ordinate */
  96026. {
  96027. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  96028. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  96029. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  96030. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96031. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96032. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96033. (sp_digit)0, (sp_digit)0
  96034. },
  96035. /* infinity */
  96036. 0
  96037. };
  96038. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  96039. static const sp_digit p521_b[17] = {
  96040. 0x6b503f00,0xef451fd4,0x3d2c34f1,0x3573df88,0x3bb1bf07,0x1652c0bd,
  96041. 0xec7e937b,0x56193951,0x8ef109e1,0xb8b48991,0x99b315f3,0xa2da725b,
  96042. 0xb68540ee,0x929a21a0,0x8e1c9a1f,0x953eb961,0x00000051
  96043. };
  96044. #endif
  96045. #ifdef WOLFSSL_SP_SMALL
  96046. /* Multiply a and b into r. (r = a * b)
  96047. *
  96048. * r A single precision integer.
  96049. * a A single precision integer.
  96050. * b A single precision integer.
  96051. */
  96052. static void sp_521_mul_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  96053. {
  96054. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  96055. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  96056. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  96057. __asm__ __volatile__ (
  96058. "sub sp, sp, #0x88\n\t"
  96059. "ldr lr, [%[a]]\n\t"
  96060. "ldr r11, [%[b]]\n\t"
  96061. "umull r8, r6, lr, r11\n\t"
  96062. "str r8, [sp]\n\t"
  96063. "mov r7, #0\n\t"
  96064. "mov r8, #0\n\t"
  96065. "mov r5, #4\n\t"
  96066. "\n"
  96067. "L_sp_521_mul_17_outer_%=: \n\t"
  96068. "subs r3, r5, #0x40\n\t"
  96069. "it cc\n\t"
  96070. "movcc r3, #0\n\t"
  96071. "sub r4, r5, r3\n\t"
  96072. "\n"
  96073. "L_sp_521_mul_17_inner_%=: \n\t"
  96074. "ldr lr, [%[a], r3]\n\t"
  96075. "ldr r11, [%[b], r4]\n\t"
  96076. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96077. "lsl r9, lr, #16\n\t"
  96078. "lsl r10, r11, #16\n\t"
  96079. "lsr r9, r9, #16\n\t"
  96080. "lsr r10, r10, #16\n\t"
  96081. "mul r10, r9, r10\n\t"
  96082. "adds r6, r6, r10\n\t"
  96083. "adcs r7, r7, #0\n\t"
  96084. "adc r8, r8, #0\n\t"
  96085. "lsr r10, r11, #16\n\t"
  96086. "mul r9, r10, r9\n\t"
  96087. "lsr r10, r9, #16\n\t"
  96088. "lsl r9, r9, #16\n\t"
  96089. "adds r6, r6, r9\n\t"
  96090. "adcs r7, r7, r10\n\t"
  96091. "adc r8, r8, #0\n\t"
  96092. "lsr r9, lr, #16\n\t"
  96093. "lsr r10, r11, #16\n\t"
  96094. "mul r10, r9, r10\n\t"
  96095. "adds r7, r7, r10\n\t"
  96096. "adc r8, r8, #0\n\t"
  96097. "lsl r10, r11, #16\n\t"
  96098. "lsr r10, r10, #16\n\t"
  96099. "mul r9, r10, r9\n\t"
  96100. "lsr r10, r9, #16\n\t"
  96101. "lsl r9, r9, #16\n\t"
  96102. "adds r6, r6, r9\n\t"
  96103. "adcs r7, r7, r10\n\t"
  96104. "adc r8, r8, #0\n\t"
  96105. #else
  96106. "umull r9, r10, lr, r11\n\t"
  96107. "adds r6, r6, r9\n\t"
  96108. "adcs r7, r7, r10\n\t"
  96109. "adc r8, r8, #0\n\t"
  96110. #endif
  96111. "ldr lr, [%[a], r4]\n\t"
  96112. "ldr r11, [%[b], r3]\n\t"
  96113. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96114. "lsl r9, lr, #16\n\t"
  96115. "lsl r10, r11, #16\n\t"
  96116. "lsr r9, r9, #16\n\t"
  96117. "lsr r10, r10, #16\n\t"
  96118. "mul r10, r9, r10\n\t"
  96119. "adds r6, r6, r10\n\t"
  96120. "adcs r7, r7, #0\n\t"
  96121. "adc r8, r8, #0\n\t"
  96122. "lsr r10, r11, #16\n\t"
  96123. "mul r9, r10, r9\n\t"
  96124. "lsr r10, r9, #16\n\t"
  96125. "lsl r9, r9, #16\n\t"
  96126. "adds r6, r6, r9\n\t"
  96127. "adcs r7, r7, r10\n\t"
  96128. "adc r8, r8, #0\n\t"
  96129. "lsr r9, lr, #16\n\t"
  96130. "lsr r10, r11, #16\n\t"
  96131. "mul r10, r9, r10\n\t"
  96132. "adds r7, r7, r10\n\t"
  96133. "adc r8, r8, #0\n\t"
  96134. "lsl r10, r11, #16\n\t"
  96135. "lsr r10, r10, #16\n\t"
  96136. "mul r9, r10, r9\n\t"
  96137. "lsr r10, r9, #16\n\t"
  96138. "lsl r9, r9, #16\n\t"
  96139. "adds r6, r6, r9\n\t"
  96140. "adcs r7, r7, r10\n\t"
  96141. "adc r8, r8, #0\n\t"
  96142. #else
  96143. "umull r9, r10, lr, r11\n\t"
  96144. "adds r6, r6, r9\n\t"
  96145. "adcs r7, r7, r10\n\t"
  96146. "adc r8, r8, #0\n\t"
  96147. #endif
  96148. "add r3, r3, #4\n\t"
  96149. "sub r4, r4, #4\n\t"
  96150. "cmp r3, r4\n\t"
  96151. "bgt L_sp_521_mul_17_inner_done_%=\n\t"
  96152. "blt L_sp_521_mul_17_inner_%=\n\t"
  96153. "ldr lr, [%[a], r3]\n\t"
  96154. "ldr r11, [%[b], r3]\n\t"
  96155. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96156. "lsl r9, lr, #16\n\t"
  96157. "lsl r10, r11, #16\n\t"
  96158. "lsr r9, r9, #16\n\t"
  96159. "lsr r10, r10, #16\n\t"
  96160. "mul r10, r9, r10\n\t"
  96161. "adds r6, r6, r10\n\t"
  96162. "adcs r7, r7, #0\n\t"
  96163. "adc r8, r8, #0\n\t"
  96164. "lsr r10, r11, #16\n\t"
  96165. "mul r9, r10, r9\n\t"
  96166. "lsr r10, r9, #16\n\t"
  96167. "lsl r9, r9, #16\n\t"
  96168. "adds r6, r6, r9\n\t"
  96169. "adcs r7, r7, r10\n\t"
  96170. "adc r8, r8, #0\n\t"
  96171. "lsr r9, lr, #16\n\t"
  96172. "lsr r10, r11, #16\n\t"
  96173. "mul r10, r9, r10\n\t"
  96174. "adds r7, r7, r10\n\t"
  96175. "adc r8, r8, #0\n\t"
  96176. "lsl r10, r11, #16\n\t"
  96177. "lsr r10, r10, #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. #else
  96185. "umull r9, r10, lr, r11\n\t"
  96186. "adds r6, r6, r9\n\t"
  96187. "adcs r7, r7, r10\n\t"
  96188. "adc r8, r8, #0\n\t"
  96189. #endif
  96190. "\n"
  96191. "L_sp_521_mul_17_inner_done_%=: \n\t"
  96192. "str r6, [sp, r5]\n\t"
  96193. "mov r6, r7\n\t"
  96194. "mov r7, r8\n\t"
  96195. "mov r8, #0\n\t"
  96196. "add r5, r5, #4\n\t"
  96197. "cmp r5, #0x7c\n\t"
  96198. "ble L_sp_521_mul_17_outer_%=\n\t"
  96199. "ldr lr, [%[a], #64]\n\t"
  96200. "ldr r11, [%[b], #64]\n\t"
  96201. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96202. "lsl r9, lr, #16\n\t"
  96203. "lsl r10, r11, #16\n\t"
  96204. "lsr r9, r9, #16\n\t"
  96205. "lsr r10, r10, #16\n\t"
  96206. "mul r10, r9, r10\n\t"
  96207. "adds r6, r6, r10\n\t"
  96208. "adc r7, r7, #0\n\t"
  96209. "lsr r10, r11, #16\n\t"
  96210. "mul r9, r10, r9\n\t"
  96211. "lsr r10, r9, #16\n\t"
  96212. "lsl r9, r9, #16\n\t"
  96213. "adds r6, r6, r9\n\t"
  96214. "adc r7, r7, r10\n\t"
  96215. "lsr r9, lr, #16\n\t"
  96216. "lsr r10, r11, #16\n\t"
  96217. "mul r10, r9, r10\n\t"
  96218. "add r7, r7, r10\n\t"
  96219. "lsl r10, r11, #16\n\t"
  96220. "lsr r10, r10, #16\n\t"
  96221. "mul r9, r10, r9\n\t"
  96222. "lsr r10, r9, #16\n\t"
  96223. "lsl r9, r9, #16\n\t"
  96224. "adds r6, r6, r9\n\t"
  96225. "adc r7, r7, r10\n\t"
  96226. #else
  96227. "umlal r6, r7, lr, r11\n\t"
  96228. #endif
  96229. "str r6, [sp, r5]\n\t"
  96230. "add r5, r5, #4\n\t"
  96231. "str r7, [sp, r5]\n\t"
  96232. "ldm sp!, {r6, r7}\n\t"
  96233. "stm %[r]!, {r6, r7}\n\t"
  96234. "sub r5, r5, #8\n\t"
  96235. "\n"
  96236. "L_sp_521_mul_17_store_%=: \n\t"
  96237. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  96238. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  96239. "subs r5, r5, #32\n\t"
  96240. "bgt L_sp_521_mul_17_store_%=\n\t"
  96241. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  96242. :
  96243. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  96244. );
  96245. }
  96246. #else
  96247. /* Multiply a and b into r. (r = a * b)
  96248. *
  96249. * r A single precision integer.
  96250. * a A single precision integer.
  96251. * b A single precision integer.
  96252. */
  96253. static void sp_521_mul_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  96254. {
  96255. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  96256. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  96257. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  96258. __asm__ __volatile__ (
  96259. "sub sp, sp, #0x44\n\t"
  96260. /* A[0] * B[0] */
  96261. "ldr r11, [%[a]]\n\t"
  96262. "ldr r12, [%[b]]\n\t"
  96263. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96264. "lsl r6, r11, #16\n\t"
  96265. "lsl r3, r12, #16\n\t"
  96266. "lsr r6, r6, #16\n\t"
  96267. "lsr r3, r3, #16\n\t"
  96268. "mul r3, r6, r3\n\t"
  96269. "lsr r7, r12, #16\n\t"
  96270. "mul r6, r7, r6\n\t"
  96271. "lsr r4, r6, #16\n\t"
  96272. "lsl r6, r6, #16\n\t"
  96273. "adds r3, r3, r6\n\t"
  96274. "adc r4, r4, #0\n\t"
  96275. "lsr r6, r11, #16\n\t"
  96276. "mul r7, r6, r7\n\t"
  96277. "add r4, r4, r7\n\t"
  96278. "lsl r7, r12, #16\n\t"
  96279. "lsr r7, r7, #16\n\t"
  96280. "mul r6, r7, r6\n\t"
  96281. "lsr r7, r6, #16\n\t"
  96282. "lsl r6, r6, #16\n\t"
  96283. "adds r3, r3, r6\n\t"
  96284. "adc r4, r4, r7\n\t"
  96285. "mov r5, #0\n\t"
  96286. #else
  96287. "umull r3, r4, r11, r12\n\t"
  96288. "mov r5, #0\n\t"
  96289. #endif
  96290. "str r3, [sp]\n\t"
  96291. /* A[0] * B[1] */
  96292. "ldr r9, [%[b], #4]\n\t"
  96293. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96294. "lsl r6, r11, #16\n\t"
  96295. "lsl r7, r9, #16\n\t"
  96296. "lsr r6, r6, #16\n\t"
  96297. "lsr r7, r7, #16\n\t"
  96298. "mul r7, r6, r7\n\t"
  96299. "adds r4, r4, r7\n\t"
  96300. "adcs r5, r5, #0\n\t"
  96301. "mov r3, #0\n\t"
  96302. "adc r3, r3, #0\n\t"
  96303. "lsr r7, r9, #16\n\t"
  96304. "mul r6, r7, r6\n\t"
  96305. "lsr r7, r6, #16\n\t"
  96306. "lsl r6, r6, #16\n\t"
  96307. "adds r4, r4, r6\n\t"
  96308. "adcs r5, r5, r7\n\t"
  96309. "adc r3, r3, #0\n\t"
  96310. "lsr r6, r11, #16\n\t"
  96311. "lsr r7, r9, #16\n\t"
  96312. "mul r7, r6, r7\n\t"
  96313. "adds r5, r5, r7\n\t"
  96314. "adc r3, r3, #0\n\t"
  96315. "lsl r7, r9, #16\n\t"
  96316. "lsr r7, r7, #16\n\t"
  96317. "mul r6, r7, r6\n\t"
  96318. "lsr r7, r6, #16\n\t"
  96319. "lsl r6, r6, #16\n\t"
  96320. "adds r4, r4, r6\n\t"
  96321. "adcs r5, r5, r7\n\t"
  96322. "adc r3, r3, #0\n\t"
  96323. #else
  96324. "umull r6, r7, r11, r9\n\t"
  96325. "adds r4, r4, r6\n\t"
  96326. "adcs r5, r5, r7\n\t"
  96327. "mov r3, #0\n\t"
  96328. "adc r3, r3, #0\n\t"
  96329. #endif
  96330. /* A[1] * B[0] */
  96331. "ldr r8, [%[a], #4]\n\t"
  96332. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96333. "lsl r6, r8, #16\n\t"
  96334. "lsl r7, r12, #16\n\t"
  96335. "lsr r6, r6, #16\n\t"
  96336. "lsr r7, r7, #16\n\t"
  96337. "mul r7, r6, r7\n\t"
  96338. "adds r4, r4, r7\n\t"
  96339. "adcs r5, r5, #0\n\t"
  96340. "adc r3, r3, #0\n\t"
  96341. "lsr r7, r12, #16\n\t"
  96342. "mul r6, r7, r6\n\t"
  96343. "lsr r7, r6, #16\n\t"
  96344. "lsl r6, r6, #16\n\t"
  96345. "adds r4, r4, r6\n\t"
  96346. "adcs r5, r5, r7\n\t"
  96347. "adc r3, r3, #0\n\t"
  96348. "lsr r6, r8, #16\n\t"
  96349. "lsr r7, r12, #16\n\t"
  96350. "mul r7, r6, r7\n\t"
  96351. "adds r5, r5, r7\n\t"
  96352. "adc r3, r3, #0\n\t"
  96353. "lsl r7, r12, #16\n\t"
  96354. "lsr r7, r7, #16\n\t"
  96355. "mul r6, r7, r6\n\t"
  96356. "lsr r7, r6, #16\n\t"
  96357. "lsl r6, r6, #16\n\t"
  96358. "adds r4, r4, r6\n\t"
  96359. "adcs r5, r5, r7\n\t"
  96360. "adc r3, r3, #0\n\t"
  96361. #else
  96362. "umull r6, r7, r8, r12\n\t"
  96363. "adds r4, r4, r6\n\t"
  96364. "adcs r5, r5, r7\n\t"
  96365. "adc r3, r3, #0\n\t"
  96366. #endif
  96367. "str r4, [sp, #4]\n\t"
  96368. /* A[2] * B[0] */
  96369. "ldr r8, [%[a], #8]\n\t"
  96370. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96371. "lsl r6, r8, #16\n\t"
  96372. "lsl r7, r12, #16\n\t"
  96373. "lsr r6, r6, #16\n\t"
  96374. "lsr r7, r7, #16\n\t"
  96375. "mul r7, r6, r7\n\t"
  96376. "adds r5, r5, r7\n\t"
  96377. "adcs r3, r3, #0\n\t"
  96378. "mov r4, #0\n\t"
  96379. "adc r4, r4, #0\n\t"
  96380. "lsr r7, r12, #16\n\t"
  96381. "mul r6, r7, r6\n\t"
  96382. "lsr r7, r6, #16\n\t"
  96383. "lsl r6, r6, #16\n\t"
  96384. "adds r5, r5, r6\n\t"
  96385. "adcs r3, r3, r7\n\t"
  96386. "adc r4, r4, #0\n\t"
  96387. "lsr r6, r8, #16\n\t"
  96388. "lsr r7, r12, #16\n\t"
  96389. "mul r7, r6, r7\n\t"
  96390. "adds r3, r3, r7\n\t"
  96391. "adc r4, r4, #0\n\t"
  96392. "lsl r7, r12, #16\n\t"
  96393. "lsr r7, r7, #16\n\t"
  96394. "mul r6, r7, r6\n\t"
  96395. "lsr r7, r6, #16\n\t"
  96396. "lsl r6, r6, #16\n\t"
  96397. "adds r5, r5, r6\n\t"
  96398. "adcs r3, r3, r7\n\t"
  96399. "adc r4, r4, #0\n\t"
  96400. #else
  96401. "umull r6, r7, r8, r12\n\t"
  96402. "adds r5, r5, r6\n\t"
  96403. "adcs r3, r3, r7\n\t"
  96404. "mov r4, #0\n\t"
  96405. "adc r4, r4, #0\n\t"
  96406. #endif
  96407. /* A[1] * B[1] */
  96408. "ldr r11, [%[a], #4]\n\t"
  96409. "ldr r12, [%[b], #4]\n\t"
  96410. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96411. "lsl r6, r11, #16\n\t"
  96412. "lsl r7, r12, #16\n\t"
  96413. "lsr r6, r6, #16\n\t"
  96414. "lsr r7, r7, #16\n\t"
  96415. "mul r7, r6, r7\n\t"
  96416. "adds r5, r5, r7\n\t"
  96417. "adcs r3, r3, #0\n\t"
  96418. "adc r4, r4, #0\n\t"
  96419. "lsr r7, r12, #16\n\t"
  96420. "mul r6, r7, r6\n\t"
  96421. "lsr r7, r6, #16\n\t"
  96422. "lsl r6, r6, #16\n\t"
  96423. "adds r5, r5, r6\n\t"
  96424. "adcs r3, r3, r7\n\t"
  96425. "adc r4, r4, #0\n\t"
  96426. "lsr r6, r11, #16\n\t"
  96427. "lsr r7, r12, #16\n\t"
  96428. "mul r7, r6, r7\n\t"
  96429. "adds r3, r3, r7\n\t"
  96430. "adc r4, r4, #0\n\t"
  96431. "lsl r7, r12, #16\n\t"
  96432. "lsr r7, r7, #16\n\t"
  96433. "mul r6, r7, r6\n\t"
  96434. "lsr r7, r6, #16\n\t"
  96435. "lsl r6, r6, #16\n\t"
  96436. "adds r5, r5, r6\n\t"
  96437. "adcs r3, r3, r7\n\t"
  96438. "adc r4, r4, #0\n\t"
  96439. #else
  96440. "umull r6, r7, r11, r12\n\t"
  96441. "adds r5, r5, r6\n\t"
  96442. "adcs r3, r3, r7\n\t"
  96443. "adc r4, r4, #0\n\t"
  96444. #endif
  96445. /* A[0] * B[2] */
  96446. "ldr r8, [%[a]]\n\t"
  96447. "ldr r9, [%[b], #8]\n\t"
  96448. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96449. "lsl r6, r8, #16\n\t"
  96450. "lsl r7, r9, #16\n\t"
  96451. "lsr r6, r6, #16\n\t"
  96452. "lsr r7, r7, #16\n\t"
  96453. "mul r7, r6, r7\n\t"
  96454. "adds r5, r5, r7\n\t"
  96455. "adcs r3, r3, #0\n\t"
  96456. "adc r4, r4, #0\n\t"
  96457. "lsr r7, r9, #16\n\t"
  96458. "mul r6, r7, r6\n\t"
  96459. "lsr r7, r6, #16\n\t"
  96460. "lsl r6, r6, #16\n\t"
  96461. "adds r5, r5, r6\n\t"
  96462. "adcs r3, r3, r7\n\t"
  96463. "adc r4, r4, #0\n\t"
  96464. "lsr r6, r8, #16\n\t"
  96465. "lsr r7, r9, #16\n\t"
  96466. "mul r7, r6, r7\n\t"
  96467. "adds r3, r3, r7\n\t"
  96468. "adc r4, r4, #0\n\t"
  96469. "lsl r7, r9, #16\n\t"
  96470. "lsr r7, r7, #16\n\t"
  96471. "mul r6, r7, r6\n\t"
  96472. "lsr r7, r6, #16\n\t"
  96473. "lsl r6, r6, #16\n\t"
  96474. "adds r5, r5, r6\n\t"
  96475. "adcs r3, r3, r7\n\t"
  96476. "adc r4, r4, #0\n\t"
  96477. #else
  96478. "umull r6, r7, r8, r9\n\t"
  96479. "adds r5, r5, r6\n\t"
  96480. "adcs r3, r3, r7\n\t"
  96481. "adc r4, r4, #0\n\t"
  96482. #endif
  96483. "str r5, [sp, #8]\n\t"
  96484. /* A[0] * B[3] */
  96485. "ldr r9, [%[b], #12]\n\t"
  96486. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96487. "lsl r6, r8, #16\n\t"
  96488. "lsl r7, r9, #16\n\t"
  96489. "lsr r6, r6, #16\n\t"
  96490. "lsr r7, r7, #16\n\t"
  96491. "mul r7, r6, r7\n\t"
  96492. "adds r3, r3, r7\n\t"
  96493. "adcs r4, r4, #0\n\t"
  96494. "mov r5, #0\n\t"
  96495. "adc r5, r5, #0\n\t"
  96496. "lsr r7, r9, #16\n\t"
  96497. "mul r6, r7, r6\n\t"
  96498. "lsr r7, r6, #16\n\t"
  96499. "lsl r6, r6, #16\n\t"
  96500. "adds r3, r3, r6\n\t"
  96501. "adcs r4, r4, r7\n\t"
  96502. "adc r5, r5, #0\n\t"
  96503. "lsr r6, r8, #16\n\t"
  96504. "lsr r7, r9, #16\n\t"
  96505. "mul r7, r6, r7\n\t"
  96506. "adds r4, r4, r7\n\t"
  96507. "adc r5, r5, #0\n\t"
  96508. "lsl r7, r9, #16\n\t"
  96509. "lsr r7, r7, #16\n\t"
  96510. "mul r6, r7, r6\n\t"
  96511. "lsr r7, r6, #16\n\t"
  96512. "lsl r6, r6, #16\n\t"
  96513. "adds r3, r3, r6\n\t"
  96514. "adcs r4, r4, r7\n\t"
  96515. "adc r5, r5, #0\n\t"
  96516. #else
  96517. "umull r6, r7, r8, r9\n\t"
  96518. "adds r3, r3, r6\n\t"
  96519. "adcs r4, r4, r7\n\t"
  96520. "mov r5, #0\n\t"
  96521. "adc r5, r5, #0\n\t"
  96522. #endif
  96523. /* A[1] * B[2] */
  96524. "ldr r9, [%[b], #8]\n\t"
  96525. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96526. "lsl r6, r11, #16\n\t"
  96527. "lsl r7, r9, #16\n\t"
  96528. "lsr r6, r6, #16\n\t"
  96529. "lsr r7, r7, #16\n\t"
  96530. "mul r7, r6, r7\n\t"
  96531. "adds r3, r3, r7\n\t"
  96532. "adcs r4, r4, #0\n\t"
  96533. "adc r5, r5, #0\n\t"
  96534. "lsr r7, r9, #16\n\t"
  96535. "mul r6, r7, r6\n\t"
  96536. "lsr r7, r6, #16\n\t"
  96537. "lsl r6, r6, #16\n\t"
  96538. "adds r3, r3, r6\n\t"
  96539. "adcs r4, r4, r7\n\t"
  96540. "adc r5, r5, #0\n\t"
  96541. "lsr r6, r11, #16\n\t"
  96542. "lsr r7, r9, #16\n\t"
  96543. "mul r7, r6, r7\n\t"
  96544. "adds r4, r4, r7\n\t"
  96545. "adc r5, r5, #0\n\t"
  96546. "lsl r7, r9, #16\n\t"
  96547. "lsr r7, r7, #16\n\t"
  96548. "mul r6, r7, r6\n\t"
  96549. "lsr r7, r6, #16\n\t"
  96550. "lsl r6, r6, #16\n\t"
  96551. "adds r3, r3, r6\n\t"
  96552. "adcs r4, r4, r7\n\t"
  96553. "adc r5, r5, #0\n\t"
  96554. #else
  96555. "umull r6, r7, r11, r9\n\t"
  96556. "adds r3, r3, r6\n\t"
  96557. "adcs r4, r4, r7\n\t"
  96558. "adc r5, r5, #0\n\t"
  96559. #endif
  96560. /* A[2] * B[1] */
  96561. "ldr r8, [%[a], #8]\n\t"
  96562. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96563. "lsl r6, r8, #16\n\t"
  96564. "lsl r7, r12, #16\n\t"
  96565. "lsr r6, r6, #16\n\t"
  96566. "lsr r7, r7, #16\n\t"
  96567. "mul r7, r6, r7\n\t"
  96568. "adds r3, r3, r7\n\t"
  96569. "adcs r4, r4, #0\n\t"
  96570. "adc r5, r5, #0\n\t"
  96571. "lsr r7, r12, #16\n\t"
  96572. "mul r6, r7, r6\n\t"
  96573. "lsr r7, r6, #16\n\t"
  96574. "lsl r6, r6, #16\n\t"
  96575. "adds r3, r3, r6\n\t"
  96576. "adcs r4, r4, r7\n\t"
  96577. "adc r5, r5, #0\n\t"
  96578. "lsr r6, r8, #16\n\t"
  96579. "lsr r7, r12, #16\n\t"
  96580. "mul r7, r6, r7\n\t"
  96581. "adds r4, r4, r7\n\t"
  96582. "adc r5, r5, #0\n\t"
  96583. "lsl r7, r12, #16\n\t"
  96584. "lsr r7, r7, #16\n\t"
  96585. "mul r6, r7, r6\n\t"
  96586. "lsr r7, r6, #16\n\t"
  96587. "lsl r6, r6, #16\n\t"
  96588. "adds r3, r3, r6\n\t"
  96589. "adcs r4, r4, r7\n\t"
  96590. "adc r5, r5, #0\n\t"
  96591. #else
  96592. "umull r6, r7, r8, r12\n\t"
  96593. "adds r3, r3, r6\n\t"
  96594. "adcs r4, r4, r7\n\t"
  96595. "adc r5, r5, #0\n\t"
  96596. #endif
  96597. /* A[3] * B[0] */
  96598. "ldr r8, [%[a], #12]\n\t"
  96599. "ldr r9, [%[b]]\n\t"
  96600. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96601. "lsl r6, r8, #16\n\t"
  96602. "lsl r7, r9, #16\n\t"
  96603. "lsr r6, r6, #16\n\t"
  96604. "lsr r7, r7, #16\n\t"
  96605. "mul r7, r6, r7\n\t"
  96606. "adds r3, r3, r7\n\t"
  96607. "adcs r4, r4, #0\n\t"
  96608. "adc r5, r5, #0\n\t"
  96609. "lsr r7, r9, #16\n\t"
  96610. "mul r6, r7, r6\n\t"
  96611. "lsr r7, r6, #16\n\t"
  96612. "lsl r6, r6, #16\n\t"
  96613. "adds r3, r3, r6\n\t"
  96614. "adcs r4, r4, r7\n\t"
  96615. "adc r5, r5, #0\n\t"
  96616. "lsr r6, r8, #16\n\t"
  96617. "lsr r7, r9, #16\n\t"
  96618. "mul r7, r6, r7\n\t"
  96619. "adds r4, r4, r7\n\t"
  96620. "adc r5, r5, #0\n\t"
  96621. "lsl r7, r9, #16\n\t"
  96622. "lsr r7, r7, #16\n\t"
  96623. "mul r6, r7, r6\n\t"
  96624. "lsr r7, r6, #16\n\t"
  96625. "lsl r6, r6, #16\n\t"
  96626. "adds r3, r3, r6\n\t"
  96627. "adcs r4, r4, r7\n\t"
  96628. "adc r5, r5, #0\n\t"
  96629. #else
  96630. "umull r6, r7, r8, r9\n\t"
  96631. "adds r3, r3, r6\n\t"
  96632. "adcs r4, r4, r7\n\t"
  96633. "adc r5, r5, #0\n\t"
  96634. #endif
  96635. "str r3, [sp, #12]\n\t"
  96636. /* A[4] * B[0] */
  96637. "ldr r8, [%[a], #16]\n\t"
  96638. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96639. "lsl r6, r8, #16\n\t"
  96640. "lsl r7, r9, #16\n\t"
  96641. "lsr r6, r6, #16\n\t"
  96642. "lsr r7, r7, #16\n\t"
  96643. "mul r7, r6, r7\n\t"
  96644. "adds r4, r4, r7\n\t"
  96645. "adcs r5, r5, #0\n\t"
  96646. "mov r3, #0\n\t"
  96647. "adc r3, r3, #0\n\t"
  96648. "lsr r7, r9, #16\n\t"
  96649. "mul r6, r7, r6\n\t"
  96650. "lsr r7, r6, #16\n\t"
  96651. "lsl r6, r6, #16\n\t"
  96652. "adds r4, r4, r6\n\t"
  96653. "adcs r5, r5, r7\n\t"
  96654. "adc r3, r3, #0\n\t"
  96655. "lsr r6, r8, #16\n\t"
  96656. "lsr r7, r9, #16\n\t"
  96657. "mul r7, r6, r7\n\t"
  96658. "adds r5, r5, r7\n\t"
  96659. "adc r3, r3, #0\n\t"
  96660. "lsl r7, r9, #16\n\t"
  96661. "lsr r7, r7, #16\n\t"
  96662. "mul r6, r7, r6\n\t"
  96663. "lsr r7, r6, #16\n\t"
  96664. "lsl r6, r6, #16\n\t"
  96665. "adds r4, r4, r6\n\t"
  96666. "adcs r5, r5, r7\n\t"
  96667. "adc r3, r3, #0\n\t"
  96668. #else
  96669. "umull r6, r7, r8, r9\n\t"
  96670. "adds r4, r4, r6\n\t"
  96671. "adcs r5, r5, r7\n\t"
  96672. "mov r3, #0\n\t"
  96673. "adc r3, r3, #0\n\t"
  96674. #endif
  96675. /* A[3] * B[1] */
  96676. "ldr r8, [%[a], #12]\n\t"
  96677. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96678. "lsl r6, r8, #16\n\t"
  96679. "lsl r7, r12, #16\n\t"
  96680. "lsr r6, r6, #16\n\t"
  96681. "lsr r7, r7, #16\n\t"
  96682. "mul r7, r6, r7\n\t"
  96683. "adds r4, r4, r7\n\t"
  96684. "adcs r5, r5, #0\n\t"
  96685. "adc r3, r3, #0\n\t"
  96686. "lsr r7, r12, #16\n\t"
  96687. "mul r6, r7, r6\n\t"
  96688. "lsr r7, r6, #16\n\t"
  96689. "lsl r6, r6, #16\n\t"
  96690. "adds r4, r4, r6\n\t"
  96691. "adcs r5, r5, r7\n\t"
  96692. "adc r3, r3, #0\n\t"
  96693. "lsr r6, r8, #16\n\t"
  96694. "lsr r7, r12, #16\n\t"
  96695. "mul r7, r6, r7\n\t"
  96696. "adds r5, r5, r7\n\t"
  96697. "adc r3, r3, #0\n\t"
  96698. "lsl r7, r12, #16\n\t"
  96699. "lsr r7, r7, #16\n\t"
  96700. "mul r6, r7, r6\n\t"
  96701. "lsr r7, r6, #16\n\t"
  96702. "lsl r6, r6, #16\n\t"
  96703. "adds r4, r4, r6\n\t"
  96704. "adcs r5, r5, r7\n\t"
  96705. "adc r3, r3, #0\n\t"
  96706. #else
  96707. "umull r6, r7, r8, r12\n\t"
  96708. "adds r4, r4, r6\n\t"
  96709. "adcs r5, r5, r7\n\t"
  96710. "adc r3, r3, #0\n\t"
  96711. #endif
  96712. /* A[2] * B[2] */
  96713. "ldr r11, [%[a], #8]\n\t"
  96714. "ldr r12, [%[b], #8]\n\t"
  96715. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96716. "lsl r6, r11, #16\n\t"
  96717. "lsl r7, r12, #16\n\t"
  96718. "lsr r6, r6, #16\n\t"
  96719. "lsr r7, r7, #16\n\t"
  96720. "mul r7, r6, r7\n\t"
  96721. "adds r4, r4, r7\n\t"
  96722. "adcs r5, r5, #0\n\t"
  96723. "adc r3, r3, #0\n\t"
  96724. "lsr r7, r12, #16\n\t"
  96725. "mul r6, r7, r6\n\t"
  96726. "lsr r7, r6, #16\n\t"
  96727. "lsl r6, r6, #16\n\t"
  96728. "adds r4, r4, r6\n\t"
  96729. "adcs r5, r5, r7\n\t"
  96730. "adc r3, r3, #0\n\t"
  96731. "lsr r6, r11, #16\n\t"
  96732. "lsr r7, r12, #16\n\t"
  96733. "mul r7, r6, r7\n\t"
  96734. "adds r5, r5, r7\n\t"
  96735. "adc r3, r3, #0\n\t"
  96736. "lsl r7, r12, #16\n\t"
  96737. "lsr r7, r7, #16\n\t"
  96738. "mul r6, r7, r6\n\t"
  96739. "lsr r7, r6, #16\n\t"
  96740. "lsl r6, r6, #16\n\t"
  96741. "adds r4, r4, r6\n\t"
  96742. "adcs r5, r5, r7\n\t"
  96743. "adc r3, r3, #0\n\t"
  96744. #else
  96745. "umull r6, r7, r11, r12\n\t"
  96746. "adds r4, r4, r6\n\t"
  96747. "adcs r5, r5, r7\n\t"
  96748. "adc r3, r3, #0\n\t"
  96749. #endif
  96750. /* A[1] * B[3] */
  96751. "ldr r8, [%[a], #4]\n\t"
  96752. "ldr r9, [%[b], #12]\n\t"
  96753. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96754. "lsl r6, r8, #16\n\t"
  96755. "lsl r7, r9, #16\n\t"
  96756. "lsr r6, r6, #16\n\t"
  96757. "lsr r7, r7, #16\n\t"
  96758. "mul r7, r6, r7\n\t"
  96759. "adds r4, r4, r7\n\t"
  96760. "adcs r5, r5, #0\n\t"
  96761. "adc r3, r3, #0\n\t"
  96762. "lsr r7, r9, #16\n\t"
  96763. "mul r6, r7, r6\n\t"
  96764. "lsr r7, r6, #16\n\t"
  96765. "lsl r6, r6, #16\n\t"
  96766. "adds r4, r4, r6\n\t"
  96767. "adcs r5, r5, r7\n\t"
  96768. "adc r3, r3, #0\n\t"
  96769. "lsr r6, r8, #16\n\t"
  96770. "lsr r7, r9, #16\n\t"
  96771. "mul r7, r6, r7\n\t"
  96772. "adds r5, r5, r7\n\t"
  96773. "adc r3, r3, #0\n\t"
  96774. "lsl r7, r9, #16\n\t"
  96775. "lsr r7, r7, #16\n\t"
  96776. "mul r6, r7, r6\n\t"
  96777. "lsr r7, r6, #16\n\t"
  96778. "lsl r6, r6, #16\n\t"
  96779. "adds r4, r4, r6\n\t"
  96780. "adcs r5, r5, r7\n\t"
  96781. "adc r3, r3, #0\n\t"
  96782. #else
  96783. "umull r6, r7, r8, r9\n\t"
  96784. "adds r4, r4, r6\n\t"
  96785. "adcs r5, r5, r7\n\t"
  96786. "adc r3, r3, #0\n\t"
  96787. #endif
  96788. /* A[0] * B[4] */
  96789. "ldr r8, [%[a]]\n\t"
  96790. "ldr r9, [%[b], #16]\n\t"
  96791. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96792. "lsl r6, r8, #16\n\t"
  96793. "lsl r7, r9, #16\n\t"
  96794. "lsr r6, r6, #16\n\t"
  96795. "lsr r7, r7, #16\n\t"
  96796. "mul r7, r6, r7\n\t"
  96797. "adds r4, r4, r7\n\t"
  96798. "adcs r5, r5, #0\n\t"
  96799. "adc r3, r3, #0\n\t"
  96800. "lsr r7, r9, #16\n\t"
  96801. "mul r6, r7, r6\n\t"
  96802. "lsr r7, r6, #16\n\t"
  96803. "lsl r6, r6, #16\n\t"
  96804. "adds r4, r4, r6\n\t"
  96805. "adcs r5, r5, r7\n\t"
  96806. "adc r3, r3, #0\n\t"
  96807. "lsr r6, r8, #16\n\t"
  96808. "lsr r7, r9, #16\n\t"
  96809. "mul r7, r6, r7\n\t"
  96810. "adds r5, r5, r7\n\t"
  96811. "adc r3, r3, #0\n\t"
  96812. "lsl r7, r9, #16\n\t"
  96813. "lsr r7, r7, #16\n\t"
  96814. "mul r6, r7, r6\n\t"
  96815. "lsr r7, r6, #16\n\t"
  96816. "lsl r6, r6, #16\n\t"
  96817. "adds r4, r4, r6\n\t"
  96818. "adcs r5, r5, r7\n\t"
  96819. "adc r3, r3, #0\n\t"
  96820. #else
  96821. "umull r6, r7, r8, r9\n\t"
  96822. "adds r4, r4, r6\n\t"
  96823. "adcs r5, r5, r7\n\t"
  96824. "adc r3, r3, #0\n\t"
  96825. #endif
  96826. "str r4, [sp, #16]\n\t"
  96827. /* A[0] * B[5] */
  96828. "ldr r9, [%[b], #20]\n\t"
  96829. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96830. "lsl r6, r8, #16\n\t"
  96831. "lsl r7, r9, #16\n\t"
  96832. "lsr r6, r6, #16\n\t"
  96833. "lsr r7, r7, #16\n\t"
  96834. "mul r7, r6, r7\n\t"
  96835. "adds r5, r5, r7\n\t"
  96836. "adcs r3, r3, #0\n\t"
  96837. "mov r4, #0\n\t"
  96838. "adc r4, r4, #0\n\t"
  96839. "lsr r7, r9, #16\n\t"
  96840. "mul r6, r7, r6\n\t"
  96841. "lsr r7, r6, #16\n\t"
  96842. "lsl r6, r6, #16\n\t"
  96843. "adds r5, r5, r6\n\t"
  96844. "adcs r3, r3, r7\n\t"
  96845. "adc r4, r4, #0\n\t"
  96846. "lsr r6, r8, #16\n\t"
  96847. "lsr r7, r9, #16\n\t"
  96848. "mul r7, r6, r7\n\t"
  96849. "adds r3, r3, r7\n\t"
  96850. "adc r4, r4, #0\n\t"
  96851. "lsl r7, r9, #16\n\t"
  96852. "lsr r7, r7, #16\n\t"
  96853. "mul r6, r7, r6\n\t"
  96854. "lsr r7, r6, #16\n\t"
  96855. "lsl r6, r6, #16\n\t"
  96856. "adds r5, r5, r6\n\t"
  96857. "adcs r3, r3, r7\n\t"
  96858. "adc r4, r4, #0\n\t"
  96859. #else
  96860. "umull r6, r7, r8, r9\n\t"
  96861. "adds r5, r5, r6\n\t"
  96862. "adcs r3, r3, r7\n\t"
  96863. "mov r4, #0\n\t"
  96864. "adc r4, r4, #0\n\t"
  96865. #endif
  96866. /* A[1] * B[4] */
  96867. "ldr r8, [%[a], #4]\n\t"
  96868. "ldr r9, [%[b], #16]\n\t"
  96869. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96870. "lsl r6, r8, #16\n\t"
  96871. "lsl r7, r9, #16\n\t"
  96872. "lsr r6, r6, #16\n\t"
  96873. "lsr r7, r7, #16\n\t"
  96874. "mul r7, r6, r7\n\t"
  96875. "adds r5, r5, r7\n\t"
  96876. "adcs r3, r3, #0\n\t"
  96877. "adc r4, r4, #0\n\t"
  96878. "lsr r7, r9, #16\n\t"
  96879. "mul r6, r7, r6\n\t"
  96880. "lsr r7, r6, #16\n\t"
  96881. "lsl r6, r6, #16\n\t"
  96882. "adds r5, r5, r6\n\t"
  96883. "adcs r3, r3, r7\n\t"
  96884. "adc r4, r4, #0\n\t"
  96885. "lsr r6, r8, #16\n\t"
  96886. "lsr r7, r9, #16\n\t"
  96887. "mul r7, r6, r7\n\t"
  96888. "adds r3, r3, r7\n\t"
  96889. "adc r4, r4, #0\n\t"
  96890. "lsl r7, r9, #16\n\t"
  96891. "lsr r7, r7, #16\n\t"
  96892. "mul r6, r7, r6\n\t"
  96893. "lsr r7, r6, #16\n\t"
  96894. "lsl r6, r6, #16\n\t"
  96895. "adds r5, r5, r6\n\t"
  96896. "adcs r3, r3, r7\n\t"
  96897. "adc r4, r4, #0\n\t"
  96898. #else
  96899. "umull r6, r7, r8, r9\n\t"
  96900. "adds r5, r5, r6\n\t"
  96901. "adcs r3, r3, r7\n\t"
  96902. "adc r4, r4, #0\n\t"
  96903. #endif
  96904. /* A[2] * B[3] */
  96905. "ldr r9, [%[b], #12]\n\t"
  96906. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96907. "lsl r6, r11, #16\n\t"
  96908. "lsl r7, r9, #16\n\t"
  96909. "lsr r6, r6, #16\n\t"
  96910. "lsr r7, r7, #16\n\t"
  96911. "mul r7, r6, r7\n\t"
  96912. "adds r5, r5, r7\n\t"
  96913. "adcs r3, r3, #0\n\t"
  96914. "adc r4, r4, #0\n\t"
  96915. "lsr r7, r9, #16\n\t"
  96916. "mul r6, r7, r6\n\t"
  96917. "lsr r7, r6, #16\n\t"
  96918. "lsl r6, r6, #16\n\t"
  96919. "adds r5, r5, r6\n\t"
  96920. "adcs r3, r3, r7\n\t"
  96921. "adc r4, r4, #0\n\t"
  96922. "lsr r6, r11, #16\n\t"
  96923. "lsr r7, r9, #16\n\t"
  96924. "mul r7, r6, r7\n\t"
  96925. "adds r3, r3, r7\n\t"
  96926. "adc r4, r4, #0\n\t"
  96927. "lsl r7, r9, #16\n\t"
  96928. "lsr r7, r7, #16\n\t"
  96929. "mul r6, r7, r6\n\t"
  96930. "lsr r7, r6, #16\n\t"
  96931. "lsl r6, r6, #16\n\t"
  96932. "adds r5, r5, r6\n\t"
  96933. "adcs r3, r3, r7\n\t"
  96934. "adc r4, r4, #0\n\t"
  96935. #else
  96936. "umull r6, r7, r11, r9\n\t"
  96937. "adds r5, r5, r6\n\t"
  96938. "adcs r3, r3, r7\n\t"
  96939. "adc r4, r4, #0\n\t"
  96940. #endif
  96941. /* A[3] * B[2] */
  96942. "ldr r8, [%[a], #12]\n\t"
  96943. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96944. "lsl r6, r8, #16\n\t"
  96945. "lsl r7, r12, #16\n\t"
  96946. "lsr r6, r6, #16\n\t"
  96947. "lsr r7, r7, #16\n\t"
  96948. "mul r7, r6, r7\n\t"
  96949. "adds r5, r5, r7\n\t"
  96950. "adcs r3, r3, #0\n\t"
  96951. "adc r4, r4, #0\n\t"
  96952. "lsr r7, r12, #16\n\t"
  96953. "mul r6, r7, r6\n\t"
  96954. "lsr r7, r6, #16\n\t"
  96955. "lsl r6, r6, #16\n\t"
  96956. "adds r5, r5, r6\n\t"
  96957. "adcs r3, r3, r7\n\t"
  96958. "adc r4, r4, #0\n\t"
  96959. "lsr r6, r8, #16\n\t"
  96960. "lsr r7, r12, #16\n\t"
  96961. "mul r7, r6, r7\n\t"
  96962. "adds r3, r3, r7\n\t"
  96963. "adc r4, r4, #0\n\t"
  96964. "lsl r7, r12, #16\n\t"
  96965. "lsr r7, r7, #16\n\t"
  96966. "mul r6, r7, r6\n\t"
  96967. "lsr r7, r6, #16\n\t"
  96968. "lsl r6, r6, #16\n\t"
  96969. "adds r5, r5, r6\n\t"
  96970. "adcs r3, r3, r7\n\t"
  96971. "adc r4, r4, #0\n\t"
  96972. #else
  96973. "umull r6, r7, r8, r12\n\t"
  96974. "adds r5, r5, r6\n\t"
  96975. "adcs r3, r3, r7\n\t"
  96976. "adc r4, r4, #0\n\t"
  96977. #endif
  96978. /* A[4] * B[1] */
  96979. "ldr r8, [%[a], #16]\n\t"
  96980. "ldr r9, [%[b], #4]\n\t"
  96981. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  96982. "lsl r6, r8, #16\n\t"
  96983. "lsl r7, r9, #16\n\t"
  96984. "lsr r6, r6, #16\n\t"
  96985. "lsr r7, r7, #16\n\t"
  96986. "mul r7, r6, r7\n\t"
  96987. "adds r5, r5, r7\n\t"
  96988. "adcs r3, r3, #0\n\t"
  96989. "adc r4, r4, #0\n\t"
  96990. "lsr r7, r9, #16\n\t"
  96991. "mul r6, r7, r6\n\t"
  96992. "lsr r7, r6, #16\n\t"
  96993. "lsl r6, r6, #16\n\t"
  96994. "adds r5, r5, r6\n\t"
  96995. "adcs r3, r3, r7\n\t"
  96996. "adc r4, r4, #0\n\t"
  96997. "lsr r6, r8, #16\n\t"
  96998. "lsr r7, r9, #16\n\t"
  96999. "mul r7, r6, r7\n\t"
  97000. "adds r3, r3, r7\n\t"
  97001. "adc r4, r4, #0\n\t"
  97002. "lsl r7, r9, #16\n\t"
  97003. "lsr r7, r7, #16\n\t"
  97004. "mul r6, r7, r6\n\t"
  97005. "lsr r7, r6, #16\n\t"
  97006. "lsl r6, r6, #16\n\t"
  97007. "adds r5, r5, r6\n\t"
  97008. "adcs r3, r3, r7\n\t"
  97009. "adc r4, r4, #0\n\t"
  97010. #else
  97011. "umull r6, r7, r8, r9\n\t"
  97012. "adds r5, r5, r6\n\t"
  97013. "adcs r3, r3, r7\n\t"
  97014. "adc r4, r4, #0\n\t"
  97015. #endif
  97016. /* A[5] * B[0] */
  97017. "ldr r8, [%[a], #20]\n\t"
  97018. "ldr r9, [%[b]]\n\t"
  97019. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97020. "lsl r6, r8, #16\n\t"
  97021. "lsl r7, r9, #16\n\t"
  97022. "lsr r6, r6, #16\n\t"
  97023. "lsr r7, r7, #16\n\t"
  97024. "mul r7, r6, r7\n\t"
  97025. "adds r5, r5, r7\n\t"
  97026. "adcs r3, r3, #0\n\t"
  97027. "adc r4, r4, #0\n\t"
  97028. "lsr r7, r9, #16\n\t"
  97029. "mul r6, r7, r6\n\t"
  97030. "lsr r7, r6, #16\n\t"
  97031. "lsl r6, r6, #16\n\t"
  97032. "adds r5, r5, r6\n\t"
  97033. "adcs r3, r3, r7\n\t"
  97034. "adc r4, r4, #0\n\t"
  97035. "lsr r6, r8, #16\n\t"
  97036. "lsr r7, r9, #16\n\t"
  97037. "mul r7, r6, r7\n\t"
  97038. "adds r3, r3, r7\n\t"
  97039. "adc r4, r4, #0\n\t"
  97040. "lsl r7, r9, #16\n\t"
  97041. "lsr r7, r7, #16\n\t"
  97042. "mul r6, r7, r6\n\t"
  97043. "lsr r7, r6, #16\n\t"
  97044. "lsl r6, r6, #16\n\t"
  97045. "adds r5, r5, r6\n\t"
  97046. "adcs r3, r3, r7\n\t"
  97047. "adc r4, r4, #0\n\t"
  97048. #else
  97049. "umull r6, r7, r8, r9\n\t"
  97050. "adds r5, r5, r6\n\t"
  97051. "adcs r3, r3, r7\n\t"
  97052. "adc r4, r4, #0\n\t"
  97053. #endif
  97054. "str r5, [sp, #20]\n\t"
  97055. /* A[6] * B[0] */
  97056. "ldr r8, [%[a], #24]\n\t"
  97057. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97058. "lsl r6, r8, #16\n\t"
  97059. "lsl r7, r9, #16\n\t"
  97060. "lsr r6, r6, #16\n\t"
  97061. "lsr r7, r7, #16\n\t"
  97062. "mul r7, r6, r7\n\t"
  97063. "adds r3, r3, r7\n\t"
  97064. "adcs r4, r4, #0\n\t"
  97065. "mov r5, #0\n\t"
  97066. "adc r5, r5, #0\n\t"
  97067. "lsr r7, r9, #16\n\t"
  97068. "mul r6, r7, r6\n\t"
  97069. "lsr r7, r6, #16\n\t"
  97070. "lsl r6, r6, #16\n\t"
  97071. "adds r3, r3, r6\n\t"
  97072. "adcs r4, r4, r7\n\t"
  97073. "adc r5, r5, #0\n\t"
  97074. "lsr r6, r8, #16\n\t"
  97075. "lsr r7, r9, #16\n\t"
  97076. "mul r7, r6, r7\n\t"
  97077. "adds r4, r4, r7\n\t"
  97078. "adc r5, r5, #0\n\t"
  97079. "lsl r7, r9, #16\n\t"
  97080. "lsr r7, r7, #16\n\t"
  97081. "mul r6, r7, r6\n\t"
  97082. "lsr r7, r6, #16\n\t"
  97083. "lsl r6, r6, #16\n\t"
  97084. "adds r3, r3, r6\n\t"
  97085. "adcs r4, r4, r7\n\t"
  97086. "adc r5, r5, #0\n\t"
  97087. #else
  97088. "umull r6, r7, r8, r9\n\t"
  97089. "adds r3, r3, r6\n\t"
  97090. "adcs r4, r4, r7\n\t"
  97091. "mov r5, #0\n\t"
  97092. "adc r5, r5, #0\n\t"
  97093. #endif
  97094. /* A[5] * B[1] */
  97095. "ldr r8, [%[a], #20]\n\t"
  97096. "ldr r9, [%[b], #4]\n\t"
  97097. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97098. "lsl r6, r8, #16\n\t"
  97099. "lsl r7, r9, #16\n\t"
  97100. "lsr r6, r6, #16\n\t"
  97101. "lsr r7, r7, #16\n\t"
  97102. "mul r7, r6, r7\n\t"
  97103. "adds r3, r3, r7\n\t"
  97104. "adcs r4, r4, #0\n\t"
  97105. "adc r5, r5, #0\n\t"
  97106. "lsr r7, r9, #16\n\t"
  97107. "mul r6, r7, r6\n\t"
  97108. "lsr r7, r6, #16\n\t"
  97109. "lsl r6, r6, #16\n\t"
  97110. "adds r3, r3, r6\n\t"
  97111. "adcs r4, r4, r7\n\t"
  97112. "adc r5, r5, #0\n\t"
  97113. "lsr r6, r8, #16\n\t"
  97114. "lsr r7, r9, #16\n\t"
  97115. "mul r7, r6, r7\n\t"
  97116. "adds r4, r4, r7\n\t"
  97117. "adc r5, r5, #0\n\t"
  97118. "lsl r7, r9, #16\n\t"
  97119. "lsr r7, r7, #16\n\t"
  97120. "mul r6, r7, r6\n\t"
  97121. "lsr r7, r6, #16\n\t"
  97122. "lsl r6, r6, #16\n\t"
  97123. "adds r3, r3, r6\n\t"
  97124. "adcs r4, r4, r7\n\t"
  97125. "adc r5, r5, #0\n\t"
  97126. #else
  97127. "umull r6, r7, r8, r9\n\t"
  97128. "adds r3, r3, r6\n\t"
  97129. "adcs r4, r4, r7\n\t"
  97130. "adc r5, r5, #0\n\t"
  97131. #endif
  97132. /* A[4] * B[2] */
  97133. "ldr r8, [%[a], #16]\n\t"
  97134. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97135. "lsl r6, r8, #16\n\t"
  97136. "lsl r7, r12, #16\n\t"
  97137. "lsr r6, r6, #16\n\t"
  97138. "lsr r7, r7, #16\n\t"
  97139. "mul r7, r6, r7\n\t"
  97140. "adds r3, r3, r7\n\t"
  97141. "adcs r4, r4, #0\n\t"
  97142. "adc r5, r5, #0\n\t"
  97143. "lsr r7, r12, #16\n\t"
  97144. "mul r6, r7, r6\n\t"
  97145. "lsr r7, r6, #16\n\t"
  97146. "lsl r6, r6, #16\n\t"
  97147. "adds r3, r3, r6\n\t"
  97148. "adcs r4, r4, r7\n\t"
  97149. "adc r5, r5, #0\n\t"
  97150. "lsr r6, r8, #16\n\t"
  97151. "lsr r7, r12, #16\n\t"
  97152. "mul r7, r6, r7\n\t"
  97153. "adds r4, r4, r7\n\t"
  97154. "adc r5, r5, #0\n\t"
  97155. "lsl r7, r12, #16\n\t"
  97156. "lsr r7, r7, #16\n\t"
  97157. "mul r6, r7, r6\n\t"
  97158. "lsr r7, r6, #16\n\t"
  97159. "lsl r6, r6, #16\n\t"
  97160. "adds r3, r3, r6\n\t"
  97161. "adcs r4, r4, r7\n\t"
  97162. "adc r5, r5, #0\n\t"
  97163. #else
  97164. "umull r6, r7, r8, r12\n\t"
  97165. "adds r3, r3, r6\n\t"
  97166. "adcs r4, r4, r7\n\t"
  97167. "adc r5, r5, #0\n\t"
  97168. #endif
  97169. /* A[3] * B[3] */
  97170. "ldr r11, [%[a], #12]\n\t"
  97171. "ldr r12, [%[b], #12]\n\t"
  97172. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97173. "lsl r6, r11, #16\n\t"
  97174. "lsl r7, r12, #16\n\t"
  97175. "lsr r6, r6, #16\n\t"
  97176. "lsr r7, r7, #16\n\t"
  97177. "mul r7, r6, r7\n\t"
  97178. "adds r3, r3, r7\n\t"
  97179. "adcs r4, r4, #0\n\t"
  97180. "adc r5, r5, #0\n\t"
  97181. "lsr r7, r12, #16\n\t"
  97182. "mul r6, r7, r6\n\t"
  97183. "lsr r7, r6, #16\n\t"
  97184. "lsl r6, r6, #16\n\t"
  97185. "adds r3, r3, r6\n\t"
  97186. "adcs r4, r4, r7\n\t"
  97187. "adc r5, r5, #0\n\t"
  97188. "lsr r6, r11, #16\n\t"
  97189. "lsr r7, r12, #16\n\t"
  97190. "mul r7, r6, r7\n\t"
  97191. "adds r4, r4, r7\n\t"
  97192. "adc r5, r5, #0\n\t"
  97193. "lsl r7, r12, #16\n\t"
  97194. "lsr r7, r7, #16\n\t"
  97195. "mul r6, r7, r6\n\t"
  97196. "lsr r7, r6, #16\n\t"
  97197. "lsl r6, r6, #16\n\t"
  97198. "adds r3, r3, r6\n\t"
  97199. "adcs r4, r4, r7\n\t"
  97200. "adc r5, r5, #0\n\t"
  97201. #else
  97202. "umull r6, r7, r11, r12\n\t"
  97203. "adds r3, r3, r6\n\t"
  97204. "adcs r4, r4, r7\n\t"
  97205. "adc r5, r5, #0\n\t"
  97206. #endif
  97207. /* A[2] * B[4] */
  97208. "ldr r8, [%[a], #8]\n\t"
  97209. "ldr r9, [%[b], #16]\n\t"
  97210. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97211. "lsl r6, r8, #16\n\t"
  97212. "lsl r7, r9, #16\n\t"
  97213. "lsr r6, r6, #16\n\t"
  97214. "lsr r7, r7, #16\n\t"
  97215. "mul r7, r6, r7\n\t"
  97216. "adds r3, r3, r7\n\t"
  97217. "adcs r4, r4, #0\n\t"
  97218. "adc r5, r5, #0\n\t"
  97219. "lsr r7, r9, #16\n\t"
  97220. "mul r6, r7, r6\n\t"
  97221. "lsr r7, r6, #16\n\t"
  97222. "lsl r6, r6, #16\n\t"
  97223. "adds r3, r3, r6\n\t"
  97224. "adcs r4, r4, r7\n\t"
  97225. "adc r5, r5, #0\n\t"
  97226. "lsr r6, r8, #16\n\t"
  97227. "lsr r7, r9, #16\n\t"
  97228. "mul r7, r6, r7\n\t"
  97229. "adds r4, r4, r7\n\t"
  97230. "adc r5, r5, #0\n\t"
  97231. "lsl r7, r9, #16\n\t"
  97232. "lsr r7, r7, #16\n\t"
  97233. "mul r6, r7, r6\n\t"
  97234. "lsr r7, r6, #16\n\t"
  97235. "lsl r6, r6, #16\n\t"
  97236. "adds r3, r3, r6\n\t"
  97237. "adcs r4, r4, r7\n\t"
  97238. "adc r5, r5, #0\n\t"
  97239. #else
  97240. "umull r6, r7, r8, r9\n\t"
  97241. "adds r3, r3, r6\n\t"
  97242. "adcs r4, r4, r7\n\t"
  97243. "adc r5, r5, #0\n\t"
  97244. #endif
  97245. /* A[1] * B[5] */
  97246. "ldr r8, [%[a], #4]\n\t"
  97247. "ldr r9, [%[b], #20]\n\t"
  97248. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97249. "lsl r6, r8, #16\n\t"
  97250. "lsl r7, r9, #16\n\t"
  97251. "lsr r6, r6, #16\n\t"
  97252. "lsr r7, r7, #16\n\t"
  97253. "mul r7, r6, r7\n\t"
  97254. "adds r3, r3, r7\n\t"
  97255. "adcs r4, r4, #0\n\t"
  97256. "adc r5, r5, #0\n\t"
  97257. "lsr r7, r9, #16\n\t"
  97258. "mul r6, r7, r6\n\t"
  97259. "lsr r7, r6, #16\n\t"
  97260. "lsl r6, r6, #16\n\t"
  97261. "adds r3, r3, r6\n\t"
  97262. "adcs r4, r4, r7\n\t"
  97263. "adc r5, r5, #0\n\t"
  97264. "lsr r6, r8, #16\n\t"
  97265. "lsr r7, r9, #16\n\t"
  97266. "mul r7, r6, r7\n\t"
  97267. "adds r4, r4, r7\n\t"
  97268. "adc r5, r5, #0\n\t"
  97269. "lsl r7, r9, #16\n\t"
  97270. "lsr r7, r7, #16\n\t"
  97271. "mul r6, r7, r6\n\t"
  97272. "lsr r7, r6, #16\n\t"
  97273. "lsl r6, r6, #16\n\t"
  97274. "adds r3, r3, r6\n\t"
  97275. "adcs r4, r4, r7\n\t"
  97276. "adc r5, r5, #0\n\t"
  97277. #else
  97278. "umull r6, r7, r8, r9\n\t"
  97279. "adds r3, r3, r6\n\t"
  97280. "adcs r4, r4, r7\n\t"
  97281. "adc r5, r5, #0\n\t"
  97282. #endif
  97283. /* A[0] * B[6] */
  97284. "ldr r8, [%[a]]\n\t"
  97285. "ldr r9, [%[b], #24]\n\t"
  97286. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97287. "lsl r6, r8, #16\n\t"
  97288. "lsl r7, r9, #16\n\t"
  97289. "lsr r6, r6, #16\n\t"
  97290. "lsr r7, r7, #16\n\t"
  97291. "mul r7, r6, r7\n\t"
  97292. "adds r3, r3, r7\n\t"
  97293. "adcs r4, r4, #0\n\t"
  97294. "adc r5, r5, #0\n\t"
  97295. "lsr r7, r9, #16\n\t"
  97296. "mul r6, r7, r6\n\t"
  97297. "lsr r7, r6, #16\n\t"
  97298. "lsl r6, r6, #16\n\t"
  97299. "adds r3, r3, r6\n\t"
  97300. "adcs r4, r4, r7\n\t"
  97301. "adc r5, r5, #0\n\t"
  97302. "lsr r6, r8, #16\n\t"
  97303. "lsr r7, r9, #16\n\t"
  97304. "mul r7, r6, r7\n\t"
  97305. "adds r4, r4, r7\n\t"
  97306. "adc r5, r5, #0\n\t"
  97307. "lsl r7, r9, #16\n\t"
  97308. "lsr r7, r7, #16\n\t"
  97309. "mul r6, r7, r6\n\t"
  97310. "lsr r7, r6, #16\n\t"
  97311. "lsl r6, r6, #16\n\t"
  97312. "adds r3, r3, r6\n\t"
  97313. "adcs r4, r4, r7\n\t"
  97314. "adc r5, r5, #0\n\t"
  97315. #else
  97316. "umull r6, r7, r8, r9\n\t"
  97317. "adds r3, r3, r6\n\t"
  97318. "adcs r4, r4, r7\n\t"
  97319. "adc r5, r5, #0\n\t"
  97320. #endif
  97321. "str r3, [sp, #24]\n\t"
  97322. /* A[0] * B[7] */
  97323. "ldr r9, [%[b], #28]\n\t"
  97324. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97325. "lsl r6, r8, #16\n\t"
  97326. "lsl r7, r9, #16\n\t"
  97327. "lsr r6, r6, #16\n\t"
  97328. "lsr r7, r7, #16\n\t"
  97329. "mul r7, r6, r7\n\t"
  97330. "adds r4, r4, r7\n\t"
  97331. "adcs r5, r5, #0\n\t"
  97332. "mov r3, #0\n\t"
  97333. "adc r3, r3, #0\n\t"
  97334. "lsr r7, r9, #16\n\t"
  97335. "mul r6, r7, r6\n\t"
  97336. "lsr r7, r6, #16\n\t"
  97337. "lsl r6, r6, #16\n\t"
  97338. "adds r4, r4, r6\n\t"
  97339. "adcs r5, r5, r7\n\t"
  97340. "adc r3, r3, #0\n\t"
  97341. "lsr r6, r8, #16\n\t"
  97342. "lsr r7, r9, #16\n\t"
  97343. "mul r7, r6, r7\n\t"
  97344. "adds r5, r5, r7\n\t"
  97345. "adc r3, r3, #0\n\t"
  97346. "lsl r7, r9, #16\n\t"
  97347. "lsr r7, r7, #16\n\t"
  97348. "mul r6, r7, r6\n\t"
  97349. "lsr r7, r6, #16\n\t"
  97350. "lsl r6, r6, #16\n\t"
  97351. "adds r4, r4, r6\n\t"
  97352. "adcs r5, r5, r7\n\t"
  97353. "adc r3, r3, #0\n\t"
  97354. #else
  97355. "umull r6, r7, r8, r9\n\t"
  97356. "adds r4, r4, r6\n\t"
  97357. "adcs r5, r5, r7\n\t"
  97358. "mov r3, #0\n\t"
  97359. "adc r3, r3, #0\n\t"
  97360. #endif
  97361. /* A[1] * B[6] */
  97362. "ldr r8, [%[a], #4]\n\t"
  97363. "ldr r9, [%[b], #24]\n\t"
  97364. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97365. "lsl r6, r8, #16\n\t"
  97366. "lsl r7, r9, #16\n\t"
  97367. "lsr r6, r6, #16\n\t"
  97368. "lsr r7, r7, #16\n\t"
  97369. "mul r7, r6, r7\n\t"
  97370. "adds r4, r4, r7\n\t"
  97371. "adcs r5, r5, #0\n\t"
  97372. "adc r3, r3, #0\n\t"
  97373. "lsr r7, r9, #16\n\t"
  97374. "mul r6, r7, r6\n\t"
  97375. "lsr r7, r6, #16\n\t"
  97376. "lsl r6, r6, #16\n\t"
  97377. "adds r4, r4, r6\n\t"
  97378. "adcs r5, r5, r7\n\t"
  97379. "adc r3, r3, #0\n\t"
  97380. "lsr r6, r8, #16\n\t"
  97381. "lsr r7, r9, #16\n\t"
  97382. "mul r7, r6, r7\n\t"
  97383. "adds r5, r5, r7\n\t"
  97384. "adc r3, r3, #0\n\t"
  97385. "lsl r7, r9, #16\n\t"
  97386. "lsr r7, r7, #16\n\t"
  97387. "mul r6, r7, r6\n\t"
  97388. "lsr r7, r6, #16\n\t"
  97389. "lsl r6, r6, #16\n\t"
  97390. "adds r4, r4, r6\n\t"
  97391. "adcs r5, r5, r7\n\t"
  97392. "adc r3, r3, #0\n\t"
  97393. #else
  97394. "umull r6, r7, r8, r9\n\t"
  97395. "adds r4, r4, r6\n\t"
  97396. "adcs r5, r5, r7\n\t"
  97397. "adc r3, r3, #0\n\t"
  97398. #endif
  97399. /* A[2] * B[5] */
  97400. "ldr r8, [%[a], #8]\n\t"
  97401. "ldr r9, [%[b], #20]\n\t"
  97402. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97403. "lsl r6, r8, #16\n\t"
  97404. "lsl r7, r9, #16\n\t"
  97405. "lsr r6, r6, #16\n\t"
  97406. "lsr r7, r7, #16\n\t"
  97407. "mul r7, r6, r7\n\t"
  97408. "adds r4, r4, r7\n\t"
  97409. "adcs r5, r5, #0\n\t"
  97410. "adc r3, r3, #0\n\t"
  97411. "lsr r7, r9, #16\n\t"
  97412. "mul r6, r7, r6\n\t"
  97413. "lsr r7, r6, #16\n\t"
  97414. "lsl r6, r6, #16\n\t"
  97415. "adds r4, r4, r6\n\t"
  97416. "adcs r5, r5, r7\n\t"
  97417. "adc r3, r3, #0\n\t"
  97418. "lsr r6, r8, #16\n\t"
  97419. "lsr r7, r9, #16\n\t"
  97420. "mul r7, r6, r7\n\t"
  97421. "adds r5, r5, r7\n\t"
  97422. "adc r3, r3, #0\n\t"
  97423. "lsl r7, r9, #16\n\t"
  97424. "lsr r7, r7, #16\n\t"
  97425. "mul r6, r7, r6\n\t"
  97426. "lsr r7, r6, #16\n\t"
  97427. "lsl r6, r6, #16\n\t"
  97428. "adds r4, r4, r6\n\t"
  97429. "adcs r5, r5, r7\n\t"
  97430. "adc r3, r3, #0\n\t"
  97431. #else
  97432. "umull r6, r7, r8, r9\n\t"
  97433. "adds r4, r4, r6\n\t"
  97434. "adcs r5, r5, r7\n\t"
  97435. "adc r3, r3, #0\n\t"
  97436. #endif
  97437. /* A[3] * B[4] */
  97438. "ldr r9, [%[b], #16]\n\t"
  97439. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97440. "lsl r6, r11, #16\n\t"
  97441. "lsl r7, r9, #16\n\t"
  97442. "lsr r6, r6, #16\n\t"
  97443. "lsr r7, r7, #16\n\t"
  97444. "mul r7, r6, r7\n\t"
  97445. "adds r4, r4, r7\n\t"
  97446. "adcs r5, r5, #0\n\t"
  97447. "adc r3, r3, #0\n\t"
  97448. "lsr r7, r9, #16\n\t"
  97449. "mul r6, r7, r6\n\t"
  97450. "lsr r7, r6, #16\n\t"
  97451. "lsl r6, r6, #16\n\t"
  97452. "adds r4, r4, r6\n\t"
  97453. "adcs r5, r5, r7\n\t"
  97454. "adc r3, r3, #0\n\t"
  97455. "lsr r6, r11, #16\n\t"
  97456. "lsr r7, r9, #16\n\t"
  97457. "mul r7, r6, r7\n\t"
  97458. "adds r5, r5, r7\n\t"
  97459. "adc r3, r3, #0\n\t"
  97460. "lsl r7, r9, #16\n\t"
  97461. "lsr r7, r7, #16\n\t"
  97462. "mul r6, r7, r6\n\t"
  97463. "lsr r7, r6, #16\n\t"
  97464. "lsl r6, r6, #16\n\t"
  97465. "adds r4, r4, r6\n\t"
  97466. "adcs r5, r5, r7\n\t"
  97467. "adc r3, r3, #0\n\t"
  97468. #else
  97469. "umull r6, r7, r11, r9\n\t"
  97470. "adds r4, r4, r6\n\t"
  97471. "adcs r5, r5, r7\n\t"
  97472. "adc r3, r3, #0\n\t"
  97473. #endif
  97474. /* A[4] * B[3] */
  97475. "ldr r8, [%[a], #16]\n\t"
  97476. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97477. "lsl r6, r8, #16\n\t"
  97478. "lsl r7, r12, #16\n\t"
  97479. "lsr r6, r6, #16\n\t"
  97480. "lsr r7, r7, #16\n\t"
  97481. "mul r7, r6, r7\n\t"
  97482. "adds r4, r4, r7\n\t"
  97483. "adcs r5, r5, #0\n\t"
  97484. "adc r3, r3, #0\n\t"
  97485. "lsr r7, r12, #16\n\t"
  97486. "mul r6, r7, r6\n\t"
  97487. "lsr r7, r6, #16\n\t"
  97488. "lsl r6, r6, #16\n\t"
  97489. "adds r4, r4, r6\n\t"
  97490. "adcs r5, r5, r7\n\t"
  97491. "adc r3, r3, #0\n\t"
  97492. "lsr r6, r8, #16\n\t"
  97493. "lsr r7, r12, #16\n\t"
  97494. "mul r7, r6, r7\n\t"
  97495. "adds r5, r5, r7\n\t"
  97496. "adc r3, r3, #0\n\t"
  97497. "lsl r7, r12, #16\n\t"
  97498. "lsr r7, r7, #16\n\t"
  97499. "mul r6, r7, r6\n\t"
  97500. "lsr r7, r6, #16\n\t"
  97501. "lsl r6, r6, #16\n\t"
  97502. "adds r4, r4, r6\n\t"
  97503. "adcs r5, r5, r7\n\t"
  97504. "adc r3, r3, #0\n\t"
  97505. #else
  97506. "umull r6, r7, r8, r12\n\t"
  97507. "adds r4, r4, r6\n\t"
  97508. "adcs r5, r5, r7\n\t"
  97509. "adc r3, r3, #0\n\t"
  97510. #endif
  97511. /* A[5] * B[2] */
  97512. "ldr r8, [%[a], #20]\n\t"
  97513. "ldr r9, [%[b], #8]\n\t"
  97514. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97515. "lsl r6, r8, #16\n\t"
  97516. "lsl r7, r9, #16\n\t"
  97517. "lsr r6, r6, #16\n\t"
  97518. "lsr r7, r7, #16\n\t"
  97519. "mul r7, r6, r7\n\t"
  97520. "adds r4, r4, r7\n\t"
  97521. "adcs r5, r5, #0\n\t"
  97522. "adc r3, r3, #0\n\t"
  97523. "lsr r7, r9, #16\n\t"
  97524. "mul r6, r7, r6\n\t"
  97525. "lsr r7, r6, #16\n\t"
  97526. "lsl r6, r6, #16\n\t"
  97527. "adds r4, r4, r6\n\t"
  97528. "adcs r5, r5, r7\n\t"
  97529. "adc r3, r3, #0\n\t"
  97530. "lsr r6, r8, #16\n\t"
  97531. "lsr r7, r9, #16\n\t"
  97532. "mul r7, r6, r7\n\t"
  97533. "adds r5, r5, r7\n\t"
  97534. "adc r3, r3, #0\n\t"
  97535. "lsl r7, r9, #16\n\t"
  97536. "lsr r7, r7, #16\n\t"
  97537. "mul r6, r7, r6\n\t"
  97538. "lsr r7, r6, #16\n\t"
  97539. "lsl r6, r6, #16\n\t"
  97540. "adds r4, r4, r6\n\t"
  97541. "adcs r5, r5, r7\n\t"
  97542. "adc r3, r3, #0\n\t"
  97543. #else
  97544. "umull r6, r7, r8, r9\n\t"
  97545. "adds r4, r4, r6\n\t"
  97546. "adcs r5, r5, r7\n\t"
  97547. "adc r3, r3, #0\n\t"
  97548. #endif
  97549. /* A[6] * B[1] */
  97550. "ldr r8, [%[a], #24]\n\t"
  97551. "ldr r9, [%[b], #4]\n\t"
  97552. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97553. "lsl r6, r8, #16\n\t"
  97554. "lsl r7, r9, #16\n\t"
  97555. "lsr r6, r6, #16\n\t"
  97556. "lsr r7, r7, #16\n\t"
  97557. "mul r7, r6, r7\n\t"
  97558. "adds r4, r4, r7\n\t"
  97559. "adcs r5, r5, #0\n\t"
  97560. "adc r3, r3, #0\n\t"
  97561. "lsr r7, r9, #16\n\t"
  97562. "mul r6, r7, r6\n\t"
  97563. "lsr r7, r6, #16\n\t"
  97564. "lsl r6, r6, #16\n\t"
  97565. "adds r4, r4, r6\n\t"
  97566. "adcs r5, r5, r7\n\t"
  97567. "adc r3, r3, #0\n\t"
  97568. "lsr r6, r8, #16\n\t"
  97569. "lsr r7, r9, #16\n\t"
  97570. "mul r7, r6, r7\n\t"
  97571. "adds r5, r5, r7\n\t"
  97572. "adc r3, r3, #0\n\t"
  97573. "lsl r7, r9, #16\n\t"
  97574. "lsr r7, r7, #16\n\t"
  97575. "mul r6, r7, r6\n\t"
  97576. "lsr r7, r6, #16\n\t"
  97577. "lsl r6, r6, #16\n\t"
  97578. "adds r4, r4, r6\n\t"
  97579. "adcs r5, r5, r7\n\t"
  97580. "adc r3, r3, #0\n\t"
  97581. #else
  97582. "umull r6, r7, r8, r9\n\t"
  97583. "adds r4, r4, r6\n\t"
  97584. "adcs r5, r5, r7\n\t"
  97585. "adc r3, r3, #0\n\t"
  97586. #endif
  97587. /* A[7] * B[0] */
  97588. "ldr r8, [%[a], #28]\n\t"
  97589. "ldr r9, [%[b]]\n\t"
  97590. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97591. "lsl r6, r8, #16\n\t"
  97592. "lsl r7, r9, #16\n\t"
  97593. "lsr r6, r6, #16\n\t"
  97594. "lsr r7, r7, #16\n\t"
  97595. "mul r7, r6, r7\n\t"
  97596. "adds r4, r4, r7\n\t"
  97597. "adcs r5, r5, #0\n\t"
  97598. "adc r3, r3, #0\n\t"
  97599. "lsr r7, r9, #16\n\t"
  97600. "mul r6, r7, r6\n\t"
  97601. "lsr r7, r6, #16\n\t"
  97602. "lsl r6, r6, #16\n\t"
  97603. "adds r4, r4, r6\n\t"
  97604. "adcs r5, r5, r7\n\t"
  97605. "adc r3, r3, #0\n\t"
  97606. "lsr r6, r8, #16\n\t"
  97607. "lsr r7, r9, #16\n\t"
  97608. "mul r7, r6, r7\n\t"
  97609. "adds r5, r5, r7\n\t"
  97610. "adc r3, r3, #0\n\t"
  97611. "lsl r7, r9, #16\n\t"
  97612. "lsr r7, r7, #16\n\t"
  97613. "mul r6, r7, r6\n\t"
  97614. "lsr r7, r6, #16\n\t"
  97615. "lsl r6, r6, #16\n\t"
  97616. "adds r4, r4, r6\n\t"
  97617. "adcs r5, r5, r7\n\t"
  97618. "adc r3, r3, #0\n\t"
  97619. #else
  97620. "umull r6, r7, r8, r9\n\t"
  97621. "adds r4, r4, r6\n\t"
  97622. "adcs r5, r5, r7\n\t"
  97623. "adc r3, r3, #0\n\t"
  97624. #endif
  97625. "str r4, [sp, #28]\n\t"
  97626. /* A[8] * B[0] */
  97627. "ldr r8, [%[a], #32]\n\t"
  97628. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97629. "lsl r6, r8, #16\n\t"
  97630. "lsl r7, r9, #16\n\t"
  97631. "lsr r6, r6, #16\n\t"
  97632. "lsr r7, r7, #16\n\t"
  97633. "mul r7, r6, r7\n\t"
  97634. "adds r5, r5, r7\n\t"
  97635. "adcs r3, r3, #0\n\t"
  97636. "mov r4, #0\n\t"
  97637. "adc r4, r4, #0\n\t"
  97638. "lsr r7, r9, #16\n\t"
  97639. "mul r6, r7, r6\n\t"
  97640. "lsr r7, r6, #16\n\t"
  97641. "lsl r6, r6, #16\n\t"
  97642. "adds r5, r5, r6\n\t"
  97643. "adcs r3, r3, r7\n\t"
  97644. "adc r4, r4, #0\n\t"
  97645. "lsr r6, r8, #16\n\t"
  97646. "lsr r7, r9, #16\n\t"
  97647. "mul r7, r6, r7\n\t"
  97648. "adds r3, r3, r7\n\t"
  97649. "adc r4, r4, #0\n\t"
  97650. "lsl r7, r9, #16\n\t"
  97651. "lsr r7, r7, #16\n\t"
  97652. "mul r6, r7, r6\n\t"
  97653. "lsr r7, r6, #16\n\t"
  97654. "lsl r6, r6, #16\n\t"
  97655. "adds r5, r5, r6\n\t"
  97656. "adcs r3, r3, r7\n\t"
  97657. "adc r4, r4, #0\n\t"
  97658. #else
  97659. "umull r6, r7, r8, r9\n\t"
  97660. "adds r5, r5, r6\n\t"
  97661. "adcs r3, r3, r7\n\t"
  97662. "mov r4, #0\n\t"
  97663. "adc r4, r4, #0\n\t"
  97664. #endif
  97665. /* A[7] * B[1] */
  97666. "ldr r8, [%[a], #28]\n\t"
  97667. "ldr r9, [%[b], #4]\n\t"
  97668. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97669. "lsl r6, r8, #16\n\t"
  97670. "lsl r7, r9, #16\n\t"
  97671. "lsr r6, r6, #16\n\t"
  97672. "lsr r7, r7, #16\n\t"
  97673. "mul r7, r6, r7\n\t"
  97674. "adds r5, r5, r7\n\t"
  97675. "adcs r3, r3, #0\n\t"
  97676. "adc r4, r4, #0\n\t"
  97677. "lsr r7, r9, #16\n\t"
  97678. "mul r6, r7, r6\n\t"
  97679. "lsr r7, r6, #16\n\t"
  97680. "lsl r6, r6, #16\n\t"
  97681. "adds r5, r5, r6\n\t"
  97682. "adcs r3, r3, r7\n\t"
  97683. "adc r4, r4, #0\n\t"
  97684. "lsr r6, r8, #16\n\t"
  97685. "lsr r7, r9, #16\n\t"
  97686. "mul r7, r6, r7\n\t"
  97687. "adds r3, r3, r7\n\t"
  97688. "adc r4, r4, #0\n\t"
  97689. "lsl r7, r9, #16\n\t"
  97690. "lsr r7, r7, #16\n\t"
  97691. "mul r6, r7, r6\n\t"
  97692. "lsr r7, r6, #16\n\t"
  97693. "lsl r6, r6, #16\n\t"
  97694. "adds r5, r5, r6\n\t"
  97695. "adcs r3, r3, r7\n\t"
  97696. "adc r4, r4, #0\n\t"
  97697. #else
  97698. "umull r6, r7, r8, r9\n\t"
  97699. "adds r5, r5, r6\n\t"
  97700. "adcs r3, r3, r7\n\t"
  97701. "adc r4, r4, #0\n\t"
  97702. #endif
  97703. /* A[6] * B[2] */
  97704. "ldr r8, [%[a], #24]\n\t"
  97705. "ldr r9, [%[b], #8]\n\t"
  97706. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97707. "lsl r6, r8, #16\n\t"
  97708. "lsl r7, r9, #16\n\t"
  97709. "lsr r6, r6, #16\n\t"
  97710. "lsr r7, r7, #16\n\t"
  97711. "mul r7, r6, r7\n\t"
  97712. "adds r5, r5, r7\n\t"
  97713. "adcs r3, r3, #0\n\t"
  97714. "adc r4, r4, #0\n\t"
  97715. "lsr r7, r9, #16\n\t"
  97716. "mul r6, r7, r6\n\t"
  97717. "lsr r7, r6, #16\n\t"
  97718. "lsl r6, r6, #16\n\t"
  97719. "adds r5, r5, r6\n\t"
  97720. "adcs r3, r3, r7\n\t"
  97721. "adc r4, r4, #0\n\t"
  97722. "lsr r6, r8, #16\n\t"
  97723. "lsr r7, r9, #16\n\t"
  97724. "mul r7, r6, r7\n\t"
  97725. "adds r3, r3, r7\n\t"
  97726. "adc r4, r4, #0\n\t"
  97727. "lsl r7, r9, #16\n\t"
  97728. "lsr r7, r7, #16\n\t"
  97729. "mul r6, r7, r6\n\t"
  97730. "lsr r7, r6, #16\n\t"
  97731. "lsl r6, r6, #16\n\t"
  97732. "adds r5, r5, r6\n\t"
  97733. "adcs r3, r3, r7\n\t"
  97734. "adc r4, r4, #0\n\t"
  97735. #else
  97736. "umull r6, r7, r8, r9\n\t"
  97737. "adds r5, r5, r6\n\t"
  97738. "adcs r3, r3, r7\n\t"
  97739. "adc r4, r4, #0\n\t"
  97740. #endif
  97741. /* A[5] * B[3] */
  97742. "ldr r8, [%[a], #20]\n\t"
  97743. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97744. "lsl r6, r8, #16\n\t"
  97745. "lsl r7, r12, #16\n\t"
  97746. "lsr r6, r6, #16\n\t"
  97747. "lsr r7, r7, #16\n\t"
  97748. "mul r7, r6, r7\n\t"
  97749. "adds r5, r5, r7\n\t"
  97750. "adcs r3, r3, #0\n\t"
  97751. "adc r4, r4, #0\n\t"
  97752. "lsr r7, r12, #16\n\t"
  97753. "mul r6, r7, r6\n\t"
  97754. "lsr r7, r6, #16\n\t"
  97755. "lsl r6, r6, #16\n\t"
  97756. "adds r5, r5, r6\n\t"
  97757. "adcs r3, r3, r7\n\t"
  97758. "adc r4, r4, #0\n\t"
  97759. "lsr r6, r8, #16\n\t"
  97760. "lsr r7, r12, #16\n\t"
  97761. "mul r7, r6, r7\n\t"
  97762. "adds r3, r3, r7\n\t"
  97763. "adc r4, r4, #0\n\t"
  97764. "lsl r7, r12, #16\n\t"
  97765. "lsr r7, r7, #16\n\t"
  97766. "mul r6, r7, r6\n\t"
  97767. "lsr r7, r6, #16\n\t"
  97768. "lsl r6, r6, #16\n\t"
  97769. "adds r5, r5, r6\n\t"
  97770. "adcs r3, r3, r7\n\t"
  97771. "adc r4, r4, #0\n\t"
  97772. #else
  97773. "umull r6, r7, r8, r12\n\t"
  97774. "adds r5, r5, r6\n\t"
  97775. "adcs r3, r3, r7\n\t"
  97776. "adc r4, r4, #0\n\t"
  97777. #endif
  97778. /* A[4] * B[4] */
  97779. "ldr r11, [%[a], #16]\n\t"
  97780. "ldr r12, [%[b], #16]\n\t"
  97781. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97782. "lsl r6, r11, #16\n\t"
  97783. "lsl r7, r12, #16\n\t"
  97784. "lsr r6, r6, #16\n\t"
  97785. "lsr r7, r7, #16\n\t"
  97786. "mul r7, r6, r7\n\t"
  97787. "adds r5, r5, r7\n\t"
  97788. "adcs r3, r3, #0\n\t"
  97789. "adc r4, r4, #0\n\t"
  97790. "lsr r7, r12, #16\n\t"
  97791. "mul r6, r7, r6\n\t"
  97792. "lsr r7, r6, #16\n\t"
  97793. "lsl r6, r6, #16\n\t"
  97794. "adds r5, r5, r6\n\t"
  97795. "adcs r3, r3, r7\n\t"
  97796. "adc r4, r4, #0\n\t"
  97797. "lsr r6, r11, #16\n\t"
  97798. "lsr r7, r12, #16\n\t"
  97799. "mul r7, r6, r7\n\t"
  97800. "adds r3, r3, r7\n\t"
  97801. "adc r4, r4, #0\n\t"
  97802. "lsl r7, r12, #16\n\t"
  97803. "lsr r7, r7, #16\n\t"
  97804. "mul r6, r7, r6\n\t"
  97805. "lsr r7, r6, #16\n\t"
  97806. "lsl r6, r6, #16\n\t"
  97807. "adds r5, r5, r6\n\t"
  97808. "adcs r3, r3, r7\n\t"
  97809. "adc r4, r4, #0\n\t"
  97810. #else
  97811. "umull r6, r7, r11, r12\n\t"
  97812. "adds r5, r5, r6\n\t"
  97813. "adcs r3, r3, r7\n\t"
  97814. "adc r4, r4, #0\n\t"
  97815. #endif
  97816. /* A[3] * B[5] */
  97817. "ldr r8, [%[a], #12]\n\t"
  97818. "ldr r9, [%[b], #20]\n\t"
  97819. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97820. "lsl r6, r8, #16\n\t"
  97821. "lsl r7, r9, #16\n\t"
  97822. "lsr r6, r6, #16\n\t"
  97823. "lsr r7, r7, #16\n\t"
  97824. "mul r7, r6, r7\n\t"
  97825. "adds r5, r5, r7\n\t"
  97826. "adcs r3, r3, #0\n\t"
  97827. "adc r4, r4, #0\n\t"
  97828. "lsr r7, r9, #16\n\t"
  97829. "mul r6, r7, r6\n\t"
  97830. "lsr r7, r6, #16\n\t"
  97831. "lsl r6, r6, #16\n\t"
  97832. "adds r5, r5, r6\n\t"
  97833. "adcs r3, r3, r7\n\t"
  97834. "adc r4, r4, #0\n\t"
  97835. "lsr r6, r8, #16\n\t"
  97836. "lsr r7, r9, #16\n\t"
  97837. "mul r7, r6, r7\n\t"
  97838. "adds r3, r3, r7\n\t"
  97839. "adc r4, r4, #0\n\t"
  97840. "lsl r7, r9, #16\n\t"
  97841. "lsr r7, r7, #16\n\t"
  97842. "mul r6, r7, r6\n\t"
  97843. "lsr r7, r6, #16\n\t"
  97844. "lsl r6, r6, #16\n\t"
  97845. "adds r5, r5, r6\n\t"
  97846. "adcs r3, r3, r7\n\t"
  97847. "adc r4, r4, #0\n\t"
  97848. #else
  97849. "umull r6, r7, r8, r9\n\t"
  97850. "adds r5, r5, r6\n\t"
  97851. "adcs r3, r3, r7\n\t"
  97852. "adc r4, r4, #0\n\t"
  97853. #endif
  97854. /* A[2] * B[6] */
  97855. "ldr r8, [%[a], #8]\n\t"
  97856. "ldr r9, [%[b], #24]\n\t"
  97857. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97858. "lsl r6, r8, #16\n\t"
  97859. "lsl r7, r9, #16\n\t"
  97860. "lsr r6, r6, #16\n\t"
  97861. "lsr r7, r7, #16\n\t"
  97862. "mul r7, r6, r7\n\t"
  97863. "adds r5, r5, r7\n\t"
  97864. "adcs r3, r3, #0\n\t"
  97865. "adc r4, r4, #0\n\t"
  97866. "lsr r7, r9, #16\n\t"
  97867. "mul r6, r7, r6\n\t"
  97868. "lsr r7, r6, #16\n\t"
  97869. "lsl r6, r6, #16\n\t"
  97870. "adds r5, r5, r6\n\t"
  97871. "adcs r3, r3, r7\n\t"
  97872. "adc r4, r4, #0\n\t"
  97873. "lsr r6, r8, #16\n\t"
  97874. "lsr r7, r9, #16\n\t"
  97875. "mul r7, r6, r7\n\t"
  97876. "adds r3, r3, r7\n\t"
  97877. "adc r4, r4, #0\n\t"
  97878. "lsl r7, r9, #16\n\t"
  97879. "lsr r7, r7, #16\n\t"
  97880. "mul r6, r7, r6\n\t"
  97881. "lsr r7, r6, #16\n\t"
  97882. "lsl r6, r6, #16\n\t"
  97883. "adds r5, r5, r6\n\t"
  97884. "adcs r3, r3, r7\n\t"
  97885. "adc r4, r4, #0\n\t"
  97886. #else
  97887. "umull r6, r7, r8, r9\n\t"
  97888. "adds r5, r5, r6\n\t"
  97889. "adcs r3, r3, r7\n\t"
  97890. "adc r4, r4, #0\n\t"
  97891. #endif
  97892. /* A[1] * B[7] */
  97893. "ldr r8, [%[a], #4]\n\t"
  97894. "ldr r9, [%[b], #28]\n\t"
  97895. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97896. "lsl r6, r8, #16\n\t"
  97897. "lsl r7, r9, #16\n\t"
  97898. "lsr r6, r6, #16\n\t"
  97899. "lsr r7, r7, #16\n\t"
  97900. "mul r7, r6, r7\n\t"
  97901. "adds r5, r5, r7\n\t"
  97902. "adcs r3, r3, #0\n\t"
  97903. "adc r4, r4, #0\n\t"
  97904. "lsr r7, r9, #16\n\t"
  97905. "mul r6, r7, r6\n\t"
  97906. "lsr r7, r6, #16\n\t"
  97907. "lsl r6, r6, #16\n\t"
  97908. "adds r5, r5, r6\n\t"
  97909. "adcs r3, r3, r7\n\t"
  97910. "adc r4, r4, #0\n\t"
  97911. "lsr r6, r8, #16\n\t"
  97912. "lsr r7, r9, #16\n\t"
  97913. "mul r7, r6, r7\n\t"
  97914. "adds r3, r3, r7\n\t"
  97915. "adc r4, r4, #0\n\t"
  97916. "lsl r7, r9, #16\n\t"
  97917. "lsr r7, r7, #16\n\t"
  97918. "mul r6, r7, r6\n\t"
  97919. "lsr r7, r6, #16\n\t"
  97920. "lsl r6, r6, #16\n\t"
  97921. "adds r5, r5, r6\n\t"
  97922. "adcs r3, r3, r7\n\t"
  97923. "adc r4, r4, #0\n\t"
  97924. #else
  97925. "umull r6, r7, r8, r9\n\t"
  97926. "adds r5, r5, r6\n\t"
  97927. "adcs r3, r3, r7\n\t"
  97928. "adc r4, r4, #0\n\t"
  97929. #endif
  97930. /* A[0] * B[8] */
  97931. "ldr r8, [%[a]]\n\t"
  97932. "ldr r9, [%[b], #32]\n\t"
  97933. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97934. "lsl r6, r8, #16\n\t"
  97935. "lsl r7, r9, #16\n\t"
  97936. "lsr r6, r6, #16\n\t"
  97937. "lsr r7, r7, #16\n\t"
  97938. "mul r7, r6, r7\n\t"
  97939. "adds r5, r5, r7\n\t"
  97940. "adcs r3, r3, #0\n\t"
  97941. "adc r4, r4, #0\n\t"
  97942. "lsr r7, r9, #16\n\t"
  97943. "mul r6, r7, r6\n\t"
  97944. "lsr r7, r6, #16\n\t"
  97945. "lsl r6, r6, #16\n\t"
  97946. "adds r5, r5, r6\n\t"
  97947. "adcs r3, r3, r7\n\t"
  97948. "adc r4, r4, #0\n\t"
  97949. "lsr r6, r8, #16\n\t"
  97950. "lsr r7, r9, #16\n\t"
  97951. "mul r7, r6, r7\n\t"
  97952. "adds r3, r3, r7\n\t"
  97953. "adc r4, r4, #0\n\t"
  97954. "lsl r7, r9, #16\n\t"
  97955. "lsr r7, r7, #16\n\t"
  97956. "mul r6, r7, r6\n\t"
  97957. "lsr r7, r6, #16\n\t"
  97958. "lsl r6, r6, #16\n\t"
  97959. "adds r5, r5, r6\n\t"
  97960. "adcs r3, r3, r7\n\t"
  97961. "adc r4, r4, #0\n\t"
  97962. #else
  97963. "umull r6, r7, r8, r9\n\t"
  97964. "adds r5, r5, r6\n\t"
  97965. "adcs r3, r3, r7\n\t"
  97966. "adc r4, r4, #0\n\t"
  97967. #endif
  97968. "str r5, [sp, #32]\n\t"
  97969. /* A[0] * B[9] */
  97970. "ldr r9, [%[b], #36]\n\t"
  97971. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  97972. "lsl r6, r8, #16\n\t"
  97973. "lsl r7, r9, #16\n\t"
  97974. "lsr r6, r6, #16\n\t"
  97975. "lsr r7, r7, #16\n\t"
  97976. "mul r7, r6, r7\n\t"
  97977. "adds r3, r3, r7\n\t"
  97978. "adcs r4, r4, #0\n\t"
  97979. "mov r5, #0\n\t"
  97980. "adc r5, r5, #0\n\t"
  97981. "lsr r7, r9, #16\n\t"
  97982. "mul r6, r7, r6\n\t"
  97983. "lsr r7, r6, #16\n\t"
  97984. "lsl r6, r6, #16\n\t"
  97985. "adds r3, r3, r6\n\t"
  97986. "adcs r4, r4, r7\n\t"
  97987. "adc r5, r5, #0\n\t"
  97988. "lsr r6, r8, #16\n\t"
  97989. "lsr r7, r9, #16\n\t"
  97990. "mul r7, r6, r7\n\t"
  97991. "adds r4, r4, r7\n\t"
  97992. "adc r5, r5, #0\n\t"
  97993. "lsl r7, r9, #16\n\t"
  97994. "lsr r7, r7, #16\n\t"
  97995. "mul r6, r7, r6\n\t"
  97996. "lsr r7, r6, #16\n\t"
  97997. "lsl r6, r6, #16\n\t"
  97998. "adds r3, r3, r6\n\t"
  97999. "adcs r4, r4, r7\n\t"
  98000. "adc r5, r5, #0\n\t"
  98001. #else
  98002. "umull r6, r7, r8, r9\n\t"
  98003. "adds r3, r3, r6\n\t"
  98004. "adcs r4, r4, r7\n\t"
  98005. "mov r5, #0\n\t"
  98006. "adc r5, r5, #0\n\t"
  98007. #endif
  98008. /* A[1] * B[8] */
  98009. "ldr r8, [%[a], #4]\n\t"
  98010. "ldr r9, [%[b], #32]\n\t"
  98011. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98012. "lsl r6, r8, #16\n\t"
  98013. "lsl r7, r9, #16\n\t"
  98014. "lsr r6, r6, #16\n\t"
  98015. "lsr r7, r7, #16\n\t"
  98016. "mul r7, r6, r7\n\t"
  98017. "adds r3, r3, r7\n\t"
  98018. "adcs r4, r4, #0\n\t"
  98019. "adc r5, r5, #0\n\t"
  98020. "lsr r7, r9, #16\n\t"
  98021. "mul r6, r7, r6\n\t"
  98022. "lsr r7, r6, #16\n\t"
  98023. "lsl r6, r6, #16\n\t"
  98024. "adds r3, r3, r6\n\t"
  98025. "adcs r4, r4, r7\n\t"
  98026. "adc r5, r5, #0\n\t"
  98027. "lsr r6, r8, #16\n\t"
  98028. "lsr r7, r9, #16\n\t"
  98029. "mul r7, r6, r7\n\t"
  98030. "adds r4, r4, r7\n\t"
  98031. "adc r5, r5, #0\n\t"
  98032. "lsl r7, r9, #16\n\t"
  98033. "lsr r7, r7, #16\n\t"
  98034. "mul r6, r7, r6\n\t"
  98035. "lsr r7, r6, #16\n\t"
  98036. "lsl r6, r6, #16\n\t"
  98037. "adds r3, r3, r6\n\t"
  98038. "adcs r4, r4, r7\n\t"
  98039. "adc r5, r5, #0\n\t"
  98040. #else
  98041. "umull r6, r7, r8, r9\n\t"
  98042. "adds r3, r3, r6\n\t"
  98043. "adcs r4, r4, r7\n\t"
  98044. "adc r5, r5, #0\n\t"
  98045. #endif
  98046. /* A[2] * B[7] */
  98047. "ldr r8, [%[a], #8]\n\t"
  98048. "ldr r9, [%[b], #28]\n\t"
  98049. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98050. "lsl r6, r8, #16\n\t"
  98051. "lsl r7, r9, #16\n\t"
  98052. "lsr r6, r6, #16\n\t"
  98053. "lsr r7, r7, #16\n\t"
  98054. "mul r7, r6, r7\n\t"
  98055. "adds r3, r3, r7\n\t"
  98056. "adcs r4, r4, #0\n\t"
  98057. "adc r5, r5, #0\n\t"
  98058. "lsr r7, r9, #16\n\t"
  98059. "mul r6, r7, r6\n\t"
  98060. "lsr r7, r6, #16\n\t"
  98061. "lsl r6, r6, #16\n\t"
  98062. "adds r3, r3, r6\n\t"
  98063. "adcs r4, r4, r7\n\t"
  98064. "adc r5, r5, #0\n\t"
  98065. "lsr r6, r8, #16\n\t"
  98066. "lsr r7, r9, #16\n\t"
  98067. "mul r7, r6, r7\n\t"
  98068. "adds r4, r4, r7\n\t"
  98069. "adc r5, r5, #0\n\t"
  98070. "lsl r7, r9, #16\n\t"
  98071. "lsr r7, r7, #16\n\t"
  98072. "mul r6, r7, r6\n\t"
  98073. "lsr r7, r6, #16\n\t"
  98074. "lsl r6, r6, #16\n\t"
  98075. "adds r3, r3, r6\n\t"
  98076. "adcs r4, r4, r7\n\t"
  98077. "adc r5, r5, #0\n\t"
  98078. #else
  98079. "umull r6, r7, r8, r9\n\t"
  98080. "adds r3, r3, r6\n\t"
  98081. "adcs r4, r4, r7\n\t"
  98082. "adc r5, r5, #0\n\t"
  98083. #endif
  98084. /* A[3] * B[6] */
  98085. "ldr r8, [%[a], #12]\n\t"
  98086. "ldr r9, [%[b], #24]\n\t"
  98087. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98088. "lsl r6, r8, #16\n\t"
  98089. "lsl r7, r9, #16\n\t"
  98090. "lsr r6, r6, #16\n\t"
  98091. "lsr r7, r7, #16\n\t"
  98092. "mul r7, r6, r7\n\t"
  98093. "adds r3, r3, r7\n\t"
  98094. "adcs r4, r4, #0\n\t"
  98095. "adc r5, r5, #0\n\t"
  98096. "lsr r7, r9, #16\n\t"
  98097. "mul r6, r7, r6\n\t"
  98098. "lsr r7, r6, #16\n\t"
  98099. "lsl r6, r6, #16\n\t"
  98100. "adds r3, r3, r6\n\t"
  98101. "adcs r4, r4, r7\n\t"
  98102. "adc r5, r5, #0\n\t"
  98103. "lsr r6, r8, #16\n\t"
  98104. "lsr r7, r9, #16\n\t"
  98105. "mul r7, r6, r7\n\t"
  98106. "adds r4, r4, r7\n\t"
  98107. "adc r5, r5, #0\n\t"
  98108. "lsl r7, r9, #16\n\t"
  98109. "lsr r7, r7, #16\n\t"
  98110. "mul r6, r7, r6\n\t"
  98111. "lsr r7, r6, #16\n\t"
  98112. "lsl r6, r6, #16\n\t"
  98113. "adds r3, r3, r6\n\t"
  98114. "adcs r4, r4, r7\n\t"
  98115. "adc r5, r5, #0\n\t"
  98116. #else
  98117. "umull r6, r7, r8, r9\n\t"
  98118. "adds r3, r3, r6\n\t"
  98119. "adcs r4, r4, r7\n\t"
  98120. "adc r5, r5, #0\n\t"
  98121. #endif
  98122. /* A[4] * B[5] */
  98123. "ldr r9, [%[b], #20]\n\t"
  98124. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98125. "lsl r6, r11, #16\n\t"
  98126. "lsl r7, r9, #16\n\t"
  98127. "lsr r6, r6, #16\n\t"
  98128. "lsr r7, r7, #16\n\t"
  98129. "mul r7, r6, r7\n\t"
  98130. "adds r3, r3, r7\n\t"
  98131. "adcs r4, r4, #0\n\t"
  98132. "adc r5, r5, #0\n\t"
  98133. "lsr r7, r9, #16\n\t"
  98134. "mul r6, r7, r6\n\t"
  98135. "lsr r7, r6, #16\n\t"
  98136. "lsl r6, r6, #16\n\t"
  98137. "adds r3, r3, r6\n\t"
  98138. "adcs r4, r4, r7\n\t"
  98139. "adc r5, r5, #0\n\t"
  98140. "lsr r6, r11, #16\n\t"
  98141. "lsr r7, r9, #16\n\t"
  98142. "mul r7, r6, r7\n\t"
  98143. "adds r4, r4, r7\n\t"
  98144. "adc r5, r5, #0\n\t"
  98145. "lsl r7, r9, #16\n\t"
  98146. "lsr r7, r7, #16\n\t"
  98147. "mul r6, r7, r6\n\t"
  98148. "lsr r7, r6, #16\n\t"
  98149. "lsl r6, r6, #16\n\t"
  98150. "adds r3, r3, r6\n\t"
  98151. "adcs r4, r4, r7\n\t"
  98152. "adc r5, r5, #0\n\t"
  98153. #else
  98154. "umull r6, r7, r11, r9\n\t"
  98155. "adds r3, r3, r6\n\t"
  98156. "adcs r4, r4, r7\n\t"
  98157. "adc r5, r5, #0\n\t"
  98158. #endif
  98159. /* A[5] * B[4] */
  98160. "ldr r8, [%[a], #20]\n\t"
  98161. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98162. "lsl r6, r8, #16\n\t"
  98163. "lsl r7, r12, #16\n\t"
  98164. "lsr r6, r6, #16\n\t"
  98165. "lsr r7, r7, #16\n\t"
  98166. "mul r7, r6, r7\n\t"
  98167. "adds r3, r3, r7\n\t"
  98168. "adcs r4, r4, #0\n\t"
  98169. "adc r5, r5, #0\n\t"
  98170. "lsr r7, r12, #16\n\t"
  98171. "mul r6, r7, r6\n\t"
  98172. "lsr r7, r6, #16\n\t"
  98173. "lsl r6, r6, #16\n\t"
  98174. "adds r3, r3, r6\n\t"
  98175. "adcs r4, r4, r7\n\t"
  98176. "adc r5, r5, #0\n\t"
  98177. "lsr r6, r8, #16\n\t"
  98178. "lsr r7, r12, #16\n\t"
  98179. "mul r7, r6, r7\n\t"
  98180. "adds r4, r4, r7\n\t"
  98181. "adc r5, r5, #0\n\t"
  98182. "lsl r7, r12, #16\n\t"
  98183. "lsr r7, r7, #16\n\t"
  98184. "mul r6, r7, r6\n\t"
  98185. "lsr r7, r6, #16\n\t"
  98186. "lsl r6, r6, #16\n\t"
  98187. "adds r3, r3, r6\n\t"
  98188. "adcs r4, r4, r7\n\t"
  98189. "adc r5, r5, #0\n\t"
  98190. #else
  98191. "umull r6, r7, r8, r12\n\t"
  98192. "adds r3, r3, r6\n\t"
  98193. "adcs r4, r4, r7\n\t"
  98194. "adc r5, r5, #0\n\t"
  98195. #endif
  98196. /* A[6] * B[3] */
  98197. "ldr r8, [%[a], #24]\n\t"
  98198. "ldr r9, [%[b], #12]\n\t"
  98199. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98200. "lsl r6, r8, #16\n\t"
  98201. "lsl r7, r9, #16\n\t"
  98202. "lsr r6, r6, #16\n\t"
  98203. "lsr r7, r7, #16\n\t"
  98204. "mul r7, r6, r7\n\t"
  98205. "adds r3, r3, r7\n\t"
  98206. "adcs r4, r4, #0\n\t"
  98207. "adc r5, r5, #0\n\t"
  98208. "lsr r7, r9, #16\n\t"
  98209. "mul r6, r7, r6\n\t"
  98210. "lsr r7, r6, #16\n\t"
  98211. "lsl r6, r6, #16\n\t"
  98212. "adds r3, r3, r6\n\t"
  98213. "adcs r4, r4, r7\n\t"
  98214. "adc r5, r5, #0\n\t"
  98215. "lsr r6, r8, #16\n\t"
  98216. "lsr r7, r9, #16\n\t"
  98217. "mul r7, r6, r7\n\t"
  98218. "adds r4, r4, r7\n\t"
  98219. "adc r5, r5, #0\n\t"
  98220. "lsl r7, r9, #16\n\t"
  98221. "lsr r7, r7, #16\n\t"
  98222. "mul r6, r7, r6\n\t"
  98223. "lsr r7, r6, #16\n\t"
  98224. "lsl r6, r6, #16\n\t"
  98225. "adds r3, r3, r6\n\t"
  98226. "adcs r4, r4, r7\n\t"
  98227. "adc r5, r5, #0\n\t"
  98228. #else
  98229. "umull r6, r7, r8, r9\n\t"
  98230. "adds r3, r3, r6\n\t"
  98231. "adcs r4, r4, r7\n\t"
  98232. "adc r5, r5, #0\n\t"
  98233. #endif
  98234. /* A[7] * B[2] */
  98235. "ldr r8, [%[a], #28]\n\t"
  98236. "ldr r9, [%[b], #8]\n\t"
  98237. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98238. "lsl r6, r8, #16\n\t"
  98239. "lsl r7, r9, #16\n\t"
  98240. "lsr r6, r6, #16\n\t"
  98241. "lsr r7, r7, #16\n\t"
  98242. "mul r7, r6, r7\n\t"
  98243. "adds r3, r3, r7\n\t"
  98244. "adcs r4, r4, #0\n\t"
  98245. "adc r5, r5, #0\n\t"
  98246. "lsr r7, r9, #16\n\t"
  98247. "mul r6, r7, r6\n\t"
  98248. "lsr r7, r6, #16\n\t"
  98249. "lsl r6, r6, #16\n\t"
  98250. "adds r3, r3, r6\n\t"
  98251. "adcs r4, r4, r7\n\t"
  98252. "adc r5, r5, #0\n\t"
  98253. "lsr r6, r8, #16\n\t"
  98254. "lsr r7, r9, #16\n\t"
  98255. "mul r7, r6, r7\n\t"
  98256. "adds r4, r4, r7\n\t"
  98257. "adc r5, r5, #0\n\t"
  98258. "lsl r7, r9, #16\n\t"
  98259. "lsr r7, r7, #16\n\t"
  98260. "mul r6, r7, r6\n\t"
  98261. "lsr r7, r6, #16\n\t"
  98262. "lsl r6, r6, #16\n\t"
  98263. "adds r3, r3, r6\n\t"
  98264. "adcs r4, r4, r7\n\t"
  98265. "adc r5, r5, #0\n\t"
  98266. #else
  98267. "umull r6, r7, r8, r9\n\t"
  98268. "adds r3, r3, r6\n\t"
  98269. "adcs r4, r4, r7\n\t"
  98270. "adc r5, r5, #0\n\t"
  98271. #endif
  98272. /* A[8] * B[1] */
  98273. "ldr r8, [%[a], #32]\n\t"
  98274. "ldr r9, [%[b], #4]\n\t"
  98275. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98276. "lsl r6, r8, #16\n\t"
  98277. "lsl r7, r9, #16\n\t"
  98278. "lsr r6, r6, #16\n\t"
  98279. "lsr r7, r7, #16\n\t"
  98280. "mul r7, r6, r7\n\t"
  98281. "adds r3, r3, r7\n\t"
  98282. "adcs r4, r4, #0\n\t"
  98283. "adc r5, r5, #0\n\t"
  98284. "lsr r7, r9, #16\n\t"
  98285. "mul r6, r7, r6\n\t"
  98286. "lsr r7, r6, #16\n\t"
  98287. "lsl r6, r6, #16\n\t"
  98288. "adds r3, r3, r6\n\t"
  98289. "adcs r4, r4, r7\n\t"
  98290. "adc r5, r5, #0\n\t"
  98291. "lsr r6, r8, #16\n\t"
  98292. "lsr r7, r9, #16\n\t"
  98293. "mul r7, r6, r7\n\t"
  98294. "adds r4, r4, r7\n\t"
  98295. "adc r5, r5, #0\n\t"
  98296. "lsl r7, r9, #16\n\t"
  98297. "lsr r7, r7, #16\n\t"
  98298. "mul r6, r7, r6\n\t"
  98299. "lsr r7, r6, #16\n\t"
  98300. "lsl r6, r6, #16\n\t"
  98301. "adds r3, r3, r6\n\t"
  98302. "adcs r4, r4, r7\n\t"
  98303. "adc r5, r5, #0\n\t"
  98304. #else
  98305. "umull r6, r7, r8, r9\n\t"
  98306. "adds r3, r3, r6\n\t"
  98307. "adcs r4, r4, r7\n\t"
  98308. "adc r5, r5, #0\n\t"
  98309. #endif
  98310. /* A[9] * B[0] */
  98311. "ldr r8, [%[a], #36]\n\t"
  98312. "ldr r9, [%[b]]\n\t"
  98313. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98314. "lsl r6, r8, #16\n\t"
  98315. "lsl r7, r9, #16\n\t"
  98316. "lsr r6, r6, #16\n\t"
  98317. "lsr r7, r7, #16\n\t"
  98318. "mul r7, r6, r7\n\t"
  98319. "adds r3, r3, r7\n\t"
  98320. "adcs r4, r4, #0\n\t"
  98321. "adc r5, r5, #0\n\t"
  98322. "lsr r7, r9, #16\n\t"
  98323. "mul r6, r7, r6\n\t"
  98324. "lsr r7, r6, #16\n\t"
  98325. "lsl r6, r6, #16\n\t"
  98326. "adds r3, r3, r6\n\t"
  98327. "adcs r4, r4, r7\n\t"
  98328. "adc r5, r5, #0\n\t"
  98329. "lsr r6, r8, #16\n\t"
  98330. "lsr r7, r9, #16\n\t"
  98331. "mul r7, r6, r7\n\t"
  98332. "adds r4, r4, r7\n\t"
  98333. "adc r5, r5, #0\n\t"
  98334. "lsl r7, r9, #16\n\t"
  98335. "lsr r7, r7, #16\n\t"
  98336. "mul r6, r7, r6\n\t"
  98337. "lsr r7, r6, #16\n\t"
  98338. "lsl r6, r6, #16\n\t"
  98339. "adds r3, r3, r6\n\t"
  98340. "adcs r4, r4, r7\n\t"
  98341. "adc r5, r5, #0\n\t"
  98342. #else
  98343. "umull r6, r7, r8, r9\n\t"
  98344. "adds r3, r3, r6\n\t"
  98345. "adcs r4, r4, r7\n\t"
  98346. "adc r5, r5, #0\n\t"
  98347. #endif
  98348. "str r3, [sp, #36]\n\t"
  98349. /* A[10] * B[0] */
  98350. "ldr r8, [%[a], #40]\n\t"
  98351. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98352. "lsl r6, r8, #16\n\t"
  98353. "lsl r7, r9, #16\n\t"
  98354. "lsr r6, r6, #16\n\t"
  98355. "lsr r7, r7, #16\n\t"
  98356. "mul r7, r6, r7\n\t"
  98357. "adds r4, r4, r7\n\t"
  98358. "adcs r5, r5, #0\n\t"
  98359. "mov r3, #0\n\t"
  98360. "adc r3, r3, #0\n\t"
  98361. "lsr r7, r9, #16\n\t"
  98362. "mul r6, r7, r6\n\t"
  98363. "lsr r7, r6, #16\n\t"
  98364. "lsl r6, r6, #16\n\t"
  98365. "adds r4, r4, r6\n\t"
  98366. "adcs r5, r5, r7\n\t"
  98367. "adc r3, r3, #0\n\t"
  98368. "lsr r6, r8, #16\n\t"
  98369. "lsr r7, r9, #16\n\t"
  98370. "mul r7, r6, r7\n\t"
  98371. "adds r5, r5, r7\n\t"
  98372. "adc r3, r3, #0\n\t"
  98373. "lsl r7, r9, #16\n\t"
  98374. "lsr r7, r7, #16\n\t"
  98375. "mul r6, r7, r6\n\t"
  98376. "lsr r7, r6, #16\n\t"
  98377. "lsl r6, r6, #16\n\t"
  98378. "adds r4, r4, r6\n\t"
  98379. "adcs r5, r5, r7\n\t"
  98380. "adc r3, r3, #0\n\t"
  98381. #else
  98382. "umull r6, r7, r8, r9\n\t"
  98383. "adds r4, r4, r6\n\t"
  98384. "adcs r5, r5, r7\n\t"
  98385. "mov r3, #0\n\t"
  98386. "adc r3, r3, #0\n\t"
  98387. #endif
  98388. /* A[9] * B[1] */
  98389. "ldr r8, [%[a], #36]\n\t"
  98390. "ldr r9, [%[b], #4]\n\t"
  98391. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98392. "lsl r6, r8, #16\n\t"
  98393. "lsl r7, r9, #16\n\t"
  98394. "lsr r6, r6, #16\n\t"
  98395. "lsr r7, r7, #16\n\t"
  98396. "mul r7, r6, r7\n\t"
  98397. "adds r4, r4, r7\n\t"
  98398. "adcs r5, r5, #0\n\t"
  98399. "adc r3, r3, #0\n\t"
  98400. "lsr r7, r9, #16\n\t"
  98401. "mul r6, r7, r6\n\t"
  98402. "lsr r7, r6, #16\n\t"
  98403. "lsl r6, r6, #16\n\t"
  98404. "adds r4, r4, r6\n\t"
  98405. "adcs r5, r5, r7\n\t"
  98406. "adc r3, r3, #0\n\t"
  98407. "lsr r6, r8, #16\n\t"
  98408. "lsr r7, r9, #16\n\t"
  98409. "mul r7, r6, r7\n\t"
  98410. "adds r5, r5, r7\n\t"
  98411. "adc r3, r3, #0\n\t"
  98412. "lsl r7, r9, #16\n\t"
  98413. "lsr r7, r7, #16\n\t"
  98414. "mul r6, r7, r6\n\t"
  98415. "lsr r7, r6, #16\n\t"
  98416. "lsl r6, r6, #16\n\t"
  98417. "adds r4, r4, r6\n\t"
  98418. "adcs r5, r5, r7\n\t"
  98419. "adc r3, r3, #0\n\t"
  98420. #else
  98421. "umull r6, r7, r8, r9\n\t"
  98422. "adds r4, r4, r6\n\t"
  98423. "adcs r5, r5, r7\n\t"
  98424. "adc r3, r3, #0\n\t"
  98425. #endif
  98426. /* A[8] * B[2] */
  98427. "ldr r8, [%[a], #32]\n\t"
  98428. "ldr r9, [%[b], #8]\n\t"
  98429. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98430. "lsl r6, r8, #16\n\t"
  98431. "lsl r7, r9, #16\n\t"
  98432. "lsr r6, r6, #16\n\t"
  98433. "lsr r7, r7, #16\n\t"
  98434. "mul r7, r6, r7\n\t"
  98435. "adds r4, r4, r7\n\t"
  98436. "adcs r5, r5, #0\n\t"
  98437. "adc r3, r3, #0\n\t"
  98438. "lsr r7, r9, #16\n\t"
  98439. "mul r6, r7, r6\n\t"
  98440. "lsr r7, r6, #16\n\t"
  98441. "lsl r6, r6, #16\n\t"
  98442. "adds r4, r4, r6\n\t"
  98443. "adcs r5, r5, r7\n\t"
  98444. "adc r3, r3, #0\n\t"
  98445. "lsr r6, r8, #16\n\t"
  98446. "lsr r7, r9, #16\n\t"
  98447. "mul r7, r6, r7\n\t"
  98448. "adds r5, r5, r7\n\t"
  98449. "adc r3, r3, #0\n\t"
  98450. "lsl r7, r9, #16\n\t"
  98451. "lsr r7, r7, #16\n\t"
  98452. "mul r6, r7, r6\n\t"
  98453. "lsr r7, r6, #16\n\t"
  98454. "lsl r6, r6, #16\n\t"
  98455. "adds r4, r4, r6\n\t"
  98456. "adcs r5, r5, r7\n\t"
  98457. "adc r3, r3, #0\n\t"
  98458. #else
  98459. "umull r6, r7, r8, r9\n\t"
  98460. "adds r4, r4, r6\n\t"
  98461. "adcs r5, r5, r7\n\t"
  98462. "adc r3, r3, #0\n\t"
  98463. #endif
  98464. /* A[7] * B[3] */
  98465. "ldr r8, [%[a], #28]\n\t"
  98466. "ldr r9, [%[b], #12]\n\t"
  98467. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98468. "lsl r6, r8, #16\n\t"
  98469. "lsl r7, r9, #16\n\t"
  98470. "lsr r6, r6, #16\n\t"
  98471. "lsr r7, r7, #16\n\t"
  98472. "mul r7, r6, r7\n\t"
  98473. "adds r4, r4, r7\n\t"
  98474. "adcs r5, r5, #0\n\t"
  98475. "adc r3, r3, #0\n\t"
  98476. "lsr r7, r9, #16\n\t"
  98477. "mul r6, r7, r6\n\t"
  98478. "lsr r7, r6, #16\n\t"
  98479. "lsl r6, r6, #16\n\t"
  98480. "adds r4, r4, r6\n\t"
  98481. "adcs r5, r5, r7\n\t"
  98482. "adc r3, r3, #0\n\t"
  98483. "lsr r6, r8, #16\n\t"
  98484. "lsr r7, r9, #16\n\t"
  98485. "mul r7, r6, r7\n\t"
  98486. "adds r5, r5, r7\n\t"
  98487. "adc r3, r3, #0\n\t"
  98488. "lsl r7, r9, #16\n\t"
  98489. "lsr r7, r7, #16\n\t"
  98490. "mul r6, r7, r6\n\t"
  98491. "lsr r7, r6, #16\n\t"
  98492. "lsl r6, r6, #16\n\t"
  98493. "adds r4, r4, r6\n\t"
  98494. "adcs r5, r5, r7\n\t"
  98495. "adc r3, r3, #0\n\t"
  98496. #else
  98497. "umull r6, r7, r8, r9\n\t"
  98498. "adds r4, r4, r6\n\t"
  98499. "adcs r5, r5, r7\n\t"
  98500. "adc r3, r3, #0\n\t"
  98501. #endif
  98502. /* A[6] * B[4] */
  98503. "ldr r8, [%[a], #24]\n\t"
  98504. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98505. "lsl r6, r8, #16\n\t"
  98506. "lsl r7, r12, #16\n\t"
  98507. "lsr r6, r6, #16\n\t"
  98508. "lsr r7, r7, #16\n\t"
  98509. "mul r7, r6, r7\n\t"
  98510. "adds r4, r4, r7\n\t"
  98511. "adcs r5, r5, #0\n\t"
  98512. "adc r3, r3, #0\n\t"
  98513. "lsr r7, r12, #16\n\t"
  98514. "mul r6, r7, r6\n\t"
  98515. "lsr r7, r6, #16\n\t"
  98516. "lsl r6, r6, #16\n\t"
  98517. "adds r4, r4, r6\n\t"
  98518. "adcs r5, r5, r7\n\t"
  98519. "adc r3, r3, #0\n\t"
  98520. "lsr r6, r8, #16\n\t"
  98521. "lsr r7, r12, #16\n\t"
  98522. "mul r7, r6, r7\n\t"
  98523. "adds r5, r5, r7\n\t"
  98524. "adc r3, r3, #0\n\t"
  98525. "lsl r7, r12, #16\n\t"
  98526. "lsr r7, r7, #16\n\t"
  98527. "mul r6, r7, r6\n\t"
  98528. "lsr r7, r6, #16\n\t"
  98529. "lsl r6, r6, #16\n\t"
  98530. "adds r4, r4, r6\n\t"
  98531. "adcs r5, r5, r7\n\t"
  98532. "adc r3, r3, #0\n\t"
  98533. #else
  98534. "umull r6, r7, r8, r12\n\t"
  98535. "adds r4, r4, r6\n\t"
  98536. "adcs r5, r5, r7\n\t"
  98537. "adc r3, r3, #0\n\t"
  98538. #endif
  98539. /* A[5] * B[5] */
  98540. "ldr r11, [%[a], #20]\n\t"
  98541. "ldr r12, [%[b], #20]\n\t"
  98542. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98543. "lsl r6, r11, #16\n\t"
  98544. "lsl r7, r12, #16\n\t"
  98545. "lsr r6, r6, #16\n\t"
  98546. "lsr r7, r7, #16\n\t"
  98547. "mul r7, r6, r7\n\t"
  98548. "adds r4, r4, r7\n\t"
  98549. "adcs r5, r5, #0\n\t"
  98550. "adc r3, r3, #0\n\t"
  98551. "lsr r7, r12, #16\n\t"
  98552. "mul r6, r7, r6\n\t"
  98553. "lsr r7, r6, #16\n\t"
  98554. "lsl r6, r6, #16\n\t"
  98555. "adds r4, r4, r6\n\t"
  98556. "adcs r5, r5, r7\n\t"
  98557. "adc r3, r3, #0\n\t"
  98558. "lsr r6, r11, #16\n\t"
  98559. "lsr r7, r12, #16\n\t"
  98560. "mul r7, r6, r7\n\t"
  98561. "adds r5, r5, r7\n\t"
  98562. "adc r3, r3, #0\n\t"
  98563. "lsl r7, r12, #16\n\t"
  98564. "lsr r7, r7, #16\n\t"
  98565. "mul r6, r7, r6\n\t"
  98566. "lsr r7, r6, #16\n\t"
  98567. "lsl r6, r6, #16\n\t"
  98568. "adds r4, r4, r6\n\t"
  98569. "adcs r5, r5, r7\n\t"
  98570. "adc r3, r3, #0\n\t"
  98571. #else
  98572. "umull r6, r7, r11, r12\n\t"
  98573. "adds r4, r4, r6\n\t"
  98574. "adcs r5, r5, r7\n\t"
  98575. "adc r3, r3, #0\n\t"
  98576. #endif
  98577. /* A[4] * B[6] */
  98578. "ldr r8, [%[a], #16]\n\t"
  98579. "ldr r9, [%[b], #24]\n\t"
  98580. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98581. "lsl r6, r8, #16\n\t"
  98582. "lsl r7, r9, #16\n\t"
  98583. "lsr r6, r6, #16\n\t"
  98584. "lsr r7, r7, #16\n\t"
  98585. "mul r7, r6, r7\n\t"
  98586. "adds r4, r4, r7\n\t"
  98587. "adcs r5, r5, #0\n\t"
  98588. "adc r3, r3, #0\n\t"
  98589. "lsr r7, r9, #16\n\t"
  98590. "mul r6, r7, r6\n\t"
  98591. "lsr r7, r6, #16\n\t"
  98592. "lsl r6, r6, #16\n\t"
  98593. "adds r4, r4, r6\n\t"
  98594. "adcs r5, r5, r7\n\t"
  98595. "adc r3, r3, #0\n\t"
  98596. "lsr r6, r8, #16\n\t"
  98597. "lsr r7, r9, #16\n\t"
  98598. "mul r7, r6, r7\n\t"
  98599. "adds r5, r5, r7\n\t"
  98600. "adc r3, r3, #0\n\t"
  98601. "lsl r7, r9, #16\n\t"
  98602. "lsr r7, r7, #16\n\t"
  98603. "mul r6, r7, r6\n\t"
  98604. "lsr r7, r6, #16\n\t"
  98605. "lsl r6, r6, #16\n\t"
  98606. "adds r4, r4, r6\n\t"
  98607. "adcs r5, r5, r7\n\t"
  98608. "adc r3, r3, #0\n\t"
  98609. #else
  98610. "umull r6, r7, r8, r9\n\t"
  98611. "adds r4, r4, r6\n\t"
  98612. "adcs r5, r5, r7\n\t"
  98613. "adc r3, r3, #0\n\t"
  98614. #endif
  98615. /* A[3] * B[7] */
  98616. "ldr r8, [%[a], #12]\n\t"
  98617. "ldr r9, [%[b], #28]\n\t"
  98618. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98619. "lsl r6, r8, #16\n\t"
  98620. "lsl r7, r9, #16\n\t"
  98621. "lsr r6, r6, #16\n\t"
  98622. "lsr r7, r7, #16\n\t"
  98623. "mul r7, r6, r7\n\t"
  98624. "adds r4, r4, r7\n\t"
  98625. "adcs r5, r5, #0\n\t"
  98626. "adc r3, r3, #0\n\t"
  98627. "lsr r7, r9, #16\n\t"
  98628. "mul r6, r7, r6\n\t"
  98629. "lsr r7, r6, #16\n\t"
  98630. "lsl r6, r6, #16\n\t"
  98631. "adds r4, r4, r6\n\t"
  98632. "adcs r5, r5, r7\n\t"
  98633. "adc r3, r3, #0\n\t"
  98634. "lsr r6, r8, #16\n\t"
  98635. "lsr r7, r9, #16\n\t"
  98636. "mul r7, r6, r7\n\t"
  98637. "adds r5, r5, r7\n\t"
  98638. "adc r3, r3, #0\n\t"
  98639. "lsl r7, r9, #16\n\t"
  98640. "lsr r7, r7, #16\n\t"
  98641. "mul r6, r7, r6\n\t"
  98642. "lsr r7, r6, #16\n\t"
  98643. "lsl r6, r6, #16\n\t"
  98644. "adds r4, r4, r6\n\t"
  98645. "adcs r5, r5, r7\n\t"
  98646. "adc r3, r3, #0\n\t"
  98647. #else
  98648. "umull r6, r7, r8, r9\n\t"
  98649. "adds r4, r4, r6\n\t"
  98650. "adcs r5, r5, r7\n\t"
  98651. "adc r3, r3, #0\n\t"
  98652. #endif
  98653. /* A[2] * B[8] */
  98654. "ldr r8, [%[a], #8]\n\t"
  98655. "ldr r9, [%[b], #32]\n\t"
  98656. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98657. "lsl r6, r8, #16\n\t"
  98658. "lsl r7, r9, #16\n\t"
  98659. "lsr r6, r6, #16\n\t"
  98660. "lsr r7, r7, #16\n\t"
  98661. "mul r7, r6, r7\n\t"
  98662. "adds r4, r4, r7\n\t"
  98663. "adcs r5, r5, #0\n\t"
  98664. "adc r3, r3, #0\n\t"
  98665. "lsr r7, r9, #16\n\t"
  98666. "mul r6, r7, r6\n\t"
  98667. "lsr r7, r6, #16\n\t"
  98668. "lsl r6, r6, #16\n\t"
  98669. "adds r4, r4, r6\n\t"
  98670. "adcs r5, r5, r7\n\t"
  98671. "adc r3, r3, #0\n\t"
  98672. "lsr r6, r8, #16\n\t"
  98673. "lsr r7, r9, #16\n\t"
  98674. "mul r7, r6, r7\n\t"
  98675. "adds r5, r5, r7\n\t"
  98676. "adc r3, r3, #0\n\t"
  98677. "lsl r7, r9, #16\n\t"
  98678. "lsr r7, r7, #16\n\t"
  98679. "mul r6, r7, r6\n\t"
  98680. "lsr r7, r6, #16\n\t"
  98681. "lsl r6, r6, #16\n\t"
  98682. "adds r4, r4, r6\n\t"
  98683. "adcs r5, r5, r7\n\t"
  98684. "adc r3, r3, #0\n\t"
  98685. #else
  98686. "umull r6, r7, r8, r9\n\t"
  98687. "adds r4, r4, r6\n\t"
  98688. "adcs r5, r5, r7\n\t"
  98689. "adc r3, r3, #0\n\t"
  98690. #endif
  98691. /* A[1] * B[9] */
  98692. "ldr r8, [%[a], #4]\n\t"
  98693. "ldr r9, [%[b], #36]\n\t"
  98694. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98695. "lsl r6, r8, #16\n\t"
  98696. "lsl r7, r9, #16\n\t"
  98697. "lsr r6, r6, #16\n\t"
  98698. "lsr r7, r7, #16\n\t"
  98699. "mul r7, r6, r7\n\t"
  98700. "adds r4, r4, r7\n\t"
  98701. "adcs r5, r5, #0\n\t"
  98702. "adc r3, r3, #0\n\t"
  98703. "lsr r7, r9, #16\n\t"
  98704. "mul r6, r7, r6\n\t"
  98705. "lsr r7, r6, #16\n\t"
  98706. "lsl r6, r6, #16\n\t"
  98707. "adds r4, r4, r6\n\t"
  98708. "adcs r5, r5, r7\n\t"
  98709. "adc r3, r3, #0\n\t"
  98710. "lsr r6, r8, #16\n\t"
  98711. "lsr r7, r9, #16\n\t"
  98712. "mul r7, r6, r7\n\t"
  98713. "adds r5, r5, r7\n\t"
  98714. "adc r3, r3, #0\n\t"
  98715. "lsl r7, r9, #16\n\t"
  98716. "lsr r7, r7, #16\n\t"
  98717. "mul r6, r7, r6\n\t"
  98718. "lsr r7, r6, #16\n\t"
  98719. "lsl r6, r6, #16\n\t"
  98720. "adds r4, r4, r6\n\t"
  98721. "adcs r5, r5, r7\n\t"
  98722. "adc r3, r3, #0\n\t"
  98723. #else
  98724. "umull r6, r7, r8, r9\n\t"
  98725. "adds r4, r4, r6\n\t"
  98726. "adcs r5, r5, r7\n\t"
  98727. "adc r3, r3, #0\n\t"
  98728. #endif
  98729. /* A[0] * B[10] */
  98730. "ldr r8, [%[a]]\n\t"
  98731. "ldr r9, [%[b], #40]\n\t"
  98732. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98733. "lsl r6, r8, #16\n\t"
  98734. "lsl r7, r9, #16\n\t"
  98735. "lsr r6, r6, #16\n\t"
  98736. "lsr r7, r7, #16\n\t"
  98737. "mul r7, r6, r7\n\t"
  98738. "adds r4, r4, r7\n\t"
  98739. "adcs r5, r5, #0\n\t"
  98740. "adc r3, r3, #0\n\t"
  98741. "lsr r7, r9, #16\n\t"
  98742. "mul r6, r7, r6\n\t"
  98743. "lsr r7, r6, #16\n\t"
  98744. "lsl r6, r6, #16\n\t"
  98745. "adds r4, r4, r6\n\t"
  98746. "adcs r5, r5, r7\n\t"
  98747. "adc r3, r3, #0\n\t"
  98748. "lsr r6, r8, #16\n\t"
  98749. "lsr r7, r9, #16\n\t"
  98750. "mul r7, r6, r7\n\t"
  98751. "adds r5, r5, r7\n\t"
  98752. "adc r3, r3, #0\n\t"
  98753. "lsl r7, r9, #16\n\t"
  98754. "lsr r7, r7, #16\n\t"
  98755. "mul r6, r7, r6\n\t"
  98756. "lsr r7, r6, #16\n\t"
  98757. "lsl r6, r6, #16\n\t"
  98758. "adds r4, r4, r6\n\t"
  98759. "adcs r5, r5, r7\n\t"
  98760. "adc r3, r3, #0\n\t"
  98761. #else
  98762. "umull r6, r7, r8, r9\n\t"
  98763. "adds r4, r4, r6\n\t"
  98764. "adcs r5, r5, r7\n\t"
  98765. "adc r3, r3, #0\n\t"
  98766. #endif
  98767. "str r4, [sp, #40]\n\t"
  98768. /* A[0] * B[11] */
  98769. "ldr r9, [%[b], #44]\n\t"
  98770. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98771. "lsl r6, r8, #16\n\t"
  98772. "lsl r7, r9, #16\n\t"
  98773. "lsr r6, r6, #16\n\t"
  98774. "lsr r7, r7, #16\n\t"
  98775. "mul r7, r6, r7\n\t"
  98776. "adds r5, r5, r7\n\t"
  98777. "adcs r3, r3, #0\n\t"
  98778. "mov r4, #0\n\t"
  98779. "adc r4, r4, #0\n\t"
  98780. "lsr r7, r9, #16\n\t"
  98781. "mul r6, r7, r6\n\t"
  98782. "lsr r7, r6, #16\n\t"
  98783. "lsl r6, r6, #16\n\t"
  98784. "adds r5, r5, r6\n\t"
  98785. "adcs r3, r3, r7\n\t"
  98786. "adc r4, r4, #0\n\t"
  98787. "lsr r6, r8, #16\n\t"
  98788. "lsr r7, r9, #16\n\t"
  98789. "mul r7, r6, r7\n\t"
  98790. "adds r3, r3, r7\n\t"
  98791. "adc r4, r4, #0\n\t"
  98792. "lsl r7, r9, #16\n\t"
  98793. "lsr r7, r7, #16\n\t"
  98794. "mul r6, r7, r6\n\t"
  98795. "lsr r7, r6, #16\n\t"
  98796. "lsl r6, r6, #16\n\t"
  98797. "adds r5, r5, r6\n\t"
  98798. "adcs r3, r3, r7\n\t"
  98799. "adc r4, r4, #0\n\t"
  98800. #else
  98801. "umull r6, r7, r8, r9\n\t"
  98802. "adds r5, r5, r6\n\t"
  98803. "adcs r3, r3, r7\n\t"
  98804. "mov r4, #0\n\t"
  98805. "adc r4, r4, #0\n\t"
  98806. #endif
  98807. /* A[1] * B[10] */
  98808. "ldr r8, [%[a], #4]\n\t"
  98809. "ldr r9, [%[b], #40]\n\t"
  98810. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98811. "lsl r6, r8, #16\n\t"
  98812. "lsl r7, r9, #16\n\t"
  98813. "lsr r6, r6, #16\n\t"
  98814. "lsr r7, r7, #16\n\t"
  98815. "mul r7, r6, r7\n\t"
  98816. "adds r5, r5, r7\n\t"
  98817. "adcs r3, r3, #0\n\t"
  98818. "adc r4, r4, #0\n\t"
  98819. "lsr r7, r9, #16\n\t"
  98820. "mul r6, r7, r6\n\t"
  98821. "lsr r7, r6, #16\n\t"
  98822. "lsl r6, r6, #16\n\t"
  98823. "adds r5, r5, r6\n\t"
  98824. "adcs r3, r3, r7\n\t"
  98825. "adc r4, r4, #0\n\t"
  98826. "lsr r6, r8, #16\n\t"
  98827. "lsr r7, r9, #16\n\t"
  98828. "mul r7, r6, r7\n\t"
  98829. "adds r3, r3, r7\n\t"
  98830. "adc r4, r4, #0\n\t"
  98831. "lsl r7, r9, #16\n\t"
  98832. "lsr r7, r7, #16\n\t"
  98833. "mul r6, r7, r6\n\t"
  98834. "lsr r7, r6, #16\n\t"
  98835. "lsl r6, r6, #16\n\t"
  98836. "adds r5, r5, r6\n\t"
  98837. "adcs r3, r3, r7\n\t"
  98838. "adc r4, r4, #0\n\t"
  98839. #else
  98840. "umull r6, r7, r8, r9\n\t"
  98841. "adds r5, r5, r6\n\t"
  98842. "adcs r3, r3, r7\n\t"
  98843. "adc r4, r4, #0\n\t"
  98844. #endif
  98845. /* A[2] * B[9] */
  98846. "ldr r8, [%[a], #8]\n\t"
  98847. "ldr r9, [%[b], #36]\n\t"
  98848. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98849. "lsl r6, r8, #16\n\t"
  98850. "lsl r7, r9, #16\n\t"
  98851. "lsr r6, r6, #16\n\t"
  98852. "lsr r7, r7, #16\n\t"
  98853. "mul r7, r6, r7\n\t"
  98854. "adds r5, r5, r7\n\t"
  98855. "adcs r3, r3, #0\n\t"
  98856. "adc r4, r4, #0\n\t"
  98857. "lsr r7, r9, #16\n\t"
  98858. "mul r6, r7, r6\n\t"
  98859. "lsr r7, r6, #16\n\t"
  98860. "lsl r6, r6, #16\n\t"
  98861. "adds r5, r5, r6\n\t"
  98862. "adcs r3, r3, r7\n\t"
  98863. "adc r4, r4, #0\n\t"
  98864. "lsr r6, r8, #16\n\t"
  98865. "lsr r7, r9, #16\n\t"
  98866. "mul r7, r6, r7\n\t"
  98867. "adds r3, r3, r7\n\t"
  98868. "adc r4, r4, #0\n\t"
  98869. "lsl r7, r9, #16\n\t"
  98870. "lsr r7, r7, #16\n\t"
  98871. "mul r6, r7, r6\n\t"
  98872. "lsr r7, r6, #16\n\t"
  98873. "lsl r6, r6, #16\n\t"
  98874. "adds r5, r5, r6\n\t"
  98875. "adcs r3, r3, r7\n\t"
  98876. "adc r4, r4, #0\n\t"
  98877. #else
  98878. "umull r6, r7, r8, r9\n\t"
  98879. "adds r5, r5, r6\n\t"
  98880. "adcs r3, r3, r7\n\t"
  98881. "adc r4, r4, #0\n\t"
  98882. #endif
  98883. /* A[3] * B[8] */
  98884. "ldr r8, [%[a], #12]\n\t"
  98885. "ldr r9, [%[b], #32]\n\t"
  98886. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98887. "lsl r6, r8, #16\n\t"
  98888. "lsl r7, r9, #16\n\t"
  98889. "lsr r6, r6, #16\n\t"
  98890. "lsr r7, r7, #16\n\t"
  98891. "mul r7, r6, r7\n\t"
  98892. "adds r5, r5, r7\n\t"
  98893. "adcs r3, r3, #0\n\t"
  98894. "adc r4, r4, #0\n\t"
  98895. "lsr r7, r9, #16\n\t"
  98896. "mul r6, r7, r6\n\t"
  98897. "lsr r7, r6, #16\n\t"
  98898. "lsl r6, r6, #16\n\t"
  98899. "adds r5, r5, r6\n\t"
  98900. "adcs r3, r3, r7\n\t"
  98901. "adc r4, r4, #0\n\t"
  98902. "lsr r6, r8, #16\n\t"
  98903. "lsr r7, r9, #16\n\t"
  98904. "mul r7, r6, r7\n\t"
  98905. "adds r3, r3, r7\n\t"
  98906. "adc r4, r4, #0\n\t"
  98907. "lsl r7, r9, #16\n\t"
  98908. "lsr r7, r7, #16\n\t"
  98909. "mul r6, r7, r6\n\t"
  98910. "lsr r7, r6, #16\n\t"
  98911. "lsl r6, r6, #16\n\t"
  98912. "adds r5, r5, r6\n\t"
  98913. "adcs r3, r3, r7\n\t"
  98914. "adc r4, r4, #0\n\t"
  98915. #else
  98916. "umull r6, r7, r8, r9\n\t"
  98917. "adds r5, r5, r6\n\t"
  98918. "adcs r3, r3, r7\n\t"
  98919. "adc r4, r4, #0\n\t"
  98920. #endif
  98921. /* A[4] * B[7] */
  98922. "ldr r8, [%[a], #16]\n\t"
  98923. "ldr r9, [%[b], #28]\n\t"
  98924. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98925. "lsl r6, r8, #16\n\t"
  98926. "lsl r7, r9, #16\n\t"
  98927. "lsr r6, r6, #16\n\t"
  98928. "lsr r7, r7, #16\n\t"
  98929. "mul r7, r6, r7\n\t"
  98930. "adds r5, r5, r7\n\t"
  98931. "adcs r3, r3, #0\n\t"
  98932. "adc r4, r4, #0\n\t"
  98933. "lsr r7, r9, #16\n\t"
  98934. "mul r6, r7, r6\n\t"
  98935. "lsr r7, r6, #16\n\t"
  98936. "lsl r6, r6, #16\n\t"
  98937. "adds r5, r5, r6\n\t"
  98938. "adcs r3, r3, r7\n\t"
  98939. "adc r4, r4, #0\n\t"
  98940. "lsr r6, r8, #16\n\t"
  98941. "lsr r7, r9, #16\n\t"
  98942. "mul r7, r6, r7\n\t"
  98943. "adds r3, r3, r7\n\t"
  98944. "adc r4, r4, #0\n\t"
  98945. "lsl r7, r9, #16\n\t"
  98946. "lsr r7, r7, #16\n\t"
  98947. "mul r6, r7, r6\n\t"
  98948. "lsr r7, r6, #16\n\t"
  98949. "lsl r6, r6, #16\n\t"
  98950. "adds r5, r5, r6\n\t"
  98951. "adcs r3, r3, r7\n\t"
  98952. "adc r4, r4, #0\n\t"
  98953. #else
  98954. "umull r6, r7, r8, r9\n\t"
  98955. "adds r5, r5, r6\n\t"
  98956. "adcs r3, r3, r7\n\t"
  98957. "adc r4, r4, #0\n\t"
  98958. #endif
  98959. /* A[5] * B[6] */
  98960. "ldr r9, [%[b], #24]\n\t"
  98961. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98962. "lsl r6, r11, #16\n\t"
  98963. "lsl r7, r9, #16\n\t"
  98964. "lsr r6, r6, #16\n\t"
  98965. "lsr r7, r7, #16\n\t"
  98966. "mul r7, r6, r7\n\t"
  98967. "adds r5, r5, r7\n\t"
  98968. "adcs r3, r3, #0\n\t"
  98969. "adc r4, r4, #0\n\t"
  98970. "lsr r7, r9, #16\n\t"
  98971. "mul r6, r7, r6\n\t"
  98972. "lsr r7, r6, #16\n\t"
  98973. "lsl r6, r6, #16\n\t"
  98974. "adds r5, r5, r6\n\t"
  98975. "adcs r3, r3, r7\n\t"
  98976. "adc r4, r4, #0\n\t"
  98977. "lsr r6, r11, #16\n\t"
  98978. "lsr r7, r9, #16\n\t"
  98979. "mul r7, r6, r7\n\t"
  98980. "adds r3, r3, r7\n\t"
  98981. "adc r4, r4, #0\n\t"
  98982. "lsl r7, r9, #16\n\t"
  98983. "lsr r7, r7, #16\n\t"
  98984. "mul r6, r7, r6\n\t"
  98985. "lsr r7, r6, #16\n\t"
  98986. "lsl r6, r6, #16\n\t"
  98987. "adds r5, r5, r6\n\t"
  98988. "adcs r3, r3, r7\n\t"
  98989. "adc r4, r4, #0\n\t"
  98990. #else
  98991. "umull r6, r7, r11, r9\n\t"
  98992. "adds r5, r5, r6\n\t"
  98993. "adcs r3, r3, r7\n\t"
  98994. "adc r4, r4, #0\n\t"
  98995. #endif
  98996. /* A[6] * B[5] */
  98997. "ldr r8, [%[a], #24]\n\t"
  98998. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  98999. "lsl r6, r8, #16\n\t"
  99000. "lsl r7, r12, #16\n\t"
  99001. "lsr r6, r6, #16\n\t"
  99002. "lsr r7, r7, #16\n\t"
  99003. "mul r7, r6, r7\n\t"
  99004. "adds r5, r5, r7\n\t"
  99005. "adcs r3, r3, #0\n\t"
  99006. "adc r4, r4, #0\n\t"
  99007. "lsr r7, r12, #16\n\t"
  99008. "mul r6, r7, r6\n\t"
  99009. "lsr r7, r6, #16\n\t"
  99010. "lsl r6, r6, #16\n\t"
  99011. "adds r5, r5, r6\n\t"
  99012. "adcs r3, r3, r7\n\t"
  99013. "adc r4, r4, #0\n\t"
  99014. "lsr r6, r8, #16\n\t"
  99015. "lsr r7, r12, #16\n\t"
  99016. "mul r7, r6, r7\n\t"
  99017. "adds r3, r3, r7\n\t"
  99018. "adc r4, r4, #0\n\t"
  99019. "lsl r7, r12, #16\n\t"
  99020. "lsr r7, r7, #16\n\t"
  99021. "mul r6, r7, r6\n\t"
  99022. "lsr r7, r6, #16\n\t"
  99023. "lsl r6, r6, #16\n\t"
  99024. "adds r5, r5, r6\n\t"
  99025. "adcs r3, r3, r7\n\t"
  99026. "adc r4, r4, #0\n\t"
  99027. #else
  99028. "umull r6, r7, r8, r12\n\t"
  99029. "adds r5, r5, r6\n\t"
  99030. "adcs r3, r3, r7\n\t"
  99031. "adc r4, r4, #0\n\t"
  99032. #endif
  99033. /* A[7] * B[4] */
  99034. "ldr r8, [%[a], #28]\n\t"
  99035. "ldr r9, [%[b], #16]\n\t"
  99036. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99037. "lsl r6, r8, #16\n\t"
  99038. "lsl r7, r9, #16\n\t"
  99039. "lsr r6, r6, #16\n\t"
  99040. "lsr r7, r7, #16\n\t"
  99041. "mul r7, r6, r7\n\t"
  99042. "adds r5, r5, r7\n\t"
  99043. "adcs r3, r3, #0\n\t"
  99044. "adc r4, r4, #0\n\t"
  99045. "lsr r7, r9, #16\n\t"
  99046. "mul r6, r7, r6\n\t"
  99047. "lsr r7, r6, #16\n\t"
  99048. "lsl r6, r6, #16\n\t"
  99049. "adds r5, r5, r6\n\t"
  99050. "adcs r3, r3, r7\n\t"
  99051. "adc r4, r4, #0\n\t"
  99052. "lsr r6, r8, #16\n\t"
  99053. "lsr r7, r9, #16\n\t"
  99054. "mul r7, r6, r7\n\t"
  99055. "adds r3, r3, r7\n\t"
  99056. "adc r4, r4, #0\n\t"
  99057. "lsl r7, r9, #16\n\t"
  99058. "lsr r7, r7, #16\n\t"
  99059. "mul r6, r7, r6\n\t"
  99060. "lsr r7, r6, #16\n\t"
  99061. "lsl r6, r6, #16\n\t"
  99062. "adds r5, r5, r6\n\t"
  99063. "adcs r3, r3, r7\n\t"
  99064. "adc r4, r4, #0\n\t"
  99065. #else
  99066. "umull r6, r7, r8, r9\n\t"
  99067. "adds r5, r5, r6\n\t"
  99068. "adcs r3, r3, r7\n\t"
  99069. "adc r4, r4, #0\n\t"
  99070. #endif
  99071. /* A[8] * B[3] */
  99072. "ldr r8, [%[a], #32]\n\t"
  99073. "ldr r9, [%[b], #12]\n\t"
  99074. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99075. "lsl r6, r8, #16\n\t"
  99076. "lsl r7, r9, #16\n\t"
  99077. "lsr r6, r6, #16\n\t"
  99078. "lsr r7, r7, #16\n\t"
  99079. "mul r7, r6, r7\n\t"
  99080. "adds r5, r5, r7\n\t"
  99081. "adcs r3, r3, #0\n\t"
  99082. "adc r4, r4, #0\n\t"
  99083. "lsr r7, r9, #16\n\t"
  99084. "mul r6, r7, r6\n\t"
  99085. "lsr r7, r6, #16\n\t"
  99086. "lsl r6, r6, #16\n\t"
  99087. "adds r5, r5, r6\n\t"
  99088. "adcs r3, r3, r7\n\t"
  99089. "adc r4, r4, #0\n\t"
  99090. "lsr r6, r8, #16\n\t"
  99091. "lsr r7, r9, #16\n\t"
  99092. "mul r7, r6, r7\n\t"
  99093. "adds r3, r3, r7\n\t"
  99094. "adc r4, r4, #0\n\t"
  99095. "lsl r7, r9, #16\n\t"
  99096. "lsr r7, r7, #16\n\t"
  99097. "mul r6, r7, r6\n\t"
  99098. "lsr r7, r6, #16\n\t"
  99099. "lsl r6, r6, #16\n\t"
  99100. "adds r5, r5, r6\n\t"
  99101. "adcs r3, r3, r7\n\t"
  99102. "adc r4, r4, #0\n\t"
  99103. #else
  99104. "umull r6, r7, r8, r9\n\t"
  99105. "adds r5, r5, r6\n\t"
  99106. "adcs r3, r3, r7\n\t"
  99107. "adc r4, r4, #0\n\t"
  99108. #endif
  99109. /* A[9] * B[2] */
  99110. "ldr r8, [%[a], #36]\n\t"
  99111. "ldr r9, [%[b], #8]\n\t"
  99112. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99113. "lsl r6, r8, #16\n\t"
  99114. "lsl r7, r9, #16\n\t"
  99115. "lsr r6, r6, #16\n\t"
  99116. "lsr r7, r7, #16\n\t"
  99117. "mul r7, r6, r7\n\t"
  99118. "adds r5, r5, r7\n\t"
  99119. "adcs r3, r3, #0\n\t"
  99120. "adc r4, r4, #0\n\t"
  99121. "lsr r7, r9, #16\n\t"
  99122. "mul r6, r7, r6\n\t"
  99123. "lsr r7, r6, #16\n\t"
  99124. "lsl r6, r6, #16\n\t"
  99125. "adds r5, r5, r6\n\t"
  99126. "adcs r3, r3, r7\n\t"
  99127. "adc r4, r4, #0\n\t"
  99128. "lsr r6, r8, #16\n\t"
  99129. "lsr r7, r9, #16\n\t"
  99130. "mul r7, r6, r7\n\t"
  99131. "adds r3, r3, r7\n\t"
  99132. "adc r4, r4, #0\n\t"
  99133. "lsl r7, r9, #16\n\t"
  99134. "lsr r7, r7, #16\n\t"
  99135. "mul r6, r7, r6\n\t"
  99136. "lsr r7, r6, #16\n\t"
  99137. "lsl r6, r6, #16\n\t"
  99138. "adds r5, r5, r6\n\t"
  99139. "adcs r3, r3, r7\n\t"
  99140. "adc r4, r4, #0\n\t"
  99141. #else
  99142. "umull r6, r7, r8, r9\n\t"
  99143. "adds r5, r5, r6\n\t"
  99144. "adcs r3, r3, r7\n\t"
  99145. "adc r4, r4, #0\n\t"
  99146. #endif
  99147. /* A[10] * B[1] */
  99148. "ldr r8, [%[a], #40]\n\t"
  99149. "ldr r9, [%[b], #4]\n\t"
  99150. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99151. "lsl r6, r8, #16\n\t"
  99152. "lsl r7, r9, #16\n\t"
  99153. "lsr r6, r6, #16\n\t"
  99154. "lsr r7, r7, #16\n\t"
  99155. "mul r7, r6, r7\n\t"
  99156. "adds r5, r5, r7\n\t"
  99157. "adcs r3, r3, #0\n\t"
  99158. "adc r4, r4, #0\n\t"
  99159. "lsr r7, r9, #16\n\t"
  99160. "mul r6, r7, r6\n\t"
  99161. "lsr r7, r6, #16\n\t"
  99162. "lsl r6, r6, #16\n\t"
  99163. "adds r5, r5, r6\n\t"
  99164. "adcs r3, r3, r7\n\t"
  99165. "adc r4, r4, #0\n\t"
  99166. "lsr r6, r8, #16\n\t"
  99167. "lsr r7, r9, #16\n\t"
  99168. "mul r7, r6, r7\n\t"
  99169. "adds r3, r3, r7\n\t"
  99170. "adc r4, r4, #0\n\t"
  99171. "lsl r7, r9, #16\n\t"
  99172. "lsr r7, r7, #16\n\t"
  99173. "mul r6, r7, r6\n\t"
  99174. "lsr r7, r6, #16\n\t"
  99175. "lsl r6, r6, #16\n\t"
  99176. "adds r5, r5, r6\n\t"
  99177. "adcs r3, r3, r7\n\t"
  99178. "adc r4, r4, #0\n\t"
  99179. #else
  99180. "umull r6, r7, r8, r9\n\t"
  99181. "adds r5, r5, r6\n\t"
  99182. "adcs r3, r3, r7\n\t"
  99183. "adc r4, r4, #0\n\t"
  99184. #endif
  99185. /* A[11] * B[0] */
  99186. "ldr r8, [%[a], #44]\n\t"
  99187. "ldr r9, [%[b]]\n\t"
  99188. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99189. "lsl r6, r8, #16\n\t"
  99190. "lsl r7, r9, #16\n\t"
  99191. "lsr r6, r6, #16\n\t"
  99192. "lsr r7, r7, #16\n\t"
  99193. "mul r7, r6, r7\n\t"
  99194. "adds r5, r5, r7\n\t"
  99195. "adcs r3, r3, #0\n\t"
  99196. "adc r4, r4, #0\n\t"
  99197. "lsr r7, r9, #16\n\t"
  99198. "mul r6, r7, r6\n\t"
  99199. "lsr r7, r6, #16\n\t"
  99200. "lsl r6, r6, #16\n\t"
  99201. "adds r5, r5, r6\n\t"
  99202. "adcs r3, r3, r7\n\t"
  99203. "adc r4, r4, #0\n\t"
  99204. "lsr r6, r8, #16\n\t"
  99205. "lsr r7, r9, #16\n\t"
  99206. "mul r7, r6, r7\n\t"
  99207. "adds r3, r3, r7\n\t"
  99208. "adc r4, r4, #0\n\t"
  99209. "lsl r7, r9, #16\n\t"
  99210. "lsr r7, r7, #16\n\t"
  99211. "mul r6, r7, r6\n\t"
  99212. "lsr r7, r6, #16\n\t"
  99213. "lsl r6, r6, #16\n\t"
  99214. "adds r5, r5, r6\n\t"
  99215. "adcs r3, r3, r7\n\t"
  99216. "adc r4, r4, #0\n\t"
  99217. #else
  99218. "umull r6, r7, r8, r9\n\t"
  99219. "adds r5, r5, r6\n\t"
  99220. "adcs r3, r3, r7\n\t"
  99221. "adc r4, r4, #0\n\t"
  99222. #endif
  99223. "str r5, [sp, #44]\n\t"
  99224. /* A[12] * B[0] */
  99225. "ldr r8, [%[a], #48]\n\t"
  99226. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99227. "lsl r6, r8, #16\n\t"
  99228. "lsl r7, r9, #16\n\t"
  99229. "lsr r6, r6, #16\n\t"
  99230. "lsr r7, r7, #16\n\t"
  99231. "mul r7, r6, r7\n\t"
  99232. "adds r3, r3, r7\n\t"
  99233. "adcs r4, r4, #0\n\t"
  99234. "mov r5, #0\n\t"
  99235. "adc r5, r5, #0\n\t"
  99236. "lsr r7, r9, #16\n\t"
  99237. "mul r6, r7, r6\n\t"
  99238. "lsr r7, r6, #16\n\t"
  99239. "lsl r6, r6, #16\n\t"
  99240. "adds r3, r3, r6\n\t"
  99241. "adcs r4, r4, r7\n\t"
  99242. "adc r5, r5, #0\n\t"
  99243. "lsr r6, r8, #16\n\t"
  99244. "lsr r7, r9, #16\n\t"
  99245. "mul r7, r6, r7\n\t"
  99246. "adds r4, r4, r7\n\t"
  99247. "adc r5, r5, #0\n\t"
  99248. "lsl r7, r9, #16\n\t"
  99249. "lsr r7, r7, #16\n\t"
  99250. "mul r6, r7, r6\n\t"
  99251. "lsr r7, r6, #16\n\t"
  99252. "lsl r6, r6, #16\n\t"
  99253. "adds r3, r3, r6\n\t"
  99254. "adcs r4, r4, r7\n\t"
  99255. "adc r5, r5, #0\n\t"
  99256. #else
  99257. "umull r6, r7, r8, r9\n\t"
  99258. "adds r3, r3, r6\n\t"
  99259. "adcs r4, r4, r7\n\t"
  99260. "mov r5, #0\n\t"
  99261. "adc r5, r5, #0\n\t"
  99262. #endif
  99263. /* A[11] * B[1] */
  99264. "ldr r8, [%[a], #44]\n\t"
  99265. "ldr r9, [%[b], #4]\n\t"
  99266. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99267. "lsl r6, r8, #16\n\t"
  99268. "lsl r7, r9, #16\n\t"
  99269. "lsr r6, r6, #16\n\t"
  99270. "lsr r7, r7, #16\n\t"
  99271. "mul r7, r6, r7\n\t"
  99272. "adds r3, r3, r7\n\t"
  99273. "adcs r4, r4, #0\n\t"
  99274. "adc r5, r5, #0\n\t"
  99275. "lsr r7, r9, #16\n\t"
  99276. "mul r6, r7, r6\n\t"
  99277. "lsr r7, r6, #16\n\t"
  99278. "lsl r6, r6, #16\n\t"
  99279. "adds r3, r3, r6\n\t"
  99280. "adcs r4, r4, r7\n\t"
  99281. "adc r5, r5, #0\n\t"
  99282. "lsr r6, r8, #16\n\t"
  99283. "lsr r7, r9, #16\n\t"
  99284. "mul r7, r6, r7\n\t"
  99285. "adds r4, r4, r7\n\t"
  99286. "adc r5, r5, #0\n\t"
  99287. "lsl r7, r9, #16\n\t"
  99288. "lsr r7, r7, #16\n\t"
  99289. "mul r6, r7, r6\n\t"
  99290. "lsr r7, r6, #16\n\t"
  99291. "lsl r6, r6, #16\n\t"
  99292. "adds r3, r3, r6\n\t"
  99293. "adcs r4, r4, r7\n\t"
  99294. "adc r5, r5, #0\n\t"
  99295. #else
  99296. "umull r6, r7, r8, r9\n\t"
  99297. "adds r3, r3, r6\n\t"
  99298. "adcs r4, r4, r7\n\t"
  99299. "adc r5, r5, #0\n\t"
  99300. #endif
  99301. /* A[10] * B[2] */
  99302. "ldr r8, [%[a], #40]\n\t"
  99303. "ldr r9, [%[b], #8]\n\t"
  99304. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99305. "lsl r6, r8, #16\n\t"
  99306. "lsl r7, r9, #16\n\t"
  99307. "lsr r6, r6, #16\n\t"
  99308. "lsr r7, r7, #16\n\t"
  99309. "mul r7, r6, r7\n\t"
  99310. "adds r3, r3, r7\n\t"
  99311. "adcs r4, r4, #0\n\t"
  99312. "adc r5, r5, #0\n\t"
  99313. "lsr r7, r9, #16\n\t"
  99314. "mul r6, r7, r6\n\t"
  99315. "lsr r7, r6, #16\n\t"
  99316. "lsl r6, r6, #16\n\t"
  99317. "adds r3, r3, r6\n\t"
  99318. "adcs r4, r4, r7\n\t"
  99319. "adc r5, r5, #0\n\t"
  99320. "lsr r6, r8, #16\n\t"
  99321. "lsr r7, r9, #16\n\t"
  99322. "mul r7, r6, r7\n\t"
  99323. "adds r4, r4, r7\n\t"
  99324. "adc r5, r5, #0\n\t"
  99325. "lsl r7, r9, #16\n\t"
  99326. "lsr r7, r7, #16\n\t"
  99327. "mul r6, r7, r6\n\t"
  99328. "lsr r7, r6, #16\n\t"
  99329. "lsl r6, r6, #16\n\t"
  99330. "adds r3, r3, r6\n\t"
  99331. "adcs r4, r4, r7\n\t"
  99332. "adc r5, r5, #0\n\t"
  99333. #else
  99334. "umull r6, r7, r8, r9\n\t"
  99335. "adds r3, r3, r6\n\t"
  99336. "adcs r4, r4, r7\n\t"
  99337. "adc r5, r5, #0\n\t"
  99338. #endif
  99339. /* A[9] * B[3] */
  99340. "ldr r8, [%[a], #36]\n\t"
  99341. "ldr r9, [%[b], #12]\n\t"
  99342. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99343. "lsl r6, r8, #16\n\t"
  99344. "lsl r7, r9, #16\n\t"
  99345. "lsr r6, r6, #16\n\t"
  99346. "lsr r7, r7, #16\n\t"
  99347. "mul r7, r6, r7\n\t"
  99348. "adds r3, r3, r7\n\t"
  99349. "adcs r4, r4, #0\n\t"
  99350. "adc r5, r5, #0\n\t"
  99351. "lsr r7, r9, #16\n\t"
  99352. "mul r6, r7, r6\n\t"
  99353. "lsr r7, r6, #16\n\t"
  99354. "lsl r6, r6, #16\n\t"
  99355. "adds r3, r3, r6\n\t"
  99356. "adcs r4, r4, r7\n\t"
  99357. "adc r5, r5, #0\n\t"
  99358. "lsr r6, r8, #16\n\t"
  99359. "lsr r7, r9, #16\n\t"
  99360. "mul r7, r6, r7\n\t"
  99361. "adds r4, r4, r7\n\t"
  99362. "adc r5, r5, #0\n\t"
  99363. "lsl r7, r9, #16\n\t"
  99364. "lsr r7, r7, #16\n\t"
  99365. "mul r6, r7, r6\n\t"
  99366. "lsr r7, r6, #16\n\t"
  99367. "lsl r6, r6, #16\n\t"
  99368. "adds r3, r3, r6\n\t"
  99369. "adcs r4, r4, r7\n\t"
  99370. "adc r5, r5, #0\n\t"
  99371. #else
  99372. "umull r6, r7, r8, r9\n\t"
  99373. "adds r3, r3, r6\n\t"
  99374. "adcs r4, r4, r7\n\t"
  99375. "adc r5, r5, #0\n\t"
  99376. #endif
  99377. /* A[8] * B[4] */
  99378. "ldr r8, [%[a], #32]\n\t"
  99379. "ldr r9, [%[b], #16]\n\t"
  99380. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99381. "lsl r6, r8, #16\n\t"
  99382. "lsl r7, r9, #16\n\t"
  99383. "lsr r6, r6, #16\n\t"
  99384. "lsr r7, r7, #16\n\t"
  99385. "mul r7, r6, r7\n\t"
  99386. "adds r3, r3, r7\n\t"
  99387. "adcs r4, r4, #0\n\t"
  99388. "adc r5, r5, #0\n\t"
  99389. "lsr r7, r9, #16\n\t"
  99390. "mul r6, r7, r6\n\t"
  99391. "lsr r7, r6, #16\n\t"
  99392. "lsl r6, r6, #16\n\t"
  99393. "adds r3, r3, r6\n\t"
  99394. "adcs r4, r4, r7\n\t"
  99395. "adc r5, r5, #0\n\t"
  99396. "lsr r6, r8, #16\n\t"
  99397. "lsr r7, r9, #16\n\t"
  99398. "mul r7, r6, r7\n\t"
  99399. "adds r4, r4, r7\n\t"
  99400. "adc r5, r5, #0\n\t"
  99401. "lsl r7, r9, #16\n\t"
  99402. "lsr r7, r7, #16\n\t"
  99403. "mul r6, r7, r6\n\t"
  99404. "lsr r7, r6, #16\n\t"
  99405. "lsl r6, r6, #16\n\t"
  99406. "adds r3, r3, r6\n\t"
  99407. "adcs r4, r4, r7\n\t"
  99408. "adc r5, r5, #0\n\t"
  99409. #else
  99410. "umull r6, r7, r8, r9\n\t"
  99411. "adds r3, r3, r6\n\t"
  99412. "adcs r4, r4, r7\n\t"
  99413. "adc r5, r5, #0\n\t"
  99414. #endif
  99415. /* A[7] * B[5] */
  99416. "ldr r8, [%[a], #28]\n\t"
  99417. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99418. "lsl r6, r8, #16\n\t"
  99419. "lsl r7, r12, #16\n\t"
  99420. "lsr r6, r6, #16\n\t"
  99421. "lsr r7, r7, #16\n\t"
  99422. "mul r7, r6, r7\n\t"
  99423. "adds r3, r3, r7\n\t"
  99424. "adcs r4, r4, #0\n\t"
  99425. "adc r5, r5, #0\n\t"
  99426. "lsr r7, r12, #16\n\t"
  99427. "mul r6, r7, r6\n\t"
  99428. "lsr r7, r6, #16\n\t"
  99429. "lsl r6, r6, #16\n\t"
  99430. "adds r3, r3, r6\n\t"
  99431. "adcs r4, r4, r7\n\t"
  99432. "adc r5, r5, #0\n\t"
  99433. "lsr r6, r8, #16\n\t"
  99434. "lsr r7, r12, #16\n\t"
  99435. "mul r7, r6, r7\n\t"
  99436. "adds r4, r4, r7\n\t"
  99437. "adc r5, r5, #0\n\t"
  99438. "lsl r7, r12, #16\n\t"
  99439. "lsr r7, r7, #16\n\t"
  99440. "mul r6, r7, r6\n\t"
  99441. "lsr r7, r6, #16\n\t"
  99442. "lsl r6, r6, #16\n\t"
  99443. "adds r3, r3, r6\n\t"
  99444. "adcs r4, r4, r7\n\t"
  99445. "adc r5, r5, #0\n\t"
  99446. #else
  99447. "umull r6, r7, r8, r12\n\t"
  99448. "adds r3, r3, r6\n\t"
  99449. "adcs r4, r4, r7\n\t"
  99450. "adc r5, r5, #0\n\t"
  99451. #endif
  99452. /* A[6] * B[6] */
  99453. "ldr r11, [%[a], #24]\n\t"
  99454. "ldr r12, [%[b], #24]\n\t"
  99455. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99456. "lsl r6, r11, #16\n\t"
  99457. "lsl r7, r12, #16\n\t"
  99458. "lsr r6, r6, #16\n\t"
  99459. "lsr r7, r7, #16\n\t"
  99460. "mul r7, r6, r7\n\t"
  99461. "adds r3, r3, r7\n\t"
  99462. "adcs r4, r4, #0\n\t"
  99463. "adc r5, r5, #0\n\t"
  99464. "lsr r7, r12, #16\n\t"
  99465. "mul r6, r7, r6\n\t"
  99466. "lsr r7, r6, #16\n\t"
  99467. "lsl r6, r6, #16\n\t"
  99468. "adds r3, r3, r6\n\t"
  99469. "adcs r4, r4, r7\n\t"
  99470. "adc r5, r5, #0\n\t"
  99471. "lsr r6, r11, #16\n\t"
  99472. "lsr r7, r12, #16\n\t"
  99473. "mul r7, r6, r7\n\t"
  99474. "adds r4, r4, r7\n\t"
  99475. "adc r5, r5, #0\n\t"
  99476. "lsl r7, r12, #16\n\t"
  99477. "lsr r7, r7, #16\n\t"
  99478. "mul r6, r7, r6\n\t"
  99479. "lsr r7, r6, #16\n\t"
  99480. "lsl r6, r6, #16\n\t"
  99481. "adds r3, r3, r6\n\t"
  99482. "adcs r4, r4, r7\n\t"
  99483. "adc r5, r5, #0\n\t"
  99484. #else
  99485. "umull r6, r7, r11, r12\n\t"
  99486. "adds r3, r3, r6\n\t"
  99487. "adcs r4, r4, r7\n\t"
  99488. "adc r5, r5, #0\n\t"
  99489. #endif
  99490. /* A[5] * B[7] */
  99491. "ldr r8, [%[a], #20]\n\t"
  99492. "ldr r9, [%[b], #28]\n\t"
  99493. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99494. "lsl r6, r8, #16\n\t"
  99495. "lsl r7, r9, #16\n\t"
  99496. "lsr r6, r6, #16\n\t"
  99497. "lsr r7, r7, #16\n\t"
  99498. "mul r7, r6, r7\n\t"
  99499. "adds r3, r3, r7\n\t"
  99500. "adcs r4, r4, #0\n\t"
  99501. "adc r5, r5, #0\n\t"
  99502. "lsr r7, r9, #16\n\t"
  99503. "mul r6, r7, r6\n\t"
  99504. "lsr r7, r6, #16\n\t"
  99505. "lsl r6, r6, #16\n\t"
  99506. "adds r3, r3, r6\n\t"
  99507. "adcs r4, r4, r7\n\t"
  99508. "adc r5, r5, #0\n\t"
  99509. "lsr r6, r8, #16\n\t"
  99510. "lsr r7, r9, #16\n\t"
  99511. "mul r7, r6, r7\n\t"
  99512. "adds r4, r4, r7\n\t"
  99513. "adc r5, r5, #0\n\t"
  99514. "lsl r7, r9, #16\n\t"
  99515. "lsr r7, r7, #16\n\t"
  99516. "mul r6, r7, r6\n\t"
  99517. "lsr r7, r6, #16\n\t"
  99518. "lsl r6, r6, #16\n\t"
  99519. "adds r3, r3, r6\n\t"
  99520. "adcs r4, r4, r7\n\t"
  99521. "adc r5, r5, #0\n\t"
  99522. #else
  99523. "umull r6, r7, r8, r9\n\t"
  99524. "adds r3, r3, r6\n\t"
  99525. "adcs r4, r4, r7\n\t"
  99526. "adc r5, r5, #0\n\t"
  99527. #endif
  99528. /* A[4] * B[8] */
  99529. "ldr r8, [%[a], #16]\n\t"
  99530. "ldr r9, [%[b], #32]\n\t"
  99531. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99532. "lsl r6, r8, #16\n\t"
  99533. "lsl r7, r9, #16\n\t"
  99534. "lsr r6, r6, #16\n\t"
  99535. "lsr r7, r7, #16\n\t"
  99536. "mul r7, r6, r7\n\t"
  99537. "adds r3, r3, r7\n\t"
  99538. "adcs r4, r4, #0\n\t"
  99539. "adc r5, r5, #0\n\t"
  99540. "lsr r7, r9, #16\n\t"
  99541. "mul r6, r7, r6\n\t"
  99542. "lsr r7, r6, #16\n\t"
  99543. "lsl r6, r6, #16\n\t"
  99544. "adds r3, r3, r6\n\t"
  99545. "adcs r4, r4, r7\n\t"
  99546. "adc r5, r5, #0\n\t"
  99547. "lsr r6, r8, #16\n\t"
  99548. "lsr r7, r9, #16\n\t"
  99549. "mul r7, r6, r7\n\t"
  99550. "adds r4, r4, r7\n\t"
  99551. "adc r5, r5, #0\n\t"
  99552. "lsl r7, r9, #16\n\t"
  99553. "lsr r7, r7, #16\n\t"
  99554. "mul r6, r7, r6\n\t"
  99555. "lsr r7, r6, #16\n\t"
  99556. "lsl r6, r6, #16\n\t"
  99557. "adds r3, r3, r6\n\t"
  99558. "adcs r4, r4, r7\n\t"
  99559. "adc r5, r5, #0\n\t"
  99560. #else
  99561. "umull r6, r7, r8, r9\n\t"
  99562. "adds r3, r3, r6\n\t"
  99563. "adcs r4, r4, r7\n\t"
  99564. "adc r5, r5, #0\n\t"
  99565. #endif
  99566. /* A[3] * B[9] */
  99567. "ldr r8, [%[a], #12]\n\t"
  99568. "ldr r9, [%[b], #36]\n\t"
  99569. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99570. "lsl r6, r8, #16\n\t"
  99571. "lsl r7, r9, #16\n\t"
  99572. "lsr r6, r6, #16\n\t"
  99573. "lsr r7, r7, #16\n\t"
  99574. "mul r7, r6, r7\n\t"
  99575. "adds r3, r3, r7\n\t"
  99576. "adcs r4, r4, #0\n\t"
  99577. "adc r5, r5, #0\n\t"
  99578. "lsr r7, r9, #16\n\t"
  99579. "mul r6, r7, r6\n\t"
  99580. "lsr r7, r6, #16\n\t"
  99581. "lsl r6, r6, #16\n\t"
  99582. "adds r3, r3, r6\n\t"
  99583. "adcs r4, r4, r7\n\t"
  99584. "adc r5, r5, #0\n\t"
  99585. "lsr r6, r8, #16\n\t"
  99586. "lsr r7, r9, #16\n\t"
  99587. "mul r7, r6, r7\n\t"
  99588. "adds r4, r4, r7\n\t"
  99589. "adc r5, r5, #0\n\t"
  99590. "lsl r7, r9, #16\n\t"
  99591. "lsr r7, r7, #16\n\t"
  99592. "mul r6, r7, r6\n\t"
  99593. "lsr r7, r6, #16\n\t"
  99594. "lsl r6, r6, #16\n\t"
  99595. "adds r3, r3, r6\n\t"
  99596. "adcs r4, r4, r7\n\t"
  99597. "adc r5, r5, #0\n\t"
  99598. #else
  99599. "umull r6, r7, r8, r9\n\t"
  99600. "adds r3, r3, r6\n\t"
  99601. "adcs r4, r4, r7\n\t"
  99602. "adc r5, r5, #0\n\t"
  99603. #endif
  99604. /* A[2] * B[10] */
  99605. "ldr r8, [%[a], #8]\n\t"
  99606. "ldr r9, [%[b], #40]\n\t"
  99607. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99608. "lsl r6, r8, #16\n\t"
  99609. "lsl r7, r9, #16\n\t"
  99610. "lsr r6, r6, #16\n\t"
  99611. "lsr r7, r7, #16\n\t"
  99612. "mul r7, r6, r7\n\t"
  99613. "adds r3, r3, r7\n\t"
  99614. "adcs r4, r4, #0\n\t"
  99615. "adc r5, r5, #0\n\t"
  99616. "lsr r7, r9, #16\n\t"
  99617. "mul r6, r7, r6\n\t"
  99618. "lsr r7, r6, #16\n\t"
  99619. "lsl r6, r6, #16\n\t"
  99620. "adds r3, r3, r6\n\t"
  99621. "adcs r4, r4, r7\n\t"
  99622. "adc r5, r5, #0\n\t"
  99623. "lsr r6, r8, #16\n\t"
  99624. "lsr r7, r9, #16\n\t"
  99625. "mul r7, r6, r7\n\t"
  99626. "adds r4, r4, r7\n\t"
  99627. "adc r5, r5, #0\n\t"
  99628. "lsl r7, r9, #16\n\t"
  99629. "lsr r7, r7, #16\n\t"
  99630. "mul r6, r7, r6\n\t"
  99631. "lsr r7, r6, #16\n\t"
  99632. "lsl r6, r6, #16\n\t"
  99633. "adds r3, r3, r6\n\t"
  99634. "adcs r4, r4, r7\n\t"
  99635. "adc r5, r5, #0\n\t"
  99636. #else
  99637. "umull r6, r7, r8, r9\n\t"
  99638. "adds r3, r3, r6\n\t"
  99639. "adcs r4, r4, r7\n\t"
  99640. "adc r5, r5, #0\n\t"
  99641. #endif
  99642. /* A[1] * B[11] */
  99643. "ldr r8, [%[a], #4]\n\t"
  99644. "ldr r9, [%[b], #44]\n\t"
  99645. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99646. "lsl r6, r8, #16\n\t"
  99647. "lsl r7, r9, #16\n\t"
  99648. "lsr r6, r6, #16\n\t"
  99649. "lsr r7, r7, #16\n\t"
  99650. "mul r7, r6, r7\n\t"
  99651. "adds r3, r3, r7\n\t"
  99652. "adcs r4, r4, #0\n\t"
  99653. "adc r5, r5, #0\n\t"
  99654. "lsr r7, r9, #16\n\t"
  99655. "mul r6, r7, r6\n\t"
  99656. "lsr r7, r6, #16\n\t"
  99657. "lsl r6, r6, #16\n\t"
  99658. "adds r3, r3, r6\n\t"
  99659. "adcs r4, r4, r7\n\t"
  99660. "adc r5, r5, #0\n\t"
  99661. "lsr r6, r8, #16\n\t"
  99662. "lsr r7, r9, #16\n\t"
  99663. "mul r7, r6, r7\n\t"
  99664. "adds r4, r4, r7\n\t"
  99665. "adc r5, r5, #0\n\t"
  99666. "lsl r7, r9, #16\n\t"
  99667. "lsr r7, r7, #16\n\t"
  99668. "mul r6, r7, r6\n\t"
  99669. "lsr r7, r6, #16\n\t"
  99670. "lsl r6, r6, #16\n\t"
  99671. "adds r3, r3, r6\n\t"
  99672. "adcs r4, r4, r7\n\t"
  99673. "adc r5, r5, #0\n\t"
  99674. #else
  99675. "umull r6, r7, r8, r9\n\t"
  99676. "adds r3, r3, r6\n\t"
  99677. "adcs r4, r4, r7\n\t"
  99678. "adc r5, r5, #0\n\t"
  99679. #endif
  99680. /* A[0] * B[12] */
  99681. "ldr r8, [%[a]]\n\t"
  99682. "ldr r9, [%[b], #48]\n\t"
  99683. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99684. "lsl r6, r8, #16\n\t"
  99685. "lsl r7, r9, #16\n\t"
  99686. "lsr r6, r6, #16\n\t"
  99687. "lsr r7, r7, #16\n\t"
  99688. "mul r7, r6, r7\n\t"
  99689. "adds r3, r3, r7\n\t"
  99690. "adcs r4, r4, #0\n\t"
  99691. "adc r5, r5, #0\n\t"
  99692. "lsr r7, r9, #16\n\t"
  99693. "mul r6, r7, r6\n\t"
  99694. "lsr r7, r6, #16\n\t"
  99695. "lsl r6, r6, #16\n\t"
  99696. "adds r3, r3, r6\n\t"
  99697. "adcs r4, r4, r7\n\t"
  99698. "adc r5, r5, #0\n\t"
  99699. "lsr r6, r8, #16\n\t"
  99700. "lsr r7, r9, #16\n\t"
  99701. "mul r7, r6, r7\n\t"
  99702. "adds r4, r4, r7\n\t"
  99703. "adc r5, r5, #0\n\t"
  99704. "lsl r7, r9, #16\n\t"
  99705. "lsr r7, r7, #16\n\t"
  99706. "mul r6, r7, r6\n\t"
  99707. "lsr r7, r6, #16\n\t"
  99708. "lsl r6, r6, #16\n\t"
  99709. "adds r3, r3, r6\n\t"
  99710. "adcs r4, r4, r7\n\t"
  99711. "adc r5, r5, #0\n\t"
  99712. #else
  99713. "umull r6, r7, r8, r9\n\t"
  99714. "adds r3, r3, r6\n\t"
  99715. "adcs r4, r4, r7\n\t"
  99716. "adc r5, r5, #0\n\t"
  99717. #endif
  99718. "str r3, [sp, #48]\n\t"
  99719. /* A[0] * B[13] */
  99720. "ldr r9, [%[b], #52]\n\t"
  99721. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99722. "lsl r6, r8, #16\n\t"
  99723. "lsl r7, r9, #16\n\t"
  99724. "lsr r6, r6, #16\n\t"
  99725. "lsr r7, r7, #16\n\t"
  99726. "mul r7, r6, r7\n\t"
  99727. "adds r4, r4, r7\n\t"
  99728. "adcs r5, r5, #0\n\t"
  99729. "mov r3, #0\n\t"
  99730. "adc r3, r3, #0\n\t"
  99731. "lsr r7, r9, #16\n\t"
  99732. "mul r6, r7, r6\n\t"
  99733. "lsr r7, r6, #16\n\t"
  99734. "lsl r6, r6, #16\n\t"
  99735. "adds r4, r4, r6\n\t"
  99736. "adcs r5, r5, r7\n\t"
  99737. "adc r3, r3, #0\n\t"
  99738. "lsr r6, r8, #16\n\t"
  99739. "lsr r7, r9, #16\n\t"
  99740. "mul r7, r6, r7\n\t"
  99741. "adds r5, r5, r7\n\t"
  99742. "adc r3, r3, #0\n\t"
  99743. "lsl r7, r9, #16\n\t"
  99744. "lsr r7, r7, #16\n\t"
  99745. "mul r6, r7, r6\n\t"
  99746. "lsr r7, r6, #16\n\t"
  99747. "lsl r6, r6, #16\n\t"
  99748. "adds r4, r4, r6\n\t"
  99749. "adcs r5, r5, r7\n\t"
  99750. "adc r3, r3, #0\n\t"
  99751. #else
  99752. "umull r6, r7, r8, r9\n\t"
  99753. "adds r4, r4, r6\n\t"
  99754. "adcs r5, r5, r7\n\t"
  99755. "mov r3, #0\n\t"
  99756. "adc r3, r3, #0\n\t"
  99757. #endif
  99758. /* A[1] * B[12] */
  99759. "ldr r8, [%[a], #4]\n\t"
  99760. "ldr r9, [%[b], #48]\n\t"
  99761. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99762. "lsl r6, r8, #16\n\t"
  99763. "lsl r7, r9, #16\n\t"
  99764. "lsr r6, r6, #16\n\t"
  99765. "lsr r7, r7, #16\n\t"
  99766. "mul r7, r6, r7\n\t"
  99767. "adds r4, r4, r7\n\t"
  99768. "adcs r5, r5, #0\n\t"
  99769. "adc r3, r3, #0\n\t"
  99770. "lsr r7, r9, #16\n\t"
  99771. "mul r6, r7, r6\n\t"
  99772. "lsr r7, r6, #16\n\t"
  99773. "lsl r6, r6, #16\n\t"
  99774. "adds r4, r4, r6\n\t"
  99775. "adcs r5, r5, r7\n\t"
  99776. "adc r3, r3, #0\n\t"
  99777. "lsr r6, r8, #16\n\t"
  99778. "lsr r7, r9, #16\n\t"
  99779. "mul r7, r6, r7\n\t"
  99780. "adds r5, r5, r7\n\t"
  99781. "adc r3, r3, #0\n\t"
  99782. "lsl r7, r9, #16\n\t"
  99783. "lsr r7, r7, #16\n\t"
  99784. "mul r6, r7, r6\n\t"
  99785. "lsr r7, r6, #16\n\t"
  99786. "lsl r6, r6, #16\n\t"
  99787. "adds r4, r4, r6\n\t"
  99788. "adcs r5, r5, r7\n\t"
  99789. "adc r3, r3, #0\n\t"
  99790. #else
  99791. "umull r6, r7, r8, r9\n\t"
  99792. "adds r4, r4, r6\n\t"
  99793. "adcs r5, r5, r7\n\t"
  99794. "adc r3, r3, #0\n\t"
  99795. #endif
  99796. /* A[2] * B[11] */
  99797. "ldr r8, [%[a], #8]\n\t"
  99798. "ldr r9, [%[b], #44]\n\t"
  99799. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99800. "lsl r6, r8, #16\n\t"
  99801. "lsl r7, r9, #16\n\t"
  99802. "lsr r6, r6, #16\n\t"
  99803. "lsr r7, r7, #16\n\t"
  99804. "mul r7, r6, r7\n\t"
  99805. "adds r4, r4, r7\n\t"
  99806. "adcs r5, r5, #0\n\t"
  99807. "adc r3, r3, #0\n\t"
  99808. "lsr r7, r9, #16\n\t"
  99809. "mul r6, r7, r6\n\t"
  99810. "lsr r7, r6, #16\n\t"
  99811. "lsl r6, r6, #16\n\t"
  99812. "adds r4, r4, r6\n\t"
  99813. "adcs r5, r5, r7\n\t"
  99814. "adc r3, r3, #0\n\t"
  99815. "lsr r6, r8, #16\n\t"
  99816. "lsr r7, r9, #16\n\t"
  99817. "mul r7, r6, r7\n\t"
  99818. "adds r5, r5, r7\n\t"
  99819. "adc r3, r3, #0\n\t"
  99820. "lsl r7, r9, #16\n\t"
  99821. "lsr r7, r7, #16\n\t"
  99822. "mul r6, r7, r6\n\t"
  99823. "lsr r7, r6, #16\n\t"
  99824. "lsl r6, r6, #16\n\t"
  99825. "adds r4, r4, r6\n\t"
  99826. "adcs r5, r5, r7\n\t"
  99827. "adc r3, r3, #0\n\t"
  99828. #else
  99829. "umull r6, r7, r8, r9\n\t"
  99830. "adds r4, r4, r6\n\t"
  99831. "adcs r5, r5, r7\n\t"
  99832. "adc r3, r3, #0\n\t"
  99833. #endif
  99834. /* A[3] * B[10] */
  99835. "ldr r8, [%[a], #12]\n\t"
  99836. "ldr r9, [%[b], #40]\n\t"
  99837. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99838. "lsl r6, r8, #16\n\t"
  99839. "lsl r7, r9, #16\n\t"
  99840. "lsr r6, r6, #16\n\t"
  99841. "lsr r7, r7, #16\n\t"
  99842. "mul r7, r6, r7\n\t"
  99843. "adds r4, r4, r7\n\t"
  99844. "adcs r5, r5, #0\n\t"
  99845. "adc r3, r3, #0\n\t"
  99846. "lsr r7, r9, #16\n\t"
  99847. "mul r6, r7, r6\n\t"
  99848. "lsr r7, r6, #16\n\t"
  99849. "lsl r6, r6, #16\n\t"
  99850. "adds r4, r4, r6\n\t"
  99851. "adcs r5, r5, r7\n\t"
  99852. "adc r3, r3, #0\n\t"
  99853. "lsr r6, r8, #16\n\t"
  99854. "lsr r7, r9, #16\n\t"
  99855. "mul r7, r6, r7\n\t"
  99856. "adds r5, r5, r7\n\t"
  99857. "adc r3, r3, #0\n\t"
  99858. "lsl r7, r9, #16\n\t"
  99859. "lsr r7, r7, #16\n\t"
  99860. "mul r6, r7, r6\n\t"
  99861. "lsr r7, r6, #16\n\t"
  99862. "lsl r6, r6, #16\n\t"
  99863. "adds r4, r4, r6\n\t"
  99864. "adcs r5, r5, r7\n\t"
  99865. "adc r3, r3, #0\n\t"
  99866. #else
  99867. "umull r6, r7, r8, r9\n\t"
  99868. "adds r4, r4, r6\n\t"
  99869. "adcs r5, r5, r7\n\t"
  99870. "adc r3, r3, #0\n\t"
  99871. #endif
  99872. /* A[4] * B[9] */
  99873. "ldr r8, [%[a], #16]\n\t"
  99874. "ldr r9, [%[b], #36]\n\t"
  99875. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99876. "lsl r6, r8, #16\n\t"
  99877. "lsl r7, r9, #16\n\t"
  99878. "lsr r6, r6, #16\n\t"
  99879. "lsr r7, r7, #16\n\t"
  99880. "mul r7, r6, r7\n\t"
  99881. "adds r4, r4, r7\n\t"
  99882. "adcs r5, r5, #0\n\t"
  99883. "adc r3, r3, #0\n\t"
  99884. "lsr r7, r9, #16\n\t"
  99885. "mul r6, r7, r6\n\t"
  99886. "lsr r7, r6, #16\n\t"
  99887. "lsl r6, r6, #16\n\t"
  99888. "adds r4, r4, r6\n\t"
  99889. "adcs r5, r5, r7\n\t"
  99890. "adc r3, r3, #0\n\t"
  99891. "lsr r6, r8, #16\n\t"
  99892. "lsr r7, r9, #16\n\t"
  99893. "mul r7, r6, r7\n\t"
  99894. "adds r5, r5, r7\n\t"
  99895. "adc r3, r3, #0\n\t"
  99896. "lsl r7, r9, #16\n\t"
  99897. "lsr r7, r7, #16\n\t"
  99898. "mul r6, r7, r6\n\t"
  99899. "lsr r7, r6, #16\n\t"
  99900. "lsl r6, r6, #16\n\t"
  99901. "adds r4, r4, r6\n\t"
  99902. "adcs r5, r5, r7\n\t"
  99903. "adc r3, r3, #0\n\t"
  99904. #else
  99905. "umull r6, r7, r8, r9\n\t"
  99906. "adds r4, r4, r6\n\t"
  99907. "adcs r5, r5, r7\n\t"
  99908. "adc r3, r3, #0\n\t"
  99909. #endif
  99910. /* A[5] * B[8] */
  99911. "ldr r8, [%[a], #20]\n\t"
  99912. "ldr r9, [%[b], #32]\n\t"
  99913. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99914. "lsl r6, r8, #16\n\t"
  99915. "lsl r7, r9, #16\n\t"
  99916. "lsr r6, r6, #16\n\t"
  99917. "lsr r7, r7, #16\n\t"
  99918. "mul r7, r6, r7\n\t"
  99919. "adds r4, r4, r7\n\t"
  99920. "adcs r5, r5, #0\n\t"
  99921. "adc r3, r3, #0\n\t"
  99922. "lsr r7, r9, #16\n\t"
  99923. "mul r6, r7, r6\n\t"
  99924. "lsr r7, r6, #16\n\t"
  99925. "lsl r6, r6, #16\n\t"
  99926. "adds r4, r4, r6\n\t"
  99927. "adcs r5, r5, r7\n\t"
  99928. "adc r3, r3, #0\n\t"
  99929. "lsr r6, r8, #16\n\t"
  99930. "lsr r7, r9, #16\n\t"
  99931. "mul r7, r6, r7\n\t"
  99932. "adds r5, r5, r7\n\t"
  99933. "adc r3, r3, #0\n\t"
  99934. "lsl r7, r9, #16\n\t"
  99935. "lsr r7, r7, #16\n\t"
  99936. "mul r6, r7, r6\n\t"
  99937. "lsr r7, r6, #16\n\t"
  99938. "lsl r6, r6, #16\n\t"
  99939. "adds r4, r4, r6\n\t"
  99940. "adcs r5, r5, r7\n\t"
  99941. "adc r3, r3, #0\n\t"
  99942. #else
  99943. "umull r6, r7, r8, r9\n\t"
  99944. "adds r4, r4, r6\n\t"
  99945. "adcs r5, r5, r7\n\t"
  99946. "adc r3, r3, #0\n\t"
  99947. #endif
  99948. /* A[6] * B[7] */
  99949. "ldr r9, [%[b], #28]\n\t"
  99950. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99951. "lsl r6, r11, #16\n\t"
  99952. "lsl r7, r9, #16\n\t"
  99953. "lsr r6, r6, #16\n\t"
  99954. "lsr r7, r7, #16\n\t"
  99955. "mul r7, r6, r7\n\t"
  99956. "adds r4, r4, r7\n\t"
  99957. "adcs r5, r5, #0\n\t"
  99958. "adc r3, r3, #0\n\t"
  99959. "lsr r7, r9, #16\n\t"
  99960. "mul r6, r7, r6\n\t"
  99961. "lsr r7, r6, #16\n\t"
  99962. "lsl r6, r6, #16\n\t"
  99963. "adds r4, r4, r6\n\t"
  99964. "adcs r5, r5, r7\n\t"
  99965. "adc r3, r3, #0\n\t"
  99966. "lsr r6, r11, #16\n\t"
  99967. "lsr r7, r9, #16\n\t"
  99968. "mul r7, r6, r7\n\t"
  99969. "adds r5, r5, r7\n\t"
  99970. "adc r3, r3, #0\n\t"
  99971. "lsl r7, r9, #16\n\t"
  99972. "lsr r7, r7, #16\n\t"
  99973. "mul r6, r7, r6\n\t"
  99974. "lsr r7, r6, #16\n\t"
  99975. "lsl r6, r6, #16\n\t"
  99976. "adds r4, r4, r6\n\t"
  99977. "adcs r5, r5, r7\n\t"
  99978. "adc r3, r3, #0\n\t"
  99979. #else
  99980. "umull r6, r7, r11, r9\n\t"
  99981. "adds r4, r4, r6\n\t"
  99982. "adcs r5, r5, r7\n\t"
  99983. "adc r3, r3, #0\n\t"
  99984. #endif
  99985. /* A[7] * B[6] */
  99986. "ldr r8, [%[a], #28]\n\t"
  99987. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  99988. "lsl r6, r8, #16\n\t"
  99989. "lsl r7, r12, #16\n\t"
  99990. "lsr r6, r6, #16\n\t"
  99991. "lsr r7, r7, #16\n\t"
  99992. "mul r7, r6, r7\n\t"
  99993. "adds r4, r4, r7\n\t"
  99994. "adcs r5, r5, #0\n\t"
  99995. "adc r3, r3, #0\n\t"
  99996. "lsr r7, r12, #16\n\t"
  99997. "mul r6, r7, r6\n\t"
  99998. "lsr r7, r6, #16\n\t"
  99999. "lsl r6, r6, #16\n\t"
  100000. "adds r4, r4, r6\n\t"
  100001. "adcs r5, r5, r7\n\t"
  100002. "adc r3, r3, #0\n\t"
  100003. "lsr r6, r8, #16\n\t"
  100004. "lsr r7, r12, #16\n\t"
  100005. "mul r7, r6, r7\n\t"
  100006. "adds r5, r5, r7\n\t"
  100007. "adc r3, r3, #0\n\t"
  100008. "lsl r7, r12, #16\n\t"
  100009. "lsr r7, r7, #16\n\t"
  100010. "mul r6, r7, r6\n\t"
  100011. "lsr r7, r6, #16\n\t"
  100012. "lsl r6, r6, #16\n\t"
  100013. "adds r4, r4, r6\n\t"
  100014. "adcs r5, r5, r7\n\t"
  100015. "adc r3, r3, #0\n\t"
  100016. #else
  100017. "umull r6, r7, r8, r12\n\t"
  100018. "adds r4, r4, r6\n\t"
  100019. "adcs r5, r5, r7\n\t"
  100020. "adc r3, r3, #0\n\t"
  100021. #endif
  100022. /* A[8] * B[5] */
  100023. "ldr r8, [%[a], #32]\n\t"
  100024. "ldr r9, [%[b], #20]\n\t"
  100025. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100026. "lsl r6, r8, #16\n\t"
  100027. "lsl r7, r9, #16\n\t"
  100028. "lsr r6, r6, #16\n\t"
  100029. "lsr r7, r7, #16\n\t"
  100030. "mul r7, r6, r7\n\t"
  100031. "adds r4, r4, r7\n\t"
  100032. "adcs r5, r5, #0\n\t"
  100033. "adc r3, r3, #0\n\t"
  100034. "lsr r7, r9, #16\n\t"
  100035. "mul r6, r7, r6\n\t"
  100036. "lsr r7, r6, #16\n\t"
  100037. "lsl r6, r6, #16\n\t"
  100038. "adds r4, r4, r6\n\t"
  100039. "adcs r5, r5, r7\n\t"
  100040. "adc r3, r3, #0\n\t"
  100041. "lsr r6, r8, #16\n\t"
  100042. "lsr r7, r9, #16\n\t"
  100043. "mul r7, r6, r7\n\t"
  100044. "adds r5, r5, r7\n\t"
  100045. "adc r3, r3, #0\n\t"
  100046. "lsl r7, r9, #16\n\t"
  100047. "lsr r7, r7, #16\n\t"
  100048. "mul r6, r7, r6\n\t"
  100049. "lsr r7, r6, #16\n\t"
  100050. "lsl r6, r6, #16\n\t"
  100051. "adds r4, r4, r6\n\t"
  100052. "adcs r5, r5, r7\n\t"
  100053. "adc r3, r3, #0\n\t"
  100054. #else
  100055. "umull r6, r7, r8, r9\n\t"
  100056. "adds r4, r4, r6\n\t"
  100057. "adcs r5, r5, r7\n\t"
  100058. "adc r3, r3, #0\n\t"
  100059. #endif
  100060. /* A[9] * B[4] */
  100061. "ldr r8, [%[a], #36]\n\t"
  100062. "ldr r9, [%[b], #16]\n\t"
  100063. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100064. "lsl r6, r8, #16\n\t"
  100065. "lsl r7, r9, #16\n\t"
  100066. "lsr r6, r6, #16\n\t"
  100067. "lsr r7, r7, #16\n\t"
  100068. "mul r7, r6, r7\n\t"
  100069. "adds r4, r4, r7\n\t"
  100070. "adcs r5, r5, #0\n\t"
  100071. "adc r3, r3, #0\n\t"
  100072. "lsr r7, r9, #16\n\t"
  100073. "mul r6, r7, r6\n\t"
  100074. "lsr r7, r6, #16\n\t"
  100075. "lsl r6, r6, #16\n\t"
  100076. "adds r4, r4, r6\n\t"
  100077. "adcs r5, r5, r7\n\t"
  100078. "adc r3, r3, #0\n\t"
  100079. "lsr r6, r8, #16\n\t"
  100080. "lsr r7, r9, #16\n\t"
  100081. "mul r7, r6, r7\n\t"
  100082. "adds r5, r5, r7\n\t"
  100083. "adc r3, r3, #0\n\t"
  100084. "lsl r7, r9, #16\n\t"
  100085. "lsr r7, r7, #16\n\t"
  100086. "mul r6, r7, r6\n\t"
  100087. "lsr r7, r6, #16\n\t"
  100088. "lsl r6, r6, #16\n\t"
  100089. "adds r4, r4, r6\n\t"
  100090. "adcs r5, r5, r7\n\t"
  100091. "adc r3, r3, #0\n\t"
  100092. #else
  100093. "umull r6, r7, r8, r9\n\t"
  100094. "adds r4, r4, r6\n\t"
  100095. "adcs r5, r5, r7\n\t"
  100096. "adc r3, r3, #0\n\t"
  100097. #endif
  100098. /* A[10] * B[3] */
  100099. "ldr r8, [%[a], #40]\n\t"
  100100. "ldr r9, [%[b], #12]\n\t"
  100101. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100102. "lsl r6, r8, #16\n\t"
  100103. "lsl r7, r9, #16\n\t"
  100104. "lsr r6, r6, #16\n\t"
  100105. "lsr r7, r7, #16\n\t"
  100106. "mul r7, r6, r7\n\t"
  100107. "adds r4, r4, r7\n\t"
  100108. "adcs r5, r5, #0\n\t"
  100109. "adc r3, r3, #0\n\t"
  100110. "lsr r7, r9, #16\n\t"
  100111. "mul r6, r7, r6\n\t"
  100112. "lsr r7, r6, #16\n\t"
  100113. "lsl r6, r6, #16\n\t"
  100114. "adds r4, r4, r6\n\t"
  100115. "adcs r5, r5, r7\n\t"
  100116. "adc r3, r3, #0\n\t"
  100117. "lsr r6, r8, #16\n\t"
  100118. "lsr r7, r9, #16\n\t"
  100119. "mul r7, r6, r7\n\t"
  100120. "adds r5, r5, r7\n\t"
  100121. "adc r3, r3, #0\n\t"
  100122. "lsl r7, r9, #16\n\t"
  100123. "lsr r7, r7, #16\n\t"
  100124. "mul r6, r7, r6\n\t"
  100125. "lsr r7, r6, #16\n\t"
  100126. "lsl r6, r6, #16\n\t"
  100127. "adds r4, r4, r6\n\t"
  100128. "adcs r5, r5, r7\n\t"
  100129. "adc r3, r3, #0\n\t"
  100130. #else
  100131. "umull r6, r7, r8, r9\n\t"
  100132. "adds r4, r4, r6\n\t"
  100133. "adcs r5, r5, r7\n\t"
  100134. "adc r3, r3, #0\n\t"
  100135. #endif
  100136. /* A[11] * B[2] */
  100137. "ldr r8, [%[a], #44]\n\t"
  100138. "ldr r9, [%[b], #8]\n\t"
  100139. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100140. "lsl r6, r8, #16\n\t"
  100141. "lsl r7, r9, #16\n\t"
  100142. "lsr r6, r6, #16\n\t"
  100143. "lsr r7, r7, #16\n\t"
  100144. "mul r7, r6, r7\n\t"
  100145. "adds r4, r4, r7\n\t"
  100146. "adcs r5, r5, #0\n\t"
  100147. "adc r3, r3, #0\n\t"
  100148. "lsr r7, r9, #16\n\t"
  100149. "mul r6, r7, r6\n\t"
  100150. "lsr r7, r6, #16\n\t"
  100151. "lsl r6, r6, #16\n\t"
  100152. "adds r4, r4, r6\n\t"
  100153. "adcs r5, r5, r7\n\t"
  100154. "adc r3, r3, #0\n\t"
  100155. "lsr r6, r8, #16\n\t"
  100156. "lsr r7, r9, #16\n\t"
  100157. "mul r7, r6, r7\n\t"
  100158. "adds r5, r5, r7\n\t"
  100159. "adc r3, r3, #0\n\t"
  100160. "lsl r7, r9, #16\n\t"
  100161. "lsr r7, r7, #16\n\t"
  100162. "mul r6, r7, r6\n\t"
  100163. "lsr r7, r6, #16\n\t"
  100164. "lsl r6, r6, #16\n\t"
  100165. "adds r4, r4, r6\n\t"
  100166. "adcs r5, r5, r7\n\t"
  100167. "adc r3, r3, #0\n\t"
  100168. #else
  100169. "umull r6, r7, r8, r9\n\t"
  100170. "adds r4, r4, r6\n\t"
  100171. "adcs r5, r5, r7\n\t"
  100172. "adc r3, r3, #0\n\t"
  100173. #endif
  100174. /* A[12] * B[1] */
  100175. "ldr r8, [%[a], #48]\n\t"
  100176. "ldr r9, [%[b], #4]\n\t"
  100177. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100178. "lsl r6, r8, #16\n\t"
  100179. "lsl r7, r9, #16\n\t"
  100180. "lsr r6, r6, #16\n\t"
  100181. "lsr r7, r7, #16\n\t"
  100182. "mul r7, r6, r7\n\t"
  100183. "adds r4, r4, r7\n\t"
  100184. "adcs r5, r5, #0\n\t"
  100185. "adc r3, r3, #0\n\t"
  100186. "lsr r7, r9, #16\n\t"
  100187. "mul r6, r7, r6\n\t"
  100188. "lsr r7, r6, #16\n\t"
  100189. "lsl r6, r6, #16\n\t"
  100190. "adds r4, r4, r6\n\t"
  100191. "adcs r5, r5, r7\n\t"
  100192. "adc r3, r3, #0\n\t"
  100193. "lsr r6, r8, #16\n\t"
  100194. "lsr r7, r9, #16\n\t"
  100195. "mul r7, r6, r7\n\t"
  100196. "adds r5, r5, r7\n\t"
  100197. "adc r3, r3, #0\n\t"
  100198. "lsl r7, r9, #16\n\t"
  100199. "lsr r7, r7, #16\n\t"
  100200. "mul r6, r7, r6\n\t"
  100201. "lsr r7, r6, #16\n\t"
  100202. "lsl r6, r6, #16\n\t"
  100203. "adds r4, r4, r6\n\t"
  100204. "adcs r5, r5, r7\n\t"
  100205. "adc r3, r3, #0\n\t"
  100206. #else
  100207. "umull r6, r7, r8, r9\n\t"
  100208. "adds r4, r4, r6\n\t"
  100209. "adcs r5, r5, r7\n\t"
  100210. "adc r3, r3, #0\n\t"
  100211. #endif
  100212. /* A[13] * B[0] */
  100213. "ldr r8, [%[a], #52]\n\t"
  100214. "ldr r9, [%[b]]\n\t"
  100215. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100216. "lsl r6, r8, #16\n\t"
  100217. "lsl r7, r9, #16\n\t"
  100218. "lsr r6, r6, #16\n\t"
  100219. "lsr r7, r7, #16\n\t"
  100220. "mul r7, r6, r7\n\t"
  100221. "adds r4, r4, r7\n\t"
  100222. "adcs r5, r5, #0\n\t"
  100223. "adc r3, r3, #0\n\t"
  100224. "lsr r7, r9, #16\n\t"
  100225. "mul r6, r7, r6\n\t"
  100226. "lsr r7, r6, #16\n\t"
  100227. "lsl r6, r6, #16\n\t"
  100228. "adds r4, r4, r6\n\t"
  100229. "adcs r5, r5, r7\n\t"
  100230. "adc r3, r3, #0\n\t"
  100231. "lsr r6, r8, #16\n\t"
  100232. "lsr r7, r9, #16\n\t"
  100233. "mul r7, r6, r7\n\t"
  100234. "adds r5, r5, r7\n\t"
  100235. "adc r3, r3, #0\n\t"
  100236. "lsl r7, r9, #16\n\t"
  100237. "lsr r7, r7, #16\n\t"
  100238. "mul r6, r7, r6\n\t"
  100239. "lsr r7, r6, #16\n\t"
  100240. "lsl r6, r6, #16\n\t"
  100241. "adds r4, r4, r6\n\t"
  100242. "adcs r5, r5, r7\n\t"
  100243. "adc r3, r3, #0\n\t"
  100244. #else
  100245. "umull r6, r7, r8, r9\n\t"
  100246. "adds r4, r4, r6\n\t"
  100247. "adcs r5, r5, r7\n\t"
  100248. "adc r3, r3, #0\n\t"
  100249. #endif
  100250. "str r4, [sp, #52]\n\t"
  100251. /* A[14] * B[0] */
  100252. "ldr r8, [%[a], #56]\n\t"
  100253. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100254. "lsl r6, r8, #16\n\t"
  100255. "lsl r7, r9, #16\n\t"
  100256. "lsr r6, r6, #16\n\t"
  100257. "lsr r7, r7, #16\n\t"
  100258. "mul r7, r6, r7\n\t"
  100259. "adds r5, r5, r7\n\t"
  100260. "adcs r3, r3, #0\n\t"
  100261. "mov r4, #0\n\t"
  100262. "adc r4, r4, #0\n\t"
  100263. "lsr r7, r9, #16\n\t"
  100264. "mul r6, r7, r6\n\t"
  100265. "lsr r7, r6, #16\n\t"
  100266. "lsl r6, r6, #16\n\t"
  100267. "adds r5, r5, r6\n\t"
  100268. "adcs r3, r3, r7\n\t"
  100269. "adc r4, r4, #0\n\t"
  100270. "lsr r6, r8, #16\n\t"
  100271. "lsr r7, r9, #16\n\t"
  100272. "mul r7, r6, r7\n\t"
  100273. "adds r3, r3, r7\n\t"
  100274. "adc r4, r4, #0\n\t"
  100275. "lsl r7, r9, #16\n\t"
  100276. "lsr r7, r7, #16\n\t"
  100277. "mul r6, r7, r6\n\t"
  100278. "lsr r7, r6, #16\n\t"
  100279. "lsl r6, r6, #16\n\t"
  100280. "adds r5, r5, r6\n\t"
  100281. "adcs r3, r3, r7\n\t"
  100282. "adc r4, r4, #0\n\t"
  100283. #else
  100284. "umull r6, r7, r8, r9\n\t"
  100285. "adds r5, r5, r6\n\t"
  100286. "adcs r3, r3, r7\n\t"
  100287. "mov r4, #0\n\t"
  100288. "adc r4, r4, #0\n\t"
  100289. #endif
  100290. /* A[13] * B[1] */
  100291. "ldr r8, [%[a], #52]\n\t"
  100292. "ldr r9, [%[b], #4]\n\t"
  100293. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100294. "lsl r6, r8, #16\n\t"
  100295. "lsl r7, r9, #16\n\t"
  100296. "lsr r6, r6, #16\n\t"
  100297. "lsr r7, r7, #16\n\t"
  100298. "mul r7, r6, r7\n\t"
  100299. "adds r5, r5, r7\n\t"
  100300. "adcs r3, r3, #0\n\t"
  100301. "adc r4, r4, #0\n\t"
  100302. "lsr r7, r9, #16\n\t"
  100303. "mul r6, r7, r6\n\t"
  100304. "lsr r7, r6, #16\n\t"
  100305. "lsl r6, r6, #16\n\t"
  100306. "adds r5, r5, r6\n\t"
  100307. "adcs r3, r3, r7\n\t"
  100308. "adc r4, r4, #0\n\t"
  100309. "lsr r6, r8, #16\n\t"
  100310. "lsr r7, r9, #16\n\t"
  100311. "mul r7, r6, r7\n\t"
  100312. "adds r3, r3, r7\n\t"
  100313. "adc r4, r4, #0\n\t"
  100314. "lsl r7, r9, #16\n\t"
  100315. "lsr r7, r7, #16\n\t"
  100316. "mul r6, r7, r6\n\t"
  100317. "lsr r7, r6, #16\n\t"
  100318. "lsl r6, r6, #16\n\t"
  100319. "adds r5, r5, r6\n\t"
  100320. "adcs r3, r3, r7\n\t"
  100321. "adc r4, r4, #0\n\t"
  100322. #else
  100323. "umull r6, r7, r8, r9\n\t"
  100324. "adds r5, r5, r6\n\t"
  100325. "adcs r3, r3, r7\n\t"
  100326. "adc r4, r4, #0\n\t"
  100327. #endif
  100328. /* A[12] * B[2] */
  100329. "ldr r8, [%[a], #48]\n\t"
  100330. "ldr r9, [%[b], #8]\n\t"
  100331. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100332. "lsl r6, r8, #16\n\t"
  100333. "lsl r7, r9, #16\n\t"
  100334. "lsr r6, r6, #16\n\t"
  100335. "lsr r7, r7, #16\n\t"
  100336. "mul r7, r6, r7\n\t"
  100337. "adds r5, r5, r7\n\t"
  100338. "adcs r3, r3, #0\n\t"
  100339. "adc r4, r4, #0\n\t"
  100340. "lsr r7, r9, #16\n\t"
  100341. "mul r6, r7, r6\n\t"
  100342. "lsr r7, r6, #16\n\t"
  100343. "lsl r6, r6, #16\n\t"
  100344. "adds r5, r5, r6\n\t"
  100345. "adcs r3, r3, r7\n\t"
  100346. "adc r4, r4, #0\n\t"
  100347. "lsr r6, r8, #16\n\t"
  100348. "lsr r7, r9, #16\n\t"
  100349. "mul r7, r6, r7\n\t"
  100350. "adds r3, r3, r7\n\t"
  100351. "adc r4, r4, #0\n\t"
  100352. "lsl r7, r9, #16\n\t"
  100353. "lsr r7, r7, #16\n\t"
  100354. "mul r6, r7, r6\n\t"
  100355. "lsr r7, r6, #16\n\t"
  100356. "lsl r6, r6, #16\n\t"
  100357. "adds r5, r5, r6\n\t"
  100358. "adcs r3, r3, r7\n\t"
  100359. "adc r4, r4, #0\n\t"
  100360. #else
  100361. "umull r6, r7, r8, r9\n\t"
  100362. "adds r5, r5, r6\n\t"
  100363. "adcs r3, r3, r7\n\t"
  100364. "adc r4, r4, #0\n\t"
  100365. #endif
  100366. /* A[11] * B[3] */
  100367. "ldr r8, [%[a], #44]\n\t"
  100368. "ldr r9, [%[b], #12]\n\t"
  100369. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100370. "lsl r6, r8, #16\n\t"
  100371. "lsl r7, r9, #16\n\t"
  100372. "lsr r6, r6, #16\n\t"
  100373. "lsr r7, r7, #16\n\t"
  100374. "mul r7, r6, r7\n\t"
  100375. "adds r5, r5, r7\n\t"
  100376. "adcs r3, r3, #0\n\t"
  100377. "adc r4, r4, #0\n\t"
  100378. "lsr r7, r9, #16\n\t"
  100379. "mul r6, r7, r6\n\t"
  100380. "lsr r7, r6, #16\n\t"
  100381. "lsl r6, r6, #16\n\t"
  100382. "adds r5, r5, r6\n\t"
  100383. "adcs r3, r3, r7\n\t"
  100384. "adc r4, r4, #0\n\t"
  100385. "lsr r6, r8, #16\n\t"
  100386. "lsr r7, r9, #16\n\t"
  100387. "mul r7, r6, r7\n\t"
  100388. "adds r3, r3, r7\n\t"
  100389. "adc r4, r4, #0\n\t"
  100390. "lsl r7, r9, #16\n\t"
  100391. "lsr r7, r7, #16\n\t"
  100392. "mul r6, r7, r6\n\t"
  100393. "lsr r7, r6, #16\n\t"
  100394. "lsl r6, r6, #16\n\t"
  100395. "adds r5, r5, r6\n\t"
  100396. "adcs r3, r3, r7\n\t"
  100397. "adc r4, r4, #0\n\t"
  100398. #else
  100399. "umull r6, r7, r8, r9\n\t"
  100400. "adds r5, r5, r6\n\t"
  100401. "adcs r3, r3, r7\n\t"
  100402. "adc r4, r4, #0\n\t"
  100403. #endif
  100404. /* A[10] * B[4] */
  100405. "ldr r8, [%[a], #40]\n\t"
  100406. "ldr r9, [%[b], #16]\n\t"
  100407. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100408. "lsl r6, r8, #16\n\t"
  100409. "lsl r7, r9, #16\n\t"
  100410. "lsr r6, r6, #16\n\t"
  100411. "lsr r7, r7, #16\n\t"
  100412. "mul r7, r6, r7\n\t"
  100413. "adds r5, r5, r7\n\t"
  100414. "adcs r3, r3, #0\n\t"
  100415. "adc r4, r4, #0\n\t"
  100416. "lsr r7, r9, #16\n\t"
  100417. "mul r6, r7, r6\n\t"
  100418. "lsr r7, r6, #16\n\t"
  100419. "lsl r6, r6, #16\n\t"
  100420. "adds r5, r5, r6\n\t"
  100421. "adcs r3, r3, r7\n\t"
  100422. "adc r4, r4, #0\n\t"
  100423. "lsr r6, r8, #16\n\t"
  100424. "lsr r7, r9, #16\n\t"
  100425. "mul r7, r6, r7\n\t"
  100426. "adds r3, r3, r7\n\t"
  100427. "adc r4, r4, #0\n\t"
  100428. "lsl r7, r9, #16\n\t"
  100429. "lsr r7, r7, #16\n\t"
  100430. "mul r6, r7, r6\n\t"
  100431. "lsr r7, r6, #16\n\t"
  100432. "lsl r6, r6, #16\n\t"
  100433. "adds r5, r5, r6\n\t"
  100434. "adcs r3, r3, r7\n\t"
  100435. "adc r4, r4, #0\n\t"
  100436. #else
  100437. "umull r6, r7, r8, r9\n\t"
  100438. "adds r5, r5, r6\n\t"
  100439. "adcs r3, r3, r7\n\t"
  100440. "adc r4, r4, #0\n\t"
  100441. #endif
  100442. /* A[9] * B[5] */
  100443. "ldr r8, [%[a], #36]\n\t"
  100444. "ldr r9, [%[b], #20]\n\t"
  100445. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100446. "lsl r6, r8, #16\n\t"
  100447. "lsl r7, r9, #16\n\t"
  100448. "lsr r6, r6, #16\n\t"
  100449. "lsr r7, r7, #16\n\t"
  100450. "mul r7, r6, r7\n\t"
  100451. "adds r5, r5, r7\n\t"
  100452. "adcs r3, r3, #0\n\t"
  100453. "adc r4, r4, #0\n\t"
  100454. "lsr r7, r9, #16\n\t"
  100455. "mul r6, r7, r6\n\t"
  100456. "lsr r7, r6, #16\n\t"
  100457. "lsl r6, r6, #16\n\t"
  100458. "adds r5, r5, r6\n\t"
  100459. "adcs r3, r3, r7\n\t"
  100460. "adc r4, r4, #0\n\t"
  100461. "lsr r6, r8, #16\n\t"
  100462. "lsr r7, r9, #16\n\t"
  100463. "mul r7, r6, r7\n\t"
  100464. "adds r3, r3, r7\n\t"
  100465. "adc r4, r4, #0\n\t"
  100466. "lsl r7, r9, #16\n\t"
  100467. "lsr r7, r7, #16\n\t"
  100468. "mul r6, r7, r6\n\t"
  100469. "lsr r7, r6, #16\n\t"
  100470. "lsl r6, r6, #16\n\t"
  100471. "adds r5, r5, r6\n\t"
  100472. "adcs r3, r3, r7\n\t"
  100473. "adc r4, r4, #0\n\t"
  100474. #else
  100475. "umull r6, r7, r8, r9\n\t"
  100476. "adds r5, r5, r6\n\t"
  100477. "adcs r3, r3, r7\n\t"
  100478. "adc r4, r4, #0\n\t"
  100479. #endif
  100480. /* A[8] * B[6] */
  100481. "ldr r8, [%[a], #32]\n\t"
  100482. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100483. "lsl r6, r8, #16\n\t"
  100484. "lsl r7, r12, #16\n\t"
  100485. "lsr r6, r6, #16\n\t"
  100486. "lsr r7, r7, #16\n\t"
  100487. "mul r7, r6, r7\n\t"
  100488. "adds r5, r5, r7\n\t"
  100489. "adcs r3, r3, #0\n\t"
  100490. "adc r4, r4, #0\n\t"
  100491. "lsr r7, r12, #16\n\t"
  100492. "mul r6, r7, r6\n\t"
  100493. "lsr r7, r6, #16\n\t"
  100494. "lsl r6, r6, #16\n\t"
  100495. "adds r5, r5, r6\n\t"
  100496. "adcs r3, r3, r7\n\t"
  100497. "adc r4, r4, #0\n\t"
  100498. "lsr r6, r8, #16\n\t"
  100499. "lsr r7, r12, #16\n\t"
  100500. "mul r7, r6, r7\n\t"
  100501. "adds r3, r3, r7\n\t"
  100502. "adc r4, r4, #0\n\t"
  100503. "lsl r7, r12, #16\n\t"
  100504. "lsr r7, r7, #16\n\t"
  100505. "mul r6, r7, r6\n\t"
  100506. "lsr r7, r6, #16\n\t"
  100507. "lsl r6, r6, #16\n\t"
  100508. "adds r5, r5, r6\n\t"
  100509. "adcs r3, r3, r7\n\t"
  100510. "adc r4, r4, #0\n\t"
  100511. #else
  100512. "umull r6, r7, r8, r12\n\t"
  100513. "adds r5, r5, r6\n\t"
  100514. "adcs r3, r3, r7\n\t"
  100515. "adc r4, r4, #0\n\t"
  100516. #endif
  100517. /* A[7] * B[7] */
  100518. "ldr r11, [%[a], #28]\n\t"
  100519. "ldr r12, [%[b], #28]\n\t"
  100520. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100521. "lsl r6, r11, #16\n\t"
  100522. "lsl r7, r12, #16\n\t"
  100523. "lsr r6, r6, #16\n\t"
  100524. "lsr r7, r7, #16\n\t"
  100525. "mul r7, r6, r7\n\t"
  100526. "adds r5, r5, r7\n\t"
  100527. "adcs r3, r3, #0\n\t"
  100528. "adc r4, r4, #0\n\t"
  100529. "lsr r7, r12, #16\n\t"
  100530. "mul r6, r7, r6\n\t"
  100531. "lsr r7, r6, #16\n\t"
  100532. "lsl r6, r6, #16\n\t"
  100533. "adds r5, r5, r6\n\t"
  100534. "adcs r3, r3, r7\n\t"
  100535. "adc r4, r4, #0\n\t"
  100536. "lsr r6, r11, #16\n\t"
  100537. "lsr r7, r12, #16\n\t"
  100538. "mul r7, r6, r7\n\t"
  100539. "adds r3, r3, r7\n\t"
  100540. "adc r4, r4, #0\n\t"
  100541. "lsl r7, r12, #16\n\t"
  100542. "lsr r7, r7, #16\n\t"
  100543. "mul r6, r7, r6\n\t"
  100544. "lsr r7, r6, #16\n\t"
  100545. "lsl r6, r6, #16\n\t"
  100546. "adds r5, r5, r6\n\t"
  100547. "adcs r3, r3, r7\n\t"
  100548. "adc r4, r4, #0\n\t"
  100549. #else
  100550. "umull r6, r7, r11, r12\n\t"
  100551. "adds r5, r5, r6\n\t"
  100552. "adcs r3, r3, r7\n\t"
  100553. "adc r4, r4, #0\n\t"
  100554. #endif
  100555. /* A[6] * B[8] */
  100556. "ldr r8, [%[a], #24]\n\t"
  100557. "ldr r9, [%[b], #32]\n\t"
  100558. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100559. "lsl r6, r8, #16\n\t"
  100560. "lsl r7, r9, #16\n\t"
  100561. "lsr r6, r6, #16\n\t"
  100562. "lsr r7, r7, #16\n\t"
  100563. "mul r7, r6, r7\n\t"
  100564. "adds r5, r5, r7\n\t"
  100565. "adcs r3, r3, #0\n\t"
  100566. "adc r4, r4, #0\n\t"
  100567. "lsr r7, r9, #16\n\t"
  100568. "mul r6, r7, r6\n\t"
  100569. "lsr r7, r6, #16\n\t"
  100570. "lsl r6, r6, #16\n\t"
  100571. "adds r5, r5, r6\n\t"
  100572. "adcs r3, r3, r7\n\t"
  100573. "adc r4, r4, #0\n\t"
  100574. "lsr r6, r8, #16\n\t"
  100575. "lsr r7, r9, #16\n\t"
  100576. "mul r7, r6, r7\n\t"
  100577. "adds r3, r3, r7\n\t"
  100578. "adc r4, r4, #0\n\t"
  100579. "lsl r7, r9, #16\n\t"
  100580. "lsr r7, r7, #16\n\t"
  100581. "mul r6, r7, r6\n\t"
  100582. "lsr r7, r6, #16\n\t"
  100583. "lsl r6, r6, #16\n\t"
  100584. "adds r5, r5, r6\n\t"
  100585. "adcs r3, r3, r7\n\t"
  100586. "adc r4, r4, #0\n\t"
  100587. #else
  100588. "umull r6, r7, r8, r9\n\t"
  100589. "adds r5, r5, r6\n\t"
  100590. "adcs r3, r3, r7\n\t"
  100591. "adc r4, r4, #0\n\t"
  100592. #endif
  100593. /* A[5] * B[9] */
  100594. "ldr r8, [%[a], #20]\n\t"
  100595. "ldr r9, [%[b], #36]\n\t"
  100596. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100597. "lsl r6, r8, #16\n\t"
  100598. "lsl r7, r9, #16\n\t"
  100599. "lsr r6, r6, #16\n\t"
  100600. "lsr r7, r7, #16\n\t"
  100601. "mul r7, r6, r7\n\t"
  100602. "adds r5, r5, r7\n\t"
  100603. "adcs r3, r3, #0\n\t"
  100604. "adc r4, r4, #0\n\t"
  100605. "lsr r7, r9, #16\n\t"
  100606. "mul r6, r7, r6\n\t"
  100607. "lsr r7, r6, #16\n\t"
  100608. "lsl r6, r6, #16\n\t"
  100609. "adds r5, r5, r6\n\t"
  100610. "adcs r3, r3, r7\n\t"
  100611. "adc r4, r4, #0\n\t"
  100612. "lsr r6, r8, #16\n\t"
  100613. "lsr r7, r9, #16\n\t"
  100614. "mul r7, r6, r7\n\t"
  100615. "adds r3, r3, r7\n\t"
  100616. "adc r4, r4, #0\n\t"
  100617. "lsl r7, r9, #16\n\t"
  100618. "lsr r7, r7, #16\n\t"
  100619. "mul r6, r7, r6\n\t"
  100620. "lsr r7, r6, #16\n\t"
  100621. "lsl r6, r6, #16\n\t"
  100622. "adds r5, r5, r6\n\t"
  100623. "adcs r3, r3, r7\n\t"
  100624. "adc r4, r4, #0\n\t"
  100625. #else
  100626. "umull r6, r7, r8, r9\n\t"
  100627. "adds r5, r5, r6\n\t"
  100628. "adcs r3, r3, r7\n\t"
  100629. "adc r4, r4, #0\n\t"
  100630. #endif
  100631. /* A[4] * B[10] */
  100632. "ldr r8, [%[a], #16]\n\t"
  100633. "ldr r9, [%[b], #40]\n\t"
  100634. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100635. "lsl r6, r8, #16\n\t"
  100636. "lsl r7, r9, #16\n\t"
  100637. "lsr r6, r6, #16\n\t"
  100638. "lsr r7, r7, #16\n\t"
  100639. "mul r7, r6, r7\n\t"
  100640. "adds r5, r5, r7\n\t"
  100641. "adcs r3, r3, #0\n\t"
  100642. "adc r4, r4, #0\n\t"
  100643. "lsr r7, r9, #16\n\t"
  100644. "mul r6, r7, r6\n\t"
  100645. "lsr r7, r6, #16\n\t"
  100646. "lsl r6, r6, #16\n\t"
  100647. "adds r5, r5, r6\n\t"
  100648. "adcs r3, r3, r7\n\t"
  100649. "adc r4, r4, #0\n\t"
  100650. "lsr r6, r8, #16\n\t"
  100651. "lsr r7, r9, #16\n\t"
  100652. "mul r7, r6, r7\n\t"
  100653. "adds r3, r3, r7\n\t"
  100654. "adc r4, r4, #0\n\t"
  100655. "lsl r7, r9, #16\n\t"
  100656. "lsr r7, r7, #16\n\t"
  100657. "mul r6, r7, r6\n\t"
  100658. "lsr r7, r6, #16\n\t"
  100659. "lsl r6, r6, #16\n\t"
  100660. "adds r5, r5, r6\n\t"
  100661. "adcs r3, r3, r7\n\t"
  100662. "adc r4, r4, #0\n\t"
  100663. #else
  100664. "umull r6, r7, r8, r9\n\t"
  100665. "adds r5, r5, r6\n\t"
  100666. "adcs r3, r3, r7\n\t"
  100667. "adc r4, r4, #0\n\t"
  100668. #endif
  100669. /* A[3] * B[11] */
  100670. "ldr r8, [%[a], #12]\n\t"
  100671. "ldr r9, [%[b], #44]\n\t"
  100672. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100673. "lsl r6, r8, #16\n\t"
  100674. "lsl r7, r9, #16\n\t"
  100675. "lsr r6, r6, #16\n\t"
  100676. "lsr r7, r7, #16\n\t"
  100677. "mul r7, r6, r7\n\t"
  100678. "adds r5, r5, r7\n\t"
  100679. "adcs r3, r3, #0\n\t"
  100680. "adc r4, r4, #0\n\t"
  100681. "lsr r7, r9, #16\n\t"
  100682. "mul r6, r7, r6\n\t"
  100683. "lsr r7, r6, #16\n\t"
  100684. "lsl r6, r6, #16\n\t"
  100685. "adds r5, r5, r6\n\t"
  100686. "adcs r3, r3, r7\n\t"
  100687. "adc r4, r4, #0\n\t"
  100688. "lsr r6, r8, #16\n\t"
  100689. "lsr r7, r9, #16\n\t"
  100690. "mul r7, r6, r7\n\t"
  100691. "adds r3, r3, r7\n\t"
  100692. "adc r4, r4, #0\n\t"
  100693. "lsl r7, r9, #16\n\t"
  100694. "lsr r7, r7, #16\n\t"
  100695. "mul r6, r7, r6\n\t"
  100696. "lsr r7, r6, #16\n\t"
  100697. "lsl r6, r6, #16\n\t"
  100698. "adds r5, r5, r6\n\t"
  100699. "adcs r3, r3, r7\n\t"
  100700. "adc r4, r4, #0\n\t"
  100701. #else
  100702. "umull r6, r7, r8, r9\n\t"
  100703. "adds r5, r5, r6\n\t"
  100704. "adcs r3, r3, r7\n\t"
  100705. "adc r4, r4, #0\n\t"
  100706. #endif
  100707. /* A[2] * B[12] */
  100708. "ldr r8, [%[a], #8]\n\t"
  100709. "ldr r9, [%[b], #48]\n\t"
  100710. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100711. "lsl r6, r8, #16\n\t"
  100712. "lsl r7, r9, #16\n\t"
  100713. "lsr r6, r6, #16\n\t"
  100714. "lsr r7, r7, #16\n\t"
  100715. "mul r7, r6, r7\n\t"
  100716. "adds r5, r5, r7\n\t"
  100717. "adcs r3, r3, #0\n\t"
  100718. "adc r4, r4, #0\n\t"
  100719. "lsr r7, r9, #16\n\t"
  100720. "mul r6, r7, r6\n\t"
  100721. "lsr r7, r6, #16\n\t"
  100722. "lsl r6, r6, #16\n\t"
  100723. "adds r5, r5, r6\n\t"
  100724. "adcs r3, r3, r7\n\t"
  100725. "adc r4, r4, #0\n\t"
  100726. "lsr r6, r8, #16\n\t"
  100727. "lsr r7, r9, #16\n\t"
  100728. "mul r7, r6, r7\n\t"
  100729. "adds r3, r3, r7\n\t"
  100730. "adc r4, r4, #0\n\t"
  100731. "lsl r7, r9, #16\n\t"
  100732. "lsr r7, r7, #16\n\t"
  100733. "mul r6, r7, r6\n\t"
  100734. "lsr r7, r6, #16\n\t"
  100735. "lsl r6, r6, #16\n\t"
  100736. "adds r5, r5, r6\n\t"
  100737. "adcs r3, r3, r7\n\t"
  100738. "adc r4, r4, #0\n\t"
  100739. #else
  100740. "umull r6, r7, r8, r9\n\t"
  100741. "adds r5, r5, r6\n\t"
  100742. "adcs r3, r3, r7\n\t"
  100743. "adc r4, r4, #0\n\t"
  100744. #endif
  100745. /* A[1] * B[13] */
  100746. "ldr r8, [%[a], #4]\n\t"
  100747. "ldr r9, [%[b], #52]\n\t"
  100748. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100749. "lsl r6, r8, #16\n\t"
  100750. "lsl r7, r9, #16\n\t"
  100751. "lsr r6, r6, #16\n\t"
  100752. "lsr r7, r7, #16\n\t"
  100753. "mul r7, r6, r7\n\t"
  100754. "adds r5, r5, r7\n\t"
  100755. "adcs r3, r3, #0\n\t"
  100756. "adc r4, r4, #0\n\t"
  100757. "lsr r7, r9, #16\n\t"
  100758. "mul r6, r7, r6\n\t"
  100759. "lsr r7, r6, #16\n\t"
  100760. "lsl r6, r6, #16\n\t"
  100761. "adds r5, r5, r6\n\t"
  100762. "adcs r3, r3, r7\n\t"
  100763. "adc r4, r4, #0\n\t"
  100764. "lsr r6, r8, #16\n\t"
  100765. "lsr r7, r9, #16\n\t"
  100766. "mul r7, r6, r7\n\t"
  100767. "adds r3, r3, r7\n\t"
  100768. "adc r4, r4, #0\n\t"
  100769. "lsl r7, r9, #16\n\t"
  100770. "lsr r7, r7, #16\n\t"
  100771. "mul r6, r7, r6\n\t"
  100772. "lsr r7, r6, #16\n\t"
  100773. "lsl r6, r6, #16\n\t"
  100774. "adds r5, r5, r6\n\t"
  100775. "adcs r3, r3, r7\n\t"
  100776. "adc r4, r4, #0\n\t"
  100777. #else
  100778. "umull r6, r7, r8, r9\n\t"
  100779. "adds r5, r5, r6\n\t"
  100780. "adcs r3, r3, r7\n\t"
  100781. "adc r4, r4, #0\n\t"
  100782. #endif
  100783. /* A[0] * B[14] */
  100784. "ldr r8, [%[a]]\n\t"
  100785. "ldr r9, [%[b], #56]\n\t"
  100786. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100787. "lsl r6, r8, #16\n\t"
  100788. "lsl r7, r9, #16\n\t"
  100789. "lsr r6, r6, #16\n\t"
  100790. "lsr r7, r7, #16\n\t"
  100791. "mul r7, r6, r7\n\t"
  100792. "adds r5, r5, r7\n\t"
  100793. "adcs r3, r3, #0\n\t"
  100794. "adc r4, r4, #0\n\t"
  100795. "lsr r7, r9, #16\n\t"
  100796. "mul r6, r7, r6\n\t"
  100797. "lsr r7, r6, #16\n\t"
  100798. "lsl r6, r6, #16\n\t"
  100799. "adds r5, r5, r6\n\t"
  100800. "adcs r3, r3, r7\n\t"
  100801. "adc r4, r4, #0\n\t"
  100802. "lsr r6, r8, #16\n\t"
  100803. "lsr r7, r9, #16\n\t"
  100804. "mul r7, r6, r7\n\t"
  100805. "adds r3, r3, r7\n\t"
  100806. "adc r4, r4, #0\n\t"
  100807. "lsl r7, r9, #16\n\t"
  100808. "lsr r7, r7, #16\n\t"
  100809. "mul r6, r7, r6\n\t"
  100810. "lsr r7, r6, #16\n\t"
  100811. "lsl r6, r6, #16\n\t"
  100812. "adds r5, r5, r6\n\t"
  100813. "adcs r3, r3, r7\n\t"
  100814. "adc r4, r4, #0\n\t"
  100815. #else
  100816. "umull r6, r7, r8, r9\n\t"
  100817. "adds r5, r5, r6\n\t"
  100818. "adcs r3, r3, r7\n\t"
  100819. "adc r4, r4, #0\n\t"
  100820. #endif
  100821. "str r5, [sp, #56]\n\t"
  100822. /* A[0] * B[15] */
  100823. "ldr r9, [%[b], #60]\n\t"
  100824. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100825. "lsl r6, r8, #16\n\t"
  100826. "lsl r7, r9, #16\n\t"
  100827. "lsr r6, r6, #16\n\t"
  100828. "lsr r7, r7, #16\n\t"
  100829. "mul r7, r6, r7\n\t"
  100830. "adds r3, r3, r7\n\t"
  100831. "adcs r4, r4, #0\n\t"
  100832. "mov r5, #0\n\t"
  100833. "adc r5, r5, #0\n\t"
  100834. "lsr r7, r9, #16\n\t"
  100835. "mul r6, r7, r6\n\t"
  100836. "lsr r7, r6, #16\n\t"
  100837. "lsl r6, r6, #16\n\t"
  100838. "adds r3, r3, r6\n\t"
  100839. "adcs r4, r4, r7\n\t"
  100840. "adc r5, r5, #0\n\t"
  100841. "lsr r6, r8, #16\n\t"
  100842. "lsr r7, r9, #16\n\t"
  100843. "mul r7, r6, r7\n\t"
  100844. "adds r4, r4, r7\n\t"
  100845. "adc r5, r5, #0\n\t"
  100846. "lsl r7, r9, #16\n\t"
  100847. "lsr r7, r7, #16\n\t"
  100848. "mul r6, r7, r6\n\t"
  100849. "lsr r7, r6, #16\n\t"
  100850. "lsl r6, r6, #16\n\t"
  100851. "adds r3, r3, r6\n\t"
  100852. "adcs r4, r4, r7\n\t"
  100853. "adc r5, r5, #0\n\t"
  100854. #else
  100855. "umull r6, r7, r8, r9\n\t"
  100856. "adds r3, r3, r6\n\t"
  100857. "adcs r4, r4, r7\n\t"
  100858. "mov r5, #0\n\t"
  100859. "adc r5, r5, #0\n\t"
  100860. #endif
  100861. /* A[1] * B[14] */
  100862. "ldr r8, [%[a], #4]\n\t"
  100863. "ldr r9, [%[b], #56]\n\t"
  100864. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100865. "lsl r6, r8, #16\n\t"
  100866. "lsl r7, r9, #16\n\t"
  100867. "lsr r6, r6, #16\n\t"
  100868. "lsr r7, r7, #16\n\t"
  100869. "mul r7, r6, r7\n\t"
  100870. "adds r3, r3, r7\n\t"
  100871. "adcs r4, r4, #0\n\t"
  100872. "adc r5, r5, #0\n\t"
  100873. "lsr r7, r9, #16\n\t"
  100874. "mul r6, r7, r6\n\t"
  100875. "lsr r7, r6, #16\n\t"
  100876. "lsl r6, r6, #16\n\t"
  100877. "adds r3, r3, r6\n\t"
  100878. "adcs r4, r4, r7\n\t"
  100879. "adc r5, r5, #0\n\t"
  100880. "lsr r6, r8, #16\n\t"
  100881. "lsr r7, r9, #16\n\t"
  100882. "mul r7, r6, r7\n\t"
  100883. "adds r4, r4, r7\n\t"
  100884. "adc r5, r5, #0\n\t"
  100885. "lsl r7, r9, #16\n\t"
  100886. "lsr r7, r7, #16\n\t"
  100887. "mul r6, r7, r6\n\t"
  100888. "lsr r7, r6, #16\n\t"
  100889. "lsl r6, r6, #16\n\t"
  100890. "adds r3, r3, r6\n\t"
  100891. "adcs r4, r4, r7\n\t"
  100892. "adc r5, r5, #0\n\t"
  100893. #else
  100894. "umull r6, r7, r8, r9\n\t"
  100895. "adds r3, r3, r6\n\t"
  100896. "adcs r4, r4, r7\n\t"
  100897. "adc r5, r5, #0\n\t"
  100898. #endif
  100899. /* A[2] * B[13] */
  100900. "ldr r8, [%[a], #8]\n\t"
  100901. "ldr r9, [%[b], #52]\n\t"
  100902. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100903. "lsl r6, r8, #16\n\t"
  100904. "lsl r7, r9, #16\n\t"
  100905. "lsr r6, r6, #16\n\t"
  100906. "lsr r7, r7, #16\n\t"
  100907. "mul r7, r6, r7\n\t"
  100908. "adds r3, r3, r7\n\t"
  100909. "adcs r4, r4, #0\n\t"
  100910. "adc r5, r5, #0\n\t"
  100911. "lsr r7, r9, #16\n\t"
  100912. "mul r6, r7, r6\n\t"
  100913. "lsr r7, r6, #16\n\t"
  100914. "lsl r6, r6, #16\n\t"
  100915. "adds r3, r3, r6\n\t"
  100916. "adcs r4, r4, r7\n\t"
  100917. "adc r5, r5, #0\n\t"
  100918. "lsr r6, r8, #16\n\t"
  100919. "lsr r7, r9, #16\n\t"
  100920. "mul r7, r6, r7\n\t"
  100921. "adds r4, r4, r7\n\t"
  100922. "adc r5, r5, #0\n\t"
  100923. "lsl r7, r9, #16\n\t"
  100924. "lsr r7, r7, #16\n\t"
  100925. "mul r6, r7, r6\n\t"
  100926. "lsr r7, r6, #16\n\t"
  100927. "lsl r6, r6, #16\n\t"
  100928. "adds r3, r3, r6\n\t"
  100929. "adcs r4, r4, r7\n\t"
  100930. "adc r5, r5, #0\n\t"
  100931. #else
  100932. "umull r6, r7, r8, r9\n\t"
  100933. "adds r3, r3, r6\n\t"
  100934. "adcs r4, r4, r7\n\t"
  100935. "adc r5, r5, #0\n\t"
  100936. #endif
  100937. /* A[3] * B[12] */
  100938. "ldr r8, [%[a], #12]\n\t"
  100939. "ldr r9, [%[b], #48]\n\t"
  100940. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100941. "lsl r6, r8, #16\n\t"
  100942. "lsl r7, r9, #16\n\t"
  100943. "lsr r6, r6, #16\n\t"
  100944. "lsr r7, r7, #16\n\t"
  100945. "mul r7, r6, r7\n\t"
  100946. "adds r3, r3, r7\n\t"
  100947. "adcs r4, r4, #0\n\t"
  100948. "adc r5, r5, #0\n\t"
  100949. "lsr r7, r9, #16\n\t"
  100950. "mul r6, r7, r6\n\t"
  100951. "lsr r7, r6, #16\n\t"
  100952. "lsl r6, r6, #16\n\t"
  100953. "adds r3, r3, r6\n\t"
  100954. "adcs r4, r4, r7\n\t"
  100955. "adc r5, r5, #0\n\t"
  100956. "lsr r6, r8, #16\n\t"
  100957. "lsr r7, r9, #16\n\t"
  100958. "mul r7, r6, r7\n\t"
  100959. "adds r4, r4, r7\n\t"
  100960. "adc r5, r5, #0\n\t"
  100961. "lsl r7, r9, #16\n\t"
  100962. "lsr r7, r7, #16\n\t"
  100963. "mul r6, r7, r6\n\t"
  100964. "lsr r7, r6, #16\n\t"
  100965. "lsl r6, r6, #16\n\t"
  100966. "adds r3, r3, r6\n\t"
  100967. "adcs r4, r4, r7\n\t"
  100968. "adc r5, r5, #0\n\t"
  100969. #else
  100970. "umull r6, r7, r8, r9\n\t"
  100971. "adds r3, r3, r6\n\t"
  100972. "adcs r4, r4, r7\n\t"
  100973. "adc r5, r5, #0\n\t"
  100974. #endif
  100975. /* A[4] * B[11] */
  100976. "ldr r8, [%[a], #16]\n\t"
  100977. "ldr r9, [%[b], #44]\n\t"
  100978. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  100979. "lsl r6, r8, #16\n\t"
  100980. "lsl r7, r9, #16\n\t"
  100981. "lsr r6, r6, #16\n\t"
  100982. "lsr r7, r7, #16\n\t"
  100983. "mul r7, r6, r7\n\t"
  100984. "adds r3, r3, r7\n\t"
  100985. "adcs r4, r4, #0\n\t"
  100986. "adc r5, r5, #0\n\t"
  100987. "lsr r7, r9, #16\n\t"
  100988. "mul r6, r7, r6\n\t"
  100989. "lsr r7, r6, #16\n\t"
  100990. "lsl r6, r6, #16\n\t"
  100991. "adds r3, r3, r6\n\t"
  100992. "adcs r4, r4, r7\n\t"
  100993. "adc r5, r5, #0\n\t"
  100994. "lsr r6, r8, #16\n\t"
  100995. "lsr r7, r9, #16\n\t"
  100996. "mul r7, r6, r7\n\t"
  100997. "adds r4, r4, r7\n\t"
  100998. "adc r5, r5, #0\n\t"
  100999. "lsl r7, r9, #16\n\t"
  101000. "lsr r7, r7, #16\n\t"
  101001. "mul r6, r7, r6\n\t"
  101002. "lsr r7, r6, #16\n\t"
  101003. "lsl r6, r6, #16\n\t"
  101004. "adds r3, r3, r6\n\t"
  101005. "adcs r4, r4, r7\n\t"
  101006. "adc r5, r5, #0\n\t"
  101007. #else
  101008. "umull r6, r7, r8, r9\n\t"
  101009. "adds r3, r3, r6\n\t"
  101010. "adcs r4, r4, r7\n\t"
  101011. "adc r5, r5, #0\n\t"
  101012. #endif
  101013. /* A[5] * B[10] */
  101014. "ldr r8, [%[a], #20]\n\t"
  101015. "ldr r9, [%[b], #40]\n\t"
  101016. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101017. "lsl r6, r8, #16\n\t"
  101018. "lsl r7, r9, #16\n\t"
  101019. "lsr r6, r6, #16\n\t"
  101020. "lsr r7, r7, #16\n\t"
  101021. "mul r7, r6, r7\n\t"
  101022. "adds r3, r3, r7\n\t"
  101023. "adcs r4, r4, #0\n\t"
  101024. "adc r5, r5, #0\n\t"
  101025. "lsr r7, r9, #16\n\t"
  101026. "mul r6, r7, r6\n\t"
  101027. "lsr r7, r6, #16\n\t"
  101028. "lsl r6, r6, #16\n\t"
  101029. "adds r3, r3, r6\n\t"
  101030. "adcs r4, r4, r7\n\t"
  101031. "adc r5, r5, #0\n\t"
  101032. "lsr r6, r8, #16\n\t"
  101033. "lsr r7, r9, #16\n\t"
  101034. "mul r7, r6, r7\n\t"
  101035. "adds r4, r4, r7\n\t"
  101036. "adc r5, r5, #0\n\t"
  101037. "lsl r7, r9, #16\n\t"
  101038. "lsr r7, r7, #16\n\t"
  101039. "mul r6, r7, r6\n\t"
  101040. "lsr r7, r6, #16\n\t"
  101041. "lsl r6, r6, #16\n\t"
  101042. "adds r3, r3, r6\n\t"
  101043. "adcs r4, r4, r7\n\t"
  101044. "adc r5, r5, #0\n\t"
  101045. #else
  101046. "umull r6, r7, r8, r9\n\t"
  101047. "adds r3, r3, r6\n\t"
  101048. "adcs r4, r4, r7\n\t"
  101049. "adc r5, r5, #0\n\t"
  101050. #endif
  101051. /* A[6] * B[9] */
  101052. "ldr r8, [%[a], #24]\n\t"
  101053. "ldr r9, [%[b], #36]\n\t"
  101054. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101055. "lsl r6, r8, #16\n\t"
  101056. "lsl r7, r9, #16\n\t"
  101057. "lsr r6, r6, #16\n\t"
  101058. "lsr r7, r7, #16\n\t"
  101059. "mul r7, r6, r7\n\t"
  101060. "adds r3, r3, r7\n\t"
  101061. "adcs r4, r4, #0\n\t"
  101062. "adc r5, r5, #0\n\t"
  101063. "lsr r7, r9, #16\n\t"
  101064. "mul r6, r7, r6\n\t"
  101065. "lsr r7, r6, #16\n\t"
  101066. "lsl r6, r6, #16\n\t"
  101067. "adds r3, r3, r6\n\t"
  101068. "adcs r4, r4, r7\n\t"
  101069. "adc r5, r5, #0\n\t"
  101070. "lsr r6, r8, #16\n\t"
  101071. "lsr r7, r9, #16\n\t"
  101072. "mul r7, r6, r7\n\t"
  101073. "adds r4, r4, r7\n\t"
  101074. "adc r5, r5, #0\n\t"
  101075. "lsl r7, r9, #16\n\t"
  101076. "lsr r7, r7, #16\n\t"
  101077. "mul r6, r7, r6\n\t"
  101078. "lsr r7, r6, #16\n\t"
  101079. "lsl r6, r6, #16\n\t"
  101080. "adds r3, r3, r6\n\t"
  101081. "adcs r4, r4, r7\n\t"
  101082. "adc r5, r5, #0\n\t"
  101083. #else
  101084. "umull r6, r7, r8, r9\n\t"
  101085. "adds r3, r3, r6\n\t"
  101086. "adcs r4, r4, r7\n\t"
  101087. "adc r5, r5, #0\n\t"
  101088. #endif
  101089. /* A[7] * B[8] */
  101090. "ldr r9, [%[b], #32]\n\t"
  101091. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101092. "lsl r6, r11, #16\n\t"
  101093. "lsl r7, r9, #16\n\t"
  101094. "lsr r6, r6, #16\n\t"
  101095. "lsr r7, r7, #16\n\t"
  101096. "mul r7, r6, r7\n\t"
  101097. "adds r3, r3, r7\n\t"
  101098. "adcs r4, r4, #0\n\t"
  101099. "adc r5, r5, #0\n\t"
  101100. "lsr r7, r9, #16\n\t"
  101101. "mul r6, r7, r6\n\t"
  101102. "lsr r7, r6, #16\n\t"
  101103. "lsl r6, r6, #16\n\t"
  101104. "adds r3, r3, r6\n\t"
  101105. "adcs r4, r4, r7\n\t"
  101106. "adc r5, r5, #0\n\t"
  101107. "lsr r6, r11, #16\n\t"
  101108. "lsr r7, r9, #16\n\t"
  101109. "mul r7, r6, r7\n\t"
  101110. "adds r4, r4, r7\n\t"
  101111. "adc r5, r5, #0\n\t"
  101112. "lsl r7, r9, #16\n\t"
  101113. "lsr r7, r7, #16\n\t"
  101114. "mul r6, r7, r6\n\t"
  101115. "lsr r7, r6, #16\n\t"
  101116. "lsl r6, r6, #16\n\t"
  101117. "adds r3, r3, r6\n\t"
  101118. "adcs r4, r4, r7\n\t"
  101119. "adc r5, r5, #0\n\t"
  101120. #else
  101121. "umull r6, r7, r11, r9\n\t"
  101122. "adds r3, r3, r6\n\t"
  101123. "adcs r4, r4, r7\n\t"
  101124. "adc r5, r5, #0\n\t"
  101125. #endif
  101126. /* A[8] * B[7] */
  101127. "ldr r8, [%[a], #32]\n\t"
  101128. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101129. "lsl r6, r8, #16\n\t"
  101130. "lsl r7, r12, #16\n\t"
  101131. "lsr r6, r6, #16\n\t"
  101132. "lsr r7, r7, #16\n\t"
  101133. "mul r7, r6, r7\n\t"
  101134. "adds r3, r3, r7\n\t"
  101135. "adcs r4, r4, #0\n\t"
  101136. "adc r5, r5, #0\n\t"
  101137. "lsr r7, r12, #16\n\t"
  101138. "mul r6, r7, r6\n\t"
  101139. "lsr r7, r6, #16\n\t"
  101140. "lsl r6, r6, #16\n\t"
  101141. "adds r3, r3, r6\n\t"
  101142. "adcs r4, r4, r7\n\t"
  101143. "adc r5, r5, #0\n\t"
  101144. "lsr r6, r8, #16\n\t"
  101145. "lsr r7, r12, #16\n\t"
  101146. "mul r7, r6, r7\n\t"
  101147. "adds r4, r4, r7\n\t"
  101148. "adc r5, r5, #0\n\t"
  101149. "lsl r7, r12, #16\n\t"
  101150. "lsr r7, r7, #16\n\t"
  101151. "mul r6, r7, r6\n\t"
  101152. "lsr r7, r6, #16\n\t"
  101153. "lsl r6, r6, #16\n\t"
  101154. "adds r3, r3, r6\n\t"
  101155. "adcs r4, r4, r7\n\t"
  101156. "adc r5, r5, #0\n\t"
  101157. #else
  101158. "umull r6, r7, r8, r12\n\t"
  101159. "adds r3, r3, r6\n\t"
  101160. "adcs r4, r4, r7\n\t"
  101161. "adc r5, r5, #0\n\t"
  101162. #endif
  101163. /* A[9] * B[6] */
  101164. "ldr r8, [%[a], #36]\n\t"
  101165. "ldr r9, [%[b], #24]\n\t"
  101166. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101167. "lsl r6, r8, #16\n\t"
  101168. "lsl r7, r9, #16\n\t"
  101169. "lsr r6, r6, #16\n\t"
  101170. "lsr r7, r7, #16\n\t"
  101171. "mul r7, r6, r7\n\t"
  101172. "adds r3, r3, r7\n\t"
  101173. "adcs r4, r4, #0\n\t"
  101174. "adc r5, r5, #0\n\t"
  101175. "lsr r7, r9, #16\n\t"
  101176. "mul r6, r7, r6\n\t"
  101177. "lsr r7, r6, #16\n\t"
  101178. "lsl r6, r6, #16\n\t"
  101179. "adds r3, r3, r6\n\t"
  101180. "adcs r4, r4, r7\n\t"
  101181. "adc r5, r5, #0\n\t"
  101182. "lsr r6, r8, #16\n\t"
  101183. "lsr r7, r9, #16\n\t"
  101184. "mul r7, r6, r7\n\t"
  101185. "adds r4, r4, r7\n\t"
  101186. "adc r5, r5, #0\n\t"
  101187. "lsl r7, r9, #16\n\t"
  101188. "lsr r7, r7, #16\n\t"
  101189. "mul r6, r7, r6\n\t"
  101190. "lsr r7, r6, #16\n\t"
  101191. "lsl r6, r6, #16\n\t"
  101192. "adds r3, r3, r6\n\t"
  101193. "adcs r4, r4, r7\n\t"
  101194. "adc r5, r5, #0\n\t"
  101195. #else
  101196. "umull r6, r7, r8, r9\n\t"
  101197. "adds r3, r3, r6\n\t"
  101198. "adcs r4, r4, r7\n\t"
  101199. "adc r5, r5, #0\n\t"
  101200. #endif
  101201. /* A[10] * B[5] */
  101202. "ldr r8, [%[a], #40]\n\t"
  101203. "ldr r9, [%[b], #20]\n\t"
  101204. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101205. "lsl r6, r8, #16\n\t"
  101206. "lsl r7, r9, #16\n\t"
  101207. "lsr r6, r6, #16\n\t"
  101208. "lsr r7, r7, #16\n\t"
  101209. "mul r7, r6, r7\n\t"
  101210. "adds r3, r3, r7\n\t"
  101211. "adcs r4, r4, #0\n\t"
  101212. "adc r5, r5, #0\n\t"
  101213. "lsr r7, r9, #16\n\t"
  101214. "mul r6, r7, r6\n\t"
  101215. "lsr r7, r6, #16\n\t"
  101216. "lsl r6, r6, #16\n\t"
  101217. "adds r3, r3, r6\n\t"
  101218. "adcs r4, r4, r7\n\t"
  101219. "adc r5, r5, #0\n\t"
  101220. "lsr r6, r8, #16\n\t"
  101221. "lsr r7, r9, #16\n\t"
  101222. "mul r7, r6, r7\n\t"
  101223. "adds r4, r4, r7\n\t"
  101224. "adc r5, r5, #0\n\t"
  101225. "lsl r7, r9, #16\n\t"
  101226. "lsr r7, r7, #16\n\t"
  101227. "mul r6, r7, r6\n\t"
  101228. "lsr r7, r6, #16\n\t"
  101229. "lsl r6, r6, #16\n\t"
  101230. "adds r3, r3, r6\n\t"
  101231. "adcs r4, r4, r7\n\t"
  101232. "adc r5, r5, #0\n\t"
  101233. #else
  101234. "umull r6, r7, r8, r9\n\t"
  101235. "adds r3, r3, r6\n\t"
  101236. "adcs r4, r4, r7\n\t"
  101237. "adc r5, r5, #0\n\t"
  101238. #endif
  101239. /* A[11] * B[4] */
  101240. "ldr r8, [%[a], #44]\n\t"
  101241. "ldr r9, [%[b], #16]\n\t"
  101242. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101243. "lsl r6, r8, #16\n\t"
  101244. "lsl r7, r9, #16\n\t"
  101245. "lsr r6, r6, #16\n\t"
  101246. "lsr r7, r7, #16\n\t"
  101247. "mul r7, r6, r7\n\t"
  101248. "adds r3, r3, r7\n\t"
  101249. "adcs r4, r4, #0\n\t"
  101250. "adc r5, r5, #0\n\t"
  101251. "lsr r7, r9, #16\n\t"
  101252. "mul r6, r7, r6\n\t"
  101253. "lsr r7, r6, #16\n\t"
  101254. "lsl r6, r6, #16\n\t"
  101255. "adds r3, r3, r6\n\t"
  101256. "adcs r4, r4, r7\n\t"
  101257. "adc r5, r5, #0\n\t"
  101258. "lsr r6, r8, #16\n\t"
  101259. "lsr r7, r9, #16\n\t"
  101260. "mul r7, r6, r7\n\t"
  101261. "adds r4, r4, r7\n\t"
  101262. "adc r5, r5, #0\n\t"
  101263. "lsl r7, r9, #16\n\t"
  101264. "lsr r7, r7, #16\n\t"
  101265. "mul r6, r7, r6\n\t"
  101266. "lsr r7, r6, #16\n\t"
  101267. "lsl r6, r6, #16\n\t"
  101268. "adds r3, r3, r6\n\t"
  101269. "adcs r4, r4, r7\n\t"
  101270. "adc r5, r5, #0\n\t"
  101271. #else
  101272. "umull r6, r7, r8, r9\n\t"
  101273. "adds r3, r3, r6\n\t"
  101274. "adcs r4, r4, r7\n\t"
  101275. "adc r5, r5, #0\n\t"
  101276. #endif
  101277. /* A[12] * B[3] */
  101278. "ldr r8, [%[a], #48]\n\t"
  101279. "ldr r9, [%[b], #12]\n\t"
  101280. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101281. "lsl r6, r8, #16\n\t"
  101282. "lsl r7, r9, #16\n\t"
  101283. "lsr r6, r6, #16\n\t"
  101284. "lsr r7, r7, #16\n\t"
  101285. "mul r7, r6, r7\n\t"
  101286. "adds r3, r3, r7\n\t"
  101287. "adcs r4, r4, #0\n\t"
  101288. "adc r5, r5, #0\n\t"
  101289. "lsr r7, r9, #16\n\t"
  101290. "mul r6, r7, r6\n\t"
  101291. "lsr r7, r6, #16\n\t"
  101292. "lsl r6, r6, #16\n\t"
  101293. "adds r3, r3, r6\n\t"
  101294. "adcs r4, r4, r7\n\t"
  101295. "adc r5, r5, #0\n\t"
  101296. "lsr r6, r8, #16\n\t"
  101297. "lsr r7, r9, #16\n\t"
  101298. "mul r7, r6, r7\n\t"
  101299. "adds r4, r4, r7\n\t"
  101300. "adc r5, r5, #0\n\t"
  101301. "lsl r7, r9, #16\n\t"
  101302. "lsr r7, r7, #16\n\t"
  101303. "mul r6, r7, r6\n\t"
  101304. "lsr r7, r6, #16\n\t"
  101305. "lsl r6, r6, #16\n\t"
  101306. "adds r3, r3, r6\n\t"
  101307. "adcs r4, r4, r7\n\t"
  101308. "adc r5, r5, #0\n\t"
  101309. #else
  101310. "umull r6, r7, r8, r9\n\t"
  101311. "adds r3, r3, r6\n\t"
  101312. "adcs r4, r4, r7\n\t"
  101313. "adc r5, r5, #0\n\t"
  101314. #endif
  101315. /* A[13] * B[2] */
  101316. "ldr r8, [%[a], #52]\n\t"
  101317. "ldr r9, [%[b], #8]\n\t"
  101318. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101319. "lsl r6, r8, #16\n\t"
  101320. "lsl r7, r9, #16\n\t"
  101321. "lsr r6, r6, #16\n\t"
  101322. "lsr r7, r7, #16\n\t"
  101323. "mul r7, r6, r7\n\t"
  101324. "adds r3, r3, r7\n\t"
  101325. "adcs r4, r4, #0\n\t"
  101326. "adc r5, r5, #0\n\t"
  101327. "lsr r7, r9, #16\n\t"
  101328. "mul r6, r7, r6\n\t"
  101329. "lsr r7, r6, #16\n\t"
  101330. "lsl r6, r6, #16\n\t"
  101331. "adds r3, r3, r6\n\t"
  101332. "adcs r4, r4, r7\n\t"
  101333. "adc r5, r5, #0\n\t"
  101334. "lsr r6, r8, #16\n\t"
  101335. "lsr r7, r9, #16\n\t"
  101336. "mul r7, r6, r7\n\t"
  101337. "adds r4, r4, r7\n\t"
  101338. "adc r5, r5, #0\n\t"
  101339. "lsl r7, r9, #16\n\t"
  101340. "lsr r7, r7, #16\n\t"
  101341. "mul r6, r7, r6\n\t"
  101342. "lsr r7, r6, #16\n\t"
  101343. "lsl r6, r6, #16\n\t"
  101344. "adds r3, r3, r6\n\t"
  101345. "adcs r4, r4, r7\n\t"
  101346. "adc r5, r5, #0\n\t"
  101347. #else
  101348. "umull r6, r7, r8, r9\n\t"
  101349. "adds r3, r3, r6\n\t"
  101350. "adcs r4, r4, r7\n\t"
  101351. "adc r5, r5, #0\n\t"
  101352. #endif
  101353. /* A[14] * B[1] */
  101354. "ldr r8, [%[a], #56]\n\t"
  101355. "ldr r9, [%[b], #4]\n\t"
  101356. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101357. "lsl r6, r8, #16\n\t"
  101358. "lsl r7, r9, #16\n\t"
  101359. "lsr r6, r6, #16\n\t"
  101360. "lsr r7, r7, #16\n\t"
  101361. "mul r7, r6, r7\n\t"
  101362. "adds r3, r3, r7\n\t"
  101363. "adcs r4, r4, #0\n\t"
  101364. "adc r5, r5, #0\n\t"
  101365. "lsr r7, r9, #16\n\t"
  101366. "mul r6, r7, r6\n\t"
  101367. "lsr r7, r6, #16\n\t"
  101368. "lsl r6, r6, #16\n\t"
  101369. "adds r3, r3, r6\n\t"
  101370. "adcs r4, r4, r7\n\t"
  101371. "adc r5, r5, #0\n\t"
  101372. "lsr r6, r8, #16\n\t"
  101373. "lsr r7, r9, #16\n\t"
  101374. "mul r7, r6, r7\n\t"
  101375. "adds r4, r4, r7\n\t"
  101376. "adc r5, r5, #0\n\t"
  101377. "lsl r7, r9, #16\n\t"
  101378. "lsr r7, r7, #16\n\t"
  101379. "mul r6, r7, r6\n\t"
  101380. "lsr r7, r6, #16\n\t"
  101381. "lsl r6, r6, #16\n\t"
  101382. "adds r3, r3, r6\n\t"
  101383. "adcs r4, r4, r7\n\t"
  101384. "adc r5, r5, #0\n\t"
  101385. #else
  101386. "umull r6, r7, r8, r9\n\t"
  101387. "adds r3, r3, r6\n\t"
  101388. "adcs r4, r4, r7\n\t"
  101389. "adc r5, r5, #0\n\t"
  101390. #endif
  101391. /* A[15] * B[0] */
  101392. "ldr r8, [%[a], #60]\n\t"
  101393. "ldr r9, [%[b]]\n\t"
  101394. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101395. "lsl r6, r8, #16\n\t"
  101396. "lsl r7, r9, #16\n\t"
  101397. "lsr r6, r6, #16\n\t"
  101398. "lsr r7, r7, #16\n\t"
  101399. "mul r7, r6, r7\n\t"
  101400. "adds r3, r3, r7\n\t"
  101401. "adcs r4, r4, #0\n\t"
  101402. "adc r5, r5, #0\n\t"
  101403. "lsr r7, r9, #16\n\t"
  101404. "mul r6, r7, r6\n\t"
  101405. "lsr r7, r6, #16\n\t"
  101406. "lsl r6, r6, #16\n\t"
  101407. "adds r3, r3, r6\n\t"
  101408. "adcs r4, r4, r7\n\t"
  101409. "adc r5, r5, #0\n\t"
  101410. "lsr r6, r8, #16\n\t"
  101411. "lsr r7, r9, #16\n\t"
  101412. "mul r7, r6, r7\n\t"
  101413. "adds r4, r4, r7\n\t"
  101414. "adc r5, r5, #0\n\t"
  101415. "lsl r7, r9, #16\n\t"
  101416. "lsr r7, r7, #16\n\t"
  101417. "mul r6, r7, r6\n\t"
  101418. "lsr r7, r6, #16\n\t"
  101419. "lsl r6, r6, #16\n\t"
  101420. "adds r3, r3, r6\n\t"
  101421. "adcs r4, r4, r7\n\t"
  101422. "adc r5, r5, #0\n\t"
  101423. #else
  101424. "umull r6, r7, r8, r9\n\t"
  101425. "adds r3, r3, r6\n\t"
  101426. "adcs r4, r4, r7\n\t"
  101427. "adc r5, r5, #0\n\t"
  101428. #endif
  101429. "str r3, [sp, #60]\n\t"
  101430. /* A[16] * B[0] */
  101431. "ldr r8, [%[a], #64]\n\t"
  101432. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101433. "lsl r6, r8, #16\n\t"
  101434. "lsl r7, r9, #16\n\t"
  101435. "lsr r6, r6, #16\n\t"
  101436. "lsr r7, r7, #16\n\t"
  101437. "mul r7, r6, r7\n\t"
  101438. "adds r4, r4, r7\n\t"
  101439. "adcs r5, r5, #0\n\t"
  101440. "mov r3, #0\n\t"
  101441. "adc r3, r3, #0\n\t"
  101442. "lsr r7, r9, #16\n\t"
  101443. "mul r6, r7, r6\n\t"
  101444. "lsr r7, r6, #16\n\t"
  101445. "lsl r6, r6, #16\n\t"
  101446. "adds r4, r4, r6\n\t"
  101447. "adcs r5, r5, r7\n\t"
  101448. "adc r3, r3, #0\n\t"
  101449. "lsr r6, r8, #16\n\t"
  101450. "lsr r7, r9, #16\n\t"
  101451. "mul r7, r6, r7\n\t"
  101452. "adds r5, r5, r7\n\t"
  101453. "adc r3, r3, #0\n\t"
  101454. "lsl r7, r9, #16\n\t"
  101455. "lsr r7, r7, #16\n\t"
  101456. "mul r6, r7, r6\n\t"
  101457. "lsr r7, r6, #16\n\t"
  101458. "lsl r6, r6, #16\n\t"
  101459. "adds r4, r4, r6\n\t"
  101460. "adcs r5, r5, r7\n\t"
  101461. "adc r3, r3, #0\n\t"
  101462. #else
  101463. "umull r6, r7, r8, r9\n\t"
  101464. "adds r4, r4, r6\n\t"
  101465. "adcs r5, r5, r7\n\t"
  101466. "mov r3, #0\n\t"
  101467. "adc r3, r3, #0\n\t"
  101468. #endif
  101469. /* A[15] * B[1] */
  101470. "ldr r8, [%[a], #60]\n\t"
  101471. "ldr r9, [%[b], #4]\n\t"
  101472. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101473. "lsl r6, r8, #16\n\t"
  101474. "lsl r7, r9, #16\n\t"
  101475. "lsr r6, r6, #16\n\t"
  101476. "lsr r7, r7, #16\n\t"
  101477. "mul r7, r6, r7\n\t"
  101478. "adds r4, r4, r7\n\t"
  101479. "adcs r5, r5, #0\n\t"
  101480. "adc r3, r3, #0\n\t"
  101481. "lsr r7, r9, #16\n\t"
  101482. "mul r6, r7, r6\n\t"
  101483. "lsr r7, r6, #16\n\t"
  101484. "lsl r6, r6, #16\n\t"
  101485. "adds r4, r4, r6\n\t"
  101486. "adcs r5, r5, r7\n\t"
  101487. "adc r3, r3, #0\n\t"
  101488. "lsr r6, r8, #16\n\t"
  101489. "lsr r7, r9, #16\n\t"
  101490. "mul r7, r6, r7\n\t"
  101491. "adds r5, r5, r7\n\t"
  101492. "adc r3, r3, #0\n\t"
  101493. "lsl r7, r9, #16\n\t"
  101494. "lsr r7, r7, #16\n\t"
  101495. "mul r6, r7, r6\n\t"
  101496. "lsr r7, r6, #16\n\t"
  101497. "lsl r6, r6, #16\n\t"
  101498. "adds r4, r4, r6\n\t"
  101499. "adcs r5, r5, r7\n\t"
  101500. "adc r3, r3, #0\n\t"
  101501. #else
  101502. "umull r6, r7, r8, r9\n\t"
  101503. "adds r4, r4, r6\n\t"
  101504. "adcs r5, r5, r7\n\t"
  101505. "adc r3, r3, #0\n\t"
  101506. #endif
  101507. /* A[14] * B[2] */
  101508. "ldr r8, [%[a], #56]\n\t"
  101509. "ldr r9, [%[b], #8]\n\t"
  101510. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101511. "lsl r6, r8, #16\n\t"
  101512. "lsl r7, r9, #16\n\t"
  101513. "lsr r6, r6, #16\n\t"
  101514. "lsr r7, r7, #16\n\t"
  101515. "mul r7, r6, r7\n\t"
  101516. "adds r4, r4, r7\n\t"
  101517. "adcs r5, r5, #0\n\t"
  101518. "adc r3, r3, #0\n\t"
  101519. "lsr r7, r9, #16\n\t"
  101520. "mul r6, r7, r6\n\t"
  101521. "lsr r7, r6, #16\n\t"
  101522. "lsl r6, r6, #16\n\t"
  101523. "adds r4, r4, r6\n\t"
  101524. "adcs r5, r5, r7\n\t"
  101525. "adc r3, r3, #0\n\t"
  101526. "lsr r6, r8, #16\n\t"
  101527. "lsr r7, r9, #16\n\t"
  101528. "mul r7, r6, r7\n\t"
  101529. "adds r5, r5, r7\n\t"
  101530. "adc r3, r3, #0\n\t"
  101531. "lsl r7, r9, #16\n\t"
  101532. "lsr r7, r7, #16\n\t"
  101533. "mul r6, r7, r6\n\t"
  101534. "lsr r7, r6, #16\n\t"
  101535. "lsl r6, r6, #16\n\t"
  101536. "adds r4, r4, r6\n\t"
  101537. "adcs r5, r5, r7\n\t"
  101538. "adc r3, r3, #0\n\t"
  101539. #else
  101540. "umull r6, r7, r8, r9\n\t"
  101541. "adds r4, r4, r6\n\t"
  101542. "adcs r5, r5, r7\n\t"
  101543. "adc r3, r3, #0\n\t"
  101544. #endif
  101545. /* A[13] * B[3] */
  101546. "ldr r8, [%[a], #52]\n\t"
  101547. "ldr r9, [%[b], #12]\n\t"
  101548. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101549. "lsl r6, r8, #16\n\t"
  101550. "lsl r7, r9, #16\n\t"
  101551. "lsr r6, r6, #16\n\t"
  101552. "lsr r7, r7, #16\n\t"
  101553. "mul r7, r6, r7\n\t"
  101554. "adds r4, r4, r7\n\t"
  101555. "adcs r5, r5, #0\n\t"
  101556. "adc r3, r3, #0\n\t"
  101557. "lsr r7, r9, #16\n\t"
  101558. "mul r6, r7, r6\n\t"
  101559. "lsr r7, r6, #16\n\t"
  101560. "lsl r6, r6, #16\n\t"
  101561. "adds r4, r4, r6\n\t"
  101562. "adcs r5, r5, r7\n\t"
  101563. "adc r3, r3, #0\n\t"
  101564. "lsr r6, r8, #16\n\t"
  101565. "lsr r7, r9, #16\n\t"
  101566. "mul r7, r6, r7\n\t"
  101567. "adds r5, r5, r7\n\t"
  101568. "adc r3, r3, #0\n\t"
  101569. "lsl r7, r9, #16\n\t"
  101570. "lsr r7, r7, #16\n\t"
  101571. "mul r6, r7, r6\n\t"
  101572. "lsr r7, r6, #16\n\t"
  101573. "lsl r6, r6, #16\n\t"
  101574. "adds r4, r4, r6\n\t"
  101575. "adcs r5, r5, r7\n\t"
  101576. "adc r3, r3, #0\n\t"
  101577. #else
  101578. "umull r6, r7, r8, r9\n\t"
  101579. "adds r4, r4, r6\n\t"
  101580. "adcs r5, r5, r7\n\t"
  101581. "adc r3, r3, #0\n\t"
  101582. #endif
  101583. /* A[12] * B[4] */
  101584. "ldr r8, [%[a], #48]\n\t"
  101585. "ldr r9, [%[b], #16]\n\t"
  101586. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101587. "lsl r6, r8, #16\n\t"
  101588. "lsl r7, r9, #16\n\t"
  101589. "lsr r6, r6, #16\n\t"
  101590. "lsr r7, r7, #16\n\t"
  101591. "mul r7, r6, r7\n\t"
  101592. "adds r4, r4, r7\n\t"
  101593. "adcs r5, r5, #0\n\t"
  101594. "adc r3, r3, #0\n\t"
  101595. "lsr r7, r9, #16\n\t"
  101596. "mul r6, r7, r6\n\t"
  101597. "lsr r7, r6, #16\n\t"
  101598. "lsl r6, r6, #16\n\t"
  101599. "adds r4, r4, r6\n\t"
  101600. "adcs r5, r5, r7\n\t"
  101601. "adc r3, r3, #0\n\t"
  101602. "lsr r6, r8, #16\n\t"
  101603. "lsr r7, r9, #16\n\t"
  101604. "mul r7, r6, r7\n\t"
  101605. "adds r5, r5, r7\n\t"
  101606. "adc r3, r3, #0\n\t"
  101607. "lsl r7, r9, #16\n\t"
  101608. "lsr r7, r7, #16\n\t"
  101609. "mul r6, r7, r6\n\t"
  101610. "lsr r7, r6, #16\n\t"
  101611. "lsl r6, r6, #16\n\t"
  101612. "adds r4, r4, r6\n\t"
  101613. "adcs r5, r5, r7\n\t"
  101614. "adc r3, r3, #0\n\t"
  101615. #else
  101616. "umull r6, r7, r8, r9\n\t"
  101617. "adds r4, r4, r6\n\t"
  101618. "adcs r5, r5, r7\n\t"
  101619. "adc r3, r3, #0\n\t"
  101620. #endif
  101621. /* A[11] * B[5] */
  101622. "ldr r8, [%[a], #44]\n\t"
  101623. "ldr r9, [%[b], #20]\n\t"
  101624. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101625. "lsl r6, r8, #16\n\t"
  101626. "lsl r7, r9, #16\n\t"
  101627. "lsr r6, r6, #16\n\t"
  101628. "lsr r7, r7, #16\n\t"
  101629. "mul r7, r6, r7\n\t"
  101630. "adds r4, r4, r7\n\t"
  101631. "adcs r5, r5, #0\n\t"
  101632. "adc r3, r3, #0\n\t"
  101633. "lsr r7, r9, #16\n\t"
  101634. "mul r6, r7, r6\n\t"
  101635. "lsr r7, r6, #16\n\t"
  101636. "lsl r6, r6, #16\n\t"
  101637. "adds r4, r4, r6\n\t"
  101638. "adcs r5, r5, r7\n\t"
  101639. "adc r3, r3, #0\n\t"
  101640. "lsr r6, r8, #16\n\t"
  101641. "lsr r7, r9, #16\n\t"
  101642. "mul r7, r6, r7\n\t"
  101643. "adds r5, r5, r7\n\t"
  101644. "adc r3, r3, #0\n\t"
  101645. "lsl r7, r9, #16\n\t"
  101646. "lsr r7, r7, #16\n\t"
  101647. "mul r6, r7, r6\n\t"
  101648. "lsr r7, r6, #16\n\t"
  101649. "lsl r6, r6, #16\n\t"
  101650. "adds r4, r4, r6\n\t"
  101651. "adcs r5, r5, r7\n\t"
  101652. "adc r3, r3, #0\n\t"
  101653. #else
  101654. "umull r6, r7, r8, r9\n\t"
  101655. "adds r4, r4, r6\n\t"
  101656. "adcs r5, r5, r7\n\t"
  101657. "adc r3, r3, #0\n\t"
  101658. #endif
  101659. /* A[10] * B[6] */
  101660. "ldr r8, [%[a], #40]\n\t"
  101661. "ldr r9, [%[b], #24]\n\t"
  101662. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101663. "lsl r6, r8, #16\n\t"
  101664. "lsl r7, r9, #16\n\t"
  101665. "lsr r6, r6, #16\n\t"
  101666. "lsr r7, r7, #16\n\t"
  101667. "mul r7, r6, r7\n\t"
  101668. "adds r4, r4, r7\n\t"
  101669. "adcs r5, r5, #0\n\t"
  101670. "adc r3, r3, #0\n\t"
  101671. "lsr r7, r9, #16\n\t"
  101672. "mul r6, r7, r6\n\t"
  101673. "lsr r7, r6, #16\n\t"
  101674. "lsl r6, r6, #16\n\t"
  101675. "adds r4, r4, r6\n\t"
  101676. "adcs r5, r5, r7\n\t"
  101677. "adc r3, r3, #0\n\t"
  101678. "lsr r6, r8, #16\n\t"
  101679. "lsr r7, r9, #16\n\t"
  101680. "mul r7, r6, r7\n\t"
  101681. "adds r5, r5, r7\n\t"
  101682. "adc r3, r3, #0\n\t"
  101683. "lsl r7, r9, #16\n\t"
  101684. "lsr r7, r7, #16\n\t"
  101685. "mul r6, r7, r6\n\t"
  101686. "lsr r7, r6, #16\n\t"
  101687. "lsl r6, r6, #16\n\t"
  101688. "adds r4, r4, r6\n\t"
  101689. "adcs r5, r5, r7\n\t"
  101690. "adc r3, r3, #0\n\t"
  101691. #else
  101692. "umull r6, r7, r8, r9\n\t"
  101693. "adds r4, r4, r6\n\t"
  101694. "adcs r5, r5, r7\n\t"
  101695. "adc r3, r3, #0\n\t"
  101696. #endif
  101697. /* A[9] * B[7] */
  101698. "ldr r8, [%[a], #36]\n\t"
  101699. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101700. "lsl r6, r8, #16\n\t"
  101701. "lsl r7, r12, #16\n\t"
  101702. "lsr r6, r6, #16\n\t"
  101703. "lsr r7, r7, #16\n\t"
  101704. "mul r7, r6, r7\n\t"
  101705. "adds r4, r4, r7\n\t"
  101706. "adcs r5, r5, #0\n\t"
  101707. "adc r3, r3, #0\n\t"
  101708. "lsr r7, r12, #16\n\t"
  101709. "mul r6, r7, r6\n\t"
  101710. "lsr r7, r6, #16\n\t"
  101711. "lsl r6, r6, #16\n\t"
  101712. "adds r4, r4, r6\n\t"
  101713. "adcs r5, r5, r7\n\t"
  101714. "adc r3, r3, #0\n\t"
  101715. "lsr r6, r8, #16\n\t"
  101716. "lsr r7, r12, #16\n\t"
  101717. "mul r7, r6, r7\n\t"
  101718. "adds r5, r5, r7\n\t"
  101719. "adc r3, r3, #0\n\t"
  101720. "lsl r7, r12, #16\n\t"
  101721. "lsr r7, r7, #16\n\t"
  101722. "mul r6, r7, r6\n\t"
  101723. "lsr r7, r6, #16\n\t"
  101724. "lsl r6, r6, #16\n\t"
  101725. "adds r4, r4, r6\n\t"
  101726. "adcs r5, r5, r7\n\t"
  101727. "adc r3, r3, #0\n\t"
  101728. #else
  101729. "umull r6, r7, r8, r12\n\t"
  101730. "adds r4, r4, r6\n\t"
  101731. "adcs r5, r5, r7\n\t"
  101732. "adc r3, r3, #0\n\t"
  101733. #endif
  101734. /* A[8] * B[8] */
  101735. "ldr r11, [%[a], #32]\n\t"
  101736. "ldr r12, [%[b], #32]\n\t"
  101737. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101738. "lsl r6, r11, #16\n\t"
  101739. "lsl r7, r12, #16\n\t"
  101740. "lsr r6, r6, #16\n\t"
  101741. "lsr r7, r7, #16\n\t"
  101742. "mul r7, r6, r7\n\t"
  101743. "adds r4, r4, r7\n\t"
  101744. "adcs r5, r5, #0\n\t"
  101745. "adc r3, r3, #0\n\t"
  101746. "lsr r7, r12, #16\n\t"
  101747. "mul r6, r7, r6\n\t"
  101748. "lsr r7, r6, #16\n\t"
  101749. "lsl r6, r6, #16\n\t"
  101750. "adds r4, r4, r6\n\t"
  101751. "adcs r5, r5, r7\n\t"
  101752. "adc r3, r3, #0\n\t"
  101753. "lsr r6, r11, #16\n\t"
  101754. "lsr r7, r12, #16\n\t"
  101755. "mul r7, r6, r7\n\t"
  101756. "adds r5, r5, r7\n\t"
  101757. "adc r3, r3, #0\n\t"
  101758. "lsl r7, r12, #16\n\t"
  101759. "lsr r7, r7, #16\n\t"
  101760. "mul r6, r7, r6\n\t"
  101761. "lsr r7, r6, #16\n\t"
  101762. "lsl r6, r6, #16\n\t"
  101763. "adds r4, r4, r6\n\t"
  101764. "adcs r5, r5, r7\n\t"
  101765. "adc r3, r3, #0\n\t"
  101766. #else
  101767. "umull r6, r7, r11, r12\n\t"
  101768. "adds r4, r4, r6\n\t"
  101769. "adcs r5, r5, r7\n\t"
  101770. "adc r3, r3, #0\n\t"
  101771. #endif
  101772. /* A[7] * B[9] */
  101773. "ldr r8, [%[a], #28]\n\t"
  101774. "ldr r9, [%[b], #36]\n\t"
  101775. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101776. "lsl r6, r8, #16\n\t"
  101777. "lsl r7, r9, #16\n\t"
  101778. "lsr r6, r6, #16\n\t"
  101779. "lsr r7, r7, #16\n\t"
  101780. "mul r7, r6, r7\n\t"
  101781. "adds r4, r4, r7\n\t"
  101782. "adcs r5, r5, #0\n\t"
  101783. "adc r3, r3, #0\n\t"
  101784. "lsr r7, r9, #16\n\t"
  101785. "mul r6, r7, r6\n\t"
  101786. "lsr r7, r6, #16\n\t"
  101787. "lsl r6, r6, #16\n\t"
  101788. "adds r4, r4, r6\n\t"
  101789. "adcs r5, r5, r7\n\t"
  101790. "adc r3, r3, #0\n\t"
  101791. "lsr r6, r8, #16\n\t"
  101792. "lsr r7, r9, #16\n\t"
  101793. "mul r7, r6, r7\n\t"
  101794. "adds r5, r5, r7\n\t"
  101795. "adc r3, r3, #0\n\t"
  101796. "lsl r7, r9, #16\n\t"
  101797. "lsr r7, r7, #16\n\t"
  101798. "mul r6, r7, r6\n\t"
  101799. "lsr r7, r6, #16\n\t"
  101800. "lsl r6, r6, #16\n\t"
  101801. "adds r4, r4, r6\n\t"
  101802. "adcs r5, r5, r7\n\t"
  101803. "adc r3, r3, #0\n\t"
  101804. #else
  101805. "umull r6, r7, r8, r9\n\t"
  101806. "adds r4, r4, r6\n\t"
  101807. "adcs r5, r5, r7\n\t"
  101808. "adc r3, r3, #0\n\t"
  101809. #endif
  101810. /* A[6] * B[10] */
  101811. "ldr r8, [%[a], #24]\n\t"
  101812. "ldr r9, [%[b], #40]\n\t"
  101813. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101814. "lsl r6, r8, #16\n\t"
  101815. "lsl r7, r9, #16\n\t"
  101816. "lsr r6, r6, #16\n\t"
  101817. "lsr r7, r7, #16\n\t"
  101818. "mul r7, r6, r7\n\t"
  101819. "adds r4, r4, r7\n\t"
  101820. "adcs r5, r5, #0\n\t"
  101821. "adc r3, r3, #0\n\t"
  101822. "lsr r7, r9, #16\n\t"
  101823. "mul r6, r7, r6\n\t"
  101824. "lsr r7, r6, #16\n\t"
  101825. "lsl r6, r6, #16\n\t"
  101826. "adds r4, r4, r6\n\t"
  101827. "adcs r5, r5, r7\n\t"
  101828. "adc r3, r3, #0\n\t"
  101829. "lsr r6, r8, #16\n\t"
  101830. "lsr r7, r9, #16\n\t"
  101831. "mul r7, r6, r7\n\t"
  101832. "adds r5, r5, r7\n\t"
  101833. "adc r3, r3, #0\n\t"
  101834. "lsl r7, r9, #16\n\t"
  101835. "lsr r7, r7, #16\n\t"
  101836. "mul r6, r7, r6\n\t"
  101837. "lsr r7, r6, #16\n\t"
  101838. "lsl r6, r6, #16\n\t"
  101839. "adds r4, r4, r6\n\t"
  101840. "adcs r5, r5, r7\n\t"
  101841. "adc r3, r3, #0\n\t"
  101842. #else
  101843. "umull r6, r7, r8, r9\n\t"
  101844. "adds r4, r4, r6\n\t"
  101845. "adcs r5, r5, r7\n\t"
  101846. "adc r3, r3, #0\n\t"
  101847. #endif
  101848. /* A[5] * B[11] */
  101849. "ldr r8, [%[a], #20]\n\t"
  101850. "ldr r9, [%[b], #44]\n\t"
  101851. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101852. "lsl r6, r8, #16\n\t"
  101853. "lsl r7, r9, #16\n\t"
  101854. "lsr r6, r6, #16\n\t"
  101855. "lsr r7, r7, #16\n\t"
  101856. "mul r7, r6, r7\n\t"
  101857. "adds r4, r4, r7\n\t"
  101858. "adcs r5, r5, #0\n\t"
  101859. "adc r3, r3, #0\n\t"
  101860. "lsr r7, r9, #16\n\t"
  101861. "mul r6, r7, r6\n\t"
  101862. "lsr r7, r6, #16\n\t"
  101863. "lsl r6, r6, #16\n\t"
  101864. "adds r4, r4, r6\n\t"
  101865. "adcs r5, r5, r7\n\t"
  101866. "adc r3, r3, #0\n\t"
  101867. "lsr r6, r8, #16\n\t"
  101868. "lsr r7, r9, #16\n\t"
  101869. "mul r7, r6, r7\n\t"
  101870. "adds r5, r5, r7\n\t"
  101871. "adc r3, r3, #0\n\t"
  101872. "lsl r7, r9, #16\n\t"
  101873. "lsr r7, r7, #16\n\t"
  101874. "mul r6, r7, r6\n\t"
  101875. "lsr r7, r6, #16\n\t"
  101876. "lsl r6, r6, #16\n\t"
  101877. "adds r4, r4, r6\n\t"
  101878. "adcs r5, r5, r7\n\t"
  101879. "adc r3, r3, #0\n\t"
  101880. #else
  101881. "umull r6, r7, r8, r9\n\t"
  101882. "adds r4, r4, r6\n\t"
  101883. "adcs r5, r5, r7\n\t"
  101884. "adc r3, r3, #0\n\t"
  101885. #endif
  101886. /* A[4] * B[12] */
  101887. "ldr r8, [%[a], #16]\n\t"
  101888. "ldr r9, [%[b], #48]\n\t"
  101889. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101890. "lsl r6, r8, #16\n\t"
  101891. "lsl r7, r9, #16\n\t"
  101892. "lsr r6, r6, #16\n\t"
  101893. "lsr r7, r7, #16\n\t"
  101894. "mul r7, r6, r7\n\t"
  101895. "adds r4, r4, r7\n\t"
  101896. "adcs r5, r5, #0\n\t"
  101897. "adc r3, r3, #0\n\t"
  101898. "lsr r7, r9, #16\n\t"
  101899. "mul r6, r7, r6\n\t"
  101900. "lsr r7, r6, #16\n\t"
  101901. "lsl r6, r6, #16\n\t"
  101902. "adds r4, r4, r6\n\t"
  101903. "adcs r5, r5, r7\n\t"
  101904. "adc r3, r3, #0\n\t"
  101905. "lsr r6, r8, #16\n\t"
  101906. "lsr r7, r9, #16\n\t"
  101907. "mul r7, r6, r7\n\t"
  101908. "adds r5, r5, r7\n\t"
  101909. "adc r3, r3, #0\n\t"
  101910. "lsl r7, r9, #16\n\t"
  101911. "lsr r7, r7, #16\n\t"
  101912. "mul r6, r7, r6\n\t"
  101913. "lsr r7, r6, #16\n\t"
  101914. "lsl r6, r6, #16\n\t"
  101915. "adds r4, r4, r6\n\t"
  101916. "adcs r5, r5, r7\n\t"
  101917. "adc r3, r3, #0\n\t"
  101918. #else
  101919. "umull r6, r7, r8, r9\n\t"
  101920. "adds r4, r4, r6\n\t"
  101921. "adcs r5, r5, r7\n\t"
  101922. "adc r3, r3, #0\n\t"
  101923. #endif
  101924. /* A[3] * B[13] */
  101925. "ldr r8, [%[a], #12]\n\t"
  101926. "ldr r9, [%[b], #52]\n\t"
  101927. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101928. "lsl r6, r8, #16\n\t"
  101929. "lsl r7, r9, #16\n\t"
  101930. "lsr r6, r6, #16\n\t"
  101931. "lsr r7, r7, #16\n\t"
  101932. "mul r7, r6, r7\n\t"
  101933. "adds r4, r4, r7\n\t"
  101934. "adcs r5, r5, #0\n\t"
  101935. "adc r3, r3, #0\n\t"
  101936. "lsr r7, r9, #16\n\t"
  101937. "mul r6, r7, r6\n\t"
  101938. "lsr r7, r6, #16\n\t"
  101939. "lsl r6, r6, #16\n\t"
  101940. "adds r4, r4, r6\n\t"
  101941. "adcs r5, r5, r7\n\t"
  101942. "adc r3, r3, #0\n\t"
  101943. "lsr r6, r8, #16\n\t"
  101944. "lsr r7, r9, #16\n\t"
  101945. "mul r7, r6, r7\n\t"
  101946. "adds r5, r5, r7\n\t"
  101947. "adc r3, r3, #0\n\t"
  101948. "lsl r7, r9, #16\n\t"
  101949. "lsr r7, r7, #16\n\t"
  101950. "mul r6, r7, r6\n\t"
  101951. "lsr r7, r6, #16\n\t"
  101952. "lsl r6, r6, #16\n\t"
  101953. "adds r4, r4, r6\n\t"
  101954. "adcs r5, r5, r7\n\t"
  101955. "adc r3, r3, #0\n\t"
  101956. #else
  101957. "umull r6, r7, r8, r9\n\t"
  101958. "adds r4, r4, r6\n\t"
  101959. "adcs r5, r5, r7\n\t"
  101960. "adc r3, r3, #0\n\t"
  101961. #endif
  101962. /* A[2] * B[14] */
  101963. "ldr r8, [%[a], #8]\n\t"
  101964. "ldr r9, [%[b], #56]\n\t"
  101965. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  101966. "lsl r6, r8, #16\n\t"
  101967. "lsl r7, r9, #16\n\t"
  101968. "lsr r6, r6, #16\n\t"
  101969. "lsr r7, r7, #16\n\t"
  101970. "mul r7, r6, r7\n\t"
  101971. "adds r4, r4, r7\n\t"
  101972. "adcs r5, r5, #0\n\t"
  101973. "adc r3, r3, #0\n\t"
  101974. "lsr r7, r9, #16\n\t"
  101975. "mul r6, r7, r6\n\t"
  101976. "lsr r7, r6, #16\n\t"
  101977. "lsl r6, r6, #16\n\t"
  101978. "adds r4, r4, r6\n\t"
  101979. "adcs r5, r5, r7\n\t"
  101980. "adc r3, r3, #0\n\t"
  101981. "lsr r6, r8, #16\n\t"
  101982. "lsr r7, r9, #16\n\t"
  101983. "mul r7, r6, r7\n\t"
  101984. "adds r5, r5, r7\n\t"
  101985. "adc r3, r3, #0\n\t"
  101986. "lsl r7, r9, #16\n\t"
  101987. "lsr r7, r7, #16\n\t"
  101988. "mul r6, r7, r6\n\t"
  101989. "lsr r7, r6, #16\n\t"
  101990. "lsl r6, r6, #16\n\t"
  101991. "adds r4, r4, r6\n\t"
  101992. "adcs r5, r5, r7\n\t"
  101993. "adc r3, r3, #0\n\t"
  101994. #else
  101995. "umull r6, r7, r8, r9\n\t"
  101996. "adds r4, r4, r6\n\t"
  101997. "adcs r5, r5, r7\n\t"
  101998. "adc r3, r3, #0\n\t"
  101999. #endif
  102000. /* A[1] * B[15] */
  102001. "ldr r8, [%[a], #4]\n\t"
  102002. "ldr r9, [%[b], #60]\n\t"
  102003. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102004. "lsl r6, r8, #16\n\t"
  102005. "lsl r7, r9, #16\n\t"
  102006. "lsr r6, r6, #16\n\t"
  102007. "lsr r7, r7, #16\n\t"
  102008. "mul r7, r6, r7\n\t"
  102009. "adds r4, r4, r7\n\t"
  102010. "adcs r5, r5, #0\n\t"
  102011. "adc r3, r3, #0\n\t"
  102012. "lsr r7, r9, #16\n\t"
  102013. "mul r6, r7, r6\n\t"
  102014. "lsr r7, r6, #16\n\t"
  102015. "lsl r6, r6, #16\n\t"
  102016. "adds r4, r4, r6\n\t"
  102017. "adcs r5, r5, r7\n\t"
  102018. "adc r3, r3, #0\n\t"
  102019. "lsr r6, r8, #16\n\t"
  102020. "lsr r7, r9, #16\n\t"
  102021. "mul r7, r6, r7\n\t"
  102022. "adds r5, r5, r7\n\t"
  102023. "adc r3, r3, #0\n\t"
  102024. "lsl r7, r9, #16\n\t"
  102025. "lsr r7, r7, #16\n\t"
  102026. "mul r6, r7, r6\n\t"
  102027. "lsr r7, r6, #16\n\t"
  102028. "lsl r6, r6, #16\n\t"
  102029. "adds r4, r4, r6\n\t"
  102030. "adcs r5, r5, r7\n\t"
  102031. "adc r3, r3, #0\n\t"
  102032. #else
  102033. "umull r6, r7, r8, r9\n\t"
  102034. "adds r4, r4, r6\n\t"
  102035. "adcs r5, r5, r7\n\t"
  102036. "adc r3, r3, #0\n\t"
  102037. #endif
  102038. /* A[0] * B[16] */
  102039. "ldr r8, [%[a]]\n\t"
  102040. "ldr r9, [%[b], #64]\n\t"
  102041. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102042. "lsl r6, r8, #16\n\t"
  102043. "lsl r7, r9, #16\n\t"
  102044. "lsr r6, r6, #16\n\t"
  102045. "lsr r7, r7, #16\n\t"
  102046. "mul r7, r6, r7\n\t"
  102047. "adds r4, r4, r7\n\t"
  102048. "adcs r5, r5, #0\n\t"
  102049. "adc r3, r3, #0\n\t"
  102050. "lsr r7, r9, #16\n\t"
  102051. "mul r6, r7, r6\n\t"
  102052. "lsr r7, r6, #16\n\t"
  102053. "lsl r6, r6, #16\n\t"
  102054. "adds r4, r4, r6\n\t"
  102055. "adcs r5, r5, r7\n\t"
  102056. "adc r3, r3, #0\n\t"
  102057. "lsr r6, r8, #16\n\t"
  102058. "lsr r7, r9, #16\n\t"
  102059. "mul r7, r6, r7\n\t"
  102060. "adds r5, r5, r7\n\t"
  102061. "adc r3, r3, #0\n\t"
  102062. "lsl r7, r9, #16\n\t"
  102063. "lsr r7, r7, #16\n\t"
  102064. "mul r6, r7, r6\n\t"
  102065. "lsr r7, r6, #16\n\t"
  102066. "lsl r6, r6, #16\n\t"
  102067. "adds r4, r4, r6\n\t"
  102068. "adcs r5, r5, r7\n\t"
  102069. "adc r3, r3, #0\n\t"
  102070. #else
  102071. "umull r6, r7, r8, r9\n\t"
  102072. "adds r4, r4, r6\n\t"
  102073. "adcs r5, r5, r7\n\t"
  102074. "adc r3, r3, #0\n\t"
  102075. #endif
  102076. "str r4, [sp, #64]\n\t"
  102077. /* A[1] * B[16] */
  102078. "ldr r8, [%[a], #4]\n\t"
  102079. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102080. "lsl r6, r8, #16\n\t"
  102081. "lsl r7, r9, #16\n\t"
  102082. "lsr r6, r6, #16\n\t"
  102083. "lsr r7, r7, #16\n\t"
  102084. "mul r7, r6, r7\n\t"
  102085. "adds r5, r5, r7\n\t"
  102086. "adcs r3, r3, #0\n\t"
  102087. "mov r4, #0\n\t"
  102088. "adc r4, r4, #0\n\t"
  102089. "lsr r7, r9, #16\n\t"
  102090. "mul r6, r7, r6\n\t"
  102091. "lsr r7, r6, #16\n\t"
  102092. "lsl r6, r6, #16\n\t"
  102093. "adds r5, r5, r6\n\t"
  102094. "adcs r3, r3, r7\n\t"
  102095. "adc r4, r4, #0\n\t"
  102096. "lsr r6, r8, #16\n\t"
  102097. "lsr r7, r9, #16\n\t"
  102098. "mul r7, r6, r7\n\t"
  102099. "adds r3, r3, r7\n\t"
  102100. "adc r4, r4, #0\n\t"
  102101. "lsl r7, r9, #16\n\t"
  102102. "lsr r7, r7, #16\n\t"
  102103. "mul r6, r7, r6\n\t"
  102104. "lsr r7, r6, #16\n\t"
  102105. "lsl r6, r6, #16\n\t"
  102106. "adds r5, r5, r6\n\t"
  102107. "adcs r3, r3, r7\n\t"
  102108. "adc r4, r4, #0\n\t"
  102109. #else
  102110. "umull r6, r7, r8, r9\n\t"
  102111. "adds r5, r5, r6\n\t"
  102112. "adcs r3, r3, r7\n\t"
  102113. "mov r4, #0\n\t"
  102114. "adc r4, r4, #0\n\t"
  102115. #endif
  102116. /* A[2] * B[15] */
  102117. "ldr r8, [%[a], #8]\n\t"
  102118. "ldr r9, [%[b], #60]\n\t"
  102119. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102120. "lsl r6, r8, #16\n\t"
  102121. "lsl r7, r9, #16\n\t"
  102122. "lsr r6, r6, #16\n\t"
  102123. "lsr r7, r7, #16\n\t"
  102124. "mul r7, r6, r7\n\t"
  102125. "adds r5, r5, r7\n\t"
  102126. "adcs r3, r3, #0\n\t"
  102127. "adc r4, r4, #0\n\t"
  102128. "lsr r7, r9, #16\n\t"
  102129. "mul r6, r7, r6\n\t"
  102130. "lsr r7, r6, #16\n\t"
  102131. "lsl r6, r6, #16\n\t"
  102132. "adds r5, r5, r6\n\t"
  102133. "adcs r3, r3, r7\n\t"
  102134. "adc r4, r4, #0\n\t"
  102135. "lsr r6, r8, #16\n\t"
  102136. "lsr r7, r9, #16\n\t"
  102137. "mul r7, r6, r7\n\t"
  102138. "adds r3, r3, r7\n\t"
  102139. "adc r4, r4, #0\n\t"
  102140. "lsl r7, r9, #16\n\t"
  102141. "lsr r7, r7, #16\n\t"
  102142. "mul r6, r7, r6\n\t"
  102143. "lsr r7, r6, #16\n\t"
  102144. "lsl r6, r6, #16\n\t"
  102145. "adds r5, r5, r6\n\t"
  102146. "adcs r3, r3, r7\n\t"
  102147. "adc r4, r4, #0\n\t"
  102148. #else
  102149. "umull r6, r7, r8, r9\n\t"
  102150. "adds r5, r5, r6\n\t"
  102151. "adcs r3, r3, r7\n\t"
  102152. "adc r4, r4, #0\n\t"
  102153. #endif
  102154. /* A[3] * B[14] */
  102155. "ldr r8, [%[a], #12]\n\t"
  102156. "ldr r9, [%[b], #56]\n\t"
  102157. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102158. "lsl r6, r8, #16\n\t"
  102159. "lsl r7, r9, #16\n\t"
  102160. "lsr r6, r6, #16\n\t"
  102161. "lsr r7, r7, #16\n\t"
  102162. "mul r7, r6, r7\n\t"
  102163. "adds r5, r5, r7\n\t"
  102164. "adcs r3, r3, #0\n\t"
  102165. "adc r4, r4, #0\n\t"
  102166. "lsr r7, r9, #16\n\t"
  102167. "mul r6, r7, r6\n\t"
  102168. "lsr r7, r6, #16\n\t"
  102169. "lsl r6, r6, #16\n\t"
  102170. "adds r5, r5, r6\n\t"
  102171. "adcs r3, r3, r7\n\t"
  102172. "adc r4, r4, #0\n\t"
  102173. "lsr r6, r8, #16\n\t"
  102174. "lsr r7, r9, #16\n\t"
  102175. "mul r7, r6, r7\n\t"
  102176. "adds r3, r3, r7\n\t"
  102177. "adc r4, r4, #0\n\t"
  102178. "lsl r7, r9, #16\n\t"
  102179. "lsr r7, r7, #16\n\t"
  102180. "mul r6, r7, r6\n\t"
  102181. "lsr r7, r6, #16\n\t"
  102182. "lsl r6, r6, #16\n\t"
  102183. "adds r5, r5, r6\n\t"
  102184. "adcs r3, r3, r7\n\t"
  102185. "adc r4, r4, #0\n\t"
  102186. #else
  102187. "umull r6, r7, r8, r9\n\t"
  102188. "adds r5, r5, r6\n\t"
  102189. "adcs r3, r3, r7\n\t"
  102190. "adc r4, r4, #0\n\t"
  102191. #endif
  102192. /* A[4] * B[13] */
  102193. "ldr r8, [%[a], #16]\n\t"
  102194. "ldr r9, [%[b], #52]\n\t"
  102195. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102196. "lsl r6, r8, #16\n\t"
  102197. "lsl r7, r9, #16\n\t"
  102198. "lsr r6, r6, #16\n\t"
  102199. "lsr r7, r7, #16\n\t"
  102200. "mul r7, r6, r7\n\t"
  102201. "adds r5, r5, r7\n\t"
  102202. "adcs r3, r3, #0\n\t"
  102203. "adc r4, r4, #0\n\t"
  102204. "lsr r7, r9, #16\n\t"
  102205. "mul r6, r7, r6\n\t"
  102206. "lsr r7, r6, #16\n\t"
  102207. "lsl r6, r6, #16\n\t"
  102208. "adds r5, r5, r6\n\t"
  102209. "adcs r3, r3, r7\n\t"
  102210. "adc r4, r4, #0\n\t"
  102211. "lsr r6, r8, #16\n\t"
  102212. "lsr r7, r9, #16\n\t"
  102213. "mul r7, r6, r7\n\t"
  102214. "adds r3, r3, r7\n\t"
  102215. "adc r4, r4, #0\n\t"
  102216. "lsl r7, r9, #16\n\t"
  102217. "lsr r7, r7, #16\n\t"
  102218. "mul r6, r7, r6\n\t"
  102219. "lsr r7, r6, #16\n\t"
  102220. "lsl r6, r6, #16\n\t"
  102221. "adds r5, r5, r6\n\t"
  102222. "adcs r3, r3, r7\n\t"
  102223. "adc r4, r4, #0\n\t"
  102224. #else
  102225. "umull r6, r7, r8, r9\n\t"
  102226. "adds r5, r5, r6\n\t"
  102227. "adcs r3, r3, r7\n\t"
  102228. "adc r4, r4, #0\n\t"
  102229. #endif
  102230. /* A[5] * B[12] */
  102231. "ldr r8, [%[a], #20]\n\t"
  102232. "ldr r9, [%[b], #48]\n\t"
  102233. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102234. "lsl r6, r8, #16\n\t"
  102235. "lsl r7, r9, #16\n\t"
  102236. "lsr r6, r6, #16\n\t"
  102237. "lsr r7, r7, #16\n\t"
  102238. "mul r7, r6, r7\n\t"
  102239. "adds r5, r5, r7\n\t"
  102240. "adcs r3, r3, #0\n\t"
  102241. "adc r4, r4, #0\n\t"
  102242. "lsr r7, r9, #16\n\t"
  102243. "mul r6, r7, r6\n\t"
  102244. "lsr r7, r6, #16\n\t"
  102245. "lsl r6, r6, #16\n\t"
  102246. "adds r5, r5, r6\n\t"
  102247. "adcs r3, r3, r7\n\t"
  102248. "adc r4, r4, #0\n\t"
  102249. "lsr r6, r8, #16\n\t"
  102250. "lsr r7, r9, #16\n\t"
  102251. "mul r7, r6, r7\n\t"
  102252. "adds r3, r3, r7\n\t"
  102253. "adc r4, r4, #0\n\t"
  102254. "lsl r7, r9, #16\n\t"
  102255. "lsr r7, r7, #16\n\t"
  102256. "mul r6, r7, r6\n\t"
  102257. "lsr r7, r6, #16\n\t"
  102258. "lsl r6, r6, #16\n\t"
  102259. "adds r5, r5, r6\n\t"
  102260. "adcs r3, r3, r7\n\t"
  102261. "adc r4, r4, #0\n\t"
  102262. #else
  102263. "umull r6, r7, r8, r9\n\t"
  102264. "adds r5, r5, r6\n\t"
  102265. "adcs r3, r3, r7\n\t"
  102266. "adc r4, r4, #0\n\t"
  102267. #endif
  102268. /* A[6] * B[11] */
  102269. "ldr r8, [%[a], #24]\n\t"
  102270. "ldr r9, [%[b], #44]\n\t"
  102271. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102272. "lsl r6, r8, #16\n\t"
  102273. "lsl r7, r9, #16\n\t"
  102274. "lsr r6, r6, #16\n\t"
  102275. "lsr r7, r7, #16\n\t"
  102276. "mul r7, r6, r7\n\t"
  102277. "adds r5, r5, r7\n\t"
  102278. "adcs r3, r3, #0\n\t"
  102279. "adc r4, r4, #0\n\t"
  102280. "lsr r7, r9, #16\n\t"
  102281. "mul r6, r7, r6\n\t"
  102282. "lsr r7, r6, #16\n\t"
  102283. "lsl r6, r6, #16\n\t"
  102284. "adds r5, r5, r6\n\t"
  102285. "adcs r3, r3, r7\n\t"
  102286. "adc r4, r4, #0\n\t"
  102287. "lsr r6, r8, #16\n\t"
  102288. "lsr r7, r9, #16\n\t"
  102289. "mul r7, r6, r7\n\t"
  102290. "adds r3, r3, r7\n\t"
  102291. "adc r4, r4, #0\n\t"
  102292. "lsl r7, r9, #16\n\t"
  102293. "lsr r7, r7, #16\n\t"
  102294. "mul r6, r7, r6\n\t"
  102295. "lsr r7, r6, #16\n\t"
  102296. "lsl r6, r6, #16\n\t"
  102297. "adds r5, r5, r6\n\t"
  102298. "adcs r3, r3, r7\n\t"
  102299. "adc r4, r4, #0\n\t"
  102300. #else
  102301. "umull r6, r7, r8, r9\n\t"
  102302. "adds r5, r5, r6\n\t"
  102303. "adcs r3, r3, r7\n\t"
  102304. "adc r4, r4, #0\n\t"
  102305. #endif
  102306. /* A[7] * B[10] */
  102307. "ldr r8, [%[a], #28]\n\t"
  102308. "ldr r9, [%[b], #40]\n\t"
  102309. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102310. "lsl r6, r8, #16\n\t"
  102311. "lsl r7, r9, #16\n\t"
  102312. "lsr r6, r6, #16\n\t"
  102313. "lsr r7, r7, #16\n\t"
  102314. "mul r7, r6, r7\n\t"
  102315. "adds r5, r5, r7\n\t"
  102316. "adcs r3, r3, #0\n\t"
  102317. "adc r4, r4, #0\n\t"
  102318. "lsr r7, r9, #16\n\t"
  102319. "mul r6, r7, r6\n\t"
  102320. "lsr r7, r6, #16\n\t"
  102321. "lsl r6, r6, #16\n\t"
  102322. "adds r5, r5, r6\n\t"
  102323. "adcs r3, r3, r7\n\t"
  102324. "adc r4, r4, #0\n\t"
  102325. "lsr r6, r8, #16\n\t"
  102326. "lsr r7, r9, #16\n\t"
  102327. "mul r7, r6, r7\n\t"
  102328. "adds r3, r3, r7\n\t"
  102329. "adc r4, r4, #0\n\t"
  102330. "lsl r7, r9, #16\n\t"
  102331. "lsr r7, r7, #16\n\t"
  102332. "mul r6, r7, r6\n\t"
  102333. "lsr r7, r6, #16\n\t"
  102334. "lsl r6, r6, #16\n\t"
  102335. "adds r5, r5, r6\n\t"
  102336. "adcs r3, r3, r7\n\t"
  102337. "adc r4, r4, #0\n\t"
  102338. #else
  102339. "umull r6, r7, r8, r9\n\t"
  102340. "adds r5, r5, r6\n\t"
  102341. "adcs r3, r3, r7\n\t"
  102342. "adc r4, r4, #0\n\t"
  102343. #endif
  102344. /* A[8] * B[9] */
  102345. "ldr r9, [%[b], #36]\n\t"
  102346. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102347. "lsl r6, r11, #16\n\t"
  102348. "lsl r7, r9, #16\n\t"
  102349. "lsr r6, r6, #16\n\t"
  102350. "lsr r7, r7, #16\n\t"
  102351. "mul r7, r6, r7\n\t"
  102352. "adds r5, r5, r7\n\t"
  102353. "adcs r3, r3, #0\n\t"
  102354. "adc r4, r4, #0\n\t"
  102355. "lsr r7, r9, #16\n\t"
  102356. "mul r6, r7, r6\n\t"
  102357. "lsr r7, r6, #16\n\t"
  102358. "lsl r6, r6, #16\n\t"
  102359. "adds r5, r5, r6\n\t"
  102360. "adcs r3, r3, r7\n\t"
  102361. "adc r4, r4, #0\n\t"
  102362. "lsr r6, r11, #16\n\t"
  102363. "lsr r7, r9, #16\n\t"
  102364. "mul r7, r6, r7\n\t"
  102365. "adds r3, r3, r7\n\t"
  102366. "adc r4, r4, #0\n\t"
  102367. "lsl r7, r9, #16\n\t"
  102368. "lsr r7, r7, #16\n\t"
  102369. "mul r6, r7, r6\n\t"
  102370. "lsr r7, r6, #16\n\t"
  102371. "lsl r6, r6, #16\n\t"
  102372. "adds r5, r5, r6\n\t"
  102373. "adcs r3, r3, r7\n\t"
  102374. "adc r4, r4, #0\n\t"
  102375. #else
  102376. "umull r6, r7, r11, r9\n\t"
  102377. "adds r5, r5, r6\n\t"
  102378. "adcs r3, r3, r7\n\t"
  102379. "adc r4, r4, #0\n\t"
  102380. #endif
  102381. /* A[9] * B[8] */
  102382. "ldr r8, [%[a], #36]\n\t"
  102383. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102384. "lsl r6, r8, #16\n\t"
  102385. "lsl r7, r12, #16\n\t"
  102386. "lsr r6, r6, #16\n\t"
  102387. "lsr r7, r7, #16\n\t"
  102388. "mul r7, r6, r7\n\t"
  102389. "adds r5, r5, r7\n\t"
  102390. "adcs r3, r3, #0\n\t"
  102391. "adc r4, r4, #0\n\t"
  102392. "lsr r7, r12, #16\n\t"
  102393. "mul r6, r7, r6\n\t"
  102394. "lsr r7, r6, #16\n\t"
  102395. "lsl r6, r6, #16\n\t"
  102396. "adds r5, r5, r6\n\t"
  102397. "adcs r3, r3, r7\n\t"
  102398. "adc r4, r4, #0\n\t"
  102399. "lsr r6, r8, #16\n\t"
  102400. "lsr r7, r12, #16\n\t"
  102401. "mul r7, r6, r7\n\t"
  102402. "adds r3, r3, r7\n\t"
  102403. "adc r4, r4, #0\n\t"
  102404. "lsl r7, r12, #16\n\t"
  102405. "lsr r7, r7, #16\n\t"
  102406. "mul r6, r7, r6\n\t"
  102407. "lsr r7, r6, #16\n\t"
  102408. "lsl r6, r6, #16\n\t"
  102409. "adds r5, r5, r6\n\t"
  102410. "adcs r3, r3, r7\n\t"
  102411. "adc r4, r4, #0\n\t"
  102412. #else
  102413. "umull r6, r7, r8, r12\n\t"
  102414. "adds r5, r5, r6\n\t"
  102415. "adcs r3, r3, r7\n\t"
  102416. "adc r4, r4, #0\n\t"
  102417. #endif
  102418. /* A[10] * B[7] */
  102419. "ldr r8, [%[a], #40]\n\t"
  102420. "ldr r9, [%[b], #28]\n\t"
  102421. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102422. "lsl r6, r8, #16\n\t"
  102423. "lsl r7, r9, #16\n\t"
  102424. "lsr r6, r6, #16\n\t"
  102425. "lsr r7, r7, #16\n\t"
  102426. "mul r7, r6, r7\n\t"
  102427. "adds r5, r5, r7\n\t"
  102428. "adcs r3, r3, #0\n\t"
  102429. "adc r4, r4, #0\n\t"
  102430. "lsr r7, r9, #16\n\t"
  102431. "mul r6, r7, r6\n\t"
  102432. "lsr r7, r6, #16\n\t"
  102433. "lsl r6, r6, #16\n\t"
  102434. "adds r5, r5, r6\n\t"
  102435. "adcs r3, r3, r7\n\t"
  102436. "adc r4, r4, #0\n\t"
  102437. "lsr r6, r8, #16\n\t"
  102438. "lsr r7, r9, #16\n\t"
  102439. "mul r7, r6, r7\n\t"
  102440. "adds r3, r3, r7\n\t"
  102441. "adc r4, r4, #0\n\t"
  102442. "lsl r7, r9, #16\n\t"
  102443. "lsr r7, r7, #16\n\t"
  102444. "mul r6, r7, r6\n\t"
  102445. "lsr r7, r6, #16\n\t"
  102446. "lsl r6, r6, #16\n\t"
  102447. "adds r5, r5, r6\n\t"
  102448. "adcs r3, r3, r7\n\t"
  102449. "adc r4, r4, #0\n\t"
  102450. #else
  102451. "umull r6, r7, r8, r9\n\t"
  102452. "adds r5, r5, r6\n\t"
  102453. "adcs r3, r3, r7\n\t"
  102454. "adc r4, r4, #0\n\t"
  102455. #endif
  102456. /* A[11] * B[6] */
  102457. "ldr r8, [%[a], #44]\n\t"
  102458. "ldr r9, [%[b], #24]\n\t"
  102459. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102460. "lsl r6, r8, #16\n\t"
  102461. "lsl r7, r9, #16\n\t"
  102462. "lsr r6, r6, #16\n\t"
  102463. "lsr r7, r7, #16\n\t"
  102464. "mul r7, r6, r7\n\t"
  102465. "adds r5, r5, r7\n\t"
  102466. "adcs r3, r3, #0\n\t"
  102467. "adc r4, r4, #0\n\t"
  102468. "lsr r7, r9, #16\n\t"
  102469. "mul r6, r7, r6\n\t"
  102470. "lsr r7, r6, #16\n\t"
  102471. "lsl r6, r6, #16\n\t"
  102472. "adds r5, r5, r6\n\t"
  102473. "adcs r3, r3, r7\n\t"
  102474. "adc r4, r4, #0\n\t"
  102475. "lsr r6, r8, #16\n\t"
  102476. "lsr r7, r9, #16\n\t"
  102477. "mul r7, r6, r7\n\t"
  102478. "adds r3, r3, r7\n\t"
  102479. "adc r4, r4, #0\n\t"
  102480. "lsl r7, r9, #16\n\t"
  102481. "lsr r7, r7, #16\n\t"
  102482. "mul r6, r7, r6\n\t"
  102483. "lsr r7, r6, #16\n\t"
  102484. "lsl r6, r6, #16\n\t"
  102485. "adds r5, r5, r6\n\t"
  102486. "adcs r3, r3, r7\n\t"
  102487. "adc r4, r4, #0\n\t"
  102488. #else
  102489. "umull r6, r7, r8, r9\n\t"
  102490. "adds r5, r5, r6\n\t"
  102491. "adcs r3, r3, r7\n\t"
  102492. "adc r4, r4, #0\n\t"
  102493. #endif
  102494. /* A[12] * B[5] */
  102495. "ldr r8, [%[a], #48]\n\t"
  102496. "ldr r9, [%[b], #20]\n\t"
  102497. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102498. "lsl r6, r8, #16\n\t"
  102499. "lsl r7, r9, #16\n\t"
  102500. "lsr r6, r6, #16\n\t"
  102501. "lsr r7, r7, #16\n\t"
  102502. "mul r7, r6, r7\n\t"
  102503. "adds r5, r5, r7\n\t"
  102504. "adcs r3, r3, #0\n\t"
  102505. "adc r4, r4, #0\n\t"
  102506. "lsr r7, r9, #16\n\t"
  102507. "mul r6, r7, r6\n\t"
  102508. "lsr r7, r6, #16\n\t"
  102509. "lsl r6, r6, #16\n\t"
  102510. "adds r5, r5, r6\n\t"
  102511. "adcs r3, r3, r7\n\t"
  102512. "adc r4, r4, #0\n\t"
  102513. "lsr r6, r8, #16\n\t"
  102514. "lsr r7, r9, #16\n\t"
  102515. "mul r7, r6, r7\n\t"
  102516. "adds r3, r3, r7\n\t"
  102517. "adc r4, r4, #0\n\t"
  102518. "lsl r7, r9, #16\n\t"
  102519. "lsr r7, r7, #16\n\t"
  102520. "mul r6, r7, r6\n\t"
  102521. "lsr r7, r6, #16\n\t"
  102522. "lsl r6, r6, #16\n\t"
  102523. "adds r5, r5, r6\n\t"
  102524. "adcs r3, r3, r7\n\t"
  102525. "adc r4, r4, #0\n\t"
  102526. #else
  102527. "umull r6, r7, r8, r9\n\t"
  102528. "adds r5, r5, r6\n\t"
  102529. "adcs r3, r3, r7\n\t"
  102530. "adc r4, r4, #0\n\t"
  102531. #endif
  102532. /* A[13] * B[4] */
  102533. "ldr r8, [%[a], #52]\n\t"
  102534. "ldr r9, [%[b], #16]\n\t"
  102535. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102536. "lsl r6, r8, #16\n\t"
  102537. "lsl r7, r9, #16\n\t"
  102538. "lsr r6, r6, #16\n\t"
  102539. "lsr r7, r7, #16\n\t"
  102540. "mul r7, r6, r7\n\t"
  102541. "adds r5, r5, r7\n\t"
  102542. "adcs r3, r3, #0\n\t"
  102543. "adc r4, r4, #0\n\t"
  102544. "lsr r7, r9, #16\n\t"
  102545. "mul r6, r7, r6\n\t"
  102546. "lsr r7, r6, #16\n\t"
  102547. "lsl r6, r6, #16\n\t"
  102548. "adds r5, r5, r6\n\t"
  102549. "adcs r3, r3, r7\n\t"
  102550. "adc r4, r4, #0\n\t"
  102551. "lsr r6, r8, #16\n\t"
  102552. "lsr r7, r9, #16\n\t"
  102553. "mul r7, r6, r7\n\t"
  102554. "adds r3, r3, r7\n\t"
  102555. "adc r4, r4, #0\n\t"
  102556. "lsl r7, r9, #16\n\t"
  102557. "lsr r7, r7, #16\n\t"
  102558. "mul r6, r7, r6\n\t"
  102559. "lsr r7, r6, #16\n\t"
  102560. "lsl r6, r6, #16\n\t"
  102561. "adds r5, r5, r6\n\t"
  102562. "adcs r3, r3, r7\n\t"
  102563. "adc r4, r4, #0\n\t"
  102564. #else
  102565. "umull r6, r7, r8, r9\n\t"
  102566. "adds r5, r5, r6\n\t"
  102567. "adcs r3, r3, r7\n\t"
  102568. "adc r4, r4, #0\n\t"
  102569. #endif
  102570. /* A[14] * B[3] */
  102571. "ldr r8, [%[a], #56]\n\t"
  102572. "ldr r9, [%[b], #12]\n\t"
  102573. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102574. "lsl r6, r8, #16\n\t"
  102575. "lsl r7, r9, #16\n\t"
  102576. "lsr r6, r6, #16\n\t"
  102577. "lsr r7, r7, #16\n\t"
  102578. "mul r7, r6, r7\n\t"
  102579. "adds r5, r5, r7\n\t"
  102580. "adcs r3, r3, #0\n\t"
  102581. "adc r4, r4, #0\n\t"
  102582. "lsr r7, r9, #16\n\t"
  102583. "mul r6, r7, r6\n\t"
  102584. "lsr r7, r6, #16\n\t"
  102585. "lsl r6, r6, #16\n\t"
  102586. "adds r5, r5, r6\n\t"
  102587. "adcs r3, r3, r7\n\t"
  102588. "adc r4, r4, #0\n\t"
  102589. "lsr r6, r8, #16\n\t"
  102590. "lsr r7, r9, #16\n\t"
  102591. "mul r7, r6, r7\n\t"
  102592. "adds r3, r3, r7\n\t"
  102593. "adc r4, r4, #0\n\t"
  102594. "lsl r7, r9, #16\n\t"
  102595. "lsr r7, r7, #16\n\t"
  102596. "mul r6, r7, r6\n\t"
  102597. "lsr r7, r6, #16\n\t"
  102598. "lsl r6, r6, #16\n\t"
  102599. "adds r5, r5, r6\n\t"
  102600. "adcs r3, r3, r7\n\t"
  102601. "adc r4, r4, #0\n\t"
  102602. #else
  102603. "umull r6, r7, r8, r9\n\t"
  102604. "adds r5, r5, r6\n\t"
  102605. "adcs r3, r3, r7\n\t"
  102606. "adc r4, r4, #0\n\t"
  102607. #endif
  102608. /* A[15] * B[2] */
  102609. "ldr r8, [%[a], #60]\n\t"
  102610. "ldr r9, [%[b], #8]\n\t"
  102611. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102612. "lsl r6, r8, #16\n\t"
  102613. "lsl r7, r9, #16\n\t"
  102614. "lsr r6, r6, #16\n\t"
  102615. "lsr r7, r7, #16\n\t"
  102616. "mul r7, r6, r7\n\t"
  102617. "adds r5, r5, r7\n\t"
  102618. "adcs r3, r3, #0\n\t"
  102619. "adc r4, r4, #0\n\t"
  102620. "lsr r7, r9, #16\n\t"
  102621. "mul r6, r7, r6\n\t"
  102622. "lsr r7, r6, #16\n\t"
  102623. "lsl r6, r6, #16\n\t"
  102624. "adds r5, r5, r6\n\t"
  102625. "adcs r3, r3, r7\n\t"
  102626. "adc r4, r4, #0\n\t"
  102627. "lsr r6, r8, #16\n\t"
  102628. "lsr r7, r9, #16\n\t"
  102629. "mul r7, r6, r7\n\t"
  102630. "adds r3, r3, r7\n\t"
  102631. "adc r4, r4, #0\n\t"
  102632. "lsl r7, r9, #16\n\t"
  102633. "lsr r7, r7, #16\n\t"
  102634. "mul r6, r7, r6\n\t"
  102635. "lsr r7, r6, #16\n\t"
  102636. "lsl r6, r6, #16\n\t"
  102637. "adds r5, r5, r6\n\t"
  102638. "adcs r3, r3, r7\n\t"
  102639. "adc r4, r4, #0\n\t"
  102640. #else
  102641. "umull r6, r7, r8, r9\n\t"
  102642. "adds r5, r5, r6\n\t"
  102643. "adcs r3, r3, r7\n\t"
  102644. "adc r4, r4, #0\n\t"
  102645. #endif
  102646. /* A[16] * B[1] */
  102647. "ldr r8, [%[a], #64]\n\t"
  102648. "ldr r9, [%[b], #4]\n\t"
  102649. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102650. "lsl r6, r8, #16\n\t"
  102651. "lsl r7, r9, #16\n\t"
  102652. "lsr r6, r6, #16\n\t"
  102653. "lsr r7, r7, #16\n\t"
  102654. "mul r7, r6, r7\n\t"
  102655. "adds r5, r5, r7\n\t"
  102656. "adcs r3, r3, #0\n\t"
  102657. "adc r4, r4, #0\n\t"
  102658. "lsr r7, r9, #16\n\t"
  102659. "mul r6, r7, r6\n\t"
  102660. "lsr r7, r6, #16\n\t"
  102661. "lsl r6, r6, #16\n\t"
  102662. "adds r5, r5, r6\n\t"
  102663. "adcs r3, r3, r7\n\t"
  102664. "adc r4, r4, #0\n\t"
  102665. "lsr r6, r8, #16\n\t"
  102666. "lsr r7, r9, #16\n\t"
  102667. "mul r7, r6, r7\n\t"
  102668. "adds r3, r3, r7\n\t"
  102669. "adc r4, r4, #0\n\t"
  102670. "lsl r7, r9, #16\n\t"
  102671. "lsr r7, r7, #16\n\t"
  102672. "mul r6, r7, r6\n\t"
  102673. "lsr r7, r6, #16\n\t"
  102674. "lsl r6, r6, #16\n\t"
  102675. "adds r5, r5, r6\n\t"
  102676. "adcs r3, r3, r7\n\t"
  102677. "adc r4, r4, #0\n\t"
  102678. #else
  102679. "umull r6, r7, r8, r9\n\t"
  102680. "adds r5, r5, r6\n\t"
  102681. "adcs r3, r3, r7\n\t"
  102682. "adc r4, r4, #0\n\t"
  102683. #endif
  102684. "str r5, [%[r], #68]\n\t"
  102685. /* A[16] * B[2] */
  102686. "ldr r9, [%[b], #8]\n\t"
  102687. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102688. "lsl r6, r8, #16\n\t"
  102689. "lsl r7, r9, #16\n\t"
  102690. "lsr r6, r6, #16\n\t"
  102691. "lsr r7, r7, #16\n\t"
  102692. "mul r7, r6, r7\n\t"
  102693. "adds r3, r3, r7\n\t"
  102694. "adcs r4, r4, #0\n\t"
  102695. "mov r5, #0\n\t"
  102696. "adc r5, r5, #0\n\t"
  102697. "lsr r7, r9, #16\n\t"
  102698. "mul r6, r7, r6\n\t"
  102699. "lsr r7, r6, #16\n\t"
  102700. "lsl r6, r6, #16\n\t"
  102701. "adds r3, r3, r6\n\t"
  102702. "adcs r4, r4, r7\n\t"
  102703. "adc r5, r5, #0\n\t"
  102704. "lsr r6, r8, #16\n\t"
  102705. "lsr r7, r9, #16\n\t"
  102706. "mul r7, r6, r7\n\t"
  102707. "adds r4, r4, r7\n\t"
  102708. "adc r5, r5, #0\n\t"
  102709. "lsl r7, r9, #16\n\t"
  102710. "lsr r7, r7, #16\n\t"
  102711. "mul r6, r7, r6\n\t"
  102712. "lsr r7, r6, #16\n\t"
  102713. "lsl r6, r6, #16\n\t"
  102714. "adds r3, r3, r6\n\t"
  102715. "adcs r4, r4, r7\n\t"
  102716. "adc r5, r5, #0\n\t"
  102717. #else
  102718. "umull r6, r7, r8, r9\n\t"
  102719. "adds r3, r3, r6\n\t"
  102720. "adcs r4, r4, r7\n\t"
  102721. "mov r5, #0\n\t"
  102722. "adc r5, r5, #0\n\t"
  102723. #endif
  102724. /* A[15] * B[3] */
  102725. "ldr r8, [%[a], #60]\n\t"
  102726. "ldr r9, [%[b], #12]\n\t"
  102727. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102728. "lsl r6, r8, #16\n\t"
  102729. "lsl r7, r9, #16\n\t"
  102730. "lsr r6, r6, #16\n\t"
  102731. "lsr r7, r7, #16\n\t"
  102732. "mul r7, r6, r7\n\t"
  102733. "adds r3, r3, r7\n\t"
  102734. "adcs r4, r4, #0\n\t"
  102735. "adc r5, r5, #0\n\t"
  102736. "lsr r7, r9, #16\n\t"
  102737. "mul r6, r7, r6\n\t"
  102738. "lsr r7, r6, #16\n\t"
  102739. "lsl r6, r6, #16\n\t"
  102740. "adds r3, r3, r6\n\t"
  102741. "adcs r4, r4, r7\n\t"
  102742. "adc r5, r5, #0\n\t"
  102743. "lsr r6, r8, #16\n\t"
  102744. "lsr r7, r9, #16\n\t"
  102745. "mul r7, r6, r7\n\t"
  102746. "adds r4, r4, r7\n\t"
  102747. "adc r5, r5, #0\n\t"
  102748. "lsl r7, r9, #16\n\t"
  102749. "lsr r7, r7, #16\n\t"
  102750. "mul r6, r7, r6\n\t"
  102751. "lsr r7, r6, #16\n\t"
  102752. "lsl r6, r6, #16\n\t"
  102753. "adds r3, r3, r6\n\t"
  102754. "adcs r4, r4, r7\n\t"
  102755. "adc r5, r5, #0\n\t"
  102756. #else
  102757. "umull r6, r7, r8, r9\n\t"
  102758. "adds r3, r3, r6\n\t"
  102759. "adcs r4, r4, r7\n\t"
  102760. "adc r5, r5, #0\n\t"
  102761. #endif
  102762. /* A[14] * B[4] */
  102763. "ldr r8, [%[a], #56]\n\t"
  102764. "ldr r9, [%[b], #16]\n\t"
  102765. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102766. "lsl r6, r8, #16\n\t"
  102767. "lsl r7, r9, #16\n\t"
  102768. "lsr r6, r6, #16\n\t"
  102769. "lsr r7, r7, #16\n\t"
  102770. "mul r7, r6, r7\n\t"
  102771. "adds r3, r3, r7\n\t"
  102772. "adcs r4, r4, #0\n\t"
  102773. "adc r5, r5, #0\n\t"
  102774. "lsr r7, r9, #16\n\t"
  102775. "mul r6, r7, r6\n\t"
  102776. "lsr r7, r6, #16\n\t"
  102777. "lsl r6, r6, #16\n\t"
  102778. "adds r3, r3, r6\n\t"
  102779. "adcs r4, r4, r7\n\t"
  102780. "adc r5, r5, #0\n\t"
  102781. "lsr r6, r8, #16\n\t"
  102782. "lsr r7, r9, #16\n\t"
  102783. "mul r7, r6, r7\n\t"
  102784. "adds r4, r4, r7\n\t"
  102785. "adc r5, r5, #0\n\t"
  102786. "lsl r7, r9, #16\n\t"
  102787. "lsr r7, r7, #16\n\t"
  102788. "mul r6, r7, r6\n\t"
  102789. "lsr r7, r6, #16\n\t"
  102790. "lsl r6, r6, #16\n\t"
  102791. "adds r3, r3, r6\n\t"
  102792. "adcs r4, r4, r7\n\t"
  102793. "adc r5, r5, #0\n\t"
  102794. #else
  102795. "umull r6, r7, r8, r9\n\t"
  102796. "adds r3, r3, r6\n\t"
  102797. "adcs r4, r4, r7\n\t"
  102798. "adc r5, r5, #0\n\t"
  102799. #endif
  102800. /* A[13] * B[5] */
  102801. "ldr r8, [%[a], #52]\n\t"
  102802. "ldr r9, [%[b], #20]\n\t"
  102803. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102804. "lsl r6, r8, #16\n\t"
  102805. "lsl r7, r9, #16\n\t"
  102806. "lsr r6, r6, #16\n\t"
  102807. "lsr r7, r7, #16\n\t"
  102808. "mul r7, r6, r7\n\t"
  102809. "adds r3, r3, r7\n\t"
  102810. "adcs r4, r4, #0\n\t"
  102811. "adc r5, r5, #0\n\t"
  102812. "lsr r7, r9, #16\n\t"
  102813. "mul r6, r7, r6\n\t"
  102814. "lsr r7, r6, #16\n\t"
  102815. "lsl r6, r6, #16\n\t"
  102816. "adds r3, r3, r6\n\t"
  102817. "adcs r4, r4, r7\n\t"
  102818. "adc r5, r5, #0\n\t"
  102819. "lsr r6, r8, #16\n\t"
  102820. "lsr r7, r9, #16\n\t"
  102821. "mul r7, r6, r7\n\t"
  102822. "adds r4, r4, r7\n\t"
  102823. "adc r5, r5, #0\n\t"
  102824. "lsl r7, r9, #16\n\t"
  102825. "lsr r7, r7, #16\n\t"
  102826. "mul r6, r7, r6\n\t"
  102827. "lsr r7, r6, #16\n\t"
  102828. "lsl r6, r6, #16\n\t"
  102829. "adds r3, r3, r6\n\t"
  102830. "adcs r4, r4, r7\n\t"
  102831. "adc r5, r5, #0\n\t"
  102832. #else
  102833. "umull r6, r7, r8, r9\n\t"
  102834. "adds r3, r3, r6\n\t"
  102835. "adcs r4, r4, r7\n\t"
  102836. "adc r5, r5, #0\n\t"
  102837. #endif
  102838. /* A[12] * B[6] */
  102839. "ldr r8, [%[a], #48]\n\t"
  102840. "ldr r9, [%[b], #24]\n\t"
  102841. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102842. "lsl r6, r8, #16\n\t"
  102843. "lsl r7, r9, #16\n\t"
  102844. "lsr r6, r6, #16\n\t"
  102845. "lsr r7, r7, #16\n\t"
  102846. "mul r7, r6, r7\n\t"
  102847. "adds r3, r3, r7\n\t"
  102848. "adcs r4, r4, #0\n\t"
  102849. "adc r5, r5, #0\n\t"
  102850. "lsr r7, r9, #16\n\t"
  102851. "mul r6, r7, r6\n\t"
  102852. "lsr r7, r6, #16\n\t"
  102853. "lsl r6, r6, #16\n\t"
  102854. "adds r3, r3, r6\n\t"
  102855. "adcs r4, r4, r7\n\t"
  102856. "adc r5, r5, #0\n\t"
  102857. "lsr r6, r8, #16\n\t"
  102858. "lsr r7, r9, #16\n\t"
  102859. "mul r7, r6, r7\n\t"
  102860. "adds r4, r4, r7\n\t"
  102861. "adc r5, r5, #0\n\t"
  102862. "lsl r7, r9, #16\n\t"
  102863. "lsr r7, r7, #16\n\t"
  102864. "mul r6, r7, r6\n\t"
  102865. "lsr r7, r6, #16\n\t"
  102866. "lsl r6, r6, #16\n\t"
  102867. "adds r3, r3, r6\n\t"
  102868. "adcs r4, r4, r7\n\t"
  102869. "adc r5, r5, #0\n\t"
  102870. #else
  102871. "umull r6, r7, r8, r9\n\t"
  102872. "adds r3, r3, r6\n\t"
  102873. "adcs r4, r4, r7\n\t"
  102874. "adc r5, r5, #0\n\t"
  102875. #endif
  102876. /* A[11] * B[7] */
  102877. "ldr r8, [%[a], #44]\n\t"
  102878. "ldr r9, [%[b], #28]\n\t"
  102879. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102880. "lsl r6, r8, #16\n\t"
  102881. "lsl r7, r9, #16\n\t"
  102882. "lsr r6, r6, #16\n\t"
  102883. "lsr r7, r7, #16\n\t"
  102884. "mul r7, r6, r7\n\t"
  102885. "adds r3, r3, r7\n\t"
  102886. "adcs r4, r4, #0\n\t"
  102887. "adc r5, r5, #0\n\t"
  102888. "lsr r7, r9, #16\n\t"
  102889. "mul r6, r7, r6\n\t"
  102890. "lsr r7, r6, #16\n\t"
  102891. "lsl r6, r6, #16\n\t"
  102892. "adds r3, r3, r6\n\t"
  102893. "adcs r4, r4, r7\n\t"
  102894. "adc r5, r5, #0\n\t"
  102895. "lsr r6, r8, #16\n\t"
  102896. "lsr r7, r9, #16\n\t"
  102897. "mul r7, r6, r7\n\t"
  102898. "adds r4, r4, r7\n\t"
  102899. "adc r5, r5, #0\n\t"
  102900. "lsl r7, r9, #16\n\t"
  102901. "lsr r7, r7, #16\n\t"
  102902. "mul r6, r7, r6\n\t"
  102903. "lsr r7, r6, #16\n\t"
  102904. "lsl r6, r6, #16\n\t"
  102905. "adds r3, r3, r6\n\t"
  102906. "adcs r4, r4, r7\n\t"
  102907. "adc r5, r5, #0\n\t"
  102908. #else
  102909. "umull r6, r7, r8, r9\n\t"
  102910. "adds r3, r3, r6\n\t"
  102911. "adcs r4, r4, r7\n\t"
  102912. "adc r5, r5, #0\n\t"
  102913. #endif
  102914. /* A[10] * B[8] */
  102915. "ldr r8, [%[a], #40]\n\t"
  102916. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102917. "lsl r6, r8, #16\n\t"
  102918. "lsl r7, r12, #16\n\t"
  102919. "lsr r6, r6, #16\n\t"
  102920. "lsr r7, r7, #16\n\t"
  102921. "mul r7, r6, r7\n\t"
  102922. "adds r3, r3, r7\n\t"
  102923. "adcs r4, r4, #0\n\t"
  102924. "adc r5, r5, #0\n\t"
  102925. "lsr r7, r12, #16\n\t"
  102926. "mul r6, r7, r6\n\t"
  102927. "lsr r7, r6, #16\n\t"
  102928. "lsl r6, r6, #16\n\t"
  102929. "adds r3, r3, r6\n\t"
  102930. "adcs r4, r4, r7\n\t"
  102931. "adc r5, r5, #0\n\t"
  102932. "lsr r6, r8, #16\n\t"
  102933. "lsr r7, r12, #16\n\t"
  102934. "mul r7, r6, r7\n\t"
  102935. "adds r4, r4, r7\n\t"
  102936. "adc r5, r5, #0\n\t"
  102937. "lsl r7, r12, #16\n\t"
  102938. "lsr r7, r7, #16\n\t"
  102939. "mul r6, r7, r6\n\t"
  102940. "lsr r7, r6, #16\n\t"
  102941. "lsl r6, r6, #16\n\t"
  102942. "adds r3, r3, r6\n\t"
  102943. "adcs r4, r4, r7\n\t"
  102944. "adc r5, r5, #0\n\t"
  102945. #else
  102946. "umull r6, r7, r8, r12\n\t"
  102947. "adds r3, r3, r6\n\t"
  102948. "adcs r4, r4, r7\n\t"
  102949. "adc r5, r5, #0\n\t"
  102950. #endif
  102951. /* A[9] * B[9] */
  102952. "ldr r11, [%[a], #36]\n\t"
  102953. "ldr r12, [%[b], #36]\n\t"
  102954. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102955. "lsl r6, r11, #16\n\t"
  102956. "lsl r7, r12, #16\n\t"
  102957. "lsr r6, r6, #16\n\t"
  102958. "lsr r7, r7, #16\n\t"
  102959. "mul r7, r6, r7\n\t"
  102960. "adds r3, r3, r7\n\t"
  102961. "adcs r4, r4, #0\n\t"
  102962. "adc r5, r5, #0\n\t"
  102963. "lsr r7, r12, #16\n\t"
  102964. "mul r6, r7, r6\n\t"
  102965. "lsr r7, r6, #16\n\t"
  102966. "lsl r6, r6, #16\n\t"
  102967. "adds r3, r3, r6\n\t"
  102968. "adcs r4, r4, r7\n\t"
  102969. "adc r5, r5, #0\n\t"
  102970. "lsr r6, r11, #16\n\t"
  102971. "lsr r7, r12, #16\n\t"
  102972. "mul r7, r6, r7\n\t"
  102973. "adds r4, r4, r7\n\t"
  102974. "adc r5, r5, #0\n\t"
  102975. "lsl r7, r12, #16\n\t"
  102976. "lsr r7, r7, #16\n\t"
  102977. "mul r6, r7, r6\n\t"
  102978. "lsr r7, r6, #16\n\t"
  102979. "lsl r6, r6, #16\n\t"
  102980. "adds r3, r3, r6\n\t"
  102981. "adcs r4, r4, r7\n\t"
  102982. "adc r5, r5, #0\n\t"
  102983. #else
  102984. "umull r6, r7, r11, r12\n\t"
  102985. "adds r3, r3, r6\n\t"
  102986. "adcs r4, r4, r7\n\t"
  102987. "adc r5, r5, #0\n\t"
  102988. #endif
  102989. /* A[8] * B[10] */
  102990. "ldr r8, [%[a], #32]\n\t"
  102991. "ldr r9, [%[b], #40]\n\t"
  102992. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  102993. "lsl r6, r8, #16\n\t"
  102994. "lsl r7, r9, #16\n\t"
  102995. "lsr r6, r6, #16\n\t"
  102996. "lsr r7, r7, #16\n\t"
  102997. "mul r7, r6, r7\n\t"
  102998. "adds r3, r3, r7\n\t"
  102999. "adcs r4, r4, #0\n\t"
  103000. "adc r5, r5, #0\n\t"
  103001. "lsr r7, r9, #16\n\t"
  103002. "mul r6, r7, r6\n\t"
  103003. "lsr r7, r6, #16\n\t"
  103004. "lsl r6, r6, #16\n\t"
  103005. "adds r3, r3, r6\n\t"
  103006. "adcs r4, r4, r7\n\t"
  103007. "adc r5, r5, #0\n\t"
  103008. "lsr r6, r8, #16\n\t"
  103009. "lsr r7, r9, #16\n\t"
  103010. "mul r7, r6, r7\n\t"
  103011. "adds r4, r4, r7\n\t"
  103012. "adc r5, r5, #0\n\t"
  103013. "lsl r7, r9, #16\n\t"
  103014. "lsr r7, r7, #16\n\t"
  103015. "mul r6, r7, r6\n\t"
  103016. "lsr r7, r6, #16\n\t"
  103017. "lsl r6, r6, #16\n\t"
  103018. "adds r3, r3, r6\n\t"
  103019. "adcs r4, r4, r7\n\t"
  103020. "adc r5, r5, #0\n\t"
  103021. #else
  103022. "umull r6, r7, r8, r9\n\t"
  103023. "adds r3, r3, r6\n\t"
  103024. "adcs r4, r4, r7\n\t"
  103025. "adc r5, r5, #0\n\t"
  103026. #endif
  103027. /* A[7] * B[11] */
  103028. "ldr r8, [%[a], #28]\n\t"
  103029. "ldr r9, [%[b], #44]\n\t"
  103030. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103031. "lsl r6, r8, #16\n\t"
  103032. "lsl r7, r9, #16\n\t"
  103033. "lsr r6, r6, #16\n\t"
  103034. "lsr r7, r7, #16\n\t"
  103035. "mul r7, r6, r7\n\t"
  103036. "adds r3, r3, r7\n\t"
  103037. "adcs r4, r4, #0\n\t"
  103038. "adc r5, r5, #0\n\t"
  103039. "lsr r7, r9, #16\n\t"
  103040. "mul r6, r7, r6\n\t"
  103041. "lsr r7, r6, #16\n\t"
  103042. "lsl r6, r6, #16\n\t"
  103043. "adds r3, r3, r6\n\t"
  103044. "adcs r4, r4, r7\n\t"
  103045. "adc r5, r5, #0\n\t"
  103046. "lsr r6, r8, #16\n\t"
  103047. "lsr r7, r9, #16\n\t"
  103048. "mul r7, r6, r7\n\t"
  103049. "adds r4, r4, r7\n\t"
  103050. "adc r5, r5, #0\n\t"
  103051. "lsl r7, r9, #16\n\t"
  103052. "lsr r7, r7, #16\n\t"
  103053. "mul r6, r7, r6\n\t"
  103054. "lsr r7, r6, #16\n\t"
  103055. "lsl r6, r6, #16\n\t"
  103056. "adds r3, r3, r6\n\t"
  103057. "adcs r4, r4, r7\n\t"
  103058. "adc r5, r5, #0\n\t"
  103059. #else
  103060. "umull r6, r7, r8, r9\n\t"
  103061. "adds r3, r3, r6\n\t"
  103062. "adcs r4, r4, r7\n\t"
  103063. "adc r5, r5, #0\n\t"
  103064. #endif
  103065. /* A[6] * B[12] */
  103066. "ldr r8, [%[a], #24]\n\t"
  103067. "ldr r9, [%[b], #48]\n\t"
  103068. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103069. "lsl r6, r8, #16\n\t"
  103070. "lsl r7, r9, #16\n\t"
  103071. "lsr r6, r6, #16\n\t"
  103072. "lsr r7, r7, #16\n\t"
  103073. "mul r7, r6, r7\n\t"
  103074. "adds r3, r3, r7\n\t"
  103075. "adcs r4, r4, #0\n\t"
  103076. "adc r5, r5, #0\n\t"
  103077. "lsr r7, r9, #16\n\t"
  103078. "mul r6, r7, r6\n\t"
  103079. "lsr r7, r6, #16\n\t"
  103080. "lsl r6, r6, #16\n\t"
  103081. "adds r3, r3, r6\n\t"
  103082. "adcs r4, r4, r7\n\t"
  103083. "adc r5, r5, #0\n\t"
  103084. "lsr r6, r8, #16\n\t"
  103085. "lsr r7, r9, #16\n\t"
  103086. "mul r7, r6, r7\n\t"
  103087. "adds r4, r4, r7\n\t"
  103088. "adc r5, r5, #0\n\t"
  103089. "lsl r7, r9, #16\n\t"
  103090. "lsr r7, r7, #16\n\t"
  103091. "mul r6, r7, r6\n\t"
  103092. "lsr r7, r6, #16\n\t"
  103093. "lsl r6, r6, #16\n\t"
  103094. "adds r3, r3, r6\n\t"
  103095. "adcs r4, r4, r7\n\t"
  103096. "adc r5, r5, #0\n\t"
  103097. #else
  103098. "umull r6, r7, r8, r9\n\t"
  103099. "adds r3, r3, r6\n\t"
  103100. "adcs r4, r4, r7\n\t"
  103101. "adc r5, r5, #0\n\t"
  103102. #endif
  103103. /* A[5] * B[13] */
  103104. "ldr r8, [%[a], #20]\n\t"
  103105. "ldr r9, [%[b], #52]\n\t"
  103106. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103107. "lsl r6, r8, #16\n\t"
  103108. "lsl r7, r9, #16\n\t"
  103109. "lsr r6, r6, #16\n\t"
  103110. "lsr r7, r7, #16\n\t"
  103111. "mul r7, r6, r7\n\t"
  103112. "adds r3, r3, r7\n\t"
  103113. "adcs r4, r4, #0\n\t"
  103114. "adc r5, r5, #0\n\t"
  103115. "lsr r7, r9, #16\n\t"
  103116. "mul r6, r7, r6\n\t"
  103117. "lsr r7, r6, #16\n\t"
  103118. "lsl r6, r6, #16\n\t"
  103119. "adds r3, r3, r6\n\t"
  103120. "adcs r4, r4, r7\n\t"
  103121. "adc r5, r5, #0\n\t"
  103122. "lsr r6, r8, #16\n\t"
  103123. "lsr r7, r9, #16\n\t"
  103124. "mul r7, r6, r7\n\t"
  103125. "adds r4, r4, r7\n\t"
  103126. "adc r5, r5, #0\n\t"
  103127. "lsl r7, r9, #16\n\t"
  103128. "lsr r7, r7, #16\n\t"
  103129. "mul r6, r7, r6\n\t"
  103130. "lsr r7, r6, #16\n\t"
  103131. "lsl r6, r6, #16\n\t"
  103132. "adds r3, r3, r6\n\t"
  103133. "adcs r4, r4, r7\n\t"
  103134. "adc r5, r5, #0\n\t"
  103135. #else
  103136. "umull r6, r7, r8, r9\n\t"
  103137. "adds r3, r3, r6\n\t"
  103138. "adcs r4, r4, r7\n\t"
  103139. "adc r5, r5, #0\n\t"
  103140. #endif
  103141. /* A[4] * B[14] */
  103142. "ldr r8, [%[a], #16]\n\t"
  103143. "ldr r9, [%[b], #56]\n\t"
  103144. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103145. "lsl r6, r8, #16\n\t"
  103146. "lsl r7, r9, #16\n\t"
  103147. "lsr r6, r6, #16\n\t"
  103148. "lsr r7, r7, #16\n\t"
  103149. "mul r7, r6, r7\n\t"
  103150. "adds r3, r3, r7\n\t"
  103151. "adcs r4, r4, #0\n\t"
  103152. "adc r5, r5, #0\n\t"
  103153. "lsr r7, r9, #16\n\t"
  103154. "mul r6, r7, r6\n\t"
  103155. "lsr r7, r6, #16\n\t"
  103156. "lsl r6, r6, #16\n\t"
  103157. "adds r3, r3, r6\n\t"
  103158. "adcs r4, r4, r7\n\t"
  103159. "adc r5, r5, #0\n\t"
  103160. "lsr r6, r8, #16\n\t"
  103161. "lsr r7, r9, #16\n\t"
  103162. "mul r7, r6, r7\n\t"
  103163. "adds r4, r4, r7\n\t"
  103164. "adc r5, r5, #0\n\t"
  103165. "lsl r7, r9, #16\n\t"
  103166. "lsr r7, r7, #16\n\t"
  103167. "mul r6, r7, r6\n\t"
  103168. "lsr r7, r6, #16\n\t"
  103169. "lsl r6, r6, #16\n\t"
  103170. "adds r3, r3, r6\n\t"
  103171. "adcs r4, r4, r7\n\t"
  103172. "adc r5, r5, #0\n\t"
  103173. #else
  103174. "umull r6, r7, r8, r9\n\t"
  103175. "adds r3, r3, r6\n\t"
  103176. "adcs r4, r4, r7\n\t"
  103177. "adc r5, r5, #0\n\t"
  103178. #endif
  103179. /* A[3] * B[15] */
  103180. "ldr r8, [%[a], #12]\n\t"
  103181. "ldr r9, [%[b], #60]\n\t"
  103182. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103183. "lsl r6, r8, #16\n\t"
  103184. "lsl r7, r9, #16\n\t"
  103185. "lsr r6, r6, #16\n\t"
  103186. "lsr r7, r7, #16\n\t"
  103187. "mul r7, r6, r7\n\t"
  103188. "adds r3, r3, r7\n\t"
  103189. "adcs r4, r4, #0\n\t"
  103190. "adc r5, r5, #0\n\t"
  103191. "lsr r7, r9, #16\n\t"
  103192. "mul r6, r7, r6\n\t"
  103193. "lsr r7, r6, #16\n\t"
  103194. "lsl r6, r6, #16\n\t"
  103195. "adds r3, r3, r6\n\t"
  103196. "adcs r4, r4, r7\n\t"
  103197. "adc r5, r5, #0\n\t"
  103198. "lsr r6, r8, #16\n\t"
  103199. "lsr r7, r9, #16\n\t"
  103200. "mul r7, r6, r7\n\t"
  103201. "adds r4, r4, r7\n\t"
  103202. "adc r5, r5, #0\n\t"
  103203. "lsl r7, r9, #16\n\t"
  103204. "lsr r7, r7, #16\n\t"
  103205. "mul r6, r7, r6\n\t"
  103206. "lsr r7, r6, #16\n\t"
  103207. "lsl r6, r6, #16\n\t"
  103208. "adds r3, r3, r6\n\t"
  103209. "adcs r4, r4, r7\n\t"
  103210. "adc r5, r5, #0\n\t"
  103211. #else
  103212. "umull r6, r7, r8, r9\n\t"
  103213. "adds r3, r3, r6\n\t"
  103214. "adcs r4, r4, r7\n\t"
  103215. "adc r5, r5, #0\n\t"
  103216. #endif
  103217. /* A[2] * B[16] */
  103218. "ldr r8, [%[a], #8]\n\t"
  103219. "ldr r9, [%[b], #64]\n\t"
  103220. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103221. "lsl r6, r8, #16\n\t"
  103222. "lsl r7, r9, #16\n\t"
  103223. "lsr r6, r6, #16\n\t"
  103224. "lsr r7, r7, #16\n\t"
  103225. "mul r7, r6, r7\n\t"
  103226. "adds r3, r3, r7\n\t"
  103227. "adcs r4, r4, #0\n\t"
  103228. "adc r5, r5, #0\n\t"
  103229. "lsr r7, r9, #16\n\t"
  103230. "mul r6, r7, r6\n\t"
  103231. "lsr r7, r6, #16\n\t"
  103232. "lsl r6, r6, #16\n\t"
  103233. "adds r3, r3, r6\n\t"
  103234. "adcs r4, r4, r7\n\t"
  103235. "adc r5, r5, #0\n\t"
  103236. "lsr r6, r8, #16\n\t"
  103237. "lsr r7, r9, #16\n\t"
  103238. "mul r7, r6, r7\n\t"
  103239. "adds r4, r4, r7\n\t"
  103240. "adc r5, r5, #0\n\t"
  103241. "lsl r7, r9, #16\n\t"
  103242. "lsr r7, r7, #16\n\t"
  103243. "mul r6, r7, r6\n\t"
  103244. "lsr r7, r6, #16\n\t"
  103245. "lsl r6, r6, #16\n\t"
  103246. "adds r3, r3, r6\n\t"
  103247. "adcs r4, r4, r7\n\t"
  103248. "adc r5, r5, #0\n\t"
  103249. #else
  103250. "umull r6, r7, r8, r9\n\t"
  103251. "adds r3, r3, r6\n\t"
  103252. "adcs r4, r4, r7\n\t"
  103253. "adc r5, r5, #0\n\t"
  103254. #endif
  103255. "str r3, [%[r], #72]\n\t"
  103256. /* A[3] * B[16] */
  103257. "ldr r8, [%[a], #12]\n\t"
  103258. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103259. "lsl r6, r8, #16\n\t"
  103260. "lsl r7, r9, #16\n\t"
  103261. "lsr r6, r6, #16\n\t"
  103262. "lsr r7, r7, #16\n\t"
  103263. "mul r7, r6, r7\n\t"
  103264. "adds r4, r4, r7\n\t"
  103265. "adcs r5, r5, #0\n\t"
  103266. "mov r3, #0\n\t"
  103267. "adc r3, r3, #0\n\t"
  103268. "lsr r7, r9, #16\n\t"
  103269. "mul r6, r7, r6\n\t"
  103270. "lsr r7, r6, #16\n\t"
  103271. "lsl r6, r6, #16\n\t"
  103272. "adds r4, r4, r6\n\t"
  103273. "adcs r5, r5, r7\n\t"
  103274. "adc r3, r3, #0\n\t"
  103275. "lsr r6, r8, #16\n\t"
  103276. "lsr r7, r9, #16\n\t"
  103277. "mul r7, r6, r7\n\t"
  103278. "adds r5, r5, r7\n\t"
  103279. "adc r3, r3, #0\n\t"
  103280. "lsl r7, r9, #16\n\t"
  103281. "lsr r7, r7, #16\n\t"
  103282. "mul r6, r7, r6\n\t"
  103283. "lsr r7, r6, #16\n\t"
  103284. "lsl r6, r6, #16\n\t"
  103285. "adds r4, r4, r6\n\t"
  103286. "adcs r5, r5, r7\n\t"
  103287. "adc r3, r3, #0\n\t"
  103288. #else
  103289. "umull r6, r7, r8, r9\n\t"
  103290. "adds r4, r4, r6\n\t"
  103291. "adcs r5, r5, r7\n\t"
  103292. "mov r3, #0\n\t"
  103293. "adc r3, r3, #0\n\t"
  103294. #endif
  103295. /* A[4] * B[15] */
  103296. "ldr r8, [%[a], #16]\n\t"
  103297. "ldr r9, [%[b], #60]\n\t"
  103298. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103299. "lsl r6, r8, #16\n\t"
  103300. "lsl r7, r9, #16\n\t"
  103301. "lsr r6, r6, #16\n\t"
  103302. "lsr r7, r7, #16\n\t"
  103303. "mul r7, r6, r7\n\t"
  103304. "adds r4, r4, r7\n\t"
  103305. "adcs r5, r5, #0\n\t"
  103306. "adc r3, r3, #0\n\t"
  103307. "lsr r7, r9, #16\n\t"
  103308. "mul r6, r7, r6\n\t"
  103309. "lsr r7, r6, #16\n\t"
  103310. "lsl r6, r6, #16\n\t"
  103311. "adds r4, r4, r6\n\t"
  103312. "adcs r5, r5, r7\n\t"
  103313. "adc r3, r3, #0\n\t"
  103314. "lsr r6, r8, #16\n\t"
  103315. "lsr r7, r9, #16\n\t"
  103316. "mul r7, r6, r7\n\t"
  103317. "adds r5, r5, r7\n\t"
  103318. "adc r3, r3, #0\n\t"
  103319. "lsl r7, r9, #16\n\t"
  103320. "lsr r7, r7, #16\n\t"
  103321. "mul r6, r7, r6\n\t"
  103322. "lsr r7, r6, #16\n\t"
  103323. "lsl r6, r6, #16\n\t"
  103324. "adds r4, r4, r6\n\t"
  103325. "adcs r5, r5, r7\n\t"
  103326. "adc r3, r3, #0\n\t"
  103327. #else
  103328. "umull r6, r7, r8, r9\n\t"
  103329. "adds r4, r4, r6\n\t"
  103330. "adcs r5, r5, r7\n\t"
  103331. "adc r3, r3, #0\n\t"
  103332. #endif
  103333. /* A[5] * B[14] */
  103334. "ldr r8, [%[a], #20]\n\t"
  103335. "ldr r9, [%[b], #56]\n\t"
  103336. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103337. "lsl r6, r8, #16\n\t"
  103338. "lsl r7, r9, #16\n\t"
  103339. "lsr r6, r6, #16\n\t"
  103340. "lsr r7, r7, #16\n\t"
  103341. "mul r7, r6, r7\n\t"
  103342. "adds r4, r4, r7\n\t"
  103343. "adcs r5, r5, #0\n\t"
  103344. "adc r3, r3, #0\n\t"
  103345. "lsr r7, r9, #16\n\t"
  103346. "mul r6, r7, r6\n\t"
  103347. "lsr r7, r6, #16\n\t"
  103348. "lsl r6, r6, #16\n\t"
  103349. "adds r4, r4, r6\n\t"
  103350. "adcs r5, r5, r7\n\t"
  103351. "adc r3, r3, #0\n\t"
  103352. "lsr r6, r8, #16\n\t"
  103353. "lsr r7, r9, #16\n\t"
  103354. "mul r7, r6, r7\n\t"
  103355. "adds r5, r5, r7\n\t"
  103356. "adc r3, r3, #0\n\t"
  103357. "lsl r7, r9, #16\n\t"
  103358. "lsr r7, r7, #16\n\t"
  103359. "mul r6, r7, r6\n\t"
  103360. "lsr r7, r6, #16\n\t"
  103361. "lsl r6, r6, #16\n\t"
  103362. "adds r4, r4, r6\n\t"
  103363. "adcs r5, r5, r7\n\t"
  103364. "adc r3, r3, #0\n\t"
  103365. #else
  103366. "umull r6, r7, r8, r9\n\t"
  103367. "adds r4, r4, r6\n\t"
  103368. "adcs r5, r5, r7\n\t"
  103369. "adc r3, r3, #0\n\t"
  103370. #endif
  103371. /* A[6] * B[13] */
  103372. "ldr r8, [%[a], #24]\n\t"
  103373. "ldr r9, [%[b], #52]\n\t"
  103374. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103375. "lsl r6, r8, #16\n\t"
  103376. "lsl r7, r9, #16\n\t"
  103377. "lsr r6, r6, #16\n\t"
  103378. "lsr r7, r7, #16\n\t"
  103379. "mul r7, r6, r7\n\t"
  103380. "adds r4, r4, r7\n\t"
  103381. "adcs r5, r5, #0\n\t"
  103382. "adc r3, r3, #0\n\t"
  103383. "lsr r7, r9, #16\n\t"
  103384. "mul r6, r7, r6\n\t"
  103385. "lsr r7, r6, #16\n\t"
  103386. "lsl r6, r6, #16\n\t"
  103387. "adds r4, r4, r6\n\t"
  103388. "adcs r5, r5, r7\n\t"
  103389. "adc r3, r3, #0\n\t"
  103390. "lsr r6, r8, #16\n\t"
  103391. "lsr r7, r9, #16\n\t"
  103392. "mul r7, r6, r7\n\t"
  103393. "adds r5, r5, r7\n\t"
  103394. "adc r3, r3, #0\n\t"
  103395. "lsl r7, r9, #16\n\t"
  103396. "lsr r7, r7, #16\n\t"
  103397. "mul r6, r7, r6\n\t"
  103398. "lsr r7, r6, #16\n\t"
  103399. "lsl r6, r6, #16\n\t"
  103400. "adds r4, r4, r6\n\t"
  103401. "adcs r5, r5, r7\n\t"
  103402. "adc r3, r3, #0\n\t"
  103403. #else
  103404. "umull r6, r7, r8, r9\n\t"
  103405. "adds r4, r4, r6\n\t"
  103406. "adcs r5, r5, r7\n\t"
  103407. "adc r3, r3, #0\n\t"
  103408. #endif
  103409. /* A[7] * B[12] */
  103410. "ldr r8, [%[a], #28]\n\t"
  103411. "ldr r9, [%[b], #48]\n\t"
  103412. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103413. "lsl r6, r8, #16\n\t"
  103414. "lsl r7, r9, #16\n\t"
  103415. "lsr r6, r6, #16\n\t"
  103416. "lsr r7, r7, #16\n\t"
  103417. "mul r7, r6, r7\n\t"
  103418. "adds r4, r4, r7\n\t"
  103419. "adcs r5, r5, #0\n\t"
  103420. "adc r3, r3, #0\n\t"
  103421. "lsr r7, r9, #16\n\t"
  103422. "mul r6, r7, r6\n\t"
  103423. "lsr r7, r6, #16\n\t"
  103424. "lsl r6, r6, #16\n\t"
  103425. "adds r4, r4, r6\n\t"
  103426. "adcs r5, r5, r7\n\t"
  103427. "adc r3, r3, #0\n\t"
  103428. "lsr r6, r8, #16\n\t"
  103429. "lsr r7, r9, #16\n\t"
  103430. "mul r7, r6, r7\n\t"
  103431. "adds r5, r5, r7\n\t"
  103432. "adc r3, r3, #0\n\t"
  103433. "lsl r7, r9, #16\n\t"
  103434. "lsr r7, r7, #16\n\t"
  103435. "mul r6, r7, r6\n\t"
  103436. "lsr r7, r6, #16\n\t"
  103437. "lsl r6, r6, #16\n\t"
  103438. "adds r4, r4, r6\n\t"
  103439. "adcs r5, r5, r7\n\t"
  103440. "adc r3, r3, #0\n\t"
  103441. #else
  103442. "umull r6, r7, r8, r9\n\t"
  103443. "adds r4, r4, r6\n\t"
  103444. "adcs r5, r5, r7\n\t"
  103445. "adc r3, r3, #0\n\t"
  103446. #endif
  103447. /* A[8] * B[11] */
  103448. "ldr r8, [%[a], #32]\n\t"
  103449. "ldr r9, [%[b], #44]\n\t"
  103450. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103451. "lsl r6, r8, #16\n\t"
  103452. "lsl r7, r9, #16\n\t"
  103453. "lsr r6, r6, #16\n\t"
  103454. "lsr r7, r7, #16\n\t"
  103455. "mul r7, r6, r7\n\t"
  103456. "adds r4, r4, r7\n\t"
  103457. "adcs r5, r5, #0\n\t"
  103458. "adc r3, r3, #0\n\t"
  103459. "lsr r7, r9, #16\n\t"
  103460. "mul r6, r7, r6\n\t"
  103461. "lsr r7, r6, #16\n\t"
  103462. "lsl r6, r6, #16\n\t"
  103463. "adds r4, r4, r6\n\t"
  103464. "adcs r5, r5, r7\n\t"
  103465. "adc r3, r3, #0\n\t"
  103466. "lsr r6, r8, #16\n\t"
  103467. "lsr r7, r9, #16\n\t"
  103468. "mul r7, r6, r7\n\t"
  103469. "adds r5, r5, r7\n\t"
  103470. "adc r3, r3, #0\n\t"
  103471. "lsl r7, r9, #16\n\t"
  103472. "lsr r7, r7, #16\n\t"
  103473. "mul r6, r7, r6\n\t"
  103474. "lsr r7, r6, #16\n\t"
  103475. "lsl r6, r6, #16\n\t"
  103476. "adds r4, r4, r6\n\t"
  103477. "adcs r5, r5, r7\n\t"
  103478. "adc r3, r3, #0\n\t"
  103479. #else
  103480. "umull r6, r7, r8, r9\n\t"
  103481. "adds r4, r4, r6\n\t"
  103482. "adcs r5, r5, r7\n\t"
  103483. "adc r3, r3, #0\n\t"
  103484. #endif
  103485. /* A[9] * B[10] */
  103486. "ldr r9, [%[b], #40]\n\t"
  103487. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103488. "lsl r6, r11, #16\n\t"
  103489. "lsl r7, r9, #16\n\t"
  103490. "lsr r6, r6, #16\n\t"
  103491. "lsr r7, r7, #16\n\t"
  103492. "mul r7, r6, r7\n\t"
  103493. "adds r4, r4, r7\n\t"
  103494. "adcs r5, r5, #0\n\t"
  103495. "adc r3, r3, #0\n\t"
  103496. "lsr r7, r9, #16\n\t"
  103497. "mul r6, r7, r6\n\t"
  103498. "lsr r7, r6, #16\n\t"
  103499. "lsl r6, r6, #16\n\t"
  103500. "adds r4, r4, r6\n\t"
  103501. "adcs r5, r5, r7\n\t"
  103502. "adc r3, r3, #0\n\t"
  103503. "lsr r6, r11, #16\n\t"
  103504. "lsr r7, r9, #16\n\t"
  103505. "mul r7, r6, r7\n\t"
  103506. "adds r5, r5, r7\n\t"
  103507. "adc r3, r3, #0\n\t"
  103508. "lsl r7, r9, #16\n\t"
  103509. "lsr r7, r7, #16\n\t"
  103510. "mul r6, r7, r6\n\t"
  103511. "lsr r7, r6, #16\n\t"
  103512. "lsl r6, r6, #16\n\t"
  103513. "adds r4, r4, r6\n\t"
  103514. "adcs r5, r5, r7\n\t"
  103515. "adc r3, r3, #0\n\t"
  103516. #else
  103517. "umull r6, r7, r11, r9\n\t"
  103518. "adds r4, r4, r6\n\t"
  103519. "adcs r5, r5, r7\n\t"
  103520. "adc r3, r3, #0\n\t"
  103521. #endif
  103522. /* A[10] * B[9] */
  103523. "ldr r8, [%[a], #40]\n\t"
  103524. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103525. "lsl r6, r8, #16\n\t"
  103526. "lsl r7, r12, #16\n\t"
  103527. "lsr r6, r6, #16\n\t"
  103528. "lsr r7, r7, #16\n\t"
  103529. "mul r7, r6, r7\n\t"
  103530. "adds r4, r4, r7\n\t"
  103531. "adcs r5, r5, #0\n\t"
  103532. "adc r3, r3, #0\n\t"
  103533. "lsr r7, r12, #16\n\t"
  103534. "mul r6, r7, r6\n\t"
  103535. "lsr r7, r6, #16\n\t"
  103536. "lsl r6, r6, #16\n\t"
  103537. "adds r4, r4, r6\n\t"
  103538. "adcs r5, r5, r7\n\t"
  103539. "adc r3, r3, #0\n\t"
  103540. "lsr r6, r8, #16\n\t"
  103541. "lsr r7, r12, #16\n\t"
  103542. "mul r7, r6, r7\n\t"
  103543. "adds r5, r5, r7\n\t"
  103544. "adc r3, r3, #0\n\t"
  103545. "lsl r7, r12, #16\n\t"
  103546. "lsr r7, r7, #16\n\t"
  103547. "mul r6, r7, r6\n\t"
  103548. "lsr r7, r6, #16\n\t"
  103549. "lsl r6, r6, #16\n\t"
  103550. "adds r4, r4, r6\n\t"
  103551. "adcs r5, r5, r7\n\t"
  103552. "adc r3, r3, #0\n\t"
  103553. #else
  103554. "umull r6, r7, r8, r12\n\t"
  103555. "adds r4, r4, r6\n\t"
  103556. "adcs r5, r5, r7\n\t"
  103557. "adc r3, r3, #0\n\t"
  103558. #endif
  103559. /* A[11] * B[8] */
  103560. "ldr r8, [%[a], #44]\n\t"
  103561. "ldr r9, [%[b], #32]\n\t"
  103562. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103563. "lsl r6, r8, #16\n\t"
  103564. "lsl r7, r9, #16\n\t"
  103565. "lsr r6, r6, #16\n\t"
  103566. "lsr r7, r7, #16\n\t"
  103567. "mul r7, r6, r7\n\t"
  103568. "adds r4, r4, r7\n\t"
  103569. "adcs r5, r5, #0\n\t"
  103570. "adc r3, r3, #0\n\t"
  103571. "lsr r7, r9, #16\n\t"
  103572. "mul r6, r7, r6\n\t"
  103573. "lsr r7, r6, #16\n\t"
  103574. "lsl r6, r6, #16\n\t"
  103575. "adds r4, r4, r6\n\t"
  103576. "adcs r5, r5, r7\n\t"
  103577. "adc r3, r3, #0\n\t"
  103578. "lsr r6, r8, #16\n\t"
  103579. "lsr r7, r9, #16\n\t"
  103580. "mul r7, r6, r7\n\t"
  103581. "adds r5, r5, r7\n\t"
  103582. "adc r3, r3, #0\n\t"
  103583. "lsl r7, r9, #16\n\t"
  103584. "lsr r7, r7, #16\n\t"
  103585. "mul r6, r7, r6\n\t"
  103586. "lsr r7, r6, #16\n\t"
  103587. "lsl r6, r6, #16\n\t"
  103588. "adds r4, r4, r6\n\t"
  103589. "adcs r5, r5, r7\n\t"
  103590. "adc r3, r3, #0\n\t"
  103591. #else
  103592. "umull r6, r7, r8, r9\n\t"
  103593. "adds r4, r4, r6\n\t"
  103594. "adcs r5, r5, r7\n\t"
  103595. "adc r3, r3, #0\n\t"
  103596. #endif
  103597. /* A[12] * B[7] */
  103598. "ldr r8, [%[a], #48]\n\t"
  103599. "ldr r9, [%[b], #28]\n\t"
  103600. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103601. "lsl r6, r8, #16\n\t"
  103602. "lsl r7, r9, #16\n\t"
  103603. "lsr r6, r6, #16\n\t"
  103604. "lsr r7, r7, #16\n\t"
  103605. "mul r7, r6, r7\n\t"
  103606. "adds r4, r4, r7\n\t"
  103607. "adcs r5, r5, #0\n\t"
  103608. "adc r3, r3, #0\n\t"
  103609. "lsr r7, r9, #16\n\t"
  103610. "mul r6, r7, r6\n\t"
  103611. "lsr r7, r6, #16\n\t"
  103612. "lsl r6, r6, #16\n\t"
  103613. "adds r4, r4, r6\n\t"
  103614. "adcs r5, r5, r7\n\t"
  103615. "adc r3, r3, #0\n\t"
  103616. "lsr r6, r8, #16\n\t"
  103617. "lsr r7, r9, #16\n\t"
  103618. "mul r7, r6, r7\n\t"
  103619. "adds r5, r5, r7\n\t"
  103620. "adc r3, r3, #0\n\t"
  103621. "lsl r7, r9, #16\n\t"
  103622. "lsr r7, r7, #16\n\t"
  103623. "mul r6, r7, r6\n\t"
  103624. "lsr r7, r6, #16\n\t"
  103625. "lsl r6, r6, #16\n\t"
  103626. "adds r4, r4, r6\n\t"
  103627. "adcs r5, r5, r7\n\t"
  103628. "adc r3, r3, #0\n\t"
  103629. #else
  103630. "umull r6, r7, r8, r9\n\t"
  103631. "adds r4, r4, r6\n\t"
  103632. "adcs r5, r5, r7\n\t"
  103633. "adc r3, r3, #0\n\t"
  103634. #endif
  103635. /* A[13] * B[6] */
  103636. "ldr r8, [%[a], #52]\n\t"
  103637. "ldr r9, [%[b], #24]\n\t"
  103638. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103639. "lsl r6, r8, #16\n\t"
  103640. "lsl r7, r9, #16\n\t"
  103641. "lsr r6, r6, #16\n\t"
  103642. "lsr r7, r7, #16\n\t"
  103643. "mul r7, r6, r7\n\t"
  103644. "adds r4, r4, r7\n\t"
  103645. "adcs r5, r5, #0\n\t"
  103646. "adc r3, r3, #0\n\t"
  103647. "lsr r7, r9, #16\n\t"
  103648. "mul r6, r7, r6\n\t"
  103649. "lsr r7, r6, #16\n\t"
  103650. "lsl r6, r6, #16\n\t"
  103651. "adds r4, r4, r6\n\t"
  103652. "adcs r5, r5, r7\n\t"
  103653. "adc r3, r3, #0\n\t"
  103654. "lsr r6, r8, #16\n\t"
  103655. "lsr r7, r9, #16\n\t"
  103656. "mul r7, r6, r7\n\t"
  103657. "adds r5, r5, r7\n\t"
  103658. "adc r3, r3, #0\n\t"
  103659. "lsl r7, r9, #16\n\t"
  103660. "lsr r7, r7, #16\n\t"
  103661. "mul r6, r7, r6\n\t"
  103662. "lsr r7, r6, #16\n\t"
  103663. "lsl r6, r6, #16\n\t"
  103664. "adds r4, r4, r6\n\t"
  103665. "adcs r5, r5, r7\n\t"
  103666. "adc r3, r3, #0\n\t"
  103667. #else
  103668. "umull r6, r7, r8, r9\n\t"
  103669. "adds r4, r4, r6\n\t"
  103670. "adcs r5, r5, r7\n\t"
  103671. "adc r3, r3, #0\n\t"
  103672. #endif
  103673. /* A[14] * B[5] */
  103674. "ldr r8, [%[a], #56]\n\t"
  103675. "ldr r9, [%[b], #20]\n\t"
  103676. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103677. "lsl r6, r8, #16\n\t"
  103678. "lsl r7, r9, #16\n\t"
  103679. "lsr r6, r6, #16\n\t"
  103680. "lsr r7, r7, #16\n\t"
  103681. "mul r7, r6, r7\n\t"
  103682. "adds r4, r4, r7\n\t"
  103683. "adcs r5, r5, #0\n\t"
  103684. "adc r3, r3, #0\n\t"
  103685. "lsr r7, r9, #16\n\t"
  103686. "mul r6, r7, r6\n\t"
  103687. "lsr r7, r6, #16\n\t"
  103688. "lsl r6, r6, #16\n\t"
  103689. "adds r4, r4, r6\n\t"
  103690. "adcs r5, r5, r7\n\t"
  103691. "adc r3, r3, #0\n\t"
  103692. "lsr r6, r8, #16\n\t"
  103693. "lsr r7, r9, #16\n\t"
  103694. "mul r7, r6, r7\n\t"
  103695. "adds r5, r5, r7\n\t"
  103696. "adc r3, r3, #0\n\t"
  103697. "lsl r7, r9, #16\n\t"
  103698. "lsr r7, r7, #16\n\t"
  103699. "mul r6, r7, r6\n\t"
  103700. "lsr r7, r6, #16\n\t"
  103701. "lsl r6, r6, #16\n\t"
  103702. "adds r4, r4, r6\n\t"
  103703. "adcs r5, r5, r7\n\t"
  103704. "adc r3, r3, #0\n\t"
  103705. #else
  103706. "umull r6, r7, r8, r9\n\t"
  103707. "adds r4, r4, r6\n\t"
  103708. "adcs r5, r5, r7\n\t"
  103709. "adc r3, r3, #0\n\t"
  103710. #endif
  103711. /* A[15] * B[4] */
  103712. "ldr r8, [%[a], #60]\n\t"
  103713. "ldr r9, [%[b], #16]\n\t"
  103714. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103715. "lsl r6, r8, #16\n\t"
  103716. "lsl r7, r9, #16\n\t"
  103717. "lsr r6, r6, #16\n\t"
  103718. "lsr r7, r7, #16\n\t"
  103719. "mul r7, r6, r7\n\t"
  103720. "adds r4, r4, r7\n\t"
  103721. "adcs r5, r5, #0\n\t"
  103722. "adc r3, r3, #0\n\t"
  103723. "lsr r7, r9, #16\n\t"
  103724. "mul r6, r7, r6\n\t"
  103725. "lsr r7, r6, #16\n\t"
  103726. "lsl r6, r6, #16\n\t"
  103727. "adds r4, r4, r6\n\t"
  103728. "adcs r5, r5, r7\n\t"
  103729. "adc r3, r3, #0\n\t"
  103730. "lsr r6, r8, #16\n\t"
  103731. "lsr r7, r9, #16\n\t"
  103732. "mul r7, r6, r7\n\t"
  103733. "adds r5, r5, r7\n\t"
  103734. "adc r3, r3, #0\n\t"
  103735. "lsl r7, r9, #16\n\t"
  103736. "lsr r7, r7, #16\n\t"
  103737. "mul r6, r7, r6\n\t"
  103738. "lsr r7, r6, #16\n\t"
  103739. "lsl r6, r6, #16\n\t"
  103740. "adds r4, r4, r6\n\t"
  103741. "adcs r5, r5, r7\n\t"
  103742. "adc r3, r3, #0\n\t"
  103743. #else
  103744. "umull r6, r7, r8, r9\n\t"
  103745. "adds r4, r4, r6\n\t"
  103746. "adcs r5, r5, r7\n\t"
  103747. "adc r3, r3, #0\n\t"
  103748. #endif
  103749. /* A[16] * B[3] */
  103750. "ldr r8, [%[a], #64]\n\t"
  103751. "ldr r9, [%[b], #12]\n\t"
  103752. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103753. "lsl r6, r8, #16\n\t"
  103754. "lsl r7, r9, #16\n\t"
  103755. "lsr r6, r6, #16\n\t"
  103756. "lsr r7, r7, #16\n\t"
  103757. "mul r7, r6, r7\n\t"
  103758. "adds r4, r4, r7\n\t"
  103759. "adcs r5, r5, #0\n\t"
  103760. "adc r3, r3, #0\n\t"
  103761. "lsr r7, r9, #16\n\t"
  103762. "mul r6, r7, r6\n\t"
  103763. "lsr r7, r6, #16\n\t"
  103764. "lsl r6, r6, #16\n\t"
  103765. "adds r4, r4, r6\n\t"
  103766. "adcs r5, r5, r7\n\t"
  103767. "adc r3, r3, #0\n\t"
  103768. "lsr r6, r8, #16\n\t"
  103769. "lsr r7, r9, #16\n\t"
  103770. "mul r7, r6, r7\n\t"
  103771. "adds r5, r5, r7\n\t"
  103772. "adc r3, r3, #0\n\t"
  103773. "lsl r7, r9, #16\n\t"
  103774. "lsr r7, r7, #16\n\t"
  103775. "mul r6, r7, r6\n\t"
  103776. "lsr r7, r6, #16\n\t"
  103777. "lsl r6, r6, #16\n\t"
  103778. "adds r4, r4, r6\n\t"
  103779. "adcs r5, r5, r7\n\t"
  103780. "adc r3, r3, #0\n\t"
  103781. #else
  103782. "umull r6, r7, r8, r9\n\t"
  103783. "adds r4, r4, r6\n\t"
  103784. "adcs r5, r5, r7\n\t"
  103785. "adc r3, r3, #0\n\t"
  103786. #endif
  103787. "str r4, [%[r], #76]\n\t"
  103788. /* A[16] * B[4] */
  103789. "ldr r9, [%[b], #16]\n\t"
  103790. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103791. "lsl r6, r8, #16\n\t"
  103792. "lsl r7, r9, #16\n\t"
  103793. "lsr r6, r6, #16\n\t"
  103794. "lsr r7, r7, #16\n\t"
  103795. "mul r7, r6, r7\n\t"
  103796. "adds r5, r5, r7\n\t"
  103797. "adcs r3, r3, #0\n\t"
  103798. "mov r4, #0\n\t"
  103799. "adc r4, r4, #0\n\t"
  103800. "lsr r7, r9, #16\n\t"
  103801. "mul r6, r7, r6\n\t"
  103802. "lsr r7, r6, #16\n\t"
  103803. "lsl r6, r6, #16\n\t"
  103804. "adds r5, r5, r6\n\t"
  103805. "adcs r3, r3, r7\n\t"
  103806. "adc r4, r4, #0\n\t"
  103807. "lsr r6, r8, #16\n\t"
  103808. "lsr r7, r9, #16\n\t"
  103809. "mul r7, r6, r7\n\t"
  103810. "adds r3, r3, r7\n\t"
  103811. "adc r4, r4, #0\n\t"
  103812. "lsl r7, r9, #16\n\t"
  103813. "lsr r7, r7, #16\n\t"
  103814. "mul r6, r7, r6\n\t"
  103815. "lsr r7, r6, #16\n\t"
  103816. "lsl r6, r6, #16\n\t"
  103817. "adds r5, r5, r6\n\t"
  103818. "adcs r3, r3, r7\n\t"
  103819. "adc r4, r4, #0\n\t"
  103820. #else
  103821. "umull r6, r7, r8, r9\n\t"
  103822. "adds r5, r5, r6\n\t"
  103823. "adcs r3, r3, r7\n\t"
  103824. "mov r4, #0\n\t"
  103825. "adc r4, r4, #0\n\t"
  103826. #endif
  103827. /* A[15] * B[5] */
  103828. "ldr r8, [%[a], #60]\n\t"
  103829. "ldr r9, [%[b], #20]\n\t"
  103830. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103831. "lsl r6, r8, #16\n\t"
  103832. "lsl r7, r9, #16\n\t"
  103833. "lsr r6, r6, #16\n\t"
  103834. "lsr r7, r7, #16\n\t"
  103835. "mul r7, r6, r7\n\t"
  103836. "adds r5, r5, r7\n\t"
  103837. "adcs r3, r3, #0\n\t"
  103838. "adc r4, r4, #0\n\t"
  103839. "lsr r7, r9, #16\n\t"
  103840. "mul r6, r7, r6\n\t"
  103841. "lsr r7, r6, #16\n\t"
  103842. "lsl r6, r6, #16\n\t"
  103843. "adds r5, r5, r6\n\t"
  103844. "adcs r3, r3, r7\n\t"
  103845. "adc r4, r4, #0\n\t"
  103846. "lsr r6, r8, #16\n\t"
  103847. "lsr r7, r9, #16\n\t"
  103848. "mul r7, r6, r7\n\t"
  103849. "adds r3, r3, r7\n\t"
  103850. "adc r4, r4, #0\n\t"
  103851. "lsl r7, r9, #16\n\t"
  103852. "lsr r7, r7, #16\n\t"
  103853. "mul r6, r7, r6\n\t"
  103854. "lsr r7, r6, #16\n\t"
  103855. "lsl r6, r6, #16\n\t"
  103856. "adds r5, r5, r6\n\t"
  103857. "adcs r3, r3, r7\n\t"
  103858. "adc r4, r4, #0\n\t"
  103859. #else
  103860. "umull r6, r7, r8, r9\n\t"
  103861. "adds r5, r5, r6\n\t"
  103862. "adcs r3, r3, r7\n\t"
  103863. "adc r4, r4, #0\n\t"
  103864. #endif
  103865. /* A[14] * B[6] */
  103866. "ldr r8, [%[a], #56]\n\t"
  103867. "ldr r9, [%[b], #24]\n\t"
  103868. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103869. "lsl r6, r8, #16\n\t"
  103870. "lsl r7, r9, #16\n\t"
  103871. "lsr r6, r6, #16\n\t"
  103872. "lsr r7, r7, #16\n\t"
  103873. "mul r7, r6, r7\n\t"
  103874. "adds r5, r5, r7\n\t"
  103875. "adcs r3, r3, #0\n\t"
  103876. "adc r4, r4, #0\n\t"
  103877. "lsr r7, r9, #16\n\t"
  103878. "mul r6, r7, r6\n\t"
  103879. "lsr r7, r6, #16\n\t"
  103880. "lsl r6, r6, #16\n\t"
  103881. "adds r5, r5, r6\n\t"
  103882. "adcs r3, r3, r7\n\t"
  103883. "adc r4, r4, #0\n\t"
  103884. "lsr r6, r8, #16\n\t"
  103885. "lsr r7, r9, #16\n\t"
  103886. "mul r7, r6, r7\n\t"
  103887. "adds r3, r3, r7\n\t"
  103888. "adc r4, r4, #0\n\t"
  103889. "lsl r7, r9, #16\n\t"
  103890. "lsr r7, r7, #16\n\t"
  103891. "mul r6, r7, r6\n\t"
  103892. "lsr r7, r6, #16\n\t"
  103893. "lsl r6, r6, #16\n\t"
  103894. "adds r5, r5, r6\n\t"
  103895. "adcs r3, r3, r7\n\t"
  103896. "adc r4, r4, #0\n\t"
  103897. #else
  103898. "umull r6, r7, r8, r9\n\t"
  103899. "adds r5, r5, r6\n\t"
  103900. "adcs r3, r3, r7\n\t"
  103901. "adc r4, r4, #0\n\t"
  103902. #endif
  103903. /* A[13] * B[7] */
  103904. "ldr r8, [%[a], #52]\n\t"
  103905. "ldr r9, [%[b], #28]\n\t"
  103906. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103907. "lsl r6, r8, #16\n\t"
  103908. "lsl r7, r9, #16\n\t"
  103909. "lsr r6, r6, #16\n\t"
  103910. "lsr r7, r7, #16\n\t"
  103911. "mul r7, r6, r7\n\t"
  103912. "adds r5, r5, r7\n\t"
  103913. "adcs r3, r3, #0\n\t"
  103914. "adc r4, r4, #0\n\t"
  103915. "lsr r7, r9, #16\n\t"
  103916. "mul r6, r7, r6\n\t"
  103917. "lsr r7, r6, #16\n\t"
  103918. "lsl r6, r6, #16\n\t"
  103919. "adds r5, r5, r6\n\t"
  103920. "adcs r3, r3, r7\n\t"
  103921. "adc r4, r4, #0\n\t"
  103922. "lsr r6, r8, #16\n\t"
  103923. "lsr r7, r9, #16\n\t"
  103924. "mul r7, r6, r7\n\t"
  103925. "adds r3, r3, r7\n\t"
  103926. "adc r4, r4, #0\n\t"
  103927. "lsl r7, r9, #16\n\t"
  103928. "lsr r7, r7, #16\n\t"
  103929. "mul r6, r7, r6\n\t"
  103930. "lsr r7, r6, #16\n\t"
  103931. "lsl r6, r6, #16\n\t"
  103932. "adds r5, r5, r6\n\t"
  103933. "adcs r3, r3, r7\n\t"
  103934. "adc r4, r4, #0\n\t"
  103935. #else
  103936. "umull r6, r7, r8, r9\n\t"
  103937. "adds r5, r5, r6\n\t"
  103938. "adcs r3, r3, r7\n\t"
  103939. "adc r4, r4, #0\n\t"
  103940. #endif
  103941. /* A[12] * B[8] */
  103942. "ldr r8, [%[a], #48]\n\t"
  103943. "ldr r9, [%[b], #32]\n\t"
  103944. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103945. "lsl r6, r8, #16\n\t"
  103946. "lsl r7, r9, #16\n\t"
  103947. "lsr r6, r6, #16\n\t"
  103948. "lsr r7, r7, #16\n\t"
  103949. "mul r7, r6, r7\n\t"
  103950. "adds r5, r5, r7\n\t"
  103951. "adcs r3, r3, #0\n\t"
  103952. "adc r4, r4, #0\n\t"
  103953. "lsr r7, r9, #16\n\t"
  103954. "mul r6, r7, r6\n\t"
  103955. "lsr r7, r6, #16\n\t"
  103956. "lsl r6, r6, #16\n\t"
  103957. "adds r5, r5, r6\n\t"
  103958. "adcs r3, r3, r7\n\t"
  103959. "adc r4, r4, #0\n\t"
  103960. "lsr r6, r8, #16\n\t"
  103961. "lsr r7, r9, #16\n\t"
  103962. "mul r7, r6, r7\n\t"
  103963. "adds r3, r3, r7\n\t"
  103964. "adc r4, r4, #0\n\t"
  103965. "lsl r7, r9, #16\n\t"
  103966. "lsr r7, r7, #16\n\t"
  103967. "mul r6, r7, r6\n\t"
  103968. "lsr r7, r6, #16\n\t"
  103969. "lsl r6, r6, #16\n\t"
  103970. "adds r5, r5, r6\n\t"
  103971. "adcs r3, r3, r7\n\t"
  103972. "adc r4, r4, #0\n\t"
  103973. #else
  103974. "umull r6, r7, r8, r9\n\t"
  103975. "adds r5, r5, r6\n\t"
  103976. "adcs r3, r3, r7\n\t"
  103977. "adc r4, r4, #0\n\t"
  103978. #endif
  103979. /* A[11] * B[9] */
  103980. "ldr r8, [%[a], #44]\n\t"
  103981. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  103982. "lsl r6, r8, #16\n\t"
  103983. "lsl r7, r12, #16\n\t"
  103984. "lsr r6, r6, #16\n\t"
  103985. "lsr r7, r7, #16\n\t"
  103986. "mul r7, r6, r7\n\t"
  103987. "adds r5, r5, r7\n\t"
  103988. "adcs r3, r3, #0\n\t"
  103989. "adc r4, r4, #0\n\t"
  103990. "lsr r7, r12, #16\n\t"
  103991. "mul r6, r7, r6\n\t"
  103992. "lsr r7, r6, #16\n\t"
  103993. "lsl r6, r6, #16\n\t"
  103994. "adds r5, r5, r6\n\t"
  103995. "adcs r3, r3, r7\n\t"
  103996. "adc r4, r4, #0\n\t"
  103997. "lsr r6, r8, #16\n\t"
  103998. "lsr r7, r12, #16\n\t"
  103999. "mul r7, r6, r7\n\t"
  104000. "adds r3, r3, r7\n\t"
  104001. "adc r4, r4, #0\n\t"
  104002. "lsl r7, r12, #16\n\t"
  104003. "lsr r7, r7, #16\n\t"
  104004. "mul r6, r7, r6\n\t"
  104005. "lsr r7, r6, #16\n\t"
  104006. "lsl r6, r6, #16\n\t"
  104007. "adds r5, r5, r6\n\t"
  104008. "adcs r3, r3, r7\n\t"
  104009. "adc r4, r4, #0\n\t"
  104010. #else
  104011. "umull r6, r7, r8, r12\n\t"
  104012. "adds r5, r5, r6\n\t"
  104013. "adcs r3, r3, r7\n\t"
  104014. "adc r4, r4, #0\n\t"
  104015. #endif
  104016. /* A[10] * B[10] */
  104017. "ldr r11, [%[a], #40]\n\t"
  104018. "ldr r12, [%[b], #40]\n\t"
  104019. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104020. "lsl r6, r11, #16\n\t"
  104021. "lsl r7, r12, #16\n\t"
  104022. "lsr r6, r6, #16\n\t"
  104023. "lsr r7, r7, #16\n\t"
  104024. "mul r7, r6, r7\n\t"
  104025. "adds r5, r5, r7\n\t"
  104026. "adcs r3, r3, #0\n\t"
  104027. "adc r4, r4, #0\n\t"
  104028. "lsr r7, r12, #16\n\t"
  104029. "mul r6, r7, r6\n\t"
  104030. "lsr r7, r6, #16\n\t"
  104031. "lsl r6, r6, #16\n\t"
  104032. "adds r5, r5, r6\n\t"
  104033. "adcs r3, r3, r7\n\t"
  104034. "adc r4, r4, #0\n\t"
  104035. "lsr r6, r11, #16\n\t"
  104036. "lsr r7, r12, #16\n\t"
  104037. "mul r7, r6, r7\n\t"
  104038. "adds r3, r3, r7\n\t"
  104039. "adc r4, r4, #0\n\t"
  104040. "lsl r7, r12, #16\n\t"
  104041. "lsr r7, r7, #16\n\t"
  104042. "mul r6, r7, r6\n\t"
  104043. "lsr r7, r6, #16\n\t"
  104044. "lsl r6, r6, #16\n\t"
  104045. "adds r5, r5, r6\n\t"
  104046. "adcs r3, r3, r7\n\t"
  104047. "adc r4, r4, #0\n\t"
  104048. #else
  104049. "umull r6, r7, r11, r12\n\t"
  104050. "adds r5, r5, r6\n\t"
  104051. "adcs r3, r3, r7\n\t"
  104052. "adc r4, r4, #0\n\t"
  104053. #endif
  104054. /* A[9] * B[11] */
  104055. "ldr r8, [%[a], #36]\n\t"
  104056. "ldr r9, [%[b], #44]\n\t"
  104057. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104058. "lsl r6, r8, #16\n\t"
  104059. "lsl r7, r9, #16\n\t"
  104060. "lsr r6, r6, #16\n\t"
  104061. "lsr r7, r7, #16\n\t"
  104062. "mul r7, r6, r7\n\t"
  104063. "adds r5, r5, r7\n\t"
  104064. "adcs r3, r3, #0\n\t"
  104065. "adc r4, r4, #0\n\t"
  104066. "lsr r7, r9, #16\n\t"
  104067. "mul r6, r7, r6\n\t"
  104068. "lsr r7, r6, #16\n\t"
  104069. "lsl r6, r6, #16\n\t"
  104070. "adds r5, r5, r6\n\t"
  104071. "adcs r3, r3, r7\n\t"
  104072. "adc r4, r4, #0\n\t"
  104073. "lsr r6, r8, #16\n\t"
  104074. "lsr r7, r9, #16\n\t"
  104075. "mul r7, r6, r7\n\t"
  104076. "adds r3, r3, r7\n\t"
  104077. "adc r4, r4, #0\n\t"
  104078. "lsl r7, r9, #16\n\t"
  104079. "lsr r7, r7, #16\n\t"
  104080. "mul r6, r7, r6\n\t"
  104081. "lsr r7, r6, #16\n\t"
  104082. "lsl r6, r6, #16\n\t"
  104083. "adds r5, r5, r6\n\t"
  104084. "adcs r3, r3, r7\n\t"
  104085. "adc r4, r4, #0\n\t"
  104086. #else
  104087. "umull r6, r7, r8, r9\n\t"
  104088. "adds r5, r5, r6\n\t"
  104089. "adcs r3, r3, r7\n\t"
  104090. "adc r4, r4, #0\n\t"
  104091. #endif
  104092. /* A[8] * B[12] */
  104093. "ldr r8, [%[a], #32]\n\t"
  104094. "ldr r9, [%[b], #48]\n\t"
  104095. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104096. "lsl r6, r8, #16\n\t"
  104097. "lsl r7, r9, #16\n\t"
  104098. "lsr r6, r6, #16\n\t"
  104099. "lsr r7, r7, #16\n\t"
  104100. "mul r7, r6, r7\n\t"
  104101. "adds r5, r5, r7\n\t"
  104102. "adcs r3, r3, #0\n\t"
  104103. "adc r4, r4, #0\n\t"
  104104. "lsr r7, r9, #16\n\t"
  104105. "mul r6, r7, r6\n\t"
  104106. "lsr r7, r6, #16\n\t"
  104107. "lsl r6, r6, #16\n\t"
  104108. "adds r5, r5, r6\n\t"
  104109. "adcs r3, r3, r7\n\t"
  104110. "adc r4, r4, #0\n\t"
  104111. "lsr r6, r8, #16\n\t"
  104112. "lsr r7, r9, #16\n\t"
  104113. "mul r7, r6, r7\n\t"
  104114. "adds r3, r3, r7\n\t"
  104115. "adc r4, r4, #0\n\t"
  104116. "lsl r7, r9, #16\n\t"
  104117. "lsr r7, r7, #16\n\t"
  104118. "mul r6, r7, r6\n\t"
  104119. "lsr r7, r6, #16\n\t"
  104120. "lsl r6, r6, #16\n\t"
  104121. "adds r5, r5, r6\n\t"
  104122. "adcs r3, r3, r7\n\t"
  104123. "adc r4, r4, #0\n\t"
  104124. #else
  104125. "umull r6, r7, r8, r9\n\t"
  104126. "adds r5, r5, r6\n\t"
  104127. "adcs r3, r3, r7\n\t"
  104128. "adc r4, r4, #0\n\t"
  104129. #endif
  104130. /* A[7] * B[13] */
  104131. "ldr r8, [%[a], #28]\n\t"
  104132. "ldr r9, [%[b], #52]\n\t"
  104133. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104134. "lsl r6, r8, #16\n\t"
  104135. "lsl r7, r9, #16\n\t"
  104136. "lsr r6, r6, #16\n\t"
  104137. "lsr r7, r7, #16\n\t"
  104138. "mul r7, r6, r7\n\t"
  104139. "adds r5, r5, r7\n\t"
  104140. "adcs r3, r3, #0\n\t"
  104141. "adc r4, r4, #0\n\t"
  104142. "lsr r7, r9, #16\n\t"
  104143. "mul r6, r7, r6\n\t"
  104144. "lsr r7, r6, #16\n\t"
  104145. "lsl r6, r6, #16\n\t"
  104146. "adds r5, r5, r6\n\t"
  104147. "adcs r3, r3, r7\n\t"
  104148. "adc r4, r4, #0\n\t"
  104149. "lsr r6, r8, #16\n\t"
  104150. "lsr r7, r9, #16\n\t"
  104151. "mul r7, r6, r7\n\t"
  104152. "adds r3, r3, r7\n\t"
  104153. "adc r4, r4, #0\n\t"
  104154. "lsl r7, r9, #16\n\t"
  104155. "lsr r7, r7, #16\n\t"
  104156. "mul r6, r7, r6\n\t"
  104157. "lsr r7, r6, #16\n\t"
  104158. "lsl r6, r6, #16\n\t"
  104159. "adds r5, r5, r6\n\t"
  104160. "adcs r3, r3, r7\n\t"
  104161. "adc r4, r4, #0\n\t"
  104162. #else
  104163. "umull r6, r7, r8, r9\n\t"
  104164. "adds r5, r5, r6\n\t"
  104165. "adcs r3, r3, r7\n\t"
  104166. "adc r4, r4, #0\n\t"
  104167. #endif
  104168. /* A[6] * B[14] */
  104169. "ldr r8, [%[a], #24]\n\t"
  104170. "ldr r9, [%[b], #56]\n\t"
  104171. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104172. "lsl r6, r8, #16\n\t"
  104173. "lsl r7, r9, #16\n\t"
  104174. "lsr r6, r6, #16\n\t"
  104175. "lsr r7, r7, #16\n\t"
  104176. "mul r7, r6, r7\n\t"
  104177. "adds r5, r5, r7\n\t"
  104178. "adcs r3, r3, #0\n\t"
  104179. "adc r4, r4, #0\n\t"
  104180. "lsr r7, r9, #16\n\t"
  104181. "mul r6, r7, r6\n\t"
  104182. "lsr r7, r6, #16\n\t"
  104183. "lsl r6, r6, #16\n\t"
  104184. "adds r5, r5, r6\n\t"
  104185. "adcs r3, r3, r7\n\t"
  104186. "adc r4, r4, #0\n\t"
  104187. "lsr r6, r8, #16\n\t"
  104188. "lsr r7, r9, #16\n\t"
  104189. "mul r7, r6, r7\n\t"
  104190. "adds r3, r3, r7\n\t"
  104191. "adc r4, r4, #0\n\t"
  104192. "lsl r7, r9, #16\n\t"
  104193. "lsr r7, r7, #16\n\t"
  104194. "mul r6, r7, r6\n\t"
  104195. "lsr r7, r6, #16\n\t"
  104196. "lsl r6, r6, #16\n\t"
  104197. "adds r5, r5, r6\n\t"
  104198. "adcs r3, r3, r7\n\t"
  104199. "adc r4, r4, #0\n\t"
  104200. #else
  104201. "umull r6, r7, r8, r9\n\t"
  104202. "adds r5, r5, r6\n\t"
  104203. "adcs r3, r3, r7\n\t"
  104204. "adc r4, r4, #0\n\t"
  104205. #endif
  104206. /* A[5] * B[15] */
  104207. "ldr r8, [%[a], #20]\n\t"
  104208. "ldr r9, [%[b], #60]\n\t"
  104209. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104210. "lsl r6, r8, #16\n\t"
  104211. "lsl r7, r9, #16\n\t"
  104212. "lsr r6, r6, #16\n\t"
  104213. "lsr r7, r7, #16\n\t"
  104214. "mul r7, r6, r7\n\t"
  104215. "adds r5, r5, r7\n\t"
  104216. "adcs r3, r3, #0\n\t"
  104217. "adc r4, r4, #0\n\t"
  104218. "lsr r7, r9, #16\n\t"
  104219. "mul r6, r7, r6\n\t"
  104220. "lsr r7, r6, #16\n\t"
  104221. "lsl r6, r6, #16\n\t"
  104222. "adds r5, r5, r6\n\t"
  104223. "adcs r3, r3, r7\n\t"
  104224. "adc r4, r4, #0\n\t"
  104225. "lsr r6, r8, #16\n\t"
  104226. "lsr r7, r9, #16\n\t"
  104227. "mul r7, r6, r7\n\t"
  104228. "adds r3, r3, r7\n\t"
  104229. "adc r4, r4, #0\n\t"
  104230. "lsl r7, r9, #16\n\t"
  104231. "lsr r7, r7, #16\n\t"
  104232. "mul r6, r7, r6\n\t"
  104233. "lsr r7, r6, #16\n\t"
  104234. "lsl r6, r6, #16\n\t"
  104235. "adds r5, r5, r6\n\t"
  104236. "adcs r3, r3, r7\n\t"
  104237. "adc r4, r4, #0\n\t"
  104238. #else
  104239. "umull r6, r7, r8, r9\n\t"
  104240. "adds r5, r5, r6\n\t"
  104241. "adcs r3, r3, r7\n\t"
  104242. "adc r4, r4, #0\n\t"
  104243. #endif
  104244. /* A[4] * B[16] */
  104245. "ldr r8, [%[a], #16]\n\t"
  104246. "ldr r9, [%[b], #64]\n\t"
  104247. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104248. "lsl r6, r8, #16\n\t"
  104249. "lsl r7, r9, #16\n\t"
  104250. "lsr r6, r6, #16\n\t"
  104251. "lsr r7, r7, #16\n\t"
  104252. "mul r7, r6, r7\n\t"
  104253. "adds r5, r5, r7\n\t"
  104254. "adcs r3, r3, #0\n\t"
  104255. "adc r4, r4, #0\n\t"
  104256. "lsr r7, r9, #16\n\t"
  104257. "mul r6, r7, r6\n\t"
  104258. "lsr r7, r6, #16\n\t"
  104259. "lsl r6, r6, #16\n\t"
  104260. "adds r5, r5, r6\n\t"
  104261. "adcs r3, r3, r7\n\t"
  104262. "adc r4, r4, #0\n\t"
  104263. "lsr r6, r8, #16\n\t"
  104264. "lsr r7, r9, #16\n\t"
  104265. "mul r7, r6, r7\n\t"
  104266. "adds r3, r3, r7\n\t"
  104267. "adc r4, r4, #0\n\t"
  104268. "lsl r7, r9, #16\n\t"
  104269. "lsr r7, r7, #16\n\t"
  104270. "mul r6, r7, r6\n\t"
  104271. "lsr r7, r6, #16\n\t"
  104272. "lsl r6, r6, #16\n\t"
  104273. "adds r5, r5, r6\n\t"
  104274. "adcs r3, r3, r7\n\t"
  104275. "adc r4, r4, #0\n\t"
  104276. #else
  104277. "umull r6, r7, r8, r9\n\t"
  104278. "adds r5, r5, r6\n\t"
  104279. "adcs r3, r3, r7\n\t"
  104280. "adc r4, r4, #0\n\t"
  104281. #endif
  104282. "str r5, [%[r], #80]\n\t"
  104283. /* A[5] * B[16] */
  104284. "ldr r8, [%[a], #20]\n\t"
  104285. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104286. "lsl r6, r8, #16\n\t"
  104287. "lsl r7, r9, #16\n\t"
  104288. "lsr r6, r6, #16\n\t"
  104289. "lsr r7, r7, #16\n\t"
  104290. "mul r7, r6, r7\n\t"
  104291. "adds r3, r3, r7\n\t"
  104292. "adcs r4, r4, #0\n\t"
  104293. "mov r5, #0\n\t"
  104294. "adc r5, r5, #0\n\t"
  104295. "lsr r7, r9, #16\n\t"
  104296. "mul r6, r7, r6\n\t"
  104297. "lsr r7, r6, #16\n\t"
  104298. "lsl r6, r6, #16\n\t"
  104299. "adds r3, r3, r6\n\t"
  104300. "adcs r4, r4, r7\n\t"
  104301. "adc r5, r5, #0\n\t"
  104302. "lsr r6, r8, #16\n\t"
  104303. "lsr r7, r9, #16\n\t"
  104304. "mul r7, r6, r7\n\t"
  104305. "adds r4, r4, r7\n\t"
  104306. "adc r5, r5, #0\n\t"
  104307. "lsl r7, r9, #16\n\t"
  104308. "lsr r7, r7, #16\n\t"
  104309. "mul r6, r7, r6\n\t"
  104310. "lsr r7, r6, #16\n\t"
  104311. "lsl r6, r6, #16\n\t"
  104312. "adds r3, r3, r6\n\t"
  104313. "adcs r4, r4, r7\n\t"
  104314. "adc r5, r5, #0\n\t"
  104315. #else
  104316. "umull r6, r7, r8, r9\n\t"
  104317. "adds r3, r3, r6\n\t"
  104318. "adcs r4, r4, r7\n\t"
  104319. "mov r5, #0\n\t"
  104320. "adc r5, r5, #0\n\t"
  104321. #endif
  104322. /* A[6] * B[15] */
  104323. "ldr r8, [%[a], #24]\n\t"
  104324. "ldr r9, [%[b], #60]\n\t"
  104325. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104326. "lsl r6, r8, #16\n\t"
  104327. "lsl r7, r9, #16\n\t"
  104328. "lsr r6, r6, #16\n\t"
  104329. "lsr r7, r7, #16\n\t"
  104330. "mul r7, r6, r7\n\t"
  104331. "adds r3, r3, r7\n\t"
  104332. "adcs r4, r4, #0\n\t"
  104333. "adc r5, r5, #0\n\t"
  104334. "lsr r7, r9, #16\n\t"
  104335. "mul r6, r7, r6\n\t"
  104336. "lsr r7, r6, #16\n\t"
  104337. "lsl r6, r6, #16\n\t"
  104338. "adds r3, r3, r6\n\t"
  104339. "adcs r4, r4, r7\n\t"
  104340. "adc r5, r5, #0\n\t"
  104341. "lsr r6, r8, #16\n\t"
  104342. "lsr r7, r9, #16\n\t"
  104343. "mul r7, r6, r7\n\t"
  104344. "adds r4, r4, r7\n\t"
  104345. "adc r5, r5, #0\n\t"
  104346. "lsl r7, r9, #16\n\t"
  104347. "lsr r7, r7, #16\n\t"
  104348. "mul r6, r7, r6\n\t"
  104349. "lsr r7, r6, #16\n\t"
  104350. "lsl r6, r6, #16\n\t"
  104351. "adds r3, r3, r6\n\t"
  104352. "adcs r4, r4, r7\n\t"
  104353. "adc r5, r5, #0\n\t"
  104354. #else
  104355. "umull r6, r7, r8, r9\n\t"
  104356. "adds r3, r3, r6\n\t"
  104357. "adcs r4, r4, r7\n\t"
  104358. "adc r5, r5, #0\n\t"
  104359. #endif
  104360. /* A[7] * B[14] */
  104361. "ldr r8, [%[a], #28]\n\t"
  104362. "ldr r9, [%[b], #56]\n\t"
  104363. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104364. "lsl r6, r8, #16\n\t"
  104365. "lsl r7, r9, #16\n\t"
  104366. "lsr r6, r6, #16\n\t"
  104367. "lsr r7, r7, #16\n\t"
  104368. "mul r7, r6, r7\n\t"
  104369. "adds r3, r3, r7\n\t"
  104370. "adcs r4, r4, #0\n\t"
  104371. "adc r5, r5, #0\n\t"
  104372. "lsr r7, r9, #16\n\t"
  104373. "mul r6, r7, r6\n\t"
  104374. "lsr r7, r6, #16\n\t"
  104375. "lsl r6, r6, #16\n\t"
  104376. "adds r3, r3, r6\n\t"
  104377. "adcs r4, r4, r7\n\t"
  104378. "adc r5, r5, #0\n\t"
  104379. "lsr r6, r8, #16\n\t"
  104380. "lsr r7, r9, #16\n\t"
  104381. "mul r7, r6, r7\n\t"
  104382. "adds r4, r4, r7\n\t"
  104383. "adc r5, r5, #0\n\t"
  104384. "lsl r7, r9, #16\n\t"
  104385. "lsr r7, r7, #16\n\t"
  104386. "mul r6, r7, r6\n\t"
  104387. "lsr r7, r6, #16\n\t"
  104388. "lsl r6, r6, #16\n\t"
  104389. "adds r3, r3, r6\n\t"
  104390. "adcs r4, r4, r7\n\t"
  104391. "adc r5, r5, #0\n\t"
  104392. #else
  104393. "umull r6, r7, r8, r9\n\t"
  104394. "adds r3, r3, r6\n\t"
  104395. "adcs r4, r4, r7\n\t"
  104396. "adc r5, r5, #0\n\t"
  104397. #endif
  104398. /* A[8] * B[13] */
  104399. "ldr r8, [%[a], #32]\n\t"
  104400. "ldr r9, [%[b], #52]\n\t"
  104401. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104402. "lsl r6, r8, #16\n\t"
  104403. "lsl r7, r9, #16\n\t"
  104404. "lsr r6, r6, #16\n\t"
  104405. "lsr r7, r7, #16\n\t"
  104406. "mul r7, r6, r7\n\t"
  104407. "adds r3, r3, r7\n\t"
  104408. "adcs r4, r4, #0\n\t"
  104409. "adc r5, r5, #0\n\t"
  104410. "lsr r7, r9, #16\n\t"
  104411. "mul r6, r7, r6\n\t"
  104412. "lsr r7, r6, #16\n\t"
  104413. "lsl r6, r6, #16\n\t"
  104414. "adds r3, r3, r6\n\t"
  104415. "adcs r4, r4, r7\n\t"
  104416. "adc r5, r5, #0\n\t"
  104417. "lsr r6, r8, #16\n\t"
  104418. "lsr r7, r9, #16\n\t"
  104419. "mul r7, r6, r7\n\t"
  104420. "adds r4, r4, r7\n\t"
  104421. "adc r5, r5, #0\n\t"
  104422. "lsl r7, r9, #16\n\t"
  104423. "lsr r7, r7, #16\n\t"
  104424. "mul r6, r7, r6\n\t"
  104425. "lsr r7, r6, #16\n\t"
  104426. "lsl r6, r6, #16\n\t"
  104427. "adds r3, r3, r6\n\t"
  104428. "adcs r4, r4, r7\n\t"
  104429. "adc r5, r5, #0\n\t"
  104430. #else
  104431. "umull r6, r7, r8, r9\n\t"
  104432. "adds r3, r3, r6\n\t"
  104433. "adcs r4, r4, r7\n\t"
  104434. "adc r5, r5, #0\n\t"
  104435. #endif
  104436. /* A[9] * B[12] */
  104437. "ldr r8, [%[a], #36]\n\t"
  104438. "ldr r9, [%[b], #48]\n\t"
  104439. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104440. "lsl r6, r8, #16\n\t"
  104441. "lsl r7, r9, #16\n\t"
  104442. "lsr r6, r6, #16\n\t"
  104443. "lsr r7, r7, #16\n\t"
  104444. "mul r7, r6, r7\n\t"
  104445. "adds r3, r3, r7\n\t"
  104446. "adcs r4, r4, #0\n\t"
  104447. "adc r5, r5, #0\n\t"
  104448. "lsr r7, r9, #16\n\t"
  104449. "mul r6, r7, r6\n\t"
  104450. "lsr r7, r6, #16\n\t"
  104451. "lsl r6, r6, #16\n\t"
  104452. "adds r3, r3, r6\n\t"
  104453. "adcs r4, r4, r7\n\t"
  104454. "adc r5, r5, #0\n\t"
  104455. "lsr r6, r8, #16\n\t"
  104456. "lsr r7, r9, #16\n\t"
  104457. "mul r7, r6, r7\n\t"
  104458. "adds r4, r4, r7\n\t"
  104459. "adc r5, r5, #0\n\t"
  104460. "lsl r7, r9, #16\n\t"
  104461. "lsr r7, r7, #16\n\t"
  104462. "mul r6, r7, r6\n\t"
  104463. "lsr r7, r6, #16\n\t"
  104464. "lsl r6, r6, #16\n\t"
  104465. "adds r3, r3, r6\n\t"
  104466. "adcs r4, r4, r7\n\t"
  104467. "adc r5, r5, #0\n\t"
  104468. #else
  104469. "umull r6, r7, r8, r9\n\t"
  104470. "adds r3, r3, r6\n\t"
  104471. "adcs r4, r4, r7\n\t"
  104472. "adc r5, r5, #0\n\t"
  104473. #endif
  104474. /* A[10] * B[11] */
  104475. "ldr r9, [%[b], #44]\n\t"
  104476. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104477. "lsl r6, r11, #16\n\t"
  104478. "lsl r7, r9, #16\n\t"
  104479. "lsr r6, r6, #16\n\t"
  104480. "lsr r7, r7, #16\n\t"
  104481. "mul r7, r6, r7\n\t"
  104482. "adds r3, r3, r7\n\t"
  104483. "adcs r4, r4, #0\n\t"
  104484. "adc r5, r5, #0\n\t"
  104485. "lsr r7, r9, #16\n\t"
  104486. "mul r6, r7, r6\n\t"
  104487. "lsr r7, r6, #16\n\t"
  104488. "lsl r6, r6, #16\n\t"
  104489. "adds r3, r3, r6\n\t"
  104490. "adcs r4, r4, r7\n\t"
  104491. "adc r5, r5, #0\n\t"
  104492. "lsr r6, r11, #16\n\t"
  104493. "lsr r7, r9, #16\n\t"
  104494. "mul r7, r6, r7\n\t"
  104495. "adds r4, r4, r7\n\t"
  104496. "adc r5, r5, #0\n\t"
  104497. "lsl r7, r9, #16\n\t"
  104498. "lsr r7, r7, #16\n\t"
  104499. "mul r6, r7, r6\n\t"
  104500. "lsr r7, r6, #16\n\t"
  104501. "lsl r6, r6, #16\n\t"
  104502. "adds r3, r3, r6\n\t"
  104503. "adcs r4, r4, r7\n\t"
  104504. "adc r5, r5, #0\n\t"
  104505. #else
  104506. "umull r6, r7, r11, r9\n\t"
  104507. "adds r3, r3, r6\n\t"
  104508. "adcs r4, r4, r7\n\t"
  104509. "adc r5, r5, #0\n\t"
  104510. #endif
  104511. /* A[11] * B[10] */
  104512. "ldr r8, [%[a], #44]\n\t"
  104513. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104514. "lsl r6, r8, #16\n\t"
  104515. "lsl r7, r12, #16\n\t"
  104516. "lsr r6, r6, #16\n\t"
  104517. "lsr r7, r7, #16\n\t"
  104518. "mul r7, r6, r7\n\t"
  104519. "adds r3, r3, r7\n\t"
  104520. "adcs r4, r4, #0\n\t"
  104521. "adc r5, r5, #0\n\t"
  104522. "lsr r7, r12, #16\n\t"
  104523. "mul r6, r7, r6\n\t"
  104524. "lsr r7, r6, #16\n\t"
  104525. "lsl r6, r6, #16\n\t"
  104526. "adds r3, r3, r6\n\t"
  104527. "adcs r4, r4, r7\n\t"
  104528. "adc r5, r5, #0\n\t"
  104529. "lsr r6, r8, #16\n\t"
  104530. "lsr r7, r12, #16\n\t"
  104531. "mul r7, r6, r7\n\t"
  104532. "adds r4, r4, r7\n\t"
  104533. "adc r5, r5, #0\n\t"
  104534. "lsl r7, r12, #16\n\t"
  104535. "lsr r7, r7, #16\n\t"
  104536. "mul r6, r7, r6\n\t"
  104537. "lsr r7, r6, #16\n\t"
  104538. "lsl r6, r6, #16\n\t"
  104539. "adds r3, r3, r6\n\t"
  104540. "adcs r4, r4, r7\n\t"
  104541. "adc r5, r5, #0\n\t"
  104542. #else
  104543. "umull r6, r7, r8, r12\n\t"
  104544. "adds r3, r3, r6\n\t"
  104545. "adcs r4, r4, r7\n\t"
  104546. "adc r5, r5, #0\n\t"
  104547. #endif
  104548. /* A[12] * B[9] */
  104549. "ldr r8, [%[a], #48]\n\t"
  104550. "ldr r9, [%[b], #36]\n\t"
  104551. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104552. "lsl r6, r8, #16\n\t"
  104553. "lsl r7, r9, #16\n\t"
  104554. "lsr r6, r6, #16\n\t"
  104555. "lsr r7, r7, #16\n\t"
  104556. "mul r7, r6, r7\n\t"
  104557. "adds r3, r3, r7\n\t"
  104558. "adcs r4, r4, #0\n\t"
  104559. "adc r5, r5, #0\n\t"
  104560. "lsr r7, r9, #16\n\t"
  104561. "mul r6, r7, r6\n\t"
  104562. "lsr r7, r6, #16\n\t"
  104563. "lsl r6, r6, #16\n\t"
  104564. "adds r3, r3, r6\n\t"
  104565. "adcs r4, r4, r7\n\t"
  104566. "adc r5, r5, #0\n\t"
  104567. "lsr r6, r8, #16\n\t"
  104568. "lsr r7, r9, #16\n\t"
  104569. "mul r7, r6, r7\n\t"
  104570. "adds r4, r4, r7\n\t"
  104571. "adc r5, r5, #0\n\t"
  104572. "lsl r7, r9, #16\n\t"
  104573. "lsr r7, r7, #16\n\t"
  104574. "mul r6, r7, r6\n\t"
  104575. "lsr r7, r6, #16\n\t"
  104576. "lsl r6, r6, #16\n\t"
  104577. "adds r3, r3, r6\n\t"
  104578. "adcs r4, r4, r7\n\t"
  104579. "adc r5, r5, #0\n\t"
  104580. #else
  104581. "umull r6, r7, r8, r9\n\t"
  104582. "adds r3, r3, r6\n\t"
  104583. "adcs r4, r4, r7\n\t"
  104584. "adc r5, r5, #0\n\t"
  104585. #endif
  104586. /* A[13] * B[8] */
  104587. "ldr r8, [%[a], #52]\n\t"
  104588. "ldr r9, [%[b], #32]\n\t"
  104589. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104590. "lsl r6, r8, #16\n\t"
  104591. "lsl r7, r9, #16\n\t"
  104592. "lsr r6, r6, #16\n\t"
  104593. "lsr r7, r7, #16\n\t"
  104594. "mul r7, r6, r7\n\t"
  104595. "adds r3, r3, r7\n\t"
  104596. "adcs r4, r4, #0\n\t"
  104597. "adc r5, r5, #0\n\t"
  104598. "lsr r7, r9, #16\n\t"
  104599. "mul r6, r7, r6\n\t"
  104600. "lsr r7, r6, #16\n\t"
  104601. "lsl r6, r6, #16\n\t"
  104602. "adds r3, r3, r6\n\t"
  104603. "adcs r4, r4, r7\n\t"
  104604. "adc r5, r5, #0\n\t"
  104605. "lsr r6, r8, #16\n\t"
  104606. "lsr r7, r9, #16\n\t"
  104607. "mul r7, r6, r7\n\t"
  104608. "adds r4, r4, r7\n\t"
  104609. "adc r5, r5, #0\n\t"
  104610. "lsl r7, r9, #16\n\t"
  104611. "lsr r7, r7, #16\n\t"
  104612. "mul r6, r7, r6\n\t"
  104613. "lsr r7, r6, #16\n\t"
  104614. "lsl r6, r6, #16\n\t"
  104615. "adds r3, r3, r6\n\t"
  104616. "adcs r4, r4, r7\n\t"
  104617. "adc r5, r5, #0\n\t"
  104618. #else
  104619. "umull r6, r7, r8, r9\n\t"
  104620. "adds r3, r3, r6\n\t"
  104621. "adcs r4, r4, r7\n\t"
  104622. "adc r5, r5, #0\n\t"
  104623. #endif
  104624. /* A[14] * B[7] */
  104625. "ldr r8, [%[a], #56]\n\t"
  104626. "ldr r9, [%[b], #28]\n\t"
  104627. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104628. "lsl r6, r8, #16\n\t"
  104629. "lsl r7, r9, #16\n\t"
  104630. "lsr r6, r6, #16\n\t"
  104631. "lsr r7, r7, #16\n\t"
  104632. "mul r7, r6, r7\n\t"
  104633. "adds r3, r3, r7\n\t"
  104634. "adcs r4, r4, #0\n\t"
  104635. "adc r5, r5, #0\n\t"
  104636. "lsr r7, r9, #16\n\t"
  104637. "mul r6, r7, r6\n\t"
  104638. "lsr r7, r6, #16\n\t"
  104639. "lsl r6, r6, #16\n\t"
  104640. "adds r3, r3, r6\n\t"
  104641. "adcs r4, r4, r7\n\t"
  104642. "adc r5, r5, #0\n\t"
  104643. "lsr r6, r8, #16\n\t"
  104644. "lsr r7, r9, #16\n\t"
  104645. "mul r7, r6, r7\n\t"
  104646. "adds r4, r4, r7\n\t"
  104647. "adc r5, r5, #0\n\t"
  104648. "lsl r7, r9, #16\n\t"
  104649. "lsr r7, r7, #16\n\t"
  104650. "mul r6, r7, r6\n\t"
  104651. "lsr r7, r6, #16\n\t"
  104652. "lsl r6, r6, #16\n\t"
  104653. "adds r3, r3, r6\n\t"
  104654. "adcs r4, r4, r7\n\t"
  104655. "adc r5, r5, #0\n\t"
  104656. #else
  104657. "umull r6, r7, r8, r9\n\t"
  104658. "adds r3, r3, r6\n\t"
  104659. "adcs r4, r4, r7\n\t"
  104660. "adc r5, r5, #0\n\t"
  104661. #endif
  104662. /* A[15] * B[6] */
  104663. "ldr r8, [%[a], #60]\n\t"
  104664. "ldr r9, [%[b], #24]\n\t"
  104665. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104666. "lsl r6, r8, #16\n\t"
  104667. "lsl r7, r9, #16\n\t"
  104668. "lsr r6, r6, #16\n\t"
  104669. "lsr r7, r7, #16\n\t"
  104670. "mul r7, r6, r7\n\t"
  104671. "adds r3, r3, r7\n\t"
  104672. "adcs r4, r4, #0\n\t"
  104673. "adc r5, r5, #0\n\t"
  104674. "lsr r7, r9, #16\n\t"
  104675. "mul r6, r7, r6\n\t"
  104676. "lsr r7, r6, #16\n\t"
  104677. "lsl r6, r6, #16\n\t"
  104678. "adds r3, r3, r6\n\t"
  104679. "adcs r4, r4, r7\n\t"
  104680. "adc r5, r5, #0\n\t"
  104681. "lsr r6, r8, #16\n\t"
  104682. "lsr r7, r9, #16\n\t"
  104683. "mul r7, r6, r7\n\t"
  104684. "adds r4, r4, r7\n\t"
  104685. "adc r5, r5, #0\n\t"
  104686. "lsl r7, r9, #16\n\t"
  104687. "lsr r7, r7, #16\n\t"
  104688. "mul r6, r7, r6\n\t"
  104689. "lsr r7, r6, #16\n\t"
  104690. "lsl r6, r6, #16\n\t"
  104691. "adds r3, r3, r6\n\t"
  104692. "adcs r4, r4, r7\n\t"
  104693. "adc r5, r5, #0\n\t"
  104694. #else
  104695. "umull r6, r7, r8, r9\n\t"
  104696. "adds r3, r3, r6\n\t"
  104697. "adcs r4, r4, r7\n\t"
  104698. "adc r5, r5, #0\n\t"
  104699. #endif
  104700. /* A[16] * B[5] */
  104701. "ldr r8, [%[a], #64]\n\t"
  104702. "ldr r9, [%[b], #20]\n\t"
  104703. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104704. "lsl r6, r8, #16\n\t"
  104705. "lsl r7, r9, #16\n\t"
  104706. "lsr r6, r6, #16\n\t"
  104707. "lsr r7, r7, #16\n\t"
  104708. "mul r7, r6, r7\n\t"
  104709. "adds r3, r3, r7\n\t"
  104710. "adcs r4, r4, #0\n\t"
  104711. "adc r5, r5, #0\n\t"
  104712. "lsr r7, r9, #16\n\t"
  104713. "mul r6, r7, r6\n\t"
  104714. "lsr r7, r6, #16\n\t"
  104715. "lsl r6, r6, #16\n\t"
  104716. "adds r3, r3, r6\n\t"
  104717. "adcs r4, r4, r7\n\t"
  104718. "adc r5, r5, #0\n\t"
  104719. "lsr r6, r8, #16\n\t"
  104720. "lsr r7, r9, #16\n\t"
  104721. "mul r7, r6, r7\n\t"
  104722. "adds r4, r4, r7\n\t"
  104723. "adc r5, r5, #0\n\t"
  104724. "lsl r7, r9, #16\n\t"
  104725. "lsr r7, r7, #16\n\t"
  104726. "mul r6, r7, r6\n\t"
  104727. "lsr r7, r6, #16\n\t"
  104728. "lsl r6, r6, #16\n\t"
  104729. "adds r3, r3, r6\n\t"
  104730. "adcs r4, r4, r7\n\t"
  104731. "adc r5, r5, #0\n\t"
  104732. #else
  104733. "umull r6, r7, r8, r9\n\t"
  104734. "adds r3, r3, r6\n\t"
  104735. "adcs r4, r4, r7\n\t"
  104736. "adc r5, r5, #0\n\t"
  104737. #endif
  104738. "str r3, [%[r], #84]\n\t"
  104739. /* A[16] * B[6] */
  104740. "ldr r9, [%[b], #24]\n\t"
  104741. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104742. "lsl r6, r8, #16\n\t"
  104743. "lsl r7, r9, #16\n\t"
  104744. "lsr r6, r6, #16\n\t"
  104745. "lsr r7, r7, #16\n\t"
  104746. "mul r7, r6, r7\n\t"
  104747. "adds r4, r4, r7\n\t"
  104748. "adcs r5, r5, #0\n\t"
  104749. "mov r3, #0\n\t"
  104750. "adc r3, r3, #0\n\t"
  104751. "lsr r7, r9, #16\n\t"
  104752. "mul r6, r7, r6\n\t"
  104753. "lsr r7, r6, #16\n\t"
  104754. "lsl r6, r6, #16\n\t"
  104755. "adds r4, r4, r6\n\t"
  104756. "adcs r5, r5, r7\n\t"
  104757. "adc r3, r3, #0\n\t"
  104758. "lsr r6, r8, #16\n\t"
  104759. "lsr r7, r9, #16\n\t"
  104760. "mul r7, r6, r7\n\t"
  104761. "adds r5, r5, r7\n\t"
  104762. "adc r3, r3, #0\n\t"
  104763. "lsl r7, r9, #16\n\t"
  104764. "lsr r7, r7, #16\n\t"
  104765. "mul r6, r7, r6\n\t"
  104766. "lsr r7, r6, #16\n\t"
  104767. "lsl r6, r6, #16\n\t"
  104768. "adds r4, r4, r6\n\t"
  104769. "adcs r5, r5, r7\n\t"
  104770. "adc r3, r3, #0\n\t"
  104771. #else
  104772. "umull r6, r7, r8, r9\n\t"
  104773. "adds r4, r4, r6\n\t"
  104774. "adcs r5, r5, r7\n\t"
  104775. "mov r3, #0\n\t"
  104776. "adc r3, r3, #0\n\t"
  104777. #endif
  104778. /* A[15] * B[7] */
  104779. "ldr r8, [%[a], #60]\n\t"
  104780. "ldr r9, [%[b], #28]\n\t"
  104781. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104782. "lsl r6, r8, #16\n\t"
  104783. "lsl r7, r9, #16\n\t"
  104784. "lsr r6, r6, #16\n\t"
  104785. "lsr r7, r7, #16\n\t"
  104786. "mul r7, r6, r7\n\t"
  104787. "adds r4, r4, r7\n\t"
  104788. "adcs r5, r5, #0\n\t"
  104789. "adc r3, r3, #0\n\t"
  104790. "lsr r7, r9, #16\n\t"
  104791. "mul r6, r7, r6\n\t"
  104792. "lsr r7, r6, #16\n\t"
  104793. "lsl r6, r6, #16\n\t"
  104794. "adds r4, r4, r6\n\t"
  104795. "adcs r5, r5, r7\n\t"
  104796. "adc r3, r3, #0\n\t"
  104797. "lsr r6, r8, #16\n\t"
  104798. "lsr r7, r9, #16\n\t"
  104799. "mul r7, r6, r7\n\t"
  104800. "adds r5, r5, r7\n\t"
  104801. "adc r3, r3, #0\n\t"
  104802. "lsl r7, r9, #16\n\t"
  104803. "lsr r7, r7, #16\n\t"
  104804. "mul r6, r7, r6\n\t"
  104805. "lsr r7, r6, #16\n\t"
  104806. "lsl r6, r6, #16\n\t"
  104807. "adds r4, r4, r6\n\t"
  104808. "adcs r5, r5, r7\n\t"
  104809. "adc r3, r3, #0\n\t"
  104810. #else
  104811. "umull r6, r7, r8, r9\n\t"
  104812. "adds r4, r4, r6\n\t"
  104813. "adcs r5, r5, r7\n\t"
  104814. "adc r3, r3, #0\n\t"
  104815. #endif
  104816. /* A[14] * B[8] */
  104817. "ldr r8, [%[a], #56]\n\t"
  104818. "ldr r9, [%[b], #32]\n\t"
  104819. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104820. "lsl r6, r8, #16\n\t"
  104821. "lsl r7, r9, #16\n\t"
  104822. "lsr r6, r6, #16\n\t"
  104823. "lsr r7, r7, #16\n\t"
  104824. "mul r7, r6, r7\n\t"
  104825. "adds r4, r4, r7\n\t"
  104826. "adcs r5, r5, #0\n\t"
  104827. "adc r3, r3, #0\n\t"
  104828. "lsr r7, r9, #16\n\t"
  104829. "mul r6, r7, r6\n\t"
  104830. "lsr r7, r6, #16\n\t"
  104831. "lsl r6, r6, #16\n\t"
  104832. "adds r4, r4, r6\n\t"
  104833. "adcs r5, r5, r7\n\t"
  104834. "adc r3, r3, #0\n\t"
  104835. "lsr r6, r8, #16\n\t"
  104836. "lsr r7, r9, #16\n\t"
  104837. "mul r7, r6, r7\n\t"
  104838. "adds r5, r5, r7\n\t"
  104839. "adc r3, r3, #0\n\t"
  104840. "lsl r7, r9, #16\n\t"
  104841. "lsr r7, r7, #16\n\t"
  104842. "mul r6, r7, r6\n\t"
  104843. "lsr r7, r6, #16\n\t"
  104844. "lsl r6, r6, #16\n\t"
  104845. "adds r4, r4, r6\n\t"
  104846. "adcs r5, r5, r7\n\t"
  104847. "adc r3, r3, #0\n\t"
  104848. #else
  104849. "umull r6, r7, r8, r9\n\t"
  104850. "adds r4, r4, r6\n\t"
  104851. "adcs r5, r5, r7\n\t"
  104852. "adc r3, r3, #0\n\t"
  104853. #endif
  104854. /* A[13] * B[9] */
  104855. "ldr r8, [%[a], #52]\n\t"
  104856. "ldr r9, [%[b], #36]\n\t"
  104857. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104858. "lsl r6, r8, #16\n\t"
  104859. "lsl r7, r9, #16\n\t"
  104860. "lsr r6, r6, #16\n\t"
  104861. "lsr r7, r7, #16\n\t"
  104862. "mul r7, r6, r7\n\t"
  104863. "adds r4, r4, r7\n\t"
  104864. "adcs r5, r5, #0\n\t"
  104865. "adc r3, r3, #0\n\t"
  104866. "lsr r7, r9, #16\n\t"
  104867. "mul r6, r7, r6\n\t"
  104868. "lsr r7, r6, #16\n\t"
  104869. "lsl r6, r6, #16\n\t"
  104870. "adds r4, r4, r6\n\t"
  104871. "adcs r5, r5, r7\n\t"
  104872. "adc r3, r3, #0\n\t"
  104873. "lsr r6, r8, #16\n\t"
  104874. "lsr r7, r9, #16\n\t"
  104875. "mul r7, r6, r7\n\t"
  104876. "adds r5, r5, r7\n\t"
  104877. "adc r3, r3, #0\n\t"
  104878. "lsl r7, r9, #16\n\t"
  104879. "lsr r7, r7, #16\n\t"
  104880. "mul r6, r7, r6\n\t"
  104881. "lsr r7, r6, #16\n\t"
  104882. "lsl r6, r6, #16\n\t"
  104883. "adds r4, r4, r6\n\t"
  104884. "adcs r5, r5, r7\n\t"
  104885. "adc r3, r3, #0\n\t"
  104886. #else
  104887. "umull r6, r7, r8, r9\n\t"
  104888. "adds r4, r4, r6\n\t"
  104889. "adcs r5, r5, r7\n\t"
  104890. "adc r3, r3, #0\n\t"
  104891. #endif
  104892. /* A[12] * B[10] */
  104893. "ldr r8, [%[a], #48]\n\t"
  104894. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104895. "lsl r6, r8, #16\n\t"
  104896. "lsl r7, r12, #16\n\t"
  104897. "lsr r6, r6, #16\n\t"
  104898. "lsr r7, r7, #16\n\t"
  104899. "mul r7, r6, r7\n\t"
  104900. "adds r4, r4, r7\n\t"
  104901. "adcs r5, r5, #0\n\t"
  104902. "adc r3, r3, #0\n\t"
  104903. "lsr r7, r12, #16\n\t"
  104904. "mul r6, r7, r6\n\t"
  104905. "lsr r7, r6, #16\n\t"
  104906. "lsl r6, r6, #16\n\t"
  104907. "adds r4, r4, r6\n\t"
  104908. "adcs r5, r5, r7\n\t"
  104909. "adc r3, r3, #0\n\t"
  104910. "lsr r6, r8, #16\n\t"
  104911. "lsr r7, r12, #16\n\t"
  104912. "mul r7, r6, r7\n\t"
  104913. "adds r5, r5, r7\n\t"
  104914. "adc r3, r3, #0\n\t"
  104915. "lsl r7, r12, #16\n\t"
  104916. "lsr r7, r7, #16\n\t"
  104917. "mul r6, r7, r6\n\t"
  104918. "lsr r7, r6, #16\n\t"
  104919. "lsl r6, r6, #16\n\t"
  104920. "adds r4, r4, r6\n\t"
  104921. "adcs r5, r5, r7\n\t"
  104922. "adc r3, r3, #0\n\t"
  104923. #else
  104924. "umull r6, r7, r8, r12\n\t"
  104925. "adds r4, r4, r6\n\t"
  104926. "adcs r5, r5, r7\n\t"
  104927. "adc r3, r3, #0\n\t"
  104928. #endif
  104929. /* A[11] * B[11] */
  104930. "ldr r11, [%[a], #44]\n\t"
  104931. "ldr r12, [%[b], #44]\n\t"
  104932. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104933. "lsl r6, r11, #16\n\t"
  104934. "lsl r7, r12, #16\n\t"
  104935. "lsr r6, r6, #16\n\t"
  104936. "lsr r7, r7, #16\n\t"
  104937. "mul r7, r6, r7\n\t"
  104938. "adds r4, r4, r7\n\t"
  104939. "adcs r5, r5, #0\n\t"
  104940. "adc r3, r3, #0\n\t"
  104941. "lsr r7, r12, #16\n\t"
  104942. "mul r6, r7, r6\n\t"
  104943. "lsr r7, r6, #16\n\t"
  104944. "lsl r6, r6, #16\n\t"
  104945. "adds r4, r4, r6\n\t"
  104946. "adcs r5, r5, r7\n\t"
  104947. "adc r3, r3, #0\n\t"
  104948. "lsr r6, r11, #16\n\t"
  104949. "lsr r7, r12, #16\n\t"
  104950. "mul r7, r6, r7\n\t"
  104951. "adds r5, r5, r7\n\t"
  104952. "adc r3, r3, #0\n\t"
  104953. "lsl r7, r12, #16\n\t"
  104954. "lsr r7, r7, #16\n\t"
  104955. "mul r6, r7, r6\n\t"
  104956. "lsr r7, r6, #16\n\t"
  104957. "lsl r6, r6, #16\n\t"
  104958. "adds r4, r4, r6\n\t"
  104959. "adcs r5, r5, r7\n\t"
  104960. "adc r3, r3, #0\n\t"
  104961. #else
  104962. "umull r6, r7, r11, r12\n\t"
  104963. "adds r4, r4, r6\n\t"
  104964. "adcs r5, r5, r7\n\t"
  104965. "adc r3, r3, #0\n\t"
  104966. #endif
  104967. /* A[10] * B[12] */
  104968. "ldr r8, [%[a], #40]\n\t"
  104969. "ldr r9, [%[b], #48]\n\t"
  104970. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  104971. "lsl r6, r8, #16\n\t"
  104972. "lsl r7, r9, #16\n\t"
  104973. "lsr r6, r6, #16\n\t"
  104974. "lsr r7, r7, #16\n\t"
  104975. "mul r7, r6, r7\n\t"
  104976. "adds r4, r4, r7\n\t"
  104977. "adcs r5, r5, #0\n\t"
  104978. "adc r3, r3, #0\n\t"
  104979. "lsr r7, r9, #16\n\t"
  104980. "mul r6, r7, r6\n\t"
  104981. "lsr r7, r6, #16\n\t"
  104982. "lsl r6, r6, #16\n\t"
  104983. "adds r4, r4, r6\n\t"
  104984. "adcs r5, r5, r7\n\t"
  104985. "adc r3, r3, #0\n\t"
  104986. "lsr r6, r8, #16\n\t"
  104987. "lsr r7, r9, #16\n\t"
  104988. "mul r7, r6, r7\n\t"
  104989. "adds r5, r5, r7\n\t"
  104990. "adc r3, r3, #0\n\t"
  104991. "lsl r7, r9, #16\n\t"
  104992. "lsr r7, r7, #16\n\t"
  104993. "mul r6, r7, r6\n\t"
  104994. "lsr r7, r6, #16\n\t"
  104995. "lsl r6, r6, #16\n\t"
  104996. "adds r4, r4, r6\n\t"
  104997. "adcs r5, r5, r7\n\t"
  104998. "adc r3, r3, #0\n\t"
  104999. #else
  105000. "umull r6, r7, r8, r9\n\t"
  105001. "adds r4, r4, r6\n\t"
  105002. "adcs r5, r5, r7\n\t"
  105003. "adc r3, r3, #0\n\t"
  105004. #endif
  105005. /* A[9] * B[13] */
  105006. "ldr r8, [%[a], #36]\n\t"
  105007. "ldr r9, [%[b], #52]\n\t"
  105008. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105009. "lsl r6, r8, #16\n\t"
  105010. "lsl r7, r9, #16\n\t"
  105011. "lsr r6, r6, #16\n\t"
  105012. "lsr r7, r7, #16\n\t"
  105013. "mul r7, r6, r7\n\t"
  105014. "adds r4, r4, r7\n\t"
  105015. "adcs r5, r5, #0\n\t"
  105016. "adc r3, r3, #0\n\t"
  105017. "lsr r7, r9, #16\n\t"
  105018. "mul r6, r7, r6\n\t"
  105019. "lsr r7, r6, #16\n\t"
  105020. "lsl r6, r6, #16\n\t"
  105021. "adds r4, r4, r6\n\t"
  105022. "adcs r5, r5, r7\n\t"
  105023. "adc r3, r3, #0\n\t"
  105024. "lsr r6, r8, #16\n\t"
  105025. "lsr r7, r9, #16\n\t"
  105026. "mul r7, r6, r7\n\t"
  105027. "adds r5, r5, r7\n\t"
  105028. "adc r3, r3, #0\n\t"
  105029. "lsl r7, r9, #16\n\t"
  105030. "lsr r7, r7, #16\n\t"
  105031. "mul r6, r7, r6\n\t"
  105032. "lsr r7, r6, #16\n\t"
  105033. "lsl r6, r6, #16\n\t"
  105034. "adds r4, r4, r6\n\t"
  105035. "adcs r5, r5, r7\n\t"
  105036. "adc r3, r3, #0\n\t"
  105037. #else
  105038. "umull r6, r7, r8, r9\n\t"
  105039. "adds r4, r4, r6\n\t"
  105040. "adcs r5, r5, r7\n\t"
  105041. "adc r3, r3, #0\n\t"
  105042. #endif
  105043. /* A[8] * B[14] */
  105044. "ldr r8, [%[a], #32]\n\t"
  105045. "ldr r9, [%[b], #56]\n\t"
  105046. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105047. "lsl r6, r8, #16\n\t"
  105048. "lsl r7, r9, #16\n\t"
  105049. "lsr r6, r6, #16\n\t"
  105050. "lsr r7, r7, #16\n\t"
  105051. "mul r7, r6, r7\n\t"
  105052. "adds r4, r4, r7\n\t"
  105053. "adcs r5, r5, #0\n\t"
  105054. "adc r3, r3, #0\n\t"
  105055. "lsr r7, r9, #16\n\t"
  105056. "mul r6, r7, r6\n\t"
  105057. "lsr r7, r6, #16\n\t"
  105058. "lsl r6, r6, #16\n\t"
  105059. "adds r4, r4, r6\n\t"
  105060. "adcs r5, r5, r7\n\t"
  105061. "adc r3, r3, #0\n\t"
  105062. "lsr r6, r8, #16\n\t"
  105063. "lsr r7, r9, #16\n\t"
  105064. "mul r7, r6, r7\n\t"
  105065. "adds r5, r5, r7\n\t"
  105066. "adc r3, r3, #0\n\t"
  105067. "lsl r7, r9, #16\n\t"
  105068. "lsr r7, r7, #16\n\t"
  105069. "mul r6, r7, r6\n\t"
  105070. "lsr r7, r6, #16\n\t"
  105071. "lsl r6, r6, #16\n\t"
  105072. "adds r4, r4, r6\n\t"
  105073. "adcs r5, r5, r7\n\t"
  105074. "adc r3, r3, #0\n\t"
  105075. #else
  105076. "umull r6, r7, r8, r9\n\t"
  105077. "adds r4, r4, r6\n\t"
  105078. "adcs r5, r5, r7\n\t"
  105079. "adc r3, r3, #0\n\t"
  105080. #endif
  105081. /* A[7] * B[15] */
  105082. "ldr r8, [%[a], #28]\n\t"
  105083. "ldr r9, [%[b], #60]\n\t"
  105084. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105085. "lsl r6, r8, #16\n\t"
  105086. "lsl r7, r9, #16\n\t"
  105087. "lsr r6, r6, #16\n\t"
  105088. "lsr r7, r7, #16\n\t"
  105089. "mul r7, r6, r7\n\t"
  105090. "adds r4, r4, r7\n\t"
  105091. "adcs r5, r5, #0\n\t"
  105092. "adc r3, r3, #0\n\t"
  105093. "lsr r7, r9, #16\n\t"
  105094. "mul r6, r7, r6\n\t"
  105095. "lsr r7, r6, #16\n\t"
  105096. "lsl r6, r6, #16\n\t"
  105097. "adds r4, r4, r6\n\t"
  105098. "adcs r5, r5, r7\n\t"
  105099. "adc r3, r3, #0\n\t"
  105100. "lsr r6, r8, #16\n\t"
  105101. "lsr r7, r9, #16\n\t"
  105102. "mul r7, r6, r7\n\t"
  105103. "adds r5, r5, r7\n\t"
  105104. "adc r3, r3, #0\n\t"
  105105. "lsl r7, r9, #16\n\t"
  105106. "lsr r7, r7, #16\n\t"
  105107. "mul r6, r7, r6\n\t"
  105108. "lsr r7, r6, #16\n\t"
  105109. "lsl r6, r6, #16\n\t"
  105110. "adds r4, r4, r6\n\t"
  105111. "adcs r5, r5, r7\n\t"
  105112. "adc r3, r3, #0\n\t"
  105113. #else
  105114. "umull r6, r7, r8, r9\n\t"
  105115. "adds r4, r4, r6\n\t"
  105116. "adcs r5, r5, r7\n\t"
  105117. "adc r3, r3, #0\n\t"
  105118. #endif
  105119. /* A[6] * B[16] */
  105120. "ldr r8, [%[a], #24]\n\t"
  105121. "ldr r9, [%[b], #64]\n\t"
  105122. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105123. "lsl r6, r8, #16\n\t"
  105124. "lsl r7, r9, #16\n\t"
  105125. "lsr r6, r6, #16\n\t"
  105126. "lsr r7, r7, #16\n\t"
  105127. "mul r7, r6, r7\n\t"
  105128. "adds r4, r4, r7\n\t"
  105129. "adcs r5, r5, #0\n\t"
  105130. "adc r3, r3, #0\n\t"
  105131. "lsr r7, r9, #16\n\t"
  105132. "mul r6, r7, r6\n\t"
  105133. "lsr r7, r6, #16\n\t"
  105134. "lsl r6, r6, #16\n\t"
  105135. "adds r4, r4, r6\n\t"
  105136. "adcs r5, r5, r7\n\t"
  105137. "adc r3, r3, #0\n\t"
  105138. "lsr r6, r8, #16\n\t"
  105139. "lsr r7, r9, #16\n\t"
  105140. "mul r7, r6, r7\n\t"
  105141. "adds r5, r5, r7\n\t"
  105142. "adc r3, r3, #0\n\t"
  105143. "lsl r7, r9, #16\n\t"
  105144. "lsr r7, r7, #16\n\t"
  105145. "mul r6, r7, r6\n\t"
  105146. "lsr r7, r6, #16\n\t"
  105147. "lsl r6, r6, #16\n\t"
  105148. "adds r4, r4, r6\n\t"
  105149. "adcs r5, r5, r7\n\t"
  105150. "adc r3, r3, #0\n\t"
  105151. #else
  105152. "umull r6, r7, r8, r9\n\t"
  105153. "adds r4, r4, r6\n\t"
  105154. "adcs r5, r5, r7\n\t"
  105155. "adc r3, r3, #0\n\t"
  105156. #endif
  105157. "str r4, [%[r], #88]\n\t"
  105158. /* A[7] * B[16] */
  105159. "ldr r8, [%[a], #28]\n\t"
  105160. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105161. "lsl r6, r8, #16\n\t"
  105162. "lsl r7, r9, #16\n\t"
  105163. "lsr r6, r6, #16\n\t"
  105164. "lsr r7, r7, #16\n\t"
  105165. "mul r7, r6, r7\n\t"
  105166. "adds r5, r5, r7\n\t"
  105167. "adcs r3, r3, #0\n\t"
  105168. "mov r4, #0\n\t"
  105169. "adc r4, r4, #0\n\t"
  105170. "lsr r7, r9, #16\n\t"
  105171. "mul r6, r7, r6\n\t"
  105172. "lsr r7, r6, #16\n\t"
  105173. "lsl r6, r6, #16\n\t"
  105174. "adds r5, r5, r6\n\t"
  105175. "adcs r3, r3, r7\n\t"
  105176. "adc r4, r4, #0\n\t"
  105177. "lsr r6, r8, #16\n\t"
  105178. "lsr r7, r9, #16\n\t"
  105179. "mul r7, r6, r7\n\t"
  105180. "adds r3, r3, r7\n\t"
  105181. "adc r4, r4, #0\n\t"
  105182. "lsl r7, r9, #16\n\t"
  105183. "lsr r7, r7, #16\n\t"
  105184. "mul r6, r7, r6\n\t"
  105185. "lsr r7, r6, #16\n\t"
  105186. "lsl r6, r6, #16\n\t"
  105187. "adds r5, r5, r6\n\t"
  105188. "adcs r3, r3, r7\n\t"
  105189. "adc r4, r4, #0\n\t"
  105190. #else
  105191. "umull r6, r7, r8, r9\n\t"
  105192. "adds r5, r5, r6\n\t"
  105193. "adcs r3, r3, r7\n\t"
  105194. "mov r4, #0\n\t"
  105195. "adc r4, r4, #0\n\t"
  105196. #endif
  105197. /* A[8] * B[15] */
  105198. "ldr r8, [%[a], #32]\n\t"
  105199. "ldr r9, [%[b], #60]\n\t"
  105200. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105201. "lsl r6, r8, #16\n\t"
  105202. "lsl r7, r9, #16\n\t"
  105203. "lsr r6, r6, #16\n\t"
  105204. "lsr r7, r7, #16\n\t"
  105205. "mul r7, r6, r7\n\t"
  105206. "adds r5, r5, r7\n\t"
  105207. "adcs r3, r3, #0\n\t"
  105208. "adc r4, r4, #0\n\t"
  105209. "lsr r7, r9, #16\n\t"
  105210. "mul r6, r7, r6\n\t"
  105211. "lsr r7, r6, #16\n\t"
  105212. "lsl r6, r6, #16\n\t"
  105213. "adds r5, r5, r6\n\t"
  105214. "adcs r3, r3, r7\n\t"
  105215. "adc r4, r4, #0\n\t"
  105216. "lsr r6, r8, #16\n\t"
  105217. "lsr r7, r9, #16\n\t"
  105218. "mul r7, r6, r7\n\t"
  105219. "adds r3, r3, r7\n\t"
  105220. "adc r4, r4, #0\n\t"
  105221. "lsl r7, r9, #16\n\t"
  105222. "lsr r7, r7, #16\n\t"
  105223. "mul r6, r7, r6\n\t"
  105224. "lsr r7, r6, #16\n\t"
  105225. "lsl r6, r6, #16\n\t"
  105226. "adds r5, r5, r6\n\t"
  105227. "adcs r3, r3, r7\n\t"
  105228. "adc r4, r4, #0\n\t"
  105229. #else
  105230. "umull r6, r7, r8, r9\n\t"
  105231. "adds r5, r5, r6\n\t"
  105232. "adcs r3, r3, r7\n\t"
  105233. "adc r4, r4, #0\n\t"
  105234. #endif
  105235. /* A[9] * B[14] */
  105236. "ldr r8, [%[a], #36]\n\t"
  105237. "ldr r9, [%[b], #56]\n\t"
  105238. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105239. "lsl r6, r8, #16\n\t"
  105240. "lsl r7, r9, #16\n\t"
  105241. "lsr r6, r6, #16\n\t"
  105242. "lsr r7, r7, #16\n\t"
  105243. "mul r7, r6, r7\n\t"
  105244. "adds r5, r5, r7\n\t"
  105245. "adcs r3, r3, #0\n\t"
  105246. "adc r4, r4, #0\n\t"
  105247. "lsr r7, r9, #16\n\t"
  105248. "mul r6, r7, r6\n\t"
  105249. "lsr r7, r6, #16\n\t"
  105250. "lsl r6, r6, #16\n\t"
  105251. "adds r5, r5, r6\n\t"
  105252. "adcs r3, r3, r7\n\t"
  105253. "adc r4, r4, #0\n\t"
  105254. "lsr r6, r8, #16\n\t"
  105255. "lsr r7, r9, #16\n\t"
  105256. "mul r7, r6, r7\n\t"
  105257. "adds r3, r3, r7\n\t"
  105258. "adc r4, r4, #0\n\t"
  105259. "lsl r7, r9, #16\n\t"
  105260. "lsr r7, r7, #16\n\t"
  105261. "mul r6, r7, r6\n\t"
  105262. "lsr r7, r6, #16\n\t"
  105263. "lsl r6, r6, #16\n\t"
  105264. "adds r5, r5, r6\n\t"
  105265. "adcs r3, r3, r7\n\t"
  105266. "adc r4, r4, #0\n\t"
  105267. #else
  105268. "umull r6, r7, r8, r9\n\t"
  105269. "adds r5, r5, r6\n\t"
  105270. "adcs r3, r3, r7\n\t"
  105271. "adc r4, r4, #0\n\t"
  105272. #endif
  105273. /* A[10] * B[13] */
  105274. "ldr r8, [%[a], #40]\n\t"
  105275. "ldr r9, [%[b], #52]\n\t"
  105276. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105277. "lsl r6, r8, #16\n\t"
  105278. "lsl r7, r9, #16\n\t"
  105279. "lsr r6, r6, #16\n\t"
  105280. "lsr r7, r7, #16\n\t"
  105281. "mul r7, r6, r7\n\t"
  105282. "adds r5, r5, r7\n\t"
  105283. "adcs r3, r3, #0\n\t"
  105284. "adc r4, r4, #0\n\t"
  105285. "lsr r7, r9, #16\n\t"
  105286. "mul r6, r7, r6\n\t"
  105287. "lsr r7, r6, #16\n\t"
  105288. "lsl r6, r6, #16\n\t"
  105289. "adds r5, r5, r6\n\t"
  105290. "adcs r3, r3, r7\n\t"
  105291. "adc r4, r4, #0\n\t"
  105292. "lsr r6, r8, #16\n\t"
  105293. "lsr r7, r9, #16\n\t"
  105294. "mul r7, r6, r7\n\t"
  105295. "adds r3, r3, r7\n\t"
  105296. "adc r4, r4, #0\n\t"
  105297. "lsl r7, r9, #16\n\t"
  105298. "lsr r7, r7, #16\n\t"
  105299. "mul r6, r7, r6\n\t"
  105300. "lsr r7, r6, #16\n\t"
  105301. "lsl r6, r6, #16\n\t"
  105302. "adds r5, r5, r6\n\t"
  105303. "adcs r3, r3, r7\n\t"
  105304. "adc r4, r4, #0\n\t"
  105305. #else
  105306. "umull r6, r7, r8, r9\n\t"
  105307. "adds r5, r5, r6\n\t"
  105308. "adcs r3, r3, r7\n\t"
  105309. "adc r4, r4, #0\n\t"
  105310. #endif
  105311. /* A[11] * B[12] */
  105312. "ldr r9, [%[b], #48]\n\t"
  105313. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105314. "lsl r6, r11, #16\n\t"
  105315. "lsl r7, r9, #16\n\t"
  105316. "lsr r6, r6, #16\n\t"
  105317. "lsr r7, r7, #16\n\t"
  105318. "mul r7, r6, r7\n\t"
  105319. "adds r5, r5, r7\n\t"
  105320. "adcs r3, r3, #0\n\t"
  105321. "adc r4, r4, #0\n\t"
  105322. "lsr r7, r9, #16\n\t"
  105323. "mul r6, r7, r6\n\t"
  105324. "lsr r7, r6, #16\n\t"
  105325. "lsl r6, r6, #16\n\t"
  105326. "adds r5, r5, r6\n\t"
  105327. "adcs r3, r3, r7\n\t"
  105328. "adc r4, r4, #0\n\t"
  105329. "lsr r6, r11, #16\n\t"
  105330. "lsr r7, r9, #16\n\t"
  105331. "mul r7, r6, r7\n\t"
  105332. "adds r3, r3, r7\n\t"
  105333. "adc r4, r4, #0\n\t"
  105334. "lsl r7, r9, #16\n\t"
  105335. "lsr r7, r7, #16\n\t"
  105336. "mul r6, r7, r6\n\t"
  105337. "lsr r7, r6, #16\n\t"
  105338. "lsl r6, r6, #16\n\t"
  105339. "adds r5, r5, r6\n\t"
  105340. "adcs r3, r3, r7\n\t"
  105341. "adc r4, r4, #0\n\t"
  105342. #else
  105343. "umull r6, r7, r11, r9\n\t"
  105344. "adds r5, r5, r6\n\t"
  105345. "adcs r3, r3, r7\n\t"
  105346. "adc r4, r4, #0\n\t"
  105347. #endif
  105348. /* A[12] * B[11] */
  105349. "ldr r8, [%[a], #48]\n\t"
  105350. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105351. "lsl r6, r8, #16\n\t"
  105352. "lsl r7, r12, #16\n\t"
  105353. "lsr r6, r6, #16\n\t"
  105354. "lsr r7, r7, #16\n\t"
  105355. "mul r7, r6, r7\n\t"
  105356. "adds r5, r5, r7\n\t"
  105357. "adcs r3, r3, #0\n\t"
  105358. "adc r4, r4, #0\n\t"
  105359. "lsr r7, r12, #16\n\t"
  105360. "mul r6, r7, r6\n\t"
  105361. "lsr r7, r6, #16\n\t"
  105362. "lsl r6, r6, #16\n\t"
  105363. "adds r5, r5, r6\n\t"
  105364. "adcs r3, r3, r7\n\t"
  105365. "adc r4, r4, #0\n\t"
  105366. "lsr r6, r8, #16\n\t"
  105367. "lsr r7, r12, #16\n\t"
  105368. "mul r7, r6, r7\n\t"
  105369. "adds r3, r3, r7\n\t"
  105370. "adc r4, r4, #0\n\t"
  105371. "lsl r7, r12, #16\n\t"
  105372. "lsr r7, r7, #16\n\t"
  105373. "mul r6, r7, r6\n\t"
  105374. "lsr r7, r6, #16\n\t"
  105375. "lsl r6, r6, #16\n\t"
  105376. "adds r5, r5, r6\n\t"
  105377. "adcs r3, r3, r7\n\t"
  105378. "adc r4, r4, #0\n\t"
  105379. #else
  105380. "umull r6, r7, r8, r12\n\t"
  105381. "adds r5, r5, r6\n\t"
  105382. "adcs r3, r3, r7\n\t"
  105383. "adc r4, r4, #0\n\t"
  105384. #endif
  105385. /* A[13] * B[10] */
  105386. "ldr r8, [%[a], #52]\n\t"
  105387. "ldr r9, [%[b], #40]\n\t"
  105388. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105389. "lsl r6, r8, #16\n\t"
  105390. "lsl r7, r9, #16\n\t"
  105391. "lsr r6, r6, #16\n\t"
  105392. "lsr r7, r7, #16\n\t"
  105393. "mul r7, r6, r7\n\t"
  105394. "adds r5, r5, r7\n\t"
  105395. "adcs r3, r3, #0\n\t"
  105396. "adc r4, r4, #0\n\t"
  105397. "lsr r7, r9, #16\n\t"
  105398. "mul r6, r7, r6\n\t"
  105399. "lsr r7, r6, #16\n\t"
  105400. "lsl r6, r6, #16\n\t"
  105401. "adds r5, r5, r6\n\t"
  105402. "adcs r3, r3, r7\n\t"
  105403. "adc r4, r4, #0\n\t"
  105404. "lsr r6, r8, #16\n\t"
  105405. "lsr r7, r9, #16\n\t"
  105406. "mul r7, r6, r7\n\t"
  105407. "adds r3, r3, r7\n\t"
  105408. "adc r4, r4, #0\n\t"
  105409. "lsl r7, r9, #16\n\t"
  105410. "lsr r7, r7, #16\n\t"
  105411. "mul r6, r7, r6\n\t"
  105412. "lsr r7, r6, #16\n\t"
  105413. "lsl r6, r6, #16\n\t"
  105414. "adds r5, r5, r6\n\t"
  105415. "adcs r3, r3, r7\n\t"
  105416. "adc r4, r4, #0\n\t"
  105417. #else
  105418. "umull r6, r7, r8, r9\n\t"
  105419. "adds r5, r5, r6\n\t"
  105420. "adcs r3, r3, r7\n\t"
  105421. "adc r4, r4, #0\n\t"
  105422. #endif
  105423. /* A[14] * B[9] */
  105424. "ldr r8, [%[a], #56]\n\t"
  105425. "ldr r9, [%[b], #36]\n\t"
  105426. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105427. "lsl r6, r8, #16\n\t"
  105428. "lsl r7, r9, #16\n\t"
  105429. "lsr r6, r6, #16\n\t"
  105430. "lsr r7, r7, #16\n\t"
  105431. "mul r7, r6, r7\n\t"
  105432. "adds r5, r5, r7\n\t"
  105433. "adcs r3, r3, #0\n\t"
  105434. "adc r4, r4, #0\n\t"
  105435. "lsr r7, r9, #16\n\t"
  105436. "mul r6, r7, r6\n\t"
  105437. "lsr r7, r6, #16\n\t"
  105438. "lsl r6, r6, #16\n\t"
  105439. "adds r5, r5, r6\n\t"
  105440. "adcs r3, r3, r7\n\t"
  105441. "adc r4, r4, #0\n\t"
  105442. "lsr r6, r8, #16\n\t"
  105443. "lsr r7, r9, #16\n\t"
  105444. "mul r7, r6, r7\n\t"
  105445. "adds r3, r3, r7\n\t"
  105446. "adc r4, r4, #0\n\t"
  105447. "lsl r7, r9, #16\n\t"
  105448. "lsr r7, r7, #16\n\t"
  105449. "mul r6, r7, r6\n\t"
  105450. "lsr r7, r6, #16\n\t"
  105451. "lsl r6, r6, #16\n\t"
  105452. "adds r5, r5, r6\n\t"
  105453. "adcs r3, r3, r7\n\t"
  105454. "adc r4, r4, #0\n\t"
  105455. #else
  105456. "umull r6, r7, r8, r9\n\t"
  105457. "adds r5, r5, r6\n\t"
  105458. "adcs r3, r3, r7\n\t"
  105459. "adc r4, r4, #0\n\t"
  105460. #endif
  105461. /* A[15] * B[8] */
  105462. "ldr r8, [%[a], #60]\n\t"
  105463. "ldr r9, [%[b], #32]\n\t"
  105464. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105465. "lsl r6, r8, #16\n\t"
  105466. "lsl r7, r9, #16\n\t"
  105467. "lsr r6, r6, #16\n\t"
  105468. "lsr r7, r7, #16\n\t"
  105469. "mul r7, r6, r7\n\t"
  105470. "adds r5, r5, r7\n\t"
  105471. "adcs r3, r3, #0\n\t"
  105472. "adc r4, r4, #0\n\t"
  105473. "lsr r7, r9, #16\n\t"
  105474. "mul r6, r7, r6\n\t"
  105475. "lsr r7, r6, #16\n\t"
  105476. "lsl r6, r6, #16\n\t"
  105477. "adds r5, r5, r6\n\t"
  105478. "adcs r3, r3, r7\n\t"
  105479. "adc r4, r4, #0\n\t"
  105480. "lsr r6, r8, #16\n\t"
  105481. "lsr r7, r9, #16\n\t"
  105482. "mul r7, r6, r7\n\t"
  105483. "adds r3, r3, r7\n\t"
  105484. "adc r4, r4, #0\n\t"
  105485. "lsl r7, r9, #16\n\t"
  105486. "lsr r7, r7, #16\n\t"
  105487. "mul r6, r7, r6\n\t"
  105488. "lsr r7, r6, #16\n\t"
  105489. "lsl r6, r6, #16\n\t"
  105490. "adds r5, r5, r6\n\t"
  105491. "adcs r3, r3, r7\n\t"
  105492. "adc r4, r4, #0\n\t"
  105493. #else
  105494. "umull r6, r7, r8, r9\n\t"
  105495. "adds r5, r5, r6\n\t"
  105496. "adcs r3, r3, r7\n\t"
  105497. "adc r4, r4, #0\n\t"
  105498. #endif
  105499. /* A[16] * B[7] */
  105500. "ldr r8, [%[a], #64]\n\t"
  105501. "ldr r9, [%[b], #28]\n\t"
  105502. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105503. "lsl r6, r8, #16\n\t"
  105504. "lsl r7, r9, #16\n\t"
  105505. "lsr r6, r6, #16\n\t"
  105506. "lsr r7, r7, #16\n\t"
  105507. "mul r7, r6, r7\n\t"
  105508. "adds r5, r5, r7\n\t"
  105509. "adcs r3, r3, #0\n\t"
  105510. "adc r4, r4, #0\n\t"
  105511. "lsr r7, r9, #16\n\t"
  105512. "mul r6, r7, r6\n\t"
  105513. "lsr r7, r6, #16\n\t"
  105514. "lsl r6, r6, #16\n\t"
  105515. "adds r5, r5, r6\n\t"
  105516. "adcs r3, r3, r7\n\t"
  105517. "adc r4, r4, #0\n\t"
  105518. "lsr r6, r8, #16\n\t"
  105519. "lsr r7, r9, #16\n\t"
  105520. "mul r7, r6, r7\n\t"
  105521. "adds r3, r3, r7\n\t"
  105522. "adc r4, r4, #0\n\t"
  105523. "lsl r7, r9, #16\n\t"
  105524. "lsr r7, r7, #16\n\t"
  105525. "mul r6, r7, r6\n\t"
  105526. "lsr r7, r6, #16\n\t"
  105527. "lsl r6, r6, #16\n\t"
  105528. "adds r5, r5, r6\n\t"
  105529. "adcs r3, r3, r7\n\t"
  105530. "adc r4, r4, #0\n\t"
  105531. #else
  105532. "umull r6, r7, r8, r9\n\t"
  105533. "adds r5, r5, r6\n\t"
  105534. "adcs r3, r3, r7\n\t"
  105535. "adc r4, r4, #0\n\t"
  105536. #endif
  105537. "str r5, [%[r], #92]\n\t"
  105538. /* A[16] * B[8] */
  105539. "ldr r9, [%[b], #32]\n\t"
  105540. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105541. "lsl r6, r8, #16\n\t"
  105542. "lsl r7, r9, #16\n\t"
  105543. "lsr r6, r6, #16\n\t"
  105544. "lsr r7, r7, #16\n\t"
  105545. "mul r7, r6, r7\n\t"
  105546. "adds r3, r3, r7\n\t"
  105547. "adcs r4, r4, #0\n\t"
  105548. "mov r5, #0\n\t"
  105549. "adc r5, r5, #0\n\t"
  105550. "lsr r7, r9, #16\n\t"
  105551. "mul r6, r7, r6\n\t"
  105552. "lsr r7, r6, #16\n\t"
  105553. "lsl r6, r6, #16\n\t"
  105554. "adds r3, r3, r6\n\t"
  105555. "adcs r4, r4, r7\n\t"
  105556. "adc r5, r5, #0\n\t"
  105557. "lsr r6, r8, #16\n\t"
  105558. "lsr r7, r9, #16\n\t"
  105559. "mul r7, r6, r7\n\t"
  105560. "adds r4, r4, r7\n\t"
  105561. "adc r5, r5, #0\n\t"
  105562. "lsl r7, r9, #16\n\t"
  105563. "lsr r7, r7, #16\n\t"
  105564. "mul r6, r7, r6\n\t"
  105565. "lsr r7, r6, #16\n\t"
  105566. "lsl r6, r6, #16\n\t"
  105567. "adds r3, r3, r6\n\t"
  105568. "adcs r4, r4, r7\n\t"
  105569. "adc r5, r5, #0\n\t"
  105570. #else
  105571. "umull r6, r7, r8, r9\n\t"
  105572. "adds r3, r3, r6\n\t"
  105573. "adcs r4, r4, r7\n\t"
  105574. "mov r5, #0\n\t"
  105575. "adc r5, r5, #0\n\t"
  105576. #endif
  105577. /* A[15] * B[9] */
  105578. "ldr r8, [%[a], #60]\n\t"
  105579. "ldr r9, [%[b], #36]\n\t"
  105580. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105581. "lsl r6, r8, #16\n\t"
  105582. "lsl r7, r9, #16\n\t"
  105583. "lsr r6, r6, #16\n\t"
  105584. "lsr r7, r7, #16\n\t"
  105585. "mul r7, r6, r7\n\t"
  105586. "adds r3, r3, r7\n\t"
  105587. "adcs r4, r4, #0\n\t"
  105588. "adc r5, r5, #0\n\t"
  105589. "lsr r7, r9, #16\n\t"
  105590. "mul r6, r7, r6\n\t"
  105591. "lsr r7, r6, #16\n\t"
  105592. "lsl r6, r6, #16\n\t"
  105593. "adds r3, r3, r6\n\t"
  105594. "adcs r4, r4, r7\n\t"
  105595. "adc r5, r5, #0\n\t"
  105596. "lsr r6, r8, #16\n\t"
  105597. "lsr r7, r9, #16\n\t"
  105598. "mul r7, r6, r7\n\t"
  105599. "adds r4, r4, r7\n\t"
  105600. "adc r5, r5, #0\n\t"
  105601. "lsl r7, r9, #16\n\t"
  105602. "lsr r7, r7, #16\n\t"
  105603. "mul r6, r7, r6\n\t"
  105604. "lsr r7, r6, #16\n\t"
  105605. "lsl r6, r6, #16\n\t"
  105606. "adds r3, r3, r6\n\t"
  105607. "adcs r4, r4, r7\n\t"
  105608. "adc r5, r5, #0\n\t"
  105609. #else
  105610. "umull r6, r7, r8, r9\n\t"
  105611. "adds r3, r3, r6\n\t"
  105612. "adcs r4, r4, r7\n\t"
  105613. "adc r5, r5, #0\n\t"
  105614. #endif
  105615. /* A[14] * B[10] */
  105616. "ldr r8, [%[a], #56]\n\t"
  105617. "ldr r9, [%[b], #40]\n\t"
  105618. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105619. "lsl r6, r8, #16\n\t"
  105620. "lsl r7, r9, #16\n\t"
  105621. "lsr r6, r6, #16\n\t"
  105622. "lsr r7, r7, #16\n\t"
  105623. "mul r7, r6, r7\n\t"
  105624. "adds r3, r3, r7\n\t"
  105625. "adcs r4, r4, #0\n\t"
  105626. "adc r5, r5, #0\n\t"
  105627. "lsr r7, r9, #16\n\t"
  105628. "mul r6, r7, r6\n\t"
  105629. "lsr r7, r6, #16\n\t"
  105630. "lsl r6, r6, #16\n\t"
  105631. "adds r3, r3, r6\n\t"
  105632. "adcs r4, r4, r7\n\t"
  105633. "adc r5, r5, #0\n\t"
  105634. "lsr r6, r8, #16\n\t"
  105635. "lsr r7, r9, #16\n\t"
  105636. "mul r7, r6, r7\n\t"
  105637. "adds r4, r4, r7\n\t"
  105638. "adc r5, r5, #0\n\t"
  105639. "lsl r7, r9, #16\n\t"
  105640. "lsr r7, r7, #16\n\t"
  105641. "mul r6, r7, r6\n\t"
  105642. "lsr r7, r6, #16\n\t"
  105643. "lsl r6, r6, #16\n\t"
  105644. "adds r3, r3, r6\n\t"
  105645. "adcs r4, r4, r7\n\t"
  105646. "adc r5, r5, #0\n\t"
  105647. #else
  105648. "umull r6, r7, r8, r9\n\t"
  105649. "adds r3, r3, r6\n\t"
  105650. "adcs r4, r4, r7\n\t"
  105651. "adc r5, r5, #0\n\t"
  105652. #endif
  105653. /* A[13] * B[11] */
  105654. "ldr r8, [%[a], #52]\n\t"
  105655. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105656. "lsl r6, r8, #16\n\t"
  105657. "lsl r7, r12, #16\n\t"
  105658. "lsr r6, r6, #16\n\t"
  105659. "lsr r7, r7, #16\n\t"
  105660. "mul r7, r6, r7\n\t"
  105661. "adds r3, r3, r7\n\t"
  105662. "adcs r4, r4, #0\n\t"
  105663. "adc r5, r5, #0\n\t"
  105664. "lsr r7, r12, #16\n\t"
  105665. "mul r6, r7, r6\n\t"
  105666. "lsr r7, r6, #16\n\t"
  105667. "lsl r6, r6, #16\n\t"
  105668. "adds r3, r3, r6\n\t"
  105669. "adcs r4, r4, r7\n\t"
  105670. "adc r5, r5, #0\n\t"
  105671. "lsr r6, r8, #16\n\t"
  105672. "lsr r7, r12, #16\n\t"
  105673. "mul r7, r6, r7\n\t"
  105674. "adds r4, r4, r7\n\t"
  105675. "adc r5, r5, #0\n\t"
  105676. "lsl r7, r12, #16\n\t"
  105677. "lsr r7, r7, #16\n\t"
  105678. "mul r6, r7, r6\n\t"
  105679. "lsr r7, r6, #16\n\t"
  105680. "lsl r6, r6, #16\n\t"
  105681. "adds r3, r3, r6\n\t"
  105682. "adcs r4, r4, r7\n\t"
  105683. "adc r5, r5, #0\n\t"
  105684. #else
  105685. "umull r6, r7, r8, r12\n\t"
  105686. "adds r3, r3, r6\n\t"
  105687. "adcs r4, r4, r7\n\t"
  105688. "adc r5, r5, #0\n\t"
  105689. #endif
  105690. /* A[12] * B[12] */
  105691. "ldr r11, [%[a], #48]\n\t"
  105692. "ldr r12, [%[b], #48]\n\t"
  105693. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105694. "lsl r6, r11, #16\n\t"
  105695. "lsl r7, r12, #16\n\t"
  105696. "lsr r6, r6, #16\n\t"
  105697. "lsr r7, r7, #16\n\t"
  105698. "mul r7, r6, r7\n\t"
  105699. "adds r3, r3, r7\n\t"
  105700. "adcs r4, r4, #0\n\t"
  105701. "adc r5, r5, #0\n\t"
  105702. "lsr r7, r12, #16\n\t"
  105703. "mul r6, r7, r6\n\t"
  105704. "lsr r7, r6, #16\n\t"
  105705. "lsl r6, r6, #16\n\t"
  105706. "adds r3, r3, r6\n\t"
  105707. "adcs r4, r4, r7\n\t"
  105708. "adc r5, r5, #0\n\t"
  105709. "lsr r6, r11, #16\n\t"
  105710. "lsr r7, r12, #16\n\t"
  105711. "mul r7, r6, r7\n\t"
  105712. "adds r4, r4, r7\n\t"
  105713. "adc r5, r5, #0\n\t"
  105714. "lsl r7, r12, #16\n\t"
  105715. "lsr r7, r7, #16\n\t"
  105716. "mul r6, r7, r6\n\t"
  105717. "lsr r7, r6, #16\n\t"
  105718. "lsl r6, r6, #16\n\t"
  105719. "adds r3, r3, r6\n\t"
  105720. "adcs r4, r4, r7\n\t"
  105721. "adc r5, r5, #0\n\t"
  105722. #else
  105723. "umull r6, r7, r11, r12\n\t"
  105724. "adds r3, r3, r6\n\t"
  105725. "adcs r4, r4, r7\n\t"
  105726. "adc r5, r5, #0\n\t"
  105727. #endif
  105728. /* A[11] * B[13] */
  105729. "ldr r8, [%[a], #44]\n\t"
  105730. "ldr r9, [%[b], #52]\n\t"
  105731. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105732. "lsl r6, r8, #16\n\t"
  105733. "lsl r7, r9, #16\n\t"
  105734. "lsr r6, r6, #16\n\t"
  105735. "lsr r7, r7, #16\n\t"
  105736. "mul r7, r6, r7\n\t"
  105737. "adds r3, r3, r7\n\t"
  105738. "adcs r4, r4, #0\n\t"
  105739. "adc r5, r5, #0\n\t"
  105740. "lsr r7, r9, #16\n\t"
  105741. "mul r6, r7, r6\n\t"
  105742. "lsr r7, r6, #16\n\t"
  105743. "lsl r6, r6, #16\n\t"
  105744. "adds r3, r3, r6\n\t"
  105745. "adcs r4, r4, r7\n\t"
  105746. "adc r5, r5, #0\n\t"
  105747. "lsr r6, r8, #16\n\t"
  105748. "lsr r7, r9, #16\n\t"
  105749. "mul r7, r6, r7\n\t"
  105750. "adds r4, r4, r7\n\t"
  105751. "adc r5, r5, #0\n\t"
  105752. "lsl r7, r9, #16\n\t"
  105753. "lsr r7, r7, #16\n\t"
  105754. "mul r6, r7, r6\n\t"
  105755. "lsr r7, r6, #16\n\t"
  105756. "lsl r6, r6, #16\n\t"
  105757. "adds r3, r3, r6\n\t"
  105758. "adcs r4, r4, r7\n\t"
  105759. "adc r5, r5, #0\n\t"
  105760. #else
  105761. "umull r6, r7, r8, r9\n\t"
  105762. "adds r3, r3, r6\n\t"
  105763. "adcs r4, r4, r7\n\t"
  105764. "adc r5, r5, #0\n\t"
  105765. #endif
  105766. /* A[10] * B[14] */
  105767. "ldr r8, [%[a], #40]\n\t"
  105768. "ldr r9, [%[b], #56]\n\t"
  105769. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105770. "lsl r6, r8, #16\n\t"
  105771. "lsl r7, r9, #16\n\t"
  105772. "lsr r6, r6, #16\n\t"
  105773. "lsr r7, r7, #16\n\t"
  105774. "mul r7, r6, r7\n\t"
  105775. "adds r3, r3, r7\n\t"
  105776. "adcs r4, r4, #0\n\t"
  105777. "adc r5, r5, #0\n\t"
  105778. "lsr r7, r9, #16\n\t"
  105779. "mul r6, r7, r6\n\t"
  105780. "lsr r7, r6, #16\n\t"
  105781. "lsl r6, r6, #16\n\t"
  105782. "adds r3, r3, r6\n\t"
  105783. "adcs r4, r4, r7\n\t"
  105784. "adc r5, r5, #0\n\t"
  105785. "lsr r6, r8, #16\n\t"
  105786. "lsr r7, r9, #16\n\t"
  105787. "mul r7, r6, r7\n\t"
  105788. "adds r4, r4, r7\n\t"
  105789. "adc r5, r5, #0\n\t"
  105790. "lsl r7, r9, #16\n\t"
  105791. "lsr r7, r7, #16\n\t"
  105792. "mul r6, r7, r6\n\t"
  105793. "lsr r7, r6, #16\n\t"
  105794. "lsl r6, r6, #16\n\t"
  105795. "adds r3, r3, r6\n\t"
  105796. "adcs r4, r4, r7\n\t"
  105797. "adc r5, r5, #0\n\t"
  105798. #else
  105799. "umull r6, r7, r8, r9\n\t"
  105800. "adds r3, r3, r6\n\t"
  105801. "adcs r4, r4, r7\n\t"
  105802. "adc r5, r5, #0\n\t"
  105803. #endif
  105804. /* A[9] * B[15] */
  105805. "ldr r8, [%[a], #36]\n\t"
  105806. "ldr r9, [%[b], #60]\n\t"
  105807. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105808. "lsl r6, r8, #16\n\t"
  105809. "lsl r7, r9, #16\n\t"
  105810. "lsr r6, r6, #16\n\t"
  105811. "lsr r7, r7, #16\n\t"
  105812. "mul r7, r6, r7\n\t"
  105813. "adds r3, r3, r7\n\t"
  105814. "adcs r4, r4, #0\n\t"
  105815. "adc r5, r5, #0\n\t"
  105816. "lsr r7, r9, #16\n\t"
  105817. "mul r6, r7, r6\n\t"
  105818. "lsr r7, r6, #16\n\t"
  105819. "lsl r6, r6, #16\n\t"
  105820. "adds r3, r3, r6\n\t"
  105821. "adcs r4, r4, r7\n\t"
  105822. "adc r5, r5, #0\n\t"
  105823. "lsr r6, r8, #16\n\t"
  105824. "lsr r7, r9, #16\n\t"
  105825. "mul r7, r6, r7\n\t"
  105826. "adds r4, r4, r7\n\t"
  105827. "adc r5, r5, #0\n\t"
  105828. "lsl r7, r9, #16\n\t"
  105829. "lsr r7, r7, #16\n\t"
  105830. "mul r6, r7, r6\n\t"
  105831. "lsr r7, r6, #16\n\t"
  105832. "lsl r6, r6, #16\n\t"
  105833. "adds r3, r3, r6\n\t"
  105834. "adcs r4, r4, r7\n\t"
  105835. "adc r5, r5, #0\n\t"
  105836. #else
  105837. "umull r6, r7, r8, r9\n\t"
  105838. "adds r3, r3, r6\n\t"
  105839. "adcs r4, r4, r7\n\t"
  105840. "adc r5, r5, #0\n\t"
  105841. #endif
  105842. /* A[8] * B[16] */
  105843. "ldr r8, [%[a], #32]\n\t"
  105844. "ldr r9, [%[b], #64]\n\t"
  105845. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105846. "lsl r6, r8, #16\n\t"
  105847. "lsl r7, r9, #16\n\t"
  105848. "lsr r6, r6, #16\n\t"
  105849. "lsr r7, r7, #16\n\t"
  105850. "mul r7, r6, r7\n\t"
  105851. "adds r3, r3, r7\n\t"
  105852. "adcs r4, r4, #0\n\t"
  105853. "adc r5, r5, #0\n\t"
  105854. "lsr r7, r9, #16\n\t"
  105855. "mul r6, r7, r6\n\t"
  105856. "lsr r7, r6, #16\n\t"
  105857. "lsl r6, r6, #16\n\t"
  105858. "adds r3, r3, r6\n\t"
  105859. "adcs r4, r4, r7\n\t"
  105860. "adc r5, r5, #0\n\t"
  105861. "lsr r6, r8, #16\n\t"
  105862. "lsr r7, r9, #16\n\t"
  105863. "mul r7, r6, r7\n\t"
  105864. "adds r4, r4, r7\n\t"
  105865. "adc r5, r5, #0\n\t"
  105866. "lsl r7, r9, #16\n\t"
  105867. "lsr r7, r7, #16\n\t"
  105868. "mul r6, r7, r6\n\t"
  105869. "lsr r7, r6, #16\n\t"
  105870. "lsl r6, r6, #16\n\t"
  105871. "adds r3, r3, r6\n\t"
  105872. "adcs r4, r4, r7\n\t"
  105873. "adc r5, r5, #0\n\t"
  105874. #else
  105875. "umull r6, r7, r8, r9\n\t"
  105876. "adds r3, r3, r6\n\t"
  105877. "adcs r4, r4, r7\n\t"
  105878. "adc r5, r5, #0\n\t"
  105879. #endif
  105880. "str r3, [%[r], #96]\n\t"
  105881. /* A[9] * B[16] */
  105882. "ldr r8, [%[a], #36]\n\t"
  105883. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105884. "lsl r6, r8, #16\n\t"
  105885. "lsl r7, r9, #16\n\t"
  105886. "lsr r6, r6, #16\n\t"
  105887. "lsr r7, r7, #16\n\t"
  105888. "mul r7, r6, r7\n\t"
  105889. "adds r4, r4, r7\n\t"
  105890. "adcs r5, r5, #0\n\t"
  105891. "mov r3, #0\n\t"
  105892. "adc r3, r3, #0\n\t"
  105893. "lsr r7, r9, #16\n\t"
  105894. "mul r6, r7, r6\n\t"
  105895. "lsr r7, r6, #16\n\t"
  105896. "lsl r6, r6, #16\n\t"
  105897. "adds r4, r4, r6\n\t"
  105898. "adcs r5, r5, r7\n\t"
  105899. "adc r3, r3, #0\n\t"
  105900. "lsr r6, r8, #16\n\t"
  105901. "lsr r7, r9, #16\n\t"
  105902. "mul r7, r6, r7\n\t"
  105903. "adds r5, r5, r7\n\t"
  105904. "adc r3, r3, #0\n\t"
  105905. "lsl r7, r9, #16\n\t"
  105906. "lsr r7, r7, #16\n\t"
  105907. "mul r6, r7, r6\n\t"
  105908. "lsr r7, r6, #16\n\t"
  105909. "lsl r6, r6, #16\n\t"
  105910. "adds r4, r4, r6\n\t"
  105911. "adcs r5, r5, r7\n\t"
  105912. "adc r3, r3, #0\n\t"
  105913. #else
  105914. "umull r6, r7, r8, r9\n\t"
  105915. "adds r4, r4, r6\n\t"
  105916. "adcs r5, r5, r7\n\t"
  105917. "mov r3, #0\n\t"
  105918. "adc r3, r3, #0\n\t"
  105919. #endif
  105920. /* A[10] * B[15] */
  105921. "ldr r8, [%[a], #40]\n\t"
  105922. "ldr r9, [%[b], #60]\n\t"
  105923. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105924. "lsl r6, r8, #16\n\t"
  105925. "lsl r7, r9, #16\n\t"
  105926. "lsr r6, r6, #16\n\t"
  105927. "lsr r7, r7, #16\n\t"
  105928. "mul r7, r6, r7\n\t"
  105929. "adds r4, r4, r7\n\t"
  105930. "adcs r5, r5, #0\n\t"
  105931. "adc r3, r3, #0\n\t"
  105932. "lsr r7, r9, #16\n\t"
  105933. "mul r6, r7, r6\n\t"
  105934. "lsr r7, r6, #16\n\t"
  105935. "lsl r6, r6, #16\n\t"
  105936. "adds r4, r4, r6\n\t"
  105937. "adcs r5, r5, r7\n\t"
  105938. "adc r3, r3, #0\n\t"
  105939. "lsr r6, r8, #16\n\t"
  105940. "lsr r7, r9, #16\n\t"
  105941. "mul r7, r6, r7\n\t"
  105942. "adds r5, r5, r7\n\t"
  105943. "adc r3, r3, #0\n\t"
  105944. "lsl r7, r9, #16\n\t"
  105945. "lsr r7, r7, #16\n\t"
  105946. "mul r6, r7, r6\n\t"
  105947. "lsr r7, r6, #16\n\t"
  105948. "lsl r6, r6, #16\n\t"
  105949. "adds r4, r4, r6\n\t"
  105950. "adcs r5, r5, r7\n\t"
  105951. "adc r3, r3, #0\n\t"
  105952. #else
  105953. "umull r6, r7, r8, r9\n\t"
  105954. "adds r4, r4, r6\n\t"
  105955. "adcs r5, r5, r7\n\t"
  105956. "adc r3, r3, #0\n\t"
  105957. #endif
  105958. /* A[11] * B[14] */
  105959. "ldr r8, [%[a], #44]\n\t"
  105960. "ldr r9, [%[b], #56]\n\t"
  105961. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105962. "lsl r6, r8, #16\n\t"
  105963. "lsl r7, r9, #16\n\t"
  105964. "lsr r6, r6, #16\n\t"
  105965. "lsr r7, r7, #16\n\t"
  105966. "mul r7, r6, r7\n\t"
  105967. "adds r4, r4, r7\n\t"
  105968. "adcs r5, r5, #0\n\t"
  105969. "adc r3, r3, #0\n\t"
  105970. "lsr r7, r9, #16\n\t"
  105971. "mul r6, r7, r6\n\t"
  105972. "lsr r7, r6, #16\n\t"
  105973. "lsl r6, r6, #16\n\t"
  105974. "adds r4, r4, r6\n\t"
  105975. "adcs r5, r5, r7\n\t"
  105976. "adc r3, r3, #0\n\t"
  105977. "lsr r6, r8, #16\n\t"
  105978. "lsr r7, r9, #16\n\t"
  105979. "mul r7, r6, r7\n\t"
  105980. "adds r5, r5, r7\n\t"
  105981. "adc r3, r3, #0\n\t"
  105982. "lsl r7, r9, #16\n\t"
  105983. "lsr r7, r7, #16\n\t"
  105984. "mul r6, r7, r6\n\t"
  105985. "lsr r7, r6, #16\n\t"
  105986. "lsl r6, r6, #16\n\t"
  105987. "adds r4, r4, r6\n\t"
  105988. "adcs r5, r5, r7\n\t"
  105989. "adc r3, r3, #0\n\t"
  105990. #else
  105991. "umull r6, r7, r8, r9\n\t"
  105992. "adds r4, r4, r6\n\t"
  105993. "adcs r5, r5, r7\n\t"
  105994. "adc r3, r3, #0\n\t"
  105995. #endif
  105996. /* A[12] * B[13] */
  105997. "ldr r9, [%[b], #52]\n\t"
  105998. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  105999. "lsl r6, r11, #16\n\t"
  106000. "lsl r7, r9, #16\n\t"
  106001. "lsr r6, r6, #16\n\t"
  106002. "lsr r7, r7, #16\n\t"
  106003. "mul r7, r6, r7\n\t"
  106004. "adds r4, r4, r7\n\t"
  106005. "adcs r5, r5, #0\n\t"
  106006. "adc r3, r3, #0\n\t"
  106007. "lsr r7, r9, #16\n\t"
  106008. "mul r6, r7, r6\n\t"
  106009. "lsr r7, r6, #16\n\t"
  106010. "lsl r6, r6, #16\n\t"
  106011. "adds r4, r4, r6\n\t"
  106012. "adcs r5, r5, r7\n\t"
  106013. "adc r3, r3, #0\n\t"
  106014. "lsr r6, r11, #16\n\t"
  106015. "lsr r7, r9, #16\n\t"
  106016. "mul r7, r6, r7\n\t"
  106017. "adds r5, r5, r7\n\t"
  106018. "adc r3, r3, #0\n\t"
  106019. "lsl r7, r9, #16\n\t"
  106020. "lsr r7, r7, #16\n\t"
  106021. "mul r6, r7, r6\n\t"
  106022. "lsr r7, r6, #16\n\t"
  106023. "lsl r6, r6, #16\n\t"
  106024. "adds r4, r4, r6\n\t"
  106025. "adcs r5, r5, r7\n\t"
  106026. "adc r3, r3, #0\n\t"
  106027. #else
  106028. "umull r6, r7, r11, r9\n\t"
  106029. "adds r4, r4, r6\n\t"
  106030. "adcs r5, r5, r7\n\t"
  106031. "adc r3, r3, #0\n\t"
  106032. #endif
  106033. /* A[13] * B[12] */
  106034. "ldr r8, [%[a], #52]\n\t"
  106035. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106036. "lsl r6, r8, #16\n\t"
  106037. "lsl r7, r12, #16\n\t"
  106038. "lsr r6, r6, #16\n\t"
  106039. "lsr r7, r7, #16\n\t"
  106040. "mul r7, r6, r7\n\t"
  106041. "adds r4, r4, r7\n\t"
  106042. "adcs r5, r5, #0\n\t"
  106043. "adc r3, r3, #0\n\t"
  106044. "lsr r7, r12, #16\n\t"
  106045. "mul r6, r7, r6\n\t"
  106046. "lsr r7, r6, #16\n\t"
  106047. "lsl r6, r6, #16\n\t"
  106048. "adds r4, r4, r6\n\t"
  106049. "adcs r5, r5, r7\n\t"
  106050. "adc r3, r3, #0\n\t"
  106051. "lsr r6, r8, #16\n\t"
  106052. "lsr r7, r12, #16\n\t"
  106053. "mul r7, r6, r7\n\t"
  106054. "adds r5, r5, r7\n\t"
  106055. "adc r3, r3, #0\n\t"
  106056. "lsl r7, r12, #16\n\t"
  106057. "lsr r7, r7, #16\n\t"
  106058. "mul r6, r7, r6\n\t"
  106059. "lsr r7, r6, #16\n\t"
  106060. "lsl r6, r6, #16\n\t"
  106061. "adds r4, r4, r6\n\t"
  106062. "adcs r5, r5, r7\n\t"
  106063. "adc r3, r3, #0\n\t"
  106064. #else
  106065. "umull r6, r7, r8, r12\n\t"
  106066. "adds r4, r4, r6\n\t"
  106067. "adcs r5, r5, r7\n\t"
  106068. "adc r3, r3, #0\n\t"
  106069. #endif
  106070. /* A[14] * B[11] */
  106071. "ldr r8, [%[a], #56]\n\t"
  106072. "ldr r9, [%[b], #44]\n\t"
  106073. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106074. "lsl r6, r8, #16\n\t"
  106075. "lsl r7, r9, #16\n\t"
  106076. "lsr r6, r6, #16\n\t"
  106077. "lsr r7, r7, #16\n\t"
  106078. "mul r7, r6, r7\n\t"
  106079. "adds r4, r4, r7\n\t"
  106080. "adcs r5, r5, #0\n\t"
  106081. "adc r3, r3, #0\n\t"
  106082. "lsr r7, r9, #16\n\t"
  106083. "mul r6, r7, r6\n\t"
  106084. "lsr r7, r6, #16\n\t"
  106085. "lsl r6, r6, #16\n\t"
  106086. "adds r4, r4, r6\n\t"
  106087. "adcs r5, r5, r7\n\t"
  106088. "adc r3, r3, #0\n\t"
  106089. "lsr r6, r8, #16\n\t"
  106090. "lsr r7, r9, #16\n\t"
  106091. "mul r7, r6, r7\n\t"
  106092. "adds r5, r5, r7\n\t"
  106093. "adc r3, r3, #0\n\t"
  106094. "lsl r7, r9, #16\n\t"
  106095. "lsr r7, r7, #16\n\t"
  106096. "mul r6, r7, r6\n\t"
  106097. "lsr r7, r6, #16\n\t"
  106098. "lsl r6, r6, #16\n\t"
  106099. "adds r4, r4, r6\n\t"
  106100. "adcs r5, r5, r7\n\t"
  106101. "adc r3, r3, #0\n\t"
  106102. #else
  106103. "umull r6, r7, r8, r9\n\t"
  106104. "adds r4, r4, r6\n\t"
  106105. "adcs r5, r5, r7\n\t"
  106106. "adc r3, r3, #0\n\t"
  106107. #endif
  106108. /* A[15] * B[10] */
  106109. "ldr r8, [%[a], #60]\n\t"
  106110. "ldr r9, [%[b], #40]\n\t"
  106111. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106112. "lsl r6, r8, #16\n\t"
  106113. "lsl r7, r9, #16\n\t"
  106114. "lsr r6, r6, #16\n\t"
  106115. "lsr r7, r7, #16\n\t"
  106116. "mul r7, r6, r7\n\t"
  106117. "adds r4, r4, r7\n\t"
  106118. "adcs r5, r5, #0\n\t"
  106119. "adc r3, r3, #0\n\t"
  106120. "lsr r7, r9, #16\n\t"
  106121. "mul r6, r7, r6\n\t"
  106122. "lsr r7, r6, #16\n\t"
  106123. "lsl r6, r6, #16\n\t"
  106124. "adds r4, r4, r6\n\t"
  106125. "adcs r5, r5, r7\n\t"
  106126. "adc r3, r3, #0\n\t"
  106127. "lsr r6, r8, #16\n\t"
  106128. "lsr r7, r9, #16\n\t"
  106129. "mul r7, r6, r7\n\t"
  106130. "adds r5, r5, r7\n\t"
  106131. "adc r3, r3, #0\n\t"
  106132. "lsl r7, r9, #16\n\t"
  106133. "lsr r7, r7, #16\n\t"
  106134. "mul r6, r7, r6\n\t"
  106135. "lsr r7, r6, #16\n\t"
  106136. "lsl r6, r6, #16\n\t"
  106137. "adds r4, r4, r6\n\t"
  106138. "adcs r5, r5, r7\n\t"
  106139. "adc r3, r3, #0\n\t"
  106140. #else
  106141. "umull r6, r7, r8, r9\n\t"
  106142. "adds r4, r4, r6\n\t"
  106143. "adcs r5, r5, r7\n\t"
  106144. "adc r3, r3, #0\n\t"
  106145. #endif
  106146. /* A[16] * B[9] */
  106147. "ldr r8, [%[a], #64]\n\t"
  106148. "ldr r9, [%[b], #36]\n\t"
  106149. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106150. "lsl r6, r8, #16\n\t"
  106151. "lsl r7, r9, #16\n\t"
  106152. "lsr r6, r6, #16\n\t"
  106153. "lsr r7, r7, #16\n\t"
  106154. "mul r7, r6, r7\n\t"
  106155. "adds r4, r4, r7\n\t"
  106156. "adcs r5, r5, #0\n\t"
  106157. "adc r3, r3, #0\n\t"
  106158. "lsr r7, r9, #16\n\t"
  106159. "mul r6, r7, r6\n\t"
  106160. "lsr r7, r6, #16\n\t"
  106161. "lsl r6, r6, #16\n\t"
  106162. "adds r4, r4, r6\n\t"
  106163. "adcs r5, r5, r7\n\t"
  106164. "adc r3, r3, #0\n\t"
  106165. "lsr r6, r8, #16\n\t"
  106166. "lsr r7, r9, #16\n\t"
  106167. "mul r7, r6, r7\n\t"
  106168. "adds r5, r5, r7\n\t"
  106169. "adc r3, r3, #0\n\t"
  106170. "lsl r7, r9, #16\n\t"
  106171. "lsr r7, r7, #16\n\t"
  106172. "mul r6, r7, r6\n\t"
  106173. "lsr r7, r6, #16\n\t"
  106174. "lsl r6, r6, #16\n\t"
  106175. "adds r4, r4, r6\n\t"
  106176. "adcs r5, r5, r7\n\t"
  106177. "adc r3, r3, #0\n\t"
  106178. #else
  106179. "umull r6, r7, r8, r9\n\t"
  106180. "adds r4, r4, r6\n\t"
  106181. "adcs r5, r5, r7\n\t"
  106182. "adc r3, r3, #0\n\t"
  106183. #endif
  106184. "str r4, [%[r], #100]\n\t"
  106185. /* A[16] * B[10] */
  106186. "ldr r9, [%[b], #40]\n\t"
  106187. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106188. "lsl r6, r8, #16\n\t"
  106189. "lsl r7, r9, #16\n\t"
  106190. "lsr r6, r6, #16\n\t"
  106191. "lsr r7, r7, #16\n\t"
  106192. "mul r7, r6, r7\n\t"
  106193. "adds r5, r5, r7\n\t"
  106194. "adcs r3, r3, #0\n\t"
  106195. "mov r4, #0\n\t"
  106196. "adc r4, r4, #0\n\t"
  106197. "lsr r7, r9, #16\n\t"
  106198. "mul r6, r7, r6\n\t"
  106199. "lsr r7, r6, #16\n\t"
  106200. "lsl r6, r6, #16\n\t"
  106201. "adds r5, r5, r6\n\t"
  106202. "adcs r3, r3, r7\n\t"
  106203. "adc r4, r4, #0\n\t"
  106204. "lsr r6, r8, #16\n\t"
  106205. "lsr r7, r9, #16\n\t"
  106206. "mul r7, r6, r7\n\t"
  106207. "adds r3, r3, r7\n\t"
  106208. "adc r4, r4, #0\n\t"
  106209. "lsl r7, r9, #16\n\t"
  106210. "lsr r7, r7, #16\n\t"
  106211. "mul r6, r7, r6\n\t"
  106212. "lsr r7, r6, #16\n\t"
  106213. "lsl r6, r6, #16\n\t"
  106214. "adds r5, r5, r6\n\t"
  106215. "adcs r3, r3, r7\n\t"
  106216. "adc r4, r4, #0\n\t"
  106217. #else
  106218. "umull r6, r7, r8, r9\n\t"
  106219. "adds r5, r5, r6\n\t"
  106220. "adcs r3, r3, r7\n\t"
  106221. "mov r4, #0\n\t"
  106222. "adc r4, r4, #0\n\t"
  106223. #endif
  106224. /* A[15] * B[11] */
  106225. "ldr r8, [%[a], #60]\n\t"
  106226. "ldr r9, [%[b], #44]\n\t"
  106227. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106228. "lsl r6, r8, #16\n\t"
  106229. "lsl r7, r9, #16\n\t"
  106230. "lsr r6, r6, #16\n\t"
  106231. "lsr r7, r7, #16\n\t"
  106232. "mul r7, r6, r7\n\t"
  106233. "adds r5, r5, r7\n\t"
  106234. "adcs r3, r3, #0\n\t"
  106235. "adc r4, r4, #0\n\t"
  106236. "lsr r7, r9, #16\n\t"
  106237. "mul r6, r7, r6\n\t"
  106238. "lsr r7, r6, #16\n\t"
  106239. "lsl r6, r6, #16\n\t"
  106240. "adds r5, r5, r6\n\t"
  106241. "adcs r3, r3, r7\n\t"
  106242. "adc r4, r4, #0\n\t"
  106243. "lsr r6, r8, #16\n\t"
  106244. "lsr r7, r9, #16\n\t"
  106245. "mul r7, r6, r7\n\t"
  106246. "adds r3, r3, r7\n\t"
  106247. "adc r4, r4, #0\n\t"
  106248. "lsl r7, r9, #16\n\t"
  106249. "lsr r7, r7, #16\n\t"
  106250. "mul r6, r7, r6\n\t"
  106251. "lsr r7, r6, #16\n\t"
  106252. "lsl r6, r6, #16\n\t"
  106253. "adds r5, r5, r6\n\t"
  106254. "adcs r3, r3, r7\n\t"
  106255. "adc r4, r4, #0\n\t"
  106256. #else
  106257. "umull r6, r7, r8, r9\n\t"
  106258. "adds r5, r5, r6\n\t"
  106259. "adcs r3, r3, r7\n\t"
  106260. "adc r4, r4, #0\n\t"
  106261. #endif
  106262. /* A[14] * B[12] */
  106263. "ldr r8, [%[a], #56]\n\t"
  106264. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106265. "lsl r6, r8, #16\n\t"
  106266. "lsl r7, r12, #16\n\t"
  106267. "lsr r6, r6, #16\n\t"
  106268. "lsr r7, r7, #16\n\t"
  106269. "mul r7, r6, r7\n\t"
  106270. "adds r5, r5, r7\n\t"
  106271. "adcs r3, r3, #0\n\t"
  106272. "adc r4, r4, #0\n\t"
  106273. "lsr r7, r12, #16\n\t"
  106274. "mul r6, r7, r6\n\t"
  106275. "lsr r7, r6, #16\n\t"
  106276. "lsl r6, r6, #16\n\t"
  106277. "adds r5, r5, r6\n\t"
  106278. "adcs r3, r3, r7\n\t"
  106279. "adc r4, r4, #0\n\t"
  106280. "lsr r6, r8, #16\n\t"
  106281. "lsr r7, r12, #16\n\t"
  106282. "mul r7, r6, r7\n\t"
  106283. "adds r3, r3, r7\n\t"
  106284. "adc r4, r4, #0\n\t"
  106285. "lsl r7, r12, #16\n\t"
  106286. "lsr r7, r7, #16\n\t"
  106287. "mul r6, r7, r6\n\t"
  106288. "lsr r7, r6, #16\n\t"
  106289. "lsl r6, r6, #16\n\t"
  106290. "adds r5, r5, r6\n\t"
  106291. "adcs r3, r3, r7\n\t"
  106292. "adc r4, r4, #0\n\t"
  106293. #else
  106294. "umull r6, r7, r8, r12\n\t"
  106295. "adds r5, r5, r6\n\t"
  106296. "adcs r3, r3, r7\n\t"
  106297. "adc r4, r4, #0\n\t"
  106298. #endif
  106299. /* A[13] * B[13] */
  106300. "ldr r11, [%[a], #52]\n\t"
  106301. "ldr r12, [%[b], #52]\n\t"
  106302. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106303. "lsl r6, r11, #16\n\t"
  106304. "lsl r7, r12, #16\n\t"
  106305. "lsr r6, r6, #16\n\t"
  106306. "lsr r7, r7, #16\n\t"
  106307. "mul r7, r6, r7\n\t"
  106308. "adds r5, r5, r7\n\t"
  106309. "adcs r3, r3, #0\n\t"
  106310. "adc r4, r4, #0\n\t"
  106311. "lsr r7, r12, #16\n\t"
  106312. "mul r6, r7, r6\n\t"
  106313. "lsr r7, r6, #16\n\t"
  106314. "lsl r6, r6, #16\n\t"
  106315. "adds r5, r5, r6\n\t"
  106316. "adcs r3, r3, r7\n\t"
  106317. "adc r4, r4, #0\n\t"
  106318. "lsr r6, r11, #16\n\t"
  106319. "lsr r7, r12, #16\n\t"
  106320. "mul r7, r6, r7\n\t"
  106321. "adds r3, r3, r7\n\t"
  106322. "adc r4, r4, #0\n\t"
  106323. "lsl r7, r12, #16\n\t"
  106324. "lsr r7, r7, #16\n\t"
  106325. "mul r6, r7, r6\n\t"
  106326. "lsr r7, r6, #16\n\t"
  106327. "lsl r6, r6, #16\n\t"
  106328. "adds r5, r5, r6\n\t"
  106329. "adcs r3, r3, r7\n\t"
  106330. "adc r4, r4, #0\n\t"
  106331. #else
  106332. "umull r6, r7, r11, r12\n\t"
  106333. "adds r5, r5, r6\n\t"
  106334. "adcs r3, r3, r7\n\t"
  106335. "adc r4, r4, #0\n\t"
  106336. #endif
  106337. /* A[12] * B[14] */
  106338. "ldr r8, [%[a], #48]\n\t"
  106339. "ldr r9, [%[b], #56]\n\t"
  106340. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106341. "lsl r6, r8, #16\n\t"
  106342. "lsl r7, r9, #16\n\t"
  106343. "lsr r6, r6, #16\n\t"
  106344. "lsr r7, r7, #16\n\t"
  106345. "mul r7, r6, r7\n\t"
  106346. "adds r5, r5, r7\n\t"
  106347. "adcs r3, r3, #0\n\t"
  106348. "adc r4, r4, #0\n\t"
  106349. "lsr r7, r9, #16\n\t"
  106350. "mul r6, r7, r6\n\t"
  106351. "lsr r7, r6, #16\n\t"
  106352. "lsl r6, r6, #16\n\t"
  106353. "adds r5, r5, r6\n\t"
  106354. "adcs r3, r3, r7\n\t"
  106355. "adc r4, r4, #0\n\t"
  106356. "lsr r6, r8, #16\n\t"
  106357. "lsr r7, r9, #16\n\t"
  106358. "mul r7, r6, r7\n\t"
  106359. "adds r3, r3, r7\n\t"
  106360. "adc r4, r4, #0\n\t"
  106361. "lsl r7, r9, #16\n\t"
  106362. "lsr r7, r7, #16\n\t"
  106363. "mul r6, r7, r6\n\t"
  106364. "lsr r7, r6, #16\n\t"
  106365. "lsl r6, r6, #16\n\t"
  106366. "adds r5, r5, r6\n\t"
  106367. "adcs r3, r3, r7\n\t"
  106368. "adc r4, r4, #0\n\t"
  106369. #else
  106370. "umull r6, r7, r8, r9\n\t"
  106371. "adds r5, r5, r6\n\t"
  106372. "adcs r3, r3, r7\n\t"
  106373. "adc r4, r4, #0\n\t"
  106374. #endif
  106375. /* A[11] * B[15] */
  106376. "ldr r8, [%[a], #44]\n\t"
  106377. "ldr r9, [%[b], #60]\n\t"
  106378. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106379. "lsl r6, r8, #16\n\t"
  106380. "lsl r7, r9, #16\n\t"
  106381. "lsr r6, r6, #16\n\t"
  106382. "lsr r7, r7, #16\n\t"
  106383. "mul r7, r6, r7\n\t"
  106384. "adds r5, r5, r7\n\t"
  106385. "adcs r3, r3, #0\n\t"
  106386. "adc r4, r4, #0\n\t"
  106387. "lsr r7, r9, #16\n\t"
  106388. "mul r6, r7, r6\n\t"
  106389. "lsr r7, r6, #16\n\t"
  106390. "lsl r6, r6, #16\n\t"
  106391. "adds r5, r5, r6\n\t"
  106392. "adcs r3, r3, r7\n\t"
  106393. "adc r4, r4, #0\n\t"
  106394. "lsr r6, r8, #16\n\t"
  106395. "lsr r7, r9, #16\n\t"
  106396. "mul r7, r6, r7\n\t"
  106397. "adds r3, r3, r7\n\t"
  106398. "adc r4, r4, #0\n\t"
  106399. "lsl r7, r9, #16\n\t"
  106400. "lsr r7, r7, #16\n\t"
  106401. "mul r6, r7, r6\n\t"
  106402. "lsr r7, r6, #16\n\t"
  106403. "lsl r6, r6, #16\n\t"
  106404. "adds r5, r5, r6\n\t"
  106405. "adcs r3, r3, r7\n\t"
  106406. "adc r4, r4, #0\n\t"
  106407. #else
  106408. "umull r6, r7, r8, r9\n\t"
  106409. "adds r5, r5, r6\n\t"
  106410. "adcs r3, r3, r7\n\t"
  106411. "adc r4, r4, #0\n\t"
  106412. #endif
  106413. /* A[10] * B[16] */
  106414. "ldr r8, [%[a], #40]\n\t"
  106415. "ldr r9, [%[b], #64]\n\t"
  106416. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106417. "lsl r6, r8, #16\n\t"
  106418. "lsl r7, r9, #16\n\t"
  106419. "lsr r6, r6, #16\n\t"
  106420. "lsr r7, r7, #16\n\t"
  106421. "mul r7, r6, r7\n\t"
  106422. "adds r5, r5, r7\n\t"
  106423. "adcs r3, r3, #0\n\t"
  106424. "adc r4, r4, #0\n\t"
  106425. "lsr r7, r9, #16\n\t"
  106426. "mul r6, r7, r6\n\t"
  106427. "lsr r7, r6, #16\n\t"
  106428. "lsl r6, r6, #16\n\t"
  106429. "adds r5, r5, r6\n\t"
  106430. "adcs r3, r3, r7\n\t"
  106431. "adc r4, r4, #0\n\t"
  106432. "lsr r6, r8, #16\n\t"
  106433. "lsr r7, r9, #16\n\t"
  106434. "mul r7, r6, r7\n\t"
  106435. "adds r3, r3, r7\n\t"
  106436. "adc r4, r4, #0\n\t"
  106437. "lsl r7, r9, #16\n\t"
  106438. "lsr r7, r7, #16\n\t"
  106439. "mul r6, r7, r6\n\t"
  106440. "lsr r7, r6, #16\n\t"
  106441. "lsl r6, r6, #16\n\t"
  106442. "adds r5, r5, r6\n\t"
  106443. "adcs r3, r3, r7\n\t"
  106444. "adc r4, r4, #0\n\t"
  106445. #else
  106446. "umull r6, r7, r8, r9\n\t"
  106447. "adds r5, r5, r6\n\t"
  106448. "adcs r3, r3, r7\n\t"
  106449. "adc r4, r4, #0\n\t"
  106450. #endif
  106451. "str r5, [%[r], #104]\n\t"
  106452. /* A[11] * B[16] */
  106453. "ldr r8, [%[a], #44]\n\t"
  106454. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106455. "lsl r6, r8, #16\n\t"
  106456. "lsl r7, r9, #16\n\t"
  106457. "lsr r6, r6, #16\n\t"
  106458. "lsr r7, r7, #16\n\t"
  106459. "mul r7, r6, r7\n\t"
  106460. "adds r3, r3, r7\n\t"
  106461. "adcs r4, r4, #0\n\t"
  106462. "mov r5, #0\n\t"
  106463. "adc r5, r5, #0\n\t"
  106464. "lsr r7, r9, #16\n\t"
  106465. "mul r6, r7, r6\n\t"
  106466. "lsr r7, r6, #16\n\t"
  106467. "lsl r6, r6, #16\n\t"
  106468. "adds r3, r3, r6\n\t"
  106469. "adcs r4, r4, r7\n\t"
  106470. "adc r5, r5, #0\n\t"
  106471. "lsr r6, r8, #16\n\t"
  106472. "lsr r7, r9, #16\n\t"
  106473. "mul r7, r6, r7\n\t"
  106474. "adds r4, r4, r7\n\t"
  106475. "adc r5, r5, #0\n\t"
  106476. "lsl r7, r9, #16\n\t"
  106477. "lsr r7, r7, #16\n\t"
  106478. "mul r6, r7, r6\n\t"
  106479. "lsr r7, r6, #16\n\t"
  106480. "lsl r6, r6, #16\n\t"
  106481. "adds r3, r3, r6\n\t"
  106482. "adcs r4, r4, r7\n\t"
  106483. "adc r5, r5, #0\n\t"
  106484. #else
  106485. "umull r6, r7, r8, r9\n\t"
  106486. "adds r3, r3, r6\n\t"
  106487. "adcs r4, r4, r7\n\t"
  106488. "mov r5, #0\n\t"
  106489. "adc r5, r5, #0\n\t"
  106490. #endif
  106491. /* A[12] * B[15] */
  106492. "ldr r8, [%[a], #48]\n\t"
  106493. "ldr r9, [%[b], #60]\n\t"
  106494. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106495. "lsl r6, r8, #16\n\t"
  106496. "lsl r7, r9, #16\n\t"
  106497. "lsr r6, r6, #16\n\t"
  106498. "lsr r7, r7, #16\n\t"
  106499. "mul r7, r6, r7\n\t"
  106500. "adds r3, r3, r7\n\t"
  106501. "adcs r4, r4, #0\n\t"
  106502. "adc r5, r5, #0\n\t"
  106503. "lsr r7, r9, #16\n\t"
  106504. "mul r6, r7, r6\n\t"
  106505. "lsr r7, r6, #16\n\t"
  106506. "lsl r6, r6, #16\n\t"
  106507. "adds r3, r3, r6\n\t"
  106508. "adcs r4, r4, r7\n\t"
  106509. "adc r5, r5, #0\n\t"
  106510. "lsr r6, r8, #16\n\t"
  106511. "lsr r7, r9, #16\n\t"
  106512. "mul r7, r6, r7\n\t"
  106513. "adds r4, r4, r7\n\t"
  106514. "adc r5, r5, #0\n\t"
  106515. "lsl r7, r9, #16\n\t"
  106516. "lsr r7, r7, #16\n\t"
  106517. "mul r6, r7, r6\n\t"
  106518. "lsr r7, r6, #16\n\t"
  106519. "lsl r6, r6, #16\n\t"
  106520. "adds r3, r3, r6\n\t"
  106521. "adcs r4, r4, r7\n\t"
  106522. "adc r5, r5, #0\n\t"
  106523. #else
  106524. "umull r6, r7, r8, r9\n\t"
  106525. "adds r3, r3, r6\n\t"
  106526. "adcs r4, r4, r7\n\t"
  106527. "adc r5, r5, #0\n\t"
  106528. #endif
  106529. /* A[13] * B[14] */
  106530. "ldr r9, [%[b], #56]\n\t"
  106531. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106532. "lsl r6, r11, #16\n\t"
  106533. "lsl r7, r9, #16\n\t"
  106534. "lsr r6, r6, #16\n\t"
  106535. "lsr r7, r7, #16\n\t"
  106536. "mul r7, r6, r7\n\t"
  106537. "adds r3, r3, r7\n\t"
  106538. "adcs r4, r4, #0\n\t"
  106539. "adc r5, r5, #0\n\t"
  106540. "lsr r7, r9, #16\n\t"
  106541. "mul r6, r7, r6\n\t"
  106542. "lsr r7, r6, #16\n\t"
  106543. "lsl r6, r6, #16\n\t"
  106544. "adds r3, r3, r6\n\t"
  106545. "adcs r4, r4, r7\n\t"
  106546. "adc r5, r5, #0\n\t"
  106547. "lsr r6, r11, #16\n\t"
  106548. "lsr r7, r9, #16\n\t"
  106549. "mul r7, r6, r7\n\t"
  106550. "adds r4, r4, r7\n\t"
  106551. "adc r5, r5, #0\n\t"
  106552. "lsl r7, r9, #16\n\t"
  106553. "lsr r7, r7, #16\n\t"
  106554. "mul r6, r7, r6\n\t"
  106555. "lsr r7, r6, #16\n\t"
  106556. "lsl r6, r6, #16\n\t"
  106557. "adds r3, r3, r6\n\t"
  106558. "adcs r4, r4, r7\n\t"
  106559. "adc r5, r5, #0\n\t"
  106560. #else
  106561. "umull r6, r7, r11, r9\n\t"
  106562. "adds r3, r3, r6\n\t"
  106563. "adcs r4, r4, r7\n\t"
  106564. "adc r5, r5, #0\n\t"
  106565. #endif
  106566. /* A[14] * B[13] */
  106567. "ldr r8, [%[a], #56]\n\t"
  106568. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106569. "lsl r6, r8, #16\n\t"
  106570. "lsl r7, r12, #16\n\t"
  106571. "lsr r6, r6, #16\n\t"
  106572. "lsr r7, r7, #16\n\t"
  106573. "mul r7, r6, r7\n\t"
  106574. "adds r3, r3, r7\n\t"
  106575. "adcs r4, r4, #0\n\t"
  106576. "adc r5, r5, #0\n\t"
  106577. "lsr r7, r12, #16\n\t"
  106578. "mul r6, r7, r6\n\t"
  106579. "lsr r7, r6, #16\n\t"
  106580. "lsl r6, r6, #16\n\t"
  106581. "adds r3, r3, r6\n\t"
  106582. "adcs r4, r4, r7\n\t"
  106583. "adc r5, r5, #0\n\t"
  106584. "lsr r6, r8, #16\n\t"
  106585. "lsr r7, r12, #16\n\t"
  106586. "mul r7, r6, r7\n\t"
  106587. "adds r4, r4, r7\n\t"
  106588. "adc r5, r5, #0\n\t"
  106589. "lsl r7, r12, #16\n\t"
  106590. "lsr r7, r7, #16\n\t"
  106591. "mul r6, r7, r6\n\t"
  106592. "lsr r7, r6, #16\n\t"
  106593. "lsl r6, r6, #16\n\t"
  106594. "adds r3, r3, r6\n\t"
  106595. "adcs r4, r4, r7\n\t"
  106596. "adc r5, r5, #0\n\t"
  106597. #else
  106598. "umull r6, r7, r8, r12\n\t"
  106599. "adds r3, r3, r6\n\t"
  106600. "adcs r4, r4, r7\n\t"
  106601. "adc r5, r5, #0\n\t"
  106602. #endif
  106603. /* A[15] * B[12] */
  106604. "ldr r8, [%[a], #60]\n\t"
  106605. "ldr r9, [%[b], #48]\n\t"
  106606. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106607. "lsl r6, r8, #16\n\t"
  106608. "lsl r7, r9, #16\n\t"
  106609. "lsr r6, r6, #16\n\t"
  106610. "lsr r7, r7, #16\n\t"
  106611. "mul r7, r6, r7\n\t"
  106612. "adds r3, r3, r7\n\t"
  106613. "adcs r4, r4, #0\n\t"
  106614. "adc r5, r5, #0\n\t"
  106615. "lsr r7, r9, #16\n\t"
  106616. "mul r6, r7, r6\n\t"
  106617. "lsr r7, r6, #16\n\t"
  106618. "lsl r6, r6, #16\n\t"
  106619. "adds r3, r3, r6\n\t"
  106620. "adcs r4, r4, r7\n\t"
  106621. "adc r5, r5, #0\n\t"
  106622. "lsr r6, r8, #16\n\t"
  106623. "lsr r7, r9, #16\n\t"
  106624. "mul r7, r6, r7\n\t"
  106625. "adds r4, r4, r7\n\t"
  106626. "adc r5, r5, #0\n\t"
  106627. "lsl r7, r9, #16\n\t"
  106628. "lsr r7, r7, #16\n\t"
  106629. "mul r6, r7, r6\n\t"
  106630. "lsr r7, r6, #16\n\t"
  106631. "lsl r6, r6, #16\n\t"
  106632. "adds r3, r3, r6\n\t"
  106633. "adcs r4, r4, r7\n\t"
  106634. "adc r5, r5, #0\n\t"
  106635. #else
  106636. "umull r6, r7, r8, r9\n\t"
  106637. "adds r3, r3, r6\n\t"
  106638. "adcs r4, r4, r7\n\t"
  106639. "adc r5, r5, #0\n\t"
  106640. #endif
  106641. /* A[16] * B[11] */
  106642. "ldr r8, [%[a], #64]\n\t"
  106643. "ldr r9, [%[b], #44]\n\t"
  106644. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106645. "lsl r6, r8, #16\n\t"
  106646. "lsl r7, r9, #16\n\t"
  106647. "lsr r6, r6, #16\n\t"
  106648. "lsr r7, r7, #16\n\t"
  106649. "mul r7, r6, r7\n\t"
  106650. "adds r3, r3, r7\n\t"
  106651. "adcs r4, r4, #0\n\t"
  106652. "adc r5, r5, #0\n\t"
  106653. "lsr r7, r9, #16\n\t"
  106654. "mul r6, r7, r6\n\t"
  106655. "lsr r7, r6, #16\n\t"
  106656. "lsl r6, r6, #16\n\t"
  106657. "adds r3, r3, r6\n\t"
  106658. "adcs r4, r4, r7\n\t"
  106659. "adc r5, r5, #0\n\t"
  106660. "lsr r6, r8, #16\n\t"
  106661. "lsr r7, r9, #16\n\t"
  106662. "mul r7, r6, r7\n\t"
  106663. "adds r4, r4, r7\n\t"
  106664. "adc r5, r5, #0\n\t"
  106665. "lsl r7, r9, #16\n\t"
  106666. "lsr r7, r7, #16\n\t"
  106667. "mul r6, r7, r6\n\t"
  106668. "lsr r7, r6, #16\n\t"
  106669. "lsl r6, r6, #16\n\t"
  106670. "adds r3, r3, r6\n\t"
  106671. "adcs r4, r4, r7\n\t"
  106672. "adc r5, r5, #0\n\t"
  106673. #else
  106674. "umull r6, r7, r8, r9\n\t"
  106675. "adds r3, r3, r6\n\t"
  106676. "adcs r4, r4, r7\n\t"
  106677. "adc r5, r5, #0\n\t"
  106678. #endif
  106679. "str r3, [%[r], #108]\n\t"
  106680. /* A[16] * B[12] */
  106681. "ldr r9, [%[b], #48]\n\t"
  106682. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106683. "lsl r6, r8, #16\n\t"
  106684. "lsl r7, r9, #16\n\t"
  106685. "lsr r6, r6, #16\n\t"
  106686. "lsr r7, r7, #16\n\t"
  106687. "mul r7, r6, r7\n\t"
  106688. "adds r4, r4, r7\n\t"
  106689. "adcs r5, r5, #0\n\t"
  106690. "mov r3, #0\n\t"
  106691. "adc r3, r3, #0\n\t"
  106692. "lsr r7, r9, #16\n\t"
  106693. "mul r6, r7, r6\n\t"
  106694. "lsr r7, r6, #16\n\t"
  106695. "lsl r6, r6, #16\n\t"
  106696. "adds r4, r4, r6\n\t"
  106697. "adcs r5, r5, r7\n\t"
  106698. "adc r3, r3, #0\n\t"
  106699. "lsr r6, r8, #16\n\t"
  106700. "lsr r7, r9, #16\n\t"
  106701. "mul r7, r6, r7\n\t"
  106702. "adds r5, r5, r7\n\t"
  106703. "adc r3, r3, #0\n\t"
  106704. "lsl r7, r9, #16\n\t"
  106705. "lsr r7, r7, #16\n\t"
  106706. "mul r6, r7, r6\n\t"
  106707. "lsr r7, r6, #16\n\t"
  106708. "lsl r6, r6, #16\n\t"
  106709. "adds r4, r4, r6\n\t"
  106710. "adcs r5, r5, r7\n\t"
  106711. "adc r3, r3, #0\n\t"
  106712. #else
  106713. "umull r6, r7, r8, r9\n\t"
  106714. "adds r4, r4, r6\n\t"
  106715. "adcs r5, r5, r7\n\t"
  106716. "mov r3, #0\n\t"
  106717. "adc r3, r3, #0\n\t"
  106718. #endif
  106719. /* A[15] * B[13] */
  106720. "ldr r8, [%[a], #60]\n\t"
  106721. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106722. "lsl r6, r8, #16\n\t"
  106723. "lsl r7, r12, #16\n\t"
  106724. "lsr r6, r6, #16\n\t"
  106725. "lsr r7, r7, #16\n\t"
  106726. "mul r7, r6, r7\n\t"
  106727. "adds r4, r4, r7\n\t"
  106728. "adcs r5, r5, #0\n\t"
  106729. "adc r3, r3, #0\n\t"
  106730. "lsr r7, r12, #16\n\t"
  106731. "mul r6, r7, r6\n\t"
  106732. "lsr r7, r6, #16\n\t"
  106733. "lsl r6, r6, #16\n\t"
  106734. "adds r4, r4, r6\n\t"
  106735. "adcs r5, r5, r7\n\t"
  106736. "adc r3, r3, #0\n\t"
  106737. "lsr r6, r8, #16\n\t"
  106738. "lsr r7, r12, #16\n\t"
  106739. "mul r7, r6, r7\n\t"
  106740. "adds r5, r5, r7\n\t"
  106741. "adc r3, r3, #0\n\t"
  106742. "lsl r7, r12, #16\n\t"
  106743. "lsr r7, r7, #16\n\t"
  106744. "mul r6, r7, r6\n\t"
  106745. "lsr r7, r6, #16\n\t"
  106746. "lsl r6, r6, #16\n\t"
  106747. "adds r4, r4, r6\n\t"
  106748. "adcs r5, r5, r7\n\t"
  106749. "adc r3, r3, #0\n\t"
  106750. #else
  106751. "umull r6, r7, r8, r12\n\t"
  106752. "adds r4, r4, r6\n\t"
  106753. "adcs r5, r5, r7\n\t"
  106754. "adc r3, r3, #0\n\t"
  106755. #endif
  106756. /* A[14] * B[14] */
  106757. "ldr r11, [%[a], #56]\n\t"
  106758. "ldr r12, [%[b], #56]\n\t"
  106759. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106760. "lsl r6, r11, #16\n\t"
  106761. "lsl r7, r12, #16\n\t"
  106762. "lsr r6, r6, #16\n\t"
  106763. "lsr r7, r7, #16\n\t"
  106764. "mul r7, r6, r7\n\t"
  106765. "adds r4, r4, r7\n\t"
  106766. "adcs r5, r5, #0\n\t"
  106767. "adc r3, r3, #0\n\t"
  106768. "lsr r7, r12, #16\n\t"
  106769. "mul r6, r7, r6\n\t"
  106770. "lsr r7, r6, #16\n\t"
  106771. "lsl r6, r6, #16\n\t"
  106772. "adds r4, r4, r6\n\t"
  106773. "adcs r5, r5, r7\n\t"
  106774. "adc r3, r3, #0\n\t"
  106775. "lsr r6, r11, #16\n\t"
  106776. "lsr r7, r12, #16\n\t"
  106777. "mul r7, r6, r7\n\t"
  106778. "adds r5, r5, r7\n\t"
  106779. "adc r3, r3, #0\n\t"
  106780. "lsl r7, r12, #16\n\t"
  106781. "lsr r7, r7, #16\n\t"
  106782. "mul r6, r7, r6\n\t"
  106783. "lsr r7, r6, #16\n\t"
  106784. "lsl r6, r6, #16\n\t"
  106785. "adds r4, r4, r6\n\t"
  106786. "adcs r5, r5, r7\n\t"
  106787. "adc r3, r3, #0\n\t"
  106788. #else
  106789. "umull r6, r7, r11, r12\n\t"
  106790. "adds r4, r4, r6\n\t"
  106791. "adcs r5, r5, r7\n\t"
  106792. "adc r3, r3, #0\n\t"
  106793. #endif
  106794. /* A[13] * B[15] */
  106795. "ldr r8, [%[a], #52]\n\t"
  106796. "ldr r9, [%[b], #60]\n\t"
  106797. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106798. "lsl r6, r8, #16\n\t"
  106799. "lsl r7, r9, #16\n\t"
  106800. "lsr r6, r6, #16\n\t"
  106801. "lsr r7, r7, #16\n\t"
  106802. "mul r7, r6, r7\n\t"
  106803. "adds r4, r4, r7\n\t"
  106804. "adcs r5, r5, #0\n\t"
  106805. "adc r3, r3, #0\n\t"
  106806. "lsr r7, r9, #16\n\t"
  106807. "mul r6, r7, r6\n\t"
  106808. "lsr r7, r6, #16\n\t"
  106809. "lsl r6, r6, #16\n\t"
  106810. "adds r4, r4, r6\n\t"
  106811. "adcs r5, r5, r7\n\t"
  106812. "adc r3, r3, #0\n\t"
  106813. "lsr r6, r8, #16\n\t"
  106814. "lsr r7, r9, #16\n\t"
  106815. "mul r7, r6, r7\n\t"
  106816. "adds r5, r5, r7\n\t"
  106817. "adc r3, r3, #0\n\t"
  106818. "lsl r7, r9, #16\n\t"
  106819. "lsr r7, r7, #16\n\t"
  106820. "mul r6, r7, r6\n\t"
  106821. "lsr r7, r6, #16\n\t"
  106822. "lsl r6, r6, #16\n\t"
  106823. "adds r4, r4, r6\n\t"
  106824. "adcs r5, r5, r7\n\t"
  106825. "adc r3, r3, #0\n\t"
  106826. #else
  106827. "umull r6, r7, r8, r9\n\t"
  106828. "adds r4, r4, r6\n\t"
  106829. "adcs r5, r5, r7\n\t"
  106830. "adc r3, r3, #0\n\t"
  106831. #endif
  106832. /* A[12] * B[16] */
  106833. "ldr r8, [%[a], #48]\n\t"
  106834. "ldr r9, [%[b], #64]\n\t"
  106835. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106836. "lsl r6, r8, #16\n\t"
  106837. "lsl r7, r9, #16\n\t"
  106838. "lsr r6, r6, #16\n\t"
  106839. "lsr r7, r7, #16\n\t"
  106840. "mul r7, r6, r7\n\t"
  106841. "adds r4, r4, r7\n\t"
  106842. "adcs r5, r5, #0\n\t"
  106843. "adc r3, r3, #0\n\t"
  106844. "lsr r7, r9, #16\n\t"
  106845. "mul r6, r7, r6\n\t"
  106846. "lsr r7, r6, #16\n\t"
  106847. "lsl r6, r6, #16\n\t"
  106848. "adds r4, r4, r6\n\t"
  106849. "adcs r5, r5, r7\n\t"
  106850. "adc r3, r3, #0\n\t"
  106851. "lsr r6, r8, #16\n\t"
  106852. "lsr r7, r9, #16\n\t"
  106853. "mul r7, r6, r7\n\t"
  106854. "adds r5, r5, r7\n\t"
  106855. "adc r3, r3, #0\n\t"
  106856. "lsl r7, r9, #16\n\t"
  106857. "lsr r7, r7, #16\n\t"
  106858. "mul r6, r7, r6\n\t"
  106859. "lsr r7, r6, #16\n\t"
  106860. "lsl r6, r6, #16\n\t"
  106861. "adds r4, r4, r6\n\t"
  106862. "adcs r5, r5, r7\n\t"
  106863. "adc r3, r3, #0\n\t"
  106864. #else
  106865. "umull r6, r7, r8, r9\n\t"
  106866. "adds r4, r4, r6\n\t"
  106867. "adcs r5, r5, r7\n\t"
  106868. "adc r3, r3, #0\n\t"
  106869. #endif
  106870. "str r4, [%[r], #112]\n\t"
  106871. /* A[13] * B[16] */
  106872. "ldr r8, [%[a], #52]\n\t"
  106873. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106874. "lsl r6, r8, #16\n\t"
  106875. "lsl r7, r9, #16\n\t"
  106876. "lsr r6, r6, #16\n\t"
  106877. "lsr r7, r7, #16\n\t"
  106878. "mul r7, r6, r7\n\t"
  106879. "adds r5, r5, r7\n\t"
  106880. "adcs r3, r3, #0\n\t"
  106881. "mov r4, #0\n\t"
  106882. "adc r4, r4, #0\n\t"
  106883. "lsr r7, r9, #16\n\t"
  106884. "mul r6, r7, r6\n\t"
  106885. "lsr r7, r6, #16\n\t"
  106886. "lsl r6, r6, #16\n\t"
  106887. "adds r5, r5, r6\n\t"
  106888. "adcs r3, r3, r7\n\t"
  106889. "adc r4, r4, #0\n\t"
  106890. "lsr r6, r8, #16\n\t"
  106891. "lsr r7, r9, #16\n\t"
  106892. "mul r7, r6, r7\n\t"
  106893. "adds r3, r3, r7\n\t"
  106894. "adc r4, r4, #0\n\t"
  106895. "lsl r7, r9, #16\n\t"
  106896. "lsr r7, r7, #16\n\t"
  106897. "mul r6, r7, r6\n\t"
  106898. "lsr r7, r6, #16\n\t"
  106899. "lsl r6, r6, #16\n\t"
  106900. "adds r5, r5, r6\n\t"
  106901. "adcs r3, r3, r7\n\t"
  106902. "adc r4, r4, #0\n\t"
  106903. #else
  106904. "umull r6, r7, r8, r9\n\t"
  106905. "adds r5, r5, r6\n\t"
  106906. "adcs r3, r3, r7\n\t"
  106907. "mov r4, #0\n\t"
  106908. "adc r4, r4, #0\n\t"
  106909. #endif
  106910. /* A[14] * B[15] */
  106911. "ldr r9, [%[b], #60]\n\t"
  106912. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106913. "lsl r6, r11, #16\n\t"
  106914. "lsl r7, r9, #16\n\t"
  106915. "lsr r6, r6, #16\n\t"
  106916. "lsr r7, r7, #16\n\t"
  106917. "mul r7, r6, r7\n\t"
  106918. "adds r5, r5, r7\n\t"
  106919. "adcs r3, r3, #0\n\t"
  106920. "adc r4, r4, #0\n\t"
  106921. "lsr r7, r9, #16\n\t"
  106922. "mul r6, r7, r6\n\t"
  106923. "lsr r7, r6, #16\n\t"
  106924. "lsl r6, r6, #16\n\t"
  106925. "adds r5, r5, r6\n\t"
  106926. "adcs r3, r3, r7\n\t"
  106927. "adc r4, r4, #0\n\t"
  106928. "lsr r6, r11, #16\n\t"
  106929. "lsr r7, r9, #16\n\t"
  106930. "mul r7, r6, r7\n\t"
  106931. "adds r3, r3, r7\n\t"
  106932. "adc r4, r4, #0\n\t"
  106933. "lsl r7, r9, #16\n\t"
  106934. "lsr r7, r7, #16\n\t"
  106935. "mul r6, r7, r6\n\t"
  106936. "lsr r7, r6, #16\n\t"
  106937. "lsl r6, r6, #16\n\t"
  106938. "adds r5, r5, r6\n\t"
  106939. "adcs r3, r3, r7\n\t"
  106940. "adc r4, r4, #0\n\t"
  106941. #else
  106942. "umull r6, r7, r11, r9\n\t"
  106943. "adds r5, r5, r6\n\t"
  106944. "adcs r3, r3, r7\n\t"
  106945. "adc r4, r4, #0\n\t"
  106946. #endif
  106947. /* A[15] * B[14] */
  106948. "ldr r8, [%[a], #60]\n\t"
  106949. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106950. "lsl r6, r8, #16\n\t"
  106951. "lsl r7, r12, #16\n\t"
  106952. "lsr r6, r6, #16\n\t"
  106953. "lsr r7, r7, #16\n\t"
  106954. "mul r7, r6, r7\n\t"
  106955. "adds r5, r5, r7\n\t"
  106956. "adcs r3, r3, #0\n\t"
  106957. "adc r4, r4, #0\n\t"
  106958. "lsr r7, r12, #16\n\t"
  106959. "mul r6, r7, r6\n\t"
  106960. "lsr r7, r6, #16\n\t"
  106961. "lsl r6, r6, #16\n\t"
  106962. "adds r5, r5, r6\n\t"
  106963. "adcs r3, r3, r7\n\t"
  106964. "adc r4, r4, #0\n\t"
  106965. "lsr r6, r8, #16\n\t"
  106966. "lsr r7, r12, #16\n\t"
  106967. "mul r7, r6, r7\n\t"
  106968. "adds r3, r3, r7\n\t"
  106969. "adc r4, r4, #0\n\t"
  106970. "lsl r7, r12, #16\n\t"
  106971. "lsr r7, r7, #16\n\t"
  106972. "mul r6, r7, r6\n\t"
  106973. "lsr r7, r6, #16\n\t"
  106974. "lsl r6, r6, #16\n\t"
  106975. "adds r5, r5, r6\n\t"
  106976. "adcs r3, r3, r7\n\t"
  106977. "adc r4, r4, #0\n\t"
  106978. #else
  106979. "umull r6, r7, r8, r12\n\t"
  106980. "adds r5, r5, r6\n\t"
  106981. "adcs r3, r3, r7\n\t"
  106982. "adc r4, r4, #0\n\t"
  106983. #endif
  106984. /* A[16] * B[13] */
  106985. "ldr r8, [%[a], #64]\n\t"
  106986. "ldr r9, [%[b], #52]\n\t"
  106987. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  106988. "lsl r6, r8, #16\n\t"
  106989. "lsl r7, r9, #16\n\t"
  106990. "lsr r6, r6, #16\n\t"
  106991. "lsr r7, r7, #16\n\t"
  106992. "mul r7, r6, r7\n\t"
  106993. "adds r5, r5, r7\n\t"
  106994. "adcs r3, r3, #0\n\t"
  106995. "adc r4, r4, #0\n\t"
  106996. "lsr r7, r9, #16\n\t"
  106997. "mul r6, r7, r6\n\t"
  106998. "lsr r7, r6, #16\n\t"
  106999. "lsl r6, r6, #16\n\t"
  107000. "adds r5, r5, r6\n\t"
  107001. "adcs r3, r3, r7\n\t"
  107002. "adc r4, r4, #0\n\t"
  107003. "lsr r6, r8, #16\n\t"
  107004. "lsr r7, r9, #16\n\t"
  107005. "mul r7, r6, r7\n\t"
  107006. "adds r3, r3, r7\n\t"
  107007. "adc r4, r4, #0\n\t"
  107008. "lsl r7, r9, #16\n\t"
  107009. "lsr r7, r7, #16\n\t"
  107010. "mul r6, r7, r6\n\t"
  107011. "lsr r7, r6, #16\n\t"
  107012. "lsl r6, r6, #16\n\t"
  107013. "adds r5, r5, r6\n\t"
  107014. "adcs r3, r3, r7\n\t"
  107015. "adc r4, r4, #0\n\t"
  107016. #else
  107017. "umull r6, r7, r8, r9\n\t"
  107018. "adds r5, r5, r6\n\t"
  107019. "adcs r3, r3, r7\n\t"
  107020. "adc r4, r4, #0\n\t"
  107021. #endif
  107022. "str r5, [%[r], #116]\n\t"
  107023. /* A[16] * B[14] */
  107024. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107025. "lsl r6, r8, #16\n\t"
  107026. "lsl r7, r12, #16\n\t"
  107027. "lsr r6, r6, #16\n\t"
  107028. "lsr r7, r7, #16\n\t"
  107029. "mul r7, r6, r7\n\t"
  107030. "adds r3, r3, r7\n\t"
  107031. "adcs r4, r4, #0\n\t"
  107032. "mov r5, #0\n\t"
  107033. "adc r5, r5, #0\n\t"
  107034. "lsr r7, r12, #16\n\t"
  107035. "mul r6, r7, r6\n\t"
  107036. "lsr r7, r6, #16\n\t"
  107037. "lsl r6, r6, #16\n\t"
  107038. "adds r3, r3, r6\n\t"
  107039. "adcs r4, r4, r7\n\t"
  107040. "adc r5, r5, #0\n\t"
  107041. "lsr r6, r8, #16\n\t"
  107042. "lsr r7, r12, #16\n\t"
  107043. "mul r7, r6, r7\n\t"
  107044. "adds r4, r4, r7\n\t"
  107045. "adc r5, r5, #0\n\t"
  107046. "lsl r7, r12, #16\n\t"
  107047. "lsr r7, r7, #16\n\t"
  107048. "mul r6, r7, r6\n\t"
  107049. "lsr r7, r6, #16\n\t"
  107050. "lsl r6, r6, #16\n\t"
  107051. "adds r3, r3, r6\n\t"
  107052. "adcs r4, r4, r7\n\t"
  107053. "adc r5, r5, #0\n\t"
  107054. #else
  107055. "umull r6, r7, r8, r12\n\t"
  107056. "adds r3, r3, r6\n\t"
  107057. "adcs r4, r4, r7\n\t"
  107058. "mov r5, #0\n\t"
  107059. "adc r5, r5, #0\n\t"
  107060. #endif
  107061. /* A[15] * B[15] */
  107062. "ldr r11, [%[a], #60]\n\t"
  107063. "ldr r12, [%[b], #60]\n\t"
  107064. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107065. "lsl r6, r11, #16\n\t"
  107066. "lsl r7, r12, #16\n\t"
  107067. "lsr r6, r6, #16\n\t"
  107068. "lsr r7, r7, #16\n\t"
  107069. "mul r7, r6, r7\n\t"
  107070. "adds r3, r3, r7\n\t"
  107071. "adcs r4, r4, #0\n\t"
  107072. "adc r5, r5, #0\n\t"
  107073. "lsr r7, r12, #16\n\t"
  107074. "mul r6, r7, r6\n\t"
  107075. "lsr r7, r6, #16\n\t"
  107076. "lsl r6, r6, #16\n\t"
  107077. "adds r3, r3, r6\n\t"
  107078. "adcs r4, r4, r7\n\t"
  107079. "adc r5, r5, #0\n\t"
  107080. "lsr r6, r11, #16\n\t"
  107081. "lsr r7, r12, #16\n\t"
  107082. "mul r7, r6, r7\n\t"
  107083. "adds r4, r4, r7\n\t"
  107084. "adc r5, r5, #0\n\t"
  107085. "lsl r7, r12, #16\n\t"
  107086. "lsr r7, r7, #16\n\t"
  107087. "mul r6, r7, r6\n\t"
  107088. "lsr r7, r6, #16\n\t"
  107089. "lsl r6, r6, #16\n\t"
  107090. "adds r3, r3, r6\n\t"
  107091. "adcs r4, r4, r7\n\t"
  107092. "adc r5, r5, #0\n\t"
  107093. #else
  107094. "umull r6, r7, r11, r12\n\t"
  107095. "adds r3, r3, r6\n\t"
  107096. "adcs r4, r4, r7\n\t"
  107097. "adc r5, r5, #0\n\t"
  107098. #endif
  107099. /* A[14] * B[16] */
  107100. "ldr r8, [%[a], #56]\n\t"
  107101. "ldr r9, [%[b], #64]\n\t"
  107102. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107103. "lsl r6, r8, #16\n\t"
  107104. "lsl r7, r9, #16\n\t"
  107105. "lsr r6, r6, #16\n\t"
  107106. "lsr r7, r7, #16\n\t"
  107107. "mul r7, r6, r7\n\t"
  107108. "adds r3, r3, r7\n\t"
  107109. "adcs r4, r4, #0\n\t"
  107110. "adc r5, r5, #0\n\t"
  107111. "lsr r7, r9, #16\n\t"
  107112. "mul r6, r7, r6\n\t"
  107113. "lsr r7, r6, #16\n\t"
  107114. "lsl r6, r6, #16\n\t"
  107115. "adds r3, r3, r6\n\t"
  107116. "adcs r4, r4, r7\n\t"
  107117. "adc r5, r5, #0\n\t"
  107118. "lsr r6, r8, #16\n\t"
  107119. "lsr r7, r9, #16\n\t"
  107120. "mul r7, r6, r7\n\t"
  107121. "adds r4, r4, r7\n\t"
  107122. "adc r5, r5, #0\n\t"
  107123. "lsl r7, r9, #16\n\t"
  107124. "lsr r7, r7, #16\n\t"
  107125. "mul r6, r7, r6\n\t"
  107126. "lsr r7, r6, #16\n\t"
  107127. "lsl r6, r6, #16\n\t"
  107128. "adds r3, r3, r6\n\t"
  107129. "adcs r4, r4, r7\n\t"
  107130. "adc r5, r5, #0\n\t"
  107131. #else
  107132. "umull r6, r7, r8, r9\n\t"
  107133. "adds r3, r3, r6\n\t"
  107134. "adcs r4, r4, r7\n\t"
  107135. "adc r5, r5, #0\n\t"
  107136. #endif
  107137. "str r3, [%[r], #120]\n\t"
  107138. /* A[15] * B[16] */
  107139. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107140. "lsl r6, r11, #16\n\t"
  107141. "lsl r7, r9, #16\n\t"
  107142. "lsr r6, r6, #16\n\t"
  107143. "lsr r7, r7, #16\n\t"
  107144. "mul r7, r6, r7\n\t"
  107145. "adds r4, r4, r7\n\t"
  107146. "adcs r5, r5, #0\n\t"
  107147. "mov r3, #0\n\t"
  107148. "adc r3, r3, #0\n\t"
  107149. "lsr r7, r9, #16\n\t"
  107150. "mul r6, r7, r6\n\t"
  107151. "lsr r7, r6, #16\n\t"
  107152. "lsl r6, r6, #16\n\t"
  107153. "adds r4, r4, r6\n\t"
  107154. "adcs r5, r5, r7\n\t"
  107155. "adc r3, r3, #0\n\t"
  107156. "lsr r6, r11, #16\n\t"
  107157. "lsr r7, r9, #16\n\t"
  107158. "mul r7, r6, r7\n\t"
  107159. "adds r5, r5, r7\n\t"
  107160. "adc r3, r3, #0\n\t"
  107161. "lsl r7, r9, #16\n\t"
  107162. "lsr r7, r7, #16\n\t"
  107163. "mul r6, r7, r6\n\t"
  107164. "lsr r7, r6, #16\n\t"
  107165. "lsl r6, r6, #16\n\t"
  107166. "adds r4, r4, r6\n\t"
  107167. "adcs r5, r5, r7\n\t"
  107168. "adc r3, r3, #0\n\t"
  107169. #else
  107170. "umull r6, r7, r11, r9\n\t"
  107171. "adds r4, r4, r6\n\t"
  107172. "adcs r5, r5, r7\n\t"
  107173. "mov r3, #0\n\t"
  107174. "adc r3, r3, #0\n\t"
  107175. #endif
  107176. /* A[16] * B[15] */
  107177. "ldr r8, [%[a], #64]\n\t"
  107178. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107179. "lsl r6, r8, #16\n\t"
  107180. "lsl r7, r12, #16\n\t"
  107181. "lsr r6, r6, #16\n\t"
  107182. "lsr r7, r7, #16\n\t"
  107183. "mul r7, r6, r7\n\t"
  107184. "adds r4, r4, r7\n\t"
  107185. "adcs r5, r5, #0\n\t"
  107186. "adc r3, r3, #0\n\t"
  107187. "lsr r7, r12, #16\n\t"
  107188. "mul r6, r7, r6\n\t"
  107189. "lsr r7, r6, #16\n\t"
  107190. "lsl r6, r6, #16\n\t"
  107191. "adds r4, r4, r6\n\t"
  107192. "adcs r5, r5, r7\n\t"
  107193. "adc r3, r3, #0\n\t"
  107194. "lsr r6, r8, #16\n\t"
  107195. "lsr r7, r12, #16\n\t"
  107196. "mul r7, r6, r7\n\t"
  107197. "adds r5, r5, r7\n\t"
  107198. "adc r3, r3, #0\n\t"
  107199. "lsl r7, r12, #16\n\t"
  107200. "lsr r7, r7, #16\n\t"
  107201. "mul r6, r7, r6\n\t"
  107202. "lsr r7, r6, #16\n\t"
  107203. "lsl r6, r6, #16\n\t"
  107204. "adds r4, r4, r6\n\t"
  107205. "adcs r5, r5, r7\n\t"
  107206. "adc r3, r3, #0\n\t"
  107207. #else
  107208. "umull r6, r7, r8, r12\n\t"
  107209. "adds r4, r4, r6\n\t"
  107210. "adcs r5, r5, r7\n\t"
  107211. "adc r3, r3, #0\n\t"
  107212. #endif
  107213. "str r4, [%[r], #124]\n\t"
  107214. /* A[16] * B[16] */
  107215. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107216. "lsl r6, r8, #16\n\t"
  107217. "lsl r7, r9, #16\n\t"
  107218. "lsr r6, r6, #16\n\t"
  107219. "lsr r7, r7, #16\n\t"
  107220. "mul r7, r6, r7\n\t"
  107221. "adds r5, r5, r7\n\t"
  107222. "adc r3, r3, #0\n\t"
  107223. "lsr r7, r9, #16\n\t"
  107224. "mul r6, r7, r6\n\t"
  107225. "lsr r7, r6, #16\n\t"
  107226. "lsl r6, r6, #16\n\t"
  107227. "adds r5, r5, r6\n\t"
  107228. "adc r3, r3, r7\n\t"
  107229. "lsr r6, r8, #16\n\t"
  107230. "lsr r7, r9, #16\n\t"
  107231. "mul r7, r6, r7\n\t"
  107232. "add r3, r3, r7\n\t"
  107233. "lsl r7, r9, #16\n\t"
  107234. "lsr r7, r7, #16\n\t"
  107235. "mul r6, r7, r6\n\t"
  107236. "lsr r7, r6, #16\n\t"
  107237. "lsl r6, r6, #16\n\t"
  107238. "adds r5, r5, r6\n\t"
  107239. "adc r3, r3, r7\n\t"
  107240. #else
  107241. "umlal r5, r3, r8, r9\n\t"
  107242. #endif
  107243. "str r5, [%[r], #128]\n\t"
  107244. "str r3, [%[r], #132]\n\t"
  107245. "ldm sp!, {r3, r4, r5, r6}\n\t"
  107246. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  107247. "ldm sp!, {r3, r4, r5, r6}\n\t"
  107248. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  107249. "ldm sp!, {r3, r4, r5, r6}\n\t"
  107250. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  107251. "ldm sp!, {r3, r4, r5, r6}\n\t"
  107252. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  107253. "ldm sp!, {r3}\n\t"
  107254. "stm %[r]!, {r3}\n\t"
  107255. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  107256. :
  107257. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  107258. );
  107259. }
  107260. #endif /* WOLFSSL_SP_SMALL */
  107261. #ifdef WOLFSSL_SP_SMALL
  107262. /* Square a and put result in r. (r = a * a)
  107263. *
  107264. * r A single precision integer.
  107265. * a A single precision integer.
  107266. */
  107267. static void sp_521_sqr_17(sp_digit* r_p, const sp_digit* a_p)
  107268. {
  107269. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  107270. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  107271. __asm__ __volatile__ (
  107272. "sub sp, sp, #0x88\n\t"
  107273. "ldr lr, [%[a]]\n\t"
  107274. "umull r8, r6, lr, lr\n\t"
  107275. "str r8, [sp]\n\t"
  107276. "mov r7, #0\n\t"
  107277. "mov r8, #0\n\t"
  107278. "mov r5, #4\n\t"
  107279. "\n"
  107280. "L_sp_521_sqr_17_outer_%=: \n\t"
  107281. "subs r3, r5, #0x40\n\t"
  107282. "it cc\n\t"
  107283. "movcc r3, #0\n\t"
  107284. "sub r4, r5, r3\n\t"
  107285. "\n"
  107286. "L_sp_521_sqr_17_inner_%=: \n\t"
  107287. "ldr lr, [%[a], r3]\n\t"
  107288. "ldr r11, [%[a], r4]\n\t"
  107289. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107290. "lsl r9, lr, #16\n\t"
  107291. "lsl r10, r11, #16\n\t"
  107292. "lsr r9, r9, #16\n\t"
  107293. "lsr r10, r10, #16\n\t"
  107294. "mul r10, r9, r10\n\t"
  107295. "adds r6, r6, r10\n\t"
  107296. "adcs r7, r7, #0\n\t"
  107297. "adc r8, r8, #0\n\t"
  107298. "adds r6, r6, r10\n\t"
  107299. "adcs r7, r7, #0\n\t"
  107300. "adc r8, r8, #0\n\t"
  107301. "lsr r10, r11, #16\n\t"
  107302. "mul r9, r10, r9\n\t"
  107303. "lsr r10, r9, #16\n\t"
  107304. "lsl r9, r9, #16\n\t"
  107305. "adds r6, r6, r9\n\t"
  107306. "adcs r7, r7, r10\n\t"
  107307. "adc r8, r8, #0\n\t"
  107308. "adds r6, r6, r9\n\t"
  107309. "adcs r7, r7, r10\n\t"
  107310. "adc r8, r8, #0\n\t"
  107311. "lsr r9, lr, #16\n\t"
  107312. "lsr r10, r11, #16\n\t"
  107313. "mul r10, r9, r10\n\t"
  107314. "adds r7, r7, r10\n\t"
  107315. "adc r8, r8, #0\n\t"
  107316. "adds r7, r7, r10\n\t"
  107317. "adc r8, r8, #0\n\t"
  107318. "lsl r10, r11, #16\n\t"
  107319. "lsr r10, r10, #16\n\t"
  107320. "mul r9, r10, r9\n\t"
  107321. "lsr r10, r9, #16\n\t"
  107322. "lsl r9, r9, #16\n\t"
  107323. "adds r6, r6, r9\n\t"
  107324. "adcs r7, r7, r10\n\t"
  107325. "adc r8, r8, #0\n\t"
  107326. "adds r6, r6, r9\n\t"
  107327. "adcs r7, r7, r10\n\t"
  107328. "adc r8, r8, #0\n\t"
  107329. #else
  107330. "umull r9, r10, lr, r11\n\t"
  107331. "adds r6, r6, r9\n\t"
  107332. "adcs r7, r7, r10\n\t"
  107333. "adc r8, r8, #0\n\t"
  107334. "adds r6, r6, r9\n\t"
  107335. "adcs r7, r7, r10\n\t"
  107336. "adc r8, r8, #0\n\t"
  107337. #endif
  107338. "add r3, r3, #4\n\t"
  107339. "sub r4, r4, #4\n\t"
  107340. "cmp r3, r4\n\t"
  107341. "bgt L_sp_521_sqr_17_inner_done_%=\n\t"
  107342. "blt L_sp_521_sqr_17_inner_%=\n\t"
  107343. "ldr lr, [%[a], r3]\n\t"
  107344. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107345. "lsl r9, lr, #16\n\t"
  107346. "lsr r10, lr, #16\n\t"
  107347. "lsr r9, r9, #16\n\t"
  107348. "mov r11, r9\n\t"
  107349. "mul r9, r11, r9\n\t"
  107350. "mov r11, r10\n\t"
  107351. "mul r10, r11, r10\n\t"
  107352. "adds r6, r6, r9\n\t"
  107353. "adcs r7, r7, r10\n\t"
  107354. "adc r8, r8, #0\n\t"
  107355. "lsr r10, lr, #16\n\t"
  107356. "lsl r9, lr, #16\n\t"
  107357. "lsr r9, r9, #16\n\t"
  107358. "mul r9, r10, r9\n\t"
  107359. "lsr r10, r9, #15\n\t"
  107360. "lsl r9, r9, #17\n\t"
  107361. "adds r6, r6, r9\n\t"
  107362. "adcs r7, r7, r10\n\t"
  107363. "adc r8, r8, #0\n\t"
  107364. #else
  107365. "umull r9, r10, lr, lr\n\t"
  107366. "adds r6, r6, r9\n\t"
  107367. "adcs r7, r7, r10\n\t"
  107368. "adc r8, r8, #0\n\t"
  107369. #endif
  107370. "\n"
  107371. "L_sp_521_sqr_17_inner_done_%=: \n\t"
  107372. "str r6, [sp, r5]\n\t"
  107373. "mov r6, r7\n\t"
  107374. "mov r7, r8\n\t"
  107375. "mov r8, #0\n\t"
  107376. "add r5, r5, #4\n\t"
  107377. "cmp r5, #0x7c\n\t"
  107378. "ble L_sp_521_sqr_17_outer_%=\n\t"
  107379. "ldr lr, [%[a], #64]\n\t"
  107380. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107381. "lsl r9, lr, #16\n\t"
  107382. "lsr r10, lr, #16\n\t"
  107383. "lsr r9, r9, #16\n\t"
  107384. "mov r11, r9\n\t"
  107385. "mul r9, r11, r9\n\t"
  107386. "mov r11, r10\n\t"
  107387. "mul r10, r11, r10\n\t"
  107388. "adds r6, r6, r9\n\t"
  107389. "adc r7, r7, r10\n\t"
  107390. "lsr r10, lr, #16\n\t"
  107391. "lsl r9, lr, #16\n\t"
  107392. "lsr r9, r9, #16\n\t"
  107393. "mul r9, r10, r9\n\t"
  107394. "lsr r10, r9, #15\n\t"
  107395. "lsl r9, r9, #17\n\t"
  107396. "adds r6, r6, r9\n\t"
  107397. "adc r7, r7, r10\n\t"
  107398. #else
  107399. "umull r9, r10, lr, lr\n\t"
  107400. "adds r6, r6, r9\n\t"
  107401. "adc r7, r7, r10\n\t"
  107402. #endif
  107403. "str r6, [sp, r5]\n\t"
  107404. "add r5, r5, #4\n\t"
  107405. "str r7, [sp, r5]\n\t"
  107406. "ldm sp!, {r6, r7}\n\t"
  107407. "stm %[r]!, {r6, r7}\n\t"
  107408. "sub r5, r5, #8\n\t"
  107409. "\n"
  107410. "L_sp_521_sqr_17_store_%=: \n\t"
  107411. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  107412. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  107413. "subs r5, r5, #32\n\t"
  107414. "bgt L_sp_521_sqr_17_store_%=\n\t"
  107415. : [r] "+r" (r), [a] "+r" (a)
  107416. :
  107417. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  107418. );
  107419. }
  107420. #else
  107421. /* Square a and put result in r. (r = a * a)
  107422. *
  107423. * r A single precision integer.
  107424. * a A single precision integer.
  107425. */
  107426. static void sp_521_sqr_17(sp_digit* r_p, const sp_digit* a_p)
  107427. {
  107428. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  107429. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  107430. __asm__ __volatile__ (
  107431. "sub sp, sp, #0x44\n\t"
  107432. /* A[0] * A[0] */
  107433. "ldr r10, [%[a]]\n\t"
  107434. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107435. "lsr r9, r10, #16\n\t"
  107436. "lsl r2, r10, #16\n\t"
  107437. "lsr r2, r2, #16\n\t"
  107438. "mul r8, r2, r2\n\t"
  107439. "mul r3, r9, r9\n\t"
  107440. "mul r2, r9, r2\n\t"
  107441. "lsr r9, r2, #15\n\t"
  107442. "lsl r2, r2, #17\n\t"
  107443. "adds r8, r8, r2\n\t"
  107444. "adc r3, r3, r9\n\t"
  107445. #else
  107446. "umull r8, r3, r10, r10\n\t"
  107447. #endif
  107448. "mov r4, #0\n\t"
  107449. "str r8, [sp]\n\t"
  107450. /* A[0] * A[1] */
  107451. "ldr r10, [%[a], #4]\n\t"
  107452. "ldr r12, [%[a]]\n\t"
  107453. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107454. "lsl r8, r10, #16\n\t"
  107455. "lsl r9, r12, #16\n\t"
  107456. "lsr r8, r8, #16\n\t"
  107457. "lsr r9, r9, #16\n\t"
  107458. "mul r9, r8, r9\n\t"
  107459. "adds r3, r3, r9\n\t"
  107460. "adcs r4, r4, #0\n\t"
  107461. "mov r2, #0\n\t"
  107462. "adc r2, r2, #0\n\t"
  107463. "adds r3, r3, r9\n\t"
  107464. "adcs r4, r4, #0\n\t"
  107465. "adc r2, r2, #0\n\t"
  107466. "lsr r9, r12, #16\n\t"
  107467. "mul r8, r9, r8\n\t"
  107468. "lsr r9, r8, #16\n\t"
  107469. "lsl r8, r8, #16\n\t"
  107470. "adds r3, r3, r8\n\t"
  107471. "adcs r4, r4, r9\n\t"
  107472. "adc r2, r2, #0\n\t"
  107473. "adds r3, r3, r8\n\t"
  107474. "adcs r4, r4, r9\n\t"
  107475. "adc r2, r2, #0\n\t"
  107476. "lsr r8, r10, #16\n\t"
  107477. "lsr r9, r12, #16\n\t"
  107478. "mul r9, r8, r9\n\t"
  107479. "adds r4, r4, r9\n\t"
  107480. "adc r2, r2, #0\n\t"
  107481. "adds r4, r4, r9\n\t"
  107482. "adc r2, r2, #0\n\t"
  107483. "lsl r9, r12, #16\n\t"
  107484. "lsr r9, r9, #16\n\t"
  107485. "mul r8, r9, r8\n\t"
  107486. "lsr r9, r8, #16\n\t"
  107487. "lsl r8, r8, #16\n\t"
  107488. "adds r3, r3, r8\n\t"
  107489. "adcs r4, r4, r9\n\t"
  107490. "adc r2, r2, #0\n\t"
  107491. "adds r3, r3, r8\n\t"
  107492. "adcs r4, r4, r9\n\t"
  107493. "adc r2, r2, #0\n\t"
  107494. #else
  107495. "umull r8, r9, r10, r12\n\t"
  107496. "adds r3, r3, r8\n\t"
  107497. "adcs r4, r4, r9\n\t"
  107498. "mov r2, #0\n\t"
  107499. "adc r2, r2, #0\n\t"
  107500. "adds r3, r3, r8\n\t"
  107501. "adcs r4, r4, r9\n\t"
  107502. "mov r2, #0\n\t"
  107503. "adc r2, r2, #0\n\t"
  107504. #endif
  107505. "str r3, [sp, #4]\n\t"
  107506. /* A[0] * A[2] */
  107507. "ldr r10, [%[a], #8]\n\t"
  107508. "ldr r12, [%[a]]\n\t"
  107509. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107510. "lsl r8, r10, #16\n\t"
  107511. "lsl r9, r12, #16\n\t"
  107512. "lsr r8, r8, #16\n\t"
  107513. "lsr r9, r9, #16\n\t"
  107514. "mul r9, r8, r9\n\t"
  107515. "adds r4, r4, r9\n\t"
  107516. "adcs r2, r2, #0\n\t"
  107517. "mov r3, #0\n\t"
  107518. "adc r3, r3, #0\n\t"
  107519. "adds r4, r4, r9\n\t"
  107520. "adcs r2, r2, #0\n\t"
  107521. "adc r3, r3, #0\n\t"
  107522. "lsr r9, r12, #16\n\t"
  107523. "mul r8, r9, r8\n\t"
  107524. "lsr r9, r8, #16\n\t"
  107525. "lsl r8, r8, #16\n\t"
  107526. "adds r4, r4, r8\n\t"
  107527. "adcs r2, r2, r9\n\t"
  107528. "adc r3, r3, #0\n\t"
  107529. "adds r4, r4, r8\n\t"
  107530. "adcs r2, r2, r9\n\t"
  107531. "adc r3, r3, #0\n\t"
  107532. "lsr r8, r10, #16\n\t"
  107533. "lsr r9, r12, #16\n\t"
  107534. "mul r9, r8, r9\n\t"
  107535. "adds r2, r2, r9\n\t"
  107536. "adc r3, r3, #0\n\t"
  107537. "adds r2, r2, r9\n\t"
  107538. "adc r3, r3, #0\n\t"
  107539. "lsl r9, r12, #16\n\t"
  107540. "lsr r9, r9, #16\n\t"
  107541. "mul r8, r9, r8\n\t"
  107542. "lsr r9, r8, #16\n\t"
  107543. "lsl r8, r8, #16\n\t"
  107544. "adds r4, r4, r8\n\t"
  107545. "adcs r2, r2, r9\n\t"
  107546. "adc r3, r3, #0\n\t"
  107547. "adds r4, r4, r8\n\t"
  107548. "adcs r2, r2, r9\n\t"
  107549. "adc r3, r3, #0\n\t"
  107550. #else
  107551. "umull r8, r9, r10, r12\n\t"
  107552. "adds r4, r4, r8\n\t"
  107553. "adcs r2, r2, r9\n\t"
  107554. "mov r3, #0\n\t"
  107555. "adc r3, r3, #0\n\t"
  107556. "adds r4, r4, r8\n\t"
  107557. "adcs r2, r2, r9\n\t"
  107558. "mov r3, #0\n\t"
  107559. "adc r3, r3, #0\n\t"
  107560. #endif
  107561. /* A[1] * A[1] */
  107562. "ldr r10, [%[a], #4]\n\t"
  107563. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107564. "lsl r8, r10, #16\n\t"
  107565. "lsr r9, r10, #16\n\t"
  107566. "lsr r8, r8, #16\n\t"
  107567. "mov r12, r8\n\t"
  107568. "mul r8, r12, r8\n\t"
  107569. "mov r12, r9\n\t"
  107570. "mul r9, r12, r9\n\t"
  107571. "adds r4, r4, r8\n\t"
  107572. "adcs r2, r2, r9\n\t"
  107573. "adc r3, r3, #0\n\t"
  107574. "lsr r9, r10, #16\n\t"
  107575. "lsl r8, r10, #16\n\t"
  107576. "lsr r8, r8, #16\n\t"
  107577. "mul r8, r9, r8\n\t"
  107578. "lsr r9, r8, #15\n\t"
  107579. "lsl r8, r8, #17\n\t"
  107580. "adds r4, r4, r8\n\t"
  107581. "adcs r2, r2, r9\n\t"
  107582. "adc r3, r3, #0\n\t"
  107583. #else
  107584. "umull r8, r9, r10, r10\n\t"
  107585. "adds r4, r4, r8\n\t"
  107586. "adcs r2, r2, r9\n\t"
  107587. "adc r3, r3, #0\n\t"
  107588. #endif
  107589. "str r4, [sp, #8]\n\t"
  107590. /* A[0] * A[3] */
  107591. "ldr r10, [%[a], #12]\n\t"
  107592. "ldr r12, [%[a]]\n\t"
  107593. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107594. "lsl r8, r10, #16\n\t"
  107595. "lsl r9, r12, #16\n\t"
  107596. "lsr r8, r8, #16\n\t"
  107597. "lsr r9, r9, #16\n\t"
  107598. "mul r9, r8, r9\n\t"
  107599. "adds r2, r2, r9\n\t"
  107600. "adcs r3, r3, #0\n\t"
  107601. "mov r4, #0\n\t"
  107602. "adc r4, r4, #0\n\t"
  107603. "adds r2, r2, r9\n\t"
  107604. "adcs r3, r3, #0\n\t"
  107605. "adc r4, r4, #0\n\t"
  107606. "lsr r9, r12, #16\n\t"
  107607. "mul r8, r9, r8\n\t"
  107608. "lsr r9, r8, #16\n\t"
  107609. "lsl r8, r8, #16\n\t"
  107610. "adds r2, r2, r8\n\t"
  107611. "adcs r3, r3, r9\n\t"
  107612. "adc r4, r4, #0\n\t"
  107613. "adds r2, r2, r8\n\t"
  107614. "adcs r3, r3, r9\n\t"
  107615. "adc r4, r4, #0\n\t"
  107616. "lsr r8, r10, #16\n\t"
  107617. "lsr r9, r12, #16\n\t"
  107618. "mul r9, r8, r9\n\t"
  107619. "adds r3, r3, r9\n\t"
  107620. "adc r4, r4, #0\n\t"
  107621. "adds r3, r3, r9\n\t"
  107622. "adc r4, r4, #0\n\t"
  107623. "lsl r9, r12, #16\n\t"
  107624. "lsr r9, r9, #16\n\t"
  107625. "mul r8, r9, r8\n\t"
  107626. "lsr r9, r8, #16\n\t"
  107627. "lsl r8, r8, #16\n\t"
  107628. "adds r2, r2, r8\n\t"
  107629. "adcs r3, r3, r9\n\t"
  107630. "adc r4, r4, #0\n\t"
  107631. "adds r2, r2, r8\n\t"
  107632. "adcs r3, r3, r9\n\t"
  107633. "adc r4, r4, #0\n\t"
  107634. #else
  107635. "umull r8, r9, r10, r12\n\t"
  107636. "adds r2, r2, r8\n\t"
  107637. "adcs r3, r3, r9\n\t"
  107638. "mov r4, #0\n\t"
  107639. "adc r4, r4, #0\n\t"
  107640. "adds r2, r2, r8\n\t"
  107641. "adcs r3, r3, r9\n\t"
  107642. "mov r4, #0\n\t"
  107643. "adc r4, r4, #0\n\t"
  107644. #endif
  107645. /* A[1] * A[2] */
  107646. "ldr r10, [%[a], #8]\n\t"
  107647. "ldr r12, [%[a], #4]\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. "adc r4, r4, #0\n\t"
  107657. "adds r2, r2, r9\n\t"
  107658. "adcs r3, r3, #0\n\t"
  107659. "adc r4, r4, #0\n\t"
  107660. "lsr r9, r12, #16\n\t"
  107661. "mul r8, r9, r8\n\t"
  107662. "lsr r9, r8, #16\n\t"
  107663. "lsl r8, r8, #16\n\t"
  107664. "adds r2, r2, r8\n\t"
  107665. "adcs r3, r3, r9\n\t"
  107666. "adc r4, r4, #0\n\t"
  107667. "adds r2, r2, r8\n\t"
  107668. "adcs r3, r3, r9\n\t"
  107669. "adc r4, r4, #0\n\t"
  107670. "lsr r8, r10, #16\n\t"
  107671. "lsr r9, r12, #16\n\t"
  107672. "mul r9, r8, r9\n\t"
  107673. "adds r3, r3, r9\n\t"
  107674. "adc r4, r4, #0\n\t"
  107675. "adds r3, r3, r9\n\t"
  107676. "adc r4, r4, #0\n\t"
  107677. "lsl r9, r12, #16\n\t"
  107678. "lsr r9, r9, #16\n\t"
  107679. "mul r8, r9, r8\n\t"
  107680. "lsr r9, r8, #16\n\t"
  107681. "lsl r8, r8, #16\n\t"
  107682. "adds r2, r2, r8\n\t"
  107683. "adcs r3, r3, r9\n\t"
  107684. "adc r4, r4, #0\n\t"
  107685. "adds r2, r2, r8\n\t"
  107686. "adcs r3, r3, r9\n\t"
  107687. "adc r4, r4, #0\n\t"
  107688. #else
  107689. "umull r8, r9, r10, r12\n\t"
  107690. "adds r2, r2, r8\n\t"
  107691. "adcs r3, r3, r9\n\t"
  107692. "adc r4, r4, #0\n\t"
  107693. "adds r2, r2, r8\n\t"
  107694. "adcs r3, r3, r9\n\t"
  107695. "adc r4, r4, #0\n\t"
  107696. #endif
  107697. "str r2, [sp, #12]\n\t"
  107698. /* A[0] * A[4] */
  107699. "ldr r10, [%[a], #16]\n\t"
  107700. "ldr r12, [%[a]]\n\t"
  107701. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107702. "lsl r8, r10, #16\n\t"
  107703. "lsl r9, r12, #16\n\t"
  107704. "lsr r8, r8, #16\n\t"
  107705. "lsr r9, r9, #16\n\t"
  107706. "mul r9, r8, r9\n\t"
  107707. "adds r3, r3, r9\n\t"
  107708. "adcs r4, r4, #0\n\t"
  107709. "mov r2, #0\n\t"
  107710. "adc r2, r2, #0\n\t"
  107711. "adds r3, r3, r9\n\t"
  107712. "adcs r4, r4, #0\n\t"
  107713. "adc r2, r2, #0\n\t"
  107714. "lsr r9, r12, #16\n\t"
  107715. "mul r8, r9, r8\n\t"
  107716. "lsr r9, r8, #16\n\t"
  107717. "lsl r8, r8, #16\n\t"
  107718. "adds r3, r3, r8\n\t"
  107719. "adcs r4, r4, r9\n\t"
  107720. "adc r2, r2, #0\n\t"
  107721. "adds r3, r3, r8\n\t"
  107722. "adcs r4, r4, r9\n\t"
  107723. "adc r2, r2, #0\n\t"
  107724. "lsr r8, r10, #16\n\t"
  107725. "lsr r9, r12, #16\n\t"
  107726. "mul r9, r8, r9\n\t"
  107727. "adds r4, r4, r9\n\t"
  107728. "adc r2, r2, #0\n\t"
  107729. "adds r4, r4, r9\n\t"
  107730. "adc r2, r2, #0\n\t"
  107731. "lsl r9, r12, #16\n\t"
  107732. "lsr r9, r9, #16\n\t"
  107733. "mul r8, r9, r8\n\t"
  107734. "lsr r9, r8, #16\n\t"
  107735. "lsl r8, r8, #16\n\t"
  107736. "adds r3, r3, r8\n\t"
  107737. "adcs r4, r4, r9\n\t"
  107738. "adc r2, r2, #0\n\t"
  107739. "adds r3, r3, r8\n\t"
  107740. "adcs r4, r4, r9\n\t"
  107741. "adc r2, r2, #0\n\t"
  107742. #else
  107743. "umull r8, r9, r10, r12\n\t"
  107744. "adds r3, r3, r8\n\t"
  107745. "adcs r4, r4, r9\n\t"
  107746. "mov r2, #0\n\t"
  107747. "adc r2, r2, #0\n\t"
  107748. "adds r3, r3, r8\n\t"
  107749. "adcs r4, r4, r9\n\t"
  107750. "mov r2, #0\n\t"
  107751. "adc r2, r2, #0\n\t"
  107752. #endif
  107753. /* A[1] * A[3] */
  107754. "ldr r10, [%[a], #12]\n\t"
  107755. "ldr r12, [%[a], #4]\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. "adc r2, r2, #0\n\t"
  107765. "adds r3, r3, r9\n\t"
  107766. "adcs r4, r4, #0\n\t"
  107767. "adc r2, r2, #0\n\t"
  107768. "lsr r9, r12, #16\n\t"
  107769. "mul r8, r9, r8\n\t"
  107770. "lsr r9, r8, #16\n\t"
  107771. "lsl r8, r8, #16\n\t"
  107772. "adds r3, r3, r8\n\t"
  107773. "adcs r4, r4, r9\n\t"
  107774. "adc r2, r2, #0\n\t"
  107775. "adds r3, r3, r8\n\t"
  107776. "adcs r4, r4, r9\n\t"
  107777. "adc r2, r2, #0\n\t"
  107778. "lsr r8, r10, #16\n\t"
  107779. "lsr r9, r12, #16\n\t"
  107780. "mul r9, r8, r9\n\t"
  107781. "adds r4, r4, r9\n\t"
  107782. "adc r2, r2, #0\n\t"
  107783. "adds r4, r4, r9\n\t"
  107784. "adc r2, r2, #0\n\t"
  107785. "lsl r9, r12, #16\n\t"
  107786. "lsr r9, r9, #16\n\t"
  107787. "mul r8, r9, r8\n\t"
  107788. "lsr r9, r8, #16\n\t"
  107789. "lsl r8, r8, #16\n\t"
  107790. "adds r3, r3, r8\n\t"
  107791. "adcs r4, r4, r9\n\t"
  107792. "adc r2, r2, #0\n\t"
  107793. "adds r3, r3, r8\n\t"
  107794. "adcs r4, r4, r9\n\t"
  107795. "adc r2, r2, #0\n\t"
  107796. #else
  107797. "umull r8, r9, r10, r12\n\t"
  107798. "adds r3, r3, r8\n\t"
  107799. "adcs r4, r4, r9\n\t"
  107800. "adc r2, r2, #0\n\t"
  107801. "adds r3, r3, r8\n\t"
  107802. "adcs r4, r4, r9\n\t"
  107803. "adc r2, r2, #0\n\t"
  107804. #endif
  107805. /* A[2] * A[2] */
  107806. "ldr r10, [%[a], #8]\n\t"
  107807. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107808. "lsl r8, r10, #16\n\t"
  107809. "lsr r9, r10, #16\n\t"
  107810. "lsr r8, r8, #16\n\t"
  107811. "mov r12, r8\n\t"
  107812. "mul r8, r12, r8\n\t"
  107813. "mov r12, r9\n\t"
  107814. "mul r9, r12, r9\n\t"
  107815. "adds r3, r3, r8\n\t"
  107816. "adcs r4, r4, r9\n\t"
  107817. "adc r2, r2, #0\n\t"
  107818. "lsr r9, r10, #16\n\t"
  107819. "lsl r8, r10, #16\n\t"
  107820. "lsr r8, r8, #16\n\t"
  107821. "mul r8, r9, r8\n\t"
  107822. "lsr r9, r8, #15\n\t"
  107823. "lsl r8, r8, #17\n\t"
  107824. "adds r3, r3, r8\n\t"
  107825. "adcs r4, r4, r9\n\t"
  107826. "adc r2, r2, #0\n\t"
  107827. #else
  107828. "umull r8, r9, r10, r10\n\t"
  107829. "adds r3, r3, r8\n\t"
  107830. "adcs r4, r4, r9\n\t"
  107831. "adc r2, r2, #0\n\t"
  107832. #endif
  107833. "str r3, [sp, #16]\n\t"
  107834. /* A[0] * A[5] */
  107835. "ldr r10, [%[a], #20]\n\t"
  107836. "ldr r12, [%[a]]\n\t"
  107837. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107838. "lsl r8, r10, #16\n\t"
  107839. "lsl r5, r12, #16\n\t"
  107840. "lsr r8, r8, #16\n\t"
  107841. "lsr r5, r5, #16\n\t"
  107842. "mul r5, r8, r5\n\t"
  107843. "lsr r9, r12, #16\n\t"
  107844. "mul r8, r9, r8\n\t"
  107845. "lsr r6, r8, #16\n\t"
  107846. "lsl r8, r8, #16\n\t"
  107847. "adds r5, r5, r8\n\t"
  107848. "adc r6, r6, #0\n\t"
  107849. "lsr r8, r10, #16\n\t"
  107850. "mul r9, r8, r9\n\t"
  107851. "add r6, r6, r9\n\t"
  107852. "lsl r9, r12, #16\n\t"
  107853. "lsr r9, r9, #16\n\t"
  107854. "mul r8, r9, r8\n\t"
  107855. "lsr r9, r8, #16\n\t"
  107856. "lsl r8, r8, #16\n\t"
  107857. "adds r5, r5, r8\n\t"
  107858. "adc r6, r6, r9\n\t"
  107859. #else
  107860. "umull r5, r6, r10, r12\n\t"
  107861. #endif
  107862. "mov r3, #0\n\t"
  107863. "mov r7, #0\n\t"
  107864. /* A[1] * A[4] */
  107865. "ldr r10, [%[a], #16]\n\t"
  107866. "ldr r12, [%[a], #4]\n\t"
  107867. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107868. "lsl r8, r10, #16\n\t"
  107869. "lsl r9, r12, #16\n\t"
  107870. "lsr r8, r8, #16\n\t"
  107871. "lsr r9, r9, #16\n\t"
  107872. "mul r9, r8, r9\n\t"
  107873. "adds r5, r5, r9\n\t"
  107874. "adcs r6, r6, #0\n\t"
  107875. "adc r7, r7, #0\n\t"
  107876. "lsr r9, r12, #16\n\t"
  107877. "mul r8, r9, r8\n\t"
  107878. "lsr r9, r8, #16\n\t"
  107879. "lsl r8, r8, #16\n\t"
  107880. "adds r5, r5, r8\n\t"
  107881. "adcs r6, r6, r9\n\t"
  107882. "adc r7, r7, #0\n\t"
  107883. "lsr r8, r10, #16\n\t"
  107884. "lsr r9, r12, #16\n\t"
  107885. "mul r9, r8, r9\n\t"
  107886. "adds r6, r6, r9\n\t"
  107887. "adc r7, r7, #0\n\t"
  107888. "lsl r9, r12, #16\n\t"
  107889. "lsr r9, r9, #16\n\t"
  107890. "mul r8, r9, r8\n\t"
  107891. "lsr r9, r8, #16\n\t"
  107892. "lsl r8, r8, #16\n\t"
  107893. "adds r5, r5, r8\n\t"
  107894. "adcs r6, r6, r9\n\t"
  107895. "adc r7, r7, #0\n\t"
  107896. #else
  107897. "umull r8, r9, r10, r12\n\t"
  107898. "adds r5, r5, r8\n\t"
  107899. "adcs r6, r6, r9\n\t"
  107900. "adc r7, r7, #0\n\t"
  107901. #endif
  107902. /* A[2] * A[3] */
  107903. "ldr r10, [%[a], #12]\n\t"
  107904. "ldr r12, [%[a], #8]\n\t"
  107905. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107906. "lsl r8, r10, #16\n\t"
  107907. "lsl r9, r12, #16\n\t"
  107908. "lsr r8, r8, #16\n\t"
  107909. "lsr r9, r9, #16\n\t"
  107910. "mul r9, r8, r9\n\t"
  107911. "adds r5, r5, r9\n\t"
  107912. "adcs r6, r6, #0\n\t"
  107913. "adc r7, r7, #0\n\t"
  107914. "lsr r9, r12, #16\n\t"
  107915. "mul r8, r9, r8\n\t"
  107916. "lsr r9, r8, #16\n\t"
  107917. "lsl r8, r8, #16\n\t"
  107918. "adds r5, r5, r8\n\t"
  107919. "adcs r6, r6, r9\n\t"
  107920. "adc r7, r7, #0\n\t"
  107921. "lsr r8, r10, #16\n\t"
  107922. "lsr r9, r12, #16\n\t"
  107923. "mul r9, r8, r9\n\t"
  107924. "adds r6, r6, r9\n\t"
  107925. "adc r7, r7, #0\n\t"
  107926. "lsl r9, r12, #16\n\t"
  107927. "lsr r9, r9, #16\n\t"
  107928. "mul r8, r9, r8\n\t"
  107929. "lsr r9, r8, #16\n\t"
  107930. "lsl r8, r8, #16\n\t"
  107931. "adds r5, r5, r8\n\t"
  107932. "adcs r6, r6, r9\n\t"
  107933. "adc r7, r7, #0\n\t"
  107934. #else
  107935. "umull r8, r9, r10, r12\n\t"
  107936. "adds r5, r5, r8\n\t"
  107937. "adcs r6, r6, r9\n\t"
  107938. "adc r7, r7, #0\n\t"
  107939. #endif
  107940. "adds r5, r5, r5\n\t"
  107941. "adcs r6, r6, r6\n\t"
  107942. "adc r7, r7, r7\n\t"
  107943. "adds r4, r4, r5\n\t"
  107944. "adcs r2, r2, r6\n\t"
  107945. "adc r3, r3, r7\n\t"
  107946. "str r4, [sp, #20]\n\t"
  107947. /* A[0] * A[6] */
  107948. "ldr r10, [%[a], #24]\n\t"
  107949. "ldr r12, [%[a]]\n\t"
  107950. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107951. "lsl r8, r10, #16\n\t"
  107952. "lsl r5, r12, #16\n\t"
  107953. "lsr r8, r8, #16\n\t"
  107954. "lsr r5, r5, #16\n\t"
  107955. "mul r5, r8, r5\n\t"
  107956. "lsr r9, r12, #16\n\t"
  107957. "mul r8, r9, r8\n\t"
  107958. "lsr r6, r8, #16\n\t"
  107959. "lsl r8, r8, #16\n\t"
  107960. "adds r5, r5, r8\n\t"
  107961. "adc r6, r6, #0\n\t"
  107962. "lsr r8, r10, #16\n\t"
  107963. "mul r9, r8, r9\n\t"
  107964. "add r6, r6, r9\n\t"
  107965. "lsl r9, r12, #16\n\t"
  107966. "lsr r9, r9, #16\n\t"
  107967. "mul r8, r9, r8\n\t"
  107968. "lsr r9, r8, #16\n\t"
  107969. "lsl r8, r8, #16\n\t"
  107970. "adds r5, r5, r8\n\t"
  107971. "adc r6, r6, r9\n\t"
  107972. #else
  107973. "umull r5, r6, r10, r12\n\t"
  107974. #endif
  107975. "mov r4, #0\n\t"
  107976. "mov r7, #0\n\t"
  107977. /* A[1] * A[5] */
  107978. "ldr r10, [%[a], #20]\n\t"
  107979. "ldr r12, [%[a], #4]\n\t"
  107980. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  107981. "lsl r8, r10, #16\n\t"
  107982. "lsl r9, r12, #16\n\t"
  107983. "lsr r8, r8, #16\n\t"
  107984. "lsr r9, r9, #16\n\t"
  107985. "mul r9, r8, r9\n\t"
  107986. "adds r5, r5, r9\n\t"
  107987. "adcs r6, r6, #0\n\t"
  107988. "adc r7, r7, #0\n\t"
  107989. "lsr r9, r12, #16\n\t"
  107990. "mul r8, r9, r8\n\t"
  107991. "lsr r9, r8, #16\n\t"
  107992. "lsl r8, r8, #16\n\t"
  107993. "adds r5, r5, r8\n\t"
  107994. "adcs r6, r6, r9\n\t"
  107995. "adc r7, r7, #0\n\t"
  107996. "lsr r8, r10, #16\n\t"
  107997. "lsr r9, r12, #16\n\t"
  107998. "mul r9, r8, r9\n\t"
  107999. "adds r6, r6, r9\n\t"
  108000. "adc r7, r7, #0\n\t"
  108001. "lsl r9, r12, #16\n\t"
  108002. "lsr r9, r9, #16\n\t"
  108003. "mul r8, r9, r8\n\t"
  108004. "lsr r9, r8, #16\n\t"
  108005. "lsl r8, r8, #16\n\t"
  108006. "adds r5, r5, r8\n\t"
  108007. "adcs r6, r6, r9\n\t"
  108008. "adc r7, r7, #0\n\t"
  108009. #else
  108010. "umull r8, r9, r10, r12\n\t"
  108011. "adds r5, r5, r8\n\t"
  108012. "adcs r6, r6, r9\n\t"
  108013. "adc r7, r7, #0\n\t"
  108014. #endif
  108015. /* A[2] * A[4] */
  108016. "ldr r10, [%[a], #16]\n\t"
  108017. "ldr r12, [%[a], #8]\n\t"
  108018. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108019. "lsl r8, r10, #16\n\t"
  108020. "lsl r9, r12, #16\n\t"
  108021. "lsr r8, r8, #16\n\t"
  108022. "lsr r9, r9, #16\n\t"
  108023. "mul r9, r8, r9\n\t"
  108024. "adds r5, r5, r9\n\t"
  108025. "adcs r6, r6, #0\n\t"
  108026. "adc r7, r7, #0\n\t"
  108027. "lsr r9, r12, #16\n\t"
  108028. "mul r8, r9, r8\n\t"
  108029. "lsr r9, r8, #16\n\t"
  108030. "lsl r8, r8, #16\n\t"
  108031. "adds r5, r5, r8\n\t"
  108032. "adcs r6, r6, r9\n\t"
  108033. "adc r7, r7, #0\n\t"
  108034. "lsr r8, r10, #16\n\t"
  108035. "lsr r9, r12, #16\n\t"
  108036. "mul r9, r8, r9\n\t"
  108037. "adds r6, r6, r9\n\t"
  108038. "adc r7, r7, #0\n\t"
  108039. "lsl r9, r12, #16\n\t"
  108040. "lsr r9, r9, #16\n\t"
  108041. "mul r8, r9, r8\n\t"
  108042. "lsr r9, r8, #16\n\t"
  108043. "lsl r8, r8, #16\n\t"
  108044. "adds r5, r5, r8\n\t"
  108045. "adcs r6, r6, r9\n\t"
  108046. "adc r7, r7, #0\n\t"
  108047. #else
  108048. "umull r8, r9, r10, r12\n\t"
  108049. "adds r5, r5, r8\n\t"
  108050. "adcs r6, r6, r9\n\t"
  108051. "adc r7, r7, #0\n\t"
  108052. #endif
  108053. /* A[3] * A[3] */
  108054. "ldr r10, [%[a], #12]\n\t"
  108055. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108056. "lsl r8, r10, #16\n\t"
  108057. "lsr r9, r10, #16\n\t"
  108058. "lsr r8, r8, #16\n\t"
  108059. "mov r12, r8\n\t"
  108060. "mul r8, r12, r8\n\t"
  108061. "mov r12, r9\n\t"
  108062. "mul r9, r12, r9\n\t"
  108063. "adds r2, r2, r8\n\t"
  108064. "adcs r3, r3, r9\n\t"
  108065. "adc r4, r4, #0\n\t"
  108066. "lsr r9, r10, #16\n\t"
  108067. "lsl r8, r10, #16\n\t"
  108068. "lsr r8, r8, #16\n\t"
  108069. "mul r8, r9, r8\n\t"
  108070. "lsr r9, r8, #15\n\t"
  108071. "lsl r8, r8, #17\n\t"
  108072. "adds r2, r2, r8\n\t"
  108073. "adcs r3, r3, r9\n\t"
  108074. "adc r4, r4, #0\n\t"
  108075. "adds r5, r5, r5\n\t"
  108076. "adcs r6, r6, r6\n\t"
  108077. "adc r7, r7, r7\n\t"
  108078. #else
  108079. "umull r8, r9, r10, r10\n\t"
  108080. "adds r5, r5, r5\n\t"
  108081. "adcs r6, r6, r6\n\t"
  108082. "adc r7, r7, r7\n\t"
  108083. "adds r2, r2, r8\n\t"
  108084. "adcs r3, r3, r9\n\t"
  108085. "adc r4, r4, #0\n\t"
  108086. #endif
  108087. "adds r2, r2, r5\n\t"
  108088. "adcs r3, r3, r6\n\t"
  108089. "adc r4, r4, r7\n\t"
  108090. "str r2, [sp, #24]\n\t"
  108091. /* A[0] * A[7] */
  108092. "ldr r10, [%[a], #28]\n\t"
  108093. "ldr r12, [%[a]]\n\t"
  108094. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108095. "lsl r8, r10, #16\n\t"
  108096. "lsl r5, r12, #16\n\t"
  108097. "lsr r8, r8, #16\n\t"
  108098. "lsr r5, r5, #16\n\t"
  108099. "mul r5, r8, r5\n\t"
  108100. "lsr r9, r12, #16\n\t"
  108101. "mul r8, r9, r8\n\t"
  108102. "lsr r6, r8, #16\n\t"
  108103. "lsl r8, r8, #16\n\t"
  108104. "adds r5, r5, r8\n\t"
  108105. "adc r6, r6, #0\n\t"
  108106. "lsr r8, r10, #16\n\t"
  108107. "mul r9, r8, r9\n\t"
  108108. "add r6, r6, r9\n\t"
  108109. "lsl r9, r12, #16\n\t"
  108110. "lsr r9, r9, #16\n\t"
  108111. "mul r8, r9, r8\n\t"
  108112. "lsr r9, r8, #16\n\t"
  108113. "lsl r8, r8, #16\n\t"
  108114. "adds r5, r5, r8\n\t"
  108115. "adc r6, r6, r9\n\t"
  108116. #else
  108117. "umull r5, r6, r10, r12\n\t"
  108118. #endif
  108119. "mov r2, #0\n\t"
  108120. "mov r7, #0\n\t"
  108121. /* A[1] * A[6] */
  108122. "ldr r10, [%[a], #24]\n\t"
  108123. "ldr r12, [%[a], #4]\n\t"
  108124. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108125. "lsl r8, r10, #16\n\t"
  108126. "lsl r9, r12, #16\n\t"
  108127. "lsr r8, r8, #16\n\t"
  108128. "lsr r9, r9, #16\n\t"
  108129. "mul r9, r8, r9\n\t"
  108130. "adds r5, r5, r9\n\t"
  108131. "adcs r6, r6, #0\n\t"
  108132. "adc r7, r7, #0\n\t"
  108133. "lsr r9, r12, #16\n\t"
  108134. "mul r8, r9, r8\n\t"
  108135. "lsr r9, r8, #16\n\t"
  108136. "lsl r8, r8, #16\n\t"
  108137. "adds r5, r5, r8\n\t"
  108138. "adcs r6, r6, r9\n\t"
  108139. "adc r7, r7, #0\n\t"
  108140. "lsr r8, r10, #16\n\t"
  108141. "lsr r9, r12, #16\n\t"
  108142. "mul r9, r8, r9\n\t"
  108143. "adds r6, r6, r9\n\t"
  108144. "adc r7, r7, #0\n\t"
  108145. "lsl r9, r12, #16\n\t"
  108146. "lsr r9, r9, #16\n\t"
  108147. "mul r8, r9, r8\n\t"
  108148. "lsr r9, r8, #16\n\t"
  108149. "lsl r8, r8, #16\n\t"
  108150. "adds r5, r5, r8\n\t"
  108151. "adcs r6, r6, r9\n\t"
  108152. "adc r7, r7, #0\n\t"
  108153. #else
  108154. "umull r8, r9, r10, r12\n\t"
  108155. "adds r5, r5, r8\n\t"
  108156. "adcs r6, r6, r9\n\t"
  108157. "adc r7, r7, #0\n\t"
  108158. #endif
  108159. /* A[2] * A[5] */
  108160. "ldr r10, [%[a], #20]\n\t"
  108161. "ldr r12, [%[a], #8]\n\t"
  108162. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108163. "lsl r8, r10, #16\n\t"
  108164. "lsl r9, r12, #16\n\t"
  108165. "lsr r8, r8, #16\n\t"
  108166. "lsr r9, r9, #16\n\t"
  108167. "mul r9, r8, r9\n\t"
  108168. "adds r5, r5, r9\n\t"
  108169. "adcs r6, r6, #0\n\t"
  108170. "adc r7, r7, #0\n\t"
  108171. "lsr r9, r12, #16\n\t"
  108172. "mul r8, r9, r8\n\t"
  108173. "lsr r9, r8, #16\n\t"
  108174. "lsl r8, r8, #16\n\t"
  108175. "adds r5, r5, r8\n\t"
  108176. "adcs r6, r6, r9\n\t"
  108177. "adc r7, r7, #0\n\t"
  108178. "lsr r8, r10, #16\n\t"
  108179. "lsr r9, r12, #16\n\t"
  108180. "mul r9, r8, r9\n\t"
  108181. "adds r6, r6, r9\n\t"
  108182. "adc r7, r7, #0\n\t"
  108183. "lsl r9, r12, #16\n\t"
  108184. "lsr r9, r9, #16\n\t"
  108185. "mul r8, r9, r8\n\t"
  108186. "lsr r9, r8, #16\n\t"
  108187. "lsl r8, r8, #16\n\t"
  108188. "adds r5, r5, r8\n\t"
  108189. "adcs r6, r6, r9\n\t"
  108190. "adc r7, r7, #0\n\t"
  108191. #else
  108192. "umull r8, r9, r10, r12\n\t"
  108193. "adds r5, r5, r8\n\t"
  108194. "adcs r6, r6, r9\n\t"
  108195. "adc r7, r7, #0\n\t"
  108196. #endif
  108197. /* A[3] * A[4] */
  108198. "ldr r10, [%[a], #16]\n\t"
  108199. "ldr r12, [%[a], #12]\n\t"
  108200. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108201. "lsl r8, r10, #16\n\t"
  108202. "lsl r9, r12, #16\n\t"
  108203. "lsr r8, r8, #16\n\t"
  108204. "lsr r9, r9, #16\n\t"
  108205. "mul r9, r8, r9\n\t"
  108206. "adds r5, r5, r9\n\t"
  108207. "adcs r6, r6, #0\n\t"
  108208. "adc r7, r7, #0\n\t"
  108209. "lsr r9, r12, #16\n\t"
  108210. "mul r8, r9, r8\n\t"
  108211. "lsr r9, r8, #16\n\t"
  108212. "lsl r8, r8, #16\n\t"
  108213. "adds r5, r5, r8\n\t"
  108214. "adcs r6, r6, r9\n\t"
  108215. "adc r7, r7, #0\n\t"
  108216. "lsr r8, r10, #16\n\t"
  108217. "lsr r9, r12, #16\n\t"
  108218. "mul r9, r8, r9\n\t"
  108219. "adds r6, r6, r9\n\t"
  108220. "adc r7, r7, #0\n\t"
  108221. "lsl r9, r12, #16\n\t"
  108222. "lsr r9, r9, #16\n\t"
  108223. "mul r8, r9, r8\n\t"
  108224. "lsr r9, r8, #16\n\t"
  108225. "lsl r8, r8, #16\n\t"
  108226. "adds r5, r5, r8\n\t"
  108227. "adcs r6, r6, r9\n\t"
  108228. "adc r7, r7, #0\n\t"
  108229. #else
  108230. "umull r8, r9, r10, r12\n\t"
  108231. "adds r5, r5, r8\n\t"
  108232. "adcs r6, r6, r9\n\t"
  108233. "adc r7, r7, #0\n\t"
  108234. #endif
  108235. "adds r5, r5, r5\n\t"
  108236. "adcs r6, r6, r6\n\t"
  108237. "adc r7, r7, r7\n\t"
  108238. "adds r3, r3, r5\n\t"
  108239. "adcs r4, r4, r6\n\t"
  108240. "adc r2, r2, r7\n\t"
  108241. "str r3, [sp, #28]\n\t"
  108242. /* A[0] * A[8] */
  108243. "ldr r10, [%[a], #32]\n\t"
  108244. "ldr r12, [%[a]]\n\t"
  108245. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108246. "lsl r8, r10, #16\n\t"
  108247. "lsl r5, r12, #16\n\t"
  108248. "lsr r8, r8, #16\n\t"
  108249. "lsr r5, r5, #16\n\t"
  108250. "mul r5, r8, r5\n\t"
  108251. "lsr r9, r12, #16\n\t"
  108252. "mul r8, r9, r8\n\t"
  108253. "lsr r6, r8, #16\n\t"
  108254. "lsl r8, r8, #16\n\t"
  108255. "adds r5, r5, r8\n\t"
  108256. "adc r6, r6, #0\n\t"
  108257. "lsr r8, r10, #16\n\t"
  108258. "mul r9, r8, r9\n\t"
  108259. "add r6, r6, r9\n\t"
  108260. "lsl r9, r12, #16\n\t"
  108261. "lsr r9, r9, #16\n\t"
  108262. "mul r8, r9, r8\n\t"
  108263. "lsr r9, r8, #16\n\t"
  108264. "lsl r8, r8, #16\n\t"
  108265. "adds r5, r5, r8\n\t"
  108266. "adc r6, r6, r9\n\t"
  108267. #else
  108268. "umull r5, r6, r10, r12\n\t"
  108269. #endif
  108270. "mov r3, #0\n\t"
  108271. "mov r7, #0\n\t"
  108272. /* A[1] * A[7] */
  108273. "ldr r10, [%[a], #28]\n\t"
  108274. "ldr r12, [%[a], #4]\n\t"
  108275. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108276. "lsl r8, r10, #16\n\t"
  108277. "lsl r9, r12, #16\n\t"
  108278. "lsr r8, r8, #16\n\t"
  108279. "lsr r9, r9, #16\n\t"
  108280. "mul r9, r8, r9\n\t"
  108281. "adds r5, r5, r9\n\t"
  108282. "adcs r6, r6, #0\n\t"
  108283. "adc r7, r7, #0\n\t"
  108284. "lsr r9, r12, #16\n\t"
  108285. "mul r8, r9, r8\n\t"
  108286. "lsr r9, r8, #16\n\t"
  108287. "lsl r8, r8, #16\n\t"
  108288. "adds r5, r5, r8\n\t"
  108289. "adcs r6, r6, r9\n\t"
  108290. "adc r7, r7, #0\n\t"
  108291. "lsr r8, r10, #16\n\t"
  108292. "lsr r9, r12, #16\n\t"
  108293. "mul r9, r8, r9\n\t"
  108294. "adds r6, r6, r9\n\t"
  108295. "adc r7, r7, #0\n\t"
  108296. "lsl r9, r12, #16\n\t"
  108297. "lsr r9, r9, #16\n\t"
  108298. "mul r8, r9, r8\n\t"
  108299. "lsr r9, r8, #16\n\t"
  108300. "lsl r8, r8, #16\n\t"
  108301. "adds r5, r5, r8\n\t"
  108302. "adcs r6, r6, r9\n\t"
  108303. "adc r7, r7, #0\n\t"
  108304. #else
  108305. "umull r8, r9, r10, r12\n\t"
  108306. "adds r5, r5, r8\n\t"
  108307. "adcs r6, r6, r9\n\t"
  108308. "adc r7, r7, #0\n\t"
  108309. #endif
  108310. /* A[2] * A[6] */
  108311. "ldr r10, [%[a], #24]\n\t"
  108312. "ldr r12, [%[a], #8]\n\t"
  108313. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108314. "lsl r8, r10, #16\n\t"
  108315. "lsl r9, r12, #16\n\t"
  108316. "lsr r8, r8, #16\n\t"
  108317. "lsr r9, r9, #16\n\t"
  108318. "mul r9, r8, r9\n\t"
  108319. "adds r5, r5, r9\n\t"
  108320. "adcs r6, r6, #0\n\t"
  108321. "adc r7, r7, #0\n\t"
  108322. "lsr r9, r12, #16\n\t"
  108323. "mul r8, r9, r8\n\t"
  108324. "lsr r9, r8, #16\n\t"
  108325. "lsl r8, r8, #16\n\t"
  108326. "adds r5, r5, r8\n\t"
  108327. "adcs r6, r6, r9\n\t"
  108328. "adc r7, r7, #0\n\t"
  108329. "lsr r8, r10, #16\n\t"
  108330. "lsr r9, r12, #16\n\t"
  108331. "mul r9, r8, r9\n\t"
  108332. "adds r6, r6, r9\n\t"
  108333. "adc r7, r7, #0\n\t"
  108334. "lsl r9, r12, #16\n\t"
  108335. "lsr r9, r9, #16\n\t"
  108336. "mul r8, r9, r8\n\t"
  108337. "lsr r9, r8, #16\n\t"
  108338. "lsl r8, r8, #16\n\t"
  108339. "adds r5, r5, r8\n\t"
  108340. "adcs r6, r6, r9\n\t"
  108341. "adc r7, r7, #0\n\t"
  108342. #else
  108343. "umull r8, r9, r10, r12\n\t"
  108344. "adds r5, r5, r8\n\t"
  108345. "adcs r6, r6, r9\n\t"
  108346. "adc r7, r7, #0\n\t"
  108347. #endif
  108348. /* A[3] * A[5] */
  108349. "ldr r10, [%[a], #20]\n\t"
  108350. "ldr r12, [%[a], #12]\n\t"
  108351. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108352. "lsl r8, r10, #16\n\t"
  108353. "lsl r9, r12, #16\n\t"
  108354. "lsr r8, r8, #16\n\t"
  108355. "lsr r9, r9, #16\n\t"
  108356. "mul r9, r8, r9\n\t"
  108357. "adds r5, r5, r9\n\t"
  108358. "adcs r6, r6, #0\n\t"
  108359. "adc r7, r7, #0\n\t"
  108360. "lsr r9, r12, #16\n\t"
  108361. "mul r8, r9, r8\n\t"
  108362. "lsr r9, r8, #16\n\t"
  108363. "lsl r8, r8, #16\n\t"
  108364. "adds r5, r5, r8\n\t"
  108365. "adcs r6, r6, r9\n\t"
  108366. "adc r7, r7, #0\n\t"
  108367. "lsr r8, r10, #16\n\t"
  108368. "lsr r9, r12, #16\n\t"
  108369. "mul r9, r8, r9\n\t"
  108370. "adds r6, r6, r9\n\t"
  108371. "adc r7, r7, #0\n\t"
  108372. "lsl r9, r12, #16\n\t"
  108373. "lsr r9, r9, #16\n\t"
  108374. "mul r8, r9, r8\n\t"
  108375. "lsr r9, r8, #16\n\t"
  108376. "lsl r8, r8, #16\n\t"
  108377. "adds r5, r5, r8\n\t"
  108378. "adcs r6, r6, r9\n\t"
  108379. "adc r7, r7, #0\n\t"
  108380. #else
  108381. "umull r8, r9, r10, r12\n\t"
  108382. "adds r5, r5, r8\n\t"
  108383. "adcs r6, r6, r9\n\t"
  108384. "adc r7, r7, #0\n\t"
  108385. #endif
  108386. /* A[4] * A[4] */
  108387. "ldr r10, [%[a], #16]\n\t"
  108388. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108389. "lsl r8, r10, #16\n\t"
  108390. "lsr r9, r10, #16\n\t"
  108391. "lsr r8, r8, #16\n\t"
  108392. "mov r12, r8\n\t"
  108393. "mul r8, r12, r8\n\t"
  108394. "mov r12, r9\n\t"
  108395. "mul r9, r12, r9\n\t"
  108396. "adds r4, r4, r8\n\t"
  108397. "adcs r2, r2, r9\n\t"
  108398. "adc r3, r3, #0\n\t"
  108399. "lsr r9, r10, #16\n\t"
  108400. "lsl r8, r10, #16\n\t"
  108401. "lsr r8, r8, #16\n\t"
  108402. "mul r8, r9, r8\n\t"
  108403. "lsr r9, r8, #15\n\t"
  108404. "lsl r8, r8, #17\n\t"
  108405. "adds r4, r4, r8\n\t"
  108406. "adcs r2, r2, r9\n\t"
  108407. "adc r3, r3, #0\n\t"
  108408. "adds r5, r5, r5\n\t"
  108409. "adcs r6, r6, r6\n\t"
  108410. "adc r7, r7, r7\n\t"
  108411. #else
  108412. "umull r8, r9, r10, r10\n\t"
  108413. "adds r5, r5, r5\n\t"
  108414. "adcs r6, r6, r6\n\t"
  108415. "adc r7, r7, r7\n\t"
  108416. "adds r4, r4, r8\n\t"
  108417. "adcs r2, r2, r9\n\t"
  108418. "adc r3, r3, #0\n\t"
  108419. #endif
  108420. "adds r4, r4, r5\n\t"
  108421. "adcs r2, r2, r6\n\t"
  108422. "adc r3, r3, r7\n\t"
  108423. "str r4, [sp, #32]\n\t"
  108424. /* A[0] * A[9] */
  108425. "ldr r10, [%[a], #36]\n\t"
  108426. "ldr r12, [%[a]]\n\t"
  108427. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108428. "lsl r8, r10, #16\n\t"
  108429. "lsl r5, r12, #16\n\t"
  108430. "lsr r8, r8, #16\n\t"
  108431. "lsr r5, r5, #16\n\t"
  108432. "mul r5, r8, r5\n\t"
  108433. "lsr r9, r12, #16\n\t"
  108434. "mul r8, r9, r8\n\t"
  108435. "lsr r6, r8, #16\n\t"
  108436. "lsl r8, r8, #16\n\t"
  108437. "adds r5, r5, r8\n\t"
  108438. "adc r6, r6, #0\n\t"
  108439. "lsr r8, r10, #16\n\t"
  108440. "mul r9, r8, r9\n\t"
  108441. "add r6, r6, r9\n\t"
  108442. "lsl r9, r12, #16\n\t"
  108443. "lsr r9, r9, #16\n\t"
  108444. "mul r8, r9, r8\n\t"
  108445. "lsr r9, r8, #16\n\t"
  108446. "lsl r8, r8, #16\n\t"
  108447. "adds r5, r5, r8\n\t"
  108448. "adc r6, r6, r9\n\t"
  108449. #else
  108450. "umull r5, r6, r10, r12\n\t"
  108451. #endif
  108452. "mov r4, #0\n\t"
  108453. "mov r7, #0\n\t"
  108454. /* A[1] * A[8] */
  108455. "ldr r10, [%[a], #32]\n\t"
  108456. "ldr r12, [%[a], #4]\n\t"
  108457. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108458. "lsl r8, r10, #16\n\t"
  108459. "lsl r9, r12, #16\n\t"
  108460. "lsr r8, r8, #16\n\t"
  108461. "lsr r9, r9, #16\n\t"
  108462. "mul r9, r8, r9\n\t"
  108463. "adds r5, r5, r9\n\t"
  108464. "adcs r6, r6, #0\n\t"
  108465. "adc r7, r7, #0\n\t"
  108466. "lsr r9, r12, #16\n\t"
  108467. "mul r8, r9, r8\n\t"
  108468. "lsr r9, r8, #16\n\t"
  108469. "lsl r8, r8, #16\n\t"
  108470. "adds r5, r5, r8\n\t"
  108471. "adcs r6, r6, r9\n\t"
  108472. "adc r7, r7, #0\n\t"
  108473. "lsr r8, r10, #16\n\t"
  108474. "lsr r9, r12, #16\n\t"
  108475. "mul r9, r8, r9\n\t"
  108476. "adds r6, r6, r9\n\t"
  108477. "adc r7, r7, #0\n\t"
  108478. "lsl r9, r12, #16\n\t"
  108479. "lsr r9, r9, #16\n\t"
  108480. "mul r8, r9, r8\n\t"
  108481. "lsr r9, r8, #16\n\t"
  108482. "lsl r8, r8, #16\n\t"
  108483. "adds r5, r5, r8\n\t"
  108484. "adcs r6, r6, r9\n\t"
  108485. "adc r7, r7, #0\n\t"
  108486. #else
  108487. "umull r8, r9, r10, r12\n\t"
  108488. "adds r5, r5, r8\n\t"
  108489. "adcs r6, r6, r9\n\t"
  108490. "adc r7, r7, #0\n\t"
  108491. #endif
  108492. /* A[2] * A[7] */
  108493. "ldr r10, [%[a], #28]\n\t"
  108494. "ldr r12, [%[a], #8]\n\t"
  108495. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108496. "lsl r8, r10, #16\n\t"
  108497. "lsl r9, r12, #16\n\t"
  108498. "lsr r8, r8, #16\n\t"
  108499. "lsr r9, r9, #16\n\t"
  108500. "mul r9, r8, r9\n\t"
  108501. "adds r5, r5, r9\n\t"
  108502. "adcs r6, r6, #0\n\t"
  108503. "adc r7, r7, #0\n\t"
  108504. "lsr r9, r12, #16\n\t"
  108505. "mul r8, r9, r8\n\t"
  108506. "lsr r9, r8, #16\n\t"
  108507. "lsl r8, r8, #16\n\t"
  108508. "adds r5, r5, r8\n\t"
  108509. "adcs r6, r6, r9\n\t"
  108510. "adc r7, r7, #0\n\t"
  108511. "lsr r8, r10, #16\n\t"
  108512. "lsr r9, r12, #16\n\t"
  108513. "mul r9, r8, r9\n\t"
  108514. "adds r6, r6, r9\n\t"
  108515. "adc r7, r7, #0\n\t"
  108516. "lsl r9, r12, #16\n\t"
  108517. "lsr r9, r9, #16\n\t"
  108518. "mul r8, r9, r8\n\t"
  108519. "lsr r9, r8, #16\n\t"
  108520. "lsl r8, r8, #16\n\t"
  108521. "adds r5, r5, r8\n\t"
  108522. "adcs r6, r6, r9\n\t"
  108523. "adc r7, r7, #0\n\t"
  108524. #else
  108525. "umull r8, r9, r10, r12\n\t"
  108526. "adds r5, r5, r8\n\t"
  108527. "adcs r6, r6, r9\n\t"
  108528. "adc r7, r7, #0\n\t"
  108529. #endif
  108530. /* A[3] * A[6] */
  108531. "ldr r10, [%[a], #24]\n\t"
  108532. "ldr r12, [%[a], #12]\n\t"
  108533. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108534. "lsl r8, r10, #16\n\t"
  108535. "lsl r9, r12, #16\n\t"
  108536. "lsr r8, r8, #16\n\t"
  108537. "lsr r9, r9, #16\n\t"
  108538. "mul r9, r8, r9\n\t"
  108539. "adds r5, r5, r9\n\t"
  108540. "adcs r6, r6, #0\n\t"
  108541. "adc r7, r7, #0\n\t"
  108542. "lsr r9, r12, #16\n\t"
  108543. "mul r8, r9, r8\n\t"
  108544. "lsr r9, r8, #16\n\t"
  108545. "lsl r8, r8, #16\n\t"
  108546. "adds r5, r5, r8\n\t"
  108547. "adcs r6, r6, r9\n\t"
  108548. "adc r7, r7, #0\n\t"
  108549. "lsr r8, r10, #16\n\t"
  108550. "lsr r9, r12, #16\n\t"
  108551. "mul r9, r8, r9\n\t"
  108552. "adds r6, r6, r9\n\t"
  108553. "adc r7, r7, #0\n\t"
  108554. "lsl r9, r12, #16\n\t"
  108555. "lsr r9, r9, #16\n\t"
  108556. "mul r8, r9, r8\n\t"
  108557. "lsr r9, r8, #16\n\t"
  108558. "lsl r8, r8, #16\n\t"
  108559. "adds r5, r5, r8\n\t"
  108560. "adcs r6, r6, r9\n\t"
  108561. "adc r7, r7, #0\n\t"
  108562. #else
  108563. "umull r8, r9, r10, r12\n\t"
  108564. "adds r5, r5, r8\n\t"
  108565. "adcs r6, r6, r9\n\t"
  108566. "adc r7, r7, #0\n\t"
  108567. #endif
  108568. /* A[4] * A[5] */
  108569. "ldr r10, [%[a], #20]\n\t"
  108570. "ldr r12, [%[a], #16]\n\t"
  108571. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108572. "lsl r8, r10, #16\n\t"
  108573. "lsl r9, r12, #16\n\t"
  108574. "lsr r8, r8, #16\n\t"
  108575. "lsr r9, r9, #16\n\t"
  108576. "mul r9, r8, r9\n\t"
  108577. "adds r5, r5, r9\n\t"
  108578. "adcs r6, r6, #0\n\t"
  108579. "adc r7, r7, #0\n\t"
  108580. "lsr r9, r12, #16\n\t"
  108581. "mul r8, r9, r8\n\t"
  108582. "lsr r9, r8, #16\n\t"
  108583. "lsl r8, r8, #16\n\t"
  108584. "adds r5, r5, r8\n\t"
  108585. "adcs r6, r6, r9\n\t"
  108586. "adc r7, r7, #0\n\t"
  108587. "lsr r8, r10, #16\n\t"
  108588. "lsr r9, r12, #16\n\t"
  108589. "mul r9, r8, r9\n\t"
  108590. "adds r6, r6, r9\n\t"
  108591. "adc r7, r7, #0\n\t"
  108592. "lsl r9, r12, #16\n\t"
  108593. "lsr r9, r9, #16\n\t"
  108594. "mul r8, r9, r8\n\t"
  108595. "lsr r9, r8, #16\n\t"
  108596. "lsl r8, r8, #16\n\t"
  108597. "adds r5, r5, r8\n\t"
  108598. "adcs r6, r6, r9\n\t"
  108599. "adc r7, r7, #0\n\t"
  108600. #else
  108601. "umull r8, r9, r10, r12\n\t"
  108602. "adds r5, r5, r8\n\t"
  108603. "adcs r6, r6, r9\n\t"
  108604. "adc r7, r7, #0\n\t"
  108605. #endif
  108606. "adds r5, r5, r5\n\t"
  108607. "adcs r6, r6, r6\n\t"
  108608. "adc r7, r7, r7\n\t"
  108609. "adds r2, r2, r5\n\t"
  108610. "adcs r3, r3, r6\n\t"
  108611. "adc r4, r4, r7\n\t"
  108612. "str r2, [sp, #36]\n\t"
  108613. /* A[0] * A[10] */
  108614. "ldr r10, [%[a], #40]\n\t"
  108615. "ldr r12, [%[a]]\n\t"
  108616. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108617. "lsl r8, r10, #16\n\t"
  108618. "lsl r5, r12, #16\n\t"
  108619. "lsr r8, r8, #16\n\t"
  108620. "lsr r5, r5, #16\n\t"
  108621. "mul r5, r8, r5\n\t"
  108622. "lsr r9, r12, #16\n\t"
  108623. "mul r8, r9, r8\n\t"
  108624. "lsr r6, r8, #16\n\t"
  108625. "lsl r8, r8, #16\n\t"
  108626. "adds r5, r5, r8\n\t"
  108627. "adc r6, r6, #0\n\t"
  108628. "lsr r8, r10, #16\n\t"
  108629. "mul r9, r8, r9\n\t"
  108630. "add r6, r6, r9\n\t"
  108631. "lsl r9, r12, #16\n\t"
  108632. "lsr r9, r9, #16\n\t"
  108633. "mul r8, r9, r8\n\t"
  108634. "lsr r9, r8, #16\n\t"
  108635. "lsl r8, r8, #16\n\t"
  108636. "adds r5, r5, r8\n\t"
  108637. "adc r6, r6, r9\n\t"
  108638. #else
  108639. "umull r5, r6, r10, r12\n\t"
  108640. #endif
  108641. "mov r2, #0\n\t"
  108642. "mov r7, #0\n\t"
  108643. /* A[1] * A[9] */
  108644. "ldr r10, [%[a], #36]\n\t"
  108645. "ldr r12, [%[a], #4]\n\t"
  108646. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108647. "lsl r8, r10, #16\n\t"
  108648. "lsl r9, r12, #16\n\t"
  108649. "lsr r8, r8, #16\n\t"
  108650. "lsr r9, r9, #16\n\t"
  108651. "mul r9, r8, r9\n\t"
  108652. "adds r5, r5, r9\n\t"
  108653. "adcs r6, r6, #0\n\t"
  108654. "adc r7, r7, #0\n\t"
  108655. "lsr r9, r12, #16\n\t"
  108656. "mul r8, r9, r8\n\t"
  108657. "lsr r9, r8, #16\n\t"
  108658. "lsl r8, r8, #16\n\t"
  108659. "adds r5, r5, r8\n\t"
  108660. "adcs r6, r6, r9\n\t"
  108661. "adc r7, r7, #0\n\t"
  108662. "lsr r8, r10, #16\n\t"
  108663. "lsr r9, r12, #16\n\t"
  108664. "mul r9, r8, r9\n\t"
  108665. "adds r6, r6, r9\n\t"
  108666. "adc r7, r7, #0\n\t"
  108667. "lsl r9, r12, #16\n\t"
  108668. "lsr r9, r9, #16\n\t"
  108669. "mul r8, r9, r8\n\t"
  108670. "lsr r9, r8, #16\n\t"
  108671. "lsl r8, r8, #16\n\t"
  108672. "adds r5, r5, r8\n\t"
  108673. "adcs r6, r6, r9\n\t"
  108674. "adc r7, r7, #0\n\t"
  108675. #else
  108676. "umull r8, r9, r10, r12\n\t"
  108677. "adds r5, r5, r8\n\t"
  108678. "adcs r6, r6, r9\n\t"
  108679. "adc r7, r7, #0\n\t"
  108680. #endif
  108681. /* A[2] * A[8] */
  108682. "ldr r10, [%[a], #32]\n\t"
  108683. "ldr r12, [%[a], #8]\n\t"
  108684. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108685. "lsl r8, r10, #16\n\t"
  108686. "lsl r9, r12, #16\n\t"
  108687. "lsr r8, r8, #16\n\t"
  108688. "lsr r9, r9, #16\n\t"
  108689. "mul r9, r8, r9\n\t"
  108690. "adds r5, r5, r9\n\t"
  108691. "adcs r6, r6, #0\n\t"
  108692. "adc r7, r7, #0\n\t"
  108693. "lsr r9, r12, #16\n\t"
  108694. "mul r8, r9, r8\n\t"
  108695. "lsr r9, r8, #16\n\t"
  108696. "lsl r8, r8, #16\n\t"
  108697. "adds r5, r5, r8\n\t"
  108698. "adcs r6, r6, r9\n\t"
  108699. "adc r7, r7, #0\n\t"
  108700. "lsr r8, r10, #16\n\t"
  108701. "lsr r9, r12, #16\n\t"
  108702. "mul r9, r8, r9\n\t"
  108703. "adds r6, r6, r9\n\t"
  108704. "adc r7, r7, #0\n\t"
  108705. "lsl r9, r12, #16\n\t"
  108706. "lsr r9, r9, #16\n\t"
  108707. "mul r8, r9, r8\n\t"
  108708. "lsr r9, r8, #16\n\t"
  108709. "lsl r8, r8, #16\n\t"
  108710. "adds r5, r5, r8\n\t"
  108711. "adcs r6, r6, r9\n\t"
  108712. "adc r7, r7, #0\n\t"
  108713. #else
  108714. "umull r8, r9, r10, r12\n\t"
  108715. "adds r5, r5, r8\n\t"
  108716. "adcs r6, r6, r9\n\t"
  108717. "adc r7, r7, #0\n\t"
  108718. #endif
  108719. /* A[3] * A[7] */
  108720. "ldr r10, [%[a], #28]\n\t"
  108721. "ldr r12, [%[a], #12]\n\t"
  108722. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108723. "lsl r8, r10, #16\n\t"
  108724. "lsl r9, r12, #16\n\t"
  108725. "lsr r8, r8, #16\n\t"
  108726. "lsr r9, r9, #16\n\t"
  108727. "mul r9, r8, r9\n\t"
  108728. "adds r5, r5, r9\n\t"
  108729. "adcs r6, r6, #0\n\t"
  108730. "adc r7, r7, #0\n\t"
  108731. "lsr r9, r12, #16\n\t"
  108732. "mul r8, r9, r8\n\t"
  108733. "lsr r9, r8, #16\n\t"
  108734. "lsl r8, r8, #16\n\t"
  108735. "adds r5, r5, r8\n\t"
  108736. "adcs r6, r6, r9\n\t"
  108737. "adc r7, r7, #0\n\t"
  108738. "lsr r8, r10, #16\n\t"
  108739. "lsr r9, r12, #16\n\t"
  108740. "mul r9, r8, r9\n\t"
  108741. "adds r6, r6, r9\n\t"
  108742. "adc r7, r7, #0\n\t"
  108743. "lsl r9, r12, #16\n\t"
  108744. "lsr r9, r9, #16\n\t"
  108745. "mul r8, r9, r8\n\t"
  108746. "lsr r9, r8, #16\n\t"
  108747. "lsl r8, r8, #16\n\t"
  108748. "adds r5, r5, r8\n\t"
  108749. "adcs r6, r6, r9\n\t"
  108750. "adc r7, r7, #0\n\t"
  108751. #else
  108752. "umull r8, r9, r10, r12\n\t"
  108753. "adds r5, r5, r8\n\t"
  108754. "adcs r6, r6, r9\n\t"
  108755. "adc r7, r7, #0\n\t"
  108756. #endif
  108757. /* A[4] * A[6] */
  108758. "ldr r10, [%[a], #24]\n\t"
  108759. "ldr r12, [%[a], #16]\n\t"
  108760. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108761. "lsl r8, r10, #16\n\t"
  108762. "lsl r9, r12, #16\n\t"
  108763. "lsr r8, r8, #16\n\t"
  108764. "lsr r9, r9, #16\n\t"
  108765. "mul r9, r8, r9\n\t"
  108766. "adds r5, r5, r9\n\t"
  108767. "adcs r6, r6, #0\n\t"
  108768. "adc r7, r7, #0\n\t"
  108769. "lsr r9, r12, #16\n\t"
  108770. "mul r8, r9, r8\n\t"
  108771. "lsr r9, r8, #16\n\t"
  108772. "lsl r8, r8, #16\n\t"
  108773. "adds r5, r5, r8\n\t"
  108774. "adcs r6, r6, r9\n\t"
  108775. "adc r7, r7, #0\n\t"
  108776. "lsr r8, r10, #16\n\t"
  108777. "lsr r9, r12, #16\n\t"
  108778. "mul r9, r8, r9\n\t"
  108779. "adds r6, r6, r9\n\t"
  108780. "adc r7, r7, #0\n\t"
  108781. "lsl r9, r12, #16\n\t"
  108782. "lsr r9, r9, #16\n\t"
  108783. "mul r8, r9, r8\n\t"
  108784. "lsr r9, r8, #16\n\t"
  108785. "lsl r8, r8, #16\n\t"
  108786. "adds r5, r5, r8\n\t"
  108787. "adcs r6, r6, r9\n\t"
  108788. "adc r7, r7, #0\n\t"
  108789. #else
  108790. "umull r8, r9, r10, r12\n\t"
  108791. "adds r5, r5, r8\n\t"
  108792. "adcs r6, r6, r9\n\t"
  108793. "adc r7, r7, #0\n\t"
  108794. #endif
  108795. /* A[5] * A[5] */
  108796. "ldr r10, [%[a], #20]\n\t"
  108797. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108798. "lsl r8, r10, #16\n\t"
  108799. "lsr r9, r10, #16\n\t"
  108800. "lsr r8, r8, #16\n\t"
  108801. "mov r12, r8\n\t"
  108802. "mul r8, r12, r8\n\t"
  108803. "mov r12, r9\n\t"
  108804. "mul r9, r12, r9\n\t"
  108805. "adds r3, r3, r8\n\t"
  108806. "adcs r4, r4, r9\n\t"
  108807. "adc r2, r2, #0\n\t"
  108808. "lsr r9, r10, #16\n\t"
  108809. "lsl r8, r10, #16\n\t"
  108810. "lsr r8, r8, #16\n\t"
  108811. "mul r8, r9, r8\n\t"
  108812. "lsr r9, r8, #15\n\t"
  108813. "lsl r8, r8, #17\n\t"
  108814. "adds r3, r3, r8\n\t"
  108815. "adcs r4, r4, r9\n\t"
  108816. "adc r2, r2, #0\n\t"
  108817. "adds r5, r5, r5\n\t"
  108818. "adcs r6, r6, r6\n\t"
  108819. "adc r7, r7, r7\n\t"
  108820. #else
  108821. "umull r8, r9, r10, r10\n\t"
  108822. "adds r5, r5, r5\n\t"
  108823. "adcs r6, r6, r6\n\t"
  108824. "adc r7, r7, r7\n\t"
  108825. "adds r3, r3, r8\n\t"
  108826. "adcs r4, r4, r9\n\t"
  108827. "adc r2, r2, #0\n\t"
  108828. #endif
  108829. "adds r3, r3, r5\n\t"
  108830. "adcs r4, r4, r6\n\t"
  108831. "adc r2, r2, r7\n\t"
  108832. "str r3, [sp, #40]\n\t"
  108833. /* A[0] * A[11] */
  108834. "ldr r10, [%[a], #44]\n\t"
  108835. "ldr r12, [%[a]]\n\t"
  108836. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108837. "lsl r8, r10, #16\n\t"
  108838. "lsl r5, r12, #16\n\t"
  108839. "lsr r8, r8, #16\n\t"
  108840. "lsr r5, r5, #16\n\t"
  108841. "mul r5, r8, r5\n\t"
  108842. "lsr r9, r12, #16\n\t"
  108843. "mul r8, r9, r8\n\t"
  108844. "lsr r6, r8, #16\n\t"
  108845. "lsl r8, r8, #16\n\t"
  108846. "adds r5, r5, r8\n\t"
  108847. "adc r6, r6, #0\n\t"
  108848. "lsr r8, r10, #16\n\t"
  108849. "mul r9, r8, r9\n\t"
  108850. "add r6, r6, r9\n\t"
  108851. "lsl r9, r12, #16\n\t"
  108852. "lsr r9, r9, #16\n\t"
  108853. "mul r8, r9, r8\n\t"
  108854. "lsr r9, r8, #16\n\t"
  108855. "lsl r8, r8, #16\n\t"
  108856. "adds r5, r5, r8\n\t"
  108857. "adc r6, r6, r9\n\t"
  108858. #else
  108859. "umull r5, r6, r10, r12\n\t"
  108860. #endif
  108861. "mov r3, #0\n\t"
  108862. "mov r7, #0\n\t"
  108863. /* A[1] * A[10] */
  108864. "ldr r10, [%[a], #40]\n\t"
  108865. "ldr r12, [%[a], #4]\n\t"
  108866. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108867. "lsl r8, r10, #16\n\t"
  108868. "lsl r9, r12, #16\n\t"
  108869. "lsr r8, r8, #16\n\t"
  108870. "lsr r9, r9, #16\n\t"
  108871. "mul r9, r8, r9\n\t"
  108872. "adds r5, r5, r9\n\t"
  108873. "adcs r6, r6, #0\n\t"
  108874. "adc r7, r7, #0\n\t"
  108875. "lsr r9, r12, #16\n\t"
  108876. "mul r8, r9, r8\n\t"
  108877. "lsr r9, r8, #16\n\t"
  108878. "lsl r8, r8, #16\n\t"
  108879. "adds r5, r5, r8\n\t"
  108880. "adcs r6, r6, r9\n\t"
  108881. "adc r7, r7, #0\n\t"
  108882. "lsr r8, r10, #16\n\t"
  108883. "lsr r9, r12, #16\n\t"
  108884. "mul r9, r8, r9\n\t"
  108885. "adds r6, r6, r9\n\t"
  108886. "adc r7, r7, #0\n\t"
  108887. "lsl r9, r12, #16\n\t"
  108888. "lsr r9, r9, #16\n\t"
  108889. "mul r8, r9, r8\n\t"
  108890. "lsr r9, r8, #16\n\t"
  108891. "lsl r8, r8, #16\n\t"
  108892. "adds r5, r5, r8\n\t"
  108893. "adcs r6, r6, r9\n\t"
  108894. "adc r7, r7, #0\n\t"
  108895. #else
  108896. "umull r8, r9, r10, r12\n\t"
  108897. "adds r5, r5, r8\n\t"
  108898. "adcs r6, r6, r9\n\t"
  108899. "adc r7, r7, #0\n\t"
  108900. #endif
  108901. /* A[2] * A[9] */
  108902. "ldr r10, [%[a], #36]\n\t"
  108903. "ldr r12, [%[a], #8]\n\t"
  108904. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108905. "lsl r8, r10, #16\n\t"
  108906. "lsl r9, r12, #16\n\t"
  108907. "lsr r8, r8, #16\n\t"
  108908. "lsr r9, r9, #16\n\t"
  108909. "mul r9, r8, r9\n\t"
  108910. "adds r5, r5, r9\n\t"
  108911. "adcs r6, r6, #0\n\t"
  108912. "adc r7, r7, #0\n\t"
  108913. "lsr r9, r12, #16\n\t"
  108914. "mul r8, r9, r8\n\t"
  108915. "lsr r9, r8, #16\n\t"
  108916. "lsl r8, r8, #16\n\t"
  108917. "adds r5, r5, r8\n\t"
  108918. "adcs r6, r6, r9\n\t"
  108919. "adc r7, r7, #0\n\t"
  108920. "lsr r8, r10, #16\n\t"
  108921. "lsr r9, r12, #16\n\t"
  108922. "mul r9, r8, r9\n\t"
  108923. "adds r6, r6, r9\n\t"
  108924. "adc r7, r7, #0\n\t"
  108925. "lsl r9, r12, #16\n\t"
  108926. "lsr r9, r9, #16\n\t"
  108927. "mul r8, r9, r8\n\t"
  108928. "lsr r9, r8, #16\n\t"
  108929. "lsl r8, r8, #16\n\t"
  108930. "adds r5, r5, r8\n\t"
  108931. "adcs r6, r6, r9\n\t"
  108932. "adc r7, r7, #0\n\t"
  108933. #else
  108934. "umull r8, r9, r10, r12\n\t"
  108935. "adds r5, r5, r8\n\t"
  108936. "adcs r6, r6, r9\n\t"
  108937. "adc r7, r7, #0\n\t"
  108938. #endif
  108939. /* A[3] * A[8] */
  108940. "ldr r10, [%[a], #32]\n\t"
  108941. "ldr r12, [%[a], #12]\n\t"
  108942. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108943. "lsl r8, r10, #16\n\t"
  108944. "lsl r9, r12, #16\n\t"
  108945. "lsr r8, r8, #16\n\t"
  108946. "lsr r9, r9, #16\n\t"
  108947. "mul r9, r8, r9\n\t"
  108948. "adds r5, r5, r9\n\t"
  108949. "adcs r6, r6, #0\n\t"
  108950. "adc r7, r7, #0\n\t"
  108951. "lsr r9, r12, #16\n\t"
  108952. "mul r8, r9, r8\n\t"
  108953. "lsr r9, r8, #16\n\t"
  108954. "lsl r8, r8, #16\n\t"
  108955. "adds r5, r5, r8\n\t"
  108956. "adcs r6, r6, r9\n\t"
  108957. "adc r7, r7, #0\n\t"
  108958. "lsr r8, r10, #16\n\t"
  108959. "lsr r9, r12, #16\n\t"
  108960. "mul r9, r8, r9\n\t"
  108961. "adds r6, r6, r9\n\t"
  108962. "adc r7, r7, #0\n\t"
  108963. "lsl r9, r12, #16\n\t"
  108964. "lsr r9, r9, #16\n\t"
  108965. "mul r8, r9, r8\n\t"
  108966. "lsr r9, r8, #16\n\t"
  108967. "lsl r8, r8, #16\n\t"
  108968. "adds r5, r5, r8\n\t"
  108969. "adcs r6, r6, r9\n\t"
  108970. "adc r7, r7, #0\n\t"
  108971. #else
  108972. "umull r8, r9, r10, r12\n\t"
  108973. "adds r5, r5, r8\n\t"
  108974. "adcs r6, r6, r9\n\t"
  108975. "adc r7, r7, #0\n\t"
  108976. #endif
  108977. /* A[4] * A[7] */
  108978. "ldr r10, [%[a], #28]\n\t"
  108979. "ldr r12, [%[a], #16]\n\t"
  108980. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  108981. "lsl r8, r10, #16\n\t"
  108982. "lsl r9, r12, #16\n\t"
  108983. "lsr r8, r8, #16\n\t"
  108984. "lsr r9, r9, #16\n\t"
  108985. "mul r9, r8, r9\n\t"
  108986. "adds r5, r5, r9\n\t"
  108987. "adcs r6, r6, #0\n\t"
  108988. "adc r7, r7, #0\n\t"
  108989. "lsr r9, r12, #16\n\t"
  108990. "mul r8, r9, r8\n\t"
  108991. "lsr r9, r8, #16\n\t"
  108992. "lsl r8, r8, #16\n\t"
  108993. "adds r5, r5, r8\n\t"
  108994. "adcs r6, r6, r9\n\t"
  108995. "adc r7, r7, #0\n\t"
  108996. "lsr r8, r10, #16\n\t"
  108997. "lsr r9, r12, #16\n\t"
  108998. "mul r9, r8, r9\n\t"
  108999. "adds r6, r6, r9\n\t"
  109000. "adc r7, r7, #0\n\t"
  109001. "lsl r9, r12, #16\n\t"
  109002. "lsr r9, r9, #16\n\t"
  109003. "mul r8, r9, r8\n\t"
  109004. "lsr r9, r8, #16\n\t"
  109005. "lsl r8, r8, #16\n\t"
  109006. "adds r5, r5, r8\n\t"
  109007. "adcs r6, r6, r9\n\t"
  109008. "adc r7, r7, #0\n\t"
  109009. #else
  109010. "umull r8, r9, r10, r12\n\t"
  109011. "adds r5, r5, r8\n\t"
  109012. "adcs r6, r6, r9\n\t"
  109013. "adc r7, r7, #0\n\t"
  109014. #endif
  109015. /* A[5] * A[6] */
  109016. "ldr r10, [%[a], #24]\n\t"
  109017. "ldr r12, [%[a], #20]\n\t"
  109018. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109019. "lsl r8, r10, #16\n\t"
  109020. "lsl r9, r12, #16\n\t"
  109021. "lsr r8, r8, #16\n\t"
  109022. "lsr r9, r9, #16\n\t"
  109023. "mul r9, r8, r9\n\t"
  109024. "adds r5, r5, r9\n\t"
  109025. "adcs r6, r6, #0\n\t"
  109026. "adc r7, r7, #0\n\t"
  109027. "lsr r9, r12, #16\n\t"
  109028. "mul r8, r9, r8\n\t"
  109029. "lsr r9, r8, #16\n\t"
  109030. "lsl r8, r8, #16\n\t"
  109031. "adds r5, r5, r8\n\t"
  109032. "adcs r6, r6, r9\n\t"
  109033. "adc r7, r7, #0\n\t"
  109034. "lsr r8, r10, #16\n\t"
  109035. "lsr r9, r12, #16\n\t"
  109036. "mul r9, r8, r9\n\t"
  109037. "adds r6, r6, r9\n\t"
  109038. "adc r7, r7, #0\n\t"
  109039. "lsl r9, r12, #16\n\t"
  109040. "lsr r9, r9, #16\n\t"
  109041. "mul r8, r9, r8\n\t"
  109042. "lsr r9, r8, #16\n\t"
  109043. "lsl r8, r8, #16\n\t"
  109044. "adds r5, r5, r8\n\t"
  109045. "adcs r6, r6, r9\n\t"
  109046. "adc r7, r7, #0\n\t"
  109047. #else
  109048. "umull r8, r9, r10, r12\n\t"
  109049. "adds r5, r5, r8\n\t"
  109050. "adcs r6, r6, r9\n\t"
  109051. "adc r7, r7, #0\n\t"
  109052. #endif
  109053. "adds r5, r5, r5\n\t"
  109054. "adcs r6, r6, r6\n\t"
  109055. "adc r7, r7, r7\n\t"
  109056. "adds r4, r4, r5\n\t"
  109057. "adcs r2, r2, r6\n\t"
  109058. "adc r3, r3, r7\n\t"
  109059. "str r4, [sp, #44]\n\t"
  109060. /* A[0] * A[12] */
  109061. "ldr r10, [%[a], #48]\n\t"
  109062. "ldr r12, [%[a]]\n\t"
  109063. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109064. "lsl r8, r10, #16\n\t"
  109065. "lsl r5, r12, #16\n\t"
  109066. "lsr r8, r8, #16\n\t"
  109067. "lsr r5, r5, #16\n\t"
  109068. "mul r5, r8, r5\n\t"
  109069. "lsr r9, r12, #16\n\t"
  109070. "mul r8, r9, r8\n\t"
  109071. "lsr r6, r8, #16\n\t"
  109072. "lsl r8, r8, #16\n\t"
  109073. "adds r5, r5, r8\n\t"
  109074. "adc r6, r6, #0\n\t"
  109075. "lsr r8, r10, #16\n\t"
  109076. "mul r9, r8, r9\n\t"
  109077. "add r6, r6, r9\n\t"
  109078. "lsl r9, r12, #16\n\t"
  109079. "lsr r9, r9, #16\n\t"
  109080. "mul r8, r9, r8\n\t"
  109081. "lsr r9, r8, #16\n\t"
  109082. "lsl r8, r8, #16\n\t"
  109083. "adds r5, r5, r8\n\t"
  109084. "adc r6, r6, r9\n\t"
  109085. #else
  109086. "umull r5, r6, r10, r12\n\t"
  109087. #endif
  109088. "mov r4, #0\n\t"
  109089. "mov r7, #0\n\t"
  109090. /* A[1] * A[11] */
  109091. "ldr r10, [%[a], #44]\n\t"
  109092. "ldr r12, [%[a], #4]\n\t"
  109093. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109094. "lsl r8, r10, #16\n\t"
  109095. "lsl r9, r12, #16\n\t"
  109096. "lsr r8, r8, #16\n\t"
  109097. "lsr r9, r9, #16\n\t"
  109098. "mul r9, r8, r9\n\t"
  109099. "adds r5, r5, r9\n\t"
  109100. "adcs r6, r6, #0\n\t"
  109101. "adc r7, r7, #0\n\t"
  109102. "lsr r9, r12, #16\n\t"
  109103. "mul r8, r9, r8\n\t"
  109104. "lsr r9, r8, #16\n\t"
  109105. "lsl r8, r8, #16\n\t"
  109106. "adds r5, r5, r8\n\t"
  109107. "adcs r6, r6, r9\n\t"
  109108. "adc r7, r7, #0\n\t"
  109109. "lsr r8, r10, #16\n\t"
  109110. "lsr r9, r12, #16\n\t"
  109111. "mul r9, r8, r9\n\t"
  109112. "adds r6, r6, r9\n\t"
  109113. "adc r7, r7, #0\n\t"
  109114. "lsl r9, r12, #16\n\t"
  109115. "lsr r9, r9, #16\n\t"
  109116. "mul r8, r9, r8\n\t"
  109117. "lsr r9, r8, #16\n\t"
  109118. "lsl r8, r8, #16\n\t"
  109119. "adds r5, r5, r8\n\t"
  109120. "adcs r6, r6, r9\n\t"
  109121. "adc r7, r7, #0\n\t"
  109122. #else
  109123. "umull r8, r9, r10, r12\n\t"
  109124. "adds r5, r5, r8\n\t"
  109125. "adcs r6, r6, r9\n\t"
  109126. "adc r7, r7, #0\n\t"
  109127. #endif
  109128. /* A[2] * A[10] */
  109129. "ldr r10, [%[a], #40]\n\t"
  109130. "ldr r12, [%[a], #8]\n\t"
  109131. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109132. "lsl r8, r10, #16\n\t"
  109133. "lsl r9, r12, #16\n\t"
  109134. "lsr r8, r8, #16\n\t"
  109135. "lsr r9, r9, #16\n\t"
  109136. "mul r9, r8, r9\n\t"
  109137. "adds r5, r5, r9\n\t"
  109138. "adcs r6, r6, #0\n\t"
  109139. "adc r7, r7, #0\n\t"
  109140. "lsr r9, r12, #16\n\t"
  109141. "mul r8, r9, r8\n\t"
  109142. "lsr r9, r8, #16\n\t"
  109143. "lsl r8, r8, #16\n\t"
  109144. "adds r5, r5, r8\n\t"
  109145. "adcs r6, r6, r9\n\t"
  109146. "adc r7, r7, #0\n\t"
  109147. "lsr r8, r10, #16\n\t"
  109148. "lsr r9, r12, #16\n\t"
  109149. "mul r9, r8, r9\n\t"
  109150. "adds r6, r6, r9\n\t"
  109151. "adc r7, r7, #0\n\t"
  109152. "lsl r9, r12, #16\n\t"
  109153. "lsr r9, r9, #16\n\t"
  109154. "mul r8, r9, r8\n\t"
  109155. "lsr r9, r8, #16\n\t"
  109156. "lsl r8, r8, #16\n\t"
  109157. "adds r5, r5, r8\n\t"
  109158. "adcs r6, r6, r9\n\t"
  109159. "adc r7, r7, #0\n\t"
  109160. #else
  109161. "umull r8, r9, r10, r12\n\t"
  109162. "adds r5, r5, r8\n\t"
  109163. "adcs r6, r6, r9\n\t"
  109164. "adc r7, r7, #0\n\t"
  109165. #endif
  109166. /* A[3] * A[9] */
  109167. "ldr r10, [%[a], #36]\n\t"
  109168. "ldr r12, [%[a], #12]\n\t"
  109169. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109170. "lsl r8, r10, #16\n\t"
  109171. "lsl r9, r12, #16\n\t"
  109172. "lsr r8, r8, #16\n\t"
  109173. "lsr r9, r9, #16\n\t"
  109174. "mul r9, r8, r9\n\t"
  109175. "adds r5, r5, r9\n\t"
  109176. "adcs r6, r6, #0\n\t"
  109177. "adc r7, r7, #0\n\t"
  109178. "lsr r9, r12, #16\n\t"
  109179. "mul r8, r9, r8\n\t"
  109180. "lsr r9, r8, #16\n\t"
  109181. "lsl r8, r8, #16\n\t"
  109182. "adds r5, r5, r8\n\t"
  109183. "adcs r6, r6, r9\n\t"
  109184. "adc r7, r7, #0\n\t"
  109185. "lsr r8, r10, #16\n\t"
  109186. "lsr r9, r12, #16\n\t"
  109187. "mul r9, r8, r9\n\t"
  109188. "adds r6, r6, r9\n\t"
  109189. "adc r7, r7, #0\n\t"
  109190. "lsl r9, r12, #16\n\t"
  109191. "lsr r9, r9, #16\n\t"
  109192. "mul r8, r9, r8\n\t"
  109193. "lsr r9, r8, #16\n\t"
  109194. "lsl r8, r8, #16\n\t"
  109195. "adds r5, r5, r8\n\t"
  109196. "adcs r6, r6, r9\n\t"
  109197. "adc r7, r7, #0\n\t"
  109198. #else
  109199. "umull r8, r9, r10, r12\n\t"
  109200. "adds r5, r5, r8\n\t"
  109201. "adcs r6, r6, r9\n\t"
  109202. "adc r7, r7, #0\n\t"
  109203. #endif
  109204. /* A[4] * A[8] */
  109205. "ldr r10, [%[a], #32]\n\t"
  109206. "ldr r12, [%[a], #16]\n\t"
  109207. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109208. "lsl r8, r10, #16\n\t"
  109209. "lsl r9, r12, #16\n\t"
  109210. "lsr r8, r8, #16\n\t"
  109211. "lsr r9, r9, #16\n\t"
  109212. "mul r9, r8, r9\n\t"
  109213. "adds r5, r5, r9\n\t"
  109214. "adcs r6, r6, #0\n\t"
  109215. "adc r7, r7, #0\n\t"
  109216. "lsr r9, r12, #16\n\t"
  109217. "mul r8, r9, r8\n\t"
  109218. "lsr r9, r8, #16\n\t"
  109219. "lsl r8, r8, #16\n\t"
  109220. "adds r5, r5, r8\n\t"
  109221. "adcs r6, r6, r9\n\t"
  109222. "adc r7, r7, #0\n\t"
  109223. "lsr r8, r10, #16\n\t"
  109224. "lsr r9, r12, #16\n\t"
  109225. "mul r9, r8, r9\n\t"
  109226. "adds r6, r6, r9\n\t"
  109227. "adc r7, r7, #0\n\t"
  109228. "lsl r9, r12, #16\n\t"
  109229. "lsr r9, r9, #16\n\t"
  109230. "mul r8, r9, r8\n\t"
  109231. "lsr r9, r8, #16\n\t"
  109232. "lsl r8, r8, #16\n\t"
  109233. "adds r5, r5, r8\n\t"
  109234. "adcs r6, r6, r9\n\t"
  109235. "adc r7, r7, #0\n\t"
  109236. #else
  109237. "umull r8, r9, r10, r12\n\t"
  109238. "adds r5, r5, r8\n\t"
  109239. "adcs r6, r6, r9\n\t"
  109240. "adc r7, r7, #0\n\t"
  109241. #endif
  109242. /* A[5] * A[7] */
  109243. "ldr r10, [%[a], #28]\n\t"
  109244. "ldr r12, [%[a], #20]\n\t"
  109245. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109246. "lsl r8, r10, #16\n\t"
  109247. "lsl r9, r12, #16\n\t"
  109248. "lsr r8, r8, #16\n\t"
  109249. "lsr r9, r9, #16\n\t"
  109250. "mul r9, r8, r9\n\t"
  109251. "adds r5, r5, r9\n\t"
  109252. "adcs r6, r6, #0\n\t"
  109253. "adc r7, r7, #0\n\t"
  109254. "lsr r9, r12, #16\n\t"
  109255. "mul r8, r9, r8\n\t"
  109256. "lsr r9, r8, #16\n\t"
  109257. "lsl r8, r8, #16\n\t"
  109258. "adds r5, r5, r8\n\t"
  109259. "adcs r6, r6, r9\n\t"
  109260. "adc r7, r7, #0\n\t"
  109261. "lsr r8, r10, #16\n\t"
  109262. "lsr r9, r12, #16\n\t"
  109263. "mul r9, r8, r9\n\t"
  109264. "adds r6, r6, r9\n\t"
  109265. "adc r7, r7, #0\n\t"
  109266. "lsl r9, r12, #16\n\t"
  109267. "lsr r9, r9, #16\n\t"
  109268. "mul r8, r9, r8\n\t"
  109269. "lsr r9, r8, #16\n\t"
  109270. "lsl r8, r8, #16\n\t"
  109271. "adds r5, r5, r8\n\t"
  109272. "adcs r6, r6, r9\n\t"
  109273. "adc r7, r7, #0\n\t"
  109274. #else
  109275. "umull r8, r9, r10, r12\n\t"
  109276. "adds r5, r5, r8\n\t"
  109277. "adcs r6, r6, r9\n\t"
  109278. "adc r7, r7, #0\n\t"
  109279. #endif
  109280. /* A[6] * A[6] */
  109281. "ldr r10, [%[a], #24]\n\t"
  109282. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109283. "lsl r8, r10, #16\n\t"
  109284. "lsr r9, r10, #16\n\t"
  109285. "lsr r8, r8, #16\n\t"
  109286. "mov r12, r8\n\t"
  109287. "mul r8, r12, r8\n\t"
  109288. "mov r12, r9\n\t"
  109289. "mul r9, r12, r9\n\t"
  109290. "adds r2, r2, r8\n\t"
  109291. "adcs r3, r3, r9\n\t"
  109292. "adc r4, r4, #0\n\t"
  109293. "lsr r9, r10, #16\n\t"
  109294. "lsl r8, r10, #16\n\t"
  109295. "lsr r8, r8, #16\n\t"
  109296. "mul r8, r9, r8\n\t"
  109297. "lsr r9, r8, #15\n\t"
  109298. "lsl r8, r8, #17\n\t"
  109299. "adds r2, r2, r8\n\t"
  109300. "adcs r3, r3, r9\n\t"
  109301. "adc r4, r4, #0\n\t"
  109302. "adds r5, r5, r5\n\t"
  109303. "adcs r6, r6, r6\n\t"
  109304. "adc r7, r7, r7\n\t"
  109305. #else
  109306. "umull r8, r9, r10, r10\n\t"
  109307. "adds r5, r5, r5\n\t"
  109308. "adcs r6, r6, r6\n\t"
  109309. "adc r7, r7, r7\n\t"
  109310. "adds r2, r2, r8\n\t"
  109311. "adcs r3, r3, r9\n\t"
  109312. "adc r4, r4, #0\n\t"
  109313. #endif
  109314. "adds r2, r2, r5\n\t"
  109315. "adcs r3, r3, r6\n\t"
  109316. "adc r4, r4, r7\n\t"
  109317. "str r2, [sp, #48]\n\t"
  109318. /* A[0] * A[13] */
  109319. "ldr r10, [%[a], #52]\n\t"
  109320. "ldr r12, [%[a]]\n\t"
  109321. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109322. "lsl r8, r10, #16\n\t"
  109323. "lsl r5, r12, #16\n\t"
  109324. "lsr r8, r8, #16\n\t"
  109325. "lsr r5, r5, #16\n\t"
  109326. "mul r5, r8, r5\n\t"
  109327. "lsr r9, r12, #16\n\t"
  109328. "mul r8, r9, r8\n\t"
  109329. "lsr r6, r8, #16\n\t"
  109330. "lsl r8, r8, #16\n\t"
  109331. "adds r5, r5, r8\n\t"
  109332. "adc r6, r6, #0\n\t"
  109333. "lsr r8, r10, #16\n\t"
  109334. "mul r9, r8, r9\n\t"
  109335. "add r6, r6, r9\n\t"
  109336. "lsl r9, r12, #16\n\t"
  109337. "lsr r9, r9, #16\n\t"
  109338. "mul r8, r9, r8\n\t"
  109339. "lsr r9, r8, #16\n\t"
  109340. "lsl r8, r8, #16\n\t"
  109341. "adds r5, r5, r8\n\t"
  109342. "adc r6, r6, r9\n\t"
  109343. #else
  109344. "umull r5, r6, r10, r12\n\t"
  109345. #endif
  109346. "mov r2, #0\n\t"
  109347. "mov r7, #0\n\t"
  109348. /* A[1] * A[12] */
  109349. "ldr r10, [%[a], #48]\n\t"
  109350. "ldr r12, [%[a], #4]\n\t"
  109351. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109352. "lsl r8, r10, #16\n\t"
  109353. "lsl r9, r12, #16\n\t"
  109354. "lsr r8, r8, #16\n\t"
  109355. "lsr r9, r9, #16\n\t"
  109356. "mul r9, r8, r9\n\t"
  109357. "adds r5, r5, r9\n\t"
  109358. "adcs r6, r6, #0\n\t"
  109359. "adc r7, r7, #0\n\t"
  109360. "lsr r9, r12, #16\n\t"
  109361. "mul r8, r9, r8\n\t"
  109362. "lsr r9, r8, #16\n\t"
  109363. "lsl r8, r8, #16\n\t"
  109364. "adds r5, r5, r8\n\t"
  109365. "adcs r6, r6, r9\n\t"
  109366. "adc r7, r7, #0\n\t"
  109367. "lsr r8, r10, #16\n\t"
  109368. "lsr r9, r12, #16\n\t"
  109369. "mul r9, r8, r9\n\t"
  109370. "adds r6, r6, r9\n\t"
  109371. "adc r7, r7, #0\n\t"
  109372. "lsl r9, r12, #16\n\t"
  109373. "lsr r9, r9, #16\n\t"
  109374. "mul r8, r9, r8\n\t"
  109375. "lsr r9, r8, #16\n\t"
  109376. "lsl r8, r8, #16\n\t"
  109377. "adds r5, r5, r8\n\t"
  109378. "adcs r6, r6, r9\n\t"
  109379. "adc r7, r7, #0\n\t"
  109380. #else
  109381. "umull r8, r9, r10, r12\n\t"
  109382. "adds r5, r5, r8\n\t"
  109383. "adcs r6, r6, r9\n\t"
  109384. "adc r7, r7, #0\n\t"
  109385. #endif
  109386. /* A[2] * A[11] */
  109387. "ldr r10, [%[a], #44]\n\t"
  109388. "ldr r12, [%[a], #8]\n\t"
  109389. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109390. "lsl r8, r10, #16\n\t"
  109391. "lsl r9, r12, #16\n\t"
  109392. "lsr r8, r8, #16\n\t"
  109393. "lsr r9, r9, #16\n\t"
  109394. "mul r9, r8, r9\n\t"
  109395. "adds r5, r5, r9\n\t"
  109396. "adcs r6, r6, #0\n\t"
  109397. "adc r7, r7, #0\n\t"
  109398. "lsr r9, r12, #16\n\t"
  109399. "mul r8, r9, r8\n\t"
  109400. "lsr r9, r8, #16\n\t"
  109401. "lsl r8, r8, #16\n\t"
  109402. "adds r5, r5, r8\n\t"
  109403. "adcs r6, r6, r9\n\t"
  109404. "adc r7, r7, #0\n\t"
  109405. "lsr r8, r10, #16\n\t"
  109406. "lsr r9, r12, #16\n\t"
  109407. "mul r9, r8, r9\n\t"
  109408. "adds r6, r6, r9\n\t"
  109409. "adc r7, r7, #0\n\t"
  109410. "lsl r9, r12, #16\n\t"
  109411. "lsr r9, r9, #16\n\t"
  109412. "mul r8, r9, r8\n\t"
  109413. "lsr r9, r8, #16\n\t"
  109414. "lsl r8, r8, #16\n\t"
  109415. "adds r5, r5, r8\n\t"
  109416. "adcs r6, r6, r9\n\t"
  109417. "adc r7, r7, #0\n\t"
  109418. #else
  109419. "umull r8, r9, r10, r12\n\t"
  109420. "adds r5, r5, r8\n\t"
  109421. "adcs r6, r6, r9\n\t"
  109422. "adc r7, r7, #0\n\t"
  109423. #endif
  109424. /* A[3] * A[10] */
  109425. "ldr r10, [%[a], #40]\n\t"
  109426. "ldr r12, [%[a], #12]\n\t"
  109427. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109428. "lsl r8, r10, #16\n\t"
  109429. "lsl r9, r12, #16\n\t"
  109430. "lsr r8, r8, #16\n\t"
  109431. "lsr r9, r9, #16\n\t"
  109432. "mul r9, r8, r9\n\t"
  109433. "adds r5, r5, r9\n\t"
  109434. "adcs r6, r6, #0\n\t"
  109435. "adc r7, r7, #0\n\t"
  109436. "lsr r9, r12, #16\n\t"
  109437. "mul r8, r9, r8\n\t"
  109438. "lsr r9, r8, #16\n\t"
  109439. "lsl r8, r8, #16\n\t"
  109440. "adds r5, r5, r8\n\t"
  109441. "adcs r6, r6, r9\n\t"
  109442. "adc r7, r7, #0\n\t"
  109443. "lsr r8, r10, #16\n\t"
  109444. "lsr r9, r12, #16\n\t"
  109445. "mul r9, r8, r9\n\t"
  109446. "adds r6, r6, r9\n\t"
  109447. "adc r7, r7, #0\n\t"
  109448. "lsl r9, r12, #16\n\t"
  109449. "lsr r9, r9, #16\n\t"
  109450. "mul r8, r9, r8\n\t"
  109451. "lsr r9, r8, #16\n\t"
  109452. "lsl r8, r8, #16\n\t"
  109453. "adds r5, r5, r8\n\t"
  109454. "adcs r6, r6, r9\n\t"
  109455. "adc r7, r7, #0\n\t"
  109456. #else
  109457. "umull r8, r9, r10, r12\n\t"
  109458. "adds r5, r5, r8\n\t"
  109459. "adcs r6, r6, r9\n\t"
  109460. "adc r7, r7, #0\n\t"
  109461. #endif
  109462. /* A[4] * A[9] */
  109463. "ldr r10, [%[a], #36]\n\t"
  109464. "ldr r12, [%[a], #16]\n\t"
  109465. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109466. "lsl r8, r10, #16\n\t"
  109467. "lsl r9, r12, #16\n\t"
  109468. "lsr r8, r8, #16\n\t"
  109469. "lsr r9, r9, #16\n\t"
  109470. "mul r9, r8, r9\n\t"
  109471. "adds r5, r5, r9\n\t"
  109472. "adcs r6, r6, #0\n\t"
  109473. "adc r7, r7, #0\n\t"
  109474. "lsr r9, r12, #16\n\t"
  109475. "mul r8, r9, r8\n\t"
  109476. "lsr r9, r8, #16\n\t"
  109477. "lsl r8, r8, #16\n\t"
  109478. "adds r5, r5, r8\n\t"
  109479. "adcs r6, r6, r9\n\t"
  109480. "adc r7, r7, #0\n\t"
  109481. "lsr r8, r10, #16\n\t"
  109482. "lsr r9, r12, #16\n\t"
  109483. "mul r9, r8, r9\n\t"
  109484. "adds r6, r6, r9\n\t"
  109485. "adc r7, r7, #0\n\t"
  109486. "lsl r9, r12, #16\n\t"
  109487. "lsr r9, r9, #16\n\t"
  109488. "mul r8, r9, r8\n\t"
  109489. "lsr r9, r8, #16\n\t"
  109490. "lsl r8, r8, #16\n\t"
  109491. "adds r5, r5, r8\n\t"
  109492. "adcs r6, r6, r9\n\t"
  109493. "adc r7, r7, #0\n\t"
  109494. #else
  109495. "umull r8, r9, r10, r12\n\t"
  109496. "adds r5, r5, r8\n\t"
  109497. "adcs r6, r6, r9\n\t"
  109498. "adc r7, r7, #0\n\t"
  109499. #endif
  109500. /* A[5] * A[8] */
  109501. "ldr r10, [%[a], #32]\n\t"
  109502. "ldr r12, [%[a], #20]\n\t"
  109503. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109504. "lsl r8, r10, #16\n\t"
  109505. "lsl r9, r12, #16\n\t"
  109506. "lsr r8, r8, #16\n\t"
  109507. "lsr r9, r9, #16\n\t"
  109508. "mul r9, r8, r9\n\t"
  109509. "adds r5, r5, r9\n\t"
  109510. "adcs r6, r6, #0\n\t"
  109511. "adc r7, r7, #0\n\t"
  109512. "lsr r9, r12, #16\n\t"
  109513. "mul r8, r9, r8\n\t"
  109514. "lsr r9, r8, #16\n\t"
  109515. "lsl r8, r8, #16\n\t"
  109516. "adds r5, r5, r8\n\t"
  109517. "adcs r6, r6, r9\n\t"
  109518. "adc r7, r7, #0\n\t"
  109519. "lsr r8, r10, #16\n\t"
  109520. "lsr r9, r12, #16\n\t"
  109521. "mul r9, r8, r9\n\t"
  109522. "adds r6, r6, r9\n\t"
  109523. "adc r7, r7, #0\n\t"
  109524. "lsl r9, r12, #16\n\t"
  109525. "lsr r9, r9, #16\n\t"
  109526. "mul r8, r9, r8\n\t"
  109527. "lsr r9, r8, #16\n\t"
  109528. "lsl r8, r8, #16\n\t"
  109529. "adds r5, r5, r8\n\t"
  109530. "adcs r6, r6, r9\n\t"
  109531. "adc r7, r7, #0\n\t"
  109532. #else
  109533. "umull r8, r9, r10, r12\n\t"
  109534. "adds r5, r5, r8\n\t"
  109535. "adcs r6, r6, r9\n\t"
  109536. "adc r7, r7, #0\n\t"
  109537. #endif
  109538. /* A[6] * A[7] */
  109539. "ldr r10, [%[a], #28]\n\t"
  109540. "ldr r12, [%[a], #24]\n\t"
  109541. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109542. "lsl r8, r10, #16\n\t"
  109543. "lsl r9, r12, #16\n\t"
  109544. "lsr r8, r8, #16\n\t"
  109545. "lsr r9, r9, #16\n\t"
  109546. "mul r9, r8, r9\n\t"
  109547. "adds r5, r5, r9\n\t"
  109548. "adcs r6, r6, #0\n\t"
  109549. "adc r7, r7, #0\n\t"
  109550. "lsr r9, r12, #16\n\t"
  109551. "mul r8, r9, r8\n\t"
  109552. "lsr r9, r8, #16\n\t"
  109553. "lsl r8, r8, #16\n\t"
  109554. "adds r5, r5, r8\n\t"
  109555. "adcs r6, r6, r9\n\t"
  109556. "adc r7, r7, #0\n\t"
  109557. "lsr r8, r10, #16\n\t"
  109558. "lsr r9, r12, #16\n\t"
  109559. "mul r9, r8, r9\n\t"
  109560. "adds r6, r6, r9\n\t"
  109561. "adc r7, r7, #0\n\t"
  109562. "lsl r9, r12, #16\n\t"
  109563. "lsr r9, r9, #16\n\t"
  109564. "mul r8, r9, r8\n\t"
  109565. "lsr r9, r8, #16\n\t"
  109566. "lsl r8, r8, #16\n\t"
  109567. "adds r5, r5, r8\n\t"
  109568. "adcs r6, r6, r9\n\t"
  109569. "adc r7, r7, #0\n\t"
  109570. #else
  109571. "umull r8, r9, r10, r12\n\t"
  109572. "adds r5, r5, r8\n\t"
  109573. "adcs r6, r6, r9\n\t"
  109574. "adc r7, r7, #0\n\t"
  109575. #endif
  109576. "adds r5, r5, r5\n\t"
  109577. "adcs r6, r6, r6\n\t"
  109578. "adc r7, r7, r7\n\t"
  109579. "adds r3, r3, r5\n\t"
  109580. "adcs r4, r4, r6\n\t"
  109581. "adc r2, r2, r7\n\t"
  109582. "str r3, [sp, #52]\n\t"
  109583. /* A[0] * A[14] */
  109584. "ldr r10, [%[a], #56]\n\t"
  109585. "ldr r12, [%[a]]\n\t"
  109586. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109587. "lsl r8, r10, #16\n\t"
  109588. "lsl r5, r12, #16\n\t"
  109589. "lsr r8, r8, #16\n\t"
  109590. "lsr r5, r5, #16\n\t"
  109591. "mul r5, r8, r5\n\t"
  109592. "lsr r9, r12, #16\n\t"
  109593. "mul r8, r9, r8\n\t"
  109594. "lsr r6, r8, #16\n\t"
  109595. "lsl r8, r8, #16\n\t"
  109596. "adds r5, r5, r8\n\t"
  109597. "adc r6, r6, #0\n\t"
  109598. "lsr r8, r10, #16\n\t"
  109599. "mul r9, r8, r9\n\t"
  109600. "add r6, r6, r9\n\t"
  109601. "lsl r9, r12, #16\n\t"
  109602. "lsr r9, r9, #16\n\t"
  109603. "mul r8, r9, r8\n\t"
  109604. "lsr r9, r8, #16\n\t"
  109605. "lsl r8, r8, #16\n\t"
  109606. "adds r5, r5, r8\n\t"
  109607. "adc r6, r6, r9\n\t"
  109608. #else
  109609. "umull r5, r6, r10, r12\n\t"
  109610. #endif
  109611. "mov r3, #0\n\t"
  109612. "mov r7, #0\n\t"
  109613. /* A[1] * A[13] */
  109614. "ldr r10, [%[a], #52]\n\t"
  109615. "ldr r12, [%[a], #4]\n\t"
  109616. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109617. "lsl r8, r10, #16\n\t"
  109618. "lsl r9, r12, #16\n\t"
  109619. "lsr r8, r8, #16\n\t"
  109620. "lsr r9, r9, #16\n\t"
  109621. "mul r9, r8, r9\n\t"
  109622. "adds r5, r5, r9\n\t"
  109623. "adcs r6, r6, #0\n\t"
  109624. "adc r7, r7, #0\n\t"
  109625. "lsr r9, r12, #16\n\t"
  109626. "mul r8, r9, r8\n\t"
  109627. "lsr r9, r8, #16\n\t"
  109628. "lsl r8, r8, #16\n\t"
  109629. "adds r5, r5, r8\n\t"
  109630. "adcs r6, r6, r9\n\t"
  109631. "adc r7, r7, #0\n\t"
  109632. "lsr r8, r10, #16\n\t"
  109633. "lsr r9, r12, #16\n\t"
  109634. "mul r9, r8, r9\n\t"
  109635. "adds r6, r6, r9\n\t"
  109636. "adc r7, r7, #0\n\t"
  109637. "lsl r9, r12, #16\n\t"
  109638. "lsr r9, r9, #16\n\t"
  109639. "mul r8, r9, r8\n\t"
  109640. "lsr r9, r8, #16\n\t"
  109641. "lsl r8, r8, #16\n\t"
  109642. "adds r5, r5, r8\n\t"
  109643. "adcs r6, r6, r9\n\t"
  109644. "adc r7, r7, #0\n\t"
  109645. #else
  109646. "umull r8, r9, r10, r12\n\t"
  109647. "adds r5, r5, r8\n\t"
  109648. "adcs r6, r6, r9\n\t"
  109649. "adc r7, r7, #0\n\t"
  109650. #endif
  109651. /* A[2] * A[12] */
  109652. "ldr r10, [%[a], #48]\n\t"
  109653. "ldr r12, [%[a], #8]\n\t"
  109654. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109655. "lsl r8, r10, #16\n\t"
  109656. "lsl r9, r12, #16\n\t"
  109657. "lsr r8, r8, #16\n\t"
  109658. "lsr r9, r9, #16\n\t"
  109659. "mul r9, r8, r9\n\t"
  109660. "adds r5, r5, r9\n\t"
  109661. "adcs r6, r6, #0\n\t"
  109662. "adc r7, r7, #0\n\t"
  109663. "lsr r9, r12, #16\n\t"
  109664. "mul r8, r9, r8\n\t"
  109665. "lsr r9, r8, #16\n\t"
  109666. "lsl r8, r8, #16\n\t"
  109667. "adds r5, r5, r8\n\t"
  109668. "adcs r6, r6, r9\n\t"
  109669. "adc r7, r7, #0\n\t"
  109670. "lsr r8, r10, #16\n\t"
  109671. "lsr r9, r12, #16\n\t"
  109672. "mul r9, r8, r9\n\t"
  109673. "adds r6, r6, r9\n\t"
  109674. "adc r7, r7, #0\n\t"
  109675. "lsl r9, r12, #16\n\t"
  109676. "lsr r9, r9, #16\n\t"
  109677. "mul r8, r9, r8\n\t"
  109678. "lsr r9, r8, #16\n\t"
  109679. "lsl r8, r8, #16\n\t"
  109680. "adds r5, r5, r8\n\t"
  109681. "adcs r6, r6, r9\n\t"
  109682. "adc r7, r7, #0\n\t"
  109683. #else
  109684. "umull r8, r9, r10, r12\n\t"
  109685. "adds r5, r5, r8\n\t"
  109686. "adcs r6, r6, r9\n\t"
  109687. "adc r7, r7, #0\n\t"
  109688. #endif
  109689. /* A[3] * A[11] */
  109690. "ldr r10, [%[a], #44]\n\t"
  109691. "ldr r12, [%[a], #12]\n\t"
  109692. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109693. "lsl r8, r10, #16\n\t"
  109694. "lsl r9, r12, #16\n\t"
  109695. "lsr r8, r8, #16\n\t"
  109696. "lsr r9, r9, #16\n\t"
  109697. "mul r9, r8, r9\n\t"
  109698. "adds r5, r5, r9\n\t"
  109699. "adcs r6, r6, #0\n\t"
  109700. "adc r7, r7, #0\n\t"
  109701. "lsr r9, r12, #16\n\t"
  109702. "mul r8, r9, r8\n\t"
  109703. "lsr r9, r8, #16\n\t"
  109704. "lsl r8, r8, #16\n\t"
  109705. "adds r5, r5, r8\n\t"
  109706. "adcs r6, r6, r9\n\t"
  109707. "adc r7, r7, #0\n\t"
  109708. "lsr r8, r10, #16\n\t"
  109709. "lsr r9, r12, #16\n\t"
  109710. "mul r9, r8, r9\n\t"
  109711. "adds r6, r6, r9\n\t"
  109712. "adc r7, r7, #0\n\t"
  109713. "lsl r9, r12, #16\n\t"
  109714. "lsr r9, r9, #16\n\t"
  109715. "mul r8, r9, r8\n\t"
  109716. "lsr r9, r8, #16\n\t"
  109717. "lsl r8, r8, #16\n\t"
  109718. "adds r5, r5, r8\n\t"
  109719. "adcs r6, r6, r9\n\t"
  109720. "adc r7, r7, #0\n\t"
  109721. #else
  109722. "umull r8, r9, r10, r12\n\t"
  109723. "adds r5, r5, r8\n\t"
  109724. "adcs r6, r6, r9\n\t"
  109725. "adc r7, r7, #0\n\t"
  109726. #endif
  109727. /* A[4] * A[10] */
  109728. "ldr r10, [%[a], #40]\n\t"
  109729. "ldr r12, [%[a], #16]\n\t"
  109730. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109731. "lsl r8, r10, #16\n\t"
  109732. "lsl r9, r12, #16\n\t"
  109733. "lsr r8, r8, #16\n\t"
  109734. "lsr r9, r9, #16\n\t"
  109735. "mul r9, r8, r9\n\t"
  109736. "adds r5, r5, r9\n\t"
  109737. "adcs r6, r6, #0\n\t"
  109738. "adc r7, r7, #0\n\t"
  109739. "lsr r9, r12, #16\n\t"
  109740. "mul r8, r9, r8\n\t"
  109741. "lsr r9, r8, #16\n\t"
  109742. "lsl r8, r8, #16\n\t"
  109743. "adds r5, r5, r8\n\t"
  109744. "adcs r6, r6, r9\n\t"
  109745. "adc r7, r7, #0\n\t"
  109746. "lsr r8, r10, #16\n\t"
  109747. "lsr r9, r12, #16\n\t"
  109748. "mul r9, r8, r9\n\t"
  109749. "adds r6, r6, r9\n\t"
  109750. "adc r7, r7, #0\n\t"
  109751. "lsl r9, r12, #16\n\t"
  109752. "lsr r9, r9, #16\n\t"
  109753. "mul r8, r9, r8\n\t"
  109754. "lsr r9, r8, #16\n\t"
  109755. "lsl r8, r8, #16\n\t"
  109756. "adds r5, r5, r8\n\t"
  109757. "adcs r6, r6, r9\n\t"
  109758. "adc r7, r7, #0\n\t"
  109759. #else
  109760. "umull r8, r9, r10, r12\n\t"
  109761. "adds r5, r5, r8\n\t"
  109762. "adcs r6, r6, r9\n\t"
  109763. "adc r7, r7, #0\n\t"
  109764. #endif
  109765. /* A[5] * A[9] */
  109766. "ldr r10, [%[a], #36]\n\t"
  109767. "ldr r12, [%[a], #20]\n\t"
  109768. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109769. "lsl r8, r10, #16\n\t"
  109770. "lsl r9, r12, #16\n\t"
  109771. "lsr r8, r8, #16\n\t"
  109772. "lsr r9, r9, #16\n\t"
  109773. "mul r9, r8, r9\n\t"
  109774. "adds r5, r5, r9\n\t"
  109775. "adcs r6, r6, #0\n\t"
  109776. "adc r7, r7, #0\n\t"
  109777. "lsr r9, r12, #16\n\t"
  109778. "mul r8, r9, r8\n\t"
  109779. "lsr r9, r8, #16\n\t"
  109780. "lsl r8, r8, #16\n\t"
  109781. "adds r5, r5, r8\n\t"
  109782. "adcs r6, r6, r9\n\t"
  109783. "adc r7, r7, #0\n\t"
  109784. "lsr r8, r10, #16\n\t"
  109785. "lsr r9, r12, #16\n\t"
  109786. "mul r9, r8, r9\n\t"
  109787. "adds r6, r6, r9\n\t"
  109788. "adc r7, r7, #0\n\t"
  109789. "lsl r9, r12, #16\n\t"
  109790. "lsr r9, r9, #16\n\t"
  109791. "mul r8, r9, r8\n\t"
  109792. "lsr r9, r8, #16\n\t"
  109793. "lsl r8, r8, #16\n\t"
  109794. "adds r5, r5, r8\n\t"
  109795. "adcs r6, r6, r9\n\t"
  109796. "adc r7, r7, #0\n\t"
  109797. #else
  109798. "umull r8, r9, r10, r12\n\t"
  109799. "adds r5, r5, r8\n\t"
  109800. "adcs r6, r6, r9\n\t"
  109801. "adc r7, r7, #0\n\t"
  109802. #endif
  109803. /* A[6] * A[8] */
  109804. "ldr r10, [%[a], #32]\n\t"
  109805. "ldr r12, [%[a], #24]\n\t"
  109806. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109807. "lsl r8, r10, #16\n\t"
  109808. "lsl r9, r12, #16\n\t"
  109809. "lsr r8, r8, #16\n\t"
  109810. "lsr r9, r9, #16\n\t"
  109811. "mul r9, r8, r9\n\t"
  109812. "adds r5, r5, r9\n\t"
  109813. "adcs r6, r6, #0\n\t"
  109814. "adc r7, r7, #0\n\t"
  109815. "lsr r9, r12, #16\n\t"
  109816. "mul r8, r9, r8\n\t"
  109817. "lsr r9, r8, #16\n\t"
  109818. "lsl r8, r8, #16\n\t"
  109819. "adds r5, r5, r8\n\t"
  109820. "adcs r6, r6, r9\n\t"
  109821. "adc r7, r7, #0\n\t"
  109822. "lsr r8, r10, #16\n\t"
  109823. "lsr r9, r12, #16\n\t"
  109824. "mul r9, r8, r9\n\t"
  109825. "adds r6, r6, r9\n\t"
  109826. "adc r7, r7, #0\n\t"
  109827. "lsl r9, r12, #16\n\t"
  109828. "lsr r9, r9, #16\n\t"
  109829. "mul r8, r9, r8\n\t"
  109830. "lsr r9, r8, #16\n\t"
  109831. "lsl r8, r8, #16\n\t"
  109832. "adds r5, r5, r8\n\t"
  109833. "adcs r6, r6, r9\n\t"
  109834. "adc r7, r7, #0\n\t"
  109835. #else
  109836. "umull r8, r9, r10, r12\n\t"
  109837. "adds r5, r5, r8\n\t"
  109838. "adcs r6, r6, r9\n\t"
  109839. "adc r7, r7, #0\n\t"
  109840. #endif
  109841. /* A[7] * A[7] */
  109842. "ldr r10, [%[a], #28]\n\t"
  109843. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109844. "lsl r8, r10, #16\n\t"
  109845. "lsr r9, r10, #16\n\t"
  109846. "lsr r8, r8, #16\n\t"
  109847. "mov r12, r8\n\t"
  109848. "mul r8, r12, r8\n\t"
  109849. "mov r12, r9\n\t"
  109850. "mul r9, r12, r9\n\t"
  109851. "adds r4, r4, r8\n\t"
  109852. "adcs r2, r2, r9\n\t"
  109853. "adc r3, r3, #0\n\t"
  109854. "lsr r9, r10, #16\n\t"
  109855. "lsl r8, r10, #16\n\t"
  109856. "lsr r8, r8, #16\n\t"
  109857. "mul r8, r9, r8\n\t"
  109858. "lsr r9, r8, #15\n\t"
  109859. "lsl r8, r8, #17\n\t"
  109860. "adds r4, r4, r8\n\t"
  109861. "adcs r2, r2, r9\n\t"
  109862. "adc r3, r3, #0\n\t"
  109863. "adds r5, r5, r5\n\t"
  109864. "adcs r6, r6, r6\n\t"
  109865. "adc r7, r7, r7\n\t"
  109866. #else
  109867. "umull r8, r9, r10, r10\n\t"
  109868. "adds r5, r5, r5\n\t"
  109869. "adcs r6, r6, r6\n\t"
  109870. "adc r7, r7, r7\n\t"
  109871. "adds r4, r4, r8\n\t"
  109872. "adcs r2, r2, r9\n\t"
  109873. "adc r3, r3, #0\n\t"
  109874. #endif
  109875. "adds r4, r4, r5\n\t"
  109876. "adcs r2, r2, r6\n\t"
  109877. "adc r3, r3, r7\n\t"
  109878. "str r4, [sp, #56]\n\t"
  109879. /* A[0] * A[15] */
  109880. "ldr r10, [%[a], #60]\n\t"
  109881. "ldr r12, [%[a]]\n\t"
  109882. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109883. "lsl r8, r10, #16\n\t"
  109884. "lsl r5, r12, #16\n\t"
  109885. "lsr r8, r8, #16\n\t"
  109886. "lsr r5, r5, #16\n\t"
  109887. "mul r5, r8, r5\n\t"
  109888. "lsr r9, r12, #16\n\t"
  109889. "mul r8, r9, r8\n\t"
  109890. "lsr r6, r8, #16\n\t"
  109891. "lsl r8, r8, #16\n\t"
  109892. "adds r5, r5, r8\n\t"
  109893. "adc r6, r6, #0\n\t"
  109894. "lsr r8, r10, #16\n\t"
  109895. "mul r9, r8, r9\n\t"
  109896. "add r6, r6, r9\n\t"
  109897. "lsl r9, r12, #16\n\t"
  109898. "lsr r9, r9, #16\n\t"
  109899. "mul r8, r9, r8\n\t"
  109900. "lsr r9, r8, #16\n\t"
  109901. "lsl r8, r8, #16\n\t"
  109902. "adds r5, r5, r8\n\t"
  109903. "adc r6, r6, r9\n\t"
  109904. #else
  109905. "umull r5, r6, r10, r12\n\t"
  109906. #endif
  109907. "mov r4, #0\n\t"
  109908. "mov r7, #0\n\t"
  109909. /* A[1] * A[14] */
  109910. "ldr r10, [%[a], #56]\n\t"
  109911. "ldr r12, [%[a], #4]\n\t"
  109912. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109913. "lsl r8, r10, #16\n\t"
  109914. "lsl r9, r12, #16\n\t"
  109915. "lsr r8, r8, #16\n\t"
  109916. "lsr r9, r9, #16\n\t"
  109917. "mul r9, r8, r9\n\t"
  109918. "adds r5, r5, r9\n\t"
  109919. "adcs r6, r6, #0\n\t"
  109920. "adc r7, r7, #0\n\t"
  109921. "lsr r9, r12, #16\n\t"
  109922. "mul r8, r9, r8\n\t"
  109923. "lsr r9, r8, #16\n\t"
  109924. "lsl r8, r8, #16\n\t"
  109925. "adds r5, r5, r8\n\t"
  109926. "adcs r6, r6, r9\n\t"
  109927. "adc r7, r7, #0\n\t"
  109928. "lsr r8, r10, #16\n\t"
  109929. "lsr r9, r12, #16\n\t"
  109930. "mul r9, r8, r9\n\t"
  109931. "adds r6, r6, r9\n\t"
  109932. "adc r7, r7, #0\n\t"
  109933. "lsl r9, r12, #16\n\t"
  109934. "lsr r9, r9, #16\n\t"
  109935. "mul r8, r9, r8\n\t"
  109936. "lsr r9, r8, #16\n\t"
  109937. "lsl r8, r8, #16\n\t"
  109938. "adds r5, r5, r8\n\t"
  109939. "adcs r6, r6, r9\n\t"
  109940. "adc r7, r7, #0\n\t"
  109941. #else
  109942. "umull r8, r9, r10, r12\n\t"
  109943. "adds r5, r5, r8\n\t"
  109944. "adcs r6, r6, r9\n\t"
  109945. "adc r7, r7, #0\n\t"
  109946. #endif
  109947. /* A[2] * A[13] */
  109948. "ldr r10, [%[a], #52]\n\t"
  109949. "ldr r12, [%[a], #8]\n\t"
  109950. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109951. "lsl r8, r10, #16\n\t"
  109952. "lsl r9, r12, #16\n\t"
  109953. "lsr r8, r8, #16\n\t"
  109954. "lsr r9, r9, #16\n\t"
  109955. "mul r9, r8, r9\n\t"
  109956. "adds r5, r5, r9\n\t"
  109957. "adcs r6, r6, #0\n\t"
  109958. "adc r7, r7, #0\n\t"
  109959. "lsr r9, r12, #16\n\t"
  109960. "mul r8, r9, r8\n\t"
  109961. "lsr r9, r8, #16\n\t"
  109962. "lsl r8, r8, #16\n\t"
  109963. "adds r5, r5, r8\n\t"
  109964. "adcs r6, r6, r9\n\t"
  109965. "adc r7, r7, #0\n\t"
  109966. "lsr r8, r10, #16\n\t"
  109967. "lsr r9, r12, #16\n\t"
  109968. "mul r9, r8, r9\n\t"
  109969. "adds r6, r6, r9\n\t"
  109970. "adc r7, r7, #0\n\t"
  109971. "lsl r9, r12, #16\n\t"
  109972. "lsr r9, r9, #16\n\t"
  109973. "mul r8, r9, r8\n\t"
  109974. "lsr r9, r8, #16\n\t"
  109975. "lsl r8, r8, #16\n\t"
  109976. "adds r5, r5, r8\n\t"
  109977. "adcs r6, r6, r9\n\t"
  109978. "adc r7, r7, #0\n\t"
  109979. #else
  109980. "umull r8, r9, r10, r12\n\t"
  109981. "adds r5, r5, r8\n\t"
  109982. "adcs r6, r6, r9\n\t"
  109983. "adc r7, r7, #0\n\t"
  109984. #endif
  109985. /* A[3] * A[12] */
  109986. "ldr r10, [%[a], #48]\n\t"
  109987. "ldr r12, [%[a], #12]\n\t"
  109988. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  109989. "lsl r8, r10, #16\n\t"
  109990. "lsl r9, r12, #16\n\t"
  109991. "lsr r8, r8, #16\n\t"
  109992. "lsr r9, r9, #16\n\t"
  109993. "mul r9, r8, r9\n\t"
  109994. "adds r5, r5, r9\n\t"
  109995. "adcs r6, r6, #0\n\t"
  109996. "adc r7, r7, #0\n\t"
  109997. "lsr r9, r12, #16\n\t"
  109998. "mul r8, r9, r8\n\t"
  109999. "lsr r9, r8, #16\n\t"
  110000. "lsl r8, r8, #16\n\t"
  110001. "adds r5, r5, r8\n\t"
  110002. "adcs r6, r6, r9\n\t"
  110003. "adc r7, r7, #0\n\t"
  110004. "lsr r8, r10, #16\n\t"
  110005. "lsr r9, r12, #16\n\t"
  110006. "mul r9, r8, r9\n\t"
  110007. "adds r6, r6, r9\n\t"
  110008. "adc r7, r7, #0\n\t"
  110009. "lsl r9, r12, #16\n\t"
  110010. "lsr r9, r9, #16\n\t"
  110011. "mul r8, r9, r8\n\t"
  110012. "lsr r9, r8, #16\n\t"
  110013. "lsl r8, r8, #16\n\t"
  110014. "adds r5, r5, r8\n\t"
  110015. "adcs r6, r6, r9\n\t"
  110016. "adc r7, r7, #0\n\t"
  110017. #else
  110018. "umull r8, r9, r10, r12\n\t"
  110019. "adds r5, r5, r8\n\t"
  110020. "adcs r6, r6, r9\n\t"
  110021. "adc r7, r7, #0\n\t"
  110022. #endif
  110023. /* A[4] * A[11] */
  110024. "ldr r10, [%[a], #44]\n\t"
  110025. "ldr r12, [%[a], #16]\n\t"
  110026. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110027. "lsl r8, r10, #16\n\t"
  110028. "lsl r9, r12, #16\n\t"
  110029. "lsr r8, r8, #16\n\t"
  110030. "lsr r9, r9, #16\n\t"
  110031. "mul r9, r8, r9\n\t"
  110032. "adds r5, r5, r9\n\t"
  110033. "adcs r6, r6, #0\n\t"
  110034. "adc r7, r7, #0\n\t"
  110035. "lsr r9, r12, #16\n\t"
  110036. "mul r8, r9, r8\n\t"
  110037. "lsr r9, r8, #16\n\t"
  110038. "lsl r8, r8, #16\n\t"
  110039. "adds r5, r5, r8\n\t"
  110040. "adcs r6, r6, r9\n\t"
  110041. "adc r7, r7, #0\n\t"
  110042. "lsr r8, r10, #16\n\t"
  110043. "lsr r9, r12, #16\n\t"
  110044. "mul r9, r8, r9\n\t"
  110045. "adds r6, r6, r9\n\t"
  110046. "adc r7, r7, #0\n\t"
  110047. "lsl r9, r12, #16\n\t"
  110048. "lsr r9, r9, #16\n\t"
  110049. "mul r8, r9, r8\n\t"
  110050. "lsr r9, r8, #16\n\t"
  110051. "lsl r8, r8, #16\n\t"
  110052. "adds r5, r5, r8\n\t"
  110053. "adcs r6, r6, r9\n\t"
  110054. "adc r7, r7, #0\n\t"
  110055. #else
  110056. "umull r8, r9, r10, r12\n\t"
  110057. "adds r5, r5, r8\n\t"
  110058. "adcs r6, r6, r9\n\t"
  110059. "adc r7, r7, #0\n\t"
  110060. #endif
  110061. /* A[5] * A[10] */
  110062. "ldr r10, [%[a], #40]\n\t"
  110063. "ldr r12, [%[a], #20]\n\t"
  110064. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110065. "lsl r8, r10, #16\n\t"
  110066. "lsl r9, r12, #16\n\t"
  110067. "lsr r8, r8, #16\n\t"
  110068. "lsr r9, r9, #16\n\t"
  110069. "mul r9, r8, r9\n\t"
  110070. "adds r5, r5, r9\n\t"
  110071. "adcs r6, r6, #0\n\t"
  110072. "adc r7, r7, #0\n\t"
  110073. "lsr r9, r12, #16\n\t"
  110074. "mul r8, r9, r8\n\t"
  110075. "lsr r9, r8, #16\n\t"
  110076. "lsl r8, r8, #16\n\t"
  110077. "adds r5, r5, r8\n\t"
  110078. "adcs r6, r6, r9\n\t"
  110079. "adc r7, r7, #0\n\t"
  110080. "lsr r8, r10, #16\n\t"
  110081. "lsr r9, r12, #16\n\t"
  110082. "mul r9, r8, r9\n\t"
  110083. "adds r6, r6, r9\n\t"
  110084. "adc r7, r7, #0\n\t"
  110085. "lsl r9, r12, #16\n\t"
  110086. "lsr r9, r9, #16\n\t"
  110087. "mul r8, r9, r8\n\t"
  110088. "lsr r9, r8, #16\n\t"
  110089. "lsl r8, r8, #16\n\t"
  110090. "adds r5, r5, r8\n\t"
  110091. "adcs r6, r6, r9\n\t"
  110092. "adc r7, r7, #0\n\t"
  110093. #else
  110094. "umull r8, r9, r10, r12\n\t"
  110095. "adds r5, r5, r8\n\t"
  110096. "adcs r6, r6, r9\n\t"
  110097. "adc r7, r7, #0\n\t"
  110098. #endif
  110099. /* A[6] * A[9] */
  110100. "ldr r10, [%[a], #36]\n\t"
  110101. "ldr r12, [%[a], #24]\n\t"
  110102. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110103. "lsl r8, r10, #16\n\t"
  110104. "lsl r9, r12, #16\n\t"
  110105. "lsr r8, r8, #16\n\t"
  110106. "lsr r9, r9, #16\n\t"
  110107. "mul r9, r8, r9\n\t"
  110108. "adds r5, r5, r9\n\t"
  110109. "adcs r6, r6, #0\n\t"
  110110. "adc r7, r7, #0\n\t"
  110111. "lsr r9, r12, #16\n\t"
  110112. "mul r8, r9, r8\n\t"
  110113. "lsr r9, r8, #16\n\t"
  110114. "lsl r8, r8, #16\n\t"
  110115. "adds r5, r5, r8\n\t"
  110116. "adcs r6, r6, r9\n\t"
  110117. "adc r7, r7, #0\n\t"
  110118. "lsr r8, r10, #16\n\t"
  110119. "lsr r9, r12, #16\n\t"
  110120. "mul r9, r8, r9\n\t"
  110121. "adds r6, r6, r9\n\t"
  110122. "adc r7, r7, #0\n\t"
  110123. "lsl r9, r12, #16\n\t"
  110124. "lsr r9, r9, #16\n\t"
  110125. "mul r8, r9, r8\n\t"
  110126. "lsr r9, r8, #16\n\t"
  110127. "lsl r8, r8, #16\n\t"
  110128. "adds r5, r5, r8\n\t"
  110129. "adcs r6, r6, r9\n\t"
  110130. "adc r7, r7, #0\n\t"
  110131. #else
  110132. "umull r8, r9, r10, r12\n\t"
  110133. "adds r5, r5, r8\n\t"
  110134. "adcs r6, r6, r9\n\t"
  110135. "adc r7, r7, #0\n\t"
  110136. #endif
  110137. /* A[7] * A[8] */
  110138. "ldr r10, [%[a], #32]\n\t"
  110139. "ldr r12, [%[a], #28]\n\t"
  110140. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110141. "lsl r8, r10, #16\n\t"
  110142. "lsl r9, r12, #16\n\t"
  110143. "lsr r8, r8, #16\n\t"
  110144. "lsr r9, r9, #16\n\t"
  110145. "mul r9, r8, r9\n\t"
  110146. "adds r5, r5, r9\n\t"
  110147. "adcs r6, r6, #0\n\t"
  110148. "adc r7, r7, #0\n\t"
  110149. "lsr r9, r12, #16\n\t"
  110150. "mul r8, r9, r8\n\t"
  110151. "lsr r9, r8, #16\n\t"
  110152. "lsl r8, r8, #16\n\t"
  110153. "adds r5, r5, r8\n\t"
  110154. "adcs r6, r6, r9\n\t"
  110155. "adc r7, r7, #0\n\t"
  110156. "lsr r8, r10, #16\n\t"
  110157. "lsr r9, r12, #16\n\t"
  110158. "mul r9, r8, r9\n\t"
  110159. "adds r6, r6, r9\n\t"
  110160. "adc r7, r7, #0\n\t"
  110161. "lsl r9, r12, #16\n\t"
  110162. "lsr r9, r9, #16\n\t"
  110163. "mul r8, r9, r8\n\t"
  110164. "lsr r9, r8, #16\n\t"
  110165. "lsl r8, r8, #16\n\t"
  110166. "adds r5, r5, r8\n\t"
  110167. "adcs r6, r6, r9\n\t"
  110168. "adc r7, r7, #0\n\t"
  110169. #else
  110170. "umull r8, r9, r10, r12\n\t"
  110171. "adds r5, r5, r8\n\t"
  110172. "adcs r6, r6, r9\n\t"
  110173. "adc r7, r7, #0\n\t"
  110174. #endif
  110175. "adds r5, r5, r5\n\t"
  110176. "adcs r6, r6, r6\n\t"
  110177. "adc r7, r7, r7\n\t"
  110178. "adds r2, r2, r5\n\t"
  110179. "adcs r3, r3, r6\n\t"
  110180. "adc r4, r4, r7\n\t"
  110181. "str r2, [sp, #60]\n\t"
  110182. /* A[0] * A[16] */
  110183. "ldr r10, [%[a], #64]\n\t"
  110184. "ldr r12, [%[a]]\n\t"
  110185. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110186. "lsl r8, r10, #16\n\t"
  110187. "lsl r5, r12, #16\n\t"
  110188. "lsr r8, r8, #16\n\t"
  110189. "lsr r5, r5, #16\n\t"
  110190. "mul r5, r8, r5\n\t"
  110191. "lsr r9, r12, #16\n\t"
  110192. "mul r8, r9, r8\n\t"
  110193. "lsr r6, r8, #16\n\t"
  110194. "lsl r8, r8, #16\n\t"
  110195. "adds r5, r5, r8\n\t"
  110196. "adc r6, r6, #0\n\t"
  110197. "lsr r8, r10, #16\n\t"
  110198. "mul r9, r8, r9\n\t"
  110199. "add r6, r6, r9\n\t"
  110200. "lsl r9, r12, #16\n\t"
  110201. "lsr r9, r9, #16\n\t"
  110202. "mul r8, r9, r8\n\t"
  110203. "lsr r9, r8, #16\n\t"
  110204. "lsl r8, r8, #16\n\t"
  110205. "adds r5, r5, r8\n\t"
  110206. "adc r6, r6, r9\n\t"
  110207. #else
  110208. "umull r5, r6, r10, r12\n\t"
  110209. #endif
  110210. "mov r2, #0\n\t"
  110211. "mov r7, #0\n\t"
  110212. /* A[1] * A[15] */
  110213. "ldr r10, [%[a], #60]\n\t"
  110214. "ldr r12, [%[a], #4]\n\t"
  110215. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110216. "lsl r8, r10, #16\n\t"
  110217. "lsl r9, r12, #16\n\t"
  110218. "lsr r8, r8, #16\n\t"
  110219. "lsr r9, r9, #16\n\t"
  110220. "mul r9, r8, r9\n\t"
  110221. "adds r5, r5, r9\n\t"
  110222. "adcs r6, r6, #0\n\t"
  110223. "adc r7, r7, #0\n\t"
  110224. "lsr r9, r12, #16\n\t"
  110225. "mul r8, r9, r8\n\t"
  110226. "lsr r9, r8, #16\n\t"
  110227. "lsl r8, r8, #16\n\t"
  110228. "adds r5, r5, r8\n\t"
  110229. "adcs r6, r6, r9\n\t"
  110230. "adc r7, r7, #0\n\t"
  110231. "lsr r8, r10, #16\n\t"
  110232. "lsr r9, r12, #16\n\t"
  110233. "mul r9, r8, r9\n\t"
  110234. "adds r6, r6, r9\n\t"
  110235. "adc r7, r7, #0\n\t"
  110236. "lsl r9, r12, #16\n\t"
  110237. "lsr r9, r9, #16\n\t"
  110238. "mul r8, r9, r8\n\t"
  110239. "lsr r9, r8, #16\n\t"
  110240. "lsl r8, r8, #16\n\t"
  110241. "adds r5, r5, r8\n\t"
  110242. "adcs r6, r6, r9\n\t"
  110243. "adc r7, r7, #0\n\t"
  110244. #else
  110245. "umull r8, r9, r10, r12\n\t"
  110246. "adds r5, r5, r8\n\t"
  110247. "adcs r6, r6, r9\n\t"
  110248. "adc r7, r7, #0\n\t"
  110249. #endif
  110250. /* A[2] * A[14] */
  110251. "ldr r10, [%[a], #56]\n\t"
  110252. "ldr r12, [%[a], #8]\n\t"
  110253. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110254. "lsl r8, r10, #16\n\t"
  110255. "lsl r9, r12, #16\n\t"
  110256. "lsr r8, r8, #16\n\t"
  110257. "lsr r9, r9, #16\n\t"
  110258. "mul r9, r8, r9\n\t"
  110259. "adds r5, r5, r9\n\t"
  110260. "adcs r6, r6, #0\n\t"
  110261. "adc r7, r7, #0\n\t"
  110262. "lsr r9, r12, #16\n\t"
  110263. "mul r8, r9, r8\n\t"
  110264. "lsr r9, r8, #16\n\t"
  110265. "lsl r8, r8, #16\n\t"
  110266. "adds r5, r5, r8\n\t"
  110267. "adcs r6, r6, r9\n\t"
  110268. "adc r7, r7, #0\n\t"
  110269. "lsr r8, r10, #16\n\t"
  110270. "lsr r9, r12, #16\n\t"
  110271. "mul r9, r8, r9\n\t"
  110272. "adds r6, r6, r9\n\t"
  110273. "adc r7, r7, #0\n\t"
  110274. "lsl r9, r12, #16\n\t"
  110275. "lsr r9, r9, #16\n\t"
  110276. "mul r8, r9, r8\n\t"
  110277. "lsr r9, r8, #16\n\t"
  110278. "lsl r8, r8, #16\n\t"
  110279. "adds r5, r5, r8\n\t"
  110280. "adcs r6, r6, r9\n\t"
  110281. "adc r7, r7, #0\n\t"
  110282. #else
  110283. "umull r8, r9, r10, r12\n\t"
  110284. "adds r5, r5, r8\n\t"
  110285. "adcs r6, r6, r9\n\t"
  110286. "adc r7, r7, #0\n\t"
  110287. #endif
  110288. /* A[3] * A[13] */
  110289. "ldr r10, [%[a], #52]\n\t"
  110290. "ldr r12, [%[a], #12]\n\t"
  110291. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110292. "lsl r8, r10, #16\n\t"
  110293. "lsl r9, r12, #16\n\t"
  110294. "lsr r8, r8, #16\n\t"
  110295. "lsr r9, r9, #16\n\t"
  110296. "mul r9, r8, r9\n\t"
  110297. "adds r5, r5, r9\n\t"
  110298. "adcs r6, r6, #0\n\t"
  110299. "adc r7, r7, #0\n\t"
  110300. "lsr r9, r12, #16\n\t"
  110301. "mul r8, r9, r8\n\t"
  110302. "lsr r9, r8, #16\n\t"
  110303. "lsl r8, r8, #16\n\t"
  110304. "adds r5, r5, r8\n\t"
  110305. "adcs r6, r6, r9\n\t"
  110306. "adc r7, r7, #0\n\t"
  110307. "lsr r8, r10, #16\n\t"
  110308. "lsr r9, r12, #16\n\t"
  110309. "mul r9, r8, r9\n\t"
  110310. "adds r6, r6, r9\n\t"
  110311. "adc r7, r7, #0\n\t"
  110312. "lsl r9, r12, #16\n\t"
  110313. "lsr r9, r9, #16\n\t"
  110314. "mul r8, r9, r8\n\t"
  110315. "lsr r9, r8, #16\n\t"
  110316. "lsl r8, r8, #16\n\t"
  110317. "adds r5, r5, r8\n\t"
  110318. "adcs r6, r6, r9\n\t"
  110319. "adc r7, r7, #0\n\t"
  110320. #else
  110321. "umull r8, r9, r10, r12\n\t"
  110322. "adds r5, r5, r8\n\t"
  110323. "adcs r6, r6, r9\n\t"
  110324. "adc r7, r7, #0\n\t"
  110325. #endif
  110326. /* A[4] * A[12] */
  110327. "ldr r10, [%[a], #48]\n\t"
  110328. "ldr r12, [%[a], #16]\n\t"
  110329. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110330. "lsl r8, r10, #16\n\t"
  110331. "lsl r9, r12, #16\n\t"
  110332. "lsr r8, r8, #16\n\t"
  110333. "lsr r9, r9, #16\n\t"
  110334. "mul r9, r8, r9\n\t"
  110335. "adds r5, r5, r9\n\t"
  110336. "adcs r6, r6, #0\n\t"
  110337. "adc r7, r7, #0\n\t"
  110338. "lsr r9, r12, #16\n\t"
  110339. "mul r8, r9, r8\n\t"
  110340. "lsr r9, r8, #16\n\t"
  110341. "lsl r8, r8, #16\n\t"
  110342. "adds r5, r5, r8\n\t"
  110343. "adcs r6, r6, r9\n\t"
  110344. "adc r7, r7, #0\n\t"
  110345. "lsr r8, r10, #16\n\t"
  110346. "lsr r9, r12, #16\n\t"
  110347. "mul r9, r8, r9\n\t"
  110348. "adds r6, r6, r9\n\t"
  110349. "adc r7, r7, #0\n\t"
  110350. "lsl r9, r12, #16\n\t"
  110351. "lsr r9, r9, #16\n\t"
  110352. "mul r8, r9, r8\n\t"
  110353. "lsr r9, r8, #16\n\t"
  110354. "lsl r8, r8, #16\n\t"
  110355. "adds r5, r5, r8\n\t"
  110356. "adcs r6, r6, r9\n\t"
  110357. "adc r7, r7, #0\n\t"
  110358. #else
  110359. "umull r8, r9, r10, r12\n\t"
  110360. "adds r5, r5, r8\n\t"
  110361. "adcs r6, r6, r9\n\t"
  110362. "adc r7, r7, #0\n\t"
  110363. #endif
  110364. /* A[5] * A[11] */
  110365. "ldr r10, [%[a], #44]\n\t"
  110366. "ldr r12, [%[a], #20]\n\t"
  110367. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110368. "lsl r8, r10, #16\n\t"
  110369. "lsl r9, r12, #16\n\t"
  110370. "lsr r8, r8, #16\n\t"
  110371. "lsr r9, r9, #16\n\t"
  110372. "mul r9, r8, r9\n\t"
  110373. "adds r5, r5, r9\n\t"
  110374. "adcs r6, r6, #0\n\t"
  110375. "adc r7, r7, #0\n\t"
  110376. "lsr r9, r12, #16\n\t"
  110377. "mul r8, r9, r8\n\t"
  110378. "lsr r9, r8, #16\n\t"
  110379. "lsl r8, r8, #16\n\t"
  110380. "adds r5, r5, r8\n\t"
  110381. "adcs r6, r6, r9\n\t"
  110382. "adc r7, r7, #0\n\t"
  110383. "lsr r8, r10, #16\n\t"
  110384. "lsr r9, r12, #16\n\t"
  110385. "mul r9, r8, r9\n\t"
  110386. "adds r6, r6, r9\n\t"
  110387. "adc r7, r7, #0\n\t"
  110388. "lsl r9, r12, #16\n\t"
  110389. "lsr r9, r9, #16\n\t"
  110390. "mul r8, r9, r8\n\t"
  110391. "lsr r9, r8, #16\n\t"
  110392. "lsl r8, r8, #16\n\t"
  110393. "adds r5, r5, r8\n\t"
  110394. "adcs r6, r6, r9\n\t"
  110395. "adc r7, r7, #0\n\t"
  110396. #else
  110397. "umull r8, r9, r10, r12\n\t"
  110398. "adds r5, r5, r8\n\t"
  110399. "adcs r6, r6, r9\n\t"
  110400. "adc r7, r7, #0\n\t"
  110401. #endif
  110402. /* A[6] * A[10] */
  110403. "ldr r10, [%[a], #40]\n\t"
  110404. "ldr r12, [%[a], #24]\n\t"
  110405. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110406. "lsl r8, r10, #16\n\t"
  110407. "lsl r9, r12, #16\n\t"
  110408. "lsr r8, r8, #16\n\t"
  110409. "lsr r9, r9, #16\n\t"
  110410. "mul r9, r8, r9\n\t"
  110411. "adds r5, r5, r9\n\t"
  110412. "adcs r6, r6, #0\n\t"
  110413. "adc r7, r7, #0\n\t"
  110414. "lsr r9, r12, #16\n\t"
  110415. "mul r8, r9, r8\n\t"
  110416. "lsr r9, r8, #16\n\t"
  110417. "lsl r8, r8, #16\n\t"
  110418. "adds r5, r5, r8\n\t"
  110419. "adcs r6, r6, r9\n\t"
  110420. "adc r7, r7, #0\n\t"
  110421. "lsr r8, r10, #16\n\t"
  110422. "lsr r9, r12, #16\n\t"
  110423. "mul r9, r8, r9\n\t"
  110424. "adds r6, r6, r9\n\t"
  110425. "adc r7, r7, #0\n\t"
  110426. "lsl r9, r12, #16\n\t"
  110427. "lsr r9, r9, #16\n\t"
  110428. "mul r8, r9, r8\n\t"
  110429. "lsr r9, r8, #16\n\t"
  110430. "lsl r8, r8, #16\n\t"
  110431. "adds r5, r5, r8\n\t"
  110432. "adcs r6, r6, r9\n\t"
  110433. "adc r7, r7, #0\n\t"
  110434. #else
  110435. "umull r8, r9, r10, r12\n\t"
  110436. "adds r5, r5, r8\n\t"
  110437. "adcs r6, r6, r9\n\t"
  110438. "adc r7, r7, #0\n\t"
  110439. #endif
  110440. /* A[7] * A[9] */
  110441. "ldr r10, [%[a], #36]\n\t"
  110442. "ldr r12, [%[a], #28]\n\t"
  110443. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110444. "lsl r8, r10, #16\n\t"
  110445. "lsl r9, r12, #16\n\t"
  110446. "lsr r8, r8, #16\n\t"
  110447. "lsr r9, r9, #16\n\t"
  110448. "mul r9, r8, r9\n\t"
  110449. "adds r5, r5, r9\n\t"
  110450. "adcs r6, r6, #0\n\t"
  110451. "adc r7, r7, #0\n\t"
  110452. "lsr r9, r12, #16\n\t"
  110453. "mul r8, r9, r8\n\t"
  110454. "lsr r9, r8, #16\n\t"
  110455. "lsl r8, r8, #16\n\t"
  110456. "adds r5, r5, r8\n\t"
  110457. "adcs r6, r6, r9\n\t"
  110458. "adc r7, r7, #0\n\t"
  110459. "lsr r8, r10, #16\n\t"
  110460. "lsr r9, r12, #16\n\t"
  110461. "mul r9, r8, r9\n\t"
  110462. "adds r6, r6, r9\n\t"
  110463. "adc r7, r7, #0\n\t"
  110464. "lsl r9, r12, #16\n\t"
  110465. "lsr r9, r9, #16\n\t"
  110466. "mul r8, r9, r8\n\t"
  110467. "lsr r9, r8, #16\n\t"
  110468. "lsl r8, r8, #16\n\t"
  110469. "adds r5, r5, r8\n\t"
  110470. "adcs r6, r6, r9\n\t"
  110471. "adc r7, r7, #0\n\t"
  110472. #else
  110473. "umull r8, r9, r10, r12\n\t"
  110474. "adds r5, r5, r8\n\t"
  110475. "adcs r6, r6, r9\n\t"
  110476. "adc r7, r7, #0\n\t"
  110477. #endif
  110478. /* A[8] * A[8] */
  110479. "ldr r10, [%[a], #32]\n\t"
  110480. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110481. "lsl r8, r10, #16\n\t"
  110482. "lsr r9, r10, #16\n\t"
  110483. "lsr r8, r8, #16\n\t"
  110484. "mov r12, r8\n\t"
  110485. "mul r8, r12, r8\n\t"
  110486. "mov r12, r9\n\t"
  110487. "mul r9, r12, r9\n\t"
  110488. "adds r3, r3, r8\n\t"
  110489. "adcs r4, r4, r9\n\t"
  110490. "adc r2, r2, #0\n\t"
  110491. "lsr r9, r10, #16\n\t"
  110492. "lsl r8, r10, #16\n\t"
  110493. "lsr r8, r8, #16\n\t"
  110494. "mul r8, r9, r8\n\t"
  110495. "lsr r9, r8, #15\n\t"
  110496. "lsl r8, r8, #17\n\t"
  110497. "adds r3, r3, r8\n\t"
  110498. "adcs r4, r4, r9\n\t"
  110499. "adc r2, r2, #0\n\t"
  110500. "adds r5, r5, r5\n\t"
  110501. "adcs r6, r6, r6\n\t"
  110502. "adc r7, r7, r7\n\t"
  110503. #else
  110504. "umull r8, r9, r10, r10\n\t"
  110505. "adds r5, r5, r5\n\t"
  110506. "adcs r6, r6, r6\n\t"
  110507. "adc r7, r7, r7\n\t"
  110508. "adds r3, r3, r8\n\t"
  110509. "adcs r4, r4, r9\n\t"
  110510. "adc r2, r2, #0\n\t"
  110511. #endif
  110512. "adds r3, r3, r5\n\t"
  110513. "adcs r4, r4, r6\n\t"
  110514. "adc r2, r2, r7\n\t"
  110515. "str r3, [sp, #64]\n\t"
  110516. /* A[1] * A[16] */
  110517. "ldr r10, [%[a], #64]\n\t"
  110518. "ldr r12, [%[a], #4]\n\t"
  110519. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110520. "lsl r8, r10, #16\n\t"
  110521. "lsl r5, r12, #16\n\t"
  110522. "lsr r8, r8, #16\n\t"
  110523. "lsr r5, r5, #16\n\t"
  110524. "mul r5, r8, r5\n\t"
  110525. "lsr r9, r12, #16\n\t"
  110526. "mul r8, r9, r8\n\t"
  110527. "lsr r6, r8, #16\n\t"
  110528. "lsl r8, r8, #16\n\t"
  110529. "adds r5, r5, r8\n\t"
  110530. "adc r6, r6, #0\n\t"
  110531. "lsr r8, r10, #16\n\t"
  110532. "mul r9, r8, r9\n\t"
  110533. "add r6, r6, r9\n\t"
  110534. "lsl r9, r12, #16\n\t"
  110535. "lsr r9, r9, #16\n\t"
  110536. "mul r8, r9, r8\n\t"
  110537. "lsr r9, r8, #16\n\t"
  110538. "lsl r8, r8, #16\n\t"
  110539. "adds r5, r5, r8\n\t"
  110540. "adc r6, r6, r9\n\t"
  110541. #else
  110542. "umull r5, r6, r10, r12\n\t"
  110543. #endif
  110544. "mov r3, #0\n\t"
  110545. "mov r7, #0\n\t"
  110546. /* A[2] * A[15] */
  110547. "ldr r10, [%[a], #60]\n\t"
  110548. "ldr r12, [%[a], #8]\n\t"
  110549. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110550. "lsl r8, r10, #16\n\t"
  110551. "lsl r9, r12, #16\n\t"
  110552. "lsr r8, r8, #16\n\t"
  110553. "lsr r9, r9, #16\n\t"
  110554. "mul r9, r8, r9\n\t"
  110555. "adds r5, r5, r9\n\t"
  110556. "adcs r6, r6, #0\n\t"
  110557. "adc r7, r7, #0\n\t"
  110558. "lsr r9, r12, #16\n\t"
  110559. "mul r8, r9, r8\n\t"
  110560. "lsr r9, r8, #16\n\t"
  110561. "lsl r8, r8, #16\n\t"
  110562. "adds r5, r5, r8\n\t"
  110563. "adcs r6, r6, r9\n\t"
  110564. "adc r7, r7, #0\n\t"
  110565. "lsr r8, r10, #16\n\t"
  110566. "lsr r9, r12, #16\n\t"
  110567. "mul r9, r8, r9\n\t"
  110568. "adds r6, r6, r9\n\t"
  110569. "adc r7, r7, #0\n\t"
  110570. "lsl r9, r12, #16\n\t"
  110571. "lsr r9, r9, #16\n\t"
  110572. "mul r8, r9, r8\n\t"
  110573. "lsr r9, r8, #16\n\t"
  110574. "lsl r8, r8, #16\n\t"
  110575. "adds r5, r5, r8\n\t"
  110576. "adcs r6, r6, r9\n\t"
  110577. "adc r7, r7, #0\n\t"
  110578. #else
  110579. "umull r8, r9, r10, r12\n\t"
  110580. "adds r5, r5, r8\n\t"
  110581. "adcs r6, r6, r9\n\t"
  110582. "adc r7, r7, #0\n\t"
  110583. #endif
  110584. /* A[3] * A[14] */
  110585. "ldr r10, [%[a], #56]\n\t"
  110586. "ldr r12, [%[a], #12]\n\t"
  110587. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110588. "lsl r8, r10, #16\n\t"
  110589. "lsl r9, r12, #16\n\t"
  110590. "lsr r8, r8, #16\n\t"
  110591. "lsr r9, r9, #16\n\t"
  110592. "mul r9, r8, r9\n\t"
  110593. "adds r5, r5, r9\n\t"
  110594. "adcs r6, r6, #0\n\t"
  110595. "adc r7, r7, #0\n\t"
  110596. "lsr r9, r12, #16\n\t"
  110597. "mul r8, r9, r8\n\t"
  110598. "lsr r9, r8, #16\n\t"
  110599. "lsl r8, r8, #16\n\t"
  110600. "adds r5, r5, r8\n\t"
  110601. "adcs r6, r6, r9\n\t"
  110602. "adc r7, r7, #0\n\t"
  110603. "lsr r8, r10, #16\n\t"
  110604. "lsr r9, r12, #16\n\t"
  110605. "mul r9, r8, r9\n\t"
  110606. "adds r6, r6, r9\n\t"
  110607. "adc r7, r7, #0\n\t"
  110608. "lsl r9, r12, #16\n\t"
  110609. "lsr r9, r9, #16\n\t"
  110610. "mul r8, r9, r8\n\t"
  110611. "lsr r9, r8, #16\n\t"
  110612. "lsl r8, r8, #16\n\t"
  110613. "adds r5, r5, r8\n\t"
  110614. "adcs r6, r6, r9\n\t"
  110615. "adc r7, r7, #0\n\t"
  110616. #else
  110617. "umull r8, r9, r10, r12\n\t"
  110618. "adds r5, r5, r8\n\t"
  110619. "adcs r6, r6, r9\n\t"
  110620. "adc r7, r7, #0\n\t"
  110621. #endif
  110622. /* A[4] * A[13] */
  110623. "ldr r10, [%[a], #52]\n\t"
  110624. "ldr r12, [%[a], #16]\n\t"
  110625. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110626. "lsl r8, r10, #16\n\t"
  110627. "lsl r9, r12, #16\n\t"
  110628. "lsr r8, r8, #16\n\t"
  110629. "lsr r9, r9, #16\n\t"
  110630. "mul r9, r8, r9\n\t"
  110631. "adds r5, r5, r9\n\t"
  110632. "adcs r6, r6, #0\n\t"
  110633. "adc r7, r7, #0\n\t"
  110634. "lsr r9, r12, #16\n\t"
  110635. "mul r8, r9, r8\n\t"
  110636. "lsr r9, r8, #16\n\t"
  110637. "lsl r8, r8, #16\n\t"
  110638. "adds r5, r5, r8\n\t"
  110639. "adcs r6, r6, r9\n\t"
  110640. "adc r7, r7, #0\n\t"
  110641. "lsr r8, r10, #16\n\t"
  110642. "lsr r9, r12, #16\n\t"
  110643. "mul r9, r8, r9\n\t"
  110644. "adds r6, r6, r9\n\t"
  110645. "adc r7, r7, #0\n\t"
  110646. "lsl r9, r12, #16\n\t"
  110647. "lsr r9, r9, #16\n\t"
  110648. "mul r8, r9, r8\n\t"
  110649. "lsr r9, r8, #16\n\t"
  110650. "lsl r8, r8, #16\n\t"
  110651. "adds r5, r5, r8\n\t"
  110652. "adcs r6, r6, r9\n\t"
  110653. "adc r7, r7, #0\n\t"
  110654. #else
  110655. "umull r8, r9, r10, r12\n\t"
  110656. "adds r5, r5, r8\n\t"
  110657. "adcs r6, r6, r9\n\t"
  110658. "adc r7, r7, #0\n\t"
  110659. #endif
  110660. /* A[5] * A[12] */
  110661. "ldr r10, [%[a], #48]\n\t"
  110662. "ldr r12, [%[a], #20]\n\t"
  110663. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110664. "lsl r8, r10, #16\n\t"
  110665. "lsl r9, r12, #16\n\t"
  110666. "lsr r8, r8, #16\n\t"
  110667. "lsr r9, r9, #16\n\t"
  110668. "mul r9, r8, r9\n\t"
  110669. "adds r5, r5, r9\n\t"
  110670. "adcs r6, r6, #0\n\t"
  110671. "adc r7, r7, #0\n\t"
  110672. "lsr r9, r12, #16\n\t"
  110673. "mul r8, r9, r8\n\t"
  110674. "lsr r9, r8, #16\n\t"
  110675. "lsl r8, r8, #16\n\t"
  110676. "adds r5, r5, r8\n\t"
  110677. "adcs r6, r6, r9\n\t"
  110678. "adc r7, r7, #0\n\t"
  110679. "lsr r8, r10, #16\n\t"
  110680. "lsr r9, r12, #16\n\t"
  110681. "mul r9, r8, r9\n\t"
  110682. "adds r6, r6, r9\n\t"
  110683. "adc r7, r7, #0\n\t"
  110684. "lsl r9, r12, #16\n\t"
  110685. "lsr r9, r9, #16\n\t"
  110686. "mul r8, r9, r8\n\t"
  110687. "lsr r9, r8, #16\n\t"
  110688. "lsl r8, r8, #16\n\t"
  110689. "adds r5, r5, r8\n\t"
  110690. "adcs r6, r6, r9\n\t"
  110691. "adc r7, r7, #0\n\t"
  110692. #else
  110693. "umull r8, r9, r10, r12\n\t"
  110694. "adds r5, r5, r8\n\t"
  110695. "adcs r6, r6, r9\n\t"
  110696. "adc r7, r7, #0\n\t"
  110697. #endif
  110698. /* A[6] * A[11] */
  110699. "ldr r10, [%[a], #44]\n\t"
  110700. "ldr r12, [%[a], #24]\n\t"
  110701. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110702. "lsl r8, r10, #16\n\t"
  110703. "lsl r9, r12, #16\n\t"
  110704. "lsr r8, r8, #16\n\t"
  110705. "lsr r9, r9, #16\n\t"
  110706. "mul r9, r8, r9\n\t"
  110707. "adds r5, r5, r9\n\t"
  110708. "adcs r6, r6, #0\n\t"
  110709. "adc r7, r7, #0\n\t"
  110710. "lsr r9, r12, #16\n\t"
  110711. "mul r8, r9, r8\n\t"
  110712. "lsr r9, r8, #16\n\t"
  110713. "lsl r8, r8, #16\n\t"
  110714. "adds r5, r5, r8\n\t"
  110715. "adcs r6, r6, r9\n\t"
  110716. "adc r7, r7, #0\n\t"
  110717. "lsr r8, r10, #16\n\t"
  110718. "lsr r9, r12, #16\n\t"
  110719. "mul r9, r8, r9\n\t"
  110720. "adds r6, r6, r9\n\t"
  110721. "adc r7, r7, #0\n\t"
  110722. "lsl r9, r12, #16\n\t"
  110723. "lsr r9, r9, #16\n\t"
  110724. "mul r8, r9, r8\n\t"
  110725. "lsr r9, r8, #16\n\t"
  110726. "lsl r8, r8, #16\n\t"
  110727. "adds r5, r5, r8\n\t"
  110728. "adcs r6, r6, r9\n\t"
  110729. "adc r7, r7, #0\n\t"
  110730. #else
  110731. "umull r8, r9, r10, r12\n\t"
  110732. "adds r5, r5, r8\n\t"
  110733. "adcs r6, r6, r9\n\t"
  110734. "adc r7, r7, #0\n\t"
  110735. #endif
  110736. /* A[7] * A[10] */
  110737. "ldr r10, [%[a], #40]\n\t"
  110738. "ldr r12, [%[a], #28]\n\t"
  110739. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110740. "lsl r8, r10, #16\n\t"
  110741. "lsl r9, r12, #16\n\t"
  110742. "lsr r8, r8, #16\n\t"
  110743. "lsr r9, r9, #16\n\t"
  110744. "mul r9, r8, r9\n\t"
  110745. "adds r5, r5, r9\n\t"
  110746. "adcs r6, r6, #0\n\t"
  110747. "adc r7, r7, #0\n\t"
  110748. "lsr r9, r12, #16\n\t"
  110749. "mul r8, r9, r8\n\t"
  110750. "lsr r9, r8, #16\n\t"
  110751. "lsl r8, r8, #16\n\t"
  110752. "adds r5, r5, r8\n\t"
  110753. "adcs r6, r6, r9\n\t"
  110754. "adc r7, r7, #0\n\t"
  110755. "lsr r8, r10, #16\n\t"
  110756. "lsr r9, r12, #16\n\t"
  110757. "mul r9, r8, r9\n\t"
  110758. "adds r6, r6, r9\n\t"
  110759. "adc r7, r7, #0\n\t"
  110760. "lsl r9, r12, #16\n\t"
  110761. "lsr r9, r9, #16\n\t"
  110762. "mul r8, r9, r8\n\t"
  110763. "lsr r9, r8, #16\n\t"
  110764. "lsl r8, r8, #16\n\t"
  110765. "adds r5, r5, r8\n\t"
  110766. "adcs r6, r6, r9\n\t"
  110767. "adc r7, r7, #0\n\t"
  110768. #else
  110769. "umull r8, r9, r10, r12\n\t"
  110770. "adds r5, r5, r8\n\t"
  110771. "adcs r6, r6, r9\n\t"
  110772. "adc r7, r7, #0\n\t"
  110773. #endif
  110774. /* A[8] * A[9] */
  110775. "ldr r10, [%[a], #36]\n\t"
  110776. "ldr r12, [%[a], #32]\n\t"
  110777. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110778. "lsl r8, r10, #16\n\t"
  110779. "lsl r9, r12, #16\n\t"
  110780. "lsr r8, r8, #16\n\t"
  110781. "lsr r9, r9, #16\n\t"
  110782. "mul r9, r8, r9\n\t"
  110783. "adds r5, r5, r9\n\t"
  110784. "adcs r6, r6, #0\n\t"
  110785. "adc r7, r7, #0\n\t"
  110786. "lsr r9, r12, #16\n\t"
  110787. "mul r8, r9, r8\n\t"
  110788. "lsr r9, r8, #16\n\t"
  110789. "lsl r8, r8, #16\n\t"
  110790. "adds r5, r5, r8\n\t"
  110791. "adcs r6, r6, r9\n\t"
  110792. "adc r7, r7, #0\n\t"
  110793. "lsr r8, r10, #16\n\t"
  110794. "lsr r9, r12, #16\n\t"
  110795. "mul r9, r8, r9\n\t"
  110796. "adds r6, r6, r9\n\t"
  110797. "adc r7, r7, #0\n\t"
  110798. "lsl r9, r12, #16\n\t"
  110799. "lsr r9, r9, #16\n\t"
  110800. "mul r8, r9, r8\n\t"
  110801. "lsr r9, r8, #16\n\t"
  110802. "lsl r8, r8, #16\n\t"
  110803. "adds r5, r5, r8\n\t"
  110804. "adcs r6, r6, r9\n\t"
  110805. "adc r7, r7, #0\n\t"
  110806. #else
  110807. "umull r8, r9, r10, r12\n\t"
  110808. "adds r5, r5, r8\n\t"
  110809. "adcs r6, r6, r9\n\t"
  110810. "adc r7, r7, #0\n\t"
  110811. #endif
  110812. "adds r5, r5, r5\n\t"
  110813. "adcs r6, r6, r6\n\t"
  110814. "adc r7, r7, r7\n\t"
  110815. "adds r4, r4, r5\n\t"
  110816. "adcs r2, r2, r6\n\t"
  110817. "adc r3, r3, r7\n\t"
  110818. "str r4, [%[r], #68]\n\t"
  110819. /* A[2] * A[16] */
  110820. "ldr r10, [%[a], #64]\n\t"
  110821. "ldr r12, [%[a], #8]\n\t"
  110822. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110823. "lsl r8, r10, #16\n\t"
  110824. "lsl r5, r12, #16\n\t"
  110825. "lsr r8, r8, #16\n\t"
  110826. "lsr r5, r5, #16\n\t"
  110827. "mul r5, r8, r5\n\t"
  110828. "lsr r9, r12, #16\n\t"
  110829. "mul r8, r9, r8\n\t"
  110830. "lsr r6, r8, #16\n\t"
  110831. "lsl r8, r8, #16\n\t"
  110832. "adds r5, r5, r8\n\t"
  110833. "adc r6, r6, #0\n\t"
  110834. "lsr r8, r10, #16\n\t"
  110835. "mul r9, r8, r9\n\t"
  110836. "add r6, r6, r9\n\t"
  110837. "lsl r9, r12, #16\n\t"
  110838. "lsr r9, r9, #16\n\t"
  110839. "mul r8, r9, r8\n\t"
  110840. "lsr r9, r8, #16\n\t"
  110841. "lsl r8, r8, #16\n\t"
  110842. "adds r5, r5, r8\n\t"
  110843. "adc r6, r6, r9\n\t"
  110844. #else
  110845. "umull r5, r6, r10, r12\n\t"
  110846. #endif
  110847. "mov r4, #0\n\t"
  110848. "mov r7, #0\n\t"
  110849. /* A[3] * A[15] */
  110850. "ldr r10, [%[a], #60]\n\t"
  110851. "ldr r12, [%[a], #12]\n\t"
  110852. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110853. "lsl r8, r10, #16\n\t"
  110854. "lsl r9, r12, #16\n\t"
  110855. "lsr r8, r8, #16\n\t"
  110856. "lsr r9, r9, #16\n\t"
  110857. "mul r9, r8, r9\n\t"
  110858. "adds r5, r5, r9\n\t"
  110859. "adcs r6, r6, #0\n\t"
  110860. "adc r7, r7, #0\n\t"
  110861. "lsr r9, r12, #16\n\t"
  110862. "mul r8, r9, r8\n\t"
  110863. "lsr r9, r8, #16\n\t"
  110864. "lsl r8, r8, #16\n\t"
  110865. "adds r5, r5, r8\n\t"
  110866. "adcs r6, r6, r9\n\t"
  110867. "adc r7, r7, #0\n\t"
  110868. "lsr r8, r10, #16\n\t"
  110869. "lsr r9, r12, #16\n\t"
  110870. "mul r9, r8, r9\n\t"
  110871. "adds r6, r6, r9\n\t"
  110872. "adc r7, r7, #0\n\t"
  110873. "lsl r9, r12, #16\n\t"
  110874. "lsr r9, r9, #16\n\t"
  110875. "mul r8, r9, r8\n\t"
  110876. "lsr r9, r8, #16\n\t"
  110877. "lsl r8, r8, #16\n\t"
  110878. "adds r5, r5, r8\n\t"
  110879. "adcs r6, r6, r9\n\t"
  110880. "adc r7, r7, #0\n\t"
  110881. #else
  110882. "umull r8, r9, r10, r12\n\t"
  110883. "adds r5, r5, r8\n\t"
  110884. "adcs r6, r6, r9\n\t"
  110885. "adc r7, r7, #0\n\t"
  110886. #endif
  110887. /* A[4] * A[14] */
  110888. "ldr r10, [%[a], #56]\n\t"
  110889. "ldr r12, [%[a], #16]\n\t"
  110890. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110891. "lsl r8, r10, #16\n\t"
  110892. "lsl r9, r12, #16\n\t"
  110893. "lsr r8, r8, #16\n\t"
  110894. "lsr r9, r9, #16\n\t"
  110895. "mul r9, r8, r9\n\t"
  110896. "adds r5, r5, r9\n\t"
  110897. "adcs r6, r6, #0\n\t"
  110898. "adc r7, r7, #0\n\t"
  110899. "lsr r9, r12, #16\n\t"
  110900. "mul r8, r9, r8\n\t"
  110901. "lsr r9, r8, #16\n\t"
  110902. "lsl r8, r8, #16\n\t"
  110903. "adds r5, r5, r8\n\t"
  110904. "adcs r6, r6, r9\n\t"
  110905. "adc r7, r7, #0\n\t"
  110906. "lsr r8, r10, #16\n\t"
  110907. "lsr r9, r12, #16\n\t"
  110908. "mul r9, r8, r9\n\t"
  110909. "adds r6, r6, r9\n\t"
  110910. "adc r7, r7, #0\n\t"
  110911. "lsl r9, r12, #16\n\t"
  110912. "lsr r9, r9, #16\n\t"
  110913. "mul r8, r9, r8\n\t"
  110914. "lsr r9, r8, #16\n\t"
  110915. "lsl r8, r8, #16\n\t"
  110916. "adds r5, r5, r8\n\t"
  110917. "adcs r6, r6, r9\n\t"
  110918. "adc r7, r7, #0\n\t"
  110919. #else
  110920. "umull r8, r9, r10, r12\n\t"
  110921. "adds r5, r5, r8\n\t"
  110922. "adcs r6, r6, r9\n\t"
  110923. "adc r7, r7, #0\n\t"
  110924. #endif
  110925. /* A[5] * A[13] */
  110926. "ldr r10, [%[a], #52]\n\t"
  110927. "ldr r12, [%[a], #20]\n\t"
  110928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110929. "lsl r8, r10, #16\n\t"
  110930. "lsl r9, r12, #16\n\t"
  110931. "lsr r8, r8, #16\n\t"
  110932. "lsr r9, r9, #16\n\t"
  110933. "mul r9, r8, r9\n\t"
  110934. "adds r5, r5, r9\n\t"
  110935. "adcs r6, r6, #0\n\t"
  110936. "adc r7, r7, #0\n\t"
  110937. "lsr r9, r12, #16\n\t"
  110938. "mul r8, r9, r8\n\t"
  110939. "lsr r9, r8, #16\n\t"
  110940. "lsl r8, r8, #16\n\t"
  110941. "adds r5, r5, r8\n\t"
  110942. "adcs r6, r6, r9\n\t"
  110943. "adc r7, r7, #0\n\t"
  110944. "lsr r8, r10, #16\n\t"
  110945. "lsr r9, r12, #16\n\t"
  110946. "mul r9, r8, r9\n\t"
  110947. "adds r6, r6, r9\n\t"
  110948. "adc r7, r7, #0\n\t"
  110949. "lsl r9, r12, #16\n\t"
  110950. "lsr r9, r9, #16\n\t"
  110951. "mul r8, r9, r8\n\t"
  110952. "lsr r9, r8, #16\n\t"
  110953. "lsl r8, r8, #16\n\t"
  110954. "adds r5, r5, r8\n\t"
  110955. "adcs r6, r6, r9\n\t"
  110956. "adc r7, r7, #0\n\t"
  110957. #else
  110958. "umull r8, r9, r10, r12\n\t"
  110959. "adds r5, r5, r8\n\t"
  110960. "adcs r6, r6, r9\n\t"
  110961. "adc r7, r7, #0\n\t"
  110962. #endif
  110963. /* A[6] * A[12] */
  110964. "ldr r10, [%[a], #48]\n\t"
  110965. "ldr r12, [%[a], #24]\n\t"
  110966. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  110967. "lsl r8, r10, #16\n\t"
  110968. "lsl r9, r12, #16\n\t"
  110969. "lsr r8, r8, #16\n\t"
  110970. "lsr r9, r9, #16\n\t"
  110971. "mul r9, r8, r9\n\t"
  110972. "adds r5, r5, r9\n\t"
  110973. "adcs r6, r6, #0\n\t"
  110974. "adc r7, r7, #0\n\t"
  110975. "lsr r9, r12, #16\n\t"
  110976. "mul r8, r9, r8\n\t"
  110977. "lsr r9, r8, #16\n\t"
  110978. "lsl r8, r8, #16\n\t"
  110979. "adds r5, r5, r8\n\t"
  110980. "adcs r6, r6, r9\n\t"
  110981. "adc r7, r7, #0\n\t"
  110982. "lsr r8, r10, #16\n\t"
  110983. "lsr r9, r12, #16\n\t"
  110984. "mul r9, r8, r9\n\t"
  110985. "adds r6, r6, r9\n\t"
  110986. "adc r7, r7, #0\n\t"
  110987. "lsl r9, r12, #16\n\t"
  110988. "lsr r9, r9, #16\n\t"
  110989. "mul r8, r9, r8\n\t"
  110990. "lsr r9, r8, #16\n\t"
  110991. "lsl r8, r8, #16\n\t"
  110992. "adds r5, r5, r8\n\t"
  110993. "adcs r6, r6, r9\n\t"
  110994. "adc r7, r7, #0\n\t"
  110995. #else
  110996. "umull r8, r9, r10, r12\n\t"
  110997. "adds r5, r5, r8\n\t"
  110998. "adcs r6, r6, r9\n\t"
  110999. "adc r7, r7, #0\n\t"
  111000. #endif
  111001. /* A[7] * A[11] */
  111002. "ldr r10, [%[a], #44]\n\t"
  111003. "ldr r12, [%[a], #28]\n\t"
  111004. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111005. "lsl r8, r10, #16\n\t"
  111006. "lsl r9, r12, #16\n\t"
  111007. "lsr r8, r8, #16\n\t"
  111008. "lsr r9, r9, #16\n\t"
  111009. "mul r9, r8, r9\n\t"
  111010. "adds r5, r5, r9\n\t"
  111011. "adcs r6, r6, #0\n\t"
  111012. "adc r7, r7, #0\n\t"
  111013. "lsr r9, r12, #16\n\t"
  111014. "mul r8, r9, r8\n\t"
  111015. "lsr r9, r8, #16\n\t"
  111016. "lsl r8, r8, #16\n\t"
  111017. "adds r5, r5, r8\n\t"
  111018. "adcs r6, r6, r9\n\t"
  111019. "adc r7, r7, #0\n\t"
  111020. "lsr r8, r10, #16\n\t"
  111021. "lsr r9, r12, #16\n\t"
  111022. "mul r9, r8, r9\n\t"
  111023. "adds r6, r6, r9\n\t"
  111024. "adc r7, r7, #0\n\t"
  111025. "lsl r9, r12, #16\n\t"
  111026. "lsr r9, r9, #16\n\t"
  111027. "mul r8, r9, r8\n\t"
  111028. "lsr r9, r8, #16\n\t"
  111029. "lsl r8, r8, #16\n\t"
  111030. "adds r5, r5, r8\n\t"
  111031. "adcs r6, r6, r9\n\t"
  111032. "adc r7, r7, #0\n\t"
  111033. #else
  111034. "umull r8, r9, r10, r12\n\t"
  111035. "adds r5, r5, r8\n\t"
  111036. "adcs r6, r6, r9\n\t"
  111037. "adc r7, r7, #0\n\t"
  111038. #endif
  111039. /* A[8] * A[10] */
  111040. "ldr r10, [%[a], #40]\n\t"
  111041. "ldr r12, [%[a], #32]\n\t"
  111042. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111043. "lsl r8, r10, #16\n\t"
  111044. "lsl r9, r12, #16\n\t"
  111045. "lsr r8, r8, #16\n\t"
  111046. "lsr r9, r9, #16\n\t"
  111047. "mul r9, r8, r9\n\t"
  111048. "adds r5, r5, r9\n\t"
  111049. "adcs r6, r6, #0\n\t"
  111050. "adc r7, r7, #0\n\t"
  111051. "lsr r9, r12, #16\n\t"
  111052. "mul r8, r9, r8\n\t"
  111053. "lsr r9, r8, #16\n\t"
  111054. "lsl r8, r8, #16\n\t"
  111055. "adds r5, r5, r8\n\t"
  111056. "adcs r6, r6, r9\n\t"
  111057. "adc r7, r7, #0\n\t"
  111058. "lsr r8, r10, #16\n\t"
  111059. "lsr r9, r12, #16\n\t"
  111060. "mul r9, r8, r9\n\t"
  111061. "adds r6, r6, r9\n\t"
  111062. "adc r7, r7, #0\n\t"
  111063. "lsl r9, r12, #16\n\t"
  111064. "lsr r9, r9, #16\n\t"
  111065. "mul r8, r9, r8\n\t"
  111066. "lsr r9, r8, #16\n\t"
  111067. "lsl r8, r8, #16\n\t"
  111068. "adds r5, r5, r8\n\t"
  111069. "adcs r6, r6, r9\n\t"
  111070. "adc r7, r7, #0\n\t"
  111071. #else
  111072. "umull r8, r9, r10, r12\n\t"
  111073. "adds r5, r5, r8\n\t"
  111074. "adcs r6, r6, r9\n\t"
  111075. "adc r7, r7, #0\n\t"
  111076. #endif
  111077. /* A[9] * A[9] */
  111078. "ldr r10, [%[a], #36]\n\t"
  111079. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111080. "lsl r8, r10, #16\n\t"
  111081. "lsr r9, r10, #16\n\t"
  111082. "lsr r8, r8, #16\n\t"
  111083. "mov r12, r8\n\t"
  111084. "mul r8, r12, r8\n\t"
  111085. "mov r12, r9\n\t"
  111086. "mul r9, r12, r9\n\t"
  111087. "adds r2, r2, r8\n\t"
  111088. "adcs r3, r3, r9\n\t"
  111089. "adc r4, r4, #0\n\t"
  111090. "lsr r9, r10, #16\n\t"
  111091. "lsl r8, r10, #16\n\t"
  111092. "lsr r8, r8, #16\n\t"
  111093. "mul r8, r9, r8\n\t"
  111094. "lsr r9, r8, #15\n\t"
  111095. "lsl r8, r8, #17\n\t"
  111096. "adds r2, r2, r8\n\t"
  111097. "adcs r3, r3, r9\n\t"
  111098. "adc r4, r4, #0\n\t"
  111099. "adds r5, r5, r5\n\t"
  111100. "adcs r6, r6, r6\n\t"
  111101. "adc r7, r7, r7\n\t"
  111102. #else
  111103. "umull r8, r9, r10, r10\n\t"
  111104. "adds r5, r5, r5\n\t"
  111105. "adcs r6, r6, r6\n\t"
  111106. "adc r7, r7, r7\n\t"
  111107. "adds r2, r2, r8\n\t"
  111108. "adcs r3, r3, r9\n\t"
  111109. "adc r4, r4, #0\n\t"
  111110. #endif
  111111. "adds r2, r2, r5\n\t"
  111112. "adcs r3, r3, r6\n\t"
  111113. "adc r4, r4, r7\n\t"
  111114. "str r2, [%[r], #72]\n\t"
  111115. /* A[3] * A[16] */
  111116. "ldr r10, [%[a], #64]\n\t"
  111117. "ldr r12, [%[a], #12]\n\t"
  111118. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111119. "lsl r8, r10, #16\n\t"
  111120. "lsl r5, r12, #16\n\t"
  111121. "lsr r8, r8, #16\n\t"
  111122. "lsr r5, r5, #16\n\t"
  111123. "mul r5, r8, r5\n\t"
  111124. "lsr r9, r12, #16\n\t"
  111125. "mul r8, r9, r8\n\t"
  111126. "lsr r6, r8, #16\n\t"
  111127. "lsl r8, r8, #16\n\t"
  111128. "adds r5, r5, r8\n\t"
  111129. "adc r6, r6, #0\n\t"
  111130. "lsr r8, r10, #16\n\t"
  111131. "mul r9, r8, r9\n\t"
  111132. "add r6, r6, r9\n\t"
  111133. "lsl r9, r12, #16\n\t"
  111134. "lsr r9, r9, #16\n\t"
  111135. "mul r8, r9, r8\n\t"
  111136. "lsr r9, r8, #16\n\t"
  111137. "lsl r8, r8, #16\n\t"
  111138. "adds r5, r5, r8\n\t"
  111139. "adc r6, r6, r9\n\t"
  111140. #else
  111141. "umull r5, r6, r10, r12\n\t"
  111142. #endif
  111143. "mov r2, #0\n\t"
  111144. "mov r7, #0\n\t"
  111145. /* A[4] * A[15] */
  111146. "ldr r10, [%[a], #60]\n\t"
  111147. "ldr r12, [%[a], #16]\n\t"
  111148. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111149. "lsl r8, r10, #16\n\t"
  111150. "lsl r9, r12, #16\n\t"
  111151. "lsr r8, r8, #16\n\t"
  111152. "lsr r9, r9, #16\n\t"
  111153. "mul r9, r8, r9\n\t"
  111154. "adds r5, r5, r9\n\t"
  111155. "adcs r6, r6, #0\n\t"
  111156. "adc r7, r7, #0\n\t"
  111157. "lsr r9, r12, #16\n\t"
  111158. "mul r8, r9, r8\n\t"
  111159. "lsr r9, r8, #16\n\t"
  111160. "lsl r8, r8, #16\n\t"
  111161. "adds r5, r5, r8\n\t"
  111162. "adcs r6, r6, r9\n\t"
  111163. "adc r7, r7, #0\n\t"
  111164. "lsr r8, r10, #16\n\t"
  111165. "lsr r9, r12, #16\n\t"
  111166. "mul r9, r8, r9\n\t"
  111167. "adds r6, r6, r9\n\t"
  111168. "adc r7, r7, #0\n\t"
  111169. "lsl r9, r12, #16\n\t"
  111170. "lsr r9, r9, #16\n\t"
  111171. "mul r8, r9, r8\n\t"
  111172. "lsr r9, r8, #16\n\t"
  111173. "lsl r8, r8, #16\n\t"
  111174. "adds r5, r5, r8\n\t"
  111175. "adcs r6, r6, r9\n\t"
  111176. "adc r7, r7, #0\n\t"
  111177. #else
  111178. "umull r8, r9, r10, r12\n\t"
  111179. "adds r5, r5, r8\n\t"
  111180. "adcs r6, r6, r9\n\t"
  111181. "adc r7, r7, #0\n\t"
  111182. #endif
  111183. /* A[5] * A[14] */
  111184. "ldr r10, [%[a], #56]\n\t"
  111185. "ldr r12, [%[a], #20]\n\t"
  111186. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111187. "lsl r8, r10, #16\n\t"
  111188. "lsl r9, r12, #16\n\t"
  111189. "lsr r8, r8, #16\n\t"
  111190. "lsr r9, r9, #16\n\t"
  111191. "mul r9, r8, r9\n\t"
  111192. "adds r5, r5, r9\n\t"
  111193. "adcs r6, r6, #0\n\t"
  111194. "adc r7, r7, #0\n\t"
  111195. "lsr r9, r12, #16\n\t"
  111196. "mul r8, r9, r8\n\t"
  111197. "lsr r9, r8, #16\n\t"
  111198. "lsl r8, r8, #16\n\t"
  111199. "adds r5, r5, r8\n\t"
  111200. "adcs r6, r6, r9\n\t"
  111201. "adc r7, r7, #0\n\t"
  111202. "lsr r8, r10, #16\n\t"
  111203. "lsr r9, r12, #16\n\t"
  111204. "mul r9, r8, r9\n\t"
  111205. "adds r6, r6, r9\n\t"
  111206. "adc r7, r7, #0\n\t"
  111207. "lsl r9, r12, #16\n\t"
  111208. "lsr r9, r9, #16\n\t"
  111209. "mul r8, r9, r8\n\t"
  111210. "lsr r9, r8, #16\n\t"
  111211. "lsl r8, r8, #16\n\t"
  111212. "adds r5, r5, r8\n\t"
  111213. "adcs r6, r6, r9\n\t"
  111214. "adc r7, r7, #0\n\t"
  111215. #else
  111216. "umull r8, r9, r10, r12\n\t"
  111217. "adds r5, r5, r8\n\t"
  111218. "adcs r6, r6, r9\n\t"
  111219. "adc r7, r7, #0\n\t"
  111220. #endif
  111221. /* A[6] * A[13] */
  111222. "ldr r10, [%[a], #52]\n\t"
  111223. "ldr r12, [%[a], #24]\n\t"
  111224. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111225. "lsl r8, r10, #16\n\t"
  111226. "lsl r9, r12, #16\n\t"
  111227. "lsr r8, r8, #16\n\t"
  111228. "lsr r9, r9, #16\n\t"
  111229. "mul r9, r8, r9\n\t"
  111230. "adds r5, r5, r9\n\t"
  111231. "adcs r6, r6, #0\n\t"
  111232. "adc r7, r7, #0\n\t"
  111233. "lsr r9, r12, #16\n\t"
  111234. "mul r8, r9, r8\n\t"
  111235. "lsr r9, r8, #16\n\t"
  111236. "lsl r8, r8, #16\n\t"
  111237. "adds r5, r5, r8\n\t"
  111238. "adcs r6, r6, r9\n\t"
  111239. "adc r7, r7, #0\n\t"
  111240. "lsr r8, r10, #16\n\t"
  111241. "lsr r9, r12, #16\n\t"
  111242. "mul r9, r8, r9\n\t"
  111243. "adds r6, r6, r9\n\t"
  111244. "adc r7, r7, #0\n\t"
  111245. "lsl r9, r12, #16\n\t"
  111246. "lsr r9, r9, #16\n\t"
  111247. "mul r8, r9, r8\n\t"
  111248. "lsr r9, r8, #16\n\t"
  111249. "lsl r8, r8, #16\n\t"
  111250. "adds r5, r5, r8\n\t"
  111251. "adcs r6, r6, r9\n\t"
  111252. "adc r7, r7, #0\n\t"
  111253. #else
  111254. "umull r8, r9, r10, r12\n\t"
  111255. "adds r5, r5, r8\n\t"
  111256. "adcs r6, r6, r9\n\t"
  111257. "adc r7, r7, #0\n\t"
  111258. #endif
  111259. /* A[7] * A[12] */
  111260. "ldr r10, [%[a], #48]\n\t"
  111261. "ldr r12, [%[a], #28]\n\t"
  111262. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111263. "lsl r8, r10, #16\n\t"
  111264. "lsl r9, r12, #16\n\t"
  111265. "lsr r8, r8, #16\n\t"
  111266. "lsr r9, r9, #16\n\t"
  111267. "mul r9, r8, r9\n\t"
  111268. "adds r5, r5, r9\n\t"
  111269. "adcs r6, r6, #0\n\t"
  111270. "adc r7, r7, #0\n\t"
  111271. "lsr r9, r12, #16\n\t"
  111272. "mul r8, r9, r8\n\t"
  111273. "lsr r9, r8, #16\n\t"
  111274. "lsl r8, r8, #16\n\t"
  111275. "adds r5, r5, r8\n\t"
  111276. "adcs r6, r6, r9\n\t"
  111277. "adc r7, r7, #0\n\t"
  111278. "lsr r8, r10, #16\n\t"
  111279. "lsr r9, r12, #16\n\t"
  111280. "mul r9, r8, r9\n\t"
  111281. "adds r6, r6, r9\n\t"
  111282. "adc r7, r7, #0\n\t"
  111283. "lsl r9, r12, #16\n\t"
  111284. "lsr r9, r9, #16\n\t"
  111285. "mul r8, r9, r8\n\t"
  111286. "lsr r9, r8, #16\n\t"
  111287. "lsl r8, r8, #16\n\t"
  111288. "adds r5, r5, r8\n\t"
  111289. "adcs r6, r6, r9\n\t"
  111290. "adc r7, r7, #0\n\t"
  111291. #else
  111292. "umull r8, r9, r10, r12\n\t"
  111293. "adds r5, r5, r8\n\t"
  111294. "adcs r6, r6, r9\n\t"
  111295. "adc r7, r7, #0\n\t"
  111296. #endif
  111297. /* A[8] * A[11] */
  111298. "ldr r10, [%[a], #44]\n\t"
  111299. "ldr r12, [%[a], #32]\n\t"
  111300. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111301. "lsl r8, r10, #16\n\t"
  111302. "lsl r9, r12, #16\n\t"
  111303. "lsr r8, r8, #16\n\t"
  111304. "lsr r9, r9, #16\n\t"
  111305. "mul r9, r8, r9\n\t"
  111306. "adds r5, r5, r9\n\t"
  111307. "adcs r6, r6, #0\n\t"
  111308. "adc r7, r7, #0\n\t"
  111309. "lsr r9, r12, #16\n\t"
  111310. "mul r8, r9, r8\n\t"
  111311. "lsr r9, r8, #16\n\t"
  111312. "lsl r8, r8, #16\n\t"
  111313. "adds r5, r5, r8\n\t"
  111314. "adcs r6, r6, r9\n\t"
  111315. "adc r7, r7, #0\n\t"
  111316. "lsr r8, r10, #16\n\t"
  111317. "lsr r9, r12, #16\n\t"
  111318. "mul r9, r8, r9\n\t"
  111319. "adds r6, r6, r9\n\t"
  111320. "adc r7, r7, #0\n\t"
  111321. "lsl r9, r12, #16\n\t"
  111322. "lsr r9, r9, #16\n\t"
  111323. "mul r8, r9, r8\n\t"
  111324. "lsr r9, r8, #16\n\t"
  111325. "lsl r8, r8, #16\n\t"
  111326. "adds r5, r5, r8\n\t"
  111327. "adcs r6, r6, r9\n\t"
  111328. "adc r7, r7, #0\n\t"
  111329. #else
  111330. "umull r8, r9, r10, r12\n\t"
  111331. "adds r5, r5, r8\n\t"
  111332. "adcs r6, r6, r9\n\t"
  111333. "adc r7, r7, #0\n\t"
  111334. #endif
  111335. /* A[9] * A[10] */
  111336. "ldr r10, [%[a], #40]\n\t"
  111337. "ldr r12, [%[a], #36]\n\t"
  111338. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111339. "lsl r8, r10, #16\n\t"
  111340. "lsl r9, r12, #16\n\t"
  111341. "lsr r8, r8, #16\n\t"
  111342. "lsr r9, r9, #16\n\t"
  111343. "mul r9, r8, r9\n\t"
  111344. "adds r5, r5, r9\n\t"
  111345. "adcs r6, r6, #0\n\t"
  111346. "adc r7, r7, #0\n\t"
  111347. "lsr r9, r12, #16\n\t"
  111348. "mul r8, r9, r8\n\t"
  111349. "lsr r9, r8, #16\n\t"
  111350. "lsl r8, r8, #16\n\t"
  111351. "adds r5, r5, r8\n\t"
  111352. "adcs r6, r6, r9\n\t"
  111353. "adc r7, r7, #0\n\t"
  111354. "lsr r8, r10, #16\n\t"
  111355. "lsr r9, r12, #16\n\t"
  111356. "mul r9, r8, r9\n\t"
  111357. "adds r6, r6, r9\n\t"
  111358. "adc r7, r7, #0\n\t"
  111359. "lsl r9, r12, #16\n\t"
  111360. "lsr r9, r9, #16\n\t"
  111361. "mul r8, r9, r8\n\t"
  111362. "lsr r9, r8, #16\n\t"
  111363. "lsl r8, r8, #16\n\t"
  111364. "adds r5, r5, r8\n\t"
  111365. "adcs r6, r6, r9\n\t"
  111366. "adc r7, r7, #0\n\t"
  111367. #else
  111368. "umull r8, r9, r10, r12\n\t"
  111369. "adds r5, r5, r8\n\t"
  111370. "adcs r6, r6, r9\n\t"
  111371. "adc r7, r7, #0\n\t"
  111372. #endif
  111373. "adds r5, r5, r5\n\t"
  111374. "adcs r6, r6, r6\n\t"
  111375. "adc r7, r7, r7\n\t"
  111376. "adds r3, r3, r5\n\t"
  111377. "adcs r4, r4, r6\n\t"
  111378. "adc r2, r2, r7\n\t"
  111379. "str r3, [%[r], #76]\n\t"
  111380. /* A[4] * A[16] */
  111381. "ldr r10, [%[a], #64]\n\t"
  111382. "ldr r12, [%[a], #16]\n\t"
  111383. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111384. "lsl r8, r10, #16\n\t"
  111385. "lsl r5, r12, #16\n\t"
  111386. "lsr r8, r8, #16\n\t"
  111387. "lsr r5, r5, #16\n\t"
  111388. "mul r5, r8, r5\n\t"
  111389. "lsr r9, r12, #16\n\t"
  111390. "mul r8, r9, r8\n\t"
  111391. "lsr r6, r8, #16\n\t"
  111392. "lsl r8, r8, #16\n\t"
  111393. "adds r5, r5, r8\n\t"
  111394. "adc r6, r6, #0\n\t"
  111395. "lsr r8, r10, #16\n\t"
  111396. "mul r9, r8, r9\n\t"
  111397. "add r6, r6, r9\n\t"
  111398. "lsl r9, r12, #16\n\t"
  111399. "lsr r9, r9, #16\n\t"
  111400. "mul r8, r9, r8\n\t"
  111401. "lsr r9, r8, #16\n\t"
  111402. "lsl r8, r8, #16\n\t"
  111403. "adds r5, r5, r8\n\t"
  111404. "adc r6, r6, r9\n\t"
  111405. #else
  111406. "umull r5, r6, r10, r12\n\t"
  111407. #endif
  111408. "mov r3, #0\n\t"
  111409. "mov r7, #0\n\t"
  111410. /* A[5] * A[15] */
  111411. "ldr r10, [%[a], #60]\n\t"
  111412. "ldr r12, [%[a], #20]\n\t"
  111413. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111414. "lsl r8, r10, #16\n\t"
  111415. "lsl r9, r12, #16\n\t"
  111416. "lsr r8, r8, #16\n\t"
  111417. "lsr r9, r9, #16\n\t"
  111418. "mul r9, r8, r9\n\t"
  111419. "adds r5, r5, r9\n\t"
  111420. "adcs r6, r6, #0\n\t"
  111421. "adc r7, r7, #0\n\t"
  111422. "lsr r9, r12, #16\n\t"
  111423. "mul r8, r9, r8\n\t"
  111424. "lsr r9, r8, #16\n\t"
  111425. "lsl r8, r8, #16\n\t"
  111426. "adds r5, r5, r8\n\t"
  111427. "adcs r6, r6, r9\n\t"
  111428. "adc r7, r7, #0\n\t"
  111429. "lsr r8, r10, #16\n\t"
  111430. "lsr r9, r12, #16\n\t"
  111431. "mul r9, r8, r9\n\t"
  111432. "adds r6, r6, r9\n\t"
  111433. "adc r7, r7, #0\n\t"
  111434. "lsl r9, r12, #16\n\t"
  111435. "lsr r9, r9, #16\n\t"
  111436. "mul r8, r9, r8\n\t"
  111437. "lsr r9, r8, #16\n\t"
  111438. "lsl r8, r8, #16\n\t"
  111439. "adds r5, r5, r8\n\t"
  111440. "adcs r6, r6, r9\n\t"
  111441. "adc r7, r7, #0\n\t"
  111442. #else
  111443. "umull r8, r9, r10, r12\n\t"
  111444. "adds r5, r5, r8\n\t"
  111445. "adcs r6, r6, r9\n\t"
  111446. "adc r7, r7, #0\n\t"
  111447. #endif
  111448. /* A[6] * A[14] */
  111449. "ldr r10, [%[a], #56]\n\t"
  111450. "ldr r12, [%[a], #24]\n\t"
  111451. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111452. "lsl r8, r10, #16\n\t"
  111453. "lsl r9, r12, #16\n\t"
  111454. "lsr r8, r8, #16\n\t"
  111455. "lsr r9, r9, #16\n\t"
  111456. "mul r9, r8, r9\n\t"
  111457. "adds r5, r5, r9\n\t"
  111458. "adcs r6, r6, #0\n\t"
  111459. "adc r7, r7, #0\n\t"
  111460. "lsr r9, r12, #16\n\t"
  111461. "mul r8, r9, r8\n\t"
  111462. "lsr r9, r8, #16\n\t"
  111463. "lsl r8, r8, #16\n\t"
  111464. "adds r5, r5, r8\n\t"
  111465. "adcs r6, r6, r9\n\t"
  111466. "adc r7, r7, #0\n\t"
  111467. "lsr r8, r10, #16\n\t"
  111468. "lsr r9, r12, #16\n\t"
  111469. "mul r9, r8, r9\n\t"
  111470. "adds r6, r6, r9\n\t"
  111471. "adc r7, r7, #0\n\t"
  111472. "lsl r9, r12, #16\n\t"
  111473. "lsr r9, r9, #16\n\t"
  111474. "mul r8, r9, r8\n\t"
  111475. "lsr r9, r8, #16\n\t"
  111476. "lsl r8, r8, #16\n\t"
  111477. "adds r5, r5, r8\n\t"
  111478. "adcs r6, r6, r9\n\t"
  111479. "adc r7, r7, #0\n\t"
  111480. #else
  111481. "umull r8, r9, r10, r12\n\t"
  111482. "adds r5, r5, r8\n\t"
  111483. "adcs r6, r6, r9\n\t"
  111484. "adc r7, r7, #0\n\t"
  111485. #endif
  111486. /* A[7] * A[13] */
  111487. "ldr r10, [%[a], #52]\n\t"
  111488. "ldr r12, [%[a], #28]\n\t"
  111489. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111490. "lsl r8, r10, #16\n\t"
  111491. "lsl r9, r12, #16\n\t"
  111492. "lsr r8, r8, #16\n\t"
  111493. "lsr r9, r9, #16\n\t"
  111494. "mul r9, r8, r9\n\t"
  111495. "adds r5, r5, r9\n\t"
  111496. "adcs r6, r6, #0\n\t"
  111497. "adc r7, r7, #0\n\t"
  111498. "lsr r9, r12, #16\n\t"
  111499. "mul r8, r9, r8\n\t"
  111500. "lsr r9, r8, #16\n\t"
  111501. "lsl r8, r8, #16\n\t"
  111502. "adds r5, r5, r8\n\t"
  111503. "adcs r6, r6, r9\n\t"
  111504. "adc r7, r7, #0\n\t"
  111505. "lsr r8, r10, #16\n\t"
  111506. "lsr r9, r12, #16\n\t"
  111507. "mul r9, r8, r9\n\t"
  111508. "adds r6, r6, r9\n\t"
  111509. "adc r7, r7, #0\n\t"
  111510. "lsl r9, r12, #16\n\t"
  111511. "lsr r9, r9, #16\n\t"
  111512. "mul r8, r9, r8\n\t"
  111513. "lsr r9, r8, #16\n\t"
  111514. "lsl r8, r8, #16\n\t"
  111515. "adds r5, r5, r8\n\t"
  111516. "adcs r6, r6, r9\n\t"
  111517. "adc r7, r7, #0\n\t"
  111518. #else
  111519. "umull r8, r9, r10, r12\n\t"
  111520. "adds r5, r5, r8\n\t"
  111521. "adcs r6, r6, r9\n\t"
  111522. "adc r7, r7, #0\n\t"
  111523. #endif
  111524. /* A[8] * A[12] */
  111525. "ldr r10, [%[a], #48]\n\t"
  111526. "ldr r12, [%[a], #32]\n\t"
  111527. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111528. "lsl r8, r10, #16\n\t"
  111529. "lsl r9, r12, #16\n\t"
  111530. "lsr r8, r8, #16\n\t"
  111531. "lsr r9, r9, #16\n\t"
  111532. "mul r9, r8, r9\n\t"
  111533. "adds r5, r5, r9\n\t"
  111534. "adcs r6, r6, #0\n\t"
  111535. "adc r7, r7, #0\n\t"
  111536. "lsr r9, r12, #16\n\t"
  111537. "mul r8, r9, r8\n\t"
  111538. "lsr r9, r8, #16\n\t"
  111539. "lsl r8, r8, #16\n\t"
  111540. "adds r5, r5, r8\n\t"
  111541. "adcs r6, r6, r9\n\t"
  111542. "adc r7, r7, #0\n\t"
  111543. "lsr r8, r10, #16\n\t"
  111544. "lsr r9, r12, #16\n\t"
  111545. "mul r9, r8, r9\n\t"
  111546. "adds r6, r6, r9\n\t"
  111547. "adc r7, r7, #0\n\t"
  111548. "lsl r9, r12, #16\n\t"
  111549. "lsr r9, r9, #16\n\t"
  111550. "mul r8, r9, r8\n\t"
  111551. "lsr r9, r8, #16\n\t"
  111552. "lsl r8, r8, #16\n\t"
  111553. "adds r5, r5, r8\n\t"
  111554. "adcs r6, r6, r9\n\t"
  111555. "adc r7, r7, #0\n\t"
  111556. #else
  111557. "umull r8, r9, r10, r12\n\t"
  111558. "adds r5, r5, r8\n\t"
  111559. "adcs r6, r6, r9\n\t"
  111560. "adc r7, r7, #0\n\t"
  111561. #endif
  111562. /* A[9] * A[11] */
  111563. "ldr r10, [%[a], #44]\n\t"
  111564. "ldr r12, [%[a], #36]\n\t"
  111565. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111566. "lsl r8, r10, #16\n\t"
  111567. "lsl r9, r12, #16\n\t"
  111568. "lsr r8, r8, #16\n\t"
  111569. "lsr r9, r9, #16\n\t"
  111570. "mul r9, r8, r9\n\t"
  111571. "adds r5, r5, r9\n\t"
  111572. "adcs r6, r6, #0\n\t"
  111573. "adc r7, r7, #0\n\t"
  111574. "lsr r9, r12, #16\n\t"
  111575. "mul r8, r9, r8\n\t"
  111576. "lsr r9, r8, #16\n\t"
  111577. "lsl r8, r8, #16\n\t"
  111578. "adds r5, r5, r8\n\t"
  111579. "adcs r6, r6, r9\n\t"
  111580. "adc r7, r7, #0\n\t"
  111581. "lsr r8, r10, #16\n\t"
  111582. "lsr r9, r12, #16\n\t"
  111583. "mul r9, r8, r9\n\t"
  111584. "adds r6, r6, r9\n\t"
  111585. "adc r7, r7, #0\n\t"
  111586. "lsl r9, r12, #16\n\t"
  111587. "lsr r9, r9, #16\n\t"
  111588. "mul r8, r9, r8\n\t"
  111589. "lsr r9, r8, #16\n\t"
  111590. "lsl r8, r8, #16\n\t"
  111591. "adds r5, r5, r8\n\t"
  111592. "adcs r6, r6, r9\n\t"
  111593. "adc r7, r7, #0\n\t"
  111594. #else
  111595. "umull r8, r9, r10, r12\n\t"
  111596. "adds r5, r5, r8\n\t"
  111597. "adcs r6, r6, r9\n\t"
  111598. "adc r7, r7, #0\n\t"
  111599. #endif
  111600. /* A[10] * A[10] */
  111601. "ldr r10, [%[a], #40]\n\t"
  111602. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111603. "lsl r8, r10, #16\n\t"
  111604. "lsr r9, r10, #16\n\t"
  111605. "lsr r8, r8, #16\n\t"
  111606. "mov r12, r8\n\t"
  111607. "mul r8, r12, r8\n\t"
  111608. "mov r12, r9\n\t"
  111609. "mul r9, r12, r9\n\t"
  111610. "adds r4, r4, r8\n\t"
  111611. "adcs r2, r2, r9\n\t"
  111612. "adc r3, r3, #0\n\t"
  111613. "lsr r9, r10, #16\n\t"
  111614. "lsl r8, r10, #16\n\t"
  111615. "lsr r8, r8, #16\n\t"
  111616. "mul r8, r9, r8\n\t"
  111617. "lsr r9, r8, #15\n\t"
  111618. "lsl r8, r8, #17\n\t"
  111619. "adds r4, r4, r8\n\t"
  111620. "adcs r2, r2, r9\n\t"
  111621. "adc r3, r3, #0\n\t"
  111622. "adds r5, r5, r5\n\t"
  111623. "adcs r6, r6, r6\n\t"
  111624. "adc r7, r7, r7\n\t"
  111625. #else
  111626. "umull r8, r9, r10, r10\n\t"
  111627. "adds r5, r5, r5\n\t"
  111628. "adcs r6, r6, r6\n\t"
  111629. "adc r7, r7, r7\n\t"
  111630. "adds r4, r4, r8\n\t"
  111631. "adcs r2, r2, r9\n\t"
  111632. "adc r3, r3, #0\n\t"
  111633. #endif
  111634. "adds r4, r4, r5\n\t"
  111635. "adcs r2, r2, r6\n\t"
  111636. "adc r3, r3, r7\n\t"
  111637. "str r4, [%[r], #80]\n\t"
  111638. /* A[5] * A[16] */
  111639. "ldr r10, [%[a], #64]\n\t"
  111640. "ldr r12, [%[a], #20]\n\t"
  111641. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111642. "lsl r8, r10, #16\n\t"
  111643. "lsl r5, r12, #16\n\t"
  111644. "lsr r8, r8, #16\n\t"
  111645. "lsr r5, r5, #16\n\t"
  111646. "mul r5, r8, r5\n\t"
  111647. "lsr r9, r12, #16\n\t"
  111648. "mul r8, r9, r8\n\t"
  111649. "lsr r6, r8, #16\n\t"
  111650. "lsl r8, r8, #16\n\t"
  111651. "adds r5, r5, r8\n\t"
  111652. "adc r6, r6, #0\n\t"
  111653. "lsr r8, r10, #16\n\t"
  111654. "mul r9, r8, r9\n\t"
  111655. "add r6, r6, r9\n\t"
  111656. "lsl r9, r12, #16\n\t"
  111657. "lsr r9, r9, #16\n\t"
  111658. "mul r8, r9, r8\n\t"
  111659. "lsr r9, r8, #16\n\t"
  111660. "lsl r8, r8, #16\n\t"
  111661. "adds r5, r5, r8\n\t"
  111662. "adc r6, r6, r9\n\t"
  111663. #else
  111664. "umull r5, r6, r10, r12\n\t"
  111665. #endif
  111666. "mov r4, #0\n\t"
  111667. "mov r7, #0\n\t"
  111668. /* A[6] * A[15] */
  111669. "ldr r10, [%[a], #60]\n\t"
  111670. "ldr r12, [%[a], #24]\n\t"
  111671. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111672. "lsl r8, r10, #16\n\t"
  111673. "lsl r9, r12, #16\n\t"
  111674. "lsr r8, r8, #16\n\t"
  111675. "lsr r9, r9, #16\n\t"
  111676. "mul r9, r8, r9\n\t"
  111677. "adds r5, r5, r9\n\t"
  111678. "adcs r6, r6, #0\n\t"
  111679. "adc r7, r7, #0\n\t"
  111680. "lsr r9, r12, #16\n\t"
  111681. "mul r8, r9, r8\n\t"
  111682. "lsr r9, r8, #16\n\t"
  111683. "lsl r8, r8, #16\n\t"
  111684. "adds r5, r5, r8\n\t"
  111685. "adcs r6, r6, r9\n\t"
  111686. "adc r7, r7, #0\n\t"
  111687. "lsr r8, r10, #16\n\t"
  111688. "lsr r9, r12, #16\n\t"
  111689. "mul r9, r8, r9\n\t"
  111690. "adds r6, r6, r9\n\t"
  111691. "adc r7, r7, #0\n\t"
  111692. "lsl r9, r12, #16\n\t"
  111693. "lsr r9, r9, #16\n\t"
  111694. "mul r8, r9, r8\n\t"
  111695. "lsr r9, r8, #16\n\t"
  111696. "lsl r8, r8, #16\n\t"
  111697. "adds r5, r5, r8\n\t"
  111698. "adcs r6, r6, r9\n\t"
  111699. "adc r7, r7, #0\n\t"
  111700. #else
  111701. "umull r8, r9, r10, r12\n\t"
  111702. "adds r5, r5, r8\n\t"
  111703. "adcs r6, r6, r9\n\t"
  111704. "adc r7, r7, #0\n\t"
  111705. #endif
  111706. /* A[7] * A[14] */
  111707. "ldr r10, [%[a], #56]\n\t"
  111708. "ldr r12, [%[a], #28]\n\t"
  111709. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111710. "lsl r8, r10, #16\n\t"
  111711. "lsl r9, r12, #16\n\t"
  111712. "lsr r8, r8, #16\n\t"
  111713. "lsr r9, r9, #16\n\t"
  111714. "mul r9, r8, r9\n\t"
  111715. "adds r5, r5, r9\n\t"
  111716. "adcs r6, r6, #0\n\t"
  111717. "adc r7, r7, #0\n\t"
  111718. "lsr r9, r12, #16\n\t"
  111719. "mul r8, r9, r8\n\t"
  111720. "lsr r9, r8, #16\n\t"
  111721. "lsl r8, r8, #16\n\t"
  111722. "adds r5, r5, r8\n\t"
  111723. "adcs r6, r6, r9\n\t"
  111724. "adc r7, r7, #0\n\t"
  111725. "lsr r8, r10, #16\n\t"
  111726. "lsr r9, r12, #16\n\t"
  111727. "mul r9, r8, r9\n\t"
  111728. "adds r6, r6, r9\n\t"
  111729. "adc r7, r7, #0\n\t"
  111730. "lsl r9, r12, #16\n\t"
  111731. "lsr r9, r9, #16\n\t"
  111732. "mul r8, r9, r8\n\t"
  111733. "lsr r9, r8, #16\n\t"
  111734. "lsl r8, r8, #16\n\t"
  111735. "adds r5, r5, r8\n\t"
  111736. "adcs r6, r6, r9\n\t"
  111737. "adc r7, r7, #0\n\t"
  111738. #else
  111739. "umull r8, r9, r10, r12\n\t"
  111740. "adds r5, r5, r8\n\t"
  111741. "adcs r6, r6, r9\n\t"
  111742. "adc r7, r7, #0\n\t"
  111743. #endif
  111744. /* A[8] * A[13] */
  111745. "ldr r10, [%[a], #52]\n\t"
  111746. "ldr r12, [%[a], #32]\n\t"
  111747. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111748. "lsl r8, r10, #16\n\t"
  111749. "lsl r9, r12, #16\n\t"
  111750. "lsr r8, r8, #16\n\t"
  111751. "lsr r9, r9, #16\n\t"
  111752. "mul r9, r8, r9\n\t"
  111753. "adds r5, r5, r9\n\t"
  111754. "adcs r6, r6, #0\n\t"
  111755. "adc r7, r7, #0\n\t"
  111756. "lsr r9, r12, #16\n\t"
  111757. "mul r8, r9, r8\n\t"
  111758. "lsr r9, r8, #16\n\t"
  111759. "lsl r8, r8, #16\n\t"
  111760. "adds r5, r5, r8\n\t"
  111761. "adcs r6, r6, r9\n\t"
  111762. "adc r7, r7, #0\n\t"
  111763. "lsr r8, r10, #16\n\t"
  111764. "lsr r9, r12, #16\n\t"
  111765. "mul r9, r8, r9\n\t"
  111766. "adds r6, r6, r9\n\t"
  111767. "adc r7, r7, #0\n\t"
  111768. "lsl r9, r12, #16\n\t"
  111769. "lsr r9, r9, #16\n\t"
  111770. "mul r8, r9, r8\n\t"
  111771. "lsr r9, r8, #16\n\t"
  111772. "lsl r8, r8, #16\n\t"
  111773. "adds r5, r5, r8\n\t"
  111774. "adcs r6, r6, r9\n\t"
  111775. "adc r7, r7, #0\n\t"
  111776. #else
  111777. "umull r8, r9, r10, r12\n\t"
  111778. "adds r5, r5, r8\n\t"
  111779. "adcs r6, r6, r9\n\t"
  111780. "adc r7, r7, #0\n\t"
  111781. #endif
  111782. /* A[9] * A[12] */
  111783. "ldr r10, [%[a], #48]\n\t"
  111784. "ldr r12, [%[a], #36]\n\t"
  111785. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111786. "lsl r8, r10, #16\n\t"
  111787. "lsl r9, r12, #16\n\t"
  111788. "lsr r8, r8, #16\n\t"
  111789. "lsr r9, r9, #16\n\t"
  111790. "mul r9, r8, r9\n\t"
  111791. "adds r5, r5, r9\n\t"
  111792. "adcs r6, r6, #0\n\t"
  111793. "adc r7, r7, #0\n\t"
  111794. "lsr r9, r12, #16\n\t"
  111795. "mul r8, r9, r8\n\t"
  111796. "lsr r9, r8, #16\n\t"
  111797. "lsl r8, r8, #16\n\t"
  111798. "adds r5, r5, r8\n\t"
  111799. "adcs r6, r6, r9\n\t"
  111800. "adc r7, r7, #0\n\t"
  111801. "lsr r8, r10, #16\n\t"
  111802. "lsr r9, r12, #16\n\t"
  111803. "mul r9, r8, r9\n\t"
  111804. "adds r6, r6, r9\n\t"
  111805. "adc r7, r7, #0\n\t"
  111806. "lsl r9, r12, #16\n\t"
  111807. "lsr r9, r9, #16\n\t"
  111808. "mul r8, r9, r8\n\t"
  111809. "lsr r9, r8, #16\n\t"
  111810. "lsl r8, r8, #16\n\t"
  111811. "adds r5, r5, r8\n\t"
  111812. "adcs r6, r6, r9\n\t"
  111813. "adc r7, r7, #0\n\t"
  111814. #else
  111815. "umull r8, r9, r10, r12\n\t"
  111816. "adds r5, r5, r8\n\t"
  111817. "adcs r6, r6, r9\n\t"
  111818. "adc r7, r7, #0\n\t"
  111819. #endif
  111820. /* A[10] * A[11] */
  111821. "ldr r10, [%[a], #44]\n\t"
  111822. "ldr r12, [%[a], #40]\n\t"
  111823. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111824. "lsl r8, r10, #16\n\t"
  111825. "lsl r9, r12, #16\n\t"
  111826. "lsr r8, r8, #16\n\t"
  111827. "lsr r9, r9, #16\n\t"
  111828. "mul r9, r8, r9\n\t"
  111829. "adds r5, r5, r9\n\t"
  111830. "adcs r6, r6, #0\n\t"
  111831. "adc r7, r7, #0\n\t"
  111832. "lsr r9, r12, #16\n\t"
  111833. "mul r8, r9, r8\n\t"
  111834. "lsr r9, r8, #16\n\t"
  111835. "lsl r8, r8, #16\n\t"
  111836. "adds r5, r5, r8\n\t"
  111837. "adcs r6, r6, r9\n\t"
  111838. "adc r7, r7, #0\n\t"
  111839. "lsr r8, r10, #16\n\t"
  111840. "lsr r9, r12, #16\n\t"
  111841. "mul r9, r8, r9\n\t"
  111842. "adds r6, r6, r9\n\t"
  111843. "adc r7, r7, #0\n\t"
  111844. "lsl r9, r12, #16\n\t"
  111845. "lsr r9, r9, #16\n\t"
  111846. "mul r8, r9, r8\n\t"
  111847. "lsr r9, r8, #16\n\t"
  111848. "lsl r8, r8, #16\n\t"
  111849. "adds r5, r5, r8\n\t"
  111850. "adcs r6, r6, r9\n\t"
  111851. "adc r7, r7, #0\n\t"
  111852. #else
  111853. "umull r8, r9, r10, r12\n\t"
  111854. "adds r5, r5, r8\n\t"
  111855. "adcs r6, r6, r9\n\t"
  111856. "adc r7, r7, #0\n\t"
  111857. #endif
  111858. "adds r5, r5, r5\n\t"
  111859. "adcs r6, r6, r6\n\t"
  111860. "adc r7, r7, r7\n\t"
  111861. "adds r2, r2, r5\n\t"
  111862. "adcs r3, r3, r6\n\t"
  111863. "adc r4, r4, r7\n\t"
  111864. "str r2, [%[r], #84]\n\t"
  111865. /* A[6] * A[16] */
  111866. "ldr r10, [%[a], #64]\n\t"
  111867. "ldr r12, [%[a], #24]\n\t"
  111868. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111869. "lsl r8, r10, #16\n\t"
  111870. "lsl r5, r12, #16\n\t"
  111871. "lsr r8, r8, #16\n\t"
  111872. "lsr r5, r5, #16\n\t"
  111873. "mul r5, r8, r5\n\t"
  111874. "lsr r9, r12, #16\n\t"
  111875. "mul r8, r9, r8\n\t"
  111876. "lsr r6, r8, #16\n\t"
  111877. "lsl r8, r8, #16\n\t"
  111878. "adds r5, r5, r8\n\t"
  111879. "adc r6, r6, #0\n\t"
  111880. "lsr r8, r10, #16\n\t"
  111881. "mul r9, r8, r9\n\t"
  111882. "add r6, r6, r9\n\t"
  111883. "lsl r9, r12, #16\n\t"
  111884. "lsr r9, r9, #16\n\t"
  111885. "mul r8, r9, r8\n\t"
  111886. "lsr r9, r8, #16\n\t"
  111887. "lsl r8, r8, #16\n\t"
  111888. "adds r5, r5, r8\n\t"
  111889. "adc r6, r6, r9\n\t"
  111890. #else
  111891. "umull r5, r6, r10, r12\n\t"
  111892. #endif
  111893. "mov r2, #0\n\t"
  111894. "mov r7, #0\n\t"
  111895. /* A[7] * A[15] */
  111896. "ldr r10, [%[a], #60]\n\t"
  111897. "ldr r12, [%[a], #28]\n\t"
  111898. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111899. "lsl r8, r10, #16\n\t"
  111900. "lsl r9, r12, #16\n\t"
  111901. "lsr r8, r8, #16\n\t"
  111902. "lsr r9, r9, #16\n\t"
  111903. "mul r9, r8, r9\n\t"
  111904. "adds r5, r5, r9\n\t"
  111905. "adcs r6, r6, #0\n\t"
  111906. "adc r7, r7, #0\n\t"
  111907. "lsr r9, r12, #16\n\t"
  111908. "mul r8, r9, r8\n\t"
  111909. "lsr r9, r8, #16\n\t"
  111910. "lsl r8, r8, #16\n\t"
  111911. "adds r5, r5, r8\n\t"
  111912. "adcs r6, r6, r9\n\t"
  111913. "adc r7, r7, #0\n\t"
  111914. "lsr r8, r10, #16\n\t"
  111915. "lsr r9, r12, #16\n\t"
  111916. "mul r9, r8, r9\n\t"
  111917. "adds r6, r6, r9\n\t"
  111918. "adc r7, r7, #0\n\t"
  111919. "lsl r9, r12, #16\n\t"
  111920. "lsr r9, r9, #16\n\t"
  111921. "mul r8, r9, r8\n\t"
  111922. "lsr r9, r8, #16\n\t"
  111923. "lsl r8, r8, #16\n\t"
  111924. "adds r5, r5, r8\n\t"
  111925. "adcs r6, r6, r9\n\t"
  111926. "adc r7, r7, #0\n\t"
  111927. #else
  111928. "umull r8, r9, r10, r12\n\t"
  111929. "adds r5, r5, r8\n\t"
  111930. "adcs r6, r6, r9\n\t"
  111931. "adc r7, r7, #0\n\t"
  111932. #endif
  111933. /* A[8] * A[14] */
  111934. "ldr r10, [%[a], #56]\n\t"
  111935. "ldr r12, [%[a], #32]\n\t"
  111936. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111937. "lsl r8, r10, #16\n\t"
  111938. "lsl r9, r12, #16\n\t"
  111939. "lsr r8, r8, #16\n\t"
  111940. "lsr r9, r9, #16\n\t"
  111941. "mul r9, r8, r9\n\t"
  111942. "adds r5, r5, r9\n\t"
  111943. "adcs r6, r6, #0\n\t"
  111944. "adc r7, r7, #0\n\t"
  111945. "lsr r9, r12, #16\n\t"
  111946. "mul r8, r9, r8\n\t"
  111947. "lsr r9, r8, #16\n\t"
  111948. "lsl r8, r8, #16\n\t"
  111949. "adds r5, r5, r8\n\t"
  111950. "adcs r6, r6, r9\n\t"
  111951. "adc r7, r7, #0\n\t"
  111952. "lsr r8, r10, #16\n\t"
  111953. "lsr r9, r12, #16\n\t"
  111954. "mul r9, r8, r9\n\t"
  111955. "adds r6, r6, r9\n\t"
  111956. "adc r7, r7, #0\n\t"
  111957. "lsl r9, r12, #16\n\t"
  111958. "lsr r9, r9, #16\n\t"
  111959. "mul r8, r9, r8\n\t"
  111960. "lsr r9, r8, #16\n\t"
  111961. "lsl r8, r8, #16\n\t"
  111962. "adds r5, r5, r8\n\t"
  111963. "adcs r6, r6, r9\n\t"
  111964. "adc r7, r7, #0\n\t"
  111965. #else
  111966. "umull r8, r9, r10, r12\n\t"
  111967. "adds r5, r5, r8\n\t"
  111968. "adcs r6, r6, r9\n\t"
  111969. "adc r7, r7, #0\n\t"
  111970. #endif
  111971. /* A[9] * A[13] */
  111972. "ldr r10, [%[a], #52]\n\t"
  111973. "ldr r12, [%[a], #36]\n\t"
  111974. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  111975. "lsl r8, r10, #16\n\t"
  111976. "lsl r9, r12, #16\n\t"
  111977. "lsr r8, r8, #16\n\t"
  111978. "lsr r9, r9, #16\n\t"
  111979. "mul r9, r8, r9\n\t"
  111980. "adds r5, r5, r9\n\t"
  111981. "adcs r6, r6, #0\n\t"
  111982. "adc r7, r7, #0\n\t"
  111983. "lsr r9, r12, #16\n\t"
  111984. "mul r8, r9, r8\n\t"
  111985. "lsr r9, r8, #16\n\t"
  111986. "lsl r8, r8, #16\n\t"
  111987. "adds r5, r5, r8\n\t"
  111988. "adcs r6, r6, r9\n\t"
  111989. "adc r7, r7, #0\n\t"
  111990. "lsr r8, r10, #16\n\t"
  111991. "lsr r9, r12, #16\n\t"
  111992. "mul r9, r8, r9\n\t"
  111993. "adds r6, r6, r9\n\t"
  111994. "adc r7, r7, #0\n\t"
  111995. "lsl r9, r12, #16\n\t"
  111996. "lsr r9, r9, #16\n\t"
  111997. "mul r8, r9, r8\n\t"
  111998. "lsr r9, r8, #16\n\t"
  111999. "lsl r8, r8, #16\n\t"
  112000. "adds r5, r5, r8\n\t"
  112001. "adcs r6, r6, r9\n\t"
  112002. "adc r7, r7, #0\n\t"
  112003. #else
  112004. "umull r8, r9, r10, r12\n\t"
  112005. "adds r5, r5, r8\n\t"
  112006. "adcs r6, r6, r9\n\t"
  112007. "adc r7, r7, #0\n\t"
  112008. #endif
  112009. /* A[10] * A[12] */
  112010. "ldr r10, [%[a], #48]\n\t"
  112011. "ldr r12, [%[a], #40]\n\t"
  112012. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112013. "lsl r8, r10, #16\n\t"
  112014. "lsl r9, r12, #16\n\t"
  112015. "lsr r8, r8, #16\n\t"
  112016. "lsr r9, r9, #16\n\t"
  112017. "mul r9, r8, r9\n\t"
  112018. "adds r5, r5, r9\n\t"
  112019. "adcs r6, r6, #0\n\t"
  112020. "adc r7, r7, #0\n\t"
  112021. "lsr r9, r12, #16\n\t"
  112022. "mul r8, r9, r8\n\t"
  112023. "lsr r9, r8, #16\n\t"
  112024. "lsl r8, r8, #16\n\t"
  112025. "adds r5, r5, r8\n\t"
  112026. "adcs r6, r6, r9\n\t"
  112027. "adc r7, r7, #0\n\t"
  112028. "lsr r8, r10, #16\n\t"
  112029. "lsr r9, r12, #16\n\t"
  112030. "mul r9, r8, r9\n\t"
  112031. "adds r6, r6, r9\n\t"
  112032. "adc r7, r7, #0\n\t"
  112033. "lsl r9, r12, #16\n\t"
  112034. "lsr r9, r9, #16\n\t"
  112035. "mul r8, r9, r8\n\t"
  112036. "lsr r9, r8, #16\n\t"
  112037. "lsl r8, r8, #16\n\t"
  112038. "adds r5, r5, r8\n\t"
  112039. "adcs r6, r6, r9\n\t"
  112040. "adc r7, r7, #0\n\t"
  112041. #else
  112042. "umull r8, r9, r10, r12\n\t"
  112043. "adds r5, r5, r8\n\t"
  112044. "adcs r6, r6, r9\n\t"
  112045. "adc r7, r7, #0\n\t"
  112046. #endif
  112047. /* A[11] * A[11] */
  112048. "ldr r10, [%[a], #44]\n\t"
  112049. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112050. "lsl r8, r10, #16\n\t"
  112051. "lsr r9, r10, #16\n\t"
  112052. "lsr r8, r8, #16\n\t"
  112053. "mov r12, r8\n\t"
  112054. "mul r8, r12, r8\n\t"
  112055. "mov r12, r9\n\t"
  112056. "mul r9, r12, r9\n\t"
  112057. "adds r3, r3, r8\n\t"
  112058. "adcs r4, r4, r9\n\t"
  112059. "adc r2, r2, #0\n\t"
  112060. "lsr r9, r10, #16\n\t"
  112061. "lsl r8, r10, #16\n\t"
  112062. "lsr r8, r8, #16\n\t"
  112063. "mul r8, r9, r8\n\t"
  112064. "lsr r9, r8, #15\n\t"
  112065. "lsl r8, r8, #17\n\t"
  112066. "adds r3, r3, r8\n\t"
  112067. "adcs r4, r4, r9\n\t"
  112068. "adc r2, r2, #0\n\t"
  112069. "adds r5, r5, r5\n\t"
  112070. "adcs r6, r6, r6\n\t"
  112071. "adc r7, r7, r7\n\t"
  112072. #else
  112073. "umull r8, r9, r10, r10\n\t"
  112074. "adds r5, r5, r5\n\t"
  112075. "adcs r6, r6, r6\n\t"
  112076. "adc r7, r7, r7\n\t"
  112077. "adds r3, r3, r8\n\t"
  112078. "adcs r4, r4, r9\n\t"
  112079. "adc r2, r2, #0\n\t"
  112080. #endif
  112081. "adds r3, r3, r5\n\t"
  112082. "adcs r4, r4, r6\n\t"
  112083. "adc r2, r2, r7\n\t"
  112084. "str r3, [%[r], #88]\n\t"
  112085. /* A[7] * A[16] */
  112086. "ldr r10, [%[a], #64]\n\t"
  112087. "ldr r12, [%[a], #28]\n\t"
  112088. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112089. "lsl r8, r10, #16\n\t"
  112090. "lsl r5, r12, #16\n\t"
  112091. "lsr r8, r8, #16\n\t"
  112092. "lsr r5, r5, #16\n\t"
  112093. "mul r5, r8, r5\n\t"
  112094. "lsr r9, r12, #16\n\t"
  112095. "mul r8, r9, r8\n\t"
  112096. "lsr r6, r8, #16\n\t"
  112097. "lsl r8, r8, #16\n\t"
  112098. "adds r5, r5, r8\n\t"
  112099. "adc r6, r6, #0\n\t"
  112100. "lsr r8, r10, #16\n\t"
  112101. "mul r9, r8, r9\n\t"
  112102. "add r6, r6, r9\n\t"
  112103. "lsl r9, r12, #16\n\t"
  112104. "lsr r9, r9, #16\n\t"
  112105. "mul r8, r9, r8\n\t"
  112106. "lsr r9, r8, #16\n\t"
  112107. "lsl r8, r8, #16\n\t"
  112108. "adds r5, r5, r8\n\t"
  112109. "adc r6, r6, r9\n\t"
  112110. #else
  112111. "umull r5, r6, r10, r12\n\t"
  112112. #endif
  112113. "mov r3, #0\n\t"
  112114. "mov r7, #0\n\t"
  112115. /* A[8] * A[15] */
  112116. "ldr r10, [%[a], #60]\n\t"
  112117. "ldr r12, [%[a], #32]\n\t"
  112118. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112119. "lsl r8, r10, #16\n\t"
  112120. "lsl r9, r12, #16\n\t"
  112121. "lsr r8, r8, #16\n\t"
  112122. "lsr r9, r9, #16\n\t"
  112123. "mul r9, r8, r9\n\t"
  112124. "adds r5, r5, r9\n\t"
  112125. "adcs r6, r6, #0\n\t"
  112126. "adc r7, r7, #0\n\t"
  112127. "lsr r9, r12, #16\n\t"
  112128. "mul r8, r9, r8\n\t"
  112129. "lsr r9, r8, #16\n\t"
  112130. "lsl r8, r8, #16\n\t"
  112131. "adds r5, r5, r8\n\t"
  112132. "adcs r6, r6, r9\n\t"
  112133. "adc r7, r7, #0\n\t"
  112134. "lsr r8, r10, #16\n\t"
  112135. "lsr r9, r12, #16\n\t"
  112136. "mul r9, r8, r9\n\t"
  112137. "adds r6, r6, r9\n\t"
  112138. "adc r7, r7, #0\n\t"
  112139. "lsl r9, r12, #16\n\t"
  112140. "lsr r9, r9, #16\n\t"
  112141. "mul r8, r9, r8\n\t"
  112142. "lsr r9, r8, #16\n\t"
  112143. "lsl r8, r8, #16\n\t"
  112144. "adds r5, r5, r8\n\t"
  112145. "adcs r6, r6, r9\n\t"
  112146. "adc r7, r7, #0\n\t"
  112147. #else
  112148. "umull r8, r9, r10, r12\n\t"
  112149. "adds r5, r5, r8\n\t"
  112150. "adcs r6, r6, r9\n\t"
  112151. "adc r7, r7, #0\n\t"
  112152. #endif
  112153. /* A[9] * A[14] */
  112154. "ldr r10, [%[a], #56]\n\t"
  112155. "ldr r12, [%[a], #36]\n\t"
  112156. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112157. "lsl r8, r10, #16\n\t"
  112158. "lsl r9, r12, #16\n\t"
  112159. "lsr r8, r8, #16\n\t"
  112160. "lsr r9, r9, #16\n\t"
  112161. "mul r9, r8, r9\n\t"
  112162. "adds r5, r5, r9\n\t"
  112163. "adcs r6, r6, #0\n\t"
  112164. "adc r7, r7, #0\n\t"
  112165. "lsr r9, r12, #16\n\t"
  112166. "mul r8, r9, r8\n\t"
  112167. "lsr r9, r8, #16\n\t"
  112168. "lsl r8, r8, #16\n\t"
  112169. "adds r5, r5, r8\n\t"
  112170. "adcs r6, r6, r9\n\t"
  112171. "adc r7, r7, #0\n\t"
  112172. "lsr r8, r10, #16\n\t"
  112173. "lsr r9, r12, #16\n\t"
  112174. "mul r9, r8, r9\n\t"
  112175. "adds r6, r6, r9\n\t"
  112176. "adc r7, r7, #0\n\t"
  112177. "lsl r9, r12, #16\n\t"
  112178. "lsr r9, r9, #16\n\t"
  112179. "mul r8, r9, r8\n\t"
  112180. "lsr r9, r8, #16\n\t"
  112181. "lsl r8, r8, #16\n\t"
  112182. "adds r5, r5, r8\n\t"
  112183. "adcs r6, r6, r9\n\t"
  112184. "adc r7, r7, #0\n\t"
  112185. #else
  112186. "umull r8, r9, r10, r12\n\t"
  112187. "adds r5, r5, r8\n\t"
  112188. "adcs r6, r6, r9\n\t"
  112189. "adc r7, r7, #0\n\t"
  112190. #endif
  112191. /* A[10] * A[13] */
  112192. "ldr r10, [%[a], #52]\n\t"
  112193. "ldr r12, [%[a], #40]\n\t"
  112194. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112195. "lsl r8, r10, #16\n\t"
  112196. "lsl r9, r12, #16\n\t"
  112197. "lsr r8, r8, #16\n\t"
  112198. "lsr r9, r9, #16\n\t"
  112199. "mul r9, r8, r9\n\t"
  112200. "adds r5, r5, r9\n\t"
  112201. "adcs r6, r6, #0\n\t"
  112202. "adc r7, r7, #0\n\t"
  112203. "lsr r9, r12, #16\n\t"
  112204. "mul r8, r9, r8\n\t"
  112205. "lsr r9, r8, #16\n\t"
  112206. "lsl r8, r8, #16\n\t"
  112207. "adds r5, r5, r8\n\t"
  112208. "adcs r6, r6, r9\n\t"
  112209. "adc r7, r7, #0\n\t"
  112210. "lsr r8, r10, #16\n\t"
  112211. "lsr r9, r12, #16\n\t"
  112212. "mul r9, r8, r9\n\t"
  112213. "adds r6, r6, r9\n\t"
  112214. "adc r7, r7, #0\n\t"
  112215. "lsl r9, r12, #16\n\t"
  112216. "lsr r9, r9, #16\n\t"
  112217. "mul r8, r9, r8\n\t"
  112218. "lsr r9, r8, #16\n\t"
  112219. "lsl r8, r8, #16\n\t"
  112220. "adds r5, r5, r8\n\t"
  112221. "adcs r6, r6, r9\n\t"
  112222. "adc r7, r7, #0\n\t"
  112223. #else
  112224. "umull r8, r9, r10, r12\n\t"
  112225. "adds r5, r5, r8\n\t"
  112226. "adcs r6, r6, r9\n\t"
  112227. "adc r7, r7, #0\n\t"
  112228. #endif
  112229. /* A[11] * A[12] */
  112230. "ldr r10, [%[a], #48]\n\t"
  112231. "ldr r12, [%[a], #44]\n\t"
  112232. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112233. "lsl r8, r10, #16\n\t"
  112234. "lsl r9, r12, #16\n\t"
  112235. "lsr r8, r8, #16\n\t"
  112236. "lsr r9, r9, #16\n\t"
  112237. "mul r9, r8, r9\n\t"
  112238. "adds r5, r5, r9\n\t"
  112239. "adcs r6, r6, #0\n\t"
  112240. "adc r7, r7, #0\n\t"
  112241. "lsr r9, r12, #16\n\t"
  112242. "mul r8, r9, r8\n\t"
  112243. "lsr r9, r8, #16\n\t"
  112244. "lsl r8, r8, #16\n\t"
  112245. "adds r5, r5, r8\n\t"
  112246. "adcs r6, r6, r9\n\t"
  112247. "adc r7, r7, #0\n\t"
  112248. "lsr r8, r10, #16\n\t"
  112249. "lsr r9, r12, #16\n\t"
  112250. "mul r9, r8, r9\n\t"
  112251. "adds r6, r6, r9\n\t"
  112252. "adc r7, r7, #0\n\t"
  112253. "lsl r9, r12, #16\n\t"
  112254. "lsr r9, r9, #16\n\t"
  112255. "mul r8, r9, r8\n\t"
  112256. "lsr r9, r8, #16\n\t"
  112257. "lsl r8, r8, #16\n\t"
  112258. "adds r5, r5, r8\n\t"
  112259. "adcs r6, r6, r9\n\t"
  112260. "adc r7, r7, #0\n\t"
  112261. #else
  112262. "umull r8, r9, r10, r12\n\t"
  112263. "adds r5, r5, r8\n\t"
  112264. "adcs r6, r6, r9\n\t"
  112265. "adc r7, r7, #0\n\t"
  112266. #endif
  112267. "adds r5, r5, r5\n\t"
  112268. "adcs r6, r6, r6\n\t"
  112269. "adc r7, r7, r7\n\t"
  112270. "adds r4, r4, r5\n\t"
  112271. "adcs r2, r2, r6\n\t"
  112272. "adc r3, r3, r7\n\t"
  112273. "str r4, [%[r], #92]\n\t"
  112274. /* A[8] * A[16] */
  112275. "ldr r10, [%[a], #64]\n\t"
  112276. "ldr r12, [%[a], #32]\n\t"
  112277. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112278. "lsl r8, r10, #16\n\t"
  112279. "lsl r5, r12, #16\n\t"
  112280. "lsr r8, r8, #16\n\t"
  112281. "lsr r5, r5, #16\n\t"
  112282. "mul r5, r8, r5\n\t"
  112283. "lsr r9, r12, #16\n\t"
  112284. "mul r8, r9, r8\n\t"
  112285. "lsr r6, r8, #16\n\t"
  112286. "lsl r8, r8, #16\n\t"
  112287. "adds r5, r5, r8\n\t"
  112288. "adc r6, r6, #0\n\t"
  112289. "lsr r8, r10, #16\n\t"
  112290. "mul r9, r8, r9\n\t"
  112291. "add r6, r6, r9\n\t"
  112292. "lsl r9, r12, #16\n\t"
  112293. "lsr r9, r9, #16\n\t"
  112294. "mul r8, r9, r8\n\t"
  112295. "lsr r9, r8, #16\n\t"
  112296. "lsl r8, r8, #16\n\t"
  112297. "adds r5, r5, r8\n\t"
  112298. "adc r6, r6, r9\n\t"
  112299. #else
  112300. "umull r5, r6, r10, r12\n\t"
  112301. #endif
  112302. "mov r4, #0\n\t"
  112303. "mov r7, #0\n\t"
  112304. /* A[9] * A[15] */
  112305. "ldr r10, [%[a], #60]\n\t"
  112306. "ldr r12, [%[a], #36]\n\t"
  112307. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112308. "lsl r8, r10, #16\n\t"
  112309. "lsl r9, r12, #16\n\t"
  112310. "lsr r8, r8, #16\n\t"
  112311. "lsr r9, r9, #16\n\t"
  112312. "mul r9, r8, r9\n\t"
  112313. "adds r5, r5, r9\n\t"
  112314. "adcs r6, r6, #0\n\t"
  112315. "adc r7, r7, #0\n\t"
  112316. "lsr r9, r12, #16\n\t"
  112317. "mul r8, r9, r8\n\t"
  112318. "lsr r9, r8, #16\n\t"
  112319. "lsl r8, r8, #16\n\t"
  112320. "adds r5, r5, r8\n\t"
  112321. "adcs r6, r6, r9\n\t"
  112322. "adc r7, r7, #0\n\t"
  112323. "lsr r8, r10, #16\n\t"
  112324. "lsr r9, r12, #16\n\t"
  112325. "mul r9, r8, r9\n\t"
  112326. "adds r6, r6, r9\n\t"
  112327. "adc r7, r7, #0\n\t"
  112328. "lsl r9, r12, #16\n\t"
  112329. "lsr r9, r9, #16\n\t"
  112330. "mul r8, r9, r8\n\t"
  112331. "lsr r9, r8, #16\n\t"
  112332. "lsl r8, r8, #16\n\t"
  112333. "adds r5, r5, r8\n\t"
  112334. "adcs r6, r6, r9\n\t"
  112335. "adc r7, r7, #0\n\t"
  112336. #else
  112337. "umull r8, r9, r10, r12\n\t"
  112338. "adds r5, r5, r8\n\t"
  112339. "adcs r6, r6, r9\n\t"
  112340. "adc r7, r7, #0\n\t"
  112341. #endif
  112342. /* A[10] * A[14] */
  112343. "ldr r10, [%[a], #56]\n\t"
  112344. "ldr r12, [%[a], #40]\n\t"
  112345. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112346. "lsl r8, r10, #16\n\t"
  112347. "lsl r9, r12, #16\n\t"
  112348. "lsr r8, r8, #16\n\t"
  112349. "lsr r9, r9, #16\n\t"
  112350. "mul r9, r8, r9\n\t"
  112351. "adds r5, r5, r9\n\t"
  112352. "adcs r6, r6, #0\n\t"
  112353. "adc r7, r7, #0\n\t"
  112354. "lsr r9, r12, #16\n\t"
  112355. "mul r8, r9, r8\n\t"
  112356. "lsr r9, r8, #16\n\t"
  112357. "lsl r8, r8, #16\n\t"
  112358. "adds r5, r5, r8\n\t"
  112359. "adcs r6, r6, r9\n\t"
  112360. "adc r7, r7, #0\n\t"
  112361. "lsr r8, r10, #16\n\t"
  112362. "lsr r9, r12, #16\n\t"
  112363. "mul r9, r8, r9\n\t"
  112364. "adds r6, r6, r9\n\t"
  112365. "adc r7, r7, #0\n\t"
  112366. "lsl r9, r12, #16\n\t"
  112367. "lsr r9, r9, #16\n\t"
  112368. "mul r8, r9, r8\n\t"
  112369. "lsr r9, r8, #16\n\t"
  112370. "lsl r8, r8, #16\n\t"
  112371. "adds r5, r5, r8\n\t"
  112372. "adcs r6, r6, r9\n\t"
  112373. "adc r7, r7, #0\n\t"
  112374. #else
  112375. "umull r8, r9, r10, r12\n\t"
  112376. "adds r5, r5, r8\n\t"
  112377. "adcs r6, r6, r9\n\t"
  112378. "adc r7, r7, #0\n\t"
  112379. #endif
  112380. /* A[11] * A[13] */
  112381. "ldr r10, [%[a], #52]\n\t"
  112382. "ldr r12, [%[a], #44]\n\t"
  112383. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112384. "lsl r8, r10, #16\n\t"
  112385. "lsl r9, r12, #16\n\t"
  112386. "lsr r8, r8, #16\n\t"
  112387. "lsr r9, r9, #16\n\t"
  112388. "mul r9, r8, r9\n\t"
  112389. "adds r5, r5, r9\n\t"
  112390. "adcs r6, r6, #0\n\t"
  112391. "adc r7, r7, #0\n\t"
  112392. "lsr r9, r12, #16\n\t"
  112393. "mul r8, r9, r8\n\t"
  112394. "lsr r9, r8, #16\n\t"
  112395. "lsl r8, r8, #16\n\t"
  112396. "adds r5, r5, r8\n\t"
  112397. "adcs r6, r6, r9\n\t"
  112398. "adc r7, r7, #0\n\t"
  112399. "lsr r8, r10, #16\n\t"
  112400. "lsr r9, r12, #16\n\t"
  112401. "mul r9, r8, r9\n\t"
  112402. "adds r6, r6, r9\n\t"
  112403. "adc r7, r7, #0\n\t"
  112404. "lsl r9, r12, #16\n\t"
  112405. "lsr r9, r9, #16\n\t"
  112406. "mul r8, r9, r8\n\t"
  112407. "lsr r9, r8, #16\n\t"
  112408. "lsl r8, r8, #16\n\t"
  112409. "adds r5, r5, r8\n\t"
  112410. "adcs r6, r6, r9\n\t"
  112411. "adc r7, r7, #0\n\t"
  112412. #else
  112413. "umull r8, r9, r10, r12\n\t"
  112414. "adds r5, r5, r8\n\t"
  112415. "adcs r6, r6, r9\n\t"
  112416. "adc r7, r7, #0\n\t"
  112417. #endif
  112418. /* A[12] * A[12] */
  112419. "ldr r10, [%[a], #48]\n\t"
  112420. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112421. "lsl r8, r10, #16\n\t"
  112422. "lsr r9, r10, #16\n\t"
  112423. "lsr r8, r8, #16\n\t"
  112424. "mov r12, r8\n\t"
  112425. "mul r8, r12, r8\n\t"
  112426. "mov r12, r9\n\t"
  112427. "mul r9, r12, r9\n\t"
  112428. "adds r2, r2, r8\n\t"
  112429. "adcs r3, r3, r9\n\t"
  112430. "adc r4, r4, #0\n\t"
  112431. "lsr r9, r10, #16\n\t"
  112432. "lsl r8, r10, #16\n\t"
  112433. "lsr r8, r8, #16\n\t"
  112434. "mul r8, r9, r8\n\t"
  112435. "lsr r9, r8, #15\n\t"
  112436. "lsl r8, r8, #17\n\t"
  112437. "adds r2, r2, r8\n\t"
  112438. "adcs r3, r3, r9\n\t"
  112439. "adc r4, r4, #0\n\t"
  112440. "adds r5, r5, r5\n\t"
  112441. "adcs r6, r6, r6\n\t"
  112442. "adc r7, r7, r7\n\t"
  112443. #else
  112444. "umull r8, r9, r10, r10\n\t"
  112445. "adds r5, r5, r5\n\t"
  112446. "adcs r6, r6, r6\n\t"
  112447. "adc r7, r7, r7\n\t"
  112448. "adds r2, r2, r8\n\t"
  112449. "adcs r3, r3, r9\n\t"
  112450. "adc r4, r4, #0\n\t"
  112451. #endif
  112452. "adds r2, r2, r5\n\t"
  112453. "adcs r3, r3, r6\n\t"
  112454. "adc r4, r4, r7\n\t"
  112455. "str r2, [%[r], #96]\n\t"
  112456. /* A[9] * A[16] */
  112457. "ldr r10, [%[a], #64]\n\t"
  112458. "ldr r12, [%[a], #36]\n\t"
  112459. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112460. "lsl r8, r10, #16\n\t"
  112461. "lsl r5, r12, #16\n\t"
  112462. "lsr r8, r8, #16\n\t"
  112463. "lsr r5, r5, #16\n\t"
  112464. "mul r5, r8, r5\n\t"
  112465. "lsr r9, r12, #16\n\t"
  112466. "mul r8, r9, r8\n\t"
  112467. "lsr r6, r8, #16\n\t"
  112468. "lsl r8, r8, #16\n\t"
  112469. "adds r5, r5, r8\n\t"
  112470. "adc r6, r6, #0\n\t"
  112471. "lsr r8, r10, #16\n\t"
  112472. "mul r9, r8, r9\n\t"
  112473. "add r6, r6, r9\n\t"
  112474. "lsl r9, r12, #16\n\t"
  112475. "lsr r9, r9, #16\n\t"
  112476. "mul r8, r9, r8\n\t"
  112477. "lsr r9, r8, #16\n\t"
  112478. "lsl r8, r8, #16\n\t"
  112479. "adds r5, r5, r8\n\t"
  112480. "adc r6, r6, r9\n\t"
  112481. #else
  112482. "umull r5, r6, r10, r12\n\t"
  112483. #endif
  112484. "mov r2, #0\n\t"
  112485. "mov r7, #0\n\t"
  112486. /* A[10] * A[15] */
  112487. "ldr r10, [%[a], #60]\n\t"
  112488. "ldr r12, [%[a], #40]\n\t"
  112489. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112490. "lsl r8, r10, #16\n\t"
  112491. "lsl r9, r12, #16\n\t"
  112492. "lsr r8, r8, #16\n\t"
  112493. "lsr r9, r9, #16\n\t"
  112494. "mul r9, r8, r9\n\t"
  112495. "adds r5, r5, r9\n\t"
  112496. "adcs r6, r6, #0\n\t"
  112497. "adc r7, r7, #0\n\t"
  112498. "lsr r9, r12, #16\n\t"
  112499. "mul r8, r9, r8\n\t"
  112500. "lsr r9, r8, #16\n\t"
  112501. "lsl r8, r8, #16\n\t"
  112502. "adds r5, r5, r8\n\t"
  112503. "adcs r6, r6, r9\n\t"
  112504. "adc r7, r7, #0\n\t"
  112505. "lsr r8, r10, #16\n\t"
  112506. "lsr r9, r12, #16\n\t"
  112507. "mul r9, r8, r9\n\t"
  112508. "adds r6, r6, r9\n\t"
  112509. "adc r7, r7, #0\n\t"
  112510. "lsl r9, r12, #16\n\t"
  112511. "lsr r9, r9, #16\n\t"
  112512. "mul r8, r9, r8\n\t"
  112513. "lsr r9, r8, #16\n\t"
  112514. "lsl r8, r8, #16\n\t"
  112515. "adds r5, r5, r8\n\t"
  112516. "adcs r6, r6, r9\n\t"
  112517. "adc r7, r7, #0\n\t"
  112518. #else
  112519. "umull r8, r9, r10, r12\n\t"
  112520. "adds r5, r5, r8\n\t"
  112521. "adcs r6, r6, r9\n\t"
  112522. "adc r7, r7, #0\n\t"
  112523. #endif
  112524. /* A[11] * A[14] */
  112525. "ldr r10, [%[a], #56]\n\t"
  112526. "ldr r12, [%[a], #44]\n\t"
  112527. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112528. "lsl r8, r10, #16\n\t"
  112529. "lsl r9, r12, #16\n\t"
  112530. "lsr r8, r8, #16\n\t"
  112531. "lsr r9, r9, #16\n\t"
  112532. "mul r9, r8, r9\n\t"
  112533. "adds r5, r5, r9\n\t"
  112534. "adcs r6, r6, #0\n\t"
  112535. "adc r7, r7, #0\n\t"
  112536. "lsr r9, r12, #16\n\t"
  112537. "mul r8, r9, r8\n\t"
  112538. "lsr r9, r8, #16\n\t"
  112539. "lsl r8, r8, #16\n\t"
  112540. "adds r5, r5, r8\n\t"
  112541. "adcs r6, r6, r9\n\t"
  112542. "adc r7, r7, #0\n\t"
  112543. "lsr r8, r10, #16\n\t"
  112544. "lsr r9, r12, #16\n\t"
  112545. "mul r9, r8, r9\n\t"
  112546. "adds r6, r6, r9\n\t"
  112547. "adc r7, r7, #0\n\t"
  112548. "lsl r9, r12, #16\n\t"
  112549. "lsr r9, r9, #16\n\t"
  112550. "mul r8, r9, r8\n\t"
  112551. "lsr r9, r8, #16\n\t"
  112552. "lsl r8, r8, #16\n\t"
  112553. "adds r5, r5, r8\n\t"
  112554. "adcs r6, r6, r9\n\t"
  112555. "adc r7, r7, #0\n\t"
  112556. #else
  112557. "umull r8, r9, r10, r12\n\t"
  112558. "adds r5, r5, r8\n\t"
  112559. "adcs r6, r6, r9\n\t"
  112560. "adc r7, r7, #0\n\t"
  112561. #endif
  112562. /* A[12] * A[13] */
  112563. "ldr r10, [%[a], #52]\n\t"
  112564. "ldr r12, [%[a], #48]\n\t"
  112565. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112566. "lsl r8, r10, #16\n\t"
  112567. "lsl r9, r12, #16\n\t"
  112568. "lsr r8, r8, #16\n\t"
  112569. "lsr r9, r9, #16\n\t"
  112570. "mul r9, r8, r9\n\t"
  112571. "adds r5, r5, r9\n\t"
  112572. "adcs r6, r6, #0\n\t"
  112573. "adc r7, r7, #0\n\t"
  112574. "lsr r9, r12, #16\n\t"
  112575. "mul r8, r9, r8\n\t"
  112576. "lsr r9, r8, #16\n\t"
  112577. "lsl r8, r8, #16\n\t"
  112578. "adds r5, r5, r8\n\t"
  112579. "adcs r6, r6, r9\n\t"
  112580. "adc r7, r7, #0\n\t"
  112581. "lsr r8, r10, #16\n\t"
  112582. "lsr r9, r12, #16\n\t"
  112583. "mul r9, r8, r9\n\t"
  112584. "adds r6, r6, r9\n\t"
  112585. "adc r7, r7, #0\n\t"
  112586. "lsl r9, r12, #16\n\t"
  112587. "lsr r9, r9, #16\n\t"
  112588. "mul r8, r9, r8\n\t"
  112589. "lsr r9, r8, #16\n\t"
  112590. "lsl r8, r8, #16\n\t"
  112591. "adds r5, r5, r8\n\t"
  112592. "adcs r6, r6, r9\n\t"
  112593. "adc r7, r7, #0\n\t"
  112594. #else
  112595. "umull r8, r9, r10, r12\n\t"
  112596. "adds r5, r5, r8\n\t"
  112597. "adcs r6, r6, r9\n\t"
  112598. "adc r7, r7, #0\n\t"
  112599. #endif
  112600. "adds r5, r5, r5\n\t"
  112601. "adcs r6, r6, r6\n\t"
  112602. "adc r7, r7, r7\n\t"
  112603. "adds r3, r3, r5\n\t"
  112604. "adcs r4, r4, r6\n\t"
  112605. "adc r2, r2, r7\n\t"
  112606. "str r3, [%[r], #100]\n\t"
  112607. /* A[10] * A[16] */
  112608. "ldr r10, [%[a], #64]\n\t"
  112609. "ldr r12, [%[a], #40]\n\t"
  112610. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112611. "lsl r8, r10, #16\n\t"
  112612. "lsl r5, r12, #16\n\t"
  112613. "lsr r8, r8, #16\n\t"
  112614. "lsr r5, r5, #16\n\t"
  112615. "mul r5, r8, r5\n\t"
  112616. "lsr r9, r12, #16\n\t"
  112617. "mul r8, r9, r8\n\t"
  112618. "lsr r6, r8, #16\n\t"
  112619. "lsl r8, r8, #16\n\t"
  112620. "adds r5, r5, r8\n\t"
  112621. "adc r6, r6, #0\n\t"
  112622. "lsr r8, r10, #16\n\t"
  112623. "mul r9, r8, r9\n\t"
  112624. "add r6, r6, r9\n\t"
  112625. "lsl r9, r12, #16\n\t"
  112626. "lsr r9, r9, #16\n\t"
  112627. "mul r8, r9, r8\n\t"
  112628. "lsr r9, r8, #16\n\t"
  112629. "lsl r8, r8, #16\n\t"
  112630. "adds r5, r5, r8\n\t"
  112631. "adc r6, r6, r9\n\t"
  112632. #else
  112633. "umull r5, r6, r10, r12\n\t"
  112634. #endif
  112635. "mov r3, #0\n\t"
  112636. "mov r7, #0\n\t"
  112637. /* A[11] * A[15] */
  112638. "ldr r10, [%[a], #60]\n\t"
  112639. "ldr r12, [%[a], #44]\n\t"
  112640. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112641. "lsl r8, r10, #16\n\t"
  112642. "lsl r9, r12, #16\n\t"
  112643. "lsr r8, r8, #16\n\t"
  112644. "lsr r9, r9, #16\n\t"
  112645. "mul r9, r8, r9\n\t"
  112646. "adds r5, r5, r9\n\t"
  112647. "adcs r6, r6, #0\n\t"
  112648. "adc r7, r7, #0\n\t"
  112649. "lsr r9, r12, #16\n\t"
  112650. "mul r8, r9, r8\n\t"
  112651. "lsr r9, r8, #16\n\t"
  112652. "lsl r8, r8, #16\n\t"
  112653. "adds r5, r5, r8\n\t"
  112654. "adcs r6, r6, r9\n\t"
  112655. "adc r7, r7, #0\n\t"
  112656. "lsr r8, r10, #16\n\t"
  112657. "lsr r9, r12, #16\n\t"
  112658. "mul r9, r8, r9\n\t"
  112659. "adds r6, r6, r9\n\t"
  112660. "adc r7, r7, #0\n\t"
  112661. "lsl r9, r12, #16\n\t"
  112662. "lsr r9, r9, #16\n\t"
  112663. "mul r8, r9, r8\n\t"
  112664. "lsr r9, r8, #16\n\t"
  112665. "lsl r8, r8, #16\n\t"
  112666. "adds r5, r5, r8\n\t"
  112667. "adcs r6, r6, r9\n\t"
  112668. "adc r7, r7, #0\n\t"
  112669. #else
  112670. "umull r8, r9, r10, r12\n\t"
  112671. "adds r5, r5, r8\n\t"
  112672. "adcs r6, r6, r9\n\t"
  112673. "adc r7, r7, #0\n\t"
  112674. #endif
  112675. /* A[12] * A[14] */
  112676. "ldr r10, [%[a], #56]\n\t"
  112677. "ldr r12, [%[a], #48]\n\t"
  112678. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112679. "lsl r8, r10, #16\n\t"
  112680. "lsl r9, r12, #16\n\t"
  112681. "lsr r8, r8, #16\n\t"
  112682. "lsr r9, r9, #16\n\t"
  112683. "mul r9, r8, r9\n\t"
  112684. "adds r5, r5, r9\n\t"
  112685. "adcs r6, r6, #0\n\t"
  112686. "adc r7, r7, #0\n\t"
  112687. "lsr r9, r12, #16\n\t"
  112688. "mul r8, r9, r8\n\t"
  112689. "lsr r9, r8, #16\n\t"
  112690. "lsl r8, r8, #16\n\t"
  112691. "adds r5, r5, r8\n\t"
  112692. "adcs r6, r6, r9\n\t"
  112693. "adc r7, r7, #0\n\t"
  112694. "lsr r8, r10, #16\n\t"
  112695. "lsr r9, r12, #16\n\t"
  112696. "mul r9, r8, r9\n\t"
  112697. "adds r6, r6, r9\n\t"
  112698. "adc r7, r7, #0\n\t"
  112699. "lsl r9, r12, #16\n\t"
  112700. "lsr r9, r9, #16\n\t"
  112701. "mul r8, r9, r8\n\t"
  112702. "lsr r9, r8, #16\n\t"
  112703. "lsl r8, r8, #16\n\t"
  112704. "adds r5, r5, r8\n\t"
  112705. "adcs r6, r6, r9\n\t"
  112706. "adc r7, r7, #0\n\t"
  112707. #else
  112708. "umull r8, r9, r10, r12\n\t"
  112709. "adds r5, r5, r8\n\t"
  112710. "adcs r6, r6, r9\n\t"
  112711. "adc r7, r7, #0\n\t"
  112712. #endif
  112713. /* A[13] * A[13] */
  112714. "ldr r10, [%[a], #52]\n\t"
  112715. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112716. "lsl r8, r10, #16\n\t"
  112717. "lsr r9, r10, #16\n\t"
  112718. "lsr r8, r8, #16\n\t"
  112719. "mov r12, r8\n\t"
  112720. "mul r8, r12, r8\n\t"
  112721. "mov r12, r9\n\t"
  112722. "mul r9, r12, r9\n\t"
  112723. "adds r4, r4, r8\n\t"
  112724. "adcs r2, r2, r9\n\t"
  112725. "adc r3, r3, #0\n\t"
  112726. "lsr r9, r10, #16\n\t"
  112727. "lsl r8, r10, #16\n\t"
  112728. "lsr r8, r8, #16\n\t"
  112729. "mul r8, r9, r8\n\t"
  112730. "lsr r9, r8, #15\n\t"
  112731. "lsl r8, r8, #17\n\t"
  112732. "adds r4, r4, r8\n\t"
  112733. "adcs r2, r2, r9\n\t"
  112734. "adc r3, r3, #0\n\t"
  112735. "adds r5, r5, r5\n\t"
  112736. "adcs r6, r6, r6\n\t"
  112737. "adc r7, r7, r7\n\t"
  112738. #else
  112739. "umull r8, r9, r10, r10\n\t"
  112740. "adds r5, r5, r5\n\t"
  112741. "adcs r6, r6, r6\n\t"
  112742. "adc r7, r7, r7\n\t"
  112743. "adds r4, r4, r8\n\t"
  112744. "adcs r2, r2, r9\n\t"
  112745. "adc r3, r3, #0\n\t"
  112746. #endif
  112747. "adds r4, r4, r5\n\t"
  112748. "adcs r2, r2, r6\n\t"
  112749. "adc r3, r3, r7\n\t"
  112750. "str r4, [%[r], #104]\n\t"
  112751. /* A[11] * A[16] */
  112752. "ldr r10, [%[a], #64]\n\t"
  112753. "ldr r12, [%[a], #44]\n\t"
  112754. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112755. "lsl r8, r10, #16\n\t"
  112756. "lsl r5, r12, #16\n\t"
  112757. "lsr r8, r8, #16\n\t"
  112758. "lsr r5, r5, #16\n\t"
  112759. "mul r5, r8, r5\n\t"
  112760. "lsr r9, r12, #16\n\t"
  112761. "mul r8, r9, r8\n\t"
  112762. "lsr r6, r8, #16\n\t"
  112763. "lsl r8, r8, #16\n\t"
  112764. "adds r5, r5, r8\n\t"
  112765. "adc r6, r6, #0\n\t"
  112766. "lsr r8, r10, #16\n\t"
  112767. "mul r9, r8, r9\n\t"
  112768. "add r6, r6, r9\n\t"
  112769. "lsl r9, r12, #16\n\t"
  112770. "lsr r9, r9, #16\n\t"
  112771. "mul r8, r9, r8\n\t"
  112772. "lsr r9, r8, #16\n\t"
  112773. "lsl r8, r8, #16\n\t"
  112774. "adds r5, r5, r8\n\t"
  112775. "adc r6, r6, r9\n\t"
  112776. #else
  112777. "umull r5, r6, r10, r12\n\t"
  112778. #endif
  112779. "mov r4, #0\n\t"
  112780. "mov r7, #0\n\t"
  112781. /* A[12] * A[15] */
  112782. "ldr r10, [%[a], #60]\n\t"
  112783. "ldr r12, [%[a], #48]\n\t"
  112784. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112785. "lsl r8, r10, #16\n\t"
  112786. "lsl r9, r12, #16\n\t"
  112787. "lsr r8, r8, #16\n\t"
  112788. "lsr r9, r9, #16\n\t"
  112789. "mul r9, r8, r9\n\t"
  112790. "adds r5, r5, r9\n\t"
  112791. "adcs r6, r6, #0\n\t"
  112792. "adc r7, r7, #0\n\t"
  112793. "lsr r9, r12, #16\n\t"
  112794. "mul r8, r9, r8\n\t"
  112795. "lsr r9, r8, #16\n\t"
  112796. "lsl r8, r8, #16\n\t"
  112797. "adds r5, r5, r8\n\t"
  112798. "adcs r6, r6, r9\n\t"
  112799. "adc r7, r7, #0\n\t"
  112800. "lsr r8, r10, #16\n\t"
  112801. "lsr r9, r12, #16\n\t"
  112802. "mul r9, r8, r9\n\t"
  112803. "adds r6, r6, r9\n\t"
  112804. "adc r7, r7, #0\n\t"
  112805. "lsl r9, r12, #16\n\t"
  112806. "lsr r9, r9, #16\n\t"
  112807. "mul r8, r9, r8\n\t"
  112808. "lsr r9, r8, #16\n\t"
  112809. "lsl r8, r8, #16\n\t"
  112810. "adds r5, r5, r8\n\t"
  112811. "adcs r6, r6, r9\n\t"
  112812. "adc r7, r7, #0\n\t"
  112813. #else
  112814. "umull r8, r9, r10, r12\n\t"
  112815. "adds r5, r5, r8\n\t"
  112816. "adcs r6, r6, r9\n\t"
  112817. "adc r7, r7, #0\n\t"
  112818. #endif
  112819. /* A[13] * A[14] */
  112820. "ldr r10, [%[a], #56]\n\t"
  112821. "ldr r12, [%[a], #52]\n\t"
  112822. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112823. "lsl r8, r10, #16\n\t"
  112824. "lsl r9, r12, #16\n\t"
  112825. "lsr r8, r8, #16\n\t"
  112826. "lsr r9, r9, #16\n\t"
  112827. "mul r9, r8, r9\n\t"
  112828. "adds r5, r5, r9\n\t"
  112829. "adcs r6, r6, #0\n\t"
  112830. "adc r7, r7, #0\n\t"
  112831. "lsr r9, r12, #16\n\t"
  112832. "mul r8, r9, r8\n\t"
  112833. "lsr r9, r8, #16\n\t"
  112834. "lsl r8, r8, #16\n\t"
  112835. "adds r5, r5, r8\n\t"
  112836. "adcs r6, r6, r9\n\t"
  112837. "adc r7, r7, #0\n\t"
  112838. "lsr r8, r10, #16\n\t"
  112839. "lsr r9, r12, #16\n\t"
  112840. "mul r9, r8, r9\n\t"
  112841. "adds r6, r6, r9\n\t"
  112842. "adc r7, r7, #0\n\t"
  112843. "lsl r9, r12, #16\n\t"
  112844. "lsr r9, r9, #16\n\t"
  112845. "mul r8, r9, r8\n\t"
  112846. "lsr r9, r8, #16\n\t"
  112847. "lsl r8, r8, #16\n\t"
  112848. "adds r5, r5, r8\n\t"
  112849. "adcs r6, r6, r9\n\t"
  112850. "adc r7, r7, #0\n\t"
  112851. #else
  112852. "umull r8, r9, r10, r12\n\t"
  112853. "adds r5, r5, r8\n\t"
  112854. "adcs r6, r6, r9\n\t"
  112855. "adc r7, r7, #0\n\t"
  112856. #endif
  112857. "adds r5, r5, r5\n\t"
  112858. "adcs r6, r6, r6\n\t"
  112859. "adc r7, r7, r7\n\t"
  112860. "adds r2, r2, r5\n\t"
  112861. "adcs r3, r3, r6\n\t"
  112862. "adc r4, r4, r7\n\t"
  112863. "str r2, [%[r], #108]\n\t"
  112864. /* A[12] * A[16] */
  112865. "ldr r10, [%[a], #64]\n\t"
  112866. "ldr r12, [%[a], #48]\n\t"
  112867. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112868. "lsl r8, r10, #16\n\t"
  112869. "lsl r9, r12, #16\n\t"
  112870. "lsr r8, r8, #16\n\t"
  112871. "lsr r9, r9, #16\n\t"
  112872. "mul r9, r8, r9\n\t"
  112873. "adds r3, r3, r9\n\t"
  112874. "adcs r4, r4, #0\n\t"
  112875. "mov r2, #0\n\t"
  112876. "adc r2, r2, #0\n\t"
  112877. "adds r3, r3, r9\n\t"
  112878. "adcs r4, r4, #0\n\t"
  112879. "adc r2, r2, #0\n\t"
  112880. "lsr r9, r12, #16\n\t"
  112881. "mul r8, r9, r8\n\t"
  112882. "lsr r9, r8, #16\n\t"
  112883. "lsl r8, r8, #16\n\t"
  112884. "adds r3, r3, r8\n\t"
  112885. "adcs r4, r4, r9\n\t"
  112886. "adc r2, r2, #0\n\t"
  112887. "adds r3, r3, r8\n\t"
  112888. "adcs r4, r4, r9\n\t"
  112889. "adc r2, r2, #0\n\t"
  112890. "lsr r8, r10, #16\n\t"
  112891. "lsr r9, r12, #16\n\t"
  112892. "mul r9, r8, r9\n\t"
  112893. "adds r4, r4, r9\n\t"
  112894. "adc r2, r2, #0\n\t"
  112895. "adds r4, r4, r9\n\t"
  112896. "adc r2, r2, #0\n\t"
  112897. "lsl r9, r12, #16\n\t"
  112898. "lsr r9, r9, #16\n\t"
  112899. "mul r8, r9, r8\n\t"
  112900. "lsr r9, r8, #16\n\t"
  112901. "lsl r8, r8, #16\n\t"
  112902. "adds r3, r3, r8\n\t"
  112903. "adcs r4, r4, r9\n\t"
  112904. "adc r2, r2, #0\n\t"
  112905. "adds r3, r3, r8\n\t"
  112906. "adcs r4, r4, r9\n\t"
  112907. "adc r2, r2, #0\n\t"
  112908. #else
  112909. "umull r8, r9, r10, r12\n\t"
  112910. "adds r3, r3, r8\n\t"
  112911. "adcs r4, r4, r9\n\t"
  112912. "mov r2, #0\n\t"
  112913. "adc r2, r2, #0\n\t"
  112914. "adds r3, r3, r8\n\t"
  112915. "adcs r4, r4, r9\n\t"
  112916. "mov r2, #0\n\t"
  112917. "adc r2, r2, #0\n\t"
  112918. #endif
  112919. /* A[13] * A[15] */
  112920. "ldr r10, [%[a], #60]\n\t"
  112921. "ldr r12, [%[a], #52]\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. "adc r2, r2, #0\n\t"
  112931. "adds r3, r3, r9\n\t"
  112932. "adcs r4, r4, #0\n\t"
  112933. "adc r2, r2, #0\n\t"
  112934. "lsr r9, r12, #16\n\t"
  112935. "mul r8, r9, r8\n\t"
  112936. "lsr r9, r8, #16\n\t"
  112937. "lsl r8, r8, #16\n\t"
  112938. "adds r3, r3, r8\n\t"
  112939. "adcs r4, r4, r9\n\t"
  112940. "adc r2, r2, #0\n\t"
  112941. "adds r3, r3, r8\n\t"
  112942. "adcs r4, r4, r9\n\t"
  112943. "adc r2, r2, #0\n\t"
  112944. "lsr r8, r10, #16\n\t"
  112945. "lsr r9, r12, #16\n\t"
  112946. "mul r9, r8, r9\n\t"
  112947. "adds r4, r4, r9\n\t"
  112948. "adc r2, r2, #0\n\t"
  112949. "adds r4, r4, r9\n\t"
  112950. "adc r2, r2, #0\n\t"
  112951. "lsl r9, r12, #16\n\t"
  112952. "lsr r9, r9, #16\n\t"
  112953. "mul r8, r9, r8\n\t"
  112954. "lsr r9, r8, #16\n\t"
  112955. "lsl r8, r8, #16\n\t"
  112956. "adds r3, r3, r8\n\t"
  112957. "adcs r4, r4, r9\n\t"
  112958. "adc r2, r2, #0\n\t"
  112959. "adds r3, r3, r8\n\t"
  112960. "adcs r4, r4, r9\n\t"
  112961. "adc r2, r2, #0\n\t"
  112962. #else
  112963. "umull r8, r9, r10, r12\n\t"
  112964. "adds r3, r3, r8\n\t"
  112965. "adcs r4, r4, r9\n\t"
  112966. "adc r2, r2, #0\n\t"
  112967. "adds r3, r3, r8\n\t"
  112968. "adcs r4, r4, r9\n\t"
  112969. "adc r2, r2, #0\n\t"
  112970. #endif
  112971. /* A[14] * A[14] */
  112972. "ldr r10, [%[a], #56]\n\t"
  112973. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  112974. "lsl r8, r10, #16\n\t"
  112975. "lsr r9, r10, #16\n\t"
  112976. "lsr r8, r8, #16\n\t"
  112977. "mov r12, r8\n\t"
  112978. "mul r8, r12, r8\n\t"
  112979. "mov r12, r9\n\t"
  112980. "mul r9, r12, r9\n\t"
  112981. "adds r3, r3, r8\n\t"
  112982. "adcs r4, r4, r9\n\t"
  112983. "adc r2, r2, #0\n\t"
  112984. "lsr r9, r10, #16\n\t"
  112985. "lsl r8, r10, #16\n\t"
  112986. "lsr r8, r8, #16\n\t"
  112987. "mul r8, r9, r8\n\t"
  112988. "lsr r9, r8, #15\n\t"
  112989. "lsl r8, r8, #17\n\t"
  112990. "adds r3, r3, r8\n\t"
  112991. "adcs r4, r4, r9\n\t"
  112992. "adc r2, r2, #0\n\t"
  112993. #else
  112994. "umull r8, r9, r10, r10\n\t"
  112995. "adds r3, r3, r8\n\t"
  112996. "adcs r4, r4, r9\n\t"
  112997. "adc r2, r2, #0\n\t"
  112998. #endif
  112999. "str r3, [%[r], #112]\n\t"
  113000. /* A[13] * A[16] */
  113001. "ldr r10, [%[a], #64]\n\t"
  113002. "ldr r12, [%[a], #52]\n\t"
  113003. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113004. "lsl r8, r10, #16\n\t"
  113005. "lsl r9, r12, #16\n\t"
  113006. "lsr r8, r8, #16\n\t"
  113007. "lsr r9, r9, #16\n\t"
  113008. "mul r9, r8, r9\n\t"
  113009. "adds r4, r4, r9\n\t"
  113010. "adcs r2, r2, #0\n\t"
  113011. "mov r3, #0\n\t"
  113012. "adc r3, r3, #0\n\t"
  113013. "adds r4, r4, r9\n\t"
  113014. "adcs r2, r2, #0\n\t"
  113015. "adc r3, r3, #0\n\t"
  113016. "lsr r9, r12, #16\n\t"
  113017. "mul r8, r9, r8\n\t"
  113018. "lsr r9, r8, #16\n\t"
  113019. "lsl r8, r8, #16\n\t"
  113020. "adds r4, r4, r8\n\t"
  113021. "adcs r2, r2, r9\n\t"
  113022. "adc r3, r3, #0\n\t"
  113023. "adds r4, r4, r8\n\t"
  113024. "adcs r2, r2, r9\n\t"
  113025. "adc r3, r3, #0\n\t"
  113026. "lsr r8, r10, #16\n\t"
  113027. "lsr r9, r12, #16\n\t"
  113028. "mul r9, r8, r9\n\t"
  113029. "adds r2, r2, r9\n\t"
  113030. "adc r3, r3, #0\n\t"
  113031. "adds r2, r2, r9\n\t"
  113032. "adc r3, r3, #0\n\t"
  113033. "lsl r9, r12, #16\n\t"
  113034. "lsr r9, r9, #16\n\t"
  113035. "mul r8, r9, r8\n\t"
  113036. "lsr r9, r8, #16\n\t"
  113037. "lsl r8, r8, #16\n\t"
  113038. "adds r4, r4, r8\n\t"
  113039. "adcs r2, r2, r9\n\t"
  113040. "adc r3, r3, #0\n\t"
  113041. "adds r4, r4, r8\n\t"
  113042. "adcs r2, r2, r9\n\t"
  113043. "adc r3, r3, #0\n\t"
  113044. #else
  113045. "umull r8, r9, r10, r12\n\t"
  113046. "adds r4, r4, r8\n\t"
  113047. "adcs r2, r2, r9\n\t"
  113048. "mov r3, #0\n\t"
  113049. "adc r3, r3, #0\n\t"
  113050. "adds r4, r4, r8\n\t"
  113051. "adcs r2, r2, r9\n\t"
  113052. "mov r3, #0\n\t"
  113053. "adc r3, r3, #0\n\t"
  113054. #endif
  113055. /* A[14] * A[15] */
  113056. "ldr r10, [%[a], #60]\n\t"
  113057. "ldr r12, [%[a], #56]\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. "adc r3, r3, #0\n\t"
  113067. "adds r4, r4, r9\n\t"
  113068. "adcs r2, r2, #0\n\t"
  113069. "adc r3, r3, #0\n\t"
  113070. "lsr r9, r12, #16\n\t"
  113071. "mul r8, r9, r8\n\t"
  113072. "lsr r9, r8, #16\n\t"
  113073. "lsl r8, r8, #16\n\t"
  113074. "adds r4, r4, r8\n\t"
  113075. "adcs r2, r2, r9\n\t"
  113076. "adc r3, r3, #0\n\t"
  113077. "adds r4, r4, r8\n\t"
  113078. "adcs r2, r2, r9\n\t"
  113079. "adc r3, r3, #0\n\t"
  113080. "lsr r8, r10, #16\n\t"
  113081. "lsr r9, r12, #16\n\t"
  113082. "mul r9, r8, r9\n\t"
  113083. "adds r2, r2, r9\n\t"
  113084. "adc r3, r3, #0\n\t"
  113085. "adds r2, r2, r9\n\t"
  113086. "adc r3, r3, #0\n\t"
  113087. "lsl r9, r12, #16\n\t"
  113088. "lsr r9, r9, #16\n\t"
  113089. "mul r8, r9, r8\n\t"
  113090. "lsr r9, r8, #16\n\t"
  113091. "lsl r8, r8, #16\n\t"
  113092. "adds r4, r4, r8\n\t"
  113093. "adcs r2, r2, r9\n\t"
  113094. "adc r3, r3, #0\n\t"
  113095. "adds r4, r4, r8\n\t"
  113096. "adcs r2, r2, r9\n\t"
  113097. "adc r3, r3, #0\n\t"
  113098. #else
  113099. "umull r8, r9, r10, r12\n\t"
  113100. "adds r4, r4, r8\n\t"
  113101. "adcs r2, r2, r9\n\t"
  113102. "adc r3, r3, #0\n\t"
  113103. "adds r4, r4, r8\n\t"
  113104. "adcs r2, r2, r9\n\t"
  113105. "adc r3, r3, #0\n\t"
  113106. #endif
  113107. "str r4, [%[r], #116]\n\t"
  113108. /* A[14] * A[16] */
  113109. "ldr r10, [%[a], #64]\n\t"
  113110. "ldr r12, [%[a], #56]\n\t"
  113111. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113112. "lsl r8, r10, #16\n\t"
  113113. "lsl r9, r12, #16\n\t"
  113114. "lsr r8, r8, #16\n\t"
  113115. "lsr r9, r9, #16\n\t"
  113116. "mul r9, r8, r9\n\t"
  113117. "adds r2, r2, r9\n\t"
  113118. "adcs r3, r3, #0\n\t"
  113119. "mov r4, #0\n\t"
  113120. "adc r4, r4, #0\n\t"
  113121. "adds r2, r2, r9\n\t"
  113122. "adcs r3, r3, #0\n\t"
  113123. "adc r4, r4, #0\n\t"
  113124. "lsr r9, r12, #16\n\t"
  113125. "mul r8, r9, r8\n\t"
  113126. "lsr r9, r8, #16\n\t"
  113127. "lsl r8, r8, #16\n\t"
  113128. "adds r2, r2, r8\n\t"
  113129. "adcs r3, r3, r9\n\t"
  113130. "adc r4, r4, #0\n\t"
  113131. "adds r2, r2, r8\n\t"
  113132. "adcs r3, r3, r9\n\t"
  113133. "adc r4, r4, #0\n\t"
  113134. "lsr r8, r10, #16\n\t"
  113135. "lsr r9, r12, #16\n\t"
  113136. "mul r9, r8, r9\n\t"
  113137. "adds r3, r3, r9\n\t"
  113138. "adc r4, r4, #0\n\t"
  113139. "adds r3, r3, r9\n\t"
  113140. "adc r4, r4, #0\n\t"
  113141. "lsl r9, r12, #16\n\t"
  113142. "lsr r9, r9, #16\n\t"
  113143. "mul r8, r9, r8\n\t"
  113144. "lsr r9, r8, #16\n\t"
  113145. "lsl r8, r8, #16\n\t"
  113146. "adds r2, r2, r8\n\t"
  113147. "adcs r3, r3, r9\n\t"
  113148. "adc r4, r4, #0\n\t"
  113149. "adds r2, r2, r8\n\t"
  113150. "adcs r3, r3, r9\n\t"
  113151. "adc r4, r4, #0\n\t"
  113152. #else
  113153. "umull r8, r9, r10, r12\n\t"
  113154. "adds r2, r2, r8\n\t"
  113155. "adcs r3, r3, r9\n\t"
  113156. "mov r4, #0\n\t"
  113157. "adc r4, r4, #0\n\t"
  113158. "adds r2, r2, r8\n\t"
  113159. "adcs r3, r3, r9\n\t"
  113160. "mov r4, #0\n\t"
  113161. "adc r4, r4, #0\n\t"
  113162. #endif
  113163. /* A[15] * A[15] */
  113164. "ldr r10, [%[a], #60]\n\t"
  113165. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113166. "lsl r8, r10, #16\n\t"
  113167. "lsr r9, r10, #16\n\t"
  113168. "lsr r8, r8, #16\n\t"
  113169. "mov r12, r8\n\t"
  113170. "mul r8, r12, r8\n\t"
  113171. "mov r12, r9\n\t"
  113172. "mul r9, r12, r9\n\t"
  113173. "adds r2, r2, r8\n\t"
  113174. "adcs r3, r3, r9\n\t"
  113175. "adc r4, r4, #0\n\t"
  113176. "lsr r9, r10, #16\n\t"
  113177. "lsl r8, r10, #16\n\t"
  113178. "lsr r8, r8, #16\n\t"
  113179. "mul r8, r9, r8\n\t"
  113180. "lsr r9, r8, #15\n\t"
  113181. "lsl r8, r8, #17\n\t"
  113182. "adds r2, r2, r8\n\t"
  113183. "adcs r3, r3, r9\n\t"
  113184. "adc r4, r4, #0\n\t"
  113185. #else
  113186. "umull r8, r9, r10, r10\n\t"
  113187. "adds r2, r2, r8\n\t"
  113188. "adcs r3, r3, r9\n\t"
  113189. "adc r4, r4, #0\n\t"
  113190. #endif
  113191. "str r2, [%[r], #120]\n\t"
  113192. /* A[15] * A[16] */
  113193. "ldr r10, [%[a], #64]\n\t"
  113194. "ldr r12, [%[a], #60]\n\t"
  113195. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113196. "lsl r8, r10, #16\n\t"
  113197. "lsl r9, r12, #16\n\t"
  113198. "lsr r8, r8, #16\n\t"
  113199. "lsr r9, r9, #16\n\t"
  113200. "mul r9, r8, r9\n\t"
  113201. "adds r3, r3, r9\n\t"
  113202. "adcs r4, r4, #0\n\t"
  113203. "mov r2, #0\n\t"
  113204. "adc r2, r2, #0\n\t"
  113205. "adds r3, r3, r9\n\t"
  113206. "adcs r4, r4, #0\n\t"
  113207. "adc r2, r2, #0\n\t"
  113208. "lsr r9, r12, #16\n\t"
  113209. "mul r8, r9, r8\n\t"
  113210. "lsr r9, r8, #16\n\t"
  113211. "lsl r8, r8, #16\n\t"
  113212. "adds r3, r3, r8\n\t"
  113213. "adcs r4, r4, r9\n\t"
  113214. "adc r2, r2, #0\n\t"
  113215. "adds r3, r3, r8\n\t"
  113216. "adcs r4, r4, r9\n\t"
  113217. "adc r2, r2, #0\n\t"
  113218. "lsr r8, r10, #16\n\t"
  113219. "lsr r9, r12, #16\n\t"
  113220. "mul r9, r8, r9\n\t"
  113221. "adds r4, r4, r9\n\t"
  113222. "adc r2, r2, #0\n\t"
  113223. "adds r4, r4, r9\n\t"
  113224. "adc r2, r2, #0\n\t"
  113225. "lsl r9, r12, #16\n\t"
  113226. "lsr r9, r9, #16\n\t"
  113227. "mul r8, r9, r8\n\t"
  113228. "lsr r9, r8, #16\n\t"
  113229. "lsl r8, r8, #16\n\t"
  113230. "adds r3, r3, r8\n\t"
  113231. "adcs r4, r4, r9\n\t"
  113232. "adc r2, r2, #0\n\t"
  113233. "adds r3, r3, r8\n\t"
  113234. "adcs r4, r4, r9\n\t"
  113235. "adc r2, r2, #0\n\t"
  113236. #else
  113237. "umull r8, r9, r10, r12\n\t"
  113238. "adds r3, r3, r8\n\t"
  113239. "adcs r4, r4, r9\n\t"
  113240. "mov r2, #0\n\t"
  113241. "adc r2, r2, #0\n\t"
  113242. "adds r3, r3, r8\n\t"
  113243. "adcs r4, r4, r9\n\t"
  113244. "mov r2, #0\n\t"
  113245. "adc r2, r2, #0\n\t"
  113246. #endif
  113247. "str r3, [%[r], #124]\n\t"
  113248. /* A[16] * A[16] */
  113249. "ldr r10, [%[a], #64]\n\t"
  113250. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113251. "lsl r8, r10, #16\n\t"
  113252. "lsr r9, r10, #16\n\t"
  113253. "lsr r8, r8, #16\n\t"
  113254. "mov r12, r8\n\t"
  113255. "mul r8, r12, r8\n\t"
  113256. "mov r12, r9\n\t"
  113257. "mul r9, r12, r9\n\t"
  113258. "adds r4, r4, r8\n\t"
  113259. "adc r2, r2, r9\n\t"
  113260. "lsr r9, r10, #16\n\t"
  113261. "lsl r8, r10, #16\n\t"
  113262. "lsr r8, r8, #16\n\t"
  113263. "mul r8, r9, r8\n\t"
  113264. "lsr r9, r8, #15\n\t"
  113265. "lsl r8, r8, #17\n\t"
  113266. "adds r4, r4, r8\n\t"
  113267. "adc r2, r2, r9\n\t"
  113268. #else
  113269. "umull r8, r9, r10, r10\n\t"
  113270. "adds r4, r4, r8\n\t"
  113271. "adc r2, r2, r9\n\t"
  113272. #endif
  113273. "str r4, [%[r], #128]\n\t"
  113274. "str r2, [%[r], #132]\n\t"
  113275. "ldm sp!, {r2, r3, r4, r8}\n\t"
  113276. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  113277. "ldm sp!, {r2, r3, r4, r8}\n\t"
  113278. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  113279. "ldm sp!, {r2, r3, r4, r8}\n\t"
  113280. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  113281. "ldm sp!, {r2, r3, r4, r8}\n\t"
  113282. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  113283. "ldm sp!, {r2}\n\t"
  113284. "stm %[r]!, {r2}\n\t"
  113285. : [r] "+r" (r), [a] "+r" (a)
  113286. :
  113287. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  113288. );
  113289. }
  113290. #endif /* WOLFSSL_SP_SMALL */
  113291. #ifdef WOLFSSL_SP_SMALL
  113292. /* Add b to a into r. (r = a + b)
  113293. *
  113294. * r A single precision integer.
  113295. * a A single precision integer.
  113296. * b A single precision integer.
  113297. */
  113298. static sp_digit sp_521_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  113299. {
  113300. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  113301. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  113302. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  113303. __asm__ __volatile__ (
  113304. "mov r3, #0\n\t"
  113305. "add r12, %[a], #0x40\n\t"
  113306. "\n"
  113307. "L_sp_521_add_17_word_%=: \n\t"
  113308. "adds r3, r3, #-1\n\t"
  113309. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  113310. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  113311. "adcs r4, r4, r8\n\t"
  113312. "adcs r5, r5, r9\n\t"
  113313. "adcs r6, r6, r10\n\t"
  113314. "adcs r7, r7, r11\n\t"
  113315. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  113316. "mov r4, #0\n\t"
  113317. "adc r3, r4, #0\n\t"
  113318. "cmp %[a], r12\n\t"
  113319. "bne L_sp_521_add_17_word_%=\n\t"
  113320. "adds r3, r3, #-1\n\t"
  113321. "ldm %[a], {r4}\n\t"
  113322. "ldm %[b], {r8}\n\t"
  113323. "adcs r4, r4, r8\n\t"
  113324. "stm %[r]!, {r4}\n\t"
  113325. "mov r4, #0\n\t"
  113326. "adc %[r], r4, #0\n\t"
  113327. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  113328. :
  113329. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  113330. );
  113331. return (uint32_t)(size_t)r;
  113332. }
  113333. #else
  113334. /* Add b to a into r. (r = a + b)
  113335. *
  113336. * r A single precision integer.
  113337. * a A single precision integer.
  113338. * b A single precision integer.
  113339. */
  113340. static sp_digit sp_521_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  113341. {
  113342. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  113343. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  113344. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  113345. __asm__ __volatile__ (
  113346. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  113347. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  113348. "adds r3, r3, r7\n\t"
  113349. "adcs r4, r4, r8\n\t"
  113350. "adcs r5, r5, r9\n\t"
  113351. "adcs r6, r6, r10\n\t"
  113352. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  113353. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  113354. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  113355. "adcs r3, r3, r7\n\t"
  113356. "adcs r4, r4, r8\n\t"
  113357. "adcs r5, r5, r9\n\t"
  113358. "adcs r6, r6, r10\n\t"
  113359. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  113360. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  113361. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  113362. "adcs r3, r3, r7\n\t"
  113363. "adcs r4, r4, r8\n\t"
  113364. "adcs r5, r5, r9\n\t"
  113365. "adcs r6, r6, r10\n\t"
  113366. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  113367. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  113368. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  113369. "adcs r3, r3, r7\n\t"
  113370. "adcs r4, r4, r8\n\t"
  113371. "adcs r5, r5, r9\n\t"
  113372. "adcs r6, r6, r10\n\t"
  113373. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  113374. "ldm %[a]!, {r3}\n\t"
  113375. "ldm %[b]!, {r7}\n\t"
  113376. "adcs r3, r3, r7\n\t"
  113377. "stm %[r]!, {r3}\n\t"
  113378. "mov %[r], #0\n\t"
  113379. "adc %[r], %[r], #0\n\t"
  113380. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  113381. :
  113382. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  113383. );
  113384. return (uint32_t)(size_t)r;
  113385. }
  113386. #endif /* WOLFSSL_SP_SMALL */
  113387. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  113388. *
  113389. * r The resulting Montgomery form number.
  113390. * a The number to convert.
  113391. * m The modulus (prime).
  113392. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  113393. */
  113394. static int sp_521_mod_mul_norm_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  113395. {
  113396. (void)m;
  113397. if (r != a) {
  113398. XMEMCPY(r, a, 17 * sizeof(sp_digit));
  113399. }
  113400. return MP_OKAY;
  113401. }
  113402. /* Convert an mp_int to an array of sp_digit.
  113403. *
  113404. * r A single precision integer.
  113405. * size Maximum number of bytes to convert
  113406. * a A multi-precision integer.
  113407. */
  113408. static void sp_521_from_mp(sp_digit* r, int size, const mp_int* a)
  113409. {
  113410. #if DIGIT_BIT == 32
  113411. int i;
  113412. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  113413. int o = 0;
  113414. for (i = 0; i < size; i++) {
  113415. sp_digit mask = (sp_digit)0 - (j >> 31);
  113416. r[i] = a->dp[o] & mask;
  113417. j++;
  113418. o += (int)(j >> 31);
  113419. }
  113420. #elif DIGIT_BIT > 32
  113421. unsigned int i;
  113422. int j = 0;
  113423. word32 s = 0;
  113424. r[0] = 0;
  113425. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  113426. r[j] |= ((sp_digit)a->dp[i] << s);
  113427. r[j] &= 0xffffffff;
  113428. s = 32U - s;
  113429. if (j + 1 >= size) {
  113430. break;
  113431. }
  113432. /* lint allow cast of mismatch word32 and mp_digit */
  113433. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  113434. while ((s + 32U) <= (word32)DIGIT_BIT) {
  113435. s += 32U;
  113436. r[j] &= 0xffffffff;
  113437. if (j + 1 >= size) {
  113438. break;
  113439. }
  113440. if (s < (word32)DIGIT_BIT) {
  113441. /* lint allow cast of mismatch word32 and mp_digit */
  113442. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  113443. }
  113444. else {
  113445. r[++j] = (sp_digit)0;
  113446. }
  113447. }
  113448. s = (word32)DIGIT_BIT - s;
  113449. }
  113450. for (j++; j < size; j++) {
  113451. r[j] = 0;
  113452. }
  113453. #else
  113454. unsigned int i;
  113455. int j = 0;
  113456. int s = 0;
  113457. r[0] = 0;
  113458. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  113459. r[j] |= ((sp_digit)a->dp[i]) << s;
  113460. if (s + DIGIT_BIT >= 32) {
  113461. r[j] &= 0xffffffff;
  113462. if (j + 1 >= size) {
  113463. break;
  113464. }
  113465. s = 32 - s;
  113466. if (s == DIGIT_BIT) {
  113467. r[++j] = 0;
  113468. s = 0;
  113469. }
  113470. else {
  113471. r[++j] = a->dp[i] >> s;
  113472. s = DIGIT_BIT - s;
  113473. }
  113474. }
  113475. else {
  113476. s += DIGIT_BIT;
  113477. }
  113478. }
  113479. for (j++; j < size; j++) {
  113480. r[j] = 0;
  113481. }
  113482. #endif
  113483. }
  113484. /* Convert a point of type ecc_point to type sp_point_521.
  113485. *
  113486. * p Point of type sp_point_521 (result).
  113487. * pm Point of type ecc_point.
  113488. */
  113489. static void sp_521_point_from_ecc_point_17(sp_point_521* p,
  113490. const ecc_point* pm)
  113491. {
  113492. XMEMSET(p->x, 0, sizeof(p->x));
  113493. XMEMSET(p->y, 0, sizeof(p->y));
  113494. XMEMSET(p->z, 0, sizeof(p->z));
  113495. sp_521_from_mp(p->x, 17, pm->x);
  113496. sp_521_from_mp(p->y, 17, pm->y);
  113497. sp_521_from_mp(p->z, 17, pm->z);
  113498. p->infinity = 0;
  113499. }
  113500. /* Convert an array of sp_digit to an mp_int.
  113501. *
  113502. * a A single precision integer.
  113503. * r A multi-precision integer.
  113504. */
  113505. static int sp_521_to_mp(const sp_digit* a, mp_int* r)
  113506. {
  113507. int err;
  113508. err = mp_grow(r, (521 + DIGIT_BIT - 1) / DIGIT_BIT);
  113509. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  113510. #if DIGIT_BIT == 32
  113511. XMEMCPY(r->dp, a, sizeof(sp_digit) * 17);
  113512. r->used = 17;
  113513. mp_clamp(r);
  113514. #elif DIGIT_BIT < 32
  113515. int i;
  113516. int j = 0;
  113517. int s = 0;
  113518. r->dp[0] = 0;
  113519. for (i = 0; i < 17; i++) {
  113520. r->dp[j] |= (mp_digit)(a[i] << s);
  113521. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  113522. s = DIGIT_BIT - s;
  113523. r->dp[++j] = (mp_digit)(a[i] >> s);
  113524. while (s + DIGIT_BIT <= 32) {
  113525. s += DIGIT_BIT;
  113526. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  113527. if (s == SP_WORD_SIZE) {
  113528. r->dp[j] = 0;
  113529. }
  113530. else {
  113531. r->dp[j] = (mp_digit)(a[i] >> s);
  113532. }
  113533. }
  113534. s = 32 - s;
  113535. }
  113536. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  113537. mp_clamp(r);
  113538. #else
  113539. int i;
  113540. int j = 0;
  113541. int s = 0;
  113542. r->dp[0] = 0;
  113543. for (i = 0; i < 17; i++) {
  113544. r->dp[j] |= ((mp_digit)a[i]) << s;
  113545. if (s + 32 >= DIGIT_BIT) {
  113546. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  113547. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  113548. #endif
  113549. s = DIGIT_BIT - s;
  113550. r->dp[++j] = a[i] >> s;
  113551. s = 32 - s;
  113552. }
  113553. else {
  113554. s += 32;
  113555. }
  113556. }
  113557. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  113558. mp_clamp(r);
  113559. #endif
  113560. }
  113561. return err;
  113562. }
  113563. /* Convert a point of type sp_point_521 to type ecc_point.
  113564. *
  113565. * p Point of type sp_point_521.
  113566. * pm Point of type ecc_point (result).
  113567. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  113568. * MP_OKAY.
  113569. */
  113570. static int sp_521_point_to_ecc_point_17(const sp_point_521* p, ecc_point* pm)
  113571. {
  113572. int err;
  113573. err = sp_521_to_mp(p->x, pm->x);
  113574. if (err == MP_OKAY) {
  113575. err = sp_521_to_mp(p->y, pm->y);
  113576. }
  113577. if (err == MP_OKAY) {
  113578. err = sp_521_to_mp(p->z, pm->z);
  113579. }
  113580. return err;
  113581. }
  113582. #ifdef WOLFSSL_SP_SMALL
  113583. /* Conditionally subtract b from a using the mask m.
  113584. * m is -1 to subtract and 0 when not copying.
  113585. *
  113586. * r A single precision number representing condition subtract result.
  113587. * a A single precision number to subtract from.
  113588. * b A single precision number to subtract.
  113589. * m Mask value to apply.
  113590. */
  113591. 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)
  113592. {
  113593. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  113594. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  113595. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  113596. register sp_digit m asm ("r3") = (sp_digit)m_p;
  113597. __asm__ __volatile__ (
  113598. "mov r6, #0\n\t"
  113599. "mov r12, #0\n\t"
  113600. "mov lr, #0\n\t"
  113601. "\n"
  113602. "L_sp_521_cond_sub_17_words_%=: \n\t"
  113603. "subs r12, r6, r12\n\t"
  113604. "ldr r4, [%[a], lr]\n\t"
  113605. "ldr r5, [%[b], lr]\n\t"
  113606. "and r5, r5, %[m]\n\t"
  113607. "sbcs r4, r4, r5\n\t"
  113608. "sbc r12, r6, r6\n\t"
  113609. "str r4, [%[r], lr]\n\t"
  113610. "add lr, lr, #4\n\t"
  113611. "cmp lr, #0x44\n\t"
  113612. "blt L_sp_521_cond_sub_17_words_%=\n\t"
  113613. "mov %[r], r12\n\t"
  113614. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  113615. :
  113616. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  113617. );
  113618. return (uint32_t)(size_t)r;
  113619. }
  113620. #else
  113621. /* Conditionally subtract b from a using the mask m.
  113622. * m is -1 to subtract and 0 when not copying.
  113623. *
  113624. * r A single precision number representing condition subtract result.
  113625. * a A single precision number to subtract from.
  113626. * b A single precision number to subtract.
  113627. * m Mask value to apply.
  113628. */
  113629. 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)
  113630. {
  113631. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  113632. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  113633. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  113634. register sp_digit m asm ("r3") = (sp_digit)m_p;
  113635. __asm__ __volatile__ (
  113636. "mov lr, #0\n\t"
  113637. "ldm %[a]!, {r4, r5}\n\t"
  113638. "ldm %[b]!, {r6, r7}\n\t"
  113639. "and r6, r6, %[m]\n\t"
  113640. "and r7, r7, %[m]\n\t"
  113641. "subs r4, r4, r6\n\t"
  113642. "sbcs r5, r5, r7\n\t"
  113643. "stm %[r]!, {r4, r5}\n\t"
  113644. "ldm %[a]!, {r4, r5}\n\t"
  113645. "ldm %[b]!, {r6, r7}\n\t"
  113646. "and r6, r6, %[m]\n\t"
  113647. "and r7, r7, %[m]\n\t"
  113648. "sbcs r4, r4, r6\n\t"
  113649. "sbcs r5, r5, r7\n\t"
  113650. "stm %[r]!, {r4, r5}\n\t"
  113651. "ldm %[a]!, {r4, r5}\n\t"
  113652. "ldm %[b]!, {r6, r7}\n\t"
  113653. "and r6, r6, %[m]\n\t"
  113654. "and r7, r7, %[m]\n\t"
  113655. "sbcs r4, r4, r6\n\t"
  113656. "sbcs r5, r5, r7\n\t"
  113657. "stm %[r]!, {r4, r5}\n\t"
  113658. "ldm %[a]!, {r4, r5}\n\t"
  113659. "ldm %[b]!, {r6, r7}\n\t"
  113660. "and r6, r6, %[m]\n\t"
  113661. "and r7, r7, %[m]\n\t"
  113662. "sbcs r4, r4, r6\n\t"
  113663. "sbcs r5, r5, r7\n\t"
  113664. "stm %[r]!, {r4, r5}\n\t"
  113665. "ldm %[a]!, {r4, r5}\n\t"
  113666. "ldm %[b]!, {r6, r7}\n\t"
  113667. "and r6, r6, %[m]\n\t"
  113668. "and r7, r7, %[m]\n\t"
  113669. "sbcs r4, r4, r6\n\t"
  113670. "sbcs r5, r5, r7\n\t"
  113671. "stm %[r]!, {r4, r5}\n\t"
  113672. "ldm %[a]!, {r4, r5}\n\t"
  113673. "ldm %[b]!, {r6, r7}\n\t"
  113674. "and r6, r6, %[m]\n\t"
  113675. "and r7, r7, %[m]\n\t"
  113676. "sbcs r4, r4, r6\n\t"
  113677. "sbcs r5, r5, r7\n\t"
  113678. "stm %[r]!, {r4, r5}\n\t"
  113679. "ldm %[a]!, {r4, r5}\n\t"
  113680. "ldm %[b]!, {r6, r7}\n\t"
  113681. "and r6, r6, %[m]\n\t"
  113682. "and r7, r7, %[m]\n\t"
  113683. "sbcs r4, r4, r6\n\t"
  113684. "sbcs r5, r5, r7\n\t"
  113685. "stm %[r]!, {r4, r5}\n\t"
  113686. "ldm %[a]!, {r4, r5}\n\t"
  113687. "ldm %[b]!, {r6, r7}\n\t"
  113688. "and r6, r6, %[m]\n\t"
  113689. "and r7, r7, %[m]\n\t"
  113690. "sbcs r4, r4, r6\n\t"
  113691. "sbcs r5, r5, r7\n\t"
  113692. "stm %[r]!, {r4, r5}\n\t"
  113693. "ldr r4, [%[a]]\n\t"
  113694. "ldr r6, [%[b]]\n\t"
  113695. "and r6, r6, %[m]\n\t"
  113696. "sbcs r4, r4, r6\n\t"
  113697. "str r4, [%[r]]\n\t"
  113698. "sbc %[r], lr, lr\n\t"
  113699. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  113700. :
  113701. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  113702. );
  113703. return (uint32_t)(size_t)r;
  113704. }
  113705. #endif /* WOLFSSL_SP_SMALL */
  113706. /* Reduce the number back to 521 bits using Montgomery reduction.
  113707. *
  113708. * a A single precision number to reduce in place.
  113709. * m The single precision number representing the modulus.
  113710. * mp The digit representing the negative inverse of m mod 2^n.
  113711. */
  113712. static SP_NOINLINE void sp_521_mont_reduce_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  113713. {
  113714. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  113715. __asm__ __volatile__ (
  113716. "sub sp, sp, #0x44\n\t"
  113717. "mov r12, sp\n\t"
  113718. /* Shift top down by 9 bits */
  113719. "add lr, %[a], #0x40\n\t"
  113720. /* 0-7 */
  113721. "ldm lr!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  113722. "lsr r1, r1, #9\n\t"
  113723. "orr r1, r1, r2, lsl #23\n\t"
  113724. "lsr r2, r2, #9\n\t"
  113725. "orr r2, r2, r3, lsl #23\n\t"
  113726. "lsr r3, r3, #9\n\t"
  113727. "orr r3, r3, r4, lsl #23\n\t"
  113728. "lsr r4, r4, #9\n\t"
  113729. "orr r4, r4, r5, lsl #23\n\t"
  113730. "lsr r5, r5, #9\n\t"
  113731. "orr r5, r5, r6, lsl #23\n\t"
  113732. "lsr r6, r6, #9\n\t"
  113733. "orr r6, r6, r7, lsl #23\n\t"
  113734. "lsr r7, r7, #9\n\t"
  113735. "orr r7, r7, r8, lsl #23\n\t"
  113736. "lsr r8, r8, #9\n\t"
  113737. "orr r8, r8, r9, lsl #23\n\t"
  113738. "stm r12!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  113739. "mov r1, r9\n\t"
  113740. /* 8-16 */
  113741. "ldm lr!, {r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  113742. "lsr r1, r1, #9\n\t"
  113743. "orr r1, r1, r2, lsl #23\n\t"
  113744. "lsr r2, r2, #9\n\t"
  113745. "orr r2, r2, r3, lsl #23\n\t"
  113746. "lsr r3, r3, #9\n\t"
  113747. "orr r3, r3, r4, lsl #23\n\t"
  113748. "lsr r4, r4, #9\n\t"
  113749. "orr r4, r4, r5, lsl #23\n\t"
  113750. "lsr r5, r5, #9\n\t"
  113751. "orr r5, r5, r6, lsl #23\n\t"
  113752. "lsr r6, r6, #9\n\t"
  113753. "orr r6, r6, r7, lsl #23\n\t"
  113754. "lsr r7, r7, #9\n\t"
  113755. "orr r7, r7, r8, lsl #23\n\t"
  113756. "lsr r8, r8, #9\n\t"
  113757. "orr r8, r8, r9, lsl #23\n\t"
  113758. "lsr r9, r9, #9\n\t"
  113759. "stm r12!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  113760. /* Add top to bottom */
  113761. /* 0-5 */
  113762. "ldm %[a], {r1, r2, r3, r4, r5, r6}\n\t"
  113763. "ldm sp!, {r7, r8, r9, r10, r11, r12}\n\t"
  113764. "adds r1, r1, r7\n\t"
  113765. "adcs r2, r2, r8\n\t"
  113766. "adcs r3, r3, r9\n\t"
  113767. "adcs r4, r4, r10\n\t"
  113768. "adcs r5, r5, r11\n\t"
  113769. "adcs r6, r6, r12\n\t"
  113770. "stm %[a]!, {r1, r2, r3, r4, r5, r6}\n\t"
  113771. /* 6-11 */
  113772. "ldm %[a], {r1, r2, r3, r4, r5, r6}\n\t"
  113773. "ldm sp!, {r7, r8, r9, r10, r11, r12}\n\t"
  113774. "adcs r1, r1, r7\n\t"
  113775. "adcs r2, r2, r8\n\t"
  113776. "adcs r3, r3, r9\n\t"
  113777. "adcs r4, r4, r10\n\t"
  113778. "adcs r5, r5, r11\n\t"
  113779. "adcs r6, r6, r12\n\t"
  113780. "stm %[a]!, {r1, r2, r3, r4, r5, r6}\n\t"
  113781. /* 12-16 */
  113782. "ldm %[a], {r1, r2, r3, r4, r5}\n\t"
  113783. "ldm sp!, {r7, r8, r9, r10, r11}\n\t"
  113784. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  113785. "mov lr, #0x1\n\t"
  113786. "lsl lr, lr, #8\n\t"
  113787. "add lr, lr, #0xff\n\t"
  113788. #else
  113789. "mov lr, #0x1ff\n\t"
  113790. #endif
  113791. "and r5, r5, lr\n\t"
  113792. "adcs r1, r1, r7\n\t"
  113793. "adcs r2, r2, r8\n\t"
  113794. "adcs r3, r3, r9\n\t"
  113795. "adcs r4, r4, r10\n\t"
  113796. "adcs r5, r5, r11\n\t"
  113797. "lsr r12, r5, #9\n\t"
  113798. "and r5, r5, lr\n\t"
  113799. "stm %[a]!, {r1, r2, r3, r4, r5}\n\t"
  113800. "sub %[a], %[a], #0x44\n\t"
  113801. /* Add overflow */
  113802. /* 0-8 */
  113803. "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  113804. "adds r1, r1, r12\n\t"
  113805. "adcs r2, r2, #0\n\t"
  113806. "adcs r3, r3, #0\n\t"
  113807. "adcs r4, r4, #0\n\t"
  113808. "adcs r5, r5, #0\n\t"
  113809. "adcs r6, r6, #0\n\t"
  113810. "adcs r7, r7, #0\n\t"
  113811. "adcs r8, r8, #0\n\t"
  113812. "adcs r9, r9, #0\n\t"
  113813. "stm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  113814. /* 9-16 */
  113815. "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  113816. "adcs r1, r1, #0\n\t"
  113817. "adcs r2, r2, #0\n\t"
  113818. "adcs r3, r3, #0\n\t"
  113819. "adcs r4, r4, #0\n\t"
  113820. "adcs r5, r5, #0\n\t"
  113821. "adcs r6, r6, #0\n\t"
  113822. "adcs r7, r7, #0\n\t"
  113823. "adcs r8, r8, #0\n\t"
  113824. "stm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  113825. : [a] "+r" (a)
  113826. :
  113827. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc"
  113828. );
  113829. (void)m_p;
  113830. (void)mp_p;
  113831. }
  113832. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113833. /* Reduce the number back to 521 bits using Montgomery reduction.
  113834. *
  113835. * a A single precision number to reduce in place.
  113836. * m The single precision number representing the modulus.
  113837. * mp The digit representing the negative inverse of m mod 2^n.
  113838. */
  113839. static SP_NOINLINE void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  113840. {
  113841. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  113842. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  113843. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  113844. __asm__ __volatile__ (
  113845. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  113846. "ldr r11, [%[m]]\n\t"
  113847. #endif
  113848. /* i = 0 */
  113849. "mov r9, #0\n\t"
  113850. "mov r3, #0\n\t"
  113851. "ldr r12, [%[a]]\n\t"
  113852. "ldr lr, [%[a], #4]\n\t"
  113853. "\n"
  113854. "L_sp_521_mont_reduce_order_17_word_%=: \n\t"
  113855. /* mu = a[i] * mp */
  113856. "mul r8, %[mp], r12\n\t"
  113857. "cmp r9, #0x40\n\t"
  113858. "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t"
  113859. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  113860. "mov r7, #0x1\n\t"
  113861. "lsl r7, r7, #8\n\t"
  113862. "add r7, r7, #0xff\n\t"
  113863. #else
  113864. "mov r7, #0x1ff\n\t"
  113865. #endif
  113866. "and r8, r8, r7\n\t"
  113867. "\n"
  113868. "L_sp_521_mont_reduce_order_17_nomask_%=: \n\t"
  113869. /* a[i+0] += m[0] * mu */
  113870. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  113871. "ldr r11, [%[m]]\n\t"
  113872. #endif
  113873. "lsr r7, r11, #16\n\t"
  113874. "lsr r6, r8, #16\n\t"
  113875. "mul r5, r6, r7\n\t"
  113876. "lsl r7, r11, #16\n\t"
  113877. "lsr r7, r7, #16\n\t"
  113878. "mul r6, r7, r6\n\t"
  113879. "lsr r7, r6, #16\n\t"
  113880. "lsl r6, r6, #16\n\t"
  113881. "adds r12, r12, r6\n\t"
  113882. "adc r5, r5, r7\n\t"
  113883. "lsl r6, r8, #16\n\t"
  113884. "lsl r7, r11, #16\n\t"
  113885. "lsr r6, r6, #16\n\t"
  113886. "lsr r7, r7, #16\n\t"
  113887. "mul r7, r6, r7\n\t"
  113888. "adds r12, r12, r7\n\t"
  113889. "adc r5, r5, #0\n\t"
  113890. "lsr r7, r11, #16\n\t"
  113891. "mul r6, r7, r6\n\t"
  113892. "lsr r7, r6, #16\n\t"
  113893. "lsl r6, r6, #16\n\t"
  113894. "adds r12, r12, r6\n\t"
  113895. "adc r5, r5, r7\n\t"
  113896. "str r12, [%[a]]\n\t"
  113897. /* a[i+1] += m[1] * mu */
  113898. "ldr r7, [%[m], #4]\n\t"
  113899. "lsr r10, r7, #16\n\t"
  113900. "lsr r6, r8, #16\n\t"
  113901. "mul r4, r6, r10\n\t"
  113902. "lsl r10, r7, #16\n\t"
  113903. "lsr r10, r10, #16\n\t"
  113904. "mul r6, r10, r6\n\t"
  113905. "lsr r10, r6, #16\n\t"
  113906. "lsl r6, r6, #16\n\t"
  113907. "adds lr, lr, r6\n\t"
  113908. "adc r4, r4, r10\n\t"
  113909. "lsl r6, r8, #16\n\t"
  113910. "lsl r10, r7, #16\n\t"
  113911. "lsr r6, r6, #16\n\t"
  113912. "lsr r10, r10, #16\n\t"
  113913. "mul r10, r6, r10\n\t"
  113914. "adds lr, lr, r10\n\t"
  113915. "adc r4, r4, #0\n\t"
  113916. "lsr r10, r7, #16\n\t"
  113917. "mul r6, r10, r6\n\t"
  113918. "lsr r10, r6, #16\n\t"
  113919. "lsl r6, r6, #16\n\t"
  113920. "adds lr, lr, r6\n\t"
  113921. "adc r4, r4, r10\n\t"
  113922. "mov r12, lr\n\t"
  113923. "adds r12, r12, r5\n\t"
  113924. "adc r4, r4, #0\n\t"
  113925. /* a[i+2] += m[2] * mu */
  113926. "ldr r7, [%[m], #8]\n\t"
  113927. "ldr lr, [%[a], #8]\n\t"
  113928. "lsr r10, r7, #16\n\t"
  113929. "lsr r6, r8, #16\n\t"
  113930. "mul r5, r6, r10\n\t"
  113931. "lsl r10, r7, #16\n\t"
  113932. "lsr r10, r10, #16\n\t"
  113933. "mul r6, r10, r6\n\t"
  113934. "lsr r10, r6, #16\n\t"
  113935. "lsl r6, r6, #16\n\t"
  113936. "adds lr, lr, r6\n\t"
  113937. "adc r5, r5, r10\n\t"
  113938. "lsl r6, r8, #16\n\t"
  113939. "lsl r10, r7, #16\n\t"
  113940. "lsr r6, r6, #16\n\t"
  113941. "lsr r10, r10, #16\n\t"
  113942. "mul r10, r6, r10\n\t"
  113943. "adds lr, lr, r10\n\t"
  113944. "adc r5, r5, #0\n\t"
  113945. "lsr r10, r7, #16\n\t"
  113946. "mul r6, r10, r6\n\t"
  113947. "lsr r10, r6, #16\n\t"
  113948. "lsl r6, r6, #16\n\t"
  113949. "adds lr, lr, r6\n\t"
  113950. "adc r5, r5, r10\n\t"
  113951. "adds lr, lr, r4\n\t"
  113952. "adc r5, r5, #0\n\t"
  113953. /* a[i+3] += m[3] * mu */
  113954. "ldr r7, [%[m], #12]\n\t"
  113955. "ldr r10, [%[a], #12]\n\t"
  113956. "lsr r11, r7, #16\n\t"
  113957. "lsr r6, r8, #16\n\t"
  113958. "mul r4, r6, r11\n\t"
  113959. "lsl r11, r7, #16\n\t"
  113960. "lsr r11, r11, #16\n\t"
  113961. "mul r6, r11, r6\n\t"
  113962. "lsr r11, r6, #16\n\t"
  113963. "lsl r6, r6, #16\n\t"
  113964. "adds r10, r10, r6\n\t"
  113965. "adc r4, r4, r11\n\t"
  113966. "lsl r6, r8, #16\n\t"
  113967. "lsl r11, r7, #16\n\t"
  113968. "lsr r6, r6, #16\n\t"
  113969. "lsr r11, r11, #16\n\t"
  113970. "mul r11, r6, r11\n\t"
  113971. "adds r10, r10, r11\n\t"
  113972. "adc r4, r4, #0\n\t"
  113973. "lsr r11, r7, #16\n\t"
  113974. "mul r6, r11, r6\n\t"
  113975. "lsr r11, r6, #16\n\t"
  113976. "lsl r6, r6, #16\n\t"
  113977. "adds r10, r10, r6\n\t"
  113978. "adc r4, r4, r11\n\t"
  113979. "adds r10, r10, r5\n\t"
  113980. "str r10, [%[a], #12]\n\t"
  113981. "adc r4, r4, #0\n\t"
  113982. /* a[i+4] += m[4] * mu */
  113983. "ldr r7, [%[m], #16]\n\t"
  113984. "ldr r10, [%[a], #16]\n\t"
  113985. "lsr r11, r7, #16\n\t"
  113986. "lsr r6, r8, #16\n\t"
  113987. "mul r5, r6, r11\n\t"
  113988. "lsl r11, r7, #16\n\t"
  113989. "lsr r11, r11, #16\n\t"
  113990. "mul r6, r11, r6\n\t"
  113991. "lsr r11, r6, #16\n\t"
  113992. "lsl r6, r6, #16\n\t"
  113993. "adds r10, r10, r6\n\t"
  113994. "adc r5, r5, r11\n\t"
  113995. "lsl r6, r8, #16\n\t"
  113996. "lsl r11, r7, #16\n\t"
  113997. "lsr r6, r6, #16\n\t"
  113998. "lsr r11, r11, #16\n\t"
  113999. "mul r11, r6, r11\n\t"
  114000. "adds r10, r10, r11\n\t"
  114001. "adc r5, r5, #0\n\t"
  114002. "lsr r11, r7, #16\n\t"
  114003. "mul r6, r11, r6\n\t"
  114004. "lsr r11, r6, #16\n\t"
  114005. "lsl r6, r6, #16\n\t"
  114006. "adds r10, r10, r6\n\t"
  114007. "adc r5, r5, r11\n\t"
  114008. "adds r10, r10, r4\n\t"
  114009. "str r10, [%[a], #16]\n\t"
  114010. "adc r5, r5, #0\n\t"
  114011. /* a[i+5] += m[5] * mu */
  114012. "ldr r7, [%[m], #20]\n\t"
  114013. "ldr r10, [%[a], #20]\n\t"
  114014. "lsr r11, r7, #16\n\t"
  114015. "lsr r6, r8, #16\n\t"
  114016. "mul r4, r6, r11\n\t"
  114017. "lsl r11, r7, #16\n\t"
  114018. "lsr r11, r11, #16\n\t"
  114019. "mul r6, r11, r6\n\t"
  114020. "lsr r11, r6, #16\n\t"
  114021. "lsl r6, r6, #16\n\t"
  114022. "adds r10, r10, r6\n\t"
  114023. "adc r4, r4, r11\n\t"
  114024. "lsl r6, r8, #16\n\t"
  114025. "lsl r11, r7, #16\n\t"
  114026. "lsr r6, r6, #16\n\t"
  114027. "lsr r11, r11, #16\n\t"
  114028. "mul r11, r6, r11\n\t"
  114029. "adds r10, r10, r11\n\t"
  114030. "adc r4, r4, #0\n\t"
  114031. "lsr r11, r7, #16\n\t"
  114032. "mul r6, r11, r6\n\t"
  114033. "lsr r11, r6, #16\n\t"
  114034. "lsl r6, r6, #16\n\t"
  114035. "adds r10, r10, r6\n\t"
  114036. "adc r4, r4, r11\n\t"
  114037. "adds r10, r10, r5\n\t"
  114038. "str r10, [%[a], #20]\n\t"
  114039. "adc r4, r4, #0\n\t"
  114040. /* a[i+6] += m[6] * mu */
  114041. "ldr r7, [%[m], #24]\n\t"
  114042. "ldr r10, [%[a], #24]\n\t"
  114043. "lsr r11, r7, #16\n\t"
  114044. "lsr r6, r8, #16\n\t"
  114045. "mul r5, r6, r11\n\t"
  114046. "lsl r11, r7, #16\n\t"
  114047. "lsr r11, r11, #16\n\t"
  114048. "mul r6, r11, r6\n\t"
  114049. "lsr r11, r6, #16\n\t"
  114050. "lsl r6, r6, #16\n\t"
  114051. "adds r10, r10, r6\n\t"
  114052. "adc r5, r5, r11\n\t"
  114053. "lsl r6, r8, #16\n\t"
  114054. "lsl r11, r7, #16\n\t"
  114055. "lsr r6, r6, #16\n\t"
  114056. "lsr r11, r11, #16\n\t"
  114057. "mul r11, r6, r11\n\t"
  114058. "adds r10, r10, r11\n\t"
  114059. "adc r5, r5, #0\n\t"
  114060. "lsr r11, r7, #16\n\t"
  114061. "mul r6, r11, r6\n\t"
  114062. "lsr r11, r6, #16\n\t"
  114063. "lsl r6, r6, #16\n\t"
  114064. "adds r10, r10, r6\n\t"
  114065. "adc r5, r5, r11\n\t"
  114066. "adds r10, r10, r4\n\t"
  114067. "str r10, [%[a], #24]\n\t"
  114068. "adc r5, r5, #0\n\t"
  114069. /* a[i+7] += m[7] * mu */
  114070. "ldr r7, [%[m], #28]\n\t"
  114071. "ldr r10, [%[a], #28]\n\t"
  114072. "lsr r11, r7, #16\n\t"
  114073. "lsr r6, r8, #16\n\t"
  114074. "mul r4, r6, r11\n\t"
  114075. "lsl r11, r7, #16\n\t"
  114076. "lsr r11, r11, #16\n\t"
  114077. "mul r6, r11, r6\n\t"
  114078. "lsr r11, r6, #16\n\t"
  114079. "lsl r6, r6, #16\n\t"
  114080. "adds r10, r10, r6\n\t"
  114081. "adc r4, r4, r11\n\t"
  114082. "lsl r6, r8, #16\n\t"
  114083. "lsl r11, r7, #16\n\t"
  114084. "lsr r6, r6, #16\n\t"
  114085. "lsr r11, r11, #16\n\t"
  114086. "mul r11, r6, r11\n\t"
  114087. "adds r10, r10, r11\n\t"
  114088. "adc r4, r4, #0\n\t"
  114089. "lsr r11, r7, #16\n\t"
  114090. "mul r6, r11, r6\n\t"
  114091. "lsr r11, r6, #16\n\t"
  114092. "lsl r6, r6, #16\n\t"
  114093. "adds r10, r10, r6\n\t"
  114094. "adc r4, r4, r11\n\t"
  114095. "adds r10, r10, r5\n\t"
  114096. "str r10, [%[a], #28]\n\t"
  114097. "adc r4, r4, #0\n\t"
  114098. /* a[i+8] += m[8] * mu */
  114099. "ldr r7, [%[m], #32]\n\t"
  114100. "ldr r10, [%[a], #32]\n\t"
  114101. "lsr r11, r7, #16\n\t"
  114102. "lsr r6, r8, #16\n\t"
  114103. "mul r5, r6, r11\n\t"
  114104. "lsl r11, r7, #16\n\t"
  114105. "lsr r11, r11, #16\n\t"
  114106. "mul r6, r11, r6\n\t"
  114107. "lsr r11, r6, #16\n\t"
  114108. "lsl r6, r6, #16\n\t"
  114109. "adds r10, r10, r6\n\t"
  114110. "adc r5, r5, r11\n\t"
  114111. "lsl r6, r8, #16\n\t"
  114112. "lsl r11, r7, #16\n\t"
  114113. "lsr r6, r6, #16\n\t"
  114114. "lsr r11, r11, #16\n\t"
  114115. "mul r11, r6, r11\n\t"
  114116. "adds r10, r10, r11\n\t"
  114117. "adc r5, r5, #0\n\t"
  114118. "lsr r11, r7, #16\n\t"
  114119. "mul r6, r11, r6\n\t"
  114120. "lsr r11, r6, #16\n\t"
  114121. "lsl r6, r6, #16\n\t"
  114122. "adds r10, r10, r6\n\t"
  114123. "adc r5, r5, r11\n\t"
  114124. "adds r10, r10, r4\n\t"
  114125. "str r10, [%[a], #32]\n\t"
  114126. "adc r5, r5, #0\n\t"
  114127. /* a[i+9] += m[9] * mu */
  114128. "ldr r7, [%[m], #36]\n\t"
  114129. "ldr r10, [%[a], #36]\n\t"
  114130. "lsr r11, r7, #16\n\t"
  114131. "lsr r6, r8, #16\n\t"
  114132. "mul r4, r6, r11\n\t"
  114133. "lsl r11, r7, #16\n\t"
  114134. "lsr r11, r11, #16\n\t"
  114135. "mul r6, r11, r6\n\t"
  114136. "lsr r11, r6, #16\n\t"
  114137. "lsl r6, r6, #16\n\t"
  114138. "adds r10, r10, r6\n\t"
  114139. "adc r4, r4, r11\n\t"
  114140. "lsl r6, r8, #16\n\t"
  114141. "lsl r11, r7, #16\n\t"
  114142. "lsr r6, r6, #16\n\t"
  114143. "lsr r11, r11, #16\n\t"
  114144. "mul r11, r6, r11\n\t"
  114145. "adds r10, r10, r11\n\t"
  114146. "adc r4, r4, #0\n\t"
  114147. "lsr r11, r7, #16\n\t"
  114148. "mul r6, r11, r6\n\t"
  114149. "lsr r11, r6, #16\n\t"
  114150. "lsl r6, r6, #16\n\t"
  114151. "adds r10, r10, r6\n\t"
  114152. "adc r4, r4, r11\n\t"
  114153. "adds r10, r10, r5\n\t"
  114154. "str r10, [%[a], #36]\n\t"
  114155. "adc r4, r4, #0\n\t"
  114156. /* a[i+10] += m[10] * mu */
  114157. "ldr r7, [%[m], #40]\n\t"
  114158. "ldr r10, [%[a], #40]\n\t"
  114159. "lsr r11, r7, #16\n\t"
  114160. "lsr r6, r8, #16\n\t"
  114161. "mul r5, r6, r11\n\t"
  114162. "lsl r11, r7, #16\n\t"
  114163. "lsr r11, r11, #16\n\t"
  114164. "mul r6, r11, r6\n\t"
  114165. "lsr r11, r6, #16\n\t"
  114166. "lsl r6, r6, #16\n\t"
  114167. "adds r10, r10, r6\n\t"
  114168. "adc r5, r5, r11\n\t"
  114169. "lsl r6, r8, #16\n\t"
  114170. "lsl r11, r7, #16\n\t"
  114171. "lsr r6, r6, #16\n\t"
  114172. "lsr r11, r11, #16\n\t"
  114173. "mul r11, r6, r11\n\t"
  114174. "adds r10, r10, r11\n\t"
  114175. "adc r5, r5, #0\n\t"
  114176. "lsr r11, r7, #16\n\t"
  114177. "mul r6, r11, r6\n\t"
  114178. "lsr r11, r6, #16\n\t"
  114179. "lsl r6, r6, #16\n\t"
  114180. "adds r10, r10, r6\n\t"
  114181. "adc r5, r5, r11\n\t"
  114182. "adds r10, r10, r4\n\t"
  114183. "str r10, [%[a], #40]\n\t"
  114184. "adc r5, r5, #0\n\t"
  114185. /* a[i+11] += m[11] * mu */
  114186. "ldr r7, [%[m], #44]\n\t"
  114187. "ldr r10, [%[a], #44]\n\t"
  114188. "lsr r11, r7, #16\n\t"
  114189. "lsr r6, r8, #16\n\t"
  114190. "mul r4, r6, r11\n\t"
  114191. "lsl r11, r7, #16\n\t"
  114192. "lsr r11, r11, #16\n\t"
  114193. "mul r6, r11, r6\n\t"
  114194. "lsr r11, r6, #16\n\t"
  114195. "lsl r6, r6, #16\n\t"
  114196. "adds r10, r10, r6\n\t"
  114197. "adc r4, r4, r11\n\t"
  114198. "lsl r6, r8, #16\n\t"
  114199. "lsl r11, r7, #16\n\t"
  114200. "lsr r6, r6, #16\n\t"
  114201. "lsr r11, r11, #16\n\t"
  114202. "mul r11, r6, r11\n\t"
  114203. "adds r10, r10, r11\n\t"
  114204. "adc r4, r4, #0\n\t"
  114205. "lsr r11, r7, #16\n\t"
  114206. "mul r6, r11, r6\n\t"
  114207. "lsr r11, r6, #16\n\t"
  114208. "lsl r6, r6, #16\n\t"
  114209. "adds r10, r10, r6\n\t"
  114210. "adc r4, r4, r11\n\t"
  114211. "adds r10, r10, r5\n\t"
  114212. "str r10, [%[a], #44]\n\t"
  114213. "adc r4, r4, #0\n\t"
  114214. /* a[i+12] += m[12] * mu */
  114215. "ldr r7, [%[m], #48]\n\t"
  114216. "ldr r10, [%[a], #48]\n\t"
  114217. "lsr r11, r7, #16\n\t"
  114218. "lsr r6, r8, #16\n\t"
  114219. "mul r5, r6, r11\n\t"
  114220. "lsl r11, r7, #16\n\t"
  114221. "lsr r11, r11, #16\n\t"
  114222. "mul r6, r11, r6\n\t"
  114223. "lsr r11, r6, #16\n\t"
  114224. "lsl r6, r6, #16\n\t"
  114225. "adds r10, r10, r6\n\t"
  114226. "adc r5, r5, r11\n\t"
  114227. "lsl r6, r8, #16\n\t"
  114228. "lsl r11, r7, #16\n\t"
  114229. "lsr r6, r6, #16\n\t"
  114230. "lsr r11, r11, #16\n\t"
  114231. "mul r11, r6, r11\n\t"
  114232. "adds r10, r10, r11\n\t"
  114233. "adc r5, r5, #0\n\t"
  114234. "lsr r11, r7, #16\n\t"
  114235. "mul r6, r11, r6\n\t"
  114236. "lsr r11, r6, #16\n\t"
  114237. "lsl r6, r6, #16\n\t"
  114238. "adds r10, r10, r6\n\t"
  114239. "adc r5, r5, r11\n\t"
  114240. "adds r10, r10, r4\n\t"
  114241. "str r10, [%[a], #48]\n\t"
  114242. "adc r5, r5, #0\n\t"
  114243. /* a[i+13] += m[13] * mu */
  114244. "ldr r7, [%[m], #52]\n\t"
  114245. "ldr r10, [%[a], #52]\n\t"
  114246. "lsr r11, r7, #16\n\t"
  114247. "lsr r6, r8, #16\n\t"
  114248. "mul r4, r6, r11\n\t"
  114249. "lsl r11, r7, #16\n\t"
  114250. "lsr r11, r11, #16\n\t"
  114251. "mul r6, r11, r6\n\t"
  114252. "lsr r11, r6, #16\n\t"
  114253. "lsl r6, r6, #16\n\t"
  114254. "adds r10, r10, r6\n\t"
  114255. "adc r4, r4, r11\n\t"
  114256. "lsl r6, r8, #16\n\t"
  114257. "lsl r11, r7, #16\n\t"
  114258. "lsr r6, r6, #16\n\t"
  114259. "lsr r11, r11, #16\n\t"
  114260. "mul r11, r6, r11\n\t"
  114261. "adds r10, r10, r11\n\t"
  114262. "adc r4, r4, #0\n\t"
  114263. "lsr r11, r7, #16\n\t"
  114264. "mul r6, r11, r6\n\t"
  114265. "lsr r11, r6, #16\n\t"
  114266. "lsl r6, r6, #16\n\t"
  114267. "adds r10, r10, r6\n\t"
  114268. "adc r4, r4, r11\n\t"
  114269. "adds r10, r10, r5\n\t"
  114270. "str r10, [%[a], #52]\n\t"
  114271. "adc r4, r4, #0\n\t"
  114272. /* a[i+14] += m[14] * mu */
  114273. "ldr r7, [%[m], #56]\n\t"
  114274. "ldr r10, [%[a], #56]\n\t"
  114275. "lsr r11, r7, #16\n\t"
  114276. "lsr r6, r8, #16\n\t"
  114277. "mul r5, r6, r11\n\t"
  114278. "lsl r11, r7, #16\n\t"
  114279. "lsr r11, r11, #16\n\t"
  114280. "mul r6, r11, r6\n\t"
  114281. "lsr r11, r6, #16\n\t"
  114282. "lsl r6, r6, #16\n\t"
  114283. "adds r10, r10, r6\n\t"
  114284. "adc r5, r5, r11\n\t"
  114285. "lsl r6, r8, #16\n\t"
  114286. "lsl r11, r7, #16\n\t"
  114287. "lsr r6, r6, #16\n\t"
  114288. "lsr r11, r11, #16\n\t"
  114289. "mul r11, r6, r11\n\t"
  114290. "adds r10, r10, r11\n\t"
  114291. "adc r5, r5, #0\n\t"
  114292. "lsr r11, r7, #16\n\t"
  114293. "mul r6, r11, r6\n\t"
  114294. "lsr r11, r6, #16\n\t"
  114295. "lsl r6, r6, #16\n\t"
  114296. "adds r10, r10, r6\n\t"
  114297. "adc r5, r5, r11\n\t"
  114298. "adds r10, r10, r4\n\t"
  114299. "str r10, [%[a], #56]\n\t"
  114300. "adc r5, r5, #0\n\t"
  114301. /* a[i+15] += m[15] * mu */
  114302. "ldr r7, [%[m], #60]\n\t"
  114303. "ldr r10, [%[a], #60]\n\t"
  114304. "lsr r11, r7, #16\n\t"
  114305. "lsr r6, r8, #16\n\t"
  114306. "mul r4, r6, r11\n\t"
  114307. "lsl r11, r7, #16\n\t"
  114308. "lsr r11, r11, #16\n\t"
  114309. "mul r6, r11, r6\n\t"
  114310. "lsr r11, r6, #16\n\t"
  114311. "lsl r6, r6, #16\n\t"
  114312. "adds r10, r10, r6\n\t"
  114313. "adc r4, r4, r11\n\t"
  114314. "lsl r6, r8, #16\n\t"
  114315. "lsl r11, r7, #16\n\t"
  114316. "lsr r6, r6, #16\n\t"
  114317. "lsr r11, r11, #16\n\t"
  114318. "mul r11, r6, r11\n\t"
  114319. "adds r10, r10, r11\n\t"
  114320. "adc r4, r4, #0\n\t"
  114321. "lsr r11, r7, #16\n\t"
  114322. "mul r6, r11, r6\n\t"
  114323. "lsr r11, r6, #16\n\t"
  114324. "lsl r6, r6, #16\n\t"
  114325. "adds r10, r10, r6\n\t"
  114326. "adc r4, r4, r11\n\t"
  114327. "adds r10, r10, r5\n\t"
  114328. "str r10, [%[a], #60]\n\t"
  114329. "adc r4, r4, #0\n\t"
  114330. /* a[i+16] += m[16] * mu */
  114331. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  114332. "ldr r11, [%[m], #64]\n\t"
  114333. #else
  114334. "ldr r7, [%[m], #64]\n\t"
  114335. #endif
  114336. "ldr r10, [%[a], #64]\n\t"
  114337. "lsl r6, r8, #16\n\t"
  114338. "lsl r7, r11, #16\n\t"
  114339. "lsr r6, r6, #16\n\t"
  114340. "lsr r7, r7, #16\n\t"
  114341. "mul r7, r6, r7\n\t"
  114342. "adds r4, r4, r7\n\t"
  114343. "adcs r5, r3, #0\n\t"
  114344. "mov r3, #0\n\t"
  114345. "adc r3, r3, r3\n\t"
  114346. "lsr r7, r11, #16\n\t"
  114347. "mul r6, r7, r6\n\t"
  114348. "lsr r7, r6, #16\n\t"
  114349. "lsl r6, r6, #16\n\t"
  114350. "adds r4, r4, r6\n\t"
  114351. "adcs r5, r5, r7\n\t"
  114352. "adc r3, r3, #0\n\t"
  114353. "mov r6, r8\n\t"
  114354. "lsr r7, r11, #16\n\t"
  114355. "lsr r6, r6, #16\n\t"
  114356. "mul r7, r6, r7\n\t"
  114357. "adds r5, r5, r7\n\t"
  114358. "lsl r7, r11, #16\n\t"
  114359. "adc r3, r3, #0\n\t"
  114360. "lsr r7, r7, #16\n\t"
  114361. "mul r6, r7, r6\n\t"
  114362. "lsr r7, r6, #16\n\t"
  114363. "lsl r6, r6, #16\n\t"
  114364. "adds r4, r4, r6\n\t"
  114365. "adcs r5, r5, r7\n\t"
  114366. "adc r3, r3, #0\n\t"
  114367. "adds r10, r10, r4\n\t"
  114368. "str r10, [%[a], #64]\n\t"
  114369. "ldr r10, [%[a], #68]\n\t"
  114370. "adcs r10, r10, r5\n\t"
  114371. "str r10, [%[a], #68]\n\t"
  114372. "adc r3, r3, #0\n\t"
  114373. /* i += 1 */
  114374. "add r9, r9, #4\n\t"
  114375. "add %[a], %[a], #4\n\t"
  114376. "cmp r9, #0x44\n\t"
  114377. "blt L_sp_521_mont_reduce_order_17_word_%=\n\t"
  114378. /* Loop Done */
  114379. "str r12, [%[a]]\n\t"
  114380. "str lr, [%[a], #4]\n\t"
  114381. "sub %[a], %[a], #4\n\t"
  114382. "ldr r4, [%[a]]\n\t"
  114383. "ldr r5, [%[a], #4]\n\t"
  114384. "lsr r4, r4, #9\n\t"
  114385. "orr r4, r4, r5, lsl #23\n\t"
  114386. "str r4, [%[a], #4]\n\t"
  114387. "ldr r4, [%[a], #8]\n\t"
  114388. "lsr r5, r5, #9\n\t"
  114389. "orr r5, r5, r4, lsl #23\n\t"
  114390. "str r5, [%[a], #8]\n\t"
  114391. "ldr r5, [%[a], #12]\n\t"
  114392. "lsr r4, r4, #9\n\t"
  114393. "orr r4, r4, r5, lsl #23\n\t"
  114394. "str r4, [%[a], #12]\n\t"
  114395. "ldr r4, [%[a], #16]\n\t"
  114396. "lsr r5, r5, #9\n\t"
  114397. "orr r5, r5, r4, lsl #23\n\t"
  114398. "str r5, [%[a], #16]\n\t"
  114399. "ldr r5, [%[a], #20]\n\t"
  114400. "lsr r4, r4, #9\n\t"
  114401. "orr r4, r4, r5, lsl #23\n\t"
  114402. "str r4, [%[a], #20]\n\t"
  114403. "ldr r4, [%[a], #24]\n\t"
  114404. "lsr r5, r5, #9\n\t"
  114405. "orr r5, r5, r4, lsl #23\n\t"
  114406. "str r5, [%[a], #24]\n\t"
  114407. "ldr r5, [%[a], #28]\n\t"
  114408. "lsr r4, r4, #9\n\t"
  114409. "orr r4, r4, r5, lsl #23\n\t"
  114410. "str r4, [%[a], #28]\n\t"
  114411. "ldr r4, [%[a], #32]\n\t"
  114412. "lsr r5, r5, #9\n\t"
  114413. "orr r5, r5, r4, lsl #23\n\t"
  114414. "str r5, [%[a], #32]\n\t"
  114415. "ldr r5, [%[a], #36]\n\t"
  114416. "lsr r4, r4, #9\n\t"
  114417. "orr r4, r4, r5, lsl #23\n\t"
  114418. "str r4, [%[a], #36]\n\t"
  114419. "ldr r4, [%[a], #40]\n\t"
  114420. "lsr r5, r5, #9\n\t"
  114421. "orr r5, r5, r4, lsl #23\n\t"
  114422. "str r5, [%[a], #40]\n\t"
  114423. "ldr r5, [%[a], #44]\n\t"
  114424. "lsr r4, r4, #9\n\t"
  114425. "orr r4, r4, r5, lsl #23\n\t"
  114426. "str r4, [%[a], #44]\n\t"
  114427. "ldr r4, [%[a], #48]\n\t"
  114428. "lsr r5, r5, #9\n\t"
  114429. "orr r5, r5, r4, lsl #23\n\t"
  114430. "str r5, [%[a], #48]\n\t"
  114431. "ldr r5, [%[a], #52]\n\t"
  114432. "lsr r4, r4, #9\n\t"
  114433. "orr r4, r4, r5, lsl #23\n\t"
  114434. "str r4, [%[a], #52]\n\t"
  114435. "ldr r4, [%[a], #56]\n\t"
  114436. "lsr r5, r5, #9\n\t"
  114437. "orr r5, r5, r4, lsl #23\n\t"
  114438. "str r5, [%[a], #56]\n\t"
  114439. "ldr r5, [%[a], #60]\n\t"
  114440. "lsr r4, r4, #9\n\t"
  114441. "orr r4, r4, r5, lsl #23\n\t"
  114442. "str r4, [%[a], #60]\n\t"
  114443. "ldr r4, [%[a], #64]\n\t"
  114444. "lsr r5, r5, #9\n\t"
  114445. "orr r5, r5, r4, lsl #23\n\t"
  114446. "str r5, [%[a], #64]\n\t"
  114447. "lsr r4, r4, #9\n\t"
  114448. "str r4, [%[a], #68]\n\t"
  114449. "lsr r3, r4, #9\n\t"
  114450. "add %[a], %[a], #4\n\t"
  114451. "mov %[mp], r3\n\t"
  114452. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  114453. :
  114454. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  114455. );
  114456. sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp);
  114457. }
  114458. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  114459. /* Reduce the number back to 521 bits using Montgomery reduction.
  114460. *
  114461. * a A single precision number to reduce in place.
  114462. * m The single precision number representing the modulus.
  114463. * mp The digit representing the negative inverse of m mod 2^n.
  114464. */
  114465. static SP_NOINLINE void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  114466. {
  114467. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  114468. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  114469. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  114470. __asm__ __volatile__ (
  114471. "ldr r11, [%[m]]\n\t"
  114472. /* i = 0 */
  114473. "mov r9, #0\n\t"
  114474. "mov r3, #0\n\t"
  114475. "ldr r12, [%[a]]\n\t"
  114476. "ldr lr, [%[a], #4]\n\t"
  114477. "\n"
  114478. "L_sp_521_mont_reduce_order_17_word_%=: \n\t"
  114479. /* mu = a[i] * mp */
  114480. "mul r8, %[mp], r12\n\t"
  114481. "cmp r9, #0x40\n\t"
  114482. "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t"
  114483. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  114484. "mov r7, #0x1\n\t"
  114485. "lsl r7, r7, #8\n\t"
  114486. "add r7, r7, #0xff\n\t"
  114487. #else
  114488. "mov r7, #0x1ff\n\t"
  114489. #endif
  114490. "and r8, r8, r7\n\t"
  114491. "\n"
  114492. "L_sp_521_mont_reduce_order_17_nomask_%=: \n\t"
  114493. /* a[i+0] += m[0] * mu */
  114494. "mov r5, #0\n\t"
  114495. "umlal r12, r5, r8, r11\n\t"
  114496. "str r12, [%[a]]\n\t"
  114497. /* a[i+1] += m[1] * mu */
  114498. "ldr r7, [%[m], #4]\n\t"
  114499. "mov r4, #0\n\t"
  114500. "umlal lr, r4, r8, r7\n\t"
  114501. "mov r12, lr\n\t"
  114502. "adds r12, r12, r5\n\t"
  114503. "adc r4, r4, #0\n\t"
  114504. /* a[i+2] += m[2] * mu */
  114505. "ldr r7, [%[m], #8]\n\t"
  114506. "ldr lr, [%[a], #8]\n\t"
  114507. "mov r5, #0\n\t"
  114508. "umlal lr, r5, r8, r7\n\t"
  114509. "adds lr, lr, r4\n\t"
  114510. "adc r5, r5, #0\n\t"
  114511. /* a[i+3] += m[3] * mu */
  114512. "ldr r7, [%[m], #12]\n\t"
  114513. "ldr r10, [%[a], #12]\n\t"
  114514. "mov r4, #0\n\t"
  114515. "umlal r10, r4, r8, r7\n\t"
  114516. "adds r10, r10, r5\n\t"
  114517. "str r10, [%[a], #12]\n\t"
  114518. "adc r4, r4, #0\n\t"
  114519. /* a[i+4] += m[4] * mu */
  114520. "ldr r7, [%[m], #16]\n\t"
  114521. "ldr r10, [%[a], #16]\n\t"
  114522. "mov r5, #0\n\t"
  114523. "umlal r10, r5, r8, r7\n\t"
  114524. "adds r10, r10, r4\n\t"
  114525. "str r10, [%[a], #16]\n\t"
  114526. "adc r5, r5, #0\n\t"
  114527. /* a[i+5] += m[5] * mu */
  114528. "ldr r7, [%[m], #20]\n\t"
  114529. "ldr r10, [%[a], #20]\n\t"
  114530. "mov r4, #0\n\t"
  114531. "umlal r10, r4, r8, r7\n\t"
  114532. "adds r10, r10, r5\n\t"
  114533. "str r10, [%[a], #20]\n\t"
  114534. "adc r4, r4, #0\n\t"
  114535. /* a[i+6] += m[6] * mu */
  114536. "ldr r7, [%[m], #24]\n\t"
  114537. "ldr r10, [%[a], #24]\n\t"
  114538. "mov r5, #0\n\t"
  114539. "umlal r10, r5, r8, r7\n\t"
  114540. "adds r10, r10, r4\n\t"
  114541. "str r10, [%[a], #24]\n\t"
  114542. "adc r5, r5, #0\n\t"
  114543. /* a[i+7] += m[7] * mu */
  114544. "ldr r7, [%[m], #28]\n\t"
  114545. "ldr r10, [%[a], #28]\n\t"
  114546. "mov r4, #0\n\t"
  114547. "umlal r10, r4, r8, r7\n\t"
  114548. "adds r10, r10, r5\n\t"
  114549. "str r10, [%[a], #28]\n\t"
  114550. "adc r4, r4, #0\n\t"
  114551. /* a[i+8] += m[8] * mu */
  114552. "ldr r7, [%[m], #32]\n\t"
  114553. "ldr r10, [%[a], #32]\n\t"
  114554. "mov r5, #0\n\t"
  114555. "umlal r10, r5, r8, r7\n\t"
  114556. "adds r10, r10, r4\n\t"
  114557. "str r10, [%[a], #32]\n\t"
  114558. "adc r5, r5, #0\n\t"
  114559. /* a[i+9] += m[9] * mu */
  114560. "ldr r7, [%[m], #36]\n\t"
  114561. "ldr r10, [%[a], #36]\n\t"
  114562. "mov r4, #0\n\t"
  114563. "umlal r10, r4, r8, r7\n\t"
  114564. "adds r10, r10, r5\n\t"
  114565. "str r10, [%[a], #36]\n\t"
  114566. "adc r4, r4, #0\n\t"
  114567. /* a[i+10] += m[10] * mu */
  114568. "ldr r7, [%[m], #40]\n\t"
  114569. "ldr r10, [%[a], #40]\n\t"
  114570. "mov r5, #0\n\t"
  114571. "umlal r10, r5, r8, r7\n\t"
  114572. "adds r10, r10, r4\n\t"
  114573. "str r10, [%[a], #40]\n\t"
  114574. "adc r5, r5, #0\n\t"
  114575. /* a[i+11] += m[11] * mu */
  114576. "ldr r7, [%[m], #44]\n\t"
  114577. "ldr r10, [%[a], #44]\n\t"
  114578. "mov r4, #0\n\t"
  114579. "umlal r10, r4, r8, r7\n\t"
  114580. "adds r10, r10, r5\n\t"
  114581. "str r10, [%[a], #44]\n\t"
  114582. "adc r4, r4, #0\n\t"
  114583. /* a[i+12] += m[12] * mu */
  114584. "ldr r7, [%[m], #48]\n\t"
  114585. "ldr r10, [%[a], #48]\n\t"
  114586. "mov r5, #0\n\t"
  114587. "umlal r10, r5, r8, r7\n\t"
  114588. "adds r10, r10, r4\n\t"
  114589. "str r10, [%[a], #48]\n\t"
  114590. "adc r5, r5, #0\n\t"
  114591. /* a[i+13] += m[13] * mu */
  114592. "ldr r7, [%[m], #52]\n\t"
  114593. "ldr r10, [%[a], #52]\n\t"
  114594. "mov r4, #0\n\t"
  114595. "umlal r10, r4, r8, r7\n\t"
  114596. "adds r10, r10, r5\n\t"
  114597. "str r10, [%[a], #52]\n\t"
  114598. "adc r4, r4, #0\n\t"
  114599. /* a[i+14] += m[14] * mu */
  114600. "ldr r7, [%[m], #56]\n\t"
  114601. "ldr r10, [%[a], #56]\n\t"
  114602. "mov r5, #0\n\t"
  114603. "umlal r10, r5, r8, r7\n\t"
  114604. "adds r10, r10, r4\n\t"
  114605. "str r10, [%[a], #56]\n\t"
  114606. "adc r5, r5, #0\n\t"
  114607. /* a[i+15] += m[15] * mu */
  114608. "ldr r7, [%[m], #60]\n\t"
  114609. "ldr r10, [%[a], #60]\n\t"
  114610. "mov r4, #0\n\t"
  114611. "umlal r10, r4, r8, r7\n\t"
  114612. "adds r10, r10, r5\n\t"
  114613. "str r10, [%[a], #60]\n\t"
  114614. "adc r4, r4, #0\n\t"
  114615. /* a[i+16] += m[16] * mu */
  114616. "ldr r7, [%[m], #64]\n\t"
  114617. "ldr r10, [%[a], #64]\n\t"
  114618. "umull r6, r7, r8, r7\n\t"
  114619. "adds r4, r4, r6\n\t"
  114620. "adcs r5, r7, r3\n\t"
  114621. "mov r3, #0\n\t"
  114622. "adc r3, r3, r3\n\t"
  114623. "adds r10, r10, r4\n\t"
  114624. "str r10, [%[a], #64]\n\t"
  114625. "ldr r10, [%[a], #68]\n\t"
  114626. "adcs r10, r10, r5\n\t"
  114627. "str r10, [%[a], #68]\n\t"
  114628. "adc r3, r3, #0\n\t"
  114629. /* i += 1 */
  114630. "add r9, r9, #4\n\t"
  114631. "add %[a], %[a], #4\n\t"
  114632. "cmp r9, #0x44\n\t"
  114633. "blt L_sp_521_mont_reduce_order_17_word_%=\n\t"
  114634. /* Loop Done */
  114635. "str r12, [%[a]]\n\t"
  114636. "str lr, [%[a], #4]\n\t"
  114637. "sub %[a], %[a], #4\n\t"
  114638. "ldr r4, [%[a]]\n\t"
  114639. "ldr r5, [%[a], #4]\n\t"
  114640. "lsr r4, r4, #9\n\t"
  114641. "orr r4, r4, r5, lsl #23\n\t"
  114642. "str r4, [%[a], #4]\n\t"
  114643. "ldr r4, [%[a], #8]\n\t"
  114644. "lsr r5, r5, #9\n\t"
  114645. "orr r5, r5, r4, lsl #23\n\t"
  114646. "str r5, [%[a], #8]\n\t"
  114647. "ldr r5, [%[a], #12]\n\t"
  114648. "lsr r4, r4, #9\n\t"
  114649. "orr r4, r4, r5, lsl #23\n\t"
  114650. "str r4, [%[a], #12]\n\t"
  114651. "ldr r4, [%[a], #16]\n\t"
  114652. "lsr r5, r5, #9\n\t"
  114653. "orr r5, r5, r4, lsl #23\n\t"
  114654. "str r5, [%[a], #16]\n\t"
  114655. "ldr r5, [%[a], #20]\n\t"
  114656. "lsr r4, r4, #9\n\t"
  114657. "orr r4, r4, r5, lsl #23\n\t"
  114658. "str r4, [%[a], #20]\n\t"
  114659. "ldr r4, [%[a], #24]\n\t"
  114660. "lsr r5, r5, #9\n\t"
  114661. "orr r5, r5, r4, lsl #23\n\t"
  114662. "str r5, [%[a], #24]\n\t"
  114663. "ldr r5, [%[a], #28]\n\t"
  114664. "lsr r4, r4, #9\n\t"
  114665. "orr r4, r4, r5, lsl #23\n\t"
  114666. "str r4, [%[a], #28]\n\t"
  114667. "ldr r4, [%[a], #32]\n\t"
  114668. "lsr r5, r5, #9\n\t"
  114669. "orr r5, r5, r4, lsl #23\n\t"
  114670. "str r5, [%[a], #32]\n\t"
  114671. "ldr r5, [%[a], #36]\n\t"
  114672. "lsr r4, r4, #9\n\t"
  114673. "orr r4, r4, r5, lsl #23\n\t"
  114674. "str r4, [%[a], #36]\n\t"
  114675. "ldr r4, [%[a], #40]\n\t"
  114676. "lsr r5, r5, #9\n\t"
  114677. "orr r5, r5, r4, lsl #23\n\t"
  114678. "str r5, [%[a], #40]\n\t"
  114679. "ldr r5, [%[a], #44]\n\t"
  114680. "lsr r4, r4, #9\n\t"
  114681. "orr r4, r4, r5, lsl #23\n\t"
  114682. "str r4, [%[a], #44]\n\t"
  114683. "ldr r4, [%[a], #48]\n\t"
  114684. "lsr r5, r5, #9\n\t"
  114685. "orr r5, r5, r4, lsl #23\n\t"
  114686. "str r5, [%[a], #48]\n\t"
  114687. "ldr r5, [%[a], #52]\n\t"
  114688. "lsr r4, r4, #9\n\t"
  114689. "orr r4, r4, r5, lsl #23\n\t"
  114690. "str r4, [%[a], #52]\n\t"
  114691. "ldr r4, [%[a], #56]\n\t"
  114692. "lsr r5, r5, #9\n\t"
  114693. "orr r5, r5, r4, lsl #23\n\t"
  114694. "str r5, [%[a], #56]\n\t"
  114695. "ldr r5, [%[a], #60]\n\t"
  114696. "lsr r4, r4, #9\n\t"
  114697. "orr r4, r4, r5, lsl #23\n\t"
  114698. "str r4, [%[a], #60]\n\t"
  114699. "ldr r4, [%[a], #64]\n\t"
  114700. "lsr r5, r5, #9\n\t"
  114701. "orr r5, r5, r4, lsl #23\n\t"
  114702. "str r5, [%[a], #64]\n\t"
  114703. "lsr r4, r4, #9\n\t"
  114704. "str r4, [%[a], #68]\n\t"
  114705. "lsr r3, r4, #9\n\t"
  114706. "add %[a], %[a], #4\n\t"
  114707. "mov %[mp], r3\n\t"
  114708. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  114709. :
  114710. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  114711. );
  114712. sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp);
  114713. }
  114714. #else
  114715. /* Reduce the number back to 521 bits using Montgomery reduction.
  114716. *
  114717. * a A single precision number to reduce in place.
  114718. * m The single precision number representing the modulus.
  114719. * mp The digit representing the negative inverse of m mod 2^n.
  114720. */
  114721. static SP_NOINLINE void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  114722. {
  114723. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  114724. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  114725. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  114726. __asm__ __volatile__ (
  114727. /* i = 0 */
  114728. "mov r12, #0\n\t"
  114729. "mov lr, #0\n\t"
  114730. "ldr r4, [%[a]]\n\t"
  114731. "ldr r5, [%[a], #4]\n\t"
  114732. "ldr r6, [%[a], #8]\n\t"
  114733. "ldr r7, [%[a], #12]\n\t"
  114734. "ldr r8, [%[a], #16]\n\t"
  114735. "\n"
  114736. "L_sp_521_mont_reduce_order_17_word_%=: \n\t"
  114737. /* mu = a[i] * mp */
  114738. "mul r11, %[mp], r4\n\t"
  114739. "cmp r12, #0x40\n\t"
  114740. "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t"
  114741. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  114742. "mov r10, #0x1\n\t"
  114743. "lsl r10, r10, #8\n\t"
  114744. "add r10, r10, #0xff\n\t"
  114745. #else
  114746. "mov r10, #0x1ff\n\t"
  114747. #endif
  114748. "and r11, r11, r10\n\t"
  114749. "\n"
  114750. "L_sp_521_mont_reduce_order_17_nomask_%=: \n\t"
  114751. /* a[i+0] += m[0] * mu */
  114752. "ldr r10, [%[m]]\n\t"
  114753. "mov r3, #0\n\t"
  114754. "umaal r4, r3, r11, r10\n\t"
  114755. "str r4, [%[a]]\n\t"
  114756. /* a[i+1] += m[1] * mu */
  114757. "ldr r10, [%[m], #4]\n\t"
  114758. "mov r4, r5\n\t"
  114759. "umaal r4, r3, r11, r10\n\t"
  114760. /* a[i+2] += m[2] * mu */
  114761. "ldr r10, [%[m], #8]\n\t"
  114762. "mov r5, r6\n\t"
  114763. "umaal r5, r3, r11, r10\n\t"
  114764. /* a[i+3] += m[3] * mu */
  114765. "ldr r10, [%[m], #12]\n\t"
  114766. "mov r6, r7\n\t"
  114767. "umaal r6, r3, r11, r10\n\t"
  114768. /* a[i+4] += m[4] * mu */
  114769. "ldr r10, [%[m], #16]\n\t"
  114770. "mov r7, r8\n\t"
  114771. "umaal r7, r3, r11, r10\n\t"
  114772. /* a[i+5] += m[5] * mu */
  114773. "ldr r10, [%[m], #20]\n\t"
  114774. "ldr r8, [%[a], #20]\n\t"
  114775. "umaal r8, r3, r11, r10\n\t"
  114776. /* a[i+6] += m[6] * mu */
  114777. "ldr r10, [%[m], #24]\n\t"
  114778. "ldr r9, [%[a], #24]\n\t"
  114779. "umaal r9, r3, r11, r10\n\t"
  114780. "str r9, [%[a], #24]\n\t"
  114781. /* a[i+7] += m[7] * mu */
  114782. "ldr r10, [%[m], #28]\n\t"
  114783. "ldr r9, [%[a], #28]\n\t"
  114784. "umaal r9, r3, r11, r10\n\t"
  114785. "str r9, [%[a], #28]\n\t"
  114786. /* a[i+8] += m[8] * mu */
  114787. "ldr r10, [%[m], #32]\n\t"
  114788. "ldr r9, [%[a], #32]\n\t"
  114789. "umaal r9, r3, r11, r10\n\t"
  114790. "str r9, [%[a], #32]\n\t"
  114791. /* a[i+9] += m[9] * mu */
  114792. "ldr r10, [%[m], #36]\n\t"
  114793. "ldr r9, [%[a], #36]\n\t"
  114794. "umaal r9, r3, r11, r10\n\t"
  114795. "str r9, [%[a], #36]\n\t"
  114796. /* a[i+10] += m[10] * mu */
  114797. "ldr r10, [%[m], #40]\n\t"
  114798. "ldr r9, [%[a], #40]\n\t"
  114799. "umaal r9, r3, r11, r10\n\t"
  114800. "str r9, [%[a], #40]\n\t"
  114801. /* a[i+11] += m[11] * mu */
  114802. "ldr r10, [%[m], #44]\n\t"
  114803. "ldr r9, [%[a], #44]\n\t"
  114804. "umaal r9, r3, r11, r10\n\t"
  114805. "str r9, [%[a], #44]\n\t"
  114806. /* a[i+12] += m[12] * mu */
  114807. "ldr r10, [%[m], #48]\n\t"
  114808. "ldr r9, [%[a], #48]\n\t"
  114809. "umaal r9, r3, r11, r10\n\t"
  114810. "str r9, [%[a], #48]\n\t"
  114811. /* a[i+13] += m[13] * mu */
  114812. "ldr r10, [%[m], #52]\n\t"
  114813. "ldr r9, [%[a], #52]\n\t"
  114814. "umaal r9, r3, r11, r10\n\t"
  114815. "str r9, [%[a], #52]\n\t"
  114816. /* a[i+14] += m[14] * mu */
  114817. "ldr r10, [%[m], #56]\n\t"
  114818. "ldr r9, [%[a], #56]\n\t"
  114819. "umaal r9, r3, r11, r10\n\t"
  114820. "str r9, [%[a], #56]\n\t"
  114821. /* a[i+15] += m[15] * mu */
  114822. "ldr r10, [%[m], #60]\n\t"
  114823. "ldr r9, [%[a], #60]\n\t"
  114824. "umaal r9, r3, r11, r10\n\t"
  114825. "str r9, [%[a], #60]\n\t"
  114826. /* a[i+16] += m[16] * mu */
  114827. "ldr r10, [%[m], #64]\n\t"
  114828. "ldr r9, [%[a], #64]\n\t"
  114829. "umaal r9, r3, r11, r10\n\t"
  114830. "ldr r11, [%[a], #68]\n\t"
  114831. "mov r10, #0\n\t"
  114832. "umaal r3, r11, r10, r10\n\t"
  114833. "str r9, [%[a], #64]\n\t"
  114834. "adds r3, r3, lr\n\t"
  114835. "adc lr, r11, #0\n\t"
  114836. "str r3, [%[a], #68]\n\t"
  114837. /* i += 1 */
  114838. "add r12, r12, #4\n\t"
  114839. "add %[a], %[a], #4\n\t"
  114840. "cmp r12, #0x44\n\t"
  114841. "blt L_sp_521_mont_reduce_order_17_word_%=\n\t"
  114842. /* Loop Done */
  114843. "str r4, [%[a]]\n\t"
  114844. "str r5, [%[a], #4]\n\t"
  114845. "str r6, [%[a], #8]\n\t"
  114846. "str r7, [%[a], #12]\n\t"
  114847. "str r8, [%[a], #16]\n\t"
  114848. "sub %[a], %[a], #4\n\t"
  114849. "ldr r10, [%[a]]\n\t"
  114850. "ldr r3, [%[a], #4]\n\t"
  114851. "lsr r10, r10, #9\n\t"
  114852. "orr r10, r10, r3, lsl #23\n\t"
  114853. "str r10, [%[a], #4]\n\t"
  114854. "ldr r10, [%[a], #8]\n\t"
  114855. "lsr r3, r3, #9\n\t"
  114856. "orr r3, r3, r10, lsl #23\n\t"
  114857. "str r3, [%[a], #8]\n\t"
  114858. "ldr r3, [%[a], #12]\n\t"
  114859. "lsr r10, r10, #9\n\t"
  114860. "orr r10, r10, r3, lsl #23\n\t"
  114861. "str r10, [%[a], #12]\n\t"
  114862. "ldr r10, [%[a], #16]\n\t"
  114863. "lsr r3, r3, #9\n\t"
  114864. "orr r3, r3, r10, lsl #23\n\t"
  114865. "str r3, [%[a], #16]\n\t"
  114866. "ldr r3, [%[a], #20]\n\t"
  114867. "lsr r10, r10, #9\n\t"
  114868. "orr r10, r10, r3, lsl #23\n\t"
  114869. "str r10, [%[a], #20]\n\t"
  114870. "ldr r10, [%[a], #24]\n\t"
  114871. "lsr r3, r3, #9\n\t"
  114872. "orr r3, r3, r10, lsl #23\n\t"
  114873. "str r3, [%[a], #24]\n\t"
  114874. "ldr r3, [%[a], #28]\n\t"
  114875. "lsr r10, r10, #9\n\t"
  114876. "orr r10, r10, r3, lsl #23\n\t"
  114877. "str r10, [%[a], #28]\n\t"
  114878. "ldr r10, [%[a], #32]\n\t"
  114879. "lsr r3, r3, #9\n\t"
  114880. "orr r3, r3, r10, lsl #23\n\t"
  114881. "str r3, [%[a], #32]\n\t"
  114882. "ldr r3, [%[a], #36]\n\t"
  114883. "lsr r10, r10, #9\n\t"
  114884. "orr r10, r10, r3, lsl #23\n\t"
  114885. "str r10, [%[a], #36]\n\t"
  114886. "ldr r10, [%[a], #40]\n\t"
  114887. "lsr r3, r3, #9\n\t"
  114888. "orr r3, r3, r10, lsl #23\n\t"
  114889. "str r3, [%[a], #40]\n\t"
  114890. "ldr r3, [%[a], #44]\n\t"
  114891. "lsr r10, r10, #9\n\t"
  114892. "orr r10, r10, r3, lsl #23\n\t"
  114893. "str r10, [%[a], #44]\n\t"
  114894. "ldr r10, [%[a], #48]\n\t"
  114895. "lsr r3, r3, #9\n\t"
  114896. "orr r3, r3, r10, lsl #23\n\t"
  114897. "str r3, [%[a], #48]\n\t"
  114898. "ldr r3, [%[a], #52]\n\t"
  114899. "lsr r10, r10, #9\n\t"
  114900. "orr r10, r10, r3, lsl #23\n\t"
  114901. "str r10, [%[a], #52]\n\t"
  114902. "ldr r10, [%[a], #56]\n\t"
  114903. "lsr r3, r3, #9\n\t"
  114904. "orr r3, r3, r10, lsl #23\n\t"
  114905. "str r3, [%[a], #56]\n\t"
  114906. "ldr r3, [%[a], #60]\n\t"
  114907. "lsr r10, r10, #9\n\t"
  114908. "orr r10, r10, r3, lsl #23\n\t"
  114909. "str r10, [%[a], #60]\n\t"
  114910. "ldr r10, [%[a], #64]\n\t"
  114911. "lsr r3, r3, #9\n\t"
  114912. "orr r3, r3, r10, lsl #23\n\t"
  114913. "str r3, [%[a], #64]\n\t"
  114914. "lsr r10, r10, #9\n\t"
  114915. "str r10, [%[a], #68]\n\t"
  114916. "lsr lr, r10, #9\n\t"
  114917. "add %[a], %[a], #4\n\t"
  114918. "mov %[mp], lr\n\t"
  114919. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  114920. :
  114921. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  114922. );
  114923. sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp);
  114924. }
  114925. #endif
  114926. /* Multiply two Montgomery form numbers mod the modulus (prime).
  114927. * (r = a * b mod m)
  114928. *
  114929. * r Result of multiplication.
  114930. * a First number to multiply in Montgomery form.
  114931. * b Second number to multiply in Montgomery form.
  114932. * m Modulus (prime).
  114933. * mp Montgomery multiplier.
  114934. */
  114935. SP_NOINLINE static void sp_521_mont_mul_17(sp_digit* r, const sp_digit* a,
  114936. const sp_digit* b, const sp_digit* m, sp_digit mp)
  114937. {
  114938. sp_521_mul_17(r, a, b);
  114939. sp_521_mont_reduce_17(r, m, mp);
  114940. }
  114941. /* Square the Montgomery form number. (r = a * a mod m)
  114942. *
  114943. * r Result of squaring.
  114944. * a Number to square in Montgomery form.
  114945. * m Modulus (prime).
  114946. * mp Montgomery multiplier.
  114947. */
  114948. SP_NOINLINE static void sp_521_mont_sqr_17(sp_digit* r, const sp_digit* a,
  114949. const sp_digit* m, sp_digit mp)
  114950. {
  114951. sp_521_sqr_17(r, a);
  114952. sp_521_mont_reduce_17(r, m, mp);
  114953. }
  114954. #ifndef WOLFSSL_SP_SMALL
  114955. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  114956. *
  114957. * r Result of squaring.
  114958. * a Number to square in Montgomery form.
  114959. * n Number of times to square.
  114960. * m Modulus (prime).
  114961. * mp Montgomery multiplier.
  114962. */
  114963. SP_NOINLINE static void sp_521_mont_sqr_n_17(sp_digit* r,
  114964. const sp_digit* a, int n, const sp_digit* m, sp_digit mp)
  114965. {
  114966. sp_521_mont_sqr_17(r, a, m, mp);
  114967. for (; n > 1; n--) {
  114968. sp_521_mont_sqr_17(r, r, m, mp);
  114969. }
  114970. }
  114971. #endif /* !WOLFSSL_SP_SMALL */
  114972. #ifdef WOLFSSL_SP_SMALL
  114973. /* Mod-2 for the P521 curve. */
  114974. static const uint32_t p521_mod_minus_2[17] = {
  114975. 0xfffffffdU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  114976. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  114977. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  114978. };
  114979. #endif /* !WOLFSSL_SP_SMALL */
  114980. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  114981. * P521 curve. (r = 1 / a mod m)
  114982. *
  114983. * r Inverse result.
  114984. * a Number to invert.
  114985. * td Temporary data.
  114986. */
  114987. static void sp_521_mont_inv_17(sp_digit* r, const sp_digit* a, sp_digit* td)
  114988. {
  114989. #ifdef WOLFSSL_SP_SMALL
  114990. sp_digit* t = td;
  114991. int i;
  114992. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  114993. for (i=519; i>=0; i--) {
  114994. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  114995. if (p521_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  114996. sp_521_mont_mul_17(t, t, a, p521_mod, p521_mp_mod);
  114997. }
  114998. XMEMCPY(r, t, sizeof(sp_digit) * 17);
  114999. #else
  115000. sp_digit* t1 = td;
  115001. sp_digit* t2 = td + 2 * 17;
  115002. sp_digit* t3 = td + 4 * 17;
  115003. /* 0x2 */
  115004. sp_521_mont_sqr_17(t1, a, p521_mod, p521_mp_mod);
  115005. /* 0x3 */
  115006. sp_521_mont_mul_17(t2, t1, a, p521_mod, p521_mp_mod);
  115007. /* 0x6 */
  115008. sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod);
  115009. /* 0x7 */
  115010. sp_521_mont_mul_17(t3, t1, a, p521_mod, p521_mp_mod);
  115011. /* 0xc */
  115012. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  115013. /* 0xf */
  115014. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115015. /* 0x78 */
  115016. sp_521_mont_sqr_n_17(t1, t2, 3, p521_mod, p521_mp_mod);
  115017. /* 0x7f */
  115018. sp_521_mont_mul_17(t3, t3, t1, p521_mod, p521_mp_mod);
  115019. /* 0xf0 */
  115020. sp_521_mont_sqr_n_17(t1, t2, 4, p521_mod, p521_mp_mod);
  115021. /* 0xff */
  115022. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115023. /* 0xff00 */
  115024. sp_521_mont_sqr_n_17(t1, t2, 8, p521_mod, p521_mp_mod);
  115025. /* 0xffff */
  115026. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115027. /* 0xffff0000 */
  115028. sp_521_mont_sqr_n_17(t1, t2, 16, p521_mod, p521_mp_mod);
  115029. /* 0xffffffff */
  115030. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115031. /* 0xffffffff00000000 */
  115032. sp_521_mont_sqr_n_17(t1, t2, 32, p521_mod, p521_mp_mod);
  115033. /* 0xffffffffffffffff */
  115034. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115035. /* 0xffffffffffffffff0000000000000000 */
  115036. sp_521_mont_sqr_n_17(t1, t2, 64, p521_mod, p521_mp_mod);
  115037. /* 0xffffffffffffffffffffffffffffffff */
  115038. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115039. /* 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000 */
  115040. sp_521_mont_sqr_n_17(t1, t2, 128, p521_mod, p521_mp_mod);
  115041. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  115042. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115043. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000 */
  115044. sp_521_mont_sqr_n_17(t1, t2, 256, p521_mod, p521_mp_mod);
  115045. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  115046. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  115047. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80 */
  115048. sp_521_mont_sqr_n_17(t1, t2, 7, p521_mod, p521_mp_mod);
  115049. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  115050. sp_521_mont_mul_17(t2, t3, t1, p521_mod, p521_mp_mod);
  115051. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc */
  115052. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  115053. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd */
  115054. sp_521_mont_mul_17(r, t1, a, p521_mod, p521_mp_mod);
  115055. #endif /* WOLFSSL_SP_SMALL */
  115056. }
  115057. /* Compare a with b in constant time.
  115058. *
  115059. * a A single precision integer.
  115060. * b A single precision integer.
  115061. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  115062. * respectively.
  115063. */
  115064. static sp_int32 sp_521_cmp_17(const sp_digit* a_p, const sp_digit* b_p)
  115065. {
  115066. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  115067. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  115068. __asm__ __volatile__ (
  115069. "mov r2, #-1\n\t"
  115070. "mov r6, #1\n\t"
  115071. "mov r5, #0\n\t"
  115072. "mov r3, #-1\n\t"
  115073. #ifdef WOLFSSL_SP_SMALL
  115074. "mov r4, #0x40\n\t"
  115075. "\n"
  115076. "L_sp_521_cmp_17_words_%=: \n\t"
  115077. "ldr r12, [%[a], r4]\n\t"
  115078. "ldr lr, [%[b], r4]\n\t"
  115079. "and r12, r12, r3\n\t"
  115080. "and lr, lr, r3\n\t"
  115081. "subs r12, r12, lr\n\t"
  115082. "it hi\n\t"
  115083. "movhi r2, r6\n\t"
  115084. "it lo\n\t"
  115085. "movlo r2, r3\n\t"
  115086. "it ne\n\t"
  115087. "movne r3, r5\n\t"
  115088. "subs r4, r4, #4\n\t"
  115089. "bcs L_sp_521_cmp_17_words_%=\n\t"
  115090. "eor r2, r2, r3\n\t"
  115091. #else
  115092. "ldr r12, [%[a], #64]\n\t"
  115093. "ldr lr, [%[b], #64]\n\t"
  115094. "and r12, r12, r3\n\t"
  115095. "and lr, lr, r3\n\t"
  115096. "subs r12, r12, lr\n\t"
  115097. "it hi\n\t"
  115098. "movhi r2, r6\n\t"
  115099. "it lo\n\t"
  115100. "movlo r2, r3\n\t"
  115101. "it ne\n\t"
  115102. "movne r3, r5\n\t"
  115103. "ldr r12, [%[a], #60]\n\t"
  115104. "ldr lr, [%[b], #60]\n\t"
  115105. "and r12, r12, r3\n\t"
  115106. "and lr, lr, r3\n\t"
  115107. "subs r12, r12, lr\n\t"
  115108. "it hi\n\t"
  115109. "movhi r2, r6\n\t"
  115110. "it lo\n\t"
  115111. "movlo r2, r3\n\t"
  115112. "it ne\n\t"
  115113. "movne r3, r5\n\t"
  115114. "ldr r12, [%[a], #56]\n\t"
  115115. "ldr lr, [%[b], #56]\n\t"
  115116. "and r12, r12, r3\n\t"
  115117. "and lr, lr, r3\n\t"
  115118. "subs r12, r12, lr\n\t"
  115119. "it hi\n\t"
  115120. "movhi r2, r6\n\t"
  115121. "it lo\n\t"
  115122. "movlo r2, r3\n\t"
  115123. "it ne\n\t"
  115124. "movne r3, r5\n\t"
  115125. "ldr r12, [%[a], #52]\n\t"
  115126. "ldr lr, [%[b], #52]\n\t"
  115127. "and r12, r12, r3\n\t"
  115128. "and lr, lr, r3\n\t"
  115129. "subs r12, r12, lr\n\t"
  115130. "it hi\n\t"
  115131. "movhi r2, r6\n\t"
  115132. "it lo\n\t"
  115133. "movlo r2, r3\n\t"
  115134. "it ne\n\t"
  115135. "movne r3, r5\n\t"
  115136. "ldr r12, [%[a], #48]\n\t"
  115137. "ldr lr, [%[b], #48]\n\t"
  115138. "and r12, r12, r3\n\t"
  115139. "and lr, lr, r3\n\t"
  115140. "subs r12, r12, lr\n\t"
  115141. "it hi\n\t"
  115142. "movhi r2, r6\n\t"
  115143. "it lo\n\t"
  115144. "movlo r2, r3\n\t"
  115145. "it ne\n\t"
  115146. "movne r3, r5\n\t"
  115147. "ldr r12, [%[a], #44]\n\t"
  115148. "ldr lr, [%[b], #44]\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], #40]\n\t"
  115159. "ldr lr, [%[b], #40]\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], #36]\n\t"
  115170. "ldr lr, [%[b], #36]\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], #32]\n\t"
  115181. "ldr lr, [%[b], #32]\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], #28]\n\t"
  115192. "ldr lr, [%[b], #28]\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], #24]\n\t"
  115203. "ldr lr, [%[b], #24]\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], #20]\n\t"
  115214. "ldr lr, [%[b], #20]\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], #16]\n\t"
  115225. "ldr lr, [%[b], #16]\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], #12]\n\t"
  115236. "ldr lr, [%[b], #12]\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], #8]\n\t"
  115247. "ldr lr, [%[b], #8]\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], #4]\n\t"
  115258. "ldr lr, [%[b], #4]\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]]\n\t"
  115269. "ldr lr, [%[b]]\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. "eor r2, r2, r3\n\t"
  115280. #endif /*WOLFSSL_SP_SMALL */
  115281. "mov %[a], r2\n\t"
  115282. : [a] "+r" (a), [b] "+r" (b)
  115283. :
  115284. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  115285. );
  115286. return (uint32_t)(size_t)a;
  115287. }
  115288. /* Normalize the values in each word to 32.
  115289. *
  115290. * a Array of sp_digit to normalize.
  115291. */
  115292. #define sp_521_norm_17(a)
  115293. /* Map the Montgomery form projective coordinate point to an affine point.
  115294. *
  115295. * r Resulting affine coordinate point.
  115296. * p Montgomery form projective coordinate point.
  115297. * t Temporary ordinate data.
  115298. */
  115299. static void sp_521_map_17(sp_point_521* r, const sp_point_521* p,
  115300. sp_digit* t)
  115301. {
  115302. sp_digit* t1 = t;
  115303. sp_digit* t2 = t + 2*17;
  115304. sp_int32 n;
  115305. sp_521_mont_inv_17(t1, p->z, t + 2*17);
  115306. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  115307. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  115308. /* x /= z^2 */
  115309. sp_521_mont_mul_17(r->x, p->x, t2, p521_mod, p521_mp_mod);
  115310. XMEMSET(r->x + 17, 0, sizeof(sp_digit) * 17U);
  115311. sp_521_mont_reduce_17(r->x, p521_mod, p521_mp_mod);
  115312. /* Reduce x to less than modulus */
  115313. n = sp_521_cmp_17(r->x, p521_mod);
  115314. sp_521_cond_sub_17(r->x, r->x, p521_mod, (sp_digit)~(n >> 31));
  115315. sp_521_norm_17(r->x);
  115316. /* y /= z^3 */
  115317. sp_521_mont_mul_17(r->y, p->y, t1, p521_mod, p521_mp_mod);
  115318. XMEMSET(r->y + 17, 0, sizeof(sp_digit) * 17U);
  115319. sp_521_mont_reduce_17(r->y, p521_mod, p521_mp_mod);
  115320. /* Reduce y to less than modulus */
  115321. n = sp_521_cmp_17(r->y, p521_mod);
  115322. sp_521_cond_sub_17(r->y, r->y, p521_mod, (sp_digit)~(n >> 31));
  115323. sp_521_norm_17(r->y);
  115324. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  115325. r->z[0] = 1;
  115326. }
  115327. /* Add two Montgomery form numbers (r = a + b % m).
  115328. *
  115329. * r Result of addition.
  115330. * a First number to add in Montgomery form.
  115331. * b Second number to add in Montgomery form.
  115332. * m Modulus (prime).
  115333. */
  115334. 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)
  115335. {
  115336. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  115337. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  115338. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  115339. __asm__ __volatile__ (
  115340. "mov r3, #0\n\t"
  115341. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115342. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115343. "adds r8, r8, r4\n\t"
  115344. "adcs r9, r9, r5\n\t"
  115345. "adcs r10, r10, r6\n\t"
  115346. "adcs r11, r11, r7\n\t"
  115347. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115348. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115349. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115350. "adcs r8, r8, r4\n\t"
  115351. "adcs r9, r9, r5\n\t"
  115352. "adcs r10, r10, r6\n\t"
  115353. "adcs r11, r11, r7\n\t"
  115354. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115355. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115356. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115357. "adcs r8, r8, r4\n\t"
  115358. "adcs r9, r9, r5\n\t"
  115359. "adcs r10, r10, r6\n\t"
  115360. "adcs r11, r11, r7\n\t"
  115361. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115362. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115363. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115364. "adcs r8, r8, r4\n\t"
  115365. "adcs r9, r9, r5\n\t"
  115366. "adcs r10, r10, r6\n\t"
  115367. "adcs r11, r11, r7\n\t"
  115368. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115369. "ldm %[a]!, {r8}\n\t"
  115370. "ldm %[b]!, {r4}\n\t"
  115371. "adcs r8, r8, r4\n\t"
  115372. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  115373. "mov r12, #0x1\n\t"
  115374. "lsl r12, r12, #8\n\t"
  115375. "add r12, r12, #0xff\n\t"
  115376. #else
  115377. "mov r12, #0x1ff\n\t"
  115378. #endif
  115379. "lsr r3, r8, #9\n\t"
  115380. "and r8, r8, r12\n\t"
  115381. "stm %[r]!, {r8}\n\t"
  115382. "sub %[r], %[r], #0x44\n\t"
  115383. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115384. "adds r4, r4, r3\n\t"
  115385. "adcs r5, r5, #0\n\t"
  115386. "adcs r6, r6, #0\n\t"
  115387. "adcs r7, r7, #0\n\t"
  115388. "adcs r8, r8, #0\n\t"
  115389. "adcs r9, r9, #0\n\t"
  115390. "adcs r10, r10, #0\n\t"
  115391. "adcs r11, r11, #0\n\t"
  115392. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115393. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115394. "adcs r4, r4, #0\n\t"
  115395. "adcs r5, r5, #0\n\t"
  115396. "adcs r6, r6, #0\n\t"
  115397. "adcs r7, r7, #0\n\t"
  115398. "adcs r8, r8, #0\n\t"
  115399. "adcs r9, r9, #0\n\t"
  115400. "adcs r10, r10, #0\n\t"
  115401. "adcs r11, r11, #0\n\t"
  115402. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115403. "ldm %[r], {r4}\n\t"
  115404. "adcs r4, r4, #0\n\t"
  115405. "stm %[r]!, {r4}\n\t"
  115406. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  115407. :
  115408. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  115409. );
  115410. (void)m_p;
  115411. }
  115412. /* Double a Montgomery form number (r = a + a % m).
  115413. *
  115414. * r Result of doubling.
  115415. * a Number to double in Montgomery form.
  115416. * m Modulus (prime).
  115417. */
  115418. static void sp_521_mont_dbl_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  115419. {
  115420. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  115421. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  115422. __asm__ __volatile__ (
  115423. "mov r2, #0\n\t"
  115424. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115425. "adds r4, r4, r4\n\t"
  115426. "adcs r5, r5, r5\n\t"
  115427. "adcs r6, r6, r6\n\t"
  115428. "adcs r7, r7, r7\n\t"
  115429. "adcs r8, r8, r8\n\t"
  115430. "adcs r9, r9, r9\n\t"
  115431. "adcs r10, r10, r10\n\t"
  115432. "adcs r11, r11, r11\n\t"
  115433. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115434. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115435. "adcs r4, r4, r4\n\t"
  115436. "adcs r5, r5, r5\n\t"
  115437. "adcs r6, r6, r6\n\t"
  115438. "adcs r7, r7, r7\n\t"
  115439. "adcs r8, r8, r8\n\t"
  115440. "adcs r9, r9, r9\n\t"
  115441. "adcs r10, r10, r10\n\t"
  115442. "adcs r11, r11, r11\n\t"
  115443. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115444. "ldm %[a]!, {r4}\n\t"
  115445. "adcs r4, r4, r4\n\t"
  115446. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  115447. "mov r3, #0x1\n\t"
  115448. "lsl r3, r3, #8\n\t"
  115449. "add r3, r3, #0xff\n\t"
  115450. #else
  115451. "mov r3, #0x1ff\n\t"
  115452. #endif
  115453. "lsr r2, r4, #9\n\t"
  115454. "and r4, r4, r3\n\t"
  115455. "stm %[r]!, {r4}\n\t"
  115456. "sub %[r], %[r], #0x44\n\t"
  115457. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115458. "adds r4, r4, r2\n\t"
  115459. "adcs r5, r5, #0\n\t"
  115460. "adcs r6, r6, #0\n\t"
  115461. "adcs r7, r7, #0\n\t"
  115462. "adcs r8, r8, #0\n\t"
  115463. "adcs r9, r9, #0\n\t"
  115464. "adcs r10, r10, #0\n\t"
  115465. "adcs r11, r11, #0\n\t"
  115466. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115467. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115468. "adcs r4, r4, #0\n\t"
  115469. "adcs r5, r5, #0\n\t"
  115470. "adcs r6, r6, #0\n\t"
  115471. "adcs r7, r7, #0\n\t"
  115472. "adcs r8, r8, #0\n\t"
  115473. "adcs r9, r9, #0\n\t"
  115474. "adcs r10, r10, #0\n\t"
  115475. "adcs r11, r11, #0\n\t"
  115476. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115477. "ldm %[r], {r4}\n\t"
  115478. "adcs r4, r4, #0\n\t"
  115479. "stm %[r]!, {r4}\n\t"
  115480. : [r] "+r" (r), [a] "+r" (a)
  115481. :
  115482. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "cc"
  115483. );
  115484. (void)m_p;
  115485. }
  115486. /* Triple a Montgomery form number (r = a + a + a % m).
  115487. *
  115488. * r Result of Tripling.
  115489. * a Number to triple in Montgomery form.
  115490. * m Modulus (prime).
  115491. */
  115492. static void sp_521_mont_tpl_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  115493. {
  115494. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  115495. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  115496. __asm__ __volatile__ (
  115497. "mov r2, #0\n\t"
  115498. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115499. "adds r4, r4, r4\n\t"
  115500. "adcs r5, r5, r5\n\t"
  115501. "adcs r6, r6, r6\n\t"
  115502. "adcs r7, r7, r7\n\t"
  115503. "adcs r8, r8, r8\n\t"
  115504. "adcs r9, r9, r9\n\t"
  115505. "adcs r10, r10, r10\n\t"
  115506. "adcs r11, r11, r11\n\t"
  115507. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115508. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115509. "adcs r4, r4, r4\n\t"
  115510. "adcs r5, r5, r5\n\t"
  115511. "adcs r6, r6, r6\n\t"
  115512. "adcs r7, r7, r7\n\t"
  115513. "adcs r8, r8, r8\n\t"
  115514. "adcs r9, r9, r9\n\t"
  115515. "adcs r10, r10, r10\n\t"
  115516. "adcs r11, r11, r11\n\t"
  115517. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115518. "ldm %[a]!, {r4}\n\t"
  115519. "adcs r4, r4, r4\n\t"
  115520. "stm %[r]!, {r4}\n\t"
  115521. "sub %[r], %[r], #0x44\n\t"
  115522. "sub %[a], %[a], #0x44\n\t"
  115523. "ldm %[r], {r4, r5, r6, r7}\n\t"
  115524. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115525. "adds r4, r4, r8\n\t"
  115526. "adcs r5, r5, r9\n\t"
  115527. "adcs r6, r6, r10\n\t"
  115528. "adcs r7, r7, r11\n\t"
  115529. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  115530. "ldm %[r], {r4, r5, r6, r7}\n\t"
  115531. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115532. "adcs r4, r4, r8\n\t"
  115533. "adcs r5, r5, r9\n\t"
  115534. "adcs r6, r6, r10\n\t"
  115535. "adcs r7, r7, r11\n\t"
  115536. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  115537. "ldm %[r], {r4, r5, r6, r7}\n\t"
  115538. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115539. "adcs r4, r4, r8\n\t"
  115540. "adcs r5, r5, r9\n\t"
  115541. "adcs r6, r6, r10\n\t"
  115542. "adcs r7, r7, r11\n\t"
  115543. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  115544. "ldm %[r], {r4, r5, r6, r7}\n\t"
  115545. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115546. "adcs r4, r4, r8\n\t"
  115547. "adcs r5, r5, r9\n\t"
  115548. "adcs r6, r6, r10\n\t"
  115549. "adcs r7, r7, r11\n\t"
  115550. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  115551. "ldm %[r], {r4}\n\t"
  115552. "ldm %[a]!, {r8}\n\t"
  115553. "adcs r4, r4, r8\n\t"
  115554. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  115555. "mov r3, #0x1\n\t"
  115556. "lsl r3, r3, #8\n\t"
  115557. "add r3, r3, #0xff\n\t"
  115558. #else
  115559. "mov r3, #0x1ff\n\t"
  115560. #endif
  115561. "lsr r2, r4, #9\n\t"
  115562. "and r4, r4, r3\n\t"
  115563. "stm %[r]!, {r4}\n\t"
  115564. "sub %[r], %[r], #0x44\n\t"
  115565. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115566. "adds r4, r4, r2\n\t"
  115567. "adcs r4, r4, #0\n\t"
  115568. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115569. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115570. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115571. "ldm %[r], {r4}\n\t"
  115572. "adcs r4, r4, #0\n\t"
  115573. "stm %[r]!, {r4}\n\t"
  115574. : [r] "+r" (r), [a] "+r" (a)
  115575. :
  115576. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "cc"
  115577. );
  115578. (void)m_p;
  115579. }
  115580. /* Subtract two Montgomery form numbers (r = a - b % m).
  115581. *
  115582. * r Result of subtration.
  115583. * a Number to subtract from in Montgomery form.
  115584. * b Number to subtract with in Montgomery form.
  115585. * m Modulus (prime).
  115586. */
  115587. 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)
  115588. {
  115589. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  115590. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  115591. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  115592. __asm__ __volatile__ (
  115593. "mov r3, #0\n\t"
  115594. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115595. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115596. "subs r8, r8, r4\n\t"
  115597. "sbcs r9, r9, r5\n\t"
  115598. "sbcs r10, r10, r6\n\t"
  115599. "sbcs r11, r11, r7\n\t"
  115600. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115601. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115602. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115603. "sbcs r8, r8, r4\n\t"
  115604. "sbcs r9, r9, r5\n\t"
  115605. "sbcs r10, r10, r6\n\t"
  115606. "sbcs r11, r11, r7\n\t"
  115607. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115608. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115609. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115610. "sbcs r8, r8, r4\n\t"
  115611. "sbcs r9, r9, r5\n\t"
  115612. "sbcs r10, r10, r6\n\t"
  115613. "sbcs r11, r11, r7\n\t"
  115614. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115615. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  115616. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  115617. "sbcs r8, r8, r4\n\t"
  115618. "sbcs r9, r9, r5\n\t"
  115619. "sbcs r10, r10, r6\n\t"
  115620. "sbcs r11, r11, r7\n\t"
  115621. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  115622. "ldm %[a]!, {r8}\n\t"
  115623. "ldm %[b]!, {r4}\n\t"
  115624. "sbcs r8, r8, r4\n\t"
  115625. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  115626. "mov r12, #0x1\n\t"
  115627. "lsl r12, r12, #8\n\t"
  115628. "add r12, r12, #0xff\n\t"
  115629. #else
  115630. "mov r12, #0x1ff\n\t"
  115631. #endif
  115632. "asr r3, r8, #9\n\t"
  115633. "and r8, r8, r12\n\t"
  115634. "neg r3, r3\n\t"
  115635. "stm %[r]!, {r8}\n\t"
  115636. "sub %[r], %[r], #0x44\n\t"
  115637. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115638. "subs r4, r4, r3\n\t"
  115639. "sbcs r5, r5, #0\n\t"
  115640. "sbcs r6, r6, #0\n\t"
  115641. "sbcs r7, r7, #0\n\t"
  115642. "sbcs r8, r8, #0\n\t"
  115643. "sbcs r9, r9, #0\n\t"
  115644. "sbcs r10, r10, #0\n\t"
  115645. "sbcs r11, r11, #0\n\t"
  115646. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115647. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115648. "sbcs r4, r4, #0\n\t"
  115649. "sbcs r5, r5, #0\n\t"
  115650. "sbcs r6, r6, #0\n\t"
  115651. "sbcs r7, r7, #0\n\t"
  115652. "sbcs r8, r8, #0\n\t"
  115653. "sbcs r9, r9, #0\n\t"
  115654. "sbcs r10, r10, #0\n\t"
  115655. "sbcs r11, r11, #0\n\t"
  115656. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  115657. "ldm %[r], {r4}\n\t"
  115658. "sbcs r4, r4, #0\n\t"
  115659. "stm %[r]!, {r4}\n\t"
  115660. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  115661. :
  115662. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  115663. );
  115664. (void)m_p;
  115665. }
  115666. static void sp_521_rshift1_17(sp_digit* r_p, const sp_digit* a_p)
  115667. {
  115668. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  115669. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  115670. __asm__ __volatile__ (
  115671. "ldm %[a], {r2, r3}\n\t"
  115672. "lsr r2, r2, #1\n\t"
  115673. "orr r2, r2, r3, lsl #31\n\t"
  115674. "lsr r3, r3, #1\n\t"
  115675. "ldr r4, [%[a], #8]\n\t"
  115676. "str r2, [%[r]]\n\t"
  115677. "orr r3, r3, r4, lsl #31\n\t"
  115678. "lsr r4, r4, #1\n\t"
  115679. "ldr r2, [%[a], #12]\n\t"
  115680. "str r3, [%[r], #4]\n\t"
  115681. "orr r4, r4, r2, lsl #31\n\t"
  115682. "lsr r2, r2, #1\n\t"
  115683. "ldr r3, [%[a], #16]\n\t"
  115684. "str r4, [%[r], #8]\n\t"
  115685. "orr r2, r2, r3, lsl #31\n\t"
  115686. "lsr r3, r3, #1\n\t"
  115687. "ldr r4, [%[a], #20]\n\t"
  115688. "str r2, [%[r], #12]\n\t"
  115689. "orr r3, r3, r4, lsl #31\n\t"
  115690. "lsr r4, r4, #1\n\t"
  115691. "ldr r2, [%[a], #24]\n\t"
  115692. "str r3, [%[r], #16]\n\t"
  115693. "orr r4, r4, r2, lsl #31\n\t"
  115694. "lsr r2, r2, #1\n\t"
  115695. "ldr r3, [%[a], #28]\n\t"
  115696. "str r4, [%[r], #20]\n\t"
  115697. "orr r2, r2, r3, lsl #31\n\t"
  115698. "lsr r3, r3, #1\n\t"
  115699. "ldr r4, [%[a], #32]\n\t"
  115700. "str r2, [%[r], #24]\n\t"
  115701. "orr r3, r3, r4, lsl #31\n\t"
  115702. "lsr r4, r4, #1\n\t"
  115703. "ldr r2, [%[a], #36]\n\t"
  115704. "str r3, [%[r], #28]\n\t"
  115705. "orr r4, r4, r2, lsl #31\n\t"
  115706. "lsr r2, r2, #1\n\t"
  115707. "ldr r3, [%[a], #40]\n\t"
  115708. "str r4, [%[r], #32]\n\t"
  115709. "orr r2, r2, r3, lsl #31\n\t"
  115710. "lsr r3, r3, #1\n\t"
  115711. "ldr r4, [%[a], #44]\n\t"
  115712. "str r2, [%[r], #36]\n\t"
  115713. "orr r3, r3, r4, lsl #31\n\t"
  115714. "lsr r4, r4, #1\n\t"
  115715. "ldr r2, [%[a], #48]\n\t"
  115716. "str r3, [%[r], #40]\n\t"
  115717. "orr r4, r4, r2, lsl #31\n\t"
  115718. "lsr r2, r2, #1\n\t"
  115719. "ldr r3, [%[a], #52]\n\t"
  115720. "str r4, [%[r], #44]\n\t"
  115721. "orr r2, r2, r3, lsl #31\n\t"
  115722. "lsr r3, r3, #1\n\t"
  115723. "ldr r4, [%[a], #56]\n\t"
  115724. "str r2, [%[r], #48]\n\t"
  115725. "orr r3, r3, r4, lsl #31\n\t"
  115726. "lsr r4, r4, #1\n\t"
  115727. "ldr r2, [%[a], #60]\n\t"
  115728. "str r3, [%[r], #52]\n\t"
  115729. "orr r4, r4, r2, lsl #31\n\t"
  115730. "lsr r2, r2, #1\n\t"
  115731. "ldr r3, [%[a], #64]\n\t"
  115732. "str r4, [%[r], #56]\n\t"
  115733. "orr r2, r2, r3, lsl #31\n\t"
  115734. "lsr r3, r3, #1\n\t"
  115735. "str r2, [%[r], #60]\n\t"
  115736. "str r3, [%[r], #64]\n\t"
  115737. : [r] "+r" (r), [a] "+r" (a)
  115738. :
  115739. : "memory", "r2", "r3", "r4", "cc"
  115740. );
  115741. }
  115742. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  115743. *
  115744. * r Result of division by 2.
  115745. * a Number to divide.
  115746. * m Modulus (prime).
  115747. */
  115748. static void sp_521_mont_div2_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  115749. {
  115750. sp_digit o = a[0] & 1;
  115751. (void)m;
  115752. sp_521_rshift1_17(r, r);
  115753. r[16] |= o << 8;
  115754. }
  115755. /* Double the Montgomery form projective point p.
  115756. *
  115757. * r Result of doubling point.
  115758. * p Point to double.
  115759. * t Temporary ordinate data.
  115760. */
  115761. static void sp_521_proj_point_dbl_17(sp_point_521* r, const sp_point_521* p,
  115762. sp_digit* t)
  115763. {
  115764. sp_digit* t1 = t;
  115765. sp_digit* t2 = t + 2*17;
  115766. sp_digit* x;
  115767. sp_digit* y;
  115768. sp_digit* z;
  115769. x = r->x;
  115770. y = r->y;
  115771. z = r->z;
  115772. /* Put infinity into result. */
  115773. if (r != p) {
  115774. r->infinity = p->infinity;
  115775. }
  115776. /* T1 = Z * Z */
  115777. sp_521_mont_sqr_17(t1, p->z, p521_mod, p521_mp_mod);
  115778. /* Z = Y * Z */
  115779. sp_521_mont_mul_17(z, p->y, p->z, p521_mod, p521_mp_mod);
  115780. /* Z = 2Z */
  115781. sp_521_mont_dbl_17(z, z, p521_mod);
  115782. /* T2 = X - T1 */
  115783. sp_521_mont_sub_17(t2, p->x, t1, p521_mod);
  115784. /* T1 = X + T1 */
  115785. sp_521_mont_add_17(t1, p->x, t1, p521_mod);
  115786. /* T2 = T1 * T2 */
  115787. sp_521_mont_mul_17(t2, t1, t2, p521_mod, p521_mp_mod);
  115788. /* T1 = 3T2 */
  115789. sp_521_mont_tpl_17(t1, t2, p521_mod);
  115790. /* Y = 2Y */
  115791. sp_521_mont_dbl_17(y, p->y, p521_mod);
  115792. /* Y = Y * Y */
  115793. sp_521_mont_sqr_17(y, y, p521_mod, p521_mp_mod);
  115794. /* T2 = Y * Y */
  115795. sp_521_mont_sqr_17(t2, y, p521_mod, p521_mp_mod);
  115796. /* T2 = T2/2 */
  115797. sp_521_mont_div2_17(t2, t2, p521_mod);
  115798. /* Y = Y * X */
  115799. sp_521_mont_mul_17(y, y, p->x, p521_mod, p521_mp_mod);
  115800. /* X = T1 * T1 */
  115801. sp_521_mont_sqr_17(x, t1, p521_mod, p521_mp_mod);
  115802. /* X = X - Y */
  115803. sp_521_mont_sub_17(x, x, y, p521_mod);
  115804. /* X = X - Y */
  115805. sp_521_mont_sub_17(x, x, y, p521_mod);
  115806. /* Y = Y - X */
  115807. sp_521_mont_sub_17(y, y, x, p521_mod);
  115808. /* Y = Y * T1 */
  115809. sp_521_mont_mul_17(y, y, t1, p521_mod, p521_mp_mod);
  115810. /* Y = Y - T2 */
  115811. sp_521_mont_sub_17(y, y, t2, p521_mod);
  115812. }
  115813. #ifdef WOLFSSL_SP_NONBLOCK
  115814. typedef struct sp_521_proj_point_dbl_17_ctx {
  115815. int state;
  115816. sp_digit* t1;
  115817. sp_digit* t2;
  115818. sp_digit* x;
  115819. sp_digit* y;
  115820. sp_digit* z;
  115821. } sp_521_proj_point_dbl_17_ctx;
  115822. /* Double the Montgomery form projective point p.
  115823. *
  115824. * r Result of doubling point.
  115825. * p Point to double.
  115826. * t Temporary ordinate data.
  115827. */
  115828. static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r,
  115829. const sp_point_521* p, sp_digit* t)
  115830. {
  115831. int err = FP_WOULDBLOCK;
  115832. sp_521_proj_point_dbl_17_ctx* ctx = (sp_521_proj_point_dbl_17_ctx*)sp_ctx->data;
  115833. typedef char ctx_size_test[sizeof(sp_521_proj_point_dbl_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  115834. (void)sizeof(ctx_size_test);
  115835. switch (ctx->state) {
  115836. case 0:
  115837. ctx->t1 = t;
  115838. ctx->t2 = t + 2*17;
  115839. ctx->x = r->x;
  115840. ctx->y = r->y;
  115841. ctx->z = r->z;
  115842. /* Put infinity into result. */
  115843. if (r != p) {
  115844. r->infinity = p->infinity;
  115845. }
  115846. ctx->state = 1;
  115847. break;
  115848. case 1:
  115849. /* T1 = Z * Z */
  115850. sp_521_mont_sqr_17(ctx->t1, p->z, p521_mod, p521_mp_mod);
  115851. ctx->state = 2;
  115852. break;
  115853. case 2:
  115854. /* Z = Y * Z */
  115855. sp_521_mont_mul_17(ctx->z, p->y, p->z, p521_mod, p521_mp_mod);
  115856. ctx->state = 3;
  115857. break;
  115858. case 3:
  115859. /* Z = 2Z */
  115860. sp_521_mont_dbl_17(ctx->z, ctx->z, p521_mod);
  115861. ctx->state = 4;
  115862. break;
  115863. case 4:
  115864. /* T2 = X - T1 */
  115865. sp_521_mont_sub_17(ctx->t2, p->x, ctx->t1, p521_mod);
  115866. ctx->state = 5;
  115867. break;
  115868. case 5:
  115869. /* T1 = X + T1 */
  115870. sp_521_mont_add_17(ctx->t1, p->x, ctx->t1, p521_mod);
  115871. ctx->state = 6;
  115872. break;
  115873. case 6:
  115874. /* T2 = T1 * T2 */
  115875. sp_521_mont_mul_17(ctx->t2, ctx->t1, ctx->t2, p521_mod, p521_mp_mod);
  115876. ctx->state = 7;
  115877. break;
  115878. case 7:
  115879. /* T1 = 3T2 */
  115880. sp_521_mont_tpl_17(ctx->t1, ctx->t2, p521_mod);
  115881. ctx->state = 8;
  115882. break;
  115883. case 8:
  115884. /* Y = 2Y */
  115885. sp_521_mont_dbl_17(ctx->y, p->y, p521_mod);
  115886. ctx->state = 9;
  115887. break;
  115888. case 9:
  115889. /* Y = Y * Y */
  115890. sp_521_mont_sqr_17(ctx->y, ctx->y, p521_mod, p521_mp_mod);
  115891. ctx->state = 10;
  115892. break;
  115893. case 10:
  115894. /* T2 = Y * Y */
  115895. sp_521_mont_sqr_17(ctx->t2, ctx->y, p521_mod, p521_mp_mod);
  115896. ctx->state = 11;
  115897. break;
  115898. case 11:
  115899. /* T2 = T2/2 */
  115900. sp_521_mont_div2_17(ctx->t2, ctx->t2, p521_mod);
  115901. ctx->state = 12;
  115902. break;
  115903. case 12:
  115904. /* Y = Y * X */
  115905. sp_521_mont_mul_17(ctx->y, ctx->y, p->x, p521_mod, p521_mp_mod);
  115906. ctx->state = 13;
  115907. break;
  115908. case 13:
  115909. /* X = T1 * T1 */
  115910. sp_521_mont_sqr_17(ctx->x, ctx->t1, p521_mod, p521_mp_mod);
  115911. ctx->state = 14;
  115912. break;
  115913. case 14:
  115914. /* X = X - Y */
  115915. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  115916. ctx->state = 15;
  115917. break;
  115918. case 15:
  115919. /* X = X - Y */
  115920. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  115921. ctx->state = 16;
  115922. break;
  115923. case 16:
  115924. /* Y = Y - X */
  115925. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod);
  115926. ctx->state = 17;
  115927. break;
  115928. case 17:
  115929. /* Y = Y * T1 */
  115930. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t1, p521_mod, p521_mp_mod);
  115931. ctx->state = 18;
  115932. break;
  115933. case 18:
  115934. /* Y = Y - T2 */
  115935. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t2, p521_mod);
  115936. ctx->state = 19;
  115937. /* fall-through */
  115938. case 19:
  115939. err = MP_OKAY;
  115940. break;
  115941. }
  115942. if (err == MP_OKAY && ctx->state != 19) {
  115943. err = FP_WOULDBLOCK;
  115944. }
  115945. return err;
  115946. }
  115947. #endif /* WOLFSSL_SP_NONBLOCK */
  115948. /* Compare two numbers to determine if they are equal.
  115949. * Constant time implementation.
  115950. *
  115951. * a First number to compare.
  115952. * b Second number to compare.
  115953. * returns 1 when equal and 0 otherwise.
  115954. */
  115955. static int sp_521_cmp_equal_17(const sp_digit* a, const sp_digit* b)
  115956. {
  115957. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  115958. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  115959. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  115960. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  115961. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  115962. (a[15] ^ b[15]) | (a[16] ^ b[16])) == 0;
  115963. }
  115964. /* Returns 1 if the number of zero.
  115965. * Implementation is constant time.
  115966. *
  115967. * a Number to check.
  115968. * returns 1 if the number is zero and 0 otherwise.
  115969. */
  115970. static int sp_521_iszero_17(const sp_digit* a)
  115971. {
  115972. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  115973. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  115974. a[16]) == 0;
  115975. }
  115976. /* Add two Montgomery form projective points.
  115977. *
  115978. * r Result of addition.
  115979. * p First point to add.
  115980. * q Second point to add.
  115981. * t Temporary ordinate data.
  115982. */
  115983. static void sp_521_proj_point_add_17(sp_point_521* r,
  115984. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  115985. {
  115986. sp_digit* t6 = t;
  115987. sp_digit* t1 = t + 2*17;
  115988. sp_digit* t2 = t + 4*17;
  115989. sp_digit* t3 = t + 6*17;
  115990. sp_digit* t4 = t + 8*17;
  115991. sp_digit* t5 = t + 10*17;
  115992. /* U1 = X1*Z2^2 */
  115993. sp_521_mont_sqr_17(t1, q->z, p521_mod, p521_mp_mod);
  115994. sp_521_mont_mul_17(t3, t1, q->z, p521_mod, p521_mp_mod);
  115995. sp_521_mont_mul_17(t1, t1, p->x, p521_mod, p521_mp_mod);
  115996. /* U2 = X2*Z1^2 */
  115997. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  115998. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  115999. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  116000. /* S1 = Y1*Z2^3 */
  116001. sp_521_mont_mul_17(t3, t3, p->y, p521_mod, p521_mp_mod);
  116002. /* S2 = Y2*Z1^3 */
  116003. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  116004. /* Check double */
  116005. if ((~p->infinity) & (~q->infinity) &
  116006. sp_521_cmp_equal_17(t2, t1) &
  116007. sp_521_cmp_equal_17(t4, t3)) {
  116008. sp_521_proj_point_dbl_17(r, p, t);
  116009. }
  116010. else {
  116011. sp_digit* x = t6;
  116012. sp_digit* y = t1;
  116013. sp_digit* z = t2;
  116014. /* H = U2 - U1 */
  116015. sp_521_mont_sub_17(t2, t2, t1, p521_mod);
  116016. /* R = S2 - S1 */
  116017. sp_521_mont_sub_17(t4, t4, t3, p521_mod);
  116018. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  116019. sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod);
  116020. sp_521_mont_mul_17(y, t1, t5, p521_mod, p521_mp_mod);
  116021. sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod);
  116022. /* Z3 = H*Z1*Z2 */
  116023. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  116024. sp_521_mont_mul_17(z, z, q->z, p521_mod, p521_mp_mod);
  116025. sp_521_mont_sqr_17(x, t4, p521_mod, p521_mp_mod);
  116026. sp_521_mont_sub_17(x, x, t5, p521_mod);
  116027. sp_521_mont_mul_17(t5, t5, t3, p521_mod, p521_mp_mod);
  116028. sp_521_mont_dbl_17(t3, y, p521_mod);
  116029. sp_521_mont_sub_17(x, x, t3, p521_mod);
  116030. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  116031. sp_521_mont_sub_17(y, y, x, p521_mod);
  116032. sp_521_mont_mul_17(y, y, t4, p521_mod, p521_mp_mod);
  116033. sp_521_mont_sub_17(y, y, t5, p521_mod);
  116034. {
  116035. int i;
  116036. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  116037. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  116038. sp_digit maskt = ~(maskp | maskq);
  116039. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  116040. for (i = 0; i < 17; i++) {
  116041. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  116042. (x[i] & maskt);
  116043. }
  116044. for (i = 0; i < 17; i++) {
  116045. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  116046. (y[i] & maskt);
  116047. }
  116048. for (i = 0; i < 17; i++) {
  116049. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  116050. (z[i] & maskt);
  116051. }
  116052. r->z[0] |= inf;
  116053. r->infinity = (int)inf;
  116054. }
  116055. }
  116056. }
  116057. #ifdef WOLFSSL_SP_NONBLOCK
  116058. typedef struct sp_521_proj_point_add_17_ctx {
  116059. int state;
  116060. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  116061. const sp_point_521* ap[2];
  116062. sp_point_521* rp[2];
  116063. sp_digit* t1;
  116064. sp_digit* t2;
  116065. sp_digit* t3;
  116066. sp_digit* t4;
  116067. sp_digit* t5;
  116068. sp_digit* t6;
  116069. sp_digit* x;
  116070. sp_digit* y;
  116071. sp_digit* z;
  116072. } sp_521_proj_point_add_17_ctx;
  116073. /* Add two Montgomery form projective points.
  116074. *
  116075. * r Result of addition.
  116076. * p First point to add.
  116077. * q Second point to add.
  116078. * t Temporary ordinate data.
  116079. */
  116080. static int sp_521_proj_point_add_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r,
  116081. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  116082. {
  116083. int err = FP_WOULDBLOCK;
  116084. sp_521_proj_point_add_17_ctx* ctx = (sp_521_proj_point_add_17_ctx*)sp_ctx->data;
  116085. /* Ensure only the first point is the same as the result. */
  116086. if (q == r) {
  116087. const sp_point_521* a = p;
  116088. p = q;
  116089. q = a;
  116090. }
  116091. typedef char ctx_size_test[sizeof(sp_521_proj_point_add_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  116092. (void)sizeof(ctx_size_test);
  116093. switch (ctx->state) {
  116094. case 0: /* INIT */
  116095. ctx->t6 = t;
  116096. ctx->t1 = t + 2*17;
  116097. ctx->t2 = t + 4*17;
  116098. ctx->t3 = t + 6*17;
  116099. ctx->t4 = t + 8*17;
  116100. ctx->t5 = t + 10*17;
  116101. ctx->x = ctx->t6;
  116102. ctx->y = ctx->t1;
  116103. ctx->z = ctx->t2;
  116104. ctx->state = 1;
  116105. break;
  116106. case 1:
  116107. /* U1 = X1*Z2^2 */
  116108. sp_521_mont_sqr_17(ctx->t1, q->z, p521_mod, p521_mp_mod);
  116109. ctx->state = 2;
  116110. break;
  116111. case 2:
  116112. sp_521_mont_mul_17(ctx->t3, ctx->t1, q->z, p521_mod, p521_mp_mod);
  116113. ctx->state = 3;
  116114. break;
  116115. case 3:
  116116. sp_521_mont_mul_17(ctx->t1, ctx->t1, p->x, p521_mod, p521_mp_mod);
  116117. ctx->state = 4;
  116118. break;
  116119. case 4:
  116120. /* U2 = X2*Z1^2 */
  116121. sp_521_mont_sqr_17(ctx->t2, p->z, p521_mod, p521_mp_mod);
  116122. ctx->state = 5;
  116123. break;
  116124. case 5:
  116125. sp_521_mont_mul_17(ctx->t4, ctx->t2, p->z, p521_mod, p521_mp_mod);
  116126. ctx->state = 6;
  116127. break;
  116128. case 6:
  116129. sp_521_mont_mul_17(ctx->t2, ctx->t2, q->x, p521_mod, p521_mp_mod);
  116130. ctx->state = 7;
  116131. break;
  116132. case 7:
  116133. /* S1 = Y1*Z2^3 */
  116134. sp_521_mont_mul_17(ctx->t3, ctx->t3, p->y, p521_mod, p521_mp_mod);
  116135. ctx->state = 8;
  116136. break;
  116137. case 8:
  116138. /* S2 = Y2*Z1^3 */
  116139. sp_521_mont_mul_17(ctx->t4, ctx->t4, q->y, p521_mod, p521_mp_mod);
  116140. ctx->state = 9;
  116141. break;
  116142. case 9:
  116143. /* Check double */
  116144. if ((~p->infinity) & (~q->infinity) &
  116145. sp_521_cmp_equal_17(ctx->t2, ctx->t1) &
  116146. sp_521_cmp_equal_17(ctx->t4, ctx->t3)) {
  116147. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  116148. sp_521_proj_point_dbl_17(r, p, t);
  116149. ctx->state = 25;
  116150. }
  116151. else {
  116152. ctx->state = 10;
  116153. }
  116154. break;
  116155. case 10:
  116156. /* H = U2 - U1 */
  116157. sp_521_mont_sub_17(ctx->t2, ctx->t2, ctx->t1, p521_mod);
  116158. ctx->state = 11;
  116159. break;
  116160. case 11:
  116161. /* R = S2 - S1 */
  116162. sp_521_mont_sub_17(ctx->t4, ctx->t4, ctx->t3, p521_mod);
  116163. ctx->state = 12;
  116164. break;
  116165. case 12:
  116166. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  116167. sp_521_mont_sqr_17(ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  116168. ctx->state = 13;
  116169. break;
  116170. case 13:
  116171. sp_521_mont_mul_17(ctx->y, ctx->t1, ctx->t5, p521_mod, p521_mp_mod);
  116172. ctx->state = 14;
  116173. break;
  116174. case 14:
  116175. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  116176. ctx->state = 15;
  116177. break;
  116178. case 15:
  116179. /* Z3 = H*Z1*Z2 */
  116180. sp_521_mont_mul_17(ctx->z, p->z, ctx->t2, p521_mod, p521_mp_mod);
  116181. ctx->state = 16;
  116182. break;
  116183. case 16:
  116184. sp_521_mont_mul_17(ctx->z, ctx->z, q->z, p521_mod, p521_mp_mod);
  116185. ctx->state = 17;
  116186. break;
  116187. case 17:
  116188. sp_521_mont_sqr_17(ctx->x, ctx->t4, p521_mod, p521_mp_mod);
  116189. ctx->state = 18;
  116190. break;
  116191. case 18:
  116192. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t5, p521_mod);
  116193. ctx->state = 19;
  116194. break;
  116195. case 19:
  116196. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t3, p521_mod, p521_mp_mod);
  116197. ctx->state = 20;
  116198. break;
  116199. case 20:
  116200. sp_521_mont_dbl_17(ctx->t3, ctx->y, p521_mod);
  116201. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t3, p521_mod);
  116202. ctx->state = 21;
  116203. break;
  116204. case 21:
  116205. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  116206. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod);
  116207. ctx->state = 22;
  116208. break;
  116209. case 22:
  116210. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t4, p521_mod, p521_mp_mod);
  116211. ctx->state = 23;
  116212. break;
  116213. case 23:
  116214. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t5, p521_mod);
  116215. ctx->state = 24;
  116216. break;
  116217. case 24:
  116218. {
  116219. {
  116220. int i;
  116221. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  116222. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  116223. sp_digit maskt = ~(maskp | maskq);
  116224. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  116225. for (i = 0; i < 17; i++) {
  116226. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  116227. (ctx->x[i] & maskt);
  116228. }
  116229. for (i = 0; i < 17; i++) {
  116230. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  116231. (ctx->y[i] & maskt);
  116232. }
  116233. for (i = 0; i < 17; i++) {
  116234. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  116235. (ctx->z[i] & maskt);
  116236. }
  116237. r->z[0] |= inf;
  116238. r->infinity = (int)inf;
  116239. }
  116240. ctx->state = 25;
  116241. break;
  116242. }
  116243. case 25:
  116244. err = MP_OKAY;
  116245. break;
  116246. }
  116247. if (err == MP_OKAY && ctx->state != 25) {
  116248. err = FP_WOULDBLOCK;
  116249. }
  116250. return err;
  116251. }
  116252. #endif /* WOLFSSL_SP_NONBLOCK */
  116253. #ifndef WC_NO_CACHE_RESISTANT
  116254. /* Touch each possible point that could be being copied.
  116255. *
  116256. * r Point to copy into.
  116257. * table Table - start of the entries to access
  116258. * idx Index of entry to retrieve.
  116259. */
  116260. static void sp_521_get_point_16_17(sp_point_521* r, const sp_point_521* table,
  116261. int idx)
  116262. {
  116263. int i;
  116264. sp_digit mask;
  116265. r->x[0] = 0;
  116266. r->x[1] = 0;
  116267. r->x[2] = 0;
  116268. r->x[3] = 0;
  116269. r->x[4] = 0;
  116270. r->x[5] = 0;
  116271. r->x[6] = 0;
  116272. r->x[7] = 0;
  116273. r->x[8] = 0;
  116274. r->x[9] = 0;
  116275. r->x[10] = 0;
  116276. r->x[11] = 0;
  116277. r->x[12] = 0;
  116278. r->x[13] = 0;
  116279. r->x[14] = 0;
  116280. r->x[15] = 0;
  116281. r->x[16] = 0;
  116282. r->y[0] = 0;
  116283. r->y[1] = 0;
  116284. r->y[2] = 0;
  116285. r->y[3] = 0;
  116286. r->y[4] = 0;
  116287. r->y[5] = 0;
  116288. r->y[6] = 0;
  116289. r->y[7] = 0;
  116290. r->y[8] = 0;
  116291. r->y[9] = 0;
  116292. r->y[10] = 0;
  116293. r->y[11] = 0;
  116294. r->y[12] = 0;
  116295. r->y[13] = 0;
  116296. r->y[14] = 0;
  116297. r->y[15] = 0;
  116298. r->y[16] = 0;
  116299. r->z[0] = 0;
  116300. r->z[1] = 0;
  116301. r->z[2] = 0;
  116302. r->z[3] = 0;
  116303. r->z[4] = 0;
  116304. r->z[5] = 0;
  116305. r->z[6] = 0;
  116306. r->z[7] = 0;
  116307. r->z[8] = 0;
  116308. r->z[9] = 0;
  116309. r->z[10] = 0;
  116310. r->z[11] = 0;
  116311. r->z[12] = 0;
  116312. r->z[13] = 0;
  116313. r->z[14] = 0;
  116314. r->z[15] = 0;
  116315. r->z[16] = 0;
  116316. for (i = 1; i < 16; i++) {
  116317. mask = (sp_digit)0 - (i == idx);
  116318. r->x[0] |= mask & table[i].x[0];
  116319. r->x[1] |= mask & table[i].x[1];
  116320. r->x[2] |= mask & table[i].x[2];
  116321. r->x[3] |= mask & table[i].x[3];
  116322. r->x[4] |= mask & table[i].x[4];
  116323. r->x[5] |= mask & table[i].x[5];
  116324. r->x[6] |= mask & table[i].x[6];
  116325. r->x[7] |= mask & table[i].x[7];
  116326. r->x[8] |= mask & table[i].x[8];
  116327. r->x[9] |= mask & table[i].x[9];
  116328. r->x[10] |= mask & table[i].x[10];
  116329. r->x[11] |= mask & table[i].x[11];
  116330. r->x[12] |= mask & table[i].x[12];
  116331. r->x[13] |= mask & table[i].x[13];
  116332. r->x[14] |= mask & table[i].x[14];
  116333. r->x[15] |= mask & table[i].x[15];
  116334. r->x[16] |= mask & table[i].x[16];
  116335. r->y[0] |= mask & table[i].y[0];
  116336. r->y[1] |= mask & table[i].y[1];
  116337. r->y[2] |= mask & table[i].y[2];
  116338. r->y[3] |= mask & table[i].y[3];
  116339. r->y[4] |= mask & table[i].y[4];
  116340. r->y[5] |= mask & table[i].y[5];
  116341. r->y[6] |= mask & table[i].y[6];
  116342. r->y[7] |= mask & table[i].y[7];
  116343. r->y[8] |= mask & table[i].y[8];
  116344. r->y[9] |= mask & table[i].y[9];
  116345. r->y[10] |= mask & table[i].y[10];
  116346. r->y[11] |= mask & table[i].y[11];
  116347. r->y[12] |= mask & table[i].y[12];
  116348. r->y[13] |= mask & table[i].y[13];
  116349. r->y[14] |= mask & table[i].y[14];
  116350. r->y[15] |= mask & table[i].y[15];
  116351. r->y[16] |= mask & table[i].y[16];
  116352. r->z[0] |= mask & table[i].z[0];
  116353. r->z[1] |= mask & table[i].z[1];
  116354. r->z[2] |= mask & table[i].z[2];
  116355. r->z[3] |= mask & table[i].z[3];
  116356. r->z[4] |= mask & table[i].z[4];
  116357. r->z[5] |= mask & table[i].z[5];
  116358. r->z[6] |= mask & table[i].z[6];
  116359. r->z[7] |= mask & table[i].z[7];
  116360. r->z[8] |= mask & table[i].z[8];
  116361. r->z[9] |= mask & table[i].z[9];
  116362. r->z[10] |= mask & table[i].z[10];
  116363. r->z[11] |= mask & table[i].z[11];
  116364. r->z[12] |= mask & table[i].z[12];
  116365. r->z[13] |= mask & table[i].z[13];
  116366. r->z[14] |= mask & table[i].z[14];
  116367. r->z[15] |= mask & table[i].z[15];
  116368. r->z[16] |= mask & table[i].z[16];
  116369. }
  116370. }
  116371. #endif /* !WC_NO_CACHE_RESISTANT */
  116372. /* Multiply the point by the scalar and return the result.
  116373. * If map is true then convert result to affine coordinates.
  116374. *
  116375. * Fast implementation that generates a pre-computation table.
  116376. * 4 bits of window (no sliding!).
  116377. * Uses add and double for calculating table.
  116378. * 521 doubles.
  116379. * 143 adds.
  116380. *
  116381. * r Resulting point.
  116382. * g Point to multiply.
  116383. * k Scalar to multiply by.
  116384. * map Indicates whether to convert result to affine.
  116385. * ct Constant time required.
  116386. * heap Heap to use for allocation.
  116387. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  116388. */
  116389. static int sp_521_ecc_mulmod_fast_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  116390. int map, int ct, void* heap)
  116391. {
  116392. #ifdef WOLFSSL_SP_SMALL_STACK
  116393. sp_point_521* t = NULL;
  116394. sp_digit* tmp = NULL;
  116395. #else
  116396. sp_point_521 t[16 + 1];
  116397. sp_digit tmp[2 * 17 * 6];
  116398. #endif
  116399. sp_point_521* rt = NULL;
  116400. #ifndef WC_NO_CACHE_RESISTANT
  116401. #ifdef WOLFSSL_SP_SMALL_STACK
  116402. sp_point_521* p = NULL;
  116403. #else
  116404. sp_point_521 p[1];
  116405. #endif
  116406. #endif /* !WC_NO_CACHE_RESISTANT */
  116407. sp_digit n;
  116408. int i;
  116409. int c;
  116410. int y;
  116411. int err = MP_OKAY;
  116412. /* Constant time used for cache attack resistance implementation. */
  116413. (void)ct;
  116414. (void)heap;
  116415. #ifdef WOLFSSL_SP_SMALL_STACK
  116416. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (16 + 1),
  116417. heap, DYNAMIC_TYPE_ECC);
  116418. if (t == NULL)
  116419. err = MEMORY_E;
  116420. #ifndef WC_NO_CACHE_RESISTANT
  116421. if (err == MP_OKAY) {
  116422. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521),
  116423. heap, DYNAMIC_TYPE_ECC);
  116424. if (p == NULL)
  116425. err = MEMORY_E;
  116426. }
  116427. #endif
  116428. if (err == MP_OKAY) {
  116429. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  116430. DYNAMIC_TYPE_ECC);
  116431. if (tmp == NULL)
  116432. err = MEMORY_E;
  116433. }
  116434. #endif
  116435. if (err == MP_OKAY) {
  116436. rt = t + 16;
  116437. /* t[0] = {0, 0, 1} * norm */
  116438. XMEMSET(&t[0], 0, sizeof(t[0]));
  116439. t[0].infinity = 1;
  116440. /* t[1] = {g->x, g->y, g->z} * norm */
  116441. (void)sp_521_mod_mul_norm_17(t[1].x, g->x, p521_mod);
  116442. (void)sp_521_mod_mul_norm_17(t[1].y, g->y, p521_mod);
  116443. (void)sp_521_mod_mul_norm_17(t[1].z, g->z, p521_mod);
  116444. t[1].infinity = 0;
  116445. sp_521_proj_point_dbl_17(&t[ 2], &t[ 1], tmp);
  116446. t[ 2].infinity = 0;
  116447. sp_521_proj_point_add_17(&t[ 3], &t[ 2], &t[ 1], tmp);
  116448. t[ 3].infinity = 0;
  116449. sp_521_proj_point_dbl_17(&t[ 4], &t[ 2], tmp);
  116450. t[ 4].infinity = 0;
  116451. sp_521_proj_point_add_17(&t[ 5], &t[ 3], &t[ 2], tmp);
  116452. t[ 5].infinity = 0;
  116453. sp_521_proj_point_dbl_17(&t[ 6], &t[ 3], tmp);
  116454. t[ 6].infinity = 0;
  116455. sp_521_proj_point_add_17(&t[ 7], &t[ 4], &t[ 3], tmp);
  116456. t[ 7].infinity = 0;
  116457. sp_521_proj_point_dbl_17(&t[ 8], &t[ 4], tmp);
  116458. t[ 8].infinity = 0;
  116459. sp_521_proj_point_add_17(&t[ 9], &t[ 5], &t[ 4], tmp);
  116460. t[ 9].infinity = 0;
  116461. sp_521_proj_point_dbl_17(&t[10], &t[ 5], tmp);
  116462. t[10].infinity = 0;
  116463. sp_521_proj_point_add_17(&t[11], &t[ 6], &t[ 5], tmp);
  116464. t[11].infinity = 0;
  116465. sp_521_proj_point_dbl_17(&t[12], &t[ 6], tmp);
  116466. t[12].infinity = 0;
  116467. sp_521_proj_point_add_17(&t[13], &t[ 7], &t[ 6], tmp);
  116468. t[13].infinity = 0;
  116469. sp_521_proj_point_dbl_17(&t[14], &t[ 7], tmp);
  116470. t[14].infinity = 0;
  116471. sp_521_proj_point_add_17(&t[15], &t[ 8], &t[ 7], tmp);
  116472. t[15].infinity = 0;
  116473. i = 15;
  116474. n = k[i+1] << 0;
  116475. c = 5;
  116476. y = (int)(n >> 5);
  116477. #ifndef WC_NO_CACHE_RESISTANT
  116478. if (ct) {
  116479. sp_521_get_point_16_17(rt, t, y);
  116480. rt->infinity = !y;
  116481. }
  116482. else
  116483. #endif
  116484. {
  116485. XMEMCPY(rt, &t[y], sizeof(sp_point_521));
  116486. }
  116487. n <<= 27;
  116488. for (; i>=0 || c>=4; ) {
  116489. if (c < 4) {
  116490. n = (k[i+1] << 31) | (k[i] >> 1);
  116491. i--;
  116492. c += 32;
  116493. }
  116494. y = (n >> 28) & 0xf;
  116495. n <<= 4;
  116496. c -= 4;
  116497. sp_521_proj_point_dbl_17(rt, rt, tmp);
  116498. sp_521_proj_point_dbl_17(rt, rt, tmp);
  116499. sp_521_proj_point_dbl_17(rt, rt, tmp);
  116500. sp_521_proj_point_dbl_17(rt, rt, tmp);
  116501. #ifndef WC_NO_CACHE_RESISTANT
  116502. if (ct) {
  116503. sp_521_get_point_16_17(p, t, y);
  116504. p->infinity = !y;
  116505. sp_521_proj_point_add_17(rt, rt, p, tmp);
  116506. }
  116507. else
  116508. #endif
  116509. {
  116510. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  116511. }
  116512. }
  116513. y = k[0] & 0x1;
  116514. sp_521_proj_point_dbl_17(rt, rt, tmp);
  116515. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  116516. if (map != 0) {
  116517. sp_521_map_17(r, rt, tmp);
  116518. }
  116519. else {
  116520. XMEMCPY(r, rt, sizeof(sp_point_521));
  116521. }
  116522. }
  116523. #ifdef WOLFSSL_SP_SMALL_STACK
  116524. if (tmp != NULL)
  116525. #endif
  116526. {
  116527. ForceZero(tmp, sizeof(sp_digit) * 2 * 17 * 6);
  116528. #ifdef WOLFSSL_SP_SMALL_STACK
  116529. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  116530. #endif
  116531. }
  116532. #ifndef WC_NO_CACHE_RESISTANT
  116533. #ifdef WOLFSSL_SP_SMALL_STACK
  116534. if (p != NULL)
  116535. #endif
  116536. {
  116537. ForceZero(p, sizeof(sp_point_521));
  116538. #ifdef WOLFSSL_SP_SMALL_STACK
  116539. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  116540. #endif
  116541. }
  116542. #endif /* !WC_NO_CACHE_RESISTANT */
  116543. #ifdef WOLFSSL_SP_SMALL_STACK
  116544. if (t != NULL)
  116545. #endif
  116546. {
  116547. ForceZero(t, sizeof(sp_point_521) * 17);
  116548. #ifdef WOLFSSL_SP_SMALL_STACK
  116549. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  116550. #endif
  116551. }
  116552. return err;
  116553. }
  116554. #ifdef FP_ECC
  116555. /* Double the Montgomery form projective point p a number of times.
  116556. *
  116557. * r Result of repeated doubling of point.
  116558. * p Point to double.
  116559. * n Number of times to double
  116560. * t Temporary ordinate data.
  116561. */
  116562. static void sp_521_proj_point_dbl_n_17(sp_point_521* p, int i,
  116563. sp_digit* t)
  116564. {
  116565. sp_digit* w = t;
  116566. sp_digit* a = t + 2*17;
  116567. sp_digit* b = t + 4*17;
  116568. sp_digit* t1 = t + 6*17;
  116569. sp_digit* t2 = t + 8*17;
  116570. sp_digit* x;
  116571. sp_digit* y;
  116572. sp_digit* z;
  116573. volatile int n = i;
  116574. x = p->x;
  116575. y = p->y;
  116576. z = p->z;
  116577. /* Y = 2*Y */
  116578. sp_521_mont_dbl_17(y, y, p521_mod);
  116579. /* W = Z^4 */
  116580. sp_521_mont_sqr_17(w, z, p521_mod, p521_mp_mod);
  116581. sp_521_mont_sqr_17(w, w, p521_mod, p521_mp_mod);
  116582. #ifndef WOLFSSL_SP_SMALL
  116583. while (--n > 0)
  116584. #else
  116585. while (--n >= 0)
  116586. #endif
  116587. {
  116588. /* A = 3*(X^2 - W) */
  116589. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  116590. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  116591. sp_521_mont_tpl_17(a, t1, p521_mod);
  116592. /* B = X*Y^2 */
  116593. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  116594. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  116595. /* X = A^2 - 2B */
  116596. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  116597. sp_521_mont_dbl_17(t2, b, p521_mod);
  116598. sp_521_mont_sub_17(x, x, t2, p521_mod);
  116599. /* B = 2.(B - X) */
  116600. sp_521_mont_sub_17(t2, b, x, p521_mod);
  116601. sp_521_mont_dbl_17(b, t2, p521_mod);
  116602. /* Z = Z*Y */
  116603. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  116604. /* t1 = Y^4 */
  116605. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  116606. #ifdef WOLFSSL_SP_SMALL
  116607. if (n != 0)
  116608. #endif
  116609. {
  116610. /* W = W*Y^4 */
  116611. sp_521_mont_mul_17(w, w, t1, p521_mod, p521_mp_mod);
  116612. }
  116613. /* y = 2*A*(B - X) - Y^4 */
  116614. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  116615. sp_521_mont_sub_17(y, y, t1, p521_mod);
  116616. }
  116617. #ifndef WOLFSSL_SP_SMALL
  116618. /* A = 3*(X^2 - W) */
  116619. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  116620. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  116621. sp_521_mont_tpl_17(a, t1, p521_mod);
  116622. /* B = X*Y^2 */
  116623. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  116624. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  116625. /* X = A^2 - 2B */
  116626. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  116627. sp_521_mont_dbl_17(t2, b, p521_mod);
  116628. sp_521_mont_sub_17(x, x, t2, p521_mod);
  116629. /* B = 2.(B - X) */
  116630. sp_521_mont_sub_17(t2, b, x, p521_mod);
  116631. sp_521_mont_dbl_17(b, t2, p521_mod);
  116632. /* Z = Z*Y */
  116633. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  116634. /* t1 = Y^4 */
  116635. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  116636. /* y = 2*A*(B - X) - Y^4 */
  116637. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  116638. sp_521_mont_sub_17(y, y, t1, p521_mod);
  116639. #endif /* WOLFSSL_SP_SMALL */
  116640. /* Y = Y/2 */
  116641. sp_521_mont_div2_17(y, y, p521_mod);
  116642. }
  116643. /* Convert the projective point to affine.
  116644. * Ordinates are in Montgomery form.
  116645. *
  116646. * a Point to convert.
  116647. * t Temporary data.
  116648. */
  116649. static void sp_521_proj_to_affine_17(sp_point_521* a, sp_digit* t)
  116650. {
  116651. sp_digit* t1 = t;
  116652. sp_digit* t2 = t + 2 * 17;
  116653. sp_digit* tmp = t + 4 * 17;
  116654. sp_521_mont_inv_17(t1, a->z, tmp);
  116655. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  116656. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  116657. sp_521_mont_mul_17(a->x, a->x, t2, p521_mod, p521_mp_mod);
  116658. sp_521_mont_mul_17(a->y, a->y, t1, p521_mod, p521_mp_mod);
  116659. XMEMCPY(a->z, p521_norm_mod, sizeof(p521_norm_mod));
  116660. }
  116661. #endif /* FP_ECC */
  116662. /* A table entry for pre-computed points. */
  116663. typedef struct sp_table_entry_521 {
  116664. sp_digit x[17];
  116665. sp_digit y[17];
  116666. } sp_table_entry_521;
  116667. #ifdef FP_ECC
  116668. #endif /* FP_ECC */
  116669. /* Add two Montgomery form projective points. The second point has a q value of
  116670. * one.
  116671. * Only the first point can be the same pointer as the result point.
  116672. *
  116673. * r Result of addition.
  116674. * p First point to add.
  116675. * q Second point to add.
  116676. * t Temporary ordinate data.
  116677. */
  116678. static void sp_521_proj_point_add_qz1_17(sp_point_521* r,
  116679. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  116680. {
  116681. sp_digit* t2 = t;
  116682. sp_digit* t3 = t + 2*17;
  116683. sp_digit* t6 = t + 4*17;
  116684. sp_digit* t1 = t + 6*17;
  116685. sp_digit* t4 = t + 8*17;
  116686. sp_digit* t5 = t + 10*17;
  116687. /* Calculate values to subtract from P->x and P->y. */
  116688. /* U2 = X2*Z1^2 */
  116689. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  116690. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  116691. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  116692. /* S2 = Y2*Z1^3 */
  116693. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  116694. if ((~p->infinity) & (~q->infinity) &
  116695. sp_521_cmp_equal_17(p->x, t2) &
  116696. sp_521_cmp_equal_17(p->y, t4)) {
  116697. sp_521_proj_point_dbl_17(r, p, t);
  116698. }
  116699. else {
  116700. sp_digit* x = t2;
  116701. sp_digit* y = t3;
  116702. sp_digit* z = t6;
  116703. /* H = U2 - X1 */
  116704. sp_521_mont_sub_17(t2, t2, p->x, p521_mod);
  116705. /* R = S2 - Y1 */
  116706. sp_521_mont_sub_17(t4, t4, p->y, p521_mod);
  116707. /* Z3 = H*Z1 */
  116708. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  116709. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  116710. sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod);
  116711. sp_521_mont_mul_17(t3, p->x, t1, p521_mod, p521_mp_mod);
  116712. sp_521_mont_mul_17(t1, t1, t2, p521_mod, p521_mp_mod);
  116713. sp_521_mont_sqr_17(t2, t4, p521_mod, p521_mp_mod);
  116714. sp_521_mont_sub_17(t2, t2, t1, p521_mod);
  116715. sp_521_mont_dbl_17(t5, t3, p521_mod);
  116716. sp_521_mont_sub_17(x, t2, t5, p521_mod);
  116717. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  116718. sp_521_mont_sub_17(t3, t3, x, p521_mod);
  116719. sp_521_mont_mul_17(t3, t3, t4, p521_mod, p521_mp_mod);
  116720. sp_521_mont_mul_17(t1, t1, p->y, p521_mod, p521_mp_mod);
  116721. sp_521_mont_sub_17(y, t3, t1, p521_mod);
  116722. {
  116723. int i;
  116724. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  116725. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  116726. sp_digit maskt = ~(maskp | maskq);
  116727. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  116728. for (i = 0; i < 17; i++) {
  116729. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  116730. (x[i] & maskt);
  116731. }
  116732. for (i = 0; i < 17; i++) {
  116733. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  116734. (y[i] & maskt);
  116735. }
  116736. for (i = 0; i < 17; i++) {
  116737. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  116738. (z[i] & maskt);
  116739. }
  116740. r->z[0] |= inf;
  116741. r->infinity = (int)inf;
  116742. }
  116743. }
  116744. }
  116745. #ifdef WOLFSSL_SP_SMALL
  116746. #ifdef FP_ECC
  116747. /* Generate the pre-computed table of points for the base point.
  116748. *
  116749. * width = 4
  116750. * 16 entries
  116751. * 130 bits between
  116752. *
  116753. * a The base point.
  116754. * table Place to store generated point data.
  116755. * tmp Temporary data.
  116756. * heap Heap to use for allocation.
  116757. */
  116758. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  116759. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  116760. {
  116761. #ifdef WOLFSSL_SP_SMALL_STACK
  116762. sp_point_521* t = NULL;
  116763. #else
  116764. sp_point_521 t[3];
  116765. #endif
  116766. sp_point_521* s1 = NULL;
  116767. sp_point_521* s2 = NULL;
  116768. int i;
  116769. int j;
  116770. int err = MP_OKAY;
  116771. (void)heap;
  116772. #ifdef WOLFSSL_SP_SMALL_STACK
  116773. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  116774. DYNAMIC_TYPE_ECC);
  116775. if (t == NULL)
  116776. err = MEMORY_E;
  116777. #endif
  116778. if (err == MP_OKAY) {
  116779. s1 = t + 1;
  116780. s2 = t + 2;
  116781. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  116782. }
  116783. if (err == MP_OKAY) {
  116784. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  116785. }
  116786. if (err == MP_OKAY) {
  116787. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  116788. }
  116789. if (err == MP_OKAY) {
  116790. t->infinity = 0;
  116791. sp_521_proj_to_affine_17(t, tmp);
  116792. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  116793. s1->infinity = 0;
  116794. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  116795. s2->infinity = 0;
  116796. /* table[0] = {0, 0, infinity} */
  116797. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  116798. /* table[1] = Affine version of 'a' in Montgomery form */
  116799. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  116800. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  116801. for (i=1; i<4; i++) {
  116802. sp_521_proj_point_dbl_n_17(t, 131, tmp);
  116803. sp_521_proj_to_affine_17(t, tmp);
  116804. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  116805. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  116806. }
  116807. for (i=1; i<4; i++) {
  116808. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  116809. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  116810. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  116811. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  116812. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  116813. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  116814. sp_521_proj_to_affine_17(t, tmp);
  116815. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  116816. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  116817. }
  116818. }
  116819. }
  116820. #ifdef WOLFSSL_SP_SMALL_STACK
  116821. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  116822. #endif
  116823. return err;
  116824. }
  116825. #endif /* FP_ECC */
  116826. #ifndef WC_NO_CACHE_RESISTANT
  116827. /* Touch each possible entry that could be being copied.
  116828. *
  116829. * r Point to copy into.
  116830. * table Table - start of the entries to access
  116831. * idx Index of entry to retrieve.
  116832. */
  116833. static void sp_521_get_entry_16_17(sp_point_521* r,
  116834. const sp_table_entry_521* table, int idx)
  116835. {
  116836. int i;
  116837. sp_digit mask;
  116838. r->x[0] = 0;
  116839. r->x[1] = 0;
  116840. r->x[2] = 0;
  116841. r->x[3] = 0;
  116842. r->x[4] = 0;
  116843. r->x[5] = 0;
  116844. r->x[6] = 0;
  116845. r->x[7] = 0;
  116846. r->x[8] = 0;
  116847. r->x[9] = 0;
  116848. r->x[10] = 0;
  116849. r->x[11] = 0;
  116850. r->x[12] = 0;
  116851. r->x[13] = 0;
  116852. r->x[14] = 0;
  116853. r->x[15] = 0;
  116854. r->x[16] = 0;
  116855. r->y[0] = 0;
  116856. r->y[1] = 0;
  116857. r->y[2] = 0;
  116858. r->y[3] = 0;
  116859. r->y[4] = 0;
  116860. r->y[5] = 0;
  116861. r->y[6] = 0;
  116862. r->y[7] = 0;
  116863. r->y[8] = 0;
  116864. r->y[9] = 0;
  116865. r->y[10] = 0;
  116866. r->y[11] = 0;
  116867. r->y[12] = 0;
  116868. r->y[13] = 0;
  116869. r->y[14] = 0;
  116870. r->y[15] = 0;
  116871. r->y[16] = 0;
  116872. for (i = 1; i < 16; i++) {
  116873. mask = (sp_digit)0 - (i == idx);
  116874. r->x[0] |= mask & table[i].x[0];
  116875. r->x[1] |= mask & table[i].x[1];
  116876. r->x[2] |= mask & table[i].x[2];
  116877. r->x[3] |= mask & table[i].x[3];
  116878. r->x[4] |= mask & table[i].x[4];
  116879. r->x[5] |= mask & table[i].x[5];
  116880. r->x[6] |= mask & table[i].x[6];
  116881. r->x[7] |= mask & table[i].x[7];
  116882. r->x[8] |= mask & table[i].x[8];
  116883. r->x[9] |= mask & table[i].x[9];
  116884. r->x[10] |= mask & table[i].x[10];
  116885. r->x[11] |= mask & table[i].x[11];
  116886. r->x[12] |= mask & table[i].x[12];
  116887. r->x[13] |= mask & table[i].x[13];
  116888. r->x[14] |= mask & table[i].x[14];
  116889. r->x[15] |= mask & table[i].x[15];
  116890. r->x[16] |= mask & table[i].x[16];
  116891. r->y[0] |= mask & table[i].y[0];
  116892. r->y[1] |= mask & table[i].y[1];
  116893. r->y[2] |= mask & table[i].y[2];
  116894. r->y[3] |= mask & table[i].y[3];
  116895. r->y[4] |= mask & table[i].y[4];
  116896. r->y[5] |= mask & table[i].y[5];
  116897. r->y[6] |= mask & table[i].y[6];
  116898. r->y[7] |= mask & table[i].y[7];
  116899. r->y[8] |= mask & table[i].y[8];
  116900. r->y[9] |= mask & table[i].y[9];
  116901. r->y[10] |= mask & table[i].y[10];
  116902. r->y[11] |= mask & table[i].y[11];
  116903. r->y[12] |= mask & table[i].y[12];
  116904. r->y[13] |= mask & table[i].y[13];
  116905. r->y[14] |= mask & table[i].y[14];
  116906. r->y[15] |= mask & table[i].y[15];
  116907. r->y[16] |= mask & table[i].y[16];
  116908. }
  116909. }
  116910. #endif /* !WC_NO_CACHE_RESISTANT */
  116911. /* Multiply the point by the scalar and return the result.
  116912. * If map is true then convert result to affine coordinates.
  116913. *
  116914. * Stripe implementation.
  116915. * Pre-generated: 2^0, 2^130, ...
  116916. * Pre-generated: products of all combinations of above.
  116917. * 4 doubles and adds (with qz=1)
  116918. *
  116919. * r Resulting point.
  116920. * k Scalar to multiply by.
  116921. * table Pre-computed table.
  116922. * map Indicates whether to convert result to affine.
  116923. * ct Constant time required.
  116924. * heap Heap to use for allocation.
  116925. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  116926. */
  116927. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  116928. const sp_table_entry_521* table, const sp_digit* k, int map,
  116929. int ct, void* heap)
  116930. {
  116931. #ifdef WOLFSSL_SP_SMALL_STACK
  116932. sp_point_521* rt = NULL;
  116933. sp_digit* t = NULL;
  116934. #else
  116935. sp_point_521 rt[2];
  116936. sp_digit t[2 * 17 * 6];
  116937. #endif
  116938. sp_point_521* p = NULL;
  116939. int i;
  116940. int j;
  116941. int y;
  116942. int x;
  116943. int err = MP_OKAY;
  116944. (void)g;
  116945. /* Constant time used for cache attack resistance implementation. */
  116946. (void)ct;
  116947. (void)heap;
  116948. #ifdef WOLFSSL_SP_SMALL_STACK
  116949. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  116950. DYNAMIC_TYPE_ECC);
  116951. if (rt == NULL)
  116952. err = MEMORY_E;
  116953. if (err == MP_OKAY) {
  116954. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  116955. DYNAMIC_TYPE_ECC);
  116956. if (t == NULL)
  116957. err = MEMORY_E;
  116958. }
  116959. #endif
  116960. if (err == MP_OKAY) {
  116961. p = rt + 1;
  116962. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  116963. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  116964. y = 0;
  116965. x = 130;
  116966. for (j=0; j<4 && x<521; j++) {
  116967. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  116968. x += 131;
  116969. }
  116970. #ifndef WC_NO_CACHE_RESISTANT
  116971. if (ct) {
  116972. sp_521_get_entry_16_17(rt, table, y);
  116973. } else
  116974. #endif
  116975. {
  116976. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  116977. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  116978. }
  116979. rt->infinity = !y;
  116980. for (i=129; i>=0; i--) {
  116981. y = 0;
  116982. x = i;
  116983. for (j=0; j<4 && x<521; j++) {
  116984. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  116985. x += 131;
  116986. }
  116987. sp_521_proj_point_dbl_17(rt, rt, t);
  116988. #ifndef WC_NO_CACHE_RESISTANT
  116989. if (ct) {
  116990. sp_521_get_entry_16_17(p, table, y);
  116991. }
  116992. else
  116993. #endif
  116994. {
  116995. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  116996. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  116997. }
  116998. p->infinity = !y;
  116999. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  117000. }
  117001. if (map != 0) {
  117002. sp_521_map_17(r, rt, t);
  117003. }
  117004. else {
  117005. XMEMCPY(r, rt, sizeof(sp_point_521));
  117006. }
  117007. }
  117008. #ifdef WOLFSSL_SP_SMALL_STACK
  117009. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  117010. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  117011. #endif
  117012. return err;
  117013. }
  117014. #ifdef FP_ECC
  117015. #ifndef FP_ENTRIES
  117016. #define FP_ENTRIES 16
  117017. #endif
  117018. /* Cache entry - holds precomputation tables for a point. */
  117019. typedef struct sp_cache_521_t {
  117020. /* X ordinate of point that table was generated from. */
  117021. sp_digit x[17];
  117022. /* Y ordinate of point that table was generated from. */
  117023. sp_digit y[17];
  117024. /* Precomputation table for point. */
  117025. sp_table_entry_521 table[16];
  117026. /* Count of entries in table. */
  117027. uint32_t cnt;
  117028. /* Point and table set in entry. */
  117029. int set;
  117030. } sp_cache_521_t;
  117031. /* Cache of tables. */
  117032. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  117033. /* Index of last entry in cache. */
  117034. static THREAD_LS_T int sp_cache_521_last = -1;
  117035. /* Cache has been initialized. */
  117036. static THREAD_LS_T int sp_cache_521_inited = 0;
  117037. #ifndef HAVE_THREAD_LS
  117038. #ifndef WOLFSSL_MUTEX_INITIALIZER
  117039. static volatile int initCacheMutex_521 = 0;
  117040. #endif
  117041. static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock);
  117042. #endif
  117043. /* Get the cache entry for the point.
  117044. *
  117045. * g [in] Point scalar multiplying.
  117046. * cache [out] Cache table to use.
  117047. */
  117048. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  117049. {
  117050. int i;
  117051. int j;
  117052. uint32_t least;
  117053. if (sp_cache_521_inited == 0) {
  117054. for (i=0; i<FP_ENTRIES; i++) {
  117055. sp_cache_521[i].set = 0;
  117056. }
  117057. sp_cache_521_inited = 1;
  117058. }
  117059. /* Compare point with those in cache. */
  117060. for (i=0; i<FP_ENTRIES; i++) {
  117061. if (!sp_cache_521[i].set)
  117062. continue;
  117063. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  117064. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  117065. sp_cache_521[i].cnt++;
  117066. break;
  117067. }
  117068. }
  117069. /* No match. */
  117070. if (i == FP_ENTRIES) {
  117071. /* Find empty entry. */
  117072. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  117073. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  117074. if (!sp_cache_521[i].set) {
  117075. break;
  117076. }
  117077. }
  117078. /* Evict least used. */
  117079. if (i == sp_cache_521_last) {
  117080. least = sp_cache_521[0].cnt;
  117081. for (j=1; j<FP_ENTRIES; j++) {
  117082. if (sp_cache_521[j].cnt < least) {
  117083. i = j;
  117084. least = sp_cache_521[i].cnt;
  117085. }
  117086. }
  117087. }
  117088. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  117089. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  117090. sp_cache_521[i].set = 1;
  117091. sp_cache_521[i].cnt = 1;
  117092. }
  117093. *cache = &sp_cache_521[i];
  117094. sp_cache_521_last = i;
  117095. }
  117096. #endif /* FP_ECC */
  117097. /* Multiply the base point of P521 by the scalar and return the result.
  117098. * If map is true then convert result to affine coordinates.
  117099. *
  117100. * r Resulting point.
  117101. * g Point to multiply.
  117102. * k Scalar to multiply by.
  117103. * map Indicates whether to convert result to affine.
  117104. * ct Constant time required.
  117105. * heap Heap to use for allocation.
  117106. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117107. */
  117108. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g,
  117109. const sp_digit* k, int map, int ct, void* heap)
  117110. {
  117111. #ifndef FP_ECC
  117112. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  117113. #else
  117114. #ifdef WOLFSSL_SP_SMALL_STACK
  117115. sp_digit* tmp;
  117116. #else
  117117. sp_digit tmp[2 * 17 * 6];
  117118. #endif
  117119. sp_cache_521_t* cache;
  117120. int err = MP_OKAY;
  117121. #ifdef WOLFSSL_SP_SMALL_STACK
  117122. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap, DYNAMIC_TYPE_ECC);
  117123. if (tmp == NULL) {
  117124. err = MEMORY_E;
  117125. }
  117126. #endif
  117127. #ifndef HAVE_THREAD_LS
  117128. if (err == MP_OKAY) {
  117129. #ifndef WOLFSSL_MUTEX_INITIALIZER
  117130. if (initCacheMutex_521 == 0) {
  117131. wc_InitMutex(&sp_cache_521_lock);
  117132. initCacheMutex_521 = 1;
  117133. }
  117134. #endif
  117135. if (wc_LockMutex(&sp_cache_521_lock) != 0) {
  117136. err = BAD_MUTEX_E;
  117137. }
  117138. }
  117139. #endif /* HAVE_THREAD_LS */
  117140. if (err == MP_OKAY) {
  117141. sp_ecc_get_cache_521(g, &cache);
  117142. if (cache->cnt == 2)
  117143. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  117144. #ifndef HAVE_THREAD_LS
  117145. wc_UnLockMutex(&sp_cache_521_lock);
  117146. #endif /* HAVE_THREAD_LS */
  117147. if (cache->cnt < 2) {
  117148. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  117149. }
  117150. else {
  117151. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  117152. map, ct, heap);
  117153. }
  117154. }
  117155. #ifdef WOLFSSL_SP_SMALL_STACK
  117156. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  117157. #endif
  117158. return err;
  117159. #endif
  117160. }
  117161. #else
  117162. #ifdef FP_ECC
  117163. /* Generate the pre-computed table of points for the base point.
  117164. *
  117165. * width = 8
  117166. * 256 entries
  117167. * 65 bits between
  117168. *
  117169. * a The base point.
  117170. * table Place to store generated point data.
  117171. * tmp Temporary data.
  117172. * heap Heap to use for allocation.
  117173. */
  117174. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  117175. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  117176. {
  117177. #ifdef WOLFSSL_SP_SMALL_STACK
  117178. sp_point_521* t = NULL;
  117179. #else
  117180. sp_point_521 t[3];
  117181. #endif
  117182. sp_point_521* s1 = NULL;
  117183. sp_point_521* s2 = NULL;
  117184. int i;
  117185. int j;
  117186. int err = MP_OKAY;
  117187. (void)heap;
  117188. #ifdef WOLFSSL_SP_SMALL_STACK
  117189. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  117190. DYNAMIC_TYPE_ECC);
  117191. if (t == NULL)
  117192. err = MEMORY_E;
  117193. #endif
  117194. if (err == MP_OKAY) {
  117195. s1 = t + 1;
  117196. s2 = t + 2;
  117197. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  117198. }
  117199. if (err == MP_OKAY) {
  117200. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  117201. }
  117202. if (err == MP_OKAY) {
  117203. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  117204. }
  117205. if (err == MP_OKAY) {
  117206. t->infinity = 0;
  117207. sp_521_proj_to_affine_17(t, tmp);
  117208. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  117209. s1->infinity = 0;
  117210. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  117211. s2->infinity = 0;
  117212. /* table[0] = {0, 0, infinity} */
  117213. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  117214. /* table[1] = Affine version of 'a' in Montgomery form */
  117215. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  117216. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  117217. for (i=1; i<8; i++) {
  117218. sp_521_proj_point_dbl_n_17(t, 66, tmp);
  117219. sp_521_proj_to_affine_17(t, tmp);
  117220. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  117221. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  117222. }
  117223. for (i=1; i<8; i++) {
  117224. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  117225. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  117226. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  117227. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  117228. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  117229. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  117230. sp_521_proj_to_affine_17(t, tmp);
  117231. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  117232. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  117233. }
  117234. }
  117235. }
  117236. #ifdef WOLFSSL_SP_SMALL_STACK
  117237. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  117238. #endif
  117239. return err;
  117240. }
  117241. #endif /* FP_ECC */
  117242. #ifndef WC_NO_CACHE_RESISTANT
  117243. /* Touch each possible entry that could be being copied.
  117244. *
  117245. * r Point to copy into.
  117246. * table Table - start of the entries to access
  117247. * idx Index of entry to retrieve.
  117248. */
  117249. static void sp_521_get_entry_256_17(sp_point_521* r,
  117250. const sp_table_entry_521* table, int idx)
  117251. {
  117252. int i;
  117253. sp_digit mask;
  117254. r->x[0] = 0;
  117255. r->x[1] = 0;
  117256. r->x[2] = 0;
  117257. r->x[3] = 0;
  117258. r->x[4] = 0;
  117259. r->x[5] = 0;
  117260. r->x[6] = 0;
  117261. r->x[7] = 0;
  117262. r->x[8] = 0;
  117263. r->x[9] = 0;
  117264. r->x[10] = 0;
  117265. r->x[11] = 0;
  117266. r->x[12] = 0;
  117267. r->x[13] = 0;
  117268. r->x[14] = 0;
  117269. r->x[15] = 0;
  117270. r->x[16] = 0;
  117271. r->y[0] = 0;
  117272. r->y[1] = 0;
  117273. r->y[2] = 0;
  117274. r->y[3] = 0;
  117275. r->y[4] = 0;
  117276. r->y[5] = 0;
  117277. r->y[6] = 0;
  117278. r->y[7] = 0;
  117279. r->y[8] = 0;
  117280. r->y[9] = 0;
  117281. r->y[10] = 0;
  117282. r->y[11] = 0;
  117283. r->y[12] = 0;
  117284. r->y[13] = 0;
  117285. r->y[14] = 0;
  117286. r->y[15] = 0;
  117287. r->y[16] = 0;
  117288. for (i = 1; i < 256; i++) {
  117289. mask = (sp_digit)0 - (i == idx);
  117290. r->x[0] |= mask & table[i].x[0];
  117291. r->x[1] |= mask & table[i].x[1];
  117292. r->x[2] |= mask & table[i].x[2];
  117293. r->x[3] |= mask & table[i].x[3];
  117294. r->x[4] |= mask & table[i].x[4];
  117295. r->x[5] |= mask & table[i].x[5];
  117296. r->x[6] |= mask & table[i].x[6];
  117297. r->x[7] |= mask & table[i].x[7];
  117298. r->x[8] |= mask & table[i].x[8];
  117299. r->x[9] |= mask & table[i].x[9];
  117300. r->x[10] |= mask & table[i].x[10];
  117301. r->x[11] |= mask & table[i].x[11];
  117302. r->x[12] |= mask & table[i].x[12];
  117303. r->x[13] |= mask & table[i].x[13];
  117304. r->x[14] |= mask & table[i].x[14];
  117305. r->x[15] |= mask & table[i].x[15];
  117306. r->x[16] |= mask & table[i].x[16];
  117307. r->y[0] |= mask & table[i].y[0];
  117308. r->y[1] |= mask & table[i].y[1];
  117309. r->y[2] |= mask & table[i].y[2];
  117310. r->y[3] |= mask & table[i].y[3];
  117311. r->y[4] |= mask & table[i].y[4];
  117312. r->y[5] |= mask & table[i].y[5];
  117313. r->y[6] |= mask & table[i].y[6];
  117314. r->y[7] |= mask & table[i].y[7];
  117315. r->y[8] |= mask & table[i].y[8];
  117316. r->y[9] |= mask & table[i].y[9];
  117317. r->y[10] |= mask & table[i].y[10];
  117318. r->y[11] |= mask & table[i].y[11];
  117319. r->y[12] |= mask & table[i].y[12];
  117320. r->y[13] |= mask & table[i].y[13];
  117321. r->y[14] |= mask & table[i].y[14];
  117322. r->y[15] |= mask & table[i].y[15];
  117323. r->y[16] |= mask & table[i].y[16];
  117324. }
  117325. }
  117326. #endif /* !WC_NO_CACHE_RESISTANT */
  117327. /* Multiply the point by the scalar and return the result.
  117328. * If map is true then convert result to affine coordinates.
  117329. *
  117330. * Stripe implementation.
  117331. * Pre-generated: 2^0, 2^65, ...
  117332. * Pre-generated: products of all combinations of above.
  117333. * 8 doubles and adds (with qz=1)
  117334. *
  117335. * r Resulting point.
  117336. * k Scalar to multiply by.
  117337. * table Pre-computed table.
  117338. * map Indicates whether to convert result to affine.
  117339. * ct Constant time required.
  117340. * heap Heap to use for allocation.
  117341. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117342. */
  117343. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  117344. const sp_table_entry_521* table, const sp_digit* k, int map,
  117345. int ct, void* heap)
  117346. {
  117347. #ifdef WOLFSSL_SP_SMALL_STACK
  117348. sp_point_521* rt = NULL;
  117349. sp_digit* t = NULL;
  117350. #else
  117351. sp_point_521 rt[2];
  117352. sp_digit t[2 * 17 * 6];
  117353. #endif
  117354. sp_point_521* p = NULL;
  117355. int i;
  117356. int j;
  117357. int y;
  117358. int x;
  117359. int err = MP_OKAY;
  117360. (void)g;
  117361. /* Constant time used for cache attack resistance implementation. */
  117362. (void)ct;
  117363. (void)heap;
  117364. #ifdef WOLFSSL_SP_SMALL_STACK
  117365. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  117366. DYNAMIC_TYPE_ECC);
  117367. if (rt == NULL)
  117368. err = MEMORY_E;
  117369. if (err == MP_OKAY) {
  117370. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  117371. DYNAMIC_TYPE_ECC);
  117372. if (t == NULL)
  117373. err = MEMORY_E;
  117374. }
  117375. #endif
  117376. if (err == MP_OKAY) {
  117377. p = rt + 1;
  117378. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  117379. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  117380. y = 0;
  117381. x = 65;
  117382. for (j=0; j<8 && x<521; j++) {
  117383. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  117384. x += 66;
  117385. }
  117386. #ifndef WC_NO_CACHE_RESISTANT
  117387. if (ct) {
  117388. sp_521_get_entry_256_17(rt, table, y);
  117389. } else
  117390. #endif
  117391. {
  117392. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  117393. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  117394. }
  117395. rt->infinity = !y;
  117396. for (i=64; i>=0; i--) {
  117397. y = 0;
  117398. x = i;
  117399. for (j=0; j<8 && x<521; j++) {
  117400. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  117401. x += 66;
  117402. }
  117403. sp_521_proj_point_dbl_17(rt, rt, t);
  117404. #ifndef WC_NO_CACHE_RESISTANT
  117405. if (ct) {
  117406. sp_521_get_entry_256_17(p, table, y);
  117407. }
  117408. else
  117409. #endif
  117410. {
  117411. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  117412. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  117413. }
  117414. p->infinity = !y;
  117415. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  117416. }
  117417. if (map != 0) {
  117418. sp_521_map_17(r, rt, t);
  117419. }
  117420. else {
  117421. XMEMCPY(r, rt, sizeof(sp_point_521));
  117422. }
  117423. }
  117424. #ifdef WOLFSSL_SP_SMALL_STACK
  117425. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  117426. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  117427. #endif
  117428. return err;
  117429. }
  117430. #ifdef FP_ECC
  117431. #ifndef FP_ENTRIES
  117432. #define FP_ENTRIES 16
  117433. #endif
  117434. /* Cache entry - holds precomputation tables for a point. */
  117435. typedef struct sp_cache_521_t {
  117436. /* X ordinate of point that table was generated from. */
  117437. sp_digit x[17];
  117438. /* Y ordinate of point that table was generated from. */
  117439. sp_digit y[17];
  117440. /* Precomputation table for point. */
  117441. sp_table_entry_521 table[256];
  117442. /* Count of entries in table. */
  117443. uint32_t cnt;
  117444. /* Point and table set in entry. */
  117445. int set;
  117446. } sp_cache_521_t;
  117447. /* Cache of tables. */
  117448. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  117449. /* Index of last entry in cache. */
  117450. static THREAD_LS_T int sp_cache_521_last = -1;
  117451. /* Cache has been initialized. */
  117452. static THREAD_LS_T int sp_cache_521_inited = 0;
  117453. #ifndef HAVE_THREAD_LS
  117454. #ifndef WOLFSSL_MUTEX_INITIALIZER
  117455. static volatile int initCacheMutex_521 = 0;
  117456. #endif
  117457. static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock);
  117458. #endif
  117459. /* Get the cache entry for the point.
  117460. *
  117461. * g [in] Point scalar multiplying.
  117462. * cache [out] Cache table to use.
  117463. */
  117464. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  117465. {
  117466. int i;
  117467. int j;
  117468. uint32_t least;
  117469. if (sp_cache_521_inited == 0) {
  117470. for (i=0; i<FP_ENTRIES; i++) {
  117471. sp_cache_521[i].set = 0;
  117472. }
  117473. sp_cache_521_inited = 1;
  117474. }
  117475. /* Compare point with those in cache. */
  117476. for (i=0; i<FP_ENTRIES; i++) {
  117477. if (!sp_cache_521[i].set)
  117478. continue;
  117479. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  117480. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  117481. sp_cache_521[i].cnt++;
  117482. break;
  117483. }
  117484. }
  117485. /* No match. */
  117486. if (i == FP_ENTRIES) {
  117487. /* Find empty entry. */
  117488. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  117489. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  117490. if (!sp_cache_521[i].set) {
  117491. break;
  117492. }
  117493. }
  117494. /* Evict least used. */
  117495. if (i == sp_cache_521_last) {
  117496. least = sp_cache_521[0].cnt;
  117497. for (j=1; j<FP_ENTRIES; j++) {
  117498. if (sp_cache_521[j].cnt < least) {
  117499. i = j;
  117500. least = sp_cache_521[i].cnt;
  117501. }
  117502. }
  117503. }
  117504. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  117505. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  117506. sp_cache_521[i].set = 1;
  117507. sp_cache_521[i].cnt = 1;
  117508. }
  117509. *cache = &sp_cache_521[i];
  117510. sp_cache_521_last = i;
  117511. }
  117512. #endif /* FP_ECC */
  117513. /* Multiply the base point of P521 by the scalar and return the result.
  117514. * If map is true then convert result to affine coordinates.
  117515. *
  117516. * r Resulting point.
  117517. * g Point to multiply.
  117518. * k Scalar to multiply by.
  117519. * map Indicates whether to convert result to affine.
  117520. * ct Constant time required.
  117521. * heap Heap to use for allocation.
  117522. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117523. */
  117524. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g,
  117525. const sp_digit* k, int map, int ct, void* heap)
  117526. {
  117527. #ifndef FP_ECC
  117528. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  117529. #else
  117530. #ifdef WOLFSSL_SP_SMALL_STACK
  117531. sp_digit* tmp;
  117532. #else
  117533. sp_digit tmp[2 * 17 * 6];
  117534. #endif
  117535. sp_cache_521_t* cache;
  117536. int err = MP_OKAY;
  117537. #ifdef WOLFSSL_SP_SMALL_STACK
  117538. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap, DYNAMIC_TYPE_ECC);
  117539. if (tmp == NULL) {
  117540. err = MEMORY_E;
  117541. }
  117542. #endif
  117543. #ifndef HAVE_THREAD_LS
  117544. if (err == MP_OKAY) {
  117545. #ifndef WOLFSSL_MUTEX_INITIALIZER
  117546. if (initCacheMutex_521 == 0) {
  117547. wc_InitMutex(&sp_cache_521_lock);
  117548. initCacheMutex_521 = 1;
  117549. }
  117550. #endif
  117551. if (wc_LockMutex(&sp_cache_521_lock) != 0) {
  117552. err = BAD_MUTEX_E;
  117553. }
  117554. }
  117555. #endif /* HAVE_THREAD_LS */
  117556. if (err == MP_OKAY) {
  117557. sp_ecc_get_cache_521(g, &cache);
  117558. if (cache->cnt == 2)
  117559. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  117560. #ifndef HAVE_THREAD_LS
  117561. wc_UnLockMutex(&sp_cache_521_lock);
  117562. #endif /* HAVE_THREAD_LS */
  117563. if (cache->cnt < 2) {
  117564. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  117565. }
  117566. else {
  117567. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  117568. map, ct, heap);
  117569. }
  117570. }
  117571. #ifdef WOLFSSL_SP_SMALL_STACK
  117572. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  117573. #endif
  117574. return err;
  117575. #endif
  117576. }
  117577. #endif /* WOLFSSL_SP_SMALL */
  117578. /* Multiply the point by the scalar and return the result.
  117579. * If map is true then convert result to affine coordinates.
  117580. *
  117581. * km Scalar to multiply by.
  117582. * p Point to multiply.
  117583. * r Resulting point.
  117584. * map Indicates whether to convert result to affine.
  117585. * heap Heap to use for allocation.
  117586. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117587. */
  117588. int sp_ecc_mulmod_521(const mp_int* km, const ecc_point* gm, ecc_point* r,
  117589. int map, void* heap)
  117590. {
  117591. #ifdef WOLFSSL_SP_SMALL_STACK
  117592. sp_point_521* point = NULL;
  117593. sp_digit* k = NULL;
  117594. #else
  117595. sp_point_521 point[1];
  117596. sp_digit k[17];
  117597. #endif
  117598. int err = MP_OKAY;
  117599. #ifdef WOLFSSL_SP_SMALL_STACK
  117600. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  117601. DYNAMIC_TYPE_ECC);
  117602. if (point == NULL)
  117603. err = MEMORY_E;
  117604. if (err == MP_OKAY) {
  117605. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  117606. DYNAMIC_TYPE_ECC);
  117607. if (k == NULL)
  117608. err = MEMORY_E;
  117609. }
  117610. #endif
  117611. if (err == MP_OKAY) {
  117612. sp_521_from_mp(k, 17, km);
  117613. sp_521_point_from_ecc_point_17(point, gm);
  117614. err = sp_521_ecc_mulmod_17(point, point, k, map, 1, heap);
  117615. }
  117616. if (err == MP_OKAY) {
  117617. err = sp_521_point_to_ecc_point_17(point, r);
  117618. }
  117619. #ifdef WOLFSSL_SP_SMALL_STACK
  117620. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  117621. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  117622. #endif
  117623. return err;
  117624. }
  117625. /* Multiply the point by the scalar, add point a and return the result.
  117626. * If map is true then convert result to affine coordinates.
  117627. *
  117628. * km Scalar to multiply by.
  117629. * p Point to multiply.
  117630. * am Point to add to scalar multiply result.
  117631. * inMont Point to add is in montgomery form.
  117632. * r Resulting point.
  117633. * map Indicates whether to convert result to affine.
  117634. * heap Heap to use for allocation.
  117635. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117636. */
  117637. int sp_ecc_mulmod_add_521(const mp_int* km, const ecc_point* gm,
  117638. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  117639. {
  117640. #ifdef WOLFSSL_SP_SMALL_STACK
  117641. sp_point_521* point = NULL;
  117642. sp_digit* k = NULL;
  117643. #else
  117644. sp_point_521 point[2];
  117645. sp_digit k[17 + 17 * 2 * 6];
  117646. #endif
  117647. sp_point_521* addP = NULL;
  117648. sp_digit* tmp = NULL;
  117649. int err = MP_OKAY;
  117650. #ifdef WOLFSSL_SP_SMALL_STACK
  117651. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  117652. DYNAMIC_TYPE_ECC);
  117653. if (point == NULL)
  117654. err = MEMORY_E;
  117655. if (err == MP_OKAY) {
  117656. k = (sp_digit*)XMALLOC(
  117657. sizeof(sp_digit) * (17 + 17 * 2 * 6), heap,
  117658. DYNAMIC_TYPE_ECC);
  117659. if (k == NULL)
  117660. err = MEMORY_E;
  117661. }
  117662. #endif
  117663. if (err == MP_OKAY) {
  117664. addP = point + 1;
  117665. tmp = k + 17;
  117666. sp_521_from_mp(k, 17, km);
  117667. sp_521_point_from_ecc_point_17(point, gm);
  117668. sp_521_point_from_ecc_point_17(addP, am);
  117669. }
  117670. if ((err == MP_OKAY) && (!inMont)) {
  117671. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  117672. }
  117673. if ((err == MP_OKAY) && (!inMont)) {
  117674. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  117675. }
  117676. if ((err == MP_OKAY) && (!inMont)) {
  117677. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  117678. }
  117679. if (err == MP_OKAY) {
  117680. err = sp_521_ecc_mulmod_17(point, point, k, 0, 0, heap);
  117681. }
  117682. if (err == MP_OKAY) {
  117683. sp_521_proj_point_add_17(point, point, addP, tmp);
  117684. if (map) {
  117685. sp_521_map_17(point, point, tmp);
  117686. }
  117687. err = sp_521_point_to_ecc_point_17(point, r);
  117688. }
  117689. #ifdef WOLFSSL_SP_SMALL_STACK
  117690. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  117691. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  117692. #endif
  117693. return err;
  117694. }
  117695. #ifdef WOLFSSL_SP_SMALL
  117696. /* Striping precomputation table.
  117697. * 4 points combined into a table of 16 points.
  117698. * Distance of 131 between points.
  117699. */
  117700. static const sp_table_entry_521 p521_table[16] = {
  117701. /* 0 */
  117702. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  117703. 0x00, 0x00, 0x00, 0x00, 0x00 },
  117704. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  117705. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  117706. /* 1 */
  117707. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  117708. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  117709. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  117710. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  117711. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  117712. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  117713. /* 2 */
  117714. { { 0x66fd07ca,0x1036eb9b,0x6b7fb490,0x6ca52cc1,0xd3e0c270,0x512e973e,
  117715. 0x73d92d11,0x889980bf,0xa4005eea,0x38b4cfe4,0x8ceb4313,0xb6f992cc,
  117716. 0x6daf7c23,0xd0ac2f8d,0xe32a93cb,0x1ccfbf17,0x000000c2 },
  117717. { 0x2f508cca,0x7bd9d6f1,0x595a72af,0xe82d7171,0x97512873,0x25d02976,
  117718. 0x8cf39fbc,0xefc1de8b,0x9a1237f4,0x25e6b77f,0xd4d98b5d,0x9f3b73e7,
  117719. 0xeccb07fe,0xe1fda62b,0x625350cf,0xdb813b03,0x00000014 } },
  117720. /* 3 */
  117721. { { 0x9b27bd61,0x415a1c9b,0x606854d6,0x74522753,0x92e73538,0x9e331ef4,
  117722. 0x817e7a6d,0x0b3dba85,0x49ac273b,0x55c4bd53,0xfcb5417f,0xad42c78d,
  117723. 0x92e08d38,0x528998b9,0xcc1914cc,0x14c2fff6,0x000000c1 },
  117724. { 0x767e9645,0x35b26fb0,0xc5e5a659,0x162b512f,0xcc47fbb8,0xa6e03696,
  117725. 0x0a29a69b,0x732db065,0xd56bdf5d,0x058a74ed,0x25c858d9,0x4b7b60a0,
  117726. 0xbd43373d,0x17f8a6d4,0xedf610b4,0x7b968f51,0x0000011f } },
  117727. /* 4 */
  117728. { { 0x1bc0fa77,0x5f56b5a4,0x64fd36f5,0x6cdd6bb5,0x8a5b7c7f,0xd0ac68b5,
  117729. 0x09919ef9,0x4a92d9bf,0x71c3c520,0xc305e12b,0xdb699aee,0x554a9d1c,
  117730. 0x61f54643,0x7fde0077,0x479115ce,0x99c13124,0x00000039 },
  117731. { 0xc271ac2d,0x25f890e1,0x94b370ac,0x1353ccd3,0x744d4011,0xc7b5adf6,
  117732. 0xbe378127,0x9ccd7687,0x06c4e3cd,0xa8489b5c,0x305505f9,0x1945580a,
  117733. 0x4ab3b12b,0x07190a20,0x1534ea4d,0x0ff53eb1,0x00000159 } },
  117734. /* 5 */
  117735. { { 0x91798548,0x877d4edd,0x031d657a,0xc43c7b25,0xfab18a04,0x47603671,
  117736. 0xf670b476,0x7e39e7f2,0xb02fcc03,0xf7b76431,0x877f46f5,0x7c5662f3,
  117737. 0x1c8b0c61,0x5bf8327e,0x4a8be322,0xe9cdb353,0x000001ae },
  117738. { 0x9d264420,0xa2d7092e,0x533ff3db,0x1f970352,0x99b5b52e,0x31dd232b,
  117739. 0x850f45e9,0x8a9ce16b,0xc3011849,0x01c99023,0xc8e9301e,0x4bc30989,
  117740. 0xcd95f64c,0x77a4de70,0x1026f289,0xbc8797bb,0x000000d7 } },
  117741. /* 6 */
  117742. { { 0x2be9edf8,0x98ea0934,0xfcb98199,0x6c2f3132,0xfaf83aeb,0xf579893d,
  117743. 0xc73fda0f,0x858e87bb,0x7a0b9d1c,0xd3c0b3fb,0x71ee68b1,0x21fe6305,
  117744. 0x66aa6f16,0x5bf8f01f,0xbca825ed,0x30934c99,0x000000d1 },
  117745. { 0x913022f2,0xe4309850,0xde5b80ce,0xfdc336c9,0x8b6130ef,0xb716d689,
  117746. 0xa758d2f4,0x8a58b405,0xaa5cbc1c,0x98879df8,0xc12ce0bb,0x847cfd06,
  117747. 0x8c02ff3c,0xa1006360,0x3438695b,0x836e906a,0x00000136 } },
  117748. /* 7 */
  117749. { { 0x259ce02d,0xac8fe351,0xdae5e0f7,0xa506da0c,0xf043421d,0x77b56e98,
  117750. 0xa1647490,0xe0d041c7,0x9cb90101,0xe41f0789,0xda3e72e6,0x29bbf572,
  117751. 0x04a14df0,0x6b635c47,0xe81ef5d3,0x56873f58,0x000001dd },
  117752. { 0x5cf9e33f,0x77abe79e,0x0a1117fd,0x91aab581,0xcbac2fe1,0x11edf3b1,
  117753. 0xd72113b7,0xef43e017,0x06b74002,0xf9ad685c,0x8fbd3b1a,0x7e6370ce,
  117754. 0x42f73a82,0x550dd50b,0xc5e64a9b,0x8f2146be,0x000001f2 } },
  117755. /* 8 */
  117756. { { 0x2934ed82,0x05a704cc,0x989edd8c,0x647089fb,0x0ce7c62d,0xe0b239d4,
  117757. 0x105a5eff,0x4c892ea6,0xd5ed6b04,0xa519395f,0x509ed794,0x806c7003,
  117758. 0xe70ce5c4,0x882e9886,0xff01f6a9,0x50730ca1,0x00000088 },
  117759. { 0xdbcc5484,0x90a78a16,0xfd454b50,0xc1ab078c,0xcb09e525,0x6f488252,
  117760. 0xe19b2ed7,0xdd663f53,0xa67bf59c,0x16b10da1,0x36bb770a,0xb47f6b95,
  117761. 0x777b2bce,0x6bdc8428,0x561553f8,0xcd02ae3d,0x00000017 } },
  117762. /* 9 */
  117763. { { 0x1579d15a,0x1e3633a0,0x3e98cd1f,0x574f0c23,0xc60f4f99,0x45969dca,
  117764. 0x49fb9f24,0x10062c93,0xd378f640,0xd29a29d7,0xd7d48c2f,0xec941760,
  117765. 0x31fbea5c,0xf0591c59,0xb40f9ebf,0xd6173e6b,0x00000063 },
  117766. { 0x5a984a72,0x220f4f39,0x32510f26,0x9a3f82ce,0x8c069a1d,0xf3d04c76,
  117767. 0x69a21e57,0xf1d6d891,0xdc4db601,0x6b96b30b,0x64dcf3e0,0x71eeb728,
  117768. 0xc7caaff3,0x6f80c483,0x571b66e4,0x45533092,0x000000b0 } },
  117769. /* 10 */
  117770. { { 0x87140dad,0x49ae4521,0x57e2803e,0xda73032b,0x026ea20a,0x13f5e5eb,
  117771. 0x6e00afb9,0x2d54c4b0,0x7a150474,0x4393b92b,0x13f1a7da,0xb5b41bf8,
  117772. 0x02b5867a,0x6d786907,0xaf2ea4d1,0x5193a9ac,0x000001b3 },
  117773. { 0xa6b186cb,0x2a1563f7,0xe28e57b6,0x73a70a44,0x78fc8a1d,0xd7c4fc6d,
  117774. 0xdf3d6d99,0x4c9b4581,0x1e373aab,0x544f5249,0xe913498e,0xe99434a2,
  117775. 0xc4700f4c,0x30159749,0xe5142766,0xb8ef02cc,0x000001d0 } },
  117776. /* 11 */
  117777. { { 0xb9e6ffc9,0xe99805a6,0xf74d977b,0x1a357f05,0x5c9941bc,0xc8ddef31,
  117778. 0xcbe842e7,0x4b6d66ca,0xa20dc12d,0x84e1f75f,0x5f0c02fc,0x8b1b2c50,
  117779. 0x037b493d,0x3fa1889e,0x95705046,0x720bd9e0,0x000001c2 },
  117780. { 0x93ab9309,0x1a1f3378,0x226a8f94,0xe05a30a2,0x4045f1bd,0x2c01a52d,
  117781. 0xab5f5115,0xf42e8fd5,0x0c05fecf,0x954d1d09,0x8d0650d3,0x47e964d1,
  117782. 0x3c860801,0x6866fa5d,0x5abbb4af,0xac2fecbf,0x0000012c } },
  117783. /* 12 */
  117784. { { 0xe5537747,0x846dc3d2,0x1f5f9f46,0xe28e00df,0x3f31e42d,0x041af624,
  117785. 0x256af225,0x4948947f,0xff4f9550,0x3896c61a,0x34bb5a3e,0xcb40c773,
  117786. 0xeceafacc,0xb9becb07,0x4d45e83e,0xfe29f049,0x000001aa },
  117787. { 0x6b5578db,0x83fb71b3,0x0a710526,0x3017f115,0x5f220d77,0x189ec946,
  117788. 0x48465e68,0xba87ae07,0x70e0cbea,0x1da474d5,0x2b2ba7c5,0xb92cb0a6,
  117789. 0x8b1fb7e2,0x35cb356d,0x2cc8cb18,0x1155296a,0x0000000f } },
  117790. /* 13 */
  117791. { { 0x6ed0f604,0x7f9c9d9b,0xcb49c6d7,0x765e43e9,0xae9be5ca,0x03c4dd67,
  117792. 0x405aed36,0x5480888b,0x920ccddb,0x3a69ebb2,0x03f0c7cc,0x44ec0573,
  117793. 0xce89b026,0x158e2437,0x4f179a17,0x86795029,0x0000003a },
  117794. { 0x9f193dd9,0xf7854032,0xdcc158a9,0x531e4068,0x3642b1a5,0x774171bf,
  117795. 0xc1e53aa3,0x12b4920f,0xfd87478d,0xd1c5fb53,0xa7cba7ca,0x48958c58,
  117796. 0x3f66f2c7,0x375b2cb2,0x598899bd,0x1b510d0f,0x000001b8 } },
  117797. /* 14 */
  117798. { { 0x52007e41,0xfe96299d,0xcd708dcd,0x997140b5,0xf655f6fa,0xe9294eed,
  117799. 0xd58b839d,0x7701d45d,0xb6f77cdb,0x5dbdf5ad,0x95a572f0,0x265189f4,
  117800. 0xb3515e7b,0xc162794e,0x72655e0b,0xbfb571e0,0x00000168 },
  117801. { 0xbda82a6b,0xf0d2b863,0x390a9cc7,0x3df5b283,0x700fcd7b,0xbab9995a,
  117802. 0xfa4e6c06,0xc01ef0af,0x76a392d4,0x10a98513,0x955392f0,0xa7e3fc72,
  117803. 0x1d7a8550,0x8e3c0128,0x361898a8,0xcbca551a,0x0000010f } },
  117804. /* 15 */
  117805. { { 0x3ab71115,0xc8a4cd40,0xbcb9b55b,0xb783170d,0xabd9b426,0x1be20f6a,
  117806. 0x5377b714,0x32d2ea64,0x6b358bbf,0xda342480,0x6e202211,0x782bc800,
  117807. 0xaa27c499,0xf80974c4,0x50341cde,0xc2e66fa9,0x0000004e },
  117808. { 0x24ae60c3,0x082cb95b,0x83ad7484,0xd4b80af4,0x6205256b,0x84b739ce,
  117809. 0xae1fe063,0x616f505e,0x342f218f,0xef14ea68,0x64a01186,0x2b17d66c,
  117810. 0x50858bce,0x60e889ce,0xd5881005,0xdb046c59,0x000001e1 } },
  117811. };
  117812. /* Multiply the base point of P521 by the scalar and return the result.
  117813. * If map is true then convert result to affine coordinates.
  117814. *
  117815. * Stripe implementation.
  117816. * Pre-generated: 2^0, 2^130, ...
  117817. * Pre-generated: products of all combinations of above.
  117818. * 4 doubles and adds (with qz=1)
  117819. *
  117820. * r Resulting point.
  117821. * k Scalar to multiply by.
  117822. * map Indicates whether to convert result to affine.
  117823. * ct Constant time required.
  117824. * heap Heap to use for allocation.
  117825. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117826. */
  117827. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  117828. int map, int ct, void* heap)
  117829. {
  117830. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  117831. k, map, ct, heap);
  117832. }
  117833. #else
  117834. /* Striping precomputation table.
  117835. * 8 points combined into a table of 256 points.
  117836. * Distance of 66 between points.
  117837. */
  117838. static const sp_table_entry_521 p521_table[256] = {
  117839. /* 0 */
  117840. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  117841. 0x00, 0x00, 0x00, 0x00, 0x00 },
  117842. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  117843. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  117844. /* 1 */
  117845. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  117846. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  117847. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  117848. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  117849. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  117850. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  117851. /* 2 */
  117852. { { 0x0f0ccb51,0x80398667,0x3654974a,0xb87e1d01,0xb2b29ed9,0x7f58cf21,
  117853. 0xa3add337,0x06c0e9aa,0xe9d08ffb,0xf13b35d0,0x96761627,0xdd8bf44c,
  117854. 0x758a3ef4,0xa4a18c14,0xa0043adb,0x96a576dd,0x0000013e },
  117855. { 0x632d95a3,0x2bde24f8,0x4c524829,0x79f15ef1,0x9bdaba19,0xaadd863e,
  117856. 0xa962b707,0xdde053f4,0x14258d98,0xc598a2de,0x061c235c,0x9fa5a19d,
  117857. 0xe8ffd32c,0x0ed46510,0xef78ceac,0x2aea9dd1,0x00000185 } },
  117858. /* 3 */
  117859. { { 0xeaaf1fe3,0xd0a91dd8,0x4400b52b,0x0db38662,0x21abf0d2,0xff6a06a9,
  117860. 0xa768c940,0x9412879a,0x9a1eec37,0xf3791abc,0x2738343c,0xc913fbe6,
  117861. 0xe222abc1,0x728b42ab,0x2b9ef313,0x874c0a86,0x00000157 },
  117862. { 0xe6f03d49,0x0ac8f184,0x1e48be03,0xa9c357e4,0x815cbdef,0x02ce5ef3,
  117863. 0x5fd8dc3c,0x7a41c7ab,0xfaeb109d,0x4bef67c9,0xa84f4d38,0x2f98cca1,
  117864. 0x672f0aae,0x7e03d47d,0x1d58968b,0x24b1ab58,0x00000007 } },
  117865. /* 4 */
  117866. { { 0xdf9314e0,0x904f2d4b,0xe7a00aac,0xdaae850d,0x582efb03,0x79231083,
  117867. 0xec7fe6d2,0x80f1c283,0x199d74a8,0x2d5b3996,0x395007e7,0x5f120b9b,
  117868. 0x4773f03e,0x30d23773,0x3b78b686,0xf4c19273,0x00000121 },
  117869. { 0xfa8b51f0,0xf103ff6d,0x40e2bdf0,0xae7afb51,0x83254171,0x1130380e,
  117870. 0xcda10d95,0xe83501b8,0x4f3a8c01,0x1057771e,0xac807069,0x8f52196a,
  117871. 0xa5623821,0x3609b0aa,0x94a0a7f1,0x8c257906,0x000001db } },
  117872. /* 5 */
  117873. { { 0xb2c0958d,0x300370cc,0x69a7b387,0x89aef166,0x480c9b38,0x2792f3cf,
  117874. 0xfab3e149,0x0b2984f2,0x50748967,0x9751e436,0xad33db2a,0x9cab99d5,
  117875. 0xb44a4daa,0x4d945d32,0x16c77325,0xa26cca52,0x0000000a },
  117876. { 0xf9e66d18,0xcdbe1d41,0xaa117e7a,0x80aeef96,0xddb0d24b,0x053214a2,
  117877. 0x5c98b7bf,0x6dcfb227,0xdfd3c848,0x613e7436,0x3ca4d52c,0x6e703fa1,
  117878. 0x18551e64,0x0c8e2977,0xbfa8527d,0xf5e90eac,0x000001c6 } },
  117879. /* 6 */
  117880. { { 0x4ab2d58f,0xa2c2f1e7,0x2a097802,0xc1bbf82c,0x770bb76a,0x6583eb24,
  117881. 0x5667f7bd,0x8e4ed9ed,0xfd96897e,0xd8c01d86,0x3fbe0f15,0x66395a13,
  117882. 0xd99cdcb1,0x51e4f39d,0x720deb25,0xde08424a,0x00000082 },
  117883. { 0x60ea91af,0x97aa53b2,0x7a31dfdd,0xa4384af7,0x5cd09bbe,0xcd82f239,
  117884. 0xf30058e1,0x997c19da,0xe5c78e97,0x443b60c6,0x575b1845,0xfaae9b5f,
  117885. 0x08c2ce16,0x5ce86f33,0x4f63fa86,0x983ce58f,0x00000073 } },
  117886. /* 7 */
  117887. { { 0x8217609d,0xaee93131,0x2412fc00,0x7f8a9dd4,0x286c6329,0xe117e64c,
  117888. 0x7bf1c65e,0xcc3782d6,0x8d03eee5,0xe8c144db,0x9ab93799,0x01acacb2,
  117889. 0xb07784c7,0x215eb1b5,0x1affcd87,0x2c409fa8,0x000000f8 },
  117890. { 0x378139a4,0x007d3766,0xb55bea93,0xc6d969eb,0x68c8bc9d,0xc7c60d6f,
  117891. 0x5f93f242,0x844e8461,0x741717d9,0x8461ca2a,0xf0bf120e,0x8e930e79,
  117892. 0x6b5699d7,0xe1554a02,0x6a4fb6de,0xe69c7702,0x0000007d } },
  117893. /* 8 */
  117894. { { 0x4bee80d7,0x61b51bb0,0x7692de69,0x0e1f6a1f,0xa0ebc3bd,0x8379e46c,
  117895. 0x930644f0,0x1c0bffa7,0x390db077,0x97c67b87,0xfada1ce9,0x095c33e1,
  117896. 0xac54b512,0x3c500add,0xd3118656,0xc231d360,0x000000b0 },
  117897. { 0x39bcab2f,0x06289298,0x64dd220a,0xc0c06780,0x763dc2a0,0x062f6084,
  117898. 0x1938c3e3,0x88e9da73,0x52e46eb9,0x69be8f2d,0x6a5de0fd,0xe55c8d2d,
  117899. 0xdb2c0e26,0xf3a3fd63,0x1e4bff57,0x899c6d9f,0x0000014a } },
  117900. /* 9 */
  117901. { { 0xec05ce88,0x9ff6e3a1,0xb6afd202,0xf8fc2496,0x6fbeb007,0x0b9d2077,
  117902. 0xeebded40,0xb50ec0bd,0x693700f7,0xaef97742,0x3f7b030e,0x806e37a1,
  117903. 0x1b901f77,0x5cf17d17,0xca95ae0f,0x9036e5df,0x00000159 },
  117904. { 0x000e8e0c,0x00af64b5,0x06fb4df9,0xd3f2ae04,0x449f23ba,0x5f61da67,
  117905. 0x255b25a9,0x0ca91842,0x8e33c650,0xfa6af3e6,0xc2c027c1,0x14373c00,
  117906. 0x972840a5,0x99f3cda1,0xd0e84240,0x98c62b79,0x000000e7 } },
  117907. /* 10 */
  117908. { { 0xae4d0f28,0xe8c7c4a8,0x566d006e,0x3a8a55ef,0x066e4023,0x37985f65,
  117909. 0x5d321b76,0x8deccab5,0xb8351b07,0x38b966d6,0x57d548ab,0x2e889e53,
  117910. 0xe631ab0b,0x7a9e8e2f,0xe75c537b,0x45c60f95,0x00000059 },
  117911. { 0x7867d79c,0xbca27d34,0x81c81980,0x7f460b15,0x976b8c51,0x7ec2d9ab,
  117912. 0x61b91ed9,0xfcd04486,0xd9c1d15f,0x730a7a25,0xf94c9db9,0x8a2cf259,
  117913. 0x5dec5a3b,0x8e784b87,0x3e5131ee,0x06252607,0x00000004 } },
  117914. /* 11 */
  117915. { { 0xf1631bba,0xdee04e5c,0x156f4524,0x40e6c1df,0xe4c30990,0x06603f30,
  117916. 0x6b6abec7,0xdb649a43,0xf6b94f6e,0x354f509c,0x36b7e0b5,0x7fecf469,
  117917. 0xba1e6dd2,0xa7a7107e,0x689450ca,0x889edac5,0x00000022 },
  117918. { 0xd05596f2,0x9012916e,0xb023cb8b,0xe3901dac,0xe7d4abe1,0x2501d3ec,
  117919. 0xa9c90313,0xb2815040,0xc6d146d0,0x9dbcd3f1,0x74ee1896,0x6fa1d5b1,
  117920. 0xa91226fb,0x49aea161,0xb8a80984,0x754ceedf,0x00000154 } },
  117921. /* 12 */
  117922. { { 0x4270b2f0,0xb64e27b0,0xbf4d74d7,0x84b34e48,0x0c2722ba,0xb186be8b,
  117923. 0x9ff9b71c,0xf54a589d,0x34fd6bc4,0x9887e4df,0x7412f49d,0xb7c669fd,
  117924. 0x77f89d16,0x4008d9bb,0xc902e074,0xafb9426b,0x000001cf },
  117925. { 0x662935ca,0xcca4f2d1,0x997dcc46,0x2847c703,0x353c79f8,0xc089e9e5,
  117926. 0x5215f0f4,0x9ed8d989,0x80911b9d,0x59cf08bc,0x6de27aa3,0x4b03540e,
  117927. 0xf69e320d,0x52f4d63e,0x94ef193b,0xa0217fd6,0x000000e6 } },
  117928. /* 13 */
  117929. { { 0x74214780,0xb77de627,0x207459ea,0xca066817,0xe9c7fb01,0xf78579b7,
  117930. 0xd6d4b7c7,0xe55548c1,0xa66caa39,0x45756190,0x98505a4f,0xf8141b03,
  117931. 0x4c8864eb,0xa5ca0d7c,0x9e129d3f,0xbf8af950,0x00000053 },
  117932. { 0x85285092,0xbc9b29d8,0x8eed5e5f,0x82f31daa,0xf618aab9,0x9c33690e,
  117933. 0xd2626ed1,0x0eee14f4,0x07ed8e09,0x4229570b,0x8736d040,0x1977920e,
  117934. 0xede7d01d,0x47ee25ff,0xbc7ab73b,0x3c921c3a,0x000001b9 } },
  117935. /* 14 */
  117936. { { 0xa08b2b14,0x0b6a07cc,0xbf174c7f,0xaa978deb,0xc40cb2a4,0x291cb828,
  117937. 0x90adc838,0x95c78272,0x8c1edde6,0x08da8b2a,0x90fbd220,0x741ceb2f,
  117938. 0x322db94e,0x5f89c9e5,0xb73c548e,0x18266085,0x0000007d },
  117939. { 0x2defd012,0x69ebf82a,0x5a1537ef,0x01ecb094,0x3ef0811d,0x3c557535,
  117940. 0xb2bd4dea,0x59c882a7,0x7bf969c8,0x00a1f972,0x0b25ad1b,0x063adf5e,
  117941. 0xf2536005,0x4c1ff306,0x4112fe18,0x8e515bec,0x00000117 } },
  117942. /* 15 */
  117943. { { 0xefe3d3d5,0x9314787f,0x9d897227,0x29e76f65,0xe0b6acf5,0x15c77ed1,
  117944. 0x1c5e8dd9,0x9c2b7b20,0x5f5667af,0x788038f1,0xf3576ef4,0xf38c766f,
  117945. 0x0040154a,0x9f0623c8,0xde883b53,0x47d3c44b,0x00000096 },
  117946. { 0xde1b21a4,0x32075638,0x571081c1,0xbb6399c1,0x75c03599,0x322e6067,
  117947. 0xade60cf5,0x5c7fde7f,0xefc19059,0x1b195440,0xdd7b3960,0x7e70ac8c,
  117948. 0x6a6fa73e,0x4aa5a83d,0x63080764,0x34f8cfac,0x00000042 } },
  117949. /* 16 */
  117950. { { 0x286492ad,0xee31e71a,0x65f86ac4,0x08f3de44,0xda713cb4,0xe89700d4,
  117951. 0xa86b7104,0x7ad0f5e9,0x2572c161,0xd9a62e4f,0x25cc1c99,0x77d223ef,
  117952. 0x3b962e0c,0xedff6961,0x81d8b205,0x818d28f3,0x0000008e },
  117953. { 0x8cdf1f60,0x721231cf,0x6717760f,0x8b640f2b,0xe045a403,0xbe726f8c,
  117954. 0x0370689f,0x422285dc,0x72ea0dcb,0x7196bf8f,0xc8086623,0xa16f7855,
  117955. 0xc326fe48,0xd4e19fc7,0x8f68bf44,0xfdbc856e,0x0000013e } },
  117956. /* 17 */
  117957. { { 0xe6a3ace5,0xde34d04f,0x896191c1,0x0dbb603e,0xf75ed0f4,0xb4dc0007,
  117958. 0x95b259b5,0x15e0e6bc,0x2615f020,0xdfbcba66,0xd31ea3f8,0xb2ec5433,
  117959. 0x103ff824,0x42b0b0e4,0xc480332e,0x19315060,0x00000111 },
  117960. { 0x045452f1,0x9997ea28,0x71f3f73b,0x80b678cf,0x41e9328e,0x4a52bddc,
  117961. 0xe6af1c23,0xb7f2656e,0xb44215e7,0xc43805b9,0xf0a4028b,0x3aa734f2,
  117962. 0x422476e2,0xe3c72479,0x68c60cf7,0x6dc2e8b0,0x000001f1 } },
  117963. /* 18 */
  117964. { { 0xfffc0de5,0xbcdfae6f,0xab4a5f24,0xa801814f,0xea2aa8dd,0x19013658,
  117965. 0xda4f0441,0xf3b1caf5,0x34100611,0xf24b9cdb,0x96e0cf88,0x48c324ed,
  117966. 0x23055c82,0x4b7ea334,0x89092e29,0x6e835b64,0x000001d3 },
  117967. { 0x07372f27,0x7eb77ae7,0x83bae19a,0x4779b4fa,0x65429ebb,0xa175dae1,
  117968. 0xfc03ef3f,0x942ec266,0x6991c7c4,0x0e5fc6a9,0x56253d3c,0xa0f61e4f,
  117969. 0xde74e738,0x7a11ff58,0x624de919,0x60524cd4,0x00000002 } },
  117970. /* 19 */
  117971. { { 0x01342e08,0x45b5d0ca,0xb749f0af,0x509ed4f0,0x6529d804,0xeb5502d9,
  117972. 0x6d80359c,0x5eb087db,0x4c384800,0xeaa66a87,0xc75a8784,0xe972c7a0,
  117973. 0x6874317e,0x8c169e21,0xe5c9fbf4,0x81c556e0,0x0000014f },
  117974. { 0xe120674d,0x26b0b12b,0x219f00ac,0xc6bf09b9,0xd658caa6,0x1e1e732d,
  117975. 0x8292d99e,0xc771c5af,0x25fdbf80,0x5d813529,0x3666c37d,0xe61bd798,
  117976. 0x1d0df680,0x8dac946a,0xc39f0983,0x58dcf684,0x0000009f } },
  117977. /* 20 */
  117978. { { 0x7b7dc837,0x14169102,0xb50eb1c4,0x2d719754,0xd7e6741b,0x04f4092a,
  117979. 0xbc824a38,0x1d0a7f1d,0xc8e20bcf,0x570b2056,0xda181db0,0x6732e3b9,
  117980. 0x0a7b508a,0x7880636e,0xc9f70492,0x11af502c,0x00000045 },
  117981. { 0xc56f4ffa,0x0b820d94,0xc4f0c0fa,0x1c6205a2,0xa1a0606a,0x99f33d4e,
  117982. 0x79b316fb,0x1bab6466,0xe4f240fc,0x05aa0852,0x92d7dc43,0x22539b78,
  117983. 0x06e3c073,0x03657f12,0xcedb6633,0x28405280,0x00000059 } },
  117984. /* 21 */
  117985. { { 0x4397760c,0x90d08711,0x1c9fcd06,0xb9020b76,0x987e24f7,0xc7fec7fa,
  117986. 0x522335a0,0x0e33b8a0,0xae21ca10,0x73dbeafd,0x3b032220,0x458c060a,
  117987. 0xee145da6,0x9b9c73b8,0x27ff62ef,0x31c661e5,0x000000aa },
  117988. { 0x81430b5e,0xaf518eb0,0x50ee0d69,0xb32f9cea,0xaa6ebe8b,0x0ecdb0b5,
  117989. 0x9fe1d689,0x1f15f7f2,0x1a59cc9a,0xce5d68f3,0x08ab2a63,0xf4d67994,
  117990. 0x4347ce54,0xe85b1cef,0x286d0776,0x8ff423c0,0x00000176 } },
  117991. /* 22 */
  117992. { { 0x33dcec23,0x8564104c,0xcdd07519,0xbaf0d61b,0x4c4f309a,0x486daf51,
  117993. 0xde488715,0xf01bc8f5,0xd3539ba3,0xddd6baf1,0x3a3be8ec,0xbb7e665d,
  117994. 0xcb5d865f,0xf919dac3,0xf12149a0,0xfe203da3,0x00000173 },
  117995. { 0x78d4a3d1,0x043ae9a1,0x865316d8,0xa4d5cf58,0x41176463,0xeaf026c0,
  117996. 0xf84afa44,0x316c638f,0xffea422d,0x512f2397,0x6622b613,0x691eaa04,
  117997. 0x97e7068d,0x48856ea3,0xf4a1b33c,0x42d1b2e3,0x000001b5 } },
  117998. /* 23 */
  117999. { { 0x1f487402,0xf51b2d5e,0x7aaf1dd5,0xe36016e6,0x6da9c20a,0x1eb3f1f5,
  118000. 0xece45bfd,0x25b7d361,0x027a9e18,0x42db0633,0xe8411649,0xbf228777,
  118001. 0x458773d0,0xf5fce0c4,0x2dd7a5f0,0xb2b3151d,0x0000001f },
  118002. { 0xfbaa096a,0x102773e8,0xe093a878,0x152726eb,0x2c7f1781,0x5c53cd07,
  118003. 0xab5dca76,0x38d3dfd0,0x87ef2d4a,0xbb4a7d85,0xb7eb11c2,0x5c9c2013,
  118004. 0x0b6da22f,0x5e353c34,0xa325ecad,0x846d50a5,0x00000039 } },
  118005. /* 24 */
  118006. { { 0x1677df58,0x76da7736,0x1cb50d6c,0x364bd567,0x0a080ff2,0x0443c7d7,
  118007. 0x86532430,0xa0a85429,0xc35101e7,0x82002dd2,0x48c5cd76,0xbebc6143,
  118008. 0xca6cf13f,0xff1591ae,0x98bf8dc0,0x91c7c2e6,0x000000fb },
  118009. { 0x12de14d5,0x6a7c5cad,0x6561c822,0xbc448c5f,0x7cdbb3da,0x9f8de430,
  118010. 0xc76811d7,0x9c58f011,0x75462049,0x1e89806e,0xc9a74e49,0xe52ad0a2,
  118011. 0xb2be37c3,0x2034685c,0x0a0bc72d,0x7a863245,0x000000ec } },
  118012. /* 25 */
  118013. { { 0x8a86786e,0x33818c21,0x2137e2c8,0xed537f74,0xa7e6eb20,0x5d9690d1,
  118014. 0x5cdc4803,0x9790ec70,0x24f7bd75,0x469162c8,0x4e1f0f14,0x09e7ef9d,
  118015. 0xce9915ca,0xd30c128b,0x6c71226f,0x810145f6,0x0000002d },
  118016. { 0xb71d87e5,0x312749f5,0x7b02ceda,0x25f3b141,0xe0baff16,0x02456d2e,
  118017. 0xfcae6627,0x97f7b3a9,0x37bd985f,0x0d6ebf8f,0x7fa6d0c1,0x20aa81b9,
  118018. 0x21f2f137,0xb29f1a01,0x5cc0ddb1,0xe326a2f8,0x0000003d } },
  118019. /* 26 */
  118020. { { 0x38c2ee78,0x26f3398b,0xa75a0bee,0x40c3d101,0x565a7f8e,0x35a31706,
  118021. 0x04019e5d,0xd12985e3,0xb8174b6e,0x21e2a642,0xaf80a52a,0x25a15ee8,
  118022. 0x8518d80e,0x5d1e0fe6,0x04f6ea9a,0x8cbbc138,0x00000084 },
  118023. { 0xdfd45169,0x76828690,0x59d3e8d0,0x38d7e098,0xcdb8bfc2,0x23758811,
  118024. 0x162cf648,0x8499547a,0xb4d15b8c,0x494bab3b,0xc60499a6,0x822cbc57,
  118025. 0xa8a1cfed,0xac43224e,0x57c6598b,0x43563469,0x000000d9 } },
  118026. /* 27 */
  118027. { { 0x68271323,0x2b069253,0x49cd04d7,0x24d9e0a8,0x2b31cc7d,0xaae35fbf,
  118028. 0x57a3e361,0x44f64b4f,0x0294e856,0x14904686,0x43ced4ae,0xddc82ee7,
  118029. 0x7e2cda47,0xcb92a6a5,0xbfc1f968,0x989c42ef,0x0000013f },
  118030. { 0xb8651600,0xbed98bdf,0x7a3cfaee,0x8c363434,0x35b1a226,0x93a12543,
  118031. 0xd5825507,0x558da7dd,0x852eb1e9,0xa5173b23,0x2295f545,0xdf5ae585,
  118032. 0x6646d101,0xe546e2ef,0x5d89f862,0xf7e16a2c,0x000001fa } },
  118033. /* 28 */
  118034. { { 0xc7ec136d,0x0d746c8e,0xcd11351b,0xf8e1d827,0xf187a116,0x764a3ad3,
  118035. 0x136e8465,0x2f1b968f,0x850983c2,0xd41aa294,0xbe717259,0x2123ecc4,
  118036. 0x763c149c,0xdcdcab52,0x1022b82d,0xa7f50b18,0x0000016d },
  118037. { 0x0ca5e258,0xf99e532d,0x97b62a7b,0xa148ad17,0xc77fddef,0x8d0a242e,
  118038. 0x74f9b6c4,0x58518bcd,0x7fd122d4,0xc53b30b8,0xfb50b2d7,0xbb8cd193,
  118039. 0xbc01aae9,0x1a169aee,0x1de26e09,0x7e49b10a,0x000001c5 } },
  118040. /* 29 */
  118041. { { 0x21210716,0x2cabe675,0x07e02400,0x81a296a3,0x8c83795b,0x94afc11d,
  118042. 0xdd9efa6a,0x68f20334,0x677d686f,0x5be2f9eb,0xbf5ce275,0x6a13f277,
  118043. 0xb9757c5c,0xf7d92241,0xc74f4b8c,0x70c3d2f4,0x00000132 },
  118044. { 0x8d209aa4,0xf9c8609c,0xdb2b5436,0x46f413a2,0x2992345d,0x96b72d1a,
  118045. 0x9487c34f,0x186f2aeb,0xb440a375,0x4fa72176,0x7da5358e,0x3a420936,
  118046. 0xff25b310,0xf11eade3,0x505d60b8,0x9a570153,0x000001a9 } },
  118047. /* 30 */
  118048. { { 0x6e7495bb,0xae151393,0x490879d1,0xebd2fd28,0x29fd76fc,0x9c232b0b,
  118049. 0xc60e721c,0xa1a0d49b,0x517a09e2,0x9f582b83,0x9d8badf8,0xac37809e,
  118050. 0x0ad48bb4,0x4aa4de9e,0xcb6cc487,0xfd041312,0x00000027 },
  118051. { 0xead4fb6d,0xc05502ee,0x0a602cbe,0x760c25ed,0xbd7f4a07,0x58ba6841,
  118052. 0x54edce14,0xc28b6032,0x0397614c,0xb9d41e39,0x181eed93,0x4221b71d,
  118053. 0x332d4b0b,0xd010e3c2,0xdab0e419,0xdfe58a27,0x00000096 } },
  118054. /* 31 */
  118055. { { 0x7debd24e,0x4cd6fcd6,0x9ae2b075,0xbe3fca60,0xf217c26c,0xa7d8c22e,
  118056. 0xb9620e3f,0xd42d03e0,0xc7f9f87d,0x634bf216,0x8972ffee,0x22b1ec53,
  118057. 0xd60d3e77,0x83a957c1,0x0f6a537e,0xedfe5f86,0x00000162 },
  118058. { 0xf0ea20b8,0x40a05400,0x1d796900,0x2872ac7e,0x0edb0cac,0x7765a5c9,
  118059. 0xb62939a7,0x9df5b930,0xaf2cb708,0xf78a676e,0x52febc12,0x030732bf,
  118060. 0xba190ad3,0x3a6640de,0x93e7e341,0x36eae15f,0x000000d5 } },
  118061. /* 32 */
  118062. { { 0xa1c88f3c,0x6c6119f6,0x2ec6944a,0x924e5fec,0x5742ff2a,0x4c8aac60,
  118063. 0xddb22c7c,0x60adde1e,0xfa5d25bb,0x9728938c,0xec117de0,0xfa5ac4f7,
  118064. 0x482929c1,0x41f35ab7,0x0afd95f5,0xd1c4e8f9,0x00000180 },
  118065. { 0xa7cd8358,0x2fc4e73d,0xf2a1c920,0x39361a57,0xad94d288,0xf6f2f130,
  118066. 0x2b6a78e2,0xe37e2466,0x79c262cd,0x0babff8b,0x61b597b9,0x6cae01ef,
  118067. 0xa60d4e64,0x9c1e33f0,0xdd01f845,0x52a42280,0x0000000e } },
  118068. /* 33 */
  118069. { { 0x0f013755,0x72d640a4,0xfb8380e9,0x0b6dce77,0x7eb64b31,0x2789ce79,
  118070. 0x93ca5a36,0x8e704b0b,0x58bdffc9,0x18c360ff,0xb230c372,0x53b1f323,
  118071. 0x5a7385d1,0xd6b39088,0x56b93bf7,0x071130f5,0x0000004a },
  118072. { 0xfeef3f88,0x29a2096b,0xb82b3945,0x22eba869,0x872664a7,0x7fe2184a,
  118073. 0x858ff942,0xa0dc0ba1,0x7490c9da,0x33799eb5,0x81588ce8,0x1d356f62,
  118074. 0xa7b2cee2,0x7dd9bc7f,0xa3cfaee9,0x1e61a4e8,0x000000d2 } },
  118075. /* 34 */
  118076. { { 0xe9068656,0xec5db629,0x9fede4df,0x623bd70c,0xfcd45546,0xc78ad5bd,
  118077. 0x6291a741,0xf7981dd2,0x761e688e,0x3ac53d92,0x55b9272f,0x6a96892a,
  118078. 0x06546fec,0x4217e7b8,0xab9e2f56,0x793c03cb,0x0000015e },
  118079. { 0x6eff39be,0x08fd9543,0xdbff4f68,0x5a1af07e,0xb0241616,0x83d47abd,
  118080. 0xd4798029,0x37c5d2fd,0x60b2e6fb,0x9d86d978,0xce8db998,0xe3e3284e,
  118081. 0xd868b9bb,0x9f049eb5,0x9dad18b3,0x3b3e8a78,0x0000018e } },
  118082. /* 35 */
  118083. { { 0xe51e61f0,0x57026c56,0x307f2757,0xdddbcaa3,0xb1aeaf41,0x92a026eb,
  118084. 0xe2d7f5ba,0xa33e937c,0xbc5ead91,0x1f7cc01e,0x2e46807d,0x90ab665d,
  118085. 0x53419519,0xc2a44f55,0x79664049,0x099c1ca6,0x000000aa },
  118086. { 0x8f97e387,0xb561a909,0x45e1dd69,0xf6051778,0x7ff1d6ab,0x1ffa512b,
  118087. 0xd09a9c89,0x42da55a4,0xd2282e2b,0x5e5a7c71,0xe74185ad,0xdfa5a203,
  118088. 0xea0baeff,0x19b1369d,0x1ecc0a16,0xa5eef914,0x000001a3 } },
  118089. /* 36 */
  118090. { { 0x7a573b81,0x2af20d0a,0x66194cef,0x7eac1ca8,0x0b711c34,0xef0d2d8d,
  118091. 0xba099d42,0x6aea016c,0x5067a8ca,0xa6609d28,0x7a1351ef,0x6a52c600,
  118092. 0xb11c2634,0xdab85818,0xbb1c033c,0xf17fa45d,0x00000121 },
  118093. { 0xfc3279d6,0x9fb8b87a,0xc201f1e1,0xe30e76ab,0x806c21dd,0x02af6a83,
  118094. 0xc63f824f,0xeafd7e2b,0x46bd1a53,0x7b074e26,0xa2139164,0xcd6f4931,
  118095. 0xc172d9bf,0xab2cfd39,0x4db59cf1,0x62f3eb4b,0x0000010a } },
  118096. /* 37 */
  118097. { { 0xe0689a1b,0xe402de36,0x7dcafe72,0x9dccc9fd,0x255d0bfb,0xe4dead7e,
  118098. 0x4ada04d9,0xd7ee87ee,0xbfd2e774,0x5a85039e,0x770b2b9b,0x282c6657,
  118099. 0xba103bba,0xa7aca826,0xc7cd5071,0xac7028ba,0x0000011a },
  118100. { 0x680c8f04,0x2e61d39c,0xb48b3b5e,0x2f09c4cc,0x95744f3c,0x131609bd,
  118101. 0xaaccb593,0x6d72e4b4,0x5adfb209,0xdb7060ca,0x1fd3eccf,0xc67d9e43,
  118102. 0xe1752a73,0x1487a26f,0x64d0857c,0x3d953663,0x000001e3 } },
  118103. /* 38 */
  118104. { { 0x4cec9e7f,0xe664506b,0x30aab98f,0xa44564b4,0x173fa284,0x5e1b501f,
  118105. 0x15c97472,0xe7b7bd7e,0x82dec033,0xd6cc67a8,0x0a63b762,0x1fe2e934,
  118106. 0x3f8e2fcd,0x3a084e1b,0x9ae6e752,0xccce4da8,0x000000fd },
  118107. { 0xc12fd820,0x0797f8ee,0x96da4733,0x325f892a,0x55997bf4,0x597d241d,
  118108. 0x02b753cf,0x3aef35ac,0xf677ceba,0x8a73f95d,0xd1bbac6c,0x5b2892b7,
  118109. 0xcc5278b0,0x90751583,0xa47f45f6,0x2f5ed53f,0x0000001c } },
  118110. /* 39 */
  118111. { { 0xab40b79c,0x3914165e,0x25b489a8,0xbfb6eed8,0x8a6c107f,0xda136b7d,
  118112. 0x8e01f28b,0xd431db8b,0xa4d79907,0x84e5d0dd,0xa471e685,0x69a91472,
  118113. 0x98376ff8,0x58d06969,0xc46311fd,0xce369b74,0x00000006 },
  118114. { 0x1add1452,0x6c0773d1,0xed8e9a2a,0x2e4e9c95,0xca15a40c,0xe8ff8e32,
  118115. 0xaf62f18f,0x3fcb7d36,0xeec9484b,0x2ca336ee,0x3b20405b,0xa4d6e7a9,
  118116. 0x956d8352,0x6d90d031,0xd9ca03e7,0xdd375603,0x000000e5 } },
  118117. /* 40 */
  118118. { { 0x8b481bf7,0xcc5f297d,0x2a13383c,0x06a2a3e4,0xdc40b96c,0x9e14528c,
  118119. 0x1189da3c,0x9a2bf35f,0x6cd57fa7,0xb8adb989,0x9357d32b,0xc1a4935c,
  118120. 0xc2d76fad,0x51fb2580,0x24f23de1,0x98721eb4,0x000001ba },
  118121. { 0x52a4b397,0x8c02daaf,0x0d0b4e54,0xc3c5f4cc,0x7b7e79cd,0x29be4db3,
  118122. 0xb33970b6,0xf34336ec,0x92808c7f,0xed3dcb7c,0x02288db1,0xec290eff,
  118123. 0xe96ed59a,0x2a479d51,0x76d8fa5f,0x9d7ed870,0x00000092 } },
  118124. /* 41 */
  118125. { { 0xe660043c,0xd8edaf0b,0x016e074d,0x84aa2ccb,0xe2cc3b3d,0x9d2368e7,
  118126. 0x5c269fc4,0x47b50130,0x3de33e36,0xd0194ee1,0x789ca504,0xdb3361b9,
  118127. 0x984db11d,0x8cd51833,0xc8ec92f0,0xd5b801ec,0x000000c6 },
  118128. { 0x47ab9887,0x33f91c15,0x6b5ab011,0x2f285e2a,0x133fc818,0x9b734e5a,
  118129. 0x38d8692c,0x5c435a74,0x43282e81,0x3c92b47c,0x9c7bcdaa,0x191231f5,
  118130. 0x4d158c86,0x3ae425c3,0xc5a23cca,0x7f568feb,0x00000011 } },
  118131. /* 42 */
  118132. { { 0xbf5caa87,0x8ccbd9d5,0x68dd8c9d,0x17bfc60f,0xc7d4dede,0x63eb4dbb,
  118133. 0x8270b5bf,0xbf6e5945,0xcc098fe7,0x887137a5,0x05d7b8f5,0xca5eb687,
  118134. 0x4b25a533,0x4b7deeee,0x4a700a6c,0x8e045c32,0x000000ef },
  118135. { 0x70cf52bc,0x160c1c92,0x90cc6298,0x4bf3f63a,0xbf3028fb,0x5fff421c,
  118136. 0x523beff1,0x0a8102d7,0x8b9ce105,0xff3309a3,0x06621b1e,0x8e9da4d0,
  118137. 0xcc0a7807,0x9775f89f,0x00178612,0x59044865,0x000000eb } },
  118138. /* 43 */
  118139. { { 0xebbd33ec,0x8a6664fd,0xce5ad579,0x0cf9a660,0x50fb56ed,0xecd06c05,
  118140. 0x1d5aaa6e,0xb4ca5fad,0x948a7f07,0x36daee5b,0xefe1c11a,0xd2e37887,
  118141. 0x91d2544b,0x41f61ac4,0x2bffd8ea,0x49df7071,0x000000be },
  118142. { 0x65acdb56,0x60e2f1f5,0x5e5e5bde,0xf2f13c84,0xe17a0412,0xb97fd354,
  118143. 0xd9c93bef,0x8a2867cf,0x25a957e4,0x9ca9d16b,0x4a18635f,0x1f55c19b,
  118144. 0x8d26ae71,0x9b3868f5,0x4c94541d,0xac448041,0x00000000 } },
  118145. /* 44 */
  118146. { { 0xd4ad38db,0x6c1bcf89,0x3d714511,0x1180f381,0xcb70243a,0x5b4c2759,
  118147. 0x163a716c,0x5dd64d63,0x13648bdb,0xbbd2efea,0xe4de9969,0xa47187f9,
  118148. 0xe2de8c45,0x65de6912,0x4bdad0a7,0xe075f29c,0x00000048 },
  118149. { 0x5e4dd88d,0x00335474,0x80577afc,0x18283638,0x227288f7,0xe4b35c01,
  118150. 0xe68989de,0xd008fd91,0xcd3f71ba,0x42142315,0x3e4da1e2,0x5cb023ff,
  118151. 0xb5662bb1,0x7e6b9c35,0x7fb04fe5,0x143f4165,0x00000072 } },
  118152. /* 45 */
  118153. { { 0x26f40f2c,0xb06b046c,0x6cd7c31d,0xbd5d246c,0x1953a9b7,0xaaa56270,
  118154. 0x8f00436f,0x5ac929b8,0x21d0660d,0x1937392c,0x9bd6dbe6,0xd279ed15,
  118155. 0xd17c43f9,0x377c4d5a,0xb8fcd025,0x800eda50,0x00000179 },
  118156. { 0x36132f31,0xb88ddc0b,0x2ade73a3,0x6f8f4f01,0x203de2b9,0x38859ec3,
  118157. 0x231b6533,0xedb03814,0xa14093ca,0xad08cd20,0x5c2be2f9,0xb9f86d44,
  118158. 0xf6ebc09f,0xfd3d9532,0x1aef478d,0x757b5899,0x0000013d } },
  118159. /* 46 */
  118160. { { 0x580f894b,0x7d9ad100,0xd925e46f,0xb612488a,0x2e5a6865,0x45497e14,
  118161. 0x17f9a813,0xc86e1053,0xf8a33541,0xd8aa820a,0x7a66d578,0xa6790660,
  118162. 0x5f758e23,0x47df60ae,0xa7f8ab5c,0xcadd4c90,0x00000107 },
  118163. { 0x6764ad0e,0x356b044f,0x250189b3,0xf69fe0e1,0x5f14db6a,0x2deaca62,
  118164. 0x1bd77d54,0xe9f2779f,0x5cfa895c,0x979911f2,0xb6f19ac3,0xd4e94ced,
  118165. 0x01af44b1,0xc3533417,0x50c727f5,0xcac43fff,0x0000003b } },
  118166. /* 47 */
  118167. { { 0x83c1d4cf,0x1742951c,0xb245c34f,0xe03791d0,0x9c2dcc71,0xea8f8ef6,
  118168. 0x2a310767,0x2ea57a29,0xb12948bd,0x255b46bb,0x0feaeb83,0x2adc1e09,
  118169. 0x449abf59,0xa0d2d18c,0xc4a8a689,0x9e8c9ff5,0x00000019 },
  118170. { 0xeb28171a,0xc9f7b9cd,0xd576987b,0xefd78403,0x22ff824c,0x58b4f3bf,
  118171. 0xbf333cc5,0xee09b393,0xb01ceb72,0xebff83a2,0x220299cd,0x5bb34c45,
  118172. 0x66ebf751,0xa3c3e8a0,0x49d05cf3,0x5dee07bb,0x000001a6 } },
  118173. /* 48 */
  118174. { { 0xb114257b,0x09a958d6,0xd4975e30,0x729afd41,0x3aae7b11,0x072879b5,
  118175. 0xedd1ac83,0x0791b093,0x1eb67975,0xcfefc7d1,0xe2675b4a,0x0e54bd37,
  118176. 0x8d69517f,0x89a62d7e,0x202109a3,0x96f805d8,0x0000006b },
  118177. { 0x57b5f9f4,0x4815d517,0x405b44d1,0xe5c9e436,0xe4870160,0x3442dde0,
  118178. 0x1ef6b3f8,0x953fef95,0xf7497faf,0x919e4cf5,0x016ef0b7,0x24e3cc4d,
  118179. 0x2512eeed,0xfc5caa87,0xa3bd1703,0xf1ba4029,0x000001b6 } },
  118180. /* 49 */
  118181. { { 0x529252ac,0x2a668435,0x74e7b0d8,0x3da626c0,0xe0be86ab,0x55080cc1,
  118182. 0x4ed5dc53,0x534a53f7,0x0cd41fd0,0xa9eff140,0x5674891c,0x0e7c945c,
  118183. 0xec53b5ad,0xdea4b895,0x15150988,0xefc67bef,0x000001ff },
  118184. { 0x306033fd,0x988dc109,0xf36875d9,0x1b287979,0xe3c335c5,0x4d39af26,
  118185. 0x124e29d6,0xa47259fd,0xc41dbdfc,0x5d60c570,0x0cc0d895,0x06224b61,
  118186. 0xeea8ff86,0xa041d4e5,0xae4d8707,0x2920e15c,0x000001fd } },
  118187. /* 50 */
  118188. { { 0xcd67da85,0x66d15f0c,0x5ac54a15,0xae98b6f4,0xf1ac71c3,0x2f05e021,
  118189. 0x47559224,0x1feb2226,0x66e856dc,0x2a2f1561,0x6fb4ba47,0x65eb1456,
  118190. 0xa29d920b,0x34688bd2,0xf9d4cb9b,0x943ce86e,0x00000061 },
  118191. { 0xaac91174,0xb4696218,0x41dd9234,0x85b519ec,0x9f0763a4,0xb7efadf2,
  118192. 0x712c8b33,0x98517f27,0xb0538630,0xa02e7ec3,0x1ff3e3e4,0x46bc45bb,
  118193. 0x29496486,0x46ae896f,0xebd2b93f,0x2aeb1649,0x00000146 } },
  118194. /* 51 */
  118195. { { 0xe8e4d3c3,0x1f34f41f,0x5bb7e9db,0xc80d87ff,0xd910b579,0xf0216c0a,
  118196. 0xb87349ae,0x2a24b761,0x2b0a6cc0,0x054bc528,0xaf2d1957,0x3b4c7029,
  118197. 0xadbe6cdd,0x0e4b90e2,0x26060a34,0x8e774f81,0x000000cf },
  118198. { 0x2e229950,0x3c7f9dbc,0xd9f82b70,0xab11f846,0xf10c05f3,0x2b7ad9a3,
  118199. 0x0f1820ca,0x203ead4f,0xccbfb332,0x51dbcbc8,0x066706f1,0x3bd9caf0,
  118200. 0x06059d5e,0x5a39be25,0xdcafe64e,0x984387c8,0x0000014c } },
  118201. /* 52 */
  118202. { { 0x8e011531,0x708a757f,0xc3dcd57c,0x7f45b172,0xc2d99e29,0xa8eac9fd,
  118203. 0xb93b6415,0x9d4ee81f,0xa5488e86,0xa5833b54,0x0bb7ab70,0xddd561c3,
  118204. 0xb3bdf3a9,0xb5bda384,0x1ddf332b,0xf909f8e0,0x00000124 },
  118205. { 0xab41e782,0xc5b8aa84,0x851ddb87,0x1de20126,0x99482bd2,0xf49baa7d,
  118206. 0xf4b6413b,0x05963deb,0x7cd1e224,0xed369fbb,0x1bad60ee,0xdcf495dd,
  118207. 0x892e30ed,0xeb475693,0xaf0a212d,0xaaf11bd8,0x0000010b } },
  118208. /* 53 */
  118209. { { 0x16ec64e2,0x71460174,0x7d7c6ebe,0xbfd14acf,0x668b7176,0x1e3504a3,
  118210. 0x741b041c,0x72e3f3f3,0x2d3b67b0,0x651fa54a,0xe57d928d,0x623edca3,
  118211. 0x72c8f419,0x29b74e8b,0x327abaef,0x3d99cb47,0x00000038 },
  118212. { 0xda342a3f,0x808dd0b3,0xdef4a954,0x12002462,0xeab5a860,0x1b1c642e,
  118213. 0x06e54b6d,0x5e1e2a05,0x10c6cf1a,0x9ba1710f,0x0f903cd0,0x334fc366,
  118214. 0x134166f5,0x969e0001,0x155c4353,0xfaa26074,0x000000fa } },
  118215. /* 54 */
  118216. { { 0x712de285,0xc85cd0e6,0x869f5dc5,0xcd2ff8b0,0xdf4ed389,0x372a2b92,
  118217. 0x55b99c84,0x63524d30,0xe07a0033,0x46fef5a2,0xd6e09493,0x0a2c82da,
  118218. 0x72a8952b,0xb3626621,0xaf217eb6,0x9afcb188,0x0000002c },
  118219. { 0x9a64c5b5,0xd3b9d476,0x44c4cfe1,0xa0d8d5de,0x11c6dbff,0x560858ef,
  118220. 0x41c14aed,0xce1d978f,0x35efe854,0x251f9e72,0x0474575d,0xf9d0c14c,
  118221. 0xbda89c03,0x0d2c838e,0x36cc9dc0,0xa25f040b,0x0000016f } },
  118222. /* 55 */
  118223. { { 0x9cad682d,0xb23d9dea,0x46369391,0x87acb1b3,0x5c0f24d7,0x9f5c1988,
  118224. 0xd41883ce,0xdff62fc7,0x53555e46,0xd1ab29df,0x891cda05,0x569b1cb2,
  118225. 0x52c633ed,0xdb14dbc4,0x2a345428,0x1acbb86c,0x00000194 },
  118226. { 0x24db8127,0xd86a70c8,0x41b7cf5b,0x84a6563f,0xb908d9b4,0x8d84dabe,
  118227. 0x899c260a,0xaaeaae63,0x44436957,0x13ed6b2b,0xd0a92c8d,0x3bc94f99,
  118228. 0xd04bcb97,0x978f2e2b,0x716a565f,0x56a388ef,0x00000074 } },
  118229. /* 56 */
  118230. { { 0x96fc1f77,0x6082dfe4,0x1347ad6a,0xb04c435f,0x25ebe457,0xf42694dc,
  118231. 0xb6f764aa,0x64a17069,0x04d83da1,0xe03873d5,0xe0c82330,0xb0b9db52,
  118232. 0xd4239b3e,0x9886b34e,0x598814da,0x76587f2a,0x0000016a },
  118233. { 0xebc71a5d,0x6918f8e8,0x85405233,0x49141a42,0xc182cbcc,0xd63f09cc,
  118234. 0xe09057a7,0x4afe59d3,0xe239d8eb,0xe633db0d,0xfd9494b2,0xbac8582d,
  118235. 0x4704fd61,0x8b915a41,0xfceaefd9,0xe0866a9d,0x0000010e } },
  118236. /* 57 */
  118237. { { 0x52e07a4d,0x2b50c470,0xe5d745d0,0x7f6d38b8,0xe1af1226,0xb414c47c,
  118238. 0x39c505f7,0x03e4b44b,0x86f739be,0x59f3d795,0xe7c2f1bc,0xca19bca7,
  118239. 0xc063fad4,0x1c51c01e,0x7f428afb,0xda3937a5,0x00000080 },
  118240. { 0x102369fa,0xe9d8ca9d,0x706c0e35,0xe009bffb,0x96b55d80,0x2e0a19a7,
  118241. 0xac0d094c,0xda0e42de,0x787c187a,0x6c1be2c5,0x9cfa04b6,0x6d4ae2cc,
  118242. 0x76577340,0x5b0cea60,0xc7c96285,0x2d525245,0x000000d8 } },
  118243. /* 58 */
  118244. { { 0xae93de69,0x6dcb238c,0x3bfdae9b,0x4963c833,0xe8b79836,0x33c81f4d,
  118245. 0xae8bf8ae,0xe13a2244,0x4c3ebacc,0x0bc6e786,0x555a5ad6,0xa837a53c,
  118246. 0xbc7e9459,0x875d8d35,0xf9f46fcd,0xb3705534,0x0000001f },
  118247. { 0x7fb974a1,0x78e9270c,0xe9ed2481,0x23448fa0,0x64bffbd4,0x14166c3d,
  118248. 0xd79f4b3c,0xa05aa443,0x3b9f32a0,0xd855a4f1,0xac90235e,0x4bebcf8d,
  118249. 0x8db52b48,0x65849987,0xe48d09d1,0xaa4d59f1,0x00000183 } },
  118250. /* 59 */
  118251. { { 0xdbffad9f,0xee585d75,0xf419d8fc,0x64df6174,0xe6c69345,0x6f73bf59,
  118252. 0x83d59b0c,0xb80793d1,0x929c8950,0x6baf4fc3,0x29962bab,0xbd445a95,
  118253. 0xeaa91273,0x52b61945,0x3d1c785b,0x4fccdfff,0x000001be },
  118254. { 0x7cb2857f,0x05c384d9,0x06b7abf4,0x4cf83058,0x43ace6b2,0xf528dd17,
  118255. 0xbc43d6b6,0x2c7b8fa2,0x14e564b9,0x8f0e28bf,0xd2b9f01a,0x1b69bc73,
  118256. 0x3dd383e6,0xab8beb40,0x9791946b,0xaccea0c5,0x000000ae } },
  118257. /* 60 */
  118258. { { 0x0163c2de,0x9a68baee,0xeb2768a4,0xc42d0b2b,0xffdae767,0x5686f124,
  118259. 0x0aaca943,0x926da5d5,0xe01091cf,0x699c34ce,0x5324becd,0x3d254540,
  118260. 0x4193a0a9,0x1b6b58f1,0xd611cc9d,0xf144925e,0x0000014f },
  118261. { 0xc1ed9259,0x7f61a60c,0x2f1d5a7f,0x1be37aa3,0x07aef431,0x0384713d,
  118262. 0x4e6fa7ba,0x99f33d49,0x8bd3730c,0x43928c16,0x5b9557dc,0x73cf8ccf,
  118263. 0xd1a2bee5,0x0bc6d460,0x83b15610,0x27cd1943,0x00000145 } },
  118264. /* 61 */
  118265. { { 0x3427af4e,0x4be65135,0x310d937d,0x2e6c0bb1,0xcaa671c3,0xbd8ea76a,
  118266. 0xd3a9c376,0x9d7b3fd4,0x471709aa,0x124ce863,0x018051c0,0x225ce41d,
  118267. 0xf9e8ee1c,0x5489284f,0x535c4ec8,0x22d829c9,0x0000013d },
  118268. { 0xa1b15e02,0x6b01ed9d,0x301e5868,0x1d092bac,0x5764135b,0xbfa7a183,
  118269. 0x6f7159a4,0xc0ee59b7,0x18090d0d,0x9171a051,0xb8052196,0x5c1531bb,
  118270. 0x20927904,0x740930fc,0x76337685,0x963b48cc,0x00000008 } },
  118271. /* 62 */
  118272. { { 0xf4aaaed5,0x0fe8b620,0xfe871ee8,0x1068de7d,0xfebfcb4b,0x2b22030f,
  118273. 0xc3a2155b,0xd4dfbee7,0x2769b805,0xa7a26a8c,0x6d39eaf0,0x377de770,
  118274. 0xf615f032,0xf1a92447,0x42d9b731,0xa1b81a84,0x0000012a },
  118275. { 0xb1152e8f,0x299e67d0,0x92b5e14c,0x2e773d97,0xf1cb57a2,0xe0d81073,
  118276. 0xbf1da4a2,0x03af0a9c,0xc22b449a,0x169b160e,0xdd2d7d1d,0xb82c1ac8,
  118277. 0xbfc98ee4,0x7508aca6,0xe3cbea15,0x54992440,0x00000150 } },
  118278. /* 63 */
  118279. { { 0xa13a4602,0x70004a0a,0xd0d2c60e,0x505c71a3,0xa6d79bc5,0xa4fe2463,
  118280. 0xd54d9df4,0xe878eb3a,0x73d3c7b8,0x7ecca907,0x244ecfa5,0x5b3bb278,
  118281. 0xb124d179,0x8a30f61f,0x4f632af0,0x5b7e5001,0x00000115 },
  118282. { 0x9ef0021a,0x62c42ecc,0xf856c9d4,0x58017fd7,0x2e6478bc,0x10e243b8,
  118283. 0x1505a4db,0xaf074669,0x4cd7eea5,0xd9bb0a1c,0xd52aed0a,0xe8ba39a2,
  118284. 0xb549f09d,0x0747449a,0x9e57fa64,0xd5c8f7bd,0x0000013f } },
  118285. /* 64 */
  118286. { { 0x5a53c22b,0x1bd8ce7b,0x7cab446a,0x78733fcd,0x48acb394,0xc44ca4e2,
  118287. 0xa38c790f,0xa9888b1e,0x15c34237,0x36afb6eb,0xfb702063,0xb913b8a8,
  118288. 0x917508fa,0x34b77cc5,0xf9e4732b,0xa931d7a7,0x00000050 },
  118289. { 0x56d21d18,0xa90a4290,0x55b410a1,0x82666307,0x894a6b05,0xb4684a8b,
  118290. 0x828cf75c,0x8a1ade63,0x127702a3,0x4fb2f85a,0xadf7b709,0x83ff7d05,
  118291. 0xa68d1db6,0x1d3f5a92,0xc093cd5c,0x243ce1db,0x000000f5 } },
  118292. /* 65 */
  118293. { { 0xd37d7891,0x8fc183c3,0xfd865eca,0x17b50149,0x8f218441,0x0f6e43d6,
  118294. 0x5a07f658,0xaf51ec25,0xad303202,0x8fe5a6cb,0x10676ef5,0x95de68f3,
  118295. 0xca4e000c,0x7508e31f,0x77735254,0x783e5a95,0x00000159 },
  118296. { 0x2e537ad9,0xbc1db571,0x35be9cf7,0x5e87112d,0xd57f9bcb,0xbb522b48,
  118297. 0xa8b3cbc7,0x1eff7890,0xe5ecdb5c,0x4f306e11,0x3387e7ed,0x30da8392,
  118298. 0x72321e3d,0x4d91fcf4,0xe412a67c,0x8487bb62,0x0000009f } },
  118299. /* 66 */
  118300. { { 0x8cb8e08e,0x86f5f80f,0x2496fed6,0x7cfd2c41,0x60b7dcdf,0x0061b743,
  118301. 0x57f4d05f,0x4dbaffdf,0x458061f2,0xb1993c2a,0x9de994c4,0x6c6ca8d0,
  118302. 0x2747e062,0xef70d24d,0xb9995cbc,0xd4e5d4e3,0x000000ff },
  118303. { 0xc6f40077,0x3171e245,0x0723e506,0x1592e045,0x6a6bfd88,0x35c86f7e,
  118304. 0x6d9d9ce0,0xba0959d1,0x3eb5770c,0x2e7f8fe8,0xc40d63dd,0x58eb0881,
  118305. 0xeb9e4419,0x56333bda,0x3afd1f4d,0xfb0397df,0x00000034 } },
  118306. /* 67 */
  118307. { { 0xb358815c,0x7b84e05e,0xe41087d9,0x3abcb2d4,0x07f05d7a,0x87a75889,
  118308. 0x7a9d481c,0x350778d5,0x42d64cbd,0x9d34cff8,0xccf289fe,0x0859cd5a,
  118309. 0xdd2b2c6e,0x8372d591,0x18b40b62,0xc06d482e,0x0000006b },
  118310. { 0xda4ed375,0xd10695a0,0x298daaea,0x51baf588,0xf4b7092c,0xb028a1b4,
  118311. 0x7a335b35,0x8ab87dae,0x0567efd8,0xa7359362,0x3320c374,0x7a49fc10,
  118312. 0xa3558b30,0x737acac4,0x4c0fce9b,0xd30696a3,0x0000001e } },
  118313. /* 68 */
  118314. { { 0xbd3902fe,0xd9550ab0,0x86a9d3b3,0x9bba4b4b,0x975cac37,0x3a59e0a9,
  118315. 0x333605dc,0x045e8731,0x1afc2c58,0xf2c598c2,0xeef9cbf1,0x81ff8d6f,
  118316. 0x9bf83c42,0x82bed5d0,0x528131d5,0x9d1d9d5b,0x00000157 },
  118317. { 0x5519258e,0x687da305,0x027de2a8,0x73f539f9,0xd6a230d6,0x69fa9747,
  118318. 0x5f5d1684,0xab1aeb23,0x5f7e41f5,0x5bbfe947,0x16a7feb3,0xbd546abb,
  118319. 0xe16d5187,0x2afbd4e8,0xbcc953dd,0x7437be13,0x00000160 } },
  118320. /* 69 */
  118321. { { 0xee9755a3,0x55f165a9,0xb82c9ab1,0x0c8d5a1a,0xab6b97e6,0x65a1e45a,
  118322. 0xab05e271,0x3004cdb0,0x6db0830f,0x9e0c3b52,0x75acbdeb,0xaae1ec1a,
  118323. 0x761e8498,0x413d4484,0xb1b9c62e,0x589e09bb,0x000001e9 },
  118324. { 0x9c72258d,0x67512081,0x5c1593d4,0x61dcd734,0x91c11fdb,0x6c627a7b,
  118325. 0x8857908e,0xd1d3e9bf,0x530bc68e,0x9aac06fe,0x6b5b44ff,0x125c16bb,
  118326. 0xdb90edd5,0x38860bb6,0xfbbedb5c,0x96fe8b08,0x000001aa } },
  118327. /* 70 */
  118328. { { 0xf257c0f8,0x323a5dd8,0xdd3a10d9,0x4884dc92,0xbbb8ce03,0x03f379ce,
  118329. 0xa47262a9,0x6217ad53,0x52e06c6d,0xa1df2017,0xc32428cd,0xf5b723e0,
  118330. 0x2c30c62c,0x1e5d3889,0x477f82cc,0xd9a90f1f,0x000001fd },
  118331. { 0x1763ab59,0x830d27ba,0x723783e9,0xcf27d93e,0x945968aa,0x81558264,
  118332. 0x1700d5d5,0x63251a32,0x03146d9f,0xcf6bbe73,0xe65bf0f2,0x6cdcf455,
  118333. 0x632323fb,0x80aa00ce,0xd96a4744,0x6e49e62c,0x00000149 } },
  118334. /* 71 */
  118335. { { 0x40574c09,0xbeff0b7e,0x3fe80e96,0xb76f2643,0xeb237d91,0x0b3bd352,
  118336. 0x7edc3102,0x3c0c62b7,0x424a36dc,0xf989394b,0x7c6c435e,0xe9ea64c2,
  118337. 0xe388d076,0x2dfc21c4,0xa4e69e4b,0xcc3852f6,0x00000139 },
  118338. { 0xbb096b91,0x5238a3ff,0x73d8d43e,0xee72c9e5,0x8c577558,0xc116db11,
  118339. 0xdc47d4b4,0x54ec89d2,0x42e1955f,0x2006dd35,0x7437475c,0x004aed6a,
  118340. 0x2bee9041,0xc1ddc32a,0xed9332c9,0x597417a2,0x000001fb } },
  118341. /* 72 */
  118342. { { 0x859bae66,0x3c0f1981,0x845d7c1b,0xab48e9b1,0x452a3c1e,0xc6ce9c03,
  118343. 0xff810339,0x2384a00c,0x5f98d6fe,0xcd7ede11,0x38a0dd5b,0xf7a00e3d,
  118344. 0x3c7e1c06,0x56dd948a,0x8e53a61f,0x9d21a7d1,0x000000d0 },
  118345. { 0x880eb3fb,0xf9cfdbaf,0x5e83f7c9,0x64cfd297,0xa28a74b4,0x61ba7d6f,
  118346. 0xdfb13e03,0xb8200d5f,0x232a6128,0x03bc8f4b,0x81a8d86e,0xd1fb92c2,
  118347. 0x706d6ea7,0x68675fae,0xefab18c2,0x9b08608a,0x0000011d } },
  118348. /* 73 */
  118349. { { 0xbbd2f539,0x17cf6146,0x76e26ba2,0x96052fc0,0xd4be4a67,0x36821d18,
  118350. 0x9f3f39a8,0x8f823422,0x433f873a,0x68b846b9,0x716f4568,0x7a1d3f36,
  118351. 0x2fd47750,0xdf603e28,0x6975e226,0x77cb02c5,0x00000003 },
  118352. { 0x8c01dd59,0xf275add3,0xb9c1a37a,0x9c213a9e,0x4dfc5403,0x690ad104,
  118353. 0x07ee0d86,0x202ee206,0x661fc40e,0x896ede95,0xd0b02f56,0x6b4d7398,
  118354. 0xe5af1a24,0xccb96991,0xc13f7125,0xd5c281af,0x0000009f } },
  118355. /* 74 */
  118356. { { 0xd7073a5a,0xc858c54b,0x861eac7d,0x87c81a5c,0xe720201a,0x51f84a39,
  118357. 0x40e003ce,0x952a9f8e,0x58f199de,0x76bdc4ab,0xd56cc02b,0x1cf12322,
  118358. 0x83f162f3,0xb6634e63,0x8f969e11,0x84c017ee,0x00000169 },
  118359. { 0x5c89f1fa,0xf1f43362,0xb697b078,0x4a02a630,0x4b05b7f4,0x33311e5c,
  118360. 0x4fede4cc,0xa7ccae51,0x4b025aa4,0x0d26e874,0xf84db7ad,0x7d5b77bb,
  118361. 0xf571c1fe,0x39ef1aa8,0x418ccd20,0x65eba928,0x0000018d } },
  118362. /* 75 */
  118363. { { 0x8abb2537,0xa37866ab,0x65b3096f,0x14ac4cbb,0x2a428ad3,0x827fa7ed,
  118364. 0x10e9e196,0x95d19f62,0x89801b4e,0x31eb97a0,0xaae8b823,0xaae77a62,
  118365. 0x5f5c9642,0x9693d62a,0x3e368b84,0xff5bfe97,0x000000ad },
  118366. { 0x492b0dee,0xa3efae21,0x9602c2ce,0x2143e9ee,0x6f3b99e5,0x21367c99,
  118367. 0xe93b8f59,0xdd78b2b0,0x1064c13e,0x8d541c38,0xf5738e7a,0xe6b970da,
  118368. 0x8373b1a4,0xaf6ecc16,0x74ae208f,0xdbfa3f4f,0x00000180 } },
  118369. /* 76 */
  118370. { { 0x907a6aa0,0xb024621a,0x407879f6,0xef56cb68,0x8168a934,0x44c38b68,
  118371. 0x9b9a9048,0x70d638d3,0x82541f20,0x6968caa0,0x1fc88b50,0x0c597053,
  118372. 0xaf635784,0x5564ded5,0xc4d494cf,0xe7e898c7,0x00000097 },
  118373. { 0x6b6ebb2f,0xe1dc98d9,0x7aa9e126,0x292a17fc,0xfa2a2c68,0xb60f0fdb,
  118374. 0xb2e1851b,0x9c63270c,0x81ca4cfe,0x898db265,0xb11959d5,0x94082638,
  118375. 0xa54b8d19,0xe44f308e,0x44e63094,0x96399eb8,0x000000d6 } },
  118376. /* 77 */
  118377. { { 0xb83769ee,0xfa00f362,0x3efc4cb3,0x72d040ac,0x57abd687,0xc3933889,
  118378. 0x940a7128,0x62264425,0xec242a31,0x909c4c8f,0x65a1a551,0xd1e48f1e,
  118379. 0x049c2172,0x68bd70f1,0x709b7fd4,0xc8692d2b,0x00000041 },
  118380. { 0xdf816784,0x4e388aa1,0x01be75ce,0x4a58c8a5,0x02a67812,0x9b49dffb,
  118381. 0xeda721e0,0xa73299e0,0xe67a65ec,0x8a0bd1f5,0x856c71b6,0xd81e91e8,
  118382. 0xc005aa30,0x37aee2f4,0x0595bbf2,0xd9400750,0x00000073 } },
  118383. /* 78 */
  118384. { { 0x010c0ef3,0xa912ac4a,0x4e81b1a0,0x0e654bd8,0x4f353509,0x8f0563dc,
  118385. 0xb47d189a,0x10dc41f3,0xf238c09c,0x122edd06,0xc41acf67,0x224c16af,
  118386. 0x83758520,0x1ccb9334,0x2275ae6f,0x1a4b5f29,0x00000127 },
  118387. { 0x3ce688b5,0x792fd473,0xdca9c68b,0x14566d37,0x541711d0,0xfce9326e,
  118388. 0x3cc341a8,0xe3ba14ee,0x2122c11f,0x6b8ab4cc,0xf5d379b5,0xc0fa763b,
  118389. 0xf1522f91,0x95e2d2ae,0x31cf95a5,0xd4e21b3d,0x000000ac } },
  118390. /* 79 */
  118391. { { 0x1d8e061a,0x4013a779,0xacc84a30,0x62707e70,0xeb2f636a,0x6ac08266,
  118392. 0x77b25c9d,0xe917ea21,0x70ff35cf,0xddb78bbd,0x041898be,0x5008db2b,
  118393. 0xce0ae445,0x0f58a4fc,0x2257d0e7,0xed092397,0x00000043 },
  118394. { 0xe2e129e6,0x2cad77b3,0x0f1be4d7,0xfb8c4a87,0x20056333,0xaee50dff,
  118395. 0x2a691543,0xbc2658c1,0xb8fe2640,0x95dc0cca,0x1965a0af,0x694eb584,
  118396. 0xedd1d99e,0x7d3baa53,0x8a1edc87,0x2df13b20,0x00000083 } },
  118397. /* 80 */
  118398. { { 0xd181c3f2,0xfead2247,0xf337b23f,0x915d35be,0x74890672,0xdb4cfcba,
  118399. 0xfda7a3a1,0xe4f70d8f,0x79275686,0x226b6419,0x6ff1f79e,0xe8040863,
  118400. 0xcf5fa4e8,0x98e84b39,0xd8a09f60,0x57aa0be9,0x000000da },
  118401. { 0x4efcea66,0xd40cecf5,0xafc76fae,0x98df2aec,0xc91585a8,0x63f19a48,
  118402. 0x13f00aa5,0xb111bda7,0x44b5cb9f,0x6687afab,0x652620d1,0xc6d5fb12,
  118403. 0xbacb35ab,0xaf953f1b,0xff94c4d2,0x99709370,0x000000ed } },
  118404. /* 81 */
  118405. { { 0x68b54c89,0xac9f56e0,0xce737c22,0x08ecc17d,0xab089b53,0x208ee83f,
  118406. 0x543fbd1b,0xb0f3a129,0x844dd706,0x1b204cf8,0xdec2e40d,0x80975c89,
  118407. 0x9399914a,0x08b011ae,0x74674df7,0x6b4ba170,0x00000017 },
  118408. { 0x8fdfc175,0x71216ea9,0x7e0f5b0c,0x77b7fc63,0xceb33a34,0x88d0285f,
  118409. 0x0223eab7,0xb679814f,0x51c6d922,0x9078720b,0x9c13f51d,0x5859d5a4,
  118410. 0xfaed60b5,0xe69f850b,0x6d0ccab2,0x2499a844,0x0000005c } },
  118411. /* 82 */
  118412. { { 0x73e7bcf1,0x41d581fb,0xdd3c17be,0x16dde61c,0xfa199fd9,0xc62997ec,
  118413. 0xc159db97,0x1a758873,0x64132830,0x4ed77896,0x2942a918,0x9672ce89,
  118414. 0x816ba4bb,0xf3ee4587,0xce54dd7f,0x4fb7a148,0x00000123 },
  118415. { 0xf009be8c,0xf05d80af,0x78df1ba1,0x62e938d7,0x312de620,0xa7e22e84,
  118416. 0x6070c4b9,0x48d29e7f,0xa1b5da37,0x5cd9c3eb,0xa4717453,0x1e51bd2f,
  118417. 0x56ab9e67,0x94098ab0,0x49f7c6a1,0xbb584abc,0x00000049 } },
  118418. /* 83 */
  118419. { { 0x1ea470f7,0xa9f25530,0xe9254e30,0xa01bf808,0x71a0038d,0x098569ea,
  118420. 0x5913ca87,0x0d2b2ee1,0xb8281fdb,0xae17004b,0x118e5c2a,0xdb5c6eb0,
  118421. 0x1fa943ab,0xa56ac64c,0x1a92d501,0x1aaf6477,0x00000053 },
  118422. { 0x06345730,0x9679ef49,0x846f37c2,0x946aaa4e,0x1a7c3aab,0xf81726b0,
  118423. 0x8166df4e,0xcb808da2,0x4e04dc3e,0xe9fb3fc2,0x76ec19b4,0x9e0b61db,
  118424. 0xeed6d13e,0x6e7f665e,0x86a75384,0x70ed8c07,0x000000e5 } },
  118425. /* 84 */
  118426. { { 0x108ce13f,0x66456e58,0x0e397813,0xb5bfc58d,0xea3949e9,0x04b6a84b,
  118427. 0x75af667d,0xea9b66bc,0xa891566b,0x7cb4d6dc,0xbf61595a,0x1b3cecf0,
  118428. 0x002e2520,0x4312c73d,0x6135a5fa,0x81d76898,0x0000014b },
  118429. { 0x841078ec,0x4047bc25,0x179c454d,0x75aa9c96,0x4851f8fc,0x6a160609,
  118430. 0xce34091f,0x998d4e3e,0x88e54102,0x9a9f6704,0x5da8ac5e,0xbf280f88,
  118431. 0x8fec230c,0xc64caca0,0x5094b775,0x0ac864b0,0x0000002b } },
  118432. /* 85 */
  118433. { { 0x8f5daf7f,0x6b606e39,0x10927506,0x48385489,0x08c58a72,0xa2255c5c,
  118434. 0xc90f3ee3,0x2f362fd0,0x08795f02,0xc9633af4,0x0425f5aa,0x71710bd1,
  118435. 0xec06dbfb,0xc2017e05,0xc1b8bbcd,0xd9c7dc82,0x000001c8 },
  118436. { 0x18b8bed9,0x7db41fdf,0xe3a23125,0xe9483308,0x7291c4bb,0xbcf91de7,
  118437. 0x41448aaf,0x9b0b972b,0xc44da462,0x95dfc633,0x01bf50a2,0x90b9c463,
  118438. 0x869e3131,0x18b66f77,0x121baad9,0xa8a4e2fa,0x000000f5 } },
  118439. /* 86 */
  118440. { { 0xca0251ea,0x8ca55109,0x27a6c9b0,0xf2aeed8b,0x5620f528,0x901a8beb,
  118441. 0xae13fc56,0x9a8421e8,0x85993c07,0x1349f1c4,0x0d1ab0d7,0x29e08359,
  118442. 0xaeb5d909,0x96e2929b,0xf599a66f,0x96c2f1f8,0x000000ce },
  118443. { 0x12be8bd7,0xe4bc4b51,0x3c67e99b,0xf4846a0f,0x4d3a3864,0xd89cc7d3,
  118444. 0x73f43981,0x1f647112,0x26dce567,0xc32bc324,0xf02b096b,0xf7134ebf,
  118445. 0x0d0682b7,0x5604f00b,0xe3ce8b59,0xfd23d7ea,0x0000011c } },
  118446. /* 87 */
  118447. { { 0xa27689a6,0xf89646cc,0x5564172b,0xd6a7dc43,0xb57cbfcc,0x30bda48e,
  118448. 0x5b1adfe5,0x9b11fffb,0x711d8bf4,0x9f2d80db,0xb70e5a5b,0xe879fdf0,
  118449. 0x6bd18a1d,0x97534183,0x8cbfd504,0xc8c526bd,0x00000114 },
  118450. { 0xef7388bd,0xd5fe725b,0xe7ffaea7,0xf1c3dbdf,0x7e6de2ac,0x78395b89,
  118451. 0x9ebf1bfb,0x81a72c9a,0x69785146,0x65265707,0xf52670af,0x3925ecd9,
  118452. 0x83d57d48,0x437bcdd2,0xc80ecb02,0xb5d732a7,0x000001ce } },
  118453. /* 88 */
  118454. { { 0xcfd376d7,0xa7f9fcce,0xa66b084d,0x6b4eab3e,0xd5b91bd8,0x6ac90d08,
  118455. 0x8aa304d8,0xaa3d5b7e,0x7f866a4f,0x27f3d42b,0xbb813ae1,0x95d19fa8,
  118456. 0xe34a9206,0xd38798d7,0xa32c1cdd,0xdf7c0a69,0x00000073 },
  118457. { 0x38315b16,0xbe2c01bb,0x9e18c8f9,0x1daa7c89,0x08b6b853,0xa3d43fb4,
  118458. 0x68092a81,0xb159e48c,0x836faad4,0x77e93d9e,0xa4699730,0xd4ed6361,
  118459. 0x6297e476,0x569cb3f6,0xe7811fa6,0xb69d8183,0x00000185 } },
  118460. /* 89 */
  118461. { { 0xab9cb764,0x18f27eb3,0x8ebc1d6d,0xbbbefc21,0x0479aa79,0x47760ddb,
  118462. 0x09e542f5,0xb4d16d24,0xbc699b96,0xe35c38d1,0x8c8d8c8a,0x13b2ae25,
  118463. 0x67a3a45d,0x8579c152,0x6c554c04,0x773b7357,0x000000d9 },
  118464. { 0x0218c299,0x9620a473,0x99f78a33,0x69be29b3,0x484f414f,0x4684a009,
  118465. 0x9a2ca4d4,0xb2c74937,0x68db7ab3,0x09c0773e,0x935c357f,0x6181f059,
  118466. 0x8b7de3f2,0x0931303d,0xe0fb6e08,0xf3effcd0,0x00000060 } },
  118467. /* 90 */
  118468. { { 0xb25d6530,0x723c14be,0x9a97d40f,0x5e015b39,0xfbf7f622,0x209c3c4b,
  118469. 0x14b4f0f1,0x83d8c59c,0x3f7e8ecf,0xcf002fde,0x1eb1ef0f,0x35d353c9,
  118470. 0x201f0c60,0x394c42a5,0x7be8ee34,0x787128ab,0x000001b5 },
  118471. { 0xb70110cd,0xa0937d3a,0x477911b5,0xe0fa4efc,0xc53a4c19,0xc6acaf5b,
  118472. 0x38d509f2,0xbd3010f3,0xe54ac1c6,0x3ee2a82b,0xe4f2a3bf,0x31ea67c3,
  118473. 0xf089c7b9,0x7a4ca66e,0x34a2362f,0x5bda2c4f,0x000000b0 } },
  118474. /* 91 */
  118475. { { 0xd1f575cd,0xb424a071,0xa5237182,0x15693b01,0x9a2c9d40,0x14133602,
  118476. 0x9c914a60,0x50c4348b,0x095b31c1,0x9024573d,0x22fd4962,0x6f975fd2,
  118477. 0xe210b277,0xa1704886,0x6dba937b,0xac29b813,0x000001f6 },
  118478. { 0x775da491,0x09edef55,0x2b6aad82,0x25953f9e,0x1bb40d5b,0x6696a106,
  118479. 0x4d5127d8,0xcfc45311,0x81ead062,0x2f21dca9,0xaf3b7123,0x3f3e4f07,
  118480. 0x9646f20d,0x12cd06b8,0x6910f5bb,0x24136369,0x0000015e } },
  118481. /* 92 */
  118482. { { 0x3ecfc44e,0x0c844fd0,0x5043b3d5,0x4095f2c8,0xc9bd059a,0x9a5fe7db,
  118483. 0xf65becdf,0x239328fa,0xa67961cd,0xe3102471,0xbbb5dfdd,0xea9e39bf,
  118484. 0x133dc5ba,0x8022b6d0,0x5f12c379,0xbed7aa9b,0x00000141 },
  118485. { 0xfd94d941,0x096f0059,0x7d4ff018,0xfc6e9f00,0x779f05e3,0xe63af598,
  118486. 0x00483c99,0x4c40f0b3,0x72a19870,0x04d2feef,0x464a4a71,0xdb773b5b,
  118487. 0x49367f1e,0x00b6770f,0x2a9fbd2a,0x4f7e0301,0x00000169 } },
  118488. /* 93 */
  118489. { { 0x8a9095fd,0x0df5dd73,0xd3ce857a,0xc4b7a021,0xe5edc767,0x90aa796b,
  118490. 0x180a0808,0x56497eff,0x66f10aab,0xb9856e1f,0x39879766,0x31298824,
  118491. 0x3ba80601,0x61748cf7,0x555da929,0x07d9076c,0x00000012 },
  118492. { 0x1c44394d,0x0b049a01,0x0ce49e45,0xf5f25ef7,0xb1694265,0x1e3a09f0,
  118493. 0x109b33f8,0x2c5bd9fe,0xa30932e4,0x07f2a43f,0xc6cf8af2,0x736abfca,
  118494. 0xf3366722,0xadf7fa04,0xfa9d26b0,0x2f1e92fb,0x000000e0 } },
  118495. /* 94 */
  118496. { { 0x63be4d4a,0x9524e4a6,0x66f3cc91,0x1fa57bed,0x7e7a7ccd,0xdd7c93fa,
  118497. 0x88c5d1d3,0x70e8cf6a,0x3f251f1e,0xb257997a,0xe3554cf5,0x0a5ec58e,
  118498. 0x065a7109,0x68d268d7,0x085089ea,0x7c23d4d2,0x0000004c },
  118499. { 0xbd52d132,0x63ae575b,0x38c81cc5,0x0fb8daa7,0xe4e63b99,0x096a6e51,
  118500. 0xb239d387,0x51d6b366,0xa5d49fed,0xed5f8874,0x43a8c07a,0x025091d9,
  118501. 0xe4686ae2,0x100f845a,0x7eb4ef5a,0x1af59d74,0x000001c2 } },
  118502. /* 95 */
  118503. { { 0xdd441308,0x5f7bc01e,0x86308890,0x0dc34944,0x759611cd,0x2af38a74,
  118504. 0x4c23ce66,0x11a71261,0xf8bafed2,0x37f317b5,0x4c93e079,0x4efbb9ff,
  118505. 0x8ecc52cf,0x880f0edd,0xddc9d82a,0x480cdd2c,0x00000028 },
  118506. { 0xc3f807ac,0xe8f1ca0d,0xbd070549,0x6a3e4fc2,0x91f8bb6c,0xad3d0a14,
  118507. 0x3d6dfacd,0xe3ee1cfd,0x5fb46ffb,0xee46b1b9,0x7dd5cfbc,0x5207b3ac,
  118508. 0xb1b8e8b7,0xd580c0d9,0xc7bdd11a,0x52c669f4,0x00000084 } },
  118509. /* 96 */
  118510. { { 0xc0ace6d5,0xa42b4747,0xbe7287ad,0xd5acb64b,0x89bc2614,0xf3304899,
  118511. 0xff05c71e,0x817fe836,0xd35ac450,0x772eb246,0x375a9c3c,0x7f5fc216,
  118512. 0xcbc0d6fd,0xfb6f9e1a,0x720e9733,0x7643c315,0x0000009a },
  118513. { 0xf3845ccf,0x4b2216b4,0x90bc05bd,0x9c174e80,0xd6049037,0x7a550c74,
  118514. 0x6358c806,0xbd7220a1,0xaa677b6d,0x838f9c41,0x66e2e08e,0x37332c19,
  118515. 0x496f6da5,0xb032875e,0x9c30630d,0x52b274cf,0x0000000c } },
  118516. /* 97 */
  118517. { { 0x8ea58beb,0x6ec2e782,0x3665fa48,0x2b404c1d,0x20b40ff0,0x546d5fad,
  118518. 0x29d3e6a5,0xfb5df7b6,0x66c81991,0xf186846d,0x6e2cfe3e,0xbe690bde,
  118519. 0x1410d16b,0x97aeb9a0,0xbacc8e92,0x59d81548,0x000000cb },
  118520. { 0xbaf66a23,0xd905d3ad,0x40dfb081,0xc3337387,0x4b00f432,0x6d5535de,
  118521. 0x07d3a03e,0xe17fe8e8,0x066bca80,0x29544ff7,0xbadffa55,0x60c2b96c,
  118522. 0x45a26ea4,0x9f018d94,0x24a34ffc,0xd5438167,0x0000011e } },
  118523. /* 98 */
  118524. { { 0xbd7f8a61,0x62a873fb,0xbbe580bb,0x5e18cd71,0x667f6980,0xfd5c9eb3,
  118525. 0x571d3dc0,0xab8d4f61,0x783f9bc8,0xe2e45215,0x24398b14,0x36c3774b,
  118526. 0x74d811b5,0x2db4a363,0x2debe3c3,0x9f7f1297,0x00000138 },
  118527. { 0x798fefb2,0xbb97f21c,0x107baa72,0x9c76fcb5,0xfadbb568,0x12fbf760,
  118528. 0xd33ea6c5,0x1a648be7,0x236134a5,0x412a2993,0x8985893b,0x4a3d8169,
  118529. 0x3e66ada4,0x6144958f,0x7687b457,0xb4dfc79b,0x00000140 } },
  118530. /* 99 */
  118531. { { 0x7abe5bb9,0x83b14570,0xe51d81be,0xae0cbfd8,0xc9827aff,0x20dadf49,
  118532. 0xa687b554,0xc3a72548,0xeeb41733,0x080263fb,0xd3827c63,0x7014fdc3,
  118533. 0xb5e3b70e,0x7d018f84,0xfbcf7168,0x1d483e00,0x00000015 },
  118534. { 0x6b578aa3,0x154e3c7c,0xd3043dae,0x511ce9b5,0xb6008101,0x55f89e9b,
  118535. 0xf405ac6f,0x4ec31112,0x2008ac7b,0x7e66a4d8,0x25c52fa6,0x73c00d39,
  118536. 0x8acac2eb,0xee1b9998,0x60b57453,0xdfa31d95,0x0000008f } },
  118537. /* 100 */
  118538. { { 0x251cf8d8,0xcc74a0e0,0x041f2bd2,0xd4d8949d,0x33ebce52,0x0b734a49,
  118539. 0x5c5bcdae,0xe1ac5f51,0x16200b93,0xd3ecdfcc,0xa793736e,0x2506a266,
  118540. 0xea6e6940,0x585a1c8b,0x9190f935,0x081cdd53,0x0000000e },
  118541. { 0x53e28412,0x055f9956,0xdb27164b,0x0d1526f2,0x1df3adc7,0xcd5625eb,
  118542. 0xdd35dedd,0xd2c453ca,0xa838ffe2,0xed442849,0x5c0ce589,0xad20c137,
  118543. 0xbd99b609,0x2d5fba81,0x622efb07,0x5be41dcc,0x000001ad } },
  118544. /* 101 */
  118545. { { 0x8f850756,0x563af667,0x52f3b597,0x86d37aae,0x796842f5,0x10d38a53,
  118546. 0xf743f997,0xcdaaf99f,0x93f1a8ba,0x2fa755e5,0x409f7cd9,0x1af04e15,
  118547. 0xd6d0650b,0x63bf9a0a,0x55abfd9a,0x67b1cead,0x0000000e },
  118548. { 0xb5f43178,0x3660a8e0,0x9cc35b33,0x56bd412d,0x880f6808,0x3d7bfa63,
  118549. 0x2e622c71,0x7f372d66,0x6ff82445,0xad7b7be7,0x8db04e51,0x0f2bde80,
  118550. 0x4bd15c8d,0xe1e781fe,0xb8e502f2,0x1f475bfb,0x00000194 } },
  118551. /* 102 */
  118552. { { 0xd63543ec,0x79482bf9,0xa117ef3e,0x985cb67c,0x160ccc63,0x8ac50638,
  118553. 0x729bdc1e,0x556cbed5,0xa22686df,0xd62ed97d,0xc81eb77c,0xb124cb5f,
  118554. 0x72fa2ed9,0x4d7b4f66,0x78335b96,0x60b29aa7,0x00000172 },
  118555. { 0xa43df7c6,0x21bfc7b6,0xbc20706c,0x85acac23,0x345d9580,0xeb6f37bc,
  118556. 0xa32a08bc,0x9d8f20d2,0xd1953c5e,0xf08924f6,0xc4f680d0,0x7d25d7c6,
  118557. 0x2de9912c,0x64e6a237,0x52ce644c,0xda1c06c4,0x000000eb } },
  118558. /* 103 */
  118559. { { 0x411dd110,0x26677c5c,0x2c991c4a,0x0d6787aa,0xa45666d6,0x53be6a41,
  118560. 0xc15f9f15,0x73e716aa,0x0e0cc7b2,0xa93b863f,0x2a624ab0,0xa4057117,
  118561. 0x1a39c260,0xe5e7656e,0x2ef6f130,0xaf8d78b5,0x00000046 },
  118562. { 0x70f38dff,0x796214b1,0x123a1105,0x3e35d828,0x957ed812,0x046a44d4,
  118563. 0x0da60161,0x618fa9ba,0x54f84413,0xe7cdd2a5,0x19ea95ab,0xf1c2563e,
  118564. 0xcb2a30b4,0xc4459e14,0x61ff9aa9,0xc748add6,0x00000183 } },
  118565. /* 104 */
  118566. { { 0x9de58caf,0x32981f39,0x8753ea64,0x05bb80fd,0x2d119486,0xc83f9f24,
  118567. 0x03eeb00a,0xf490cf06,0x7c73d79c,0x4037f251,0x724d461b,0x844209fd,
  118568. 0x272420cf,0x6b03f6d2,0xb3438fa2,0x6f4bd29e,0x00000152 },
  118569. { 0xc389e51c,0x964d034a,0x6db7d98e,0xacda55e9,0xe913c583,0xb2ae97de,
  118570. 0xfeb03440,0x0793077b,0x9d461e29,0xaa16e378,0x043bf8be,0xb0a67533,
  118571. 0xba7d8c3f,0x9d749a42,0x6bb925dc,0x7c41e6d6,0x000000ec } },
  118572. /* 105 */
  118573. { { 0xc5da8398,0x2e9b345d,0xbb38c430,0xbc66841f,0x7c3bb47a,0xce3ac562,
  118574. 0x738d2cdd,0x8fbeb12b,0x68731185,0xd4bc2ad7,0xbbd4f4f4,0x9521db1c,
  118575. 0xfe4e1b0e,0x2a690cae,0x7bfebe3e,0x375215eb,0x00000194 },
  118576. { 0x2edfd661,0x4cb234f1,0xed52c1f4,0x0149984e,0xd8f8f98c,0x32d27260,
  118577. 0x7be38590,0xfe76e4e4,0x95e8b672,0x5435873d,0xf2b00e82,0x916c397f,
  118578. 0xbad61eb8,0x3b9bf705,0xae131bbe,0x7ee90182,0x00000000 } },
  118579. /* 106 */
  118580. { { 0x93fbcb5c,0xd36fea9e,0x9fa8529b,0x382be583,0xfd611ba0,0x0b243125,
  118581. 0xcd8a2637,0xa59ae37f,0x3d8d4704,0xab78c60e,0x44c41b79,0x1bac243d,
  118582. 0xeda49cc5,0xc4001fea,0x83dc7e9f,0x988ea44a,0x000000f6 },
  118583. { 0xf077f79e,0x4d90caa4,0xd9e2590d,0xf4d17601,0xd21b4b77,0x11debbb3,
  118584. 0x9037e1b6,0x031b3f60,0x135becf0,0xf113ed82,0xf2903dda,0xf6c01379,
  118585. 0xa6f19296,0x36bde7ca,0x9dbbad85,0x57d3b684,0x0000006c } },
  118586. /* 107 */
  118587. { { 0x9abfccb0,0x963fee38,0xb9676e63,0x6c6e2a24,0x84ba6d27,0xf8768f02,
  118588. 0x465853d1,0xc38ba3ba,0x1b8ab9b6,0x6e3ab36d,0x47a07331,0x01fc9742,
  118589. 0x25233f32,0xfdd41718,0xac61de7a,0x4dacfa81,0x00000021 },
  118590. { 0xeaa3198c,0x365a9f37,0xfc8b99d5,0xcbe8a345,0xd4f5ecbc,0xa427f12a,
  118591. 0x0c237514,0xe841ff60,0x28a27b05,0x5d9e8c5a,0x62859ff3,0x2d377444,
  118592. 0xea8bde37,0x1c0460ff,0x29cf5bf8,0x0a0e49a1,0x00000181 } },
  118593. /* 108 */
  118594. { { 0x45843c3e,0x688203af,0xaabebae7,0x4601e303,0x624df62b,0x397b08f3,
  118595. 0xd21e5aa8,0x5687348a,0x9a242b0e,0x2cf12c73,0x32a76c6d,0xc848ed01,
  118596. 0xf52751a2,0xb72aa1c2,0x92c02d05,0xb63296c3,0x000000f3 },
  118597. { 0xc6f3d1f0,0xce4b42ad,0x2f532b94,0x2f0dcc53,0x83443d9c,0x57813335,
  118598. 0xdc8dd9cb,0xb50118ee,0xee87192f,0x3039e1a5,0x557419c2,0x9977267d,
  118599. 0x30f96b0c,0x462efa4c,0x3cd3c35a,0x454fb796,0x000001f7 } },
  118600. /* 109 */
  118601. { { 0x9d153926,0x10f28194,0x82b57548,0x42e28c91,0x509e94c9,0x4b423b30,
  118602. 0xde9d6b57,0xc5acc52a,0x8b3ca314,0xaa746c39,0xc63d5bc5,0x0f4ea307,
  118603. 0xe1ccc989,0x425553a2,0xf76d9194,0x271198bf,0x0000008e },
  118604. { 0x3c8e672b,0xc7900e46,0x3f2dfc27,0x703675cd,0xaf2163c9,0x704951f7,
  118605. 0x7aceaab0,0x74d69908,0x7e8d2369,0x482f21a9,0x813dc115,0xdcfbc1dc,
  118606. 0x04f6cd13,0x0ce2bc80,0x82bfaff2,0x2a54662c,0x0000003f } },
  118607. /* 110 */
  118608. { { 0x1588a8bc,0x0dcf41e6,0x210c52cb,0x6f48cd0e,0x758e7a45,0x338562bd,
  118609. 0x48b9b957,0x1600d54b,0xa6b89b9e,0x461df80b,0x098cc82f,0xf7fd4f17,
  118610. 0x14977147,0x167f01cd,0x6116c5f9,0xb1338511,0x00000048 },
  118611. { 0x5d2617f0,0xdeb76333,0x6ecb8606,0x3f9a5772,0x1b91fce9,0xa93c032d,
  118612. 0x6c84b997,0xf7a4388b,0x823ca5be,0xbfe80225,0x35a32f6b,0x6f19c028,
  118613. 0xe3cb5c58,0xf26cd5ad,0x6d0c1dd9,0x7f5ddc77,0x000001e7 } },
  118614. /* 111 */
  118615. { { 0x6ee764c9,0x3c9feec8,0xb07c82cc,0xd1bec836,0xa005b142,0x6bf1b2e6,
  118616. 0x29e8a5ea,0x70ef51a3,0x3ffe241c,0x517d298e,0x72966c28,0xbb389e28,
  118617. 0x2c7acc76,0x3a2da8a9,0x732a21b5,0x902c9126,0x0000004a },
  118618. { 0x8f7ce110,0x96c51b9c,0xaeb036f1,0xdcc33a87,0x0a6a59e2,0x82695098,
  118619. 0xe78db500,0xceaf26a7,0xc95bb030,0x82f3c384,0x24c42f42,0x6dd6e9f7,
  118620. 0x70ac4a0a,0x768dde29,0x03d22efc,0x4aedce4b,0x0000016f } },
  118621. /* 112 */
  118622. { { 0xeded03c0,0x077f032a,0x588ddd4d,0x2684a052,0x9a85be0f,0x6d09bc4f,
  118623. 0xe0b9b6bb,0xbdda0c7f,0xf2fb5887,0x19689c7e,0xec3cce7e,0xf8a96960,
  118624. 0x768d2ae5,0xb043d9d5,0xdb21219a,0x29c8081b,0x00000068 },
  118625. { 0xde59f006,0x6bf872fa,0xcb97ef5a,0xc2b9ffc6,0x58ae7ef8,0x371915db,
  118626. 0xf4ccaa1f,0xc2e23ca1,0x89c27cc4,0x1af8c60e,0xc86bdcc6,0xeee5d7e7,
  118627. 0x9bd8de43,0x9225b47f,0x4b24f08b,0x53e7f463,0x000000b4 } },
  118628. /* 113 */
  118629. { { 0xe3048bda,0x54c496d0,0x43c3de4e,0xe2b67499,0x4c2d509e,0xac2049f7,
  118630. 0x543c5089,0xb01f691e,0x105a365b,0xcd9960a3,0x78b17049,0x34d93ffe,
  118631. 0xf82c9467,0x029f99b3,0x0161a755,0x785c5ea2,0x00000091 },
  118632. { 0x953dbdb6,0xb455f978,0x97eca19f,0xea9e84d9,0x36d4d75a,0x473bd029,
  118633. 0xc15276fa,0xa9c17ca8,0x47c76356,0x9cf66133,0x039738d2,0x4a68360b,
  118634. 0x69733609,0xd3e430a8,0xe2b27f21,0x0ae532de,0x000001b4 } },
  118635. /* 114 */
  118636. { { 0x5164cb8b,0x68110e82,0x2552a67d,0x6979af4f,0x8d185527,0xe10d6d0e,
  118637. 0xfb64eac4,0xcf6c5787,0xac424592,0x8408163b,0xfce0d810,0x5d8fff37,
  118638. 0xda84c15c,0x8b284e49,0x32663ec9,0xed805567,0x00000010 },
  118639. { 0x51f3ee9e,0x106f4030,0xb38adf1e,0x2e8e3ee9,0xa13d6449,0xd3c87a6e,
  118640. 0x80e1abb1,0x27b49f45,0x0bfd7298,0xc283d179,0xafc7a35f,0x8fe50fa5,
  118641. 0xade3ad4f,0x773da545,0xd9a21df2,0x78bfaae4,0x000001f8 } },
  118642. /* 115 */
  118643. { { 0xabad5678,0xae60d8e8,0xe600c25b,0x0afa72ce,0x4c288e21,0xb9d4e0b4,
  118644. 0xd254cf9f,0x64447f76,0x959e2ba5,0x1fb36bc4,0x2961132c,0x393c44d7,
  118645. 0xfc140f19,0xd7a8881f,0x8d096648,0x27a86128,0x00000091 },
  118646. { 0x8a9e690c,0xb536c021,0xeab4fa15,0x85dcc521,0xb00ee54c,0x09af4423,
  118647. 0xaf3a8e48,0xb3793525,0xb7731d85,0xe1f36308,0x141cfb55,0xb5361d78,
  118648. 0xeffc4529,0xea41f29e,0x9f7d2634,0xcf5755b1,0x000000e8 } },
  118649. /* 116 */
  118650. { { 0xd212b398,0x01edb80d,0xd53dd373,0xd0396181,0x8a52fa95,0x0e086047,
  118651. 0xa7825e6d,0xad1e6432,0x330ece4f,0xe0185bc5,0xb078936f,0x508f7313,
  118652. 0x9e7f6ea3,0x1dc982fd,0xd5556b60,0xdbf3a602,0x000000e8 },
  118653. { 0x279e05bc,0xc3763234,0xf44453d3,0x7f5f40ec,0x7fa30793,0x310c5f4d,
  118654. 0x108d7e22,0x5cffad36,0xc2a98bbc,0xf2f01ef3,0xd7d47f80,0x30ab1719,
  118655. 0xa9b22e1c,0x7bc9f918,0xe834df94,0xf53dc52a,0x000001f9 } },
  118656. /* 117 */
  118657. { { 0xc183f89b,0xf266b49e,0x5f5806d4,0xd3fb5f02,0x94ec3080,0xd30a42b5,
  118658. 0x371cd917,0x4b6b1940,0xb7f7e26d,0xf7541aab,0x2d5b7b64,0xe55269eb,
  118659. 0x7f8036c5,0x0e1a85c1,0xda5f2675,0xa0ff0f22,0x000001ce },
  118660. { 0x3a8e11f8,0x602bd56a,0xf5f9ab54,0x29864021,0x0ccc92d7,0xc6742c5a,
  118661. 0x523f650b,0xd64569e6,0xf7fabfb4,0xc8e4681b,0xc3c9e6cb,0xb4275947,
  118662. 0x38f5ff20,0x2b3952d5,0x1f04aea2,0x818f8e38,0x000001b0 } },
  118663. /* 118 */
  118664. { { 0xe50d90f0,0x3be5bffa,0xf5011cdc,0x4cb3b11b,0xa691dfac,0xe10ca711,
  118665. 0x4ea1a773,0x62ec211d,0xe586eeb6,0x5a979ebb,0xa0c2f1fd,0x4df16ab1,
  118666. 0xc57bbfea,0xfe9e3f7e,0x5ae526f6,0x1b05960e,0x0000015e },
  118667. { 0x8630e62e,0x1c8e04a5,0x6447e1b7,0x3d00310e,0x43b4447a,0xcf1e6b61,
  118668. 0x7462e7a3,0x92abb851,0x0002724d,0x8309ea08,0xe45296df,0x1d805d70,
  118669. 0x3d4ed812,0x0f3849b3,0x6834d44e,0x2d6bffbc,0x00000096 } },
  118670. /* 119 */
  118671. { { 0x48e07711,0xd13fe58d,0xd270a3b2,0x70f83648,0x8cdff04c,0x1517892d,
  118672. 0x51411f14,0x15bb6578,0x3e4f8a55,0x6c31cd90,0x0413362f,0x73f87152,
  118673. 0xeca06d4d,0x2fe025ee,0x954e317f,0x32a6e417,0x000000ad },
  118674. { 0x69d147df,0x7e38c63f,0x710bf37b,0xb69bb06e,0x28d514de,0xb94debef,
  118675. 0x8d11c3d9,0x4b2307fb,0x0385c604,0x3b369df9,0xe7800e83,0x68ea2f49,
  118676. 0x7d501c1c,0xf028b258,0x5cef7818,0x97078221,0x00000055 } },
  118677. /* 120 */
  118678. { { 0x54c1d751,0x10c351db,0xba0f9512,0x81445301,0xbfdc8bed,0xa77eb34f,
  118679. 0xcf23680a,0x498d8138,0xe04f2860,0x928c14a4,0x16a5b6da,0x96192dba,
  118680. 0x5f9a9103,0x49dea95b,0x01724102,0x80dd4578,0x00000085 },
  118681. { 0x0e09221c,0xe9072500,0xf21de056,0x62e05b21,0xe0e60950,0x448cafa1,
  118682. 0x6f775129,0x657fb97b,0xf1f34aca,0x5d2991bd,0x49ff15d6,0xa66cd5ac,
  118683. 0xd049ec79,0xdc1d6897,0xe72baea8,0x388fca84,0x00000067 } },
  118684. /* 121 */
  118685. { { 0xa6ef1dd3,0x6520b49d,0x3ba6cd76,0x391a045e,0xf33d5f48,0x9c84980a,
  118686. 0xef07474a,0xe53cf5b2,0x78bfb1ea,0xa35b2e9a,0xeda906fa,0xeca97fd6,
  118687. 0x1b9f2cf4,0xf1a93789,0x3ab28589,0x66753369,0x0000010d },
  118688. { 0x73691faf,0x5b510496,0xd57ec618,0xdc73d3a9,0x930a8525,0x7e2921bb,
  118689. 0x40b05b69,0x094f571e,0x413bedca,0x5e96a017,0x8d1a6b98,0x9e7d4f72,
  118690. 0x3eade8b7,0x55143fda,0xd16e454d,0x859b8444,0x000000fb } },
  118691. /* 122 */
  118692. { { 0x7c667aaf,0x7c22083e,0x4a91ccba,0x33545cb9,0x8ca0e94a,0xca1e9931,
  118693. 0xe4eaa0c7,0xc3afff23,0x42f56844,0xa21ac436,0x60d52d0b,0xfcc68a8b,
  118694. 0x6a9301d4,0x401a585b,0x907abce1,0x547f762c,0x000000a3 },
  118695. { 0xfbe260ce,0x63dd3ed3,0x80dc01fa,0x2717752d,0x6f1da3e4,0xd5fab75d,
  118696. 0x5261f10e,0x5f16864a,0xd20cd6bb,0xbe7b1f63,0x221ac656,0x9d638c10,
  118697. 0x673b918e,0x3137b8f6,0x4ada2fb8,0x23eb4438,0x00000174 } },
  118698. /* 123 */
  118699. { { 0x2a1fbcf4,0x194e27c4,0x5facd5ee,0x4c0d285b,0x915e6607,0x75c2ebdd,
  118700. 0xef0a6a9a,0x1e696510,0x067cf458,0x13c5afa1,0x7bee1fba,0x2be013c1,
  118701. 0xdad279e7,0x85a406d6,0x5142cf59,0x0042951d,0x00000031 },
  118702. { 0xa22bbc45,0x6a735ec1,0x7f56f4d8,0x4ee5391a,0x236001de,0x305af9d0,
  118703. 0xaa2f8d25,0xa8b21851,0x187db78a,0x0e2c36d8,0xa1a888c3,0xcfcc083f,
  118704. 0xbd3e7d5b,0xb91dab7f,0xf4fdd023,0x62d85460,0x000000f4 } },
  118705. /* 124 */
  118706. { { 0x4972d703,0xf568ba02,0x39098a03,0xfc44ca1d,0xae28c855,0xe9b8e542,
  118707. 0x5b1b4536,0x4fd4f360,0x4c7f7e48,0x2e08b07b,0x2230823d,0x042f3b98,
  118708. 0x1889fd13,0xc9ffd313,0xc6c68359,0x56af0652,0x000001bb },
  118709. { 0x06e0f16a,0xedbf05e2,0xd74644a5,0xfc1ac2fa,0x0f92c71a,0xe59a0a98,
  118710. 0x36c800a1,0x13ae37d7,0x236178dc,0x5f20efc6,0x2b46ef10,0x443a58b8,
  118711. 0x442509e4,0xc9517dcf,0x640ed9b0,0x7d0bb415,0x00000166 } },
  118712. /* 125 */
  118713. { { 0x3d22842d,0x3aa30a61,0xb3c4ece0,0x8c6e00f5,0x6df82b79,0x8764cf87,
  118714. 0x78d208c5,0xda92d86d,0xe788854a,0x0a52d391,0xa59b0994,0x499b26fb,
  118715. 0x04c5fc9a,0x5dc133ad,0x34e3f134,0xa5c09269,0x000001dd },
  118716. { 0xfad6d673,0x6f0dcac2,0x00f3b3fe,0x6d8fdf05,0x631756e9,0xece71941,
  118717. 0x0a4d80e3,0x3990f493,0x31d13001,0xf2aca936,0x75581638,0xee91966c,
  118718. 0xe6dd5679,0x6df0f574,0xccd71cda,0xbe124868,0x00000111 } },
  118719. /* 126 */
  118720. { { 0x475cc1b4,0xf644c726,0x2b73978c,0x915fc2f9,0x0e3d7eb7,0x65a7e6d1,
  118721. 0xf40c38e0,0xbb44e21a,0xe1ad24fc,0x988662b9,0xc35606e5,0x270ba4dd,
  118722. 0x1a4f93f7,0xc3834a2c,0x3362a4d7,0x93d0c9a2,0x00000021 },
  118723. { 0xf769fd7f,0xe2cb7b8c,0x89a213b9,0x1815da97,0x6b910fef,0x7b4f8c56,
  118724. 0x26931438,0x2088b309,0x925b37c0,0x477b71bd,0x26a640e5,0xa049a921,
  118725. 0xfd21c6ef,0xd3ddf1bd,0x232a56b2,0x9b5f9d7d,0x00000064 } },
  118726. /* 127 */
  118727. { { 0x679a9c35,0xd640adf8,0xcb74d796,0xcdad98e3,0x5f8e9daf,0x464b8ebb,
  118728. 0xad4a073c,0x4738614e,0x2edde557,0xbd86c0ee,0x576ce0b9,0x77331738,
  118729. 0x4095fb96,0x9b5d3327,0xee09aead,0x72f0aeb3,0x00000136 },
  118730. { 0x64e54ba5,0xa388c76d,0xdc474d21,0x63fe7af1,0xb2a77081,0x7fa3e9d1,
  118731. 0xde1240ad,0x0447b49e,0xc720303a,0xd9f64b66,0xe6bd0213,0xb1c78029,
  118732. 0x0aa03ea5,0x1caf1c70,0x3bb85d2b,0x179180eb,0x00000103 } },
  118733. /* 128 */
  118734. { { 0xaf2ed12f,0xadbf4f9f,0xf380fd8a,0xce1d19e4,0xa39e81ae,0x0957bdb5,
  118735. 0x626ef6bc,0xf9833321,0x0cf5b28d,0x110ae5ea,0x20392cd4,0xab159450,
  118736. 0x6bc67855,0x67c49887,0xa3fd61c6,0xce7e5938,0x0000004a },
  118737. { 0x28c7dea9,0x59c5b9ef,0x0a6a7184,0xd02f95ba,0x8202769c,0x034dc257,
  118738. 0x94dd6896,0x213b0b08,0xb5dea95a,0x03730b7f,0x617ca889,0xfe243ed0,
  118739. 0xfb1ba052,0x16cf4d17,0x226f96da,0xd8691d6b,0x000001c0 } },
  118740. /* 129 */
  118741. { { 0xbf8015c2,0xaa2edf3f,0xc49502d8,0xe7f8236d,0xa6a43157,0xe890f6e0,
  118742. 0xa2d04b0c,0x318ef325,0xa809dbab,0x9cc0668d,0xda67ca21,0xdd26937a,
  118743. 0x83febc49,0x8f27c12c,0x3c9b9844,0x87b3db2f,0x00000029 },
  118744. { 0xfd2e3dc7,0x37e7aed0,0x7415fd55,0x498e8bdb,0x58a45f25,0xfc0d6c9a,
  118745. 0x209c85d0,0x83d5baba,0xd579e1ee,0x31ec8dc6,0xa502bfed,0x1f4cad0b,
  118746. 0x1f41bef1,0xc432e6ce,0xbbffca65,0x3b10afaa,0x00000191 } },
  118747. /* 130 */
  118748. { { 0x53053af7,0xbd9f7df0,0xb28a1cf4,0x60304765,0x7ce90438,0x441778fc,
  118749. 0xac8c5ddd,0x8fbed36e,0xfb59ec61,0x27b1313b,0xa1b1becf,0x9d2656ff,
  118750. 0x945973a9,0x334e1345,0xc362b595,0x3261888c,0x0000018c },
  118751. { 0xaa7f6ff8,0xf413a414,0x3fab7c7a,0x092aeb88,0x7cc307ba,0xfa1d886b,
  118752. 0x2346100e,0xdc81c125,0x02140c93,0x93d4d273,0xe6104835,0xa1ed7e3c,
  118753. 0xdf1795f3,0xe2b91ecf,0x369ed416,0x160dc11a,0x00000191 } },
  118754. /* 131 */
  118755. { { 0x8b57d7cc,0x9a72f46e,0x4bf02386,0x3140b0e5,0x05b3a91d,0x886c396e,
  118756. 0xa4ec26e0,0x1b9ab3a9,0xc50f58e9,0x742feaeb,0x55e26af0,0x1592c608,
  118757. 0xbb1cd9f7,0x943cd476,0xc7f02c89,0x3ed97fd4,0x0000017c },
  118758. { 0xe6d54964,0x53b02503,0xc6a318c0,0xd9bd1162,0x9cc28c22,0x18ff6cf4,
  118759. 0x03534640,0xa45c7840,0xb4cc0668,0x8ea3335e,0xf42dbe03,0x7ad727f8,
  118760. 0xfdf6c3cd,0xb157e911,0xec992d76,0xa7f894c9,0x000001b3 } },
  118761. /* 132 */
  118762. { { 0xaf09ea77,0x91e6e397,0x75dc25c5,0x26a760b9,0xb94a197b,0x8c040c08,
  118763. 0xb68ce619,0x041baca8,0x5bd23564,0xa19a0d15,0xd977b33f,0x86ca5b94,
  118764. 0xe5fbd029,0xf31f87f8,0xb1901f99,0xf76c55a6,0x000000b8 },
  118765. { 0x3846ec9f,0x175bf8c3,0x9deaca46,0xf462205c,0xa3108df0,0x92cb5ec0,
  118766. 0xcfaed928,0x879db283,0x65049fb2,0x477dc004,0x96ee5031,0x48d24bac,
  118767. 0x56adce45,0xa7db6b16,0xab1c684f,0x0110cdab,0x000000fc } },
  118768. /* 133 */
  118769. { { 0x4d308bf2,0x151b66d8,0xd6638004,0x99013c9f,0xfd383bf9,0x6892df92,
  118770. 0x3ffc8efc,0xa10efd84,0x313ea287,0x527e316c,0x3a0df740,0x8ef6e3cd,
  118771. 0xf6ebd2a1,0xcb96e430,0xa70ee4ce,0xc1ebecf2,0x0000018c },
  118772. { 0x1a70404c,0x80d14ad7,0xf9ce2a30,0x6ad21dd0,0x3aa3e072,0xb94cbcde,
  118773. 0x6363a690,0x0ab59611,0xc6b1e2b4,0xe70bff45,0x66ceec5b,0x1296dd0b,
  118774. 0x747757c0,0xd4cb2a74,0x3d7d91e8,0x08988ca6,0x000000aa } },
  118775. /* 134 */
  118776. { { 0xf8db0396,0xaa2dcfca,0xb422da76,0xe8ae8f37,0x96485724,0x652f8349,
  118777. 0x7bf1493f,0xf647c3c4,0xb0247a4e,0x8b600b46,0x7aebda8e,0xabf3e439,
  118778. 0xa7958df0,0x2e1d231f,0xf881bab2,0x38e692b1,0x000000ef },
  118779. { 0x26cf3047,0x1f3c1689,0x59539858,0xdad14f94,0x293f20b6,0xfde85d1c,
  118780. 0xf57abb17,0x2ea5436e,0x1794de38,0x0d1a8ffc,0x2bfecd2f,0x9ba508e2,
  118781. 0xdb786042,0x110f0a7f,0x7cde31f8,0x2ade6f64,0x00000196 } },
  118782. /* 135 */
  118783. { { 0xfec78898,0xc996a537,0xde0fa77f,0x0b39de72,0xd34cb08f,0xf6d076ac,
  118784. 0xda78d353,0xacd8bb82,0xa0392cc1,0x5fe804d3,0xe581549d,0xab7adede,
  118785. 0xc067c6d9,0x883901a0,0x4ed93f37,0x5855ffa2,0x00000191 },
  118786. { 0xbf9ebef3,0x29570e36,0xdf4b3177,0xe21046a5,0xa6816b5c,0xf9b89a95,
  118787. 0x288d0e11,0xadf39281,0x3979159a,0xd6baabe5,0x5c8fabb2,0x411afee0,
  118788. 0xe5c7af10,0xf192c3af,0xd7dce37b,0xaa72e81c,0x000000f7 } },
  118789. /* 136 */
  118790. { { 0x16c386ee,0x20fa3c0f,0xd4c09839,0xb33b0469,0x876a3136,0x79e0d722,
  118791. 0x3c406c06,0x343c0a92,0x4debe27d,0xef220e3e,0x196f00ea,0x09d7b1e1,
  118792. 0x24a9dcff,0x4a0f5dd8,0x99c1d085,0x53582ec5,0x000001e2 },
  118793. { 0x5138c7ed,0xcc8ef262,0x6547f88d,0xdec43194,0xdd0a9488,0x2b6e53ad,
  118794. 0x8257ebdc,0xeb9f1efa,0x1f08c989,0xc583c6eb,0x40163768,0xf1736911,
  118795. 0xdbc20e3d,0x6282ff8b,0x9cbd514e,0x26b81005,0x000000d5 } },
  118796. /* 137 */
  118797. { { 0xa0025949,0x2449522f,0x0bbd8945,0xb26d888f,0xe637216f,0x33442f5f,
  118798. 0x472827f6,0xd8ec3b64,0x99fc2681,0x91d8a1a3,0x68c7710d,0x6d232ead,
  118799. 0xe51b2762,0x8e5bfe2f,0xfd109fa7,0x0f9f4fed,0x00000004 },
  118800. { 0x6b4a05e0,0x1952ea51,0xf21c78eb,0xcb0d48ee,0x1997dfdb,0x64d36619,
  118801. 0x8b4c21fd,0x0d11b204,0xbe92303a,0xa6f569b6,0x78c5e809,0x2b8f6096,
  118802. 0x36805d8e,0x7226b5ab,0xdb349ca2,0xd6cff180,0x000001bd } },
  118803. /* 138 */
  118804. { { 0x943cc612,0xa49f8576,0x832b31c7,0xc914319e,0xcccadebd,0x9225e297,
  118805. 0xb0619821,0x4918fb42,0x25b1cc7c,0xaccb3084,0xa646e5f0,0x751d3347,
  118806. 0x590e3e22,0xeafb4aae,0x2c4a0008,0x82146038,0x00000151 },
  118807. { 0xbf96a461,0x3c2481db,0xb52a3ba4,0x51c122e9,0x464db08b,0x21c2858e,
  118808. 0x6d6a081d,0xb1014b78,0xf533cef7,0x167d3ed4,0x81545f7c,0x6cfb3294,
  118809. 0x449b7b9f,0xea46d31c,0x9621c299,0xcfad7613,0x00000081 } },
  118810. /* 139 */
  118811. { { 0x478a7f0e,0xef796327,0xde17705d,0x914183e2,0x572117e8,0xd24a26df,
  118812. 0xb7cd52cf,0x3cdb1b09,0xad83c160,0x9e42b9fb,0x709ef8c9,0x6971d2ea,
  118813. 0x8ee54ccd,0x1894fc5b,0x34a520fc,0xf757b4e5,0x000000fc },
  118814. { 0x86b62347,0x5a5518cc,0x7bc2a928,0xec51c9d2,0x2966727f,0x2eea2b05,
  118815. 0x0ae43e6f,0xbc8a8e3a,0x05ca066b,0x80535b5e,0x8833986d,0x91ffcdb1,
  118816. 0x32374cdd,0x2f4a5bba,0x0d202243,0x08763a49,0x00000124 } },
  118817. /* 140 */
  118818. { { 0x4efac14d,0xe498b972,0xa79a9d3c,0xb6f4bf8d,0xd6e07c29,0x0f1e8dbd,
  118819. 0x71771538,0xfac30cfd,0x71b03263,0x4c91ed22,0x19b455f5,0xbf938335,
  118820. 0x127092bf,0x76a5e789,0xb4813bd9,0xa97674e1,0x00000128 },
  118821. { 0x583e5924,0x29b63c41,0x8f171d06,0x61f9aff1,0xab227a28,0x2b45b3cd,
  118822. 0x8a11ab70,0x939d5dda,0xe8db6971,0x2bfb47b0,0x0ec10805,0x562379df,
  118823. 0x24ce1801,0xaf5a6481,0x34f94aba,0x8d98c434,0x00000150 } },
  118824. /* 141 */
  118825. { { 0xcfffc80f,0xdea9fe73,0xd43473f6,0xe23e2e9b,0xc9d37ba7,0x27fb3ed3,
  118826. 0x7a3fc357,0x733766d2,0x8e04a03d,0xd0db4cf3,0x2bbe0f43,0x8ce01752,
  118827. 0xda986f4f,0xd87eb719,0x2fe6b037,0x6d1b50ae,0x00000153 },
  118828. { 0xda40bab1,0x371f5def,0x9b2bda63,0x07d6a8af,0x0d4aca87,0x5e8a5c89,
  118829. 0x643ff8ab,0x4d72f0ff,0x4bf8ec2f,0x9c4c10d9,0x0eb93e22,0x36b0eaba,
  118830. 0x1d2dfd01,0xbc4b0e8f,0x9d34a082,0x9f252e5a,0x00000142 } },
  118831. /* 142 */
  118832. { { 0x7d0e7020,0x4affd4c1,0xb5482168,0x9b169aaa,0x588f348f,0xdbe01708,
  118833. 0x885986bb,0xdaebf6ff,0x15f9c381,0xb33987f5,0x04a94a7b,0x7e455f2c,
  118834. 0xa0ed6849,0x39a41442,0x1ef7798c,0x1c1ad4a6,0x00000154 },
  118835. { 0x072709c4,0x7647b628,0x8810e5fe,0xb330d68b,0xe92e0f63,0xd1bd8874,
  118836. 0xf8bea9ba,0x144e4fb9,0x8318981a,0xc15afc18,0xb68c6a07,0xe19c5c82,
  118837. 0x36e00b66,0x858c57a2,0x07cb7aec,0x9b255110,0x00000011 } },
  118838. /* 143 */
  118839. { { 0xc887027d,0x121ced27,0x2bfab286,0x6050f335,0x19d511e2,0x6e373c1c,
  118840. 0x7f4c69f5,0x02d4c3a9,0x25226bb4,0xe6f356af,0x83e7ac30,0x3b9011c3,
  118841. 0x33d8fdfb,0x43b0c23d,0xaf2ea363,0xa8c390f7,0x0000000b },
  118842. { 0x7e851bac,0xc430c3d6,0xa5f544fc,0x8991c389,0x67fba061,0x006bbc64,
  118843. 0x97cbdbf4,0xd49d024e,0x7734adad,0x4539b7dd,0x28cb6d2a,0x90ba8f9f,
  118844. 0x4de4b3ad,0x7a921830,0xa7b96928,0xb28732ef,0x0000006a } },
  118845. /* 144 */
  118846. { { 0x22ed5986,0x71dab52d,0x58533e06,0xdeee627a,0xcf155fe3,0xe8fee37a,
  118847. 0x7ae8b132,0xcd61490d,0x34a08b94,0x2706e185,0xf9c15c30,0xa85ffd52,
  118848. 0x51a5ad46,0xd5a224f3,0x54d700bb,0x44d1b6d5,0x000001e6 },
  118849. { 0x862e4e9c,0x96830686,0x48763fe4,0xfe5cd76c,0xc0839caa,0x60309679,
  118850. 0x8d83d62d,0xc0e4cbeb,0x11bc4ae2,0x911e254e,0x64fca062,0x96a0d7c8,
  118851. 0xe9a27045,0xf5785dd5,0xf3e0412c,0x2f4677d0,0x000001be } },
  118852. /* 145 */
  118853. { { 0xab01a6dc,0x4c0012dd,0xae1adb69,0x391bd6c1,0xb9b05079,0x3ae7daec,
  118854. 0x62a1061f,0xc2714f9e,0xa96536b7,0x71978ee7,0x5e17654b,0xeec11bd0,
  118855. 0xefab3dd4,0xc71166e0,0x87edbf61,0x0f7aa572,0x000001d7 },
  118856. { 0x51eb5932,0x26ea6f7d,0x5f882ca4,0x354ea0aa,0x7739f7dc,0x175b6097,
  118857. 0x9be57934,0xd335192a,0x78545ecc,0x9801f423,0x7b643c9d,0x32b8e256,
  118858. 0x23e3abec,0xb9411dd7,0xcf1c6509,0x656dea68,0x000000ee } },
  118859. /* 146 */
  118860. { { 0xa0890deb,0x4d38e140,0xbceb84bd,0xbf7bd87d,0xba041dec,0x51f0ff72,
  118861. 0xa6820be9,0xafeec70a,0x8c486298,0x755190a3,0xe7010ec4,0xecdba558,
  118862. 0x8c7879b1,0xced91db8,0xef5e215c,0x08de3e4c,0x0000014c },
  118863. { 0x16266da2,0x9c1534ed,0x7b4c9009,0x9ce322eb,0x69927688,0x37decaef,
  118864. 0x05c2844d,0x6525097f,0x1ac519ab,0xd23b7e13,0x65a3cc86,0x682ebb72,
  118865. 0x628c4575,0x0c531db9,0x73805373,0x2e00e8b8,0x000000be } },
  118866. /* 147 */
  118867. { { 0x57ed32e9,0x3807c800,0x7c024997,0x427e40cf,0xabb54830,0x58506abb,
  118868. 0xce820bf4,0x5649776f,0xb2c43e81,0xb5353293,0xcfef6648,0x671e8353,
  118869. 0x903bdca5,0x27217d3f,0xa813fd79,0x40a9c109,0x000001dc },
  118870. { 0x3db21a38,0x6beaa6c3,0xd73ef7e4,0xcae222e1,0xbd1d507f,0x1ff684e7,
  118871. 0x587a77ab,0xf5bac664,0x0c64a4d6,0x58c74f62,0x6a7c378a,0x4ca837d9,
  118872. 0x3e42e409,0xf43df531,0xfb49e14f,0x8a9a4347,0x0000013f } },
  118873. /* 148 */
  118874. { { 0x992f8923,0x85ab4edf,0x6fd209f3,0xe24aa5e0,0x1b1340ee,0x27be9b87,
  118875. 0x91e0bb40,0x2957d11f,0xf3d4c62c,0x425afad2,0xc7ff7aaf,0x2d231286,
  118876. 0x0114cbe9,0x96412b2b,0xc3e23529,0x6706a231,0x0000019f },
  118877. { 0x225c02af,0x06b3bbd2,0x3fa3e98d,0x53ebc166,0xb84f482e,0xa6df2b75,
  118878. 0x2bfc55df,0x912b4521,0x512a73da,0x30bdbd40,0x3d53eaa4,0xac0f43d9,
  118879. 0x0c27fd53,0xfc358fe4,0x919424b4,0x2cb183be,0x000000a3 } },
  118880. /* 149 */
  118881. { { 0x3fa6a746,0xe39b0c2d,0x1d5a24a8,0xe84a7922,0x78cdf2b5,0x70a58914,
  118882. 0x30666cb3,0x8a88067d,0xf6d71d06,0xb09a709e,0x0065d184,0x50007a3e,
  118883. 0xb8dc9448,0x7046af4b,0xc65493ac,0x2b6a3129,0x000001fd },
  118884. { 0xe45f2771,0xd3d5d5bd,0xf432ed95,0x8542b08a,0xf232a6bb,0x2ecd40fb,
  118885. 0xe8beccb2,0x0fcb6143,0xbf8e247f,0xcecc513a,0x8da3039b,0x955d56f7,
  118886. 0x56c2a0df,0x9157c619,0x3031fe2a,0xa6d35cbf,0x0000018c } },
  118887. /* 150 */
  118888. { { 0xbe0c4923,0xdd800b1b,0x6902907b,0x046ae740,0x957bd0c7,0x2398b37f,
  118889. 0x9655f8b8,0xaa8e1a9d,0x500f4150,0xcd2927fa,0x202e7aee,0x826a9c6d,
  118890. 0x9f29692e,0xb4cf58b3,0xbf41577c,0x3093868c,0x0000011f },
  118891. { 0x333ed442,0xadcb5e7a,0x906fef7b,0xae5c8e2f,0x3d98f228,0x2d9b0123,
  118892. 0x7ffe125c,0x4632f2da,0xba231835,0x59487731,0x12d2c512,0xa0caae5b,
  118893. 0x9857d9c4,0xbf00e658,0x54f200f6,0xc5d10086,0x00000172 } },
  118894. /* 151 */
  118895. { { 0x2fc283e0,0x58954046,0x7ee0880e,0xf7633984,0xb7fd1622,0xfaf1b40e,
  118896. 0xf598c5ed,0xecf5151e,0x7e00d9bb,0x6b4d92f7,0xa8c43fd4,0x7543e3b3,
  118897. 0x6511d1d2,0x3994e12c,0xaf05b6d3,0xdd841a1d,0x000000c6 },
  118898. { 0x23b991ad,0x23da17e0,0x71fba514,0xaab2b213,0x0ddc1879,0xb417ec5a,
  118899. 0x5f63acdc,0x173bc8ad,0x1e2a7d50,0x2fcf5210,0x6106d008,0x63373fd0,
  118900. 0x7db012cf,0x1e8211de,0x576545ef,0xa07766d9,0x0000018c } },
  118901. /* 152 */
  118902. { { 0xaf80dfaf,0x8e4347b9,0x9c4667f3,0xa80b631f,0x6ddbc238,0x6ff1db26,
  118903. 0xaa8718a0,0x6161e365,0xaf31c35f,0xe7f7ac90,0xfc6846e8,0xc03831d1,
  118904. 0x684175b4,0x1e669d10,0x934b731a,0x6da9d620,0x000000c7 },
  118905. { 0xa3e4e78b,0x981f597b,0x55099f9a,0x2c14dedc,0x93088c61,0xbf373995,
  118906. 0x9b207458,0x7c568307,0xa2276900,0xc4440c47,0xf7e6daf3,0xb6df23c8,
  118907. 0x42929103,0x4f662c25,0x8b3b7963,0xf4ea6db1,0x000000f9 } },
  118908. /* 153 */
  118909. { { 0xced36049,0xc669eb88,0xf41b99f8,0x87a4ffe1,0x6a72e108,0x690b7563,
  118910. 0x65a0bb8a,0x67dd6a8c,0x96e42955,0x42cf8c58,0x1aabffad,0x5286b5f3,
  118911. 0x8f6f26a4,0x1f7dfaf2,0x0e1ae503,0xc5d9e0ac,0x00000120 },
  118912. { 0xacc10da7,0xafbee3ff,0x944946e5,0x67e2d5f9,0x3c4220ff,0x8ec17e86,
  118913. 0xbd6f632e,0xfe6f7414,0xc3fc9ef4,0x4a9e3c0f,0x03bfb870,0x25ff3cba,
  118914. 0xbb03342d,0x18fd3600,0x0050cd2e,0x1e63e753,0x000001ac } },
  118915. /* 154 */
  118916. { { 0x8f3d6a02,0xdd83d07c,0x7ef4d0d1,0x71fc143c,0xd4c7af61,0xca994bf0,
  118917. 0x827c5cf0,0xc8a93e98,0x2b697882,0x4a102c7b,0x8a55e8ba,0x633c87d5,
  118918. 0xcc2d64f0,0x1ae8822f,0x986d01fc,0x2ce9b53f,0x000001c1 },
  118919. { 0x95dc1b79,0x859639fd,0x3f4e616a,0x2728f754,0xede2fb9f,0x6e703c4c,
  118920. 0xd50fae9e,0x042f7680,0xc2d530ed,0x0546bc3b,0xcdd598ac,0x00a4006b,
  118921. 0xe1294910,0x3f3286c9,0xb6bf9629,0x77782255,0x00000146 } },
  118922. /* 155 */
  118923. { { 0xe30c98fe,0xaf81421e,0xfc2cd705,0xdeb0feb0,0x14df6ad2,0x9b2c4ca6,
  118924. 0x9ba314e8,0xd38134de,0x4f04b16d,0xa443deb8,0xf07f8ca8,0xfc556ee0,
  118925. 0x3a4f3917,0x3c1c83bb,0xb1adcd41,0x8397dd24,0x00000199 },
  118926. { 0xdf4781e6,0xca01e17e,0x46f1f901,0x32d7c319,0xb53090da,0xa227a613,
  118927. 0xa7c8c607,0x2495b1dc,0xddc69709,0x1cf2fbee,0x45608098,0x1d3d82bb,
  118928. 0x085134d7,0xcfcddda3,0x96798c41,0x3dd171b5,0x000000d2 } },
  118929. /* 156 */
  118930. { { 0xd4dd7e96,0x97a40f84,0x8409fc0c,0x7114c8ea,0xa9d11393,0xc56f29e6,
  118931. 0x8fd8c6d6,0x3b606621,0x00269e7c,0xad3baa86,0x05929d5f,0x1413c6b0,
  118932. 0x222e365b,0xc1ad7e40,0x4798aaec,0x6a82621a,0x000001d3 },
  118933. { 0xc1003c81,0xaeac45c4,0xf43d8602,0x9ef9ef5a,0x60f77469,0x36a65f5e,
  118934. 0xbf5d2858,0xf312e7ab,0xc84acef1,0x2f53ec81,0x9d248b52,0x63e32ca2,
  118935. 0x81e65c60,0xfe9aa7c5,0x52841973,0xe3686c9a,0x00000017 } },
  118936. /* 157 */
  118937. { { 0x9e90de99,0x0b2efe65,0xad05ab63,0xbe4485bc,0xe14e4892,0xc48a6a52,
  118938. 0x22628687,0x2ad85430,0x5eb3db54,0x261f0e95,0xd45e5841,0x48e81863,
  118939. 0x8ed75739,0xcfe1ce0f,0x7d84ade4,0xbd6f1ff5,0x0000003f },
  118940. { 0xd1bf968c,0xd43711dd,0x48dfa472,0xd558d7cd,0xe425a566,0x49f09223,
  118941. 0x5c26d041,0x0cf83338,0x7c2c1743,0xbe7b81f1,0x5143d9d9,0xe3bdc33e,
  118942. 0x94fd3fae,0xf385ac35,0x9fd1811a,0x7551cf42,0x00000113 } },
  118943. /* 158 */
  118944. { { 0x20193bb2,0x4928f55b,0x7310b872,0x96e579d0,0xd345d276,0x5ee06309,
  118945. 0xa871868a,0x9a43e432,0x11038683,0x28c113e1,0xa332f108,0x8286ecf3,
  118946. 0x0385cbb4,0x3348aa37,0xef158daf,0x698ffcaa,0x000000c6 },
  118947. { 0xf6908745,0xa044c54a,0x6a3353fb,0xa6b336e4,0xd561e821,0x694c2852,
  118948. 0x3634917f,0x1b297970,0x81f61315,0x6e1023b9,0xef46a5ef,0x6817dc2b,
  118949. 0x8e114f7f,0x93dea0af,0xed72c5bf,0xc3cf3cd5,0x00000136 } },
  118950. /* 159 */
  118951. { { 0x7b080de4,0xbb8799ab,0xd69d8396,0x3b8f781d,0x986f8f63,0x76b42aaa,
  118952. 0xa54bc5ca,0x5d74c038,0xa9c2fbb9,0x76fcb605,0x80178930,0x8451b440,
  118953. 0x9d286f0d,0x40f00c38,0x0c543263,0x3038e952,0x0000014c },
  118954. { 0x6977aad9,0xc94bc381,0xd7087be3,0xadbfd082,0x875fed08,0x06d0820c,
  118955. 0x345656fc,0xe1ce84d4,0x0fd6dd4e,0x71c4d8e0,0x6a5fab40,0x23338b22,
  118956. 0x0baeeb6f,0xd477eac1,0x5f80c26c,0xe4db08bb,0x00000078 } },
  118957. /* 160 */
  118958. { { 0x1078342a,0x0111d12a,0x559a1064,0x0534725e,0x0fd3ffdd,0xea459d59,
  118959. 0x06f0ac1f,0xcf694a9f,0x3e19bc69,0xf6d24adb,0xb9ddcd00,0x3ce38f5e,
  118960. 0xb632dd4e,0x38400f66,0xe15e1c55,0xcab8fdfb,0x00000085 },
  118961. { 0x8d09422f,0x0a943f6b,0x0f988c3b,0x17d29756,0x2ef2e4d9,0x55a441fa,
  118962. 0x35f7c13f,0x6743523b,0xedaad3ff,0x274d3407,0x9347242d,0x59411435,
  118963. 0x3bb8615d,0x1cb27301,0xbd7794cd,0xa0437004,0x0000007d } },
  118964. /* 161 */
  118965. { { 0x2d712c44,0x824b99a6,0xa6962577,0x148368f8,0xd65e2287,0x8ed68432,
  118966. 0x6f5bc5f8,0x14028306,0x4ec3479d,0xe6cf3121,0x9326db70,0x96db6f44,
  118967. 0xca32936b,0xca5ac098,0x2fea21af,0x69e248c7,0x0000004d },
  118968. { 0xa71269fb,0x0aa89092,0x18650b60,0x2f6bdba8,0x9fb55db2,0x1d9cc2a3,
  118969. 0x6311e9d0,0x0fceb0df,0x90ac2c1d,0x6faeb79c,0xcb1f372a,0x2393b222,
  118970. 0xbc8c4193,0x62a6f3df,0x2fe8e674,0x9dea30b2,0x00000001 } },
  118971. /* 162 */
  118972. { { 0x12b3118b,0x7df689ac,0x6cb6ea56,0xd06ee39d,0x187cd978,0xcfcc22c2,
  118973. 0x8d537d87,0xb985b681,0xe9f56db2,0x75845152,0x5e098c15,0x0f839871,
  118974. 0x3b212cd2,0xbe96a5c8,0xd9ac1c47,0x3dda0338,0x000001fb },
  118975. { 0xcfa0a9b8,0xf06b7fe0,0xe22dcf75,0x9478bac7,0x136887c8,0xf3815e04,
  118976. 0x914c54bc,0xed811dde,0x0f51ea64,0xc8c24160,0x4c870577,0x63914d83,
  118977. 0xa8abbcb4,0xed24e552,0x2644f52e,0x9e5eb9e8,0x00000001 } },
  118978. /* 163 */
  118979. { { 0x66d52313,0x1f65a04e,0x4d3f72bd,0xfd694545,0xa6b7ae11,0x2bc0ddaf,
  118980. 0x571ab247,0x921f79d8,0xae5a8d68,0xd4c5f966,0xaec5ce13,0xfde17716,
  118981. 0xb764bd39,0x70e6eda4,0x990d6783,0xffe94085,0x000001ef },
  118982. { 0xd88f92e8,0xf3fa0e27,0x9c77123c,0xa21ef0fd,0x89274dba,0x6259974c,
  118983. 0xb9ba2762,0xd4cfa4a5,0x46ebcaf6,0x10c909d2,0x8f8e2870,0x0317a10d,
  118984. 0x453aeea2,0xb0771de1,0x68c6b0a3,0xdf0c4791,0x000000ea } },
  118985. /* 164 */
  118986. { { 0x4c854477,0x11bc1e48,0x8638e47c,0x2bec25b4,0x869c54d9,0x43d4e02b,
  118987. 0xbe1e7ed2,0xe318de32,0x6b460c4a,0xf5471eb0,0xaa426afe,0x38ae7bf3,
  118988. 0xd8452dc1,0x23ae26dd,0x5782de9d,0x9d3fc1d5,0x00000164 },
  118989. { 0x0ade1979,0xd87cae31,0x3b4bc728,0xa847041d,0x56c3c9be,0x38923c40,
  118990. 0xd74ae467,0x36fe182a,0xecbe49ae,0x92bff6f4,0xdc41f9f5,0x6680db80,
  118991. 0xe4630715,0x35bac06f,0xd6d07307,0x6d68b4c7,0x000000c0 } },
  118992. /* 165 */
  118993. { { 0x854dfcf2,0xdbe22be7,0xa6ae3bd0,0xee21a7df,0xa521ec46,0xf4633ad1,
  118994. 0x41a9484c,0xee94527a,0x2aa123f3,0x1145eb9b,0xcae3ca92,0x5634a82a,
  118995. 0xfc85d925,0xe176aca0,0x19082d8c,0x504cf7fc,0x00000078 },
  118996. { 0x3799793c,0xd74ce7c4,0xb5519fb5,0x74ddd618,0x95ff9808,0x2cf6df93,
  118997. 0xb8bf61e6,0x00ea45d1,0xdcfcf54f,0x26863613,0x030035b0,0x67423b76,
  118998. 0x4028a9cb,0x9fbc7534,0x051a077e,0x7b52ce37,0x000000f4 } },
  118999. /* 166 */
  119000. { { 0x96bec962,0xebf7d8ad,0x17e0107a,0xd1cc81f6,0x214e1058,0x64c44509,
  119001. 0x42394c9f,0x6c298c43,0x1a660513,0xd910052d,0x90df8243,0xc3643754,
  119002. 0xfe5cdea4,0x2313be1e,0xd27fb7b1,0x249a60f7,0x00000076 },
  119003. { 0x1cf593a0,0x74975838,0x8364c59e,0x0c9ceefb,0xe05c9991,0x2f5a1333,
  119004. 0x421808e3,0x30ea5e1f,0x4f5e8f4f,0x56fb3a4f,0xb6c0cb47,0x2cae6e2e,
  119005. 0x08bdcc6a,0x60b307fd,0x0ff8c117,0xee17901c,0x0000001a } },
  119006. /* 167 */
  119007. { { 0x89aa9e14,0xc048336b,0xf676700f,0x66634271,0x906b6980,0x4daa0433,
  119008. 0xebb7ab23,0x30247ee1,0xeb59a053,0x969b4aa7,0x8000f4d5,0xd78ef825,
  119009. 0x46026b5b,0xe5db38eb,0x7d6856c4,0x06a43e5d,0x0000003b },
  119010. { 0xed2a0ee7,0xaa0ae838,0xf16e8813,0x04bbe528,0x4ea64137,0x8ab6df5c,
  119011. 0x06e29867,0x5be80cb6,0xf459ed2b,0xf19b1b72,0x1761521a,0x7a9cce4d,
  119012. 0xaa516f3b,0x39aff994,0xb3416925,0x97d92e86,0x00000007 } },
  119013. /* 168 */
  119014. { { 0x5af3a8ca,0x25aeede1,0xa5c351ec,0x33924782,0xf93ec080,0x41e7a3fb,
  119015. 0xe6f425b4,0xb04f93c4,0x81e76009,0xe4ec12ec,0x5180ffc6,0x797366d4,
  119016. 0x0e0aef3a,0xd293cbb5,0x68d71d91,0xa1496944,0x00000061 },
  119017. { 0x675a67a1,0xf52c541c,0x8f5fe906,0x67d38d30,0xf6be988e,0x2a70bccc,
  119018. 0x18589886,0xae03ecbe,0x7067045b,0xecd02616,0x10ca8d96,0x1facdd99,
  119019. 0x30c0735d,0x7aa10a82,0x3328f21c,0x2a27e554,0x00000015 } },
  119020. /* 169 */
  119021. { { 0xe6057e27,0x3dd609e0,0xc7a454da,0x87e8b6a7,0x1f32dd5b,0xff599145,
  119022. 0xd0ef51e2,0xea397a88,0x25567546,0xc49866a1,0x3228b480,0xea45c8b1,
  119023. 0xdd01997a,0x3dbe0e77,0xc51867d2,0x0e2ea28f,0x000001f8 },
  119024. { 0x69d0820b,0x6295412d,0x1ea65a18,0x03173127,0xeb06380d,0xc27c8221,
  119025. 0x75fe9706,0x7ffd4efc,0x5a71d250,0x7b396a57,0xc7cb7543,0x61c80051,
  119026. 0xad4dbee3,0xe07db4d7,0x9b192d45,0x1c7481f4,0x00000143 } },
  119027. /* 170 */
  119028. { { 0x08e1cc4d,0x5eab2d04,0xad2dc1ee,0xe93758d3,0x5c9c7393,0x0ceb7dfe,
  119029. 0xd3379683,0x530d86a9,0xe24f86d7,0xef5283ca,0xf0b1bb0b,0xab5d1a64,
  119030. 0x54db4e3c,0x96aabc1f,0x3bc00c59,0x3e3d87cc,0x00000144 },
  119031. { 0x1d60e7b0,0xe50a8213,0x5d33d018,0xfc9b629b,0xfd05338d,0xc54aee42,
  119032. 0xe821c6ea,0x0678f2c0,0x06ac09cb,0xe5c9d75f,0x53018df6,0x83357513,
  119033. 0x0bf8c667,0x81ca6fac,0x9d0ae2dd,0x7fc8020e,0x000000e1 } },
  119034. /* 171 */
  119035. { { 0x1baaa5eb,0x8add4741,0x79bd8036,0x02cbb759,0xcdffed22,0xd8680c40,
  119036. 0x4e091141,0x1c23a8f0,0x20748b87,0x65d141ed,0x659e9289,0x586a1575,
  119037. 0x5006dbfe,0x7c68d7cd,0x22569a74,0xda0ad0df,0x00000148 },
  119038. { 0x7f9069d7,0xc8fcc5db,0x5c0531a4,0x2487d245,0xe9a2db3a,0xc5ab4899,
  119039. 0xb4fe9720,0x52bfd538,0xd27f35e4,0x73a04ca4,0xee2dac93,0x7cbbc549,
  119040. 0xff3ee7e2,0x0287229d,0x28da9360,0x3179878d,0x000000d0 } },
  119041. /* 172 */
  119042. { { 0x3b66c047,0x89b7e9bb,0x602a3e1d,0x22e65869,0xc8db9c00,0x44f82297,
  119043. 0xd08a74a3,0x0e76aca3,0xfcd398de,0xfbf1a71d,0x8320e66a,0x2fbb6eaa,
  119044. 0x179c9fc5,0xa82d0ebc,0x4e7ab2b4,0x4e00cf6f,0x0000000f },
  119045. { 0x4890c439,0x424c0e9a,0xbc35a6b2,0x37564a2b,0xd9b7497d,0x95a4479d,
  119046. 0x612de942,0xa1ff3f0d,0xe60d0033,0x358627fc,0x522417da,0x815da8c0,
  119047. 0xef6b8385,0x506104d4,0xf16e96aa,0x800728d2,0x00000120 } },
  119048. /* 173 */
  119049. { { 0xab039042,0x976f2372,0x9fa084ed,0x10e6978c,0x58bec143,0xd03fdd2f,
  119050. 0xfe2045c3,0x3200c101,0xb0a5a928,0xe6868f7a,0xe61faff8,0x26c95d1d,
  119051. 0xb7b12265,0xa1e20127,0xc2a5ed17,0x8e63dd78,0x00000089 },
  119052. { 0x22bba4ee,0xbb6533da,0xf496a574,0x3eff6397,0x14f2a6b9,0x409329f7,
  119053. 0x1dfdd73f,0xa08248bd,0x69bca1b1,0x62f33f2e,0xba2e0327,0x9a177e64,
  119054. 0x75ddf741,0xbc50e993,0x4a56bd1c,0xb87a979f,0x00000095 } },
  119055. /* 174 */
  119056. { { 0x67c1f177,0xe83736a9,0x600133c9,0x1b6d3508,0x6eac9a5b,0x9424bb92,
  119057. 0xc27ef31c,0x7a9c01a6,0x122b4870,0xad93bba5,0x9d1ac985,0x9eb94e2a,
  119058. 0xd53f175b,0x511c0206,0x5102d914,0xd13eb252,0x000000b1 },
  119059. { 0x675a1171,0xcfe7dbeb,0x16c0d2b1,0xb228295c,0x057c88ca,0x8db25b5a,
  119060. 0xd300e9cf,0x73ea9e96,0x269552eb,0xb0e0037f,0x9e0f98df,0xea9d035c,
  119061. 0xd290480f,0x860e49b8,0xc036b319,0xa35e9512,0x00000037 } },
  119062. /* 175 */
  119063. { { 0x8f00df48,0xc56729ee,0x11ac8304,0xb89ca7b6,0x8b3a8123,0x497a57f9,
  119064. 0xc21ca3ea,0xe0431b19,0xe2bb3ce7,0x45a73deb,0xadc77819,0x2f86cc2b,
  119065. 0xe5eb3df1,0x5ff005e4,0xdd27dcf0,0xf955dd7a,0x0000005e },
  119066. { 0x00ee402f,0xe0c22ffa,0x3b30bb4c,0x5b335e2a,0x643cb101,0x542551d0,
  119067. 0x3cd19688,0xc6183f45,0xf0be54b4,0xc6664f22,0x4c20cde4,0xa5f4cfee,
  119068. 0x80a4c475,0xdcaa972f,0x59111ed9,0xde4af200,0x0000019c } },
  119069. /* 176 */
  119070. { { 0xd771f428,0x9e9d0bc8,0xe43ca382,0x3ac1ecd9,0xeb93acf0,0x8d5ee480,
  119071. 0x065a2a3f,0x16232f81,0x2f0b8a73,0x1fc04faa,0x025474a2,0x4a8df7e7,
  119072. 0x3bb15f6f,0x51ac4ff2,0xe0950e52,0x66e21b73,0x0000006b },
  119073. { 0x67a41dee,0x59c98480,0x7b3e2b3f,0x2cfa95ae,0x891454e1,0x54d98386,
  119074. 0xeefca6a4,0xf0dddbdf,0x11e9cb75,0x5f691b24,0xfef208c3,0xa9b9e766,
  119075. 0x18b33cf6,0xe8df1000,0xd1c174a9,0xb8a55ac9,0x000001c4 } },
  119076. /* 177 */
  119077. { { 0x5c4cccb8,0xa99f5862,0x2ef4d3ef,0x70bf5209,0x89efc878,0x28f4e576,
  119078. 0xda14206e,0xa2366f96,0x7c52107d,0x90331a00,0xd4a0f0f0,0x478d4cea,
  119079. 0x472a47b0,0xb2899ee2,0x64207549,0xae96534e,0x00000110 },
  119080. { 0xcced05b0,0x2cc1d655,0x01759543,0xabac3f09,0x8e577cd7,0xbaeb70a4,
  119081. 0x40e98d6d,0x84b00893,0x603d24f1,0x26983653,0x2572173d,0x6e145883,
  119082. 0x611141de,0x1d348b26,0xefa27f34,0xe52257dc,0x0000006b } },
  119083. /* 178 */
  119084. { { 0xc947e655,0x92678f33,0x08923795,0xff0fb76a,0x790239d1,0xb2dfe745,
  119085. 0x3cdbb7ce,0xea087492,0x05f6d41c,0x21326db9,0x79dc5588,0x5b1ae9ae,
  119086. 0xe9c31702,0xe145340c,0xa2c38a9c,0x07502c29,0x000000c3 },
  119087. { 0xc156ace2,0x0c124f11,0x79ff2529,0x2c170fe7,0x6e1171b2,0x60df9a81,
  119088. 0x55de2797,0xa19bca83,0x7c6cc79d,0x1ad927ea,0x1d61f770,0x28590112,
  119089. 0x261c06bb,0xfe80c826,0xaa2642bb,0x4050d338,0x0000015e } },
  119090. /* 179 */
  119091. { { 0xeaad87bc,0xc9397829,0x81e84cbd,0xe0ac9367,0x6ade4fde,0xb579c24d,
  119092. 0x690d7f56,0x50b9aba5,0xd14fb0b9,0xf09b29d3,0x25a0e7b6,0xd0684f23,
  119093. 0x606f4ff3,0x0514e9d3,0xe8ad733b,0xe63bdd26,0x00000077 },
  119094. { 0xe0d25c6d,0x0afd06ec,0x00ba2dcf,0xdd90021a,0x8c5bb398,0x1b025770,
  119095. 0x198ff8fc,0x077f06d8,0xb7e2cd68,0x87d50ff1,0x263a3572,0xef75e057,
  119096. 0xfa925a9a,0xbf257892,0x739d0e95,0x847d3df0,0x00000111 } },
  119097. /* 180 */
  119098. { { 0xfec82924,0x52ab9cc7,0xa7220d69,0x1c76dd69,0xa06ef0e2,0xa63527de,
  119099. 0x27183904,0xab3e51c2,0x716807c8,0xf4db35ea,0x748f1246,0x8f3ede0a,
  119100. 0x41156095,0xf1493644,0x874b38de,0x5f6583d1,0x000000f7 },
  119101. { 0x0b927eb7,0xa39189e1,0xc2e2f127,0xa87c6359,0x7fe966f4,0x0b72c233,
  119102. 0x105e5585,0x102b8382,0xe58c39f9,0x63fee006,0x991b5329,0x3f052ee3,
  119103. 0xcbaff97b,0x7f5b854c,0x5f805060,0x935e5f6c,0x0000016a } },
  119104. /* 181 */
  119105. { { 0xdfd88d38,0xf19a0355,0xc549df40,0x555cd8e3,0x04d006e1,0x322729e3,
  119106. 0xfd0b0ce6,0xf16b706c,0x35f2ad31,0xf156dc09,0xf7a3df9f,0xb30c5213,
  119107. 0xa55e5fb5,0x9f29cc92,0x2b858da2,0xa0ecfdd4,0x00000144 },
  119108. { 0x52658a92,0xb5c115df,0xc4281616,0xbce3ed17,0x7fd92a91,0xa5595f70,
  119109. 0x9cd5d896,0x663c8bfd,0x5a9472b1,0x0776343f,0xb033e1bd,0x14e44ca8,
  119110. 0x1e5c02fb,0x27a1c986,0xcc4ffb32,0xece0f2c4,0x000001b5 } },
  119111. /* 182 */
  119112. { { 0x31211943,0x17127bab,0x5684325c,0x44a8cac6,0xd855fc3e,0xd2fe0b88,
  119113. 0xce91eea5,0x47abab0c,0x78ec7d12,0x5d23ddc4,0x0cd9fefa,0xa3986de7,
  119114. 0x82655766,0x32c7b867,0xeeaec7fa,0x3e54018b,0x00000087 },
  119115. { 0xb38d17c1,0xc96e86f2,0x71fa040d,0x9cbfbd0c,0xf88499cb,0xe111ab79,
  119116. 0xf71ec80b,0x1d47c5ce,0x46c89692,0xacaa3bc1,0x3d316331,0x5f921c0e,
  119117. 0xe768765b,0x31fa081e,0x41eff270,0xd5dafd5f,0x000000fe } },
  119118. /* 183 */
  119119. { { 0x4cda1348,0x8af10b9d,0x25c3013a,0xb0769fd2,0x8957c22b,0x450aa5b1,
  119120. 0xf5acf1c4,0x5cafd6c7,0x9fef8029,0xcf71a140,0xee089f5d,0xe12029f5,
  119121. 0x0fbd2ba8,0x9752a8fb,0x6f70cb58,0x61e2275f,0x00000090 },
  119122. { 0x1fbda16a,0xb70a4ac5,0xf1dfa2a2,0x79910e79,0xd9945f6f,0xba2ce132,
  119123. 0xeb4ba4ef,0x450d59ae,0x4bf2d53d,0x6a8e09b3,0xe620c7a8,0x76010204,
  119124. 0x0a53c6f4,0x63f8943d,0x87eaf56a,0x14c91d19,0x00000132 } },
  119125. /* 184 */
  119126. { { 0x490d66c3,0xe54fb120,0xa0dc8204,0xeaed7328,0x04b4294d,0xba014c38,
  119127. 0x31ddc467,0x3f2fa2ab,0x8342ed11,0x70ff55ea,0x23034e0e,0xb18da72f,
  119128. 0xbd8ae3c1,0xadc30dbe,0x3e945a02,0x179bdf6f,0x0000009c },
  119129. { 0x7484c26f,0x46c928ef,0xef2adbb1,0x206b7db1,0x3f58dda7,0x0887f548,
  119130. 0x4bc7edb6,0xfde4e20c,0x975cafdc,0x484d121d,0x86beec20,0xc5b59670,
  119131. 0xa6d6db67,0xb579aa88,0x41187488,0x22c6d87e,0x00000015 } },
  119132. /* 185 */
  119133. { { 0xc471d4ae,0x0a890757,0x43a1da76,0xfef4b1a5,0x6aa701a1,0xb892b182,
  119134. 0x59c65f93,0xbf4d4e52,0xd789df35,0x923af929,0x0b79c3f2,0x3ccb46c6,
  119135. 0xcf4cf130,0x95582ce7,0x257f0ec4,0x7da081b4,0x0000011c },
  119136. { 0x9aeef274,0xf92c6ae5,0x1437c083,0xe6c5bf4f,0xe13c86af,0xaa74b023,
  119137. 0x2a225360,0xd21dace6,0x22589fa5,0xb3d572b8,0xdfa74b0f,0x3d4a3916,
  119138. 0xb12891a9,0xe76cd8dc,0x59f4cfbd,0xa0391a3f,0x0000019a } },
  119139. /* 186 */
  119140. { { 0x203fc3f1,0x054ba69e,0x62106a29,0x09168ccb,0xaad5fa9f,0xb0818540,
  119141. 0xbff7ed6f,0xecb8f20e,0xbef94afd,0x2c80a618,0xb0abd1db,0xe25d8ca0,
  119142. 0x028e0a7c,0x75e67a41,0xd6e95b9a,0xdd7662dd,0x000001b2 },
  119143. { 0xf289d7ee,0x87dff279,0xeea2205c,0x4d755d59,0xc18adac6,0xaeb0fd54,
  119144. 0x7ec01019,0x3a8c46cf,0xb48d70a4,0x6fc90e7e,0x10b39ef8,0x965c53c1,
  119145. 0x38545a20,0x455777cc,0x57dd023e,0xa33430f7,0x0000016e } },
  119146. /* 187 */
  119147. { { 0x0ff53d2c,0xfa9f3949,0xb00349b9,0x8dc91596,0xd5997967,0xf10a5014,
  119148. 0xa8a6b78a,0x4dd72dab,0x8b517b10,0xef5de540,0xa6d39be0,0x142b90bc,
  119149. 0xeda17f70,0xcaeaa3e9,0x06b31118,0xa01689d6,0x0000016d },
  119150. { 0xf46afff7,0xea6ca563,0x34a5e5f3,0x3945c7ba,0xaa998fd8,0xc1ffe4c8,
  119151. 0xb63f535e,0x42a60146,0xd1f509e5,0x50816888,0x9f8cd0db,0xd1918daa,
  119152. 0x78a36772,0x6505e6bb,0x9cc6dc66,0x4ab03a81,0x000001ef } },
  119153. /* 188 */
  119154. { { 0xd376d986,0x06089d14,0xa2dc35b0,0xd0f4e077,0x53ff2c86,0x1c11709a,
  119155. 0x123c3fc8,0xfef4ba45,0x1b656fc2,0x852cd5a7,0x1fefa8bb,0xb57c7489,
  119156. 0x48110b77,0x8f05383e,0x52c5a129,0x4b55d3ad,0x0000004c },
  119157. { 0xf3827633,0x5110cff3,0xe00afe96,0x086784d5,0x3ead32fa,0xcb387882,
  119158. 0x2b91cd86,0x3dcf4d16,0xe6f3638a,0x078b6a58,0xe8b7fd42,0x33792112,
  119159. 0xee5683e7,0x6964044d,0x28e28433,0x3b84210f,0x00000122 } },
  119160. /* 189 */
  119161. { { 0xc3ebeb27,0x6c28a9a9,0x3ef590f8,0xd7bcdcb5,0x4dae7f37,0xe88a2e11,
  119162. 0x726ea7c9,0x033522e4,0x8c141388,0x99d50386,0x61621575,0x59b1aeca,
  119163. 0xfcc564d8,0x719fcfeb,0x1aeb8e36,0x3a577af1,0x00000043 },
  119164. { 0x6feba922,0xc3f26ce0,0x475a5693,0x5f6c83ee,0x28bf378e,0x7f796740,
  119165. 0xbdc3f6f1,0xd2a5e368,0xa6ed90ae,0x3d034a0a,0x4a47cbd5,0x3b1c3a4c,
  119166. 0x4dce2bc8,0xa4f0aa6e,0x74ca00eb,0x97c7af43,0x000001c0 } },
  119167. /* 190 */
  119168. { { 0x79c28de7,0x00377178,0xab9c330c,0x617aa2aa,0x66bc61eb,0x43081826,
  119169. 0x4d78b504,0xe0b5b5cf,0x9870fc72,0xd76a752d,0xd40b7bc5,0x3b4689f5,
  119170. 0x87f2d03a,0xa97fd867,0xfd6060a9,0x6ab7b5ee,0x000001c0 },
  119171. { 0xffb71704,0xe99eadb1,0x390fe3b1,0x436e58bb,0xab4f19aa,0xeecab82c,
  119172. 0xe0f3d9dc,0xda492dfa,0x6e20ad12,0x2a0f54bd,0x7dbbd262,0xaf89fa0f,
  119173. 0xe8d2eb54,0xdcc50a1a,0xef7d0758,0x9799f816,0x000000b7 } },
  119174. /* 191 */
  119175. { { 0x104f98cc,0x9ec46462,0x72aedeae,0x45115922,0x7e62186f,0x7ae93dd0,
  119176. 0x8d6d69b6,0xd17ce026,0xfd43a8f3,0xb5347608,0x7c0ab797,0xe87f1c13,
  119177. 0x139f991d,0x3bf597a8,0xe547e0d6,0xe293a85b,0x0000008d },
  119178. { 0x8ef668b1,0x0982add3,0x611c9764,0xc54e6b2d,0x1c1d4263,0x3ce76b12,
  119179. 0xeff64e73,0x3134b28e,0x2871612a,0xaf71a9ac,0xba093594,0x31c88af2,
  119180. 0xba9108e8,0x0b649112,0x5cf437da,0x8febc5c5,0x00000113 } },
  119181. /* 192 */
  119182. { { 0xc4a2daa2,0x7e9ca589,0x400f608c,0x18ea703c,0xd5175103,0x6f8cd058,
  119183. 0x4abb6f29,0x26493472,0x94296ab4,0x0be553e1,0xac51657d,0x9af9398f,
  119184. 0x4f880ea8,0xe232deec,0x67b1e1b1,0x2f81761e,0x00000137 },
  119185. { 0x3a20f662,0x51014bc7,0x49ed9502,0x1fb7e77c,0xb62b9652,0x89f5096f,
  119186. 0xa2e8d37e,0x3a659c67,0x5804170e,0x0f2b2a26,0x9ed50a34,0x1674fce6,
  119187. 0xfdc3c00f,0xaaa4537e,0x4ce99d93,0xf3c3bfda,0x00000198 } },
  119188. /* 193 */
  119189. { { 0x81614189,0xbab1f5cd,0x24b259f7,0xc7d56c45,0x45fb415e,0xc7baa4b2,
  119190. 0x7af6bef9,0x302bc8dc,0x74b48e82,0x91b770e0,0x9b6d1b1f,0x4a1336e0,
  119191. 0xe6680c97,0x285c1357,0xc7ccb625,0x59bcb813,0x0000012d },
  119192. { 0x7c019927,0xddad83b4,0x630dfd5b,0xe10f2667,0x31e05d23,0x15dbec5a,
  119193. 0x456ac460,0x2aa6e5fa,0x243cac82,0x46956529,0x4dc8c9e9,0xc69c9c7f,
  119194. 0xe24a4065,0xadb27e09,0xae41301b,0xdfa7a34e,0x000001cc } },
  119195. /* 194 */
  119196. { { 0x59cb1a7d,0x176a864d,0x6aefb8ee,0x4d864ca3,0x1c22b0d8,0x0ee83acb,
  119197. 0xd980df1d,0x7e80a6eb,0x7f94ced9,0xf582acc4,0x3a72c115,0xa29cd123,
  119198. 0xc7107bb7,0xce12a2a8,0x4ed80a30,0x0229ca56,0x00000150 },
  119199. { 0x2f1c180b,0x9774bad5,0xd749aa10,0xd08be998,0x56dbd1ba,0x978c48ab,
  119200. 0x0afbea9a,0x6ed3e3e4,0x153dc5fc,0x8a8be97b,0x9be93ed0,0xadc7f095,
  119201. 0x2cee23bd,0x8d242908,0xdc2729de,0x417523c6,0x00000016 } },
  119202. /* 195 */
  119203. { { 0x6c14a31e,0x74eeccf1,0xb2de3c2d,0x488e2534,0x7cec43c3,0xf9bb3599,
  119204. 0x916ac936,0x4210459d,0x9f7e4400,0x71d15c02,0x44553583,0x8c9c7c12,
  119205. 0xec94a467,0xcc97548d,0x3167bad9,0x4ca67818,0x0000014e },
  119206. { 0x8d0312bf,0x033af055,0x54161e66,0xbd1bf4f5,0xfa41781d,0x259945a7,
  119207. 0x00eef1d5,0x33494da8,0x79c3b8d0,0x6c505ec0,0x1c9f6e69,0x70ae1ade,
  119208. 0x76830aaa,0x0288f0c1,0xa62a060c,0x7f4cfe3b,0x0000000c } },
  119209. /* 196 */
  119210. { { 0x057d6006,0x0d8b447d,0xfd71c8b0,0x38b976e6,0xabcf40f5,0x5e77e029,
  119211. 0xf103a783,0x13bee386,0x5e472c4b,0x20a6ac20,0x31fcb194,0x43b045f6,
  119212. 0xc00abf49,0xe5dc1d9f,0xa5556b79,0x28c0bc70,0x000001b5 },
  119213. { 0x8a8640b8,0xba9d07ee,0xd0e34012,0x25611023,0xbe24ae89,0xc7ce655b,
  119214. 0xfa579dcd,0xe358e524,0x377bbfe5,0x57ce2715,0x3c0947e4,0x64651c6c,
  119215. 0xf4a97826,0x5fbd8d50,0xe2e1c15a,0x6fcdd28f,0x0000008d } },
  119216. /* 197 */
  119217. { { 0x5c7202c8,0xb564a2f6,0x5a54b0d8,0x7d634052,0x1434fbf5,0x8414d672,
  119218. 0x1d9830a3,0x8114215e,0x5ef0fbe1,0xc7a758d5,0xe6f57f9f,0x5705dcf8,
  119219. 0xd92269d3,0x5dd49a56,0xbdb49f97,0x8f015d7a,0x000000f1 },
  119220. { 0xb4799ce6,0x07131110,0x2cbcb7db,0x35bbfb99,0xf7ba21e2,0xc1f00c9f,
  119221. 0xb18f49fe,0x009d6913,0xabcf959b,0x8da61951,0x0d42146e,0x0e687213,
  119222. 0xae5f23f1,0x55832817,0x9ae7386b,0xc9b5bb68,0x00000143 } },
  119223. /* 198 */
  119224. { { 0x48c74424,0x423328db,0xd19cb2eb,0x32616e11,0x40d6e217,0xe534192a,
  119225. 0x0cbdc752,0xdd83a94c,0xd733bb01,0x5c623050,0x5b7a4520,0xcd0d631a,
  119226. 0x9a4011c8,0xccdc0a25,0x646e7cd5,0x22f112cc,0x000001e6 },
  119227. { 0x3e1e4c4b,0x47d6e29a,0x9fb1548a,0xd5f82538,0x4fd3e319,0x7e3705b5,
  119228. 0x0a08b966,0x8c4ce59a,0xd8cbe8db,0xbca749e7,0xaeec3d75,0xcc4496ea,
  119229. 0x8a1a313d,0x17dc723a,0x8ceb9360,0x250ff77a,0x000001a5 } },
  119230. /* 199 */
  119231. { { 0xfe29bd79,0xa55a0726,0x4f990b34,0x6574a810,0xaad56983,0x6906946d,
  119232. 0x50d41fef,0x0e580ab9,0x6e6f7f45,0xbc75b514,0xf0f3718a,0x508cc97b,
  119233. 0xa5634087,0x51ba2ca4,0xe64d8910,0x75c39077,0x00000172 },
  119234. { 0xf77ca6bd,0xf37cccaf,0xbdb18df5,0xe0a0df41,0x019e01f7,0x9f46cff8,
  119235. 0xaa65d72b,0xbe4f3d44,0x6e3663e9,0x7822d8ac,0x3ef9db6d,0x5f37f922,
  119236. 0xabe4a9aa,0x7f0ad39d,0xf69cc8ba,0xa0a57c70,0x00000098 } },
  119237. /* 200 */
  119238. { { 0x00fd5286,0xd9c50cf4,0x72a4b03c,0x1ea5b9d5,0x051ae73e,0xf5e60f9e,
  119239. 0x951b3824,0xfe9b5142,0x9fb4d667,0xb034b2d0,0xedc50856,0x4b537a80,
  119240. 0x8cb0022e,0x69ee1012,0x6a548aee,0x7c8b9e5c,0x000000ed },
  119241. { 0xd933619b,0x746007bc,0x2b9dfe19,0x0ce7668e,0xcc6e2a2e,0xa9eed5d3,
  119242. 0x7eebf32f,0x35a14f5f,0x67cc4f64,0x75cb898d,0x7850c16c,0xcb2185fc,
  119243. 0x45f79c96,0x09874a76,0x27db4744,0x7468f8ae,0x00000139 } },
  119244. /* 201 */
  119245. { { 0xc88684f6,0xc5de68ad,0x619a7dbf,0x7c1edaab,0xb27a18f5,0x258d1735,
  119246. 0x8ecd89eb,0xb27e7b65,0xd879f7ea,0x3d8889c6,0x67d5befb,0xa8fdc96d,
  119247. 0x37bad73c,0xc84d86ae,0xce8e56d7,0xc7e91976,0x000001a4 },
  119248. { 0x6319ffa6,0x5001a540,0x134ec04c,0x0cae64ec,0xd541242c,0x1f69a96c,
  119249. 0xbf2caeee,0x9da259ee,0x28bee805,0x88e7978c,0xb8e890e4,0xe9484beb,
  119250. 0xfb227fd9,0x0e5246d0,0x625d6318,0x8be2a54a,0x000001b7 } },
  119251. /* 202 */
  119252. { { 0xf472f13a,0xa223554a,0x5733e91c,0xfac993b7,0x96c168a2,0x26afe9f0,
  119253. 0x4b127535,0x7cfe761d,0xe77070ca,0x84301873,0xc7e7cdf6,0x66b6aaad,
  119254. 0xa1562ed4,0xda2dd5ea,0x39faf8d8,0xa81a2e00,0x00000016 },
  119255. { 0x4e3de3bf,0xa880759c,0x52f3088a,0x0c1e2e11,0xaa7eba5b,0xcb2ded9a,
  119256. 0x9f9c11ca,0x4c65d553,0xb0dc5c19,0x0ab9bd87,0xca3f4b61,0xd32f8c96,
  119257. 0x28cb5f9f,0x49842fcc,0xb90e21df,0x31ae27cc,0x000000f4 } },
  119258. /* 203 */
  119259. { { 0x6a0ccd0a,0x3b2a0a0d,0x5993b555,0xa3eeec82,0x9de672a6,0xb13486fd,
  119260. 0x0da05dcf,0x8d9c5148,0x6739874d,0xc4aa444d,0xe29a35c9,0xd9cf35b2,
  119261. 0x89177ead,0xd6bd9b5f,0x2a0470a1,0x9af0f59d,0x000001d6 },
  119262. { 0xba7535fd,0xb2f844c7,0xa842ff39,0x45bd4c3d,0xe951974b,0x5fe149ed,
  119263. 0xfd4453ec,0x6982e997,0xe6c37c0e,0xa63f705d,0xd2c3ef6a,0x09b0f6a9,
  119264. 0x1776a8d6,0xbedd3586,0xede11b78,0x4048a46a,0x00000176 } },
  119265. /* 204 */
  119266. { { 0x51a251d1,0xa47c6ee5,0x0d279dfd,0xbef4bf12,0xec518a28,0x4c2d538c,
  119267. 0x3880be6e,0x1b2b7887,0x1be9b20b,0xc69ccf8e,0x3796a19e,0xe41dfeae,
  119268. 0xfb50bdea,0x25676fc9,0x03e180c0,0x8b815a05,0x0000016a },
  119269. { 0x53f5ef65,0x2ca085f6,0x77b25105,0x61dfbbf9,0xa3346fe6,0x88ea87e3,
  119270. 0x1b95f7ef,0x25ddfdee,0x5b65eaec,0x22074e69,0x4c2e023b,0x11869a15,
  119271. 0x42e83bb5,0x8601b577,0xfa877e7d,0x1464652c,0x00000015 } },
  119272. /* 205 */
  119273. { { 0x57fa58f1,0x250853c8,0x4ca4c670,0xb58a4e68,0x1b81f40d,0x07b96d0a,
  119274. 0x558e8cbd,0xa4651e10,0x42e388cf,0x1a64046e,0x44436088,0x51b0d539,
  119275. 0xe26b8fd0,0xc2bf35b3,0x5702cfce,0x4ae78709,0x000000fd },
  119276. { 0xdf53d498,0x3c79bc29,0x1137f624,0x4cf31c4e,0x17a3cedf,0x93b6856c,
  119277. 0x6cd9115d,0x2461131c,0x9228cddb,0xab30a453,0x8d202bf1,0xe97757b6,
  119278. 0xe6108612,0xa666de7c,0x4f6026b4,0xc200fe65,0x00000051 } },
  119279. /* 206 */
  119280. { { 0xb1a2b4b5,0xea96103c,0x843c0968,0x98dccbfe,0x986ffb5b,0x6a37072d,
  119281. 0x169d3ac2,0x2fa07af2,0x771371f1,0x8bb85b9a,0xe7c299ef,0xeae10d34,
  119282. 0xe2372efc,0x3d4bdc69,0x8dd856f1,0x378df75d,0x00000039 },
  119283. { 0xde7ff5d9,0x31e902ff,0x325a09ca,0x0e9a85d2,0xf4192fcd,0xd71b93a6,
  119284. 0x15b076b3,0xf52a5737,0x6e711d1c,0xd726aa86,0x2c292819,0x0b61b1df,
  119285. 0xc8015de6,0x224e575c,0x18b79e47,0x68e893e1,0x000001dc } },
  119286. /* 207 */
  119287. { { 0x6ffeda73,0xb7924ff9,0xa0da2018,0xe709f406,0xf89584df,0x368e20ea,
  119288. 0x8355a040,0x0095112e,0xfd777d7c,0x259d4528,0x2bf8f2c8,0xb0c49565,
  119289. 0x44c5311b,0x7f631928,0x8466d9d5,0x698d0e4f,0x000000d5 },
  119290. { 0x015d204d,0xe10d64fa,0x6dd10c53,0x7b626bfa,0xa7698c94,0x087f8e63,
  119291. 0x05337a56,0x525a6547,0xdf5c782f,0x558e2244,0x855fbaff,0x48aa1e41,
  119292. 0x47ee3830,0x48f2218e,0x138463d3,0xf2523959,0x0000004d } },
  119293. /* 208 */
  119294. { { 0xd8695310,0x76f4fd69,0x7e8768ea,0xe28eb09f,0xe0d532a8,0x039c1812,
  119295. 0xc572ac79,0xdda67744,0x785d6293,0x1f9800e0,0x3da76bb2,0x2bfe2a5a,
  119296. 0xa2bc7217,0x6ed15b90,0xd1788a8e,0xd80e61bf,0x0000004c },
  119297. { 0x16730056,0xb9f40370,0xdced3d43,0x46f45fef,0x1aa50742,0x0afd763c,
  119298. 0xff92ae73,0x21e5c652,0x1bb2063f,0x6ef0830d,0x12d22540,0x18306ecc,
  119299. 0x1f15001c,0x4edd9b3a,0xc0cc5424,0xe4eb25b8,0x000001f4 } },
  119300. /* 209 */
  119301. { { 0xa1db5c18,0xed61a714,0x7677074c,0x9454e61e,0x7bf685de,0xe970fbe5,
  119302. 0xd2145be5,0x221b0c53,0xee49a5f2,0xb931881b,0x14b11d03,0x00b91afa,
  119303. 0x3ec22137,0xc6aefe49,0x526200af,0x50554e94,0x0000013c },
  119304. { 0x7364c92e,0xd42c45e7,0x735218e8,0xe0500265,0x84d3f3c5,0xd281da02,
  119305. 0xdbf7646b,0x312f8424,0x485f304f,0xe1a88f2a,0x1127a513,0x583f5631,
  119306. 0x1a60e0bc,0xed7950c7,0x4b7b70a4,0x92855e10,0x000000c6 } },
  119307. /* 210 */
  119308. { { 0x644614e7,0x8d06185c,0x4749a424,0x2e906cae,0x2587e528,0x585412ea,
  119309. 0xd12857cd,0x3763990a,0xba5593b5,0x770c7f70,0xdd5d2a46,0xc2cf6dc4,
  119310. 0x3b69a1ba,0x564da456,0x187895da,0x639f7e14,0x000001c8 },
  119311. { 0xf8589620,0x05c96b02,0x41e44054,0x2fe468a3,0x096ad09c,0xbf22da11,
  119312. 0x9c652aee,0xbc73c298,0x547e1b8f,0xcdef9f8b,0x977dbf73,0x7073785a,
  119313. 0x7e13552d,0x0a92a1aa,0x3a393d3f,0x22761140,0x0000015b } },
  119314. /* 211 */
  119315. { { 0x1fbfaf32,0x89a5a7b0,0xbe661d21,0x5c5a62d0,0xf5e3b44d,0x47970f5e,
  119316. 0xf43bbf62,0x3ea001ed,0x260ae5a0,0xa8e74285,0x2697c62c,0xeb899ebd,
  119317. 0x751a7643,0x36a003e6,0xba0725a6,0xef178c51,0x000000ea },
  119318. { 0x9bd51f28,0xaacf8e9f,0xa8712044,0x39febbdb,0x5bfc8365,0x8780ad3a,
  119319. 0x10e6f08f,0x408a34cd,0x8241ab0e,0x8104ca10,0x98a662a1,0x843e71ce,
  119320. 0x232048d6,0x9dce8514,0x1cf3d187,0x5cba23be,0x000001fa } },
  119321. /* 212 */
  119322. { { 0x2973a15c,0x2fe8c9d2,0xd42979f3,0x66fec8dd,0x0b6afb3e,0x39af4a39,
  119323. 0xab65ef22,0x0bb1e436,0x66c5fcdb,0x8f26201e,0x5af4870b,0x3cffe8a3,
  119324. 0x2bb44e24,0x65ae286f,0x51dd1722,0xda2e283a,0x00000114 },
  119325. { 0xc1e3d708,0x4a9c9a56,0x1cb0efa6,0x4fe62d3f,0x97e87540,0xf0702984,
  119326. 0x3cea46fa,0x138b7d6b,0x83886263,0x0780634e,0x71c30909,0x27e84280,
  119327. 0xe5838647,0xf0af79d7,0xb236a267,0xc1b86582,0x00000104 } },
  119328. /* 213 */
  119329. { { 0xa526c894,0x32ff09ed,0x14ac7d23,0x95abf120,0x3cd92934,0xb6f94dcd,
  119330. 0x92e6b556,0xffaaeb12,0x1036c31b,0x193796ea,0x707ff32e,0xa9d237e7,
  119331. 0x829d67b8,0xd65a5b0d,0xdb29248b,0x48edb556,0x000001b3 },
  119332. { 0xded46575,0x6ee9f9b2,0xffa69acf,0x496ca08a,0xf16d37d1,0xd5aeb3a1,
  119333. 0x789e5d01,0x4a507db1,0xc827cc45,0x05e2ce29,0x2964e677,0x29b6e4a5,
  119334. 0x4c0e46f2,0x0563b0ba,0x4bc46485,0xe75c2448,0x000000a3 } },
  119335. /* 214 */
  119336. { { 0xd2f6615d,0x0fcb476f,0xd98da9a9,0x4b7f9b78,0xd2bdf107,0xe2fddf1c,
  119337. 0x9b956f31,0x2bda3086,0xb596eadf,0xf3cca2f7,0x355b2538,0x91c09f8b,
  119338. 0xc6c846db,0x46f3f6f3,0x2a14642e,0x9bb9398e,0x000001ff },
  119339. { 0xa17bd645,0x5118d4f5,0xdbd6d552,0x57033eab,0x734d0957,0x007e86fc,
  119340. 0x5f53c435,0x98ca065f,0xfd27dd19,0x9949d9bf,0x6952d1ca,0xddc4e304,
  119341. 0x81ac101c,0x84cab4fb,0x4a56b007,0x46d079f9,0x00000003 } },
  119342. /* 215 */
  119343. { { 0xa6bfdedd,0x95eb8e4f,0x7a74c6f9,0x993a285e,0x3d09a252,0x8bd5d4d1,
  119344. 0x19a5f767,0xeaa10be6,0x0cebb340,0xd3db083e,0x1dbf7a83,0xc633a78b,
  119345. 0xc30f23e1,0x2664bc3e,0x07a08379,0x6630f8f1,0x000001c9 },
  119346. { 0xdef86a80,0xbbf4cb4b,0x3f8259ab,0x1fa4ec78,0x609532c8,0xa4bf7604,
  119347. 0x8b909e92,0x71bb7acc,0x17884160,0xca1d7317,0xca1ab928,0x7f7f14be,
  119348. 0x5f8455a5,0xbfea016e,0xbf21e899,0x7b8c76b9,0x0000002d } },
  119349. /* 216 */
  119350. { { 0x4b9f8e7d,0x46860563,0x63fc58a8,0x201176b7,0x2feed68a,0xe7a5da7e,
  119351. 0x65183190,0xcc67763e,0xe9377ad6,0x7d7d0102,0x77032321,0xccfc4720,
  119352. 0x534bb505,0x573ee031,0x0f1a2769,0x1bf1ef8c,0x000000f3 },
  119353. { 0x0c935667,0x635f5c4b,0x060d2b8b,0x74152c39,0x37c3a574,0xeffaac2e,
  119354. 0x0b72e0cd,0xfd5fcc4c,0xf4f60247,0xb743f9b9,0x79e16f33,0x05c2e354,
  119355. 0x3074ef9c,0xa2234c47,0x495aace3,0x4092f279,0x00000124 } },
  119356. /* 217 */
  119357. { { 0xb30f9170,0x5bfd7851,0x37fce5b1,0x715aa1e9,0x928437b9,0xcffd55e0,
  119358. 0xc32f1273,0x88acd259,0x48be1e34,0x5a145cf2,0x7a5bc62b,0x3a340860,
  119359. 0x18156f46,0x6296eb15,0x2774e1c3,0x397fad19,0x000001e7 },
  119360. { 0x9c8225b5,0x362f99f4,0x46b77c4d,0x33efce49,0x8541e91b,0x451df530,
  119361. 0x38f3d693,0x0bd2d934,0xe727b54e,0x0b5de2d6,0x7622d940,0x42d929c2,
  119362. 0x56f6a94b,0x36ace723,0xfccaf205,0x64a18cd5,0x00000044 } },
  119363. /* 218 */
  119364. { { 0xaba95d63,0x8dbe0aab,0x7b4b346d,0x92780c61,0x0e0d8142,0x6430f863,
  119365. 0xb56ef04c,0x875be02a,0x785e3633,0xc28feb95,0xc12c93e4,0xd5401795,
  119366. 0xe36f82a3,0x89ff51c1,0x10eeafd6,0x3c48c895,0x0000016b },
  119367. { 0xd4f064be,0x79287eba,0x54ebda99,0x1a77d555,0x623727ea,0x46745ef2,
  119368. 0x89f366c6,0xa911f591,0xc59d6ebd,0x7e5435cd,0x7524d213,0x3a84daea,
  119369. 0x4395b38d,0xc7b1dd1c,0x1a823c49,0xca13e704,0x0000001c } },
  119370. /* 219 */
  119371. { { 0x874d64b0,0x6399860c,0x1653ce0c,0x3375b092,0xeaa11986,0x16700000,
  119372. 0x621cd15d,0x62c67909,0x77d70dcd,0xbe1d7dd6,0x305bd4cd,0xeff0f270,
  119373. 0x362f8f30,0x076ec621,0x7e445b78,0x81204816,0x000001d8 },
  119374. { 0x161f9758,0x81749a0e,0xa3c4fce2,0xe60915fe,0x911dd8af,0xf537ce41,
  119375. 0x79a51a09,0xfe36a8ac,0x2ca5cf8e,0x67fb54b4,0xe49057f5,0x1bdcae07,
  119376. 0xa4244b64,0xb71ff0c5,0x4b606583,0x4815a536,0x00000106 } },
  119377. /* 220 */
  119378. { { 0xef39cc39,0x78c69c3e,0xfa6356d1,0x98304564,0x412fb990,0xbd3c3542,
  119379. 0x79dbb2a5,0xa1d531d3,0xe7e75e3d,0x4865f188,0x0b0147b1,0x2dac4e22,
  119380. 0x33d29ab0,0xf59e51ca,0x37b074ef,0xc964f7fe,0x000000f1 },
  119381. { 0x0e301262,0x7080c0a6,0x5390a22d,0x9a458060,0xcc8a9029,0xda677f9a,
  119382. 0x14c0f1c2,0xdfae9057,0x6e66d9f7,0x3665ff16,0x47846924,0xc866dd8c,
  119383. 0xc4cc307c,0xc5afe98f,0xe0bf50e4,0x60e3ba63,0x00000039 } },
  119384. /* 221 */
  119385. { { 0x959ecdb3,0x1a785136,0xf9e959be,0x289af617,0xcde0dc88,0x5145b2b8,
  119386. 0x7c079e15,0xfe9070b0,0x50e22415,0xf77f04d3,0x358d6d42,0xb3ab7372,
  119387. 0xba7b629a,0x14fd41b9,0x7400fd25,0x7b32d80e,0x00000193 },
  119388. { 0x7147886f,0xe5d80d4d,0x576c81ca,0xe08ced61,0x642717bb,0xe14e8692,
  119389. 0xabb4bd21,0x9dcdf198,0x6530308b,0x658be646,0xd99d19c7,0xfbf192da,
  119390. 0x304ab126,0x55a3d1b3,0xfa24de31,0x943f4be5,0x0000000e } },
  119391. /* 222 */
  119392. { { 0x7fe9ea48,0xc5424058,0x61b57486,0xaf24f825,0x78719740,0x9d2c413c,
  119393. 0x70eb874d,0x27a9be79,0xb62ba3aa,0x43fef8e0,0x2c1bf0ac,0x0a23f286,
  119394. 0x4af130e1,0x51c276f3,0xae55cebf,0xf6cd1e9a,0x00000185 },
  119395. { 0x40369093,0x24defa7f,0x58581e0a,0x11f1d9d6,0xe512ed9e,0x9900bf33,
  119396. 0xed120896,0xbf8a8459,0x8b73c399,0x8324555e,0x8f6f54fe,0x54a30569,
  119397. 0x3c252355,0x2a9d6da5,0x2a093b31,0xe6a6f904,0x0000016a } },
  119398. /* 223 */
  119399. { { 0x152cdd35,0xb2e123c9,0x86402ef1,0xae6e43a8,0xb9ce5bd5,0x892bf0df,
  119400. 0x75804914,0xb4acb84a,0xf502eec2,0x8c7f55ff,0xaa33ef4e,0x9c8a7b93,
  119401. 0xfd9d2001,0x06b10357,0x0ba3bceb,0x3e319ff0,0x00000027 },
  119402. { 0xabe360a3,0x182c2f77,0xadfefca6,0x57ef5c84,0x650b6fcc,0x9a4f0ca6,
  119403. 0xaaf0b202,0x3f4f8e56,0xa24ef156,0x5c8508a0,0x1ea45f13,0xd8f62fd9,
  119404. 0x28036dbe,0xf2c923a0,0x1a4d103b,0x4a9ca4c0,0x0000018a } },
  119405. /* 224 */
  119406. { { 0x5448e339,0x2a3fb798,0x18a39976,0xde8770cf,0x7a69170c,0x1160574d,
  119407. 0x2b6067ac,0x4bb05c59,0x848138ab,0xde0d2db0,0x4909e794,0x149dab92,
  119408. 0x790315f7,0x83a336b6,0xa335a258,0xcd9074d9,0x0000013c },
  119409. { 0xac1b784d,0xe839c5e0,0xee527ae1,0xab65c8c6,0xa1c88ec0,0xd3c86146,
  119410. 0x46c1bf58,0x2201f790,0x3fda502a,0x71cec627,0x225b9065,0xff3f88eb,
  119411. 0xc556dfcd,0x6c1f0c98,0x484fa5cc,0xaa3222aa,0x000000ac } },
  119412. /* 225 */
  119413. { { 0xc9b4dfd6,0x17e74bc3,0xf8e76293,0x25ba8053,0x9d8c3520,0x0307dc05,
  119414. 0xb85a20b4,0x1c9036cc,0x23871359,0xf2c63f0a,0xca95fb4e,0x1a99d9d8,
  119415. 0x9850c6c6,0x3d7c4f39,0x68299668,0x162969c9,0x00000169 },
  119416. { 0xcb63ee53,0x7d13c267,0x75eac353,0x67b12e61,0x191abfca,0xb3369a11,
  119417. 0xee1af69f,0x5ad0649d,0x11dc11e7,0x4d7a6f00,0xdb9f9765,0x80f030b8,
  119418. 0xf0ab1332,0xa20001a3,0x39d8cc62,0xe17c98d2,0x00000194 } },
  119419. /* 226 */
  119420. { { 0x1d8fe898,0x720d80b4,0x32184534,0x8d7a28b7,0x04f21740,0xf1f3c385,
  119421. 0x166aa6af,0x5d381cd5,0xcc560e35,0x9cde6084,0x5e61e2cd,0xcb041f0a,
  119422. 0xd9b4951a,0x621116f5,0x7ee2ac2c,0x509e16d3,0x000000c4 },
  119423. { 0x2c6fd79e,0xb82a20c4,0x3af78b0e,0x95b7ee4e,0xbad819ca,0x3d9b63c1,
  119424. 0x98552569,0x10d674de,0xf9c19d0f,0x17de64b2,0x47c5e6a9,0xa03fabaf,
  119425. 0x2ce2db6f,0x858bc4ad,0x1fc9d18e,0x76c2380a,0x000000c9 } },
  119426. /* 227 */
  119427. { { 0xb064f114,0x91171ef8,0x4f2f0f4c,0x83cb1565,0x57b262b7,0x30525854,
  119428. 0x0f34936c,0x468c6701,0x99a41fed,0xef26d2fe,0xa7f7f6a9,0xf6da2267,
  119429. 0xa01bfc1b,0x2563b8db,0xc340ed40,0x14b36c85,0x0000000e },
  119430. { 0x25db67e6,0x5e57e264,0x7f2e905f,0x85df4e89,0x026c4268,0x7832e514,
  119431. 0x3e875093,0x312be262,0x3c538691,0x856b5bd8,0x95734f9d,0x5b1cae55,
  119432. 0xd5aa4861,0x5a07bfe2,0xce8abb58,0x7a4c96f0,0x000001d0 } },
  119433. /* 228 */
  119434. { { 0x523aa2e9,0x7bf54d05,0xed3d0860,0xc8841e0c,0x7f9bfb69,0x5683f6e2,
  119435. 0x162bdf85,0xdcb07f44,0x07b0dcc9,0x62d17839,0x657a536e,0xa2cbb8ab,
  119436. 0x7cf47d3c,0x98b9a0d2,0x5eea6370,0xff154d68,0x000001f2 },
  119437. { 0x56b232ac,0x568b768a,0x3f2a52ab,0x4e8d6e36,0x8837fc60,0xbae87a16,
  119438. 0xd10a7691,0xebc58a83,0xf9455fbe,0xad5e4af0,0x7d654e2e,0x1a20d6c3,
  119439. 0xda7c8255,0x8c40fcb9,0x60d9b931,0x6d7b3cd7,0x000000b2 } },
  119440. /* 229 */
  119441. { { 0xbb2eaf45,0x7b090c3e,0x62ffb92f,0xed24d91c,0xa736f23d,0xbf2a3ea4,
  119442. 0x6ff0fde3,0xb5b99ebd,0xca1102f5,0xbca2b55d,0x07e032a8,0xf6203cd8,
  119443. 0xa8bf17a8,0x5410b448,0xe1dc55b1,0xb86660a7,0x00000109 },
  119444. { 0x02a2fbd8,0xb148b1da,0x3b22e8a5,0xfed85e8b,0x8712b509,0x1378a0e4,
  119445. 0xc6a3e516,0x68560148,0x1633b503,0x7100921c,0x25512711,0x93925143,
  119446. 0x07d31047,0x7b4931d2,0x8542e0bb,0x623e722b,0x000000ea } },
  119447. /* 230 */
  119448. { { 0x24972688,0x084823d3,0x003f5762,0x58b83c12,0x6d0d4528,0x194d6690,
  119449. 0x2c6f747e,0x84219584,0x0146d89a,0xc8f8a2e9,0x7451bbc2,0x29ec1de7,
  119450. 0xf7f284fa,0xf622b6b8,0x7b71e44f,0x83f1dbe9,0x00000060 },
  119451. { 0x999dd56b,0x99649333,0x97a47de9,0x2cfac0ba,0xbbe8fb20,0x6660d8ae,
  119452. 0xf61d7bca,0x47c29dd8,0x85adc14d,0x6f5fb51d,0x4f9fd41c,0xe65ac788,
  119453. 0xff513e6c,0x1ce69dd4,0xffe59d3e,0x1ace591e,0x00000023 } },
  119454. /* 231 */
  119455. { { 0xa9fda771,0x2e67a438,0x8663100e,0x626f652c,0xe133f23b,0xdfb19e48,
  119456. 0x035d2d1f,0x599f88f2,0x8d13e878,0x1723a112,0xfb51ce07,0x890aa292,
  119457. 0xbbd9ba82,0xe5f3a70e,0x374514b4,0xdde82673,0x00000155 },
  119458. { 0xd6f59a95,0x08b2b77e,0x02020420,0x93f853e3,0xebac7797,0x52252ac1,
  119459. 0xb56b6676,0x6ecdcb99,0x9722a500,0x4abdb9f9,0x04e2bad0,0x26210f3f,
  119460. 0x3034dd4d,0x0ca5a0ff,0xdac0b80d,0x333d8080,0x00000041 } },
  119461. /* 232 */
  119462. { { 0x35a85a06,0xe8510709,0x42ef1b44,0x4e166e76,0xa07b3a6d,0x84a90b71,
  119463. 0x30329e6a,0xd6dd6c00,0x3d555259,0x20c4ba65,0x6f8ad05e,0xee3b26af,
  119464. 0x2ab4cccd,0x20e3d541,0xa9406424,0x79798934,0x000001bd },
  119465. { 0x8e0c7ff0,0xf2a1d184,0x9543b340,0xbae85efc,0xf51d318b,0xe96431ae,
  119466. 0x75878fa6,0xe5d3ed4e,0xc2895f52,0x4d2a29db,0x1f11067c,0x3af27877,
  119467. 0x9e7f4ee5,0x6ccde964,0xa56d74da,0x35188da1,0x00000192 } },
  119468. /* 233 */
  119469. { { 0x03d310ed,0xb0832120,0x987b0311,0xd20ee8cc,0x84c558a8,0x9e549d26,
  119470. 0xb7167ec8,0x5e25f3ce,0x4bf55bb5,0xacf114f4,0x061c9017,0x819edc77,
  119471. 0xdeb343c0,0x759a44e6,0x04c9b5ed,0x58df9f7e,0x00000078 },
  119472. { 0x3bf13222,0x4fa47ebb,0xea07da11,0x1e451dcd,0xc0d8242f,0x1be9fac3,
  119473. 0x36eb871e,0x93257d4d,0xbea3190d,0xf49e775a,0x4ebe2b33,0x406d191f,
  119474. 0x0c110096,0x67aac53c,0xd381ac78,0x5215cf8b,0x000001f4 } },
  119475. /* 234 */
  119476. { { 0xfa493b79,0x387e8a8e,0x4eb1c2ac,0xb20e270b,0x9ff22320,0x9f393fa0,
  119477. 0xa91c393d,0x5ee1baae,0x138a8d96,0xdeda961a,0x97bd50e4,0x69ab238c,
  119478. 0x2363c8e0,0xff68d48a,0xce4c4c16,0xaf8e00e5,0x00000158 },
  119479. { 0xcfc509a1,0x6ccdcf06,0xc26cc075,0x60f411ef,0x4d9c57f0,0x6d0cdfd6,
  119480. 0x32e99cac,0xa9514853,0x8b8e9510,0x58f9ab3d,0xb10dc3fd,0xa7e98709,
  119481. 0x75ef3509,0x8390843d,0x5a9312c7,0x28ccc9d0,0x000001b6 } },
  119482. /* 235 */
  119483. { { 0xe341463f,0x1d934f00,0x150da7a0,0x14c8a6ce,0x4109553f,0xdb4860fc,
  119484. 0xa93f4a91,0xc23bde5a,0x2cd58067,0x9f47c787,0x8433dc80,0x1d330054,
  119485. 0x75a32a7d,0x0c0be7f9,0x88c75da9,0x08b777d5,0x0000012e },
  119486. { 0x61a10d37,0xdfc12817,0x5c50f5a5,0xed7b6181,0x79477c60,0x28af95db,
  119487. 0x33c5310b,0xa0aa2b77,0x53118267,0x905faab8,0x6b41959f,0xf40e9816,
  119488. 0x16b37784,0x9ccb4252,0x69866acc,0x6835d77c,0x000000c5 } },
  119489. /* 236 */
  119490. { { 0x2b450a66,0xe9d714cb,0x7dbfdc14,0x1318885c,0xb466a0c0,0x655a8d85,
  119491. 0x5bdfc1a6,0x02a21e99,0xe67792d1,0x7a0d7c98,0xb550a797,0x2a01bb57,
  119492. 0x5d74d337,0x42c46233,0x88dad495,0x7be4e1c0,0x0000008b },
  119493. { 0x95812273,0x1873b03f,0xee3f757f,0x2e26ed32,0x6da6217a,0x2c710eae,
  119494. 0x261d9f4f,0x9b50b574,0xb7c1da2d,0x43971fa9,0xc4a85de7,0x22c4fb87,
  119495. 0xec22137b,0xf72c3451,0x77ba1926,0x1345668c,0x00000173 } },
  119496. /* 237 */
  119497. { { 0x8a3ba183,0x3e3e8c7a,0xfe389fa7,0x4e8cebbb,0x0f9ba60f,0x8ea44687,
  119498. 0xcb601a83,0x55176e35,0x12e52db4,0xf90bdc26,0x8f712bf1,0x95f9e459,
  119499. 0xbea054cd,0x9bd3200f,0xdd5fd40b,0x2cf19bf6,0x0000017a },
  119500. { 0x66736feb,0x71cf6ca2,0xde7cfe2f,0xbde86f49,0xfc290563,0xc60abce8,
  119501. 0x726b6e4f,0xaae8a3ce,0x3f29235b,0xd2382445,0x650ffa5e,0xa4b557f5,
  119502. 0x113ef744,0xa1453e54,0x3e426dd2,0x7c676a53,0x000001b0 } },
  119503. /* 238 */
  119504. { { 0x35d96872,0xf5e603f2,0x3fa5b8ca,0xab1a23cc,0xe988dc5f,0x5459871b,
  119505. 0xd430c0bd,0xe32e8489,0x764d9cc3,0x7ec269e0,0xf2c0c40d,0xf7238212,
  119506. 0x887b83b4,0x2d946183,0x2f18a411,0x281fa671,0x00000010 },
  119507. { 0x64858b37,0x8028048f,0x357de5d9,0xe0e149af,0x619ebb18,0xb2218791,
  119508. 0x9f2b0ba0,0x210200b3,0x1039cbae,0x5a87eae6,0x39579d1d,0x4efdcddb,
  119509. 0x2788515e,0x1b388eaa,0xc81878aa,0x1a552c3c,0x0000002c } },
  119510. /* 239 */
  119511. { { 0x0ea723dc,0x7ac7f500,0x42b15231,0x0a5f04f4,0xbe885c86,0x63d49445,
  119512. 0xff119702,0x61f9993f,0xc4c58cea,0xc3fba45c,0xb9cd6036,0xe6d151e6,
  119513. 0x57b923bb,0x75a3ab15,0xceb2fd46,0x4ec07c52,0x00000147 },
  119514. { 0xed88239d,0xc46a3d32,0x835ae694,0x0d1b8ae6,0x9feeb2e7,0xf4fde325,
  119515. 0x43bc0bb5,0x223bf71c,0x8f62a705,0x3cd220b7,0x9fe799a5,0x2224860e,
  119516. 0x24ab7f93,0xd8558703,0xb594958b,0x8e0f7330,0x0000010f } },
  119517. /* 240 */
  119518. { { 0x3c67d520,0xaf35c7bb,0x23fca9ec,0xd8f4958b,0x8bbaa808,0x0778f194,
  119519. 0x2135e8ae,0x418c30ce,0xc888eff7,0xcdd8d9a9,0xf73144ab,0x72075df0,
  119520. 0x4506a534,0xb549c895,0x5fbb7fc5,0x4ef38979,0x0000011c },
  119521. { 0x43f5e698,0x3fe2c9ac,0xe38a5e3a,0xce77fcbc,0x3089c2e1,0x6d05c90e,
  119522. 0xac1d5801,0x5a74f3ff,0x381b9d2a,0xaeeda220,0xf5f3960b,0xd958b143,
  119523. 0x0db7abbe,0x65ffd051,0x7a05b718,0x8e97e680,0x000000ce } },
  119524. /* 241 */
  119525. { { 0x8ce86a83,0x2251e61b,0xbf7e7160,0x8604159f,0x48f03377,0xfc127dd7,
  119526. 0x45052242,0x87cb2c37,0x934ea09b,0xbd4950f4,0xc4679441,0x5146c403,
  119527. 0x23ba416a,0xe8ad4710,0xaf638eb1,0x89b81a60,0x000001b3 },
  119528. { 0xe8150c69,0xe699934e,0xe27c14bc,0x74f75908,0x6a0194ff,0x5dc0a891,
  119529. 0x1bd51b76,0x38f49d32,0x18779630,0x6bc3305e,0xfd3b4a68,0xfe2f3fbf,
  119530. 0xd7caf189,0x1409b377,0x9b8f109b,0x029ea13b,0x000001b3 } },
  119531. /* 242 */
  119532. { { 0x25a2fd88,0xef7938d2,0xceba0603,0x890f2f7c,0xd7a6dff4,0x4c3e1c80,
  119533. 0x2883f986,0x00c78f36,0x998e5305,0xed92b592,0x325ddc73,0x018a8f1b,
  119534. 0xd5d3708a,0x6dffd987,0x0d1f28bb,0xdcd3554f,0x00000059 },
  119535. { 0x23a74e7d,0x17c6e41d,0x5db32df6,0x94b61ebe,0x9e7ffa0b,0x3c2fffa7,
  119536. 0x2ebb7a0d,0x473662b7,0x01adf9c3,0xa86415ee,0x54679264,0x1502c326,
  119537. 0x2fa09c57,0x16911349,0x24749086,0x897f34aa,0x00000195 } },
  119538. /* 243 */
  119539. { { 0xabadc253,0x4845d359,0xc797c95e,0xe054b92c,0x9a218212,0x22a9b5bd,
  119540. 0xa52b8827,0x9bb80a5e,0x2e61c676,0xea38e78e,0x08b0f8b3,0xfb274b1a,
  119541. 0xdb9d854c,0xb6aa42e3,0x56012d73,0x8ba22523,0x00000163 },
  119542. { 0x75c8c576,0x7cec0e6f,0xe4bc7dd2,0xabb20e7c,0x69d80726,0x0958a0c8,
  119543. 0x8a023eb7,0xa908c66a,0x76110b15,0xca9f50ea,0x186f61a6,0x668c9994,
  119544. 0x2a0a69d8,0x9ddf22ed,0xbbf8a10f,0xbfee1897,0x000001e0 } },
  119545. /* 244 */
  119546. { { 0x48319e4f,0x26d86818,0x5a586fa0,0x6be6f6b5,0x26713265,0xbef5d886,
  119547. 0x98529cfa,0xac252ac5,0x62b29cfb,0xe7cc45f1,0xa2a6358d,0xee050609,
  119548. 0x2940ac70,0xf7cb9ca4,0xa885b1f0,0xfb44aaec,0x000001ad },
  119549. { 0xe798678e,0x66b7a936,0x99540438,0xca01e103,0x816860b7,0xf2491e37,
  119550. 0xb745d857,0xeeffd483,0xa4705ed6,0x5dbb3628,0xb2a5d0f7,0x57d68d49,
  119551. 0x2389fee3,0xd1a8529a,0x1a7fd686,0xdbbc2549,0x000001ad } },
  119552. /* 245 */
  119553. { { 0x969686a3,0xe10cba20,0xe3c053f5,0x308b1c55,0x26f47102,0x1712b134,
  119554. 0x49033038,0x1f9165b1,0x2d01527b,0x45b72017,0xaa9a34e2,0x6fcf6647,
  119555. 0xb0be35c8,0x51f54b94,0x5a15e382,0xfccb22a5,0x000000e3 },
  119556. { 0x5b4dc0be,0xaa71e4ec,0xdb1cd5c4,0xbb136248,0x046e1007,0xf36bff43,
  119557. 0xda9c99a3,0x5a6806d7,0x8349bc50,0x9cbfc6ee,0xe13e0850,0x26871e73,
  119558. 0x67f448c1,0x5e6aa227,0x2da7baf9,0xba77787c,0x000001b9 } },
  119559. /* 246 */
  119560. { { 0xc5a73375,0x1abe58ee,0x7a8ac438,0x175df69d,0xceca835a,0x2cf3150a,
  119561. 0xf507d30f,0xb87b0609,0xc60b0424,0x9ae53a2b,0x410f90ec,0x4931e182,
  119562. 0xadd689bb,0x452c7d0f,0x47631a8e,0xab453491,0x00000013 },
  119563. { 0x8c84f3af,0xaf2dd856,0x1baae33e,0x829dc092,0x8b96b070,0x46542a85,
  119564. 0xe8a82516,0x42260d40,0x5c35322b,0xb9e5edac,0x39eda0d2,0xbca79560,
  119565. 0xb962b90a,0x86bd07c6,0xb1ec5302,0x2e22dac7,0x0000010a } },
  119566. /* 247 */
  119567. { { 0x239d8f0a,0x665fc09d,0xab8a1021,0x92b2e03c,0x0173477b,0xe4369768,
  119568. 0x8e361604,0xab38ed9f,0x9eb061be,0x79b0091d,0x3e845670,0xcd422654,
  119569. 0x2fe1a2e0,0xa0f77ec7,0x760a030f,0x1d242162,0x00000093 },
  119570. { 0xf8646bc3,0xfa9f834c,0x40ae96f9,0x7df94a52,0x379177d1,0x901c3890,
  119571. 0xffeb66cd,0x9dfd0644,0x77b92465,0x81aec2ec,0xcd981d4f,0x2df3b7f2,
  119572. 0xf377b093,0xc9bc3f69,0xdd859d8b,0xdaef34f3,0x00000125 } },
  119573. /* 248 */
  119574. { { 0xa2c123bc,0xac08451b,0x0818fa54,0xd1e83a68,0x98957b8a,0x56dd5702,
  119575. 0xf0f12f16,0xcc7f2e34,0x0a9fa14d,0x1f6a9c33,0xb2fe782c,0xefc9a2bb,
  119576. 0x709f54dd,0xd319c697,0xd6460a53,0x0b8238cb,0x000001dc },
  119577. { 0x44dfb6f6,0xf6492901,0x6e401d26,0x270d7cb4,0x48537ad8,0x1a70a40e,
  119578. 0x70d8dbd9,0x84d661b5,0xf170d58b,0xca27223a,0x6344e1d2,0xeeb4cf14,
  119579. 0xab9de1fa,0x2255fc95,0xdbdc5ea7,0xcd6e110a,0x000001f8 } },
  119580. /* 249 */
  119581. { { 0x78b8a0a7,0x2a57c6b9,0xe833edea,0x24b4aeb6,0x4bd13fe7,0x9e4617c1,
  119582. 0xfc2e8ee4,0xc4186888,0xfb147eef,0x8d398a49,0x2e662cfb,0xe9f191f1,
  119583. 0x958ba2ec,0x61872289,0x00b8d50d,0xbd6d0f1b,0x0000002d },
  119584. { 0x24c93cc9,0x895cfdfe,0xb9e718e7,0x29ed7780,0x38baf7eb,0x01c8ba58,
  119585. 0x4ddcbf69,0x0225387e,0xa180d6bb,0x64b250bf,0xc947c7c2,0x6d68e548,
  119586. 0x9923f3cd,0x82a7b632,0x2d103cd2,0xb8f03613,0x0000000f } },
  119587. /* 250 */
  119588. { { 0x8cd9d494,0x8198b3f0,0x94f4f9f3,0x9b2065b9,0x3c738fa9,0x7664a220,
  119589. 0xd8d229cb,0x199f4c14,0xc51c54b3,0xddad75c4,0xd213a332,0x9a32ce0b,
  119590. 0x888c7b2f,0xf3a21085,0x5b1ff20a,0x6defa362,0x000000d1 },
  119591. { 0x19a296eb,0x44e00548,0xd1a91313,0x1d94ff15,0xfeaa454f,0xd7dead2b,
  119592. 0x4d40bd7f,0xae65a803,0x1801a4af,0x604f147e,0xa5e0de77,0x983048f9,
  119593. 0xff572ca0,0xa3b19ca5,0x1821d117,0xa237dba7,0x000000e0 } },
  119594. /* 251 */
  119595. { { 0x91630ee8,0xedbabf84,0x05eb5301,0xde6589c2,0xa051f47b,0x9f7d2b2d,
  119596. 0x212bbe81,0xaeaa9f96,0x94292124,0xdced3d5e,0xf4435e5b,0x691f5b89,
  119597. 0x9411f66f,0x19604c33,0x4356f0da,0xb7fc09ca,0x000000e6 },
  119598. { 0xf74f811c,0x1294e413,0xdf8d8ddb,0x1a42d831,0x963418c9,0x27f57217,
  119599. 0x88ebcdec,0x5fde5218,0xea305bc9,0xfdd5e06e,0xac668b61,0xed1e6088,
  119600. 0xeb811861,0x333af016,0x15ddcebc,0x5ecb192d,0x000001c9 } },
  119601. /* 252 */
  119602. { { 0xe0bde442,0x927b37a3,0x66f7a73e,0xe0543fe8,0x8ed10c2e,0xd30d9d20,
  119603. 0xa6617a32,0xaf79c341,0xd1d5cf8b,0xe7367870,0xe3abcf8b,0x02d0dce9,
  119604. 0x772b5e7b,0xfe23d2dd,0x1ffc70c5,0x29fceea0,0x0000010b },
  119605. { 0x62d803ff,0x31bcae4d,0xdbc306a9,0x93ee913f,0xd8c10662,0xaf1de7ab,
  119606. 0xe7a6d658,0xd485782a,0x102f4e06,0x9126592e,0x136fafe6,0x91a3127f,
  119607. 0x88371213,0x46b93440,0xa31e1634,0x53bb4380,0x000000ba } },
  119608. /* 253 */
  119609. { { 0xca5636b0,0x62e517fc,0x6aba15c7,0x4296e021,0x212e7b2d,0x5aa8fd7c,
  119610. 0x5717ad84,0x9517ce6d,0x98b2f357,0xe762b85b,0xdf59b07c,0x42f996b5,
  119611. 0xf37ef6f0,0xf3732abb,0x4542b489,0xa5d145ea,0x0000015d },
  119612. { 0xaa7f6e3f,0x1e77c55e,0xaa4a05bc,0x3f4d99a7,0x45828227,0xa56d7d77,
  119613. 0x77b748fb,0xdb0895fb,0x0629f5d1,0x1c484cce,0x359803fb,0xf5b1c90a,
  119614. 0x1720b8d0,0x43ac4f29,0x72ac13f2,0x8c10bfe8,0x000000e9 } },
  119615. /* 254 */
  119616. { { 0xc06c4fd6,0x9d1c4785,0xd25c2b9d,0xbf4b9025,0xd4982f24,0x04135eb1,
  119617. 0xba4fef2b,0x3ab3edc2,0x98de07ab,0x55a5239f,0x096f4b7d,0xd5fc49ab,
  119618. 0x3844c815,0xc50a2960,0x15676b2b,0xdb1148d0,0x00000047 },
  119619. { 0x10f3bad9,0xc49f9cc5,0x022901d4,0x490888fc,0xc47b44df,0x917a55eb,
  119620. 0xf39f2b68,0x20b2ebc6,0x04e9962a,0x0c58e3af,0x573dd5b7,0x52ab7c1b,
  119621. 0xa329f76c,0x2b54add6,0x82f4ca3b,0x59dad1eb,0x00000108 } },
  119622. /* 255 */
  119623. { { 0xa182d1ad,0x662c4128,0x20916c45,0x7751796e,0xba681647,0xa7704272,
  119624. 0xb92c85c1,0xfac8b0fa,0xaefb2e07,0x207ab2df,0x7861b32d,0xc73530a0,
  119625. 0x88aed145,0x63dbed65,0x0a53a49d,0x547bcdca,0x000000bd },
  119626. { 0x87056b51,0xa7c1382f,0x130f9912,0xc3d91edb,0xd3805b42,0xf7c7de46,
  119627. 0xfd31a995,0x456101eb,0xcd3fb8aa,0x1efd22b4,0x9eb17bce,0xfe391df7,
  119628. 0x616c0c32,0xb4d4c0c6,0x711beef4,0x19f023be,0x00000112 } },
  119629. };
  119630. /* Multiply the base point of P521 by the scalar and return the result.
  119631. * If map is true then convert result to affine coordinates.
  119632. *
  119633. * Stripe implementation.
  119634. * Pre-generated: 2^0, 2^65, ...
  119635. * Pre-generated: products of all combinations of above.
  119636. * 8 doubles and adds (with qz=1)
  119637. *
  119638. * r Resulting point.
  119639. * k Scalar to multiply by.
  119640. * map Indicates whether to convert result to affine.
  119641. * ct Constant time required.
  119642. * heap Heap to use for allocation.
  119643. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  119644. */
  119645. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  119646. int map, int ct, void* heap)
  119647. {
  119648. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  119649. k, map, ct, heap);
  119650. }
  119651. #endif
  119652. /* Multiply the base point of P521 by the scalar and return the result.
  119653. * If map is true then convert result to affine coordinates.
  119654. *
  119655. * km Scalar to multiply by.
  119656. * r Resulting point.
  119657. * map Indicates whether to convert result to affine.
  119658. * heap Heap to use for allocation.
  119659. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  119660. */
  119661. int sp_ecc_mulmod_base_521(const mp_int* km, ecc_point* r, int map, void* heap)
  119662. {
  119663. #ifdef WOLFSSL_SP_SMALL_STACK
  119664. sp_point_521* point = NULL;
  119665. sp_digit* k = NULL;
  119666. #else
  119667. sp_point_521 point[1];
  119668. sp_digit k[17];
  119669. #endif
  119670. int err = MP_OKAY;
  119671. #ifdef WOLFSSL_SP_SMALL_STACK
  119672. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  119673. DYNAMIC_TYPE_ECC);
  119674. if (point == NULL)
  119675. err = MEMORY_E;
  119676. if (err == MP_OKAY) {
  119677. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  119678. DYNAMIC_TYPE_ECC);
  119679. if (k == NULL)
  119680. err = MEMORY_E;
  119681. }
  119682. #endif
  119683. if (err == MP_OKAY) {
  119684. sp_521_from_mp(k, 17, km);
  119685. err = sp_521_ecc_mulmod_base_17(point, k, map, 1, heap);
  119686. }
  119687. if (err == MP_OKAY) {
  119688. err = sp_521_point_to_ecc_point_17(point, r);
  119689. }
  119690. #ifdef WOLFSSL_SP_SMALL_STACK
  119691. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  119692. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  119693. #endif
  119694. return err;
  119695. }
  119696. /* Multiply the base point of P521 by the scalar, add point a and return
  119697. * the result. If map is true then convert result to affine coordinates.
  119698. *
  119699. * km Scalar to multiply by.
  119700. * am Point to add to scalar multiply result.
  119701. * inMont Point to add is in montgomery form.
  119702. * r Resulting point.
  119703. * map Indicates whether to convert result to affine.
  119704. * heap Heap to use for allocation.
  119705. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  119706. */
  119707. int sp_ecc_mulmod_base_add_521(const mp_int* km, const ecc_point* am,
  119708. int inMont, ecc_point* r, int map, void* heap)
  119709. {
  119710. #ifdef WOLFSSL_SP_SMALL_STACK
  119711. sp_point_521* point = NULL;
  119712. sp_digit* k = NULL;
  119713. #else
  119714. sp_point_521 point[2];
  119715. sp_digit k[17 + 17 * 2 * 6];
  119716. #endif
  119717. sp_point_521* addP = NULL;
  119718. sp_digit* tmp = NULL;
  119719. int err = MP_OKAY;
  119720. #ifdef WOLFSSL_SP_SMALL_STACK
  119721. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  119722. DYNAMIC_TYPE_ECC);
  119723. if (point == NULL)
  119724. err = MEMORY_E;
  119725. if (err == MP_OKAY) {
  119726. k = (sp_digit*)XMALLOC(
  119727. sizeof(sp_digit) * (17 + 17 * 2 * 6),
  119728. heap, DYNAMIC_TYPE_ECC);
  119729. if (k == NULL)
  119730. err = MEMORY_E;
  119731. }
  119732. #endif
  119733. if (err == MP_OKAY) {
  119734. addP = point + 1;
  119735. tmp = k + 17;
  119736. sp_521_from_mp(k, 17, km);
  119737. sp_521_point_from_ecc_point_17(addP, am);
  119738. }
  119739. if ((err == MP_OKAY) && (!inMont)) {
  119740. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  119741. }
  119742. if ((err == MP_OKAY) && (!inMont)) {
  119743. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  119744. }
  119745. if ((err == MP_OKAY) && (!inMont)) {
  119746. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  119747. }
  119748. if (err == MP_OKAY) {
  119749. err = sp_521_ecc_mulmod_base_17(point, k, 0, 0, heap);
  119750. }
  119751. if (err == MP_OKAY) {
  119752. sp_521_proj_point_add_17(point, point, addP, tmp);
  119753. if (map) {
  119754. sp_521_map_17(point, point, tmp);
  119755. }
  119756. err = sp_521_point_to_ecc_point_17(point, r);
  119757. }
  119758. #ifdef WOLFSSL_SP_SMALL_STACK
  119759. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  119760. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  119761. #endif
  119762. return err;
  119763. }
  119764. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  119765. defined(HAVE_ECC_VERIFY)
  119766. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  119767. /* Add 1 to a. (a = a + 1)
  119768. *
  119769. * a A single precision integer.
  119770. */
  119771. static void sp_521_add_one_17(sp_digit* a_p)
  119772. {
  119773. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  119774. __asm__ __volatile__ (
  119775. "ldm %[a], {r1, r2, r3, r4}\n\t"
  119776. "adds r1, r1, #1\n\t"
  119777. "adcs r2, r2, #0\n\t"
  119778. "adcs r3, r3, #0\n\t"
  119779. "adcs r4, r4, #0\n\t"
  119780. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119781. "ldm %[a], {r1, r2, r3, r4}\n\t"
  119782. "adcs r1, r1, #0\n\t"
  119783. "adcs r2, r2, #0\n\t"
  119784. "adcs r3, r3, #0\n\t"
  119785. "adcs r4, r4, #0\n\t"
  119786. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119787. "ldm %[a], {r1, r2, r3, r4}\n\t"
  119788. "adcs r1, r1, #0\n\t"
  119789. "adcs r2, r2, #0\n\t"
  119790. "adcs r3, r3, #0\n\t"
  119791. "adcs r4, r4, #0\n\t"
  119792. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119793. "ldm %[a], {r1, r2, r3, r4}\n\t"
  119794. "adcs r1, r1, #0\n\t"
  119795. "adcs r2, r2, #0\n\t"
  119796. "adcs r3, r3, #0\n\t"
  119797. "adcs r4, r4, #0\n\t"
  119798. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119799. "ldm %[a], {r1}\n\t"
  119800. "adcs r1, r1, #0\n\t"
  119801. "stm %[a]!, {r1}\n\t"
  119802. : [a] "+r" (a)
  119803. :
  119804. : "memory", "r1", "r2", "r3", "r4", "cc"
  119805. );
  119806. }
  119807. /* Read big endian unsigned byte array into r.
  119808. *
  119809. * r A single precision integer.
  119810. * size Maximum number of bytes to convert
  119811. * a Byte array.
  119812. * n Number of bytes in array to read.
  119813. */
  119814. static void sp_521_from_bin(sp_digit* r, int size, const byte* a, int n)
  119815. {
  119816. int i;
  119817. int j;
  119818. byte* d;
  119819. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  119820. r[j] = ((sp_digit)a[i - 0] << 0) |
  119821. ((sp_digit)a[i - 1] << 8) |
  119822. ((sp_digit)a[i - 2] << 16) |
  119823. ((sp_digit)a[i - 3] << 24);
  119824. j++;
  119825. }
  119826. if (i >= 0) {
  119827. r[j] = 0;
  119828. d = (byte*)r;
  119829. switch (i) {
  119830. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  119831. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  119832. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  119833. }
  119834. j++;
  119835. }
  119836. for (; j < size; j++) {
  119837. r[j] = 0;
  119838. }
  119839. }
  119840. /* Generates a scalar that is in the range 1..order-1.
  119841. *
  119842. * rng Random number generator.
  119843. * k Scalar value.
  119844. * returns RNG failures, MEMORY_E when memory allocation fails and
  119845. * MP_OKAY on success.
  119846. */
  119847. static int sp_521_ecc_gen_k_17(WC_RNG* rng, sp_digit* k)
  119848. {
  119849. #ifndef WC_NO_RNG
  119850. int err;
  119851. byte buf[66];
  119852. do {
  119853. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  119854. if (err == 0) {
  119855. buf[0] &= 0x1;
  119856. sp_521_from_bin(k, 17, buf, (int)sizeof(buf));
  119857. if (sp_521_cmp_17(k, p521_order2) <= 0) {
  119858. sp_521_add_one_17(k);
  119859. break;
  119860. }
  119861. }
  119862. }
  119863. while (err == 0);
  119864. return err;
  119865. #else
  119866. (void)rng;
  119867. (void)k;
  119868. return NOT_COMPILED_IN;
  119869. #endif
  119870. }
  119871. /* Makes a random EC key pair.
  119872. *
  119873. * rng Random number generator.
  119874. * priv Generated private value.
  119875. * pub Generated public point.
  119876. * heap Heap to use for allocation.
  119877. * returns ECC_INF_E when the point does not have the correct order, RNG
  119878. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  119879. */
  119880. int sp_ecc_make_key_521(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  119881. {
  119882. #ifdef WOLFSSL_SP_SMALL_STACK
  119883. sp_point_521* point = NULL;
  119884. sp_digit* k = NULL;
  119885. #else
  119886. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119887. sp_point_521 point[2];
  119888. #else
  119889. sp_point_521 point[1];
  119890. #endif
  119891. sp_digit k[17];
  119892. #endif
  119893. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119894. sp_point_521* infinity = NULL;
  119895. #endif
  119896. int err = MP_OKAY;
  119897. (void)heap;
  119898. #ifdef WOLFSSL_SP_SMALL_STACK
  119899. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119900. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC);
  119901. #else
  119902. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC);
  119903. #endif
  119904. if (point == NULL)
  119905. err = MEMORY_E;
  119906. if (err == MP_OKAY) {
  119907. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  119908. DYNAMIC_TYPE_ECC);
  119909. if (k == NULL)
  119910. err = MEMORY_E;
  119911. }
  119912. #endif
  119913. if (err == MP_OKAY) {
  119914. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119915. infinity = point + 1;
  119916. #endif
  119917. err = sp_521_ecc_gen_k_17(rng, k);
  119918. }
  119919. if (err == MP_OKAY) {
  119920. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, NULL);
  119921. }
  119922. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119923. if (err == MP_OKAY) {
  119924. err = sp_521_ecc_mulmod_17(infinity, point, p521_order, 1, 1, NULL);
  119925. }
  119926. if (err == MP_OKAY) {
  119927. if (sp_521_iszero_17(point->x) || sp_521_iszero_17(point->y)) {
  119928. err = ECC_INF_E;
  119929. }
  119930. }
  119931. #endif
  119932. if (err == MP_OKAY) {
  119933. err = sp_521_to_mp(k, priv);
  119934. }
  119935. if (err == MP_OKAY) {
  119936. err = sp_521_point_to_ecc_point_17(point, pub);
  119937. }
  119938. #ifdef WOLFSSL_SP_SMALL_STACK
  119939. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  119940. /* point is not sensitive, so no need to zeroize */
  119941. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  119942. #endif
  119943. return err;
  119944. }
  119945. #ifdef WOLFSSL_SP_NONBLOCK
  119946. typedef struct sp_ecc_key_gen_521_ctx {
  119947. int state;
  119948. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  119949. sp_digit k[17];
  119950. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119951. sp_point_521 point[2];
  119952. #else
  119953. sp_point_521 point[1];
  119954. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  119955. } sp_ecc_key_gen_521_ctx;
  119956. int sp_ecc_make_key_521_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  119957. ecc_point* pub, void* heap)
  119958. {
  119959. int err = FP_WOULDBLOCK;
  119960. sp_ecc_key_gen_521_ctx* ctx = (sp_ecc_key_gen_521_ctx*)sp_ctx->data;
  119961. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119962. sp_point_521* infinity = ctx->point + 1;
  119963. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  119964. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_521_ctx)
  119965. >= sizeof(*sp_ctx) ? -1 : 1];
  119966. (void)sizeof(ctx_size_test);
  119967. switch (ctx->state) {
  119968. case 0:
  119969. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  119970. if (err == MP_OKAY) {
  119971. err = FP_WOULDBLOCK;
  119972. ctx->state = 1;
  119973. }
  119974. break;
  119975. case 1:
  119976. err = sp_521_ecc_mulmod_base_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  119977. ctx->point, ctx->k, 1, 1, heap);
  119978. if (err == MP_OKAY) {
  119979. err = FP_WOULDBLOCK;
  119980. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119981. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  119982. ctx->state = 2;
  119983. #else
  119984. ctx->state = 3;
  119985. #endif
  119986. }
  119987. break;
  119988. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  119989. case 2:
  119990. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  119991. infinity, ctx->point, p521_order, 1, 1);
  119992. if (err == MP_OKAY) {
  119993. if (sp_521_iszero_17(ctx->point->x) ||
  119994. sp_521_iszero_17(ctx->point->y)) {
  119995. err = ECC_INF_E;
  119996. }
  119997. else {
  119998. err = FP_WOULDBLOCK;
  119999. ctx->state = 3;
  120000. }
  120001. }
  120002. break;
  120003. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  120004. case 3:
  120005. err = sp_521_to_mp(ctx->k, priv);
  120006. if (err == MP_OKAY) {
  120007. err = sp_521_point_to_ecc_point_17(ctx->point, pub);
  120008. }
  120009. break;
  120010. }
  120011. if (err != FP_WOULDBLOCK) {
  120012. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_521_ctx));
  120013. }
  120014. return err;
  120015. }
  120016. #endif /* WOLFSSL_SP_NONBLOCK */
  120017. #ifdef HAVE_ECC_DHE
  120018. /* Write r as big endian to byte array.
  120019. * Fixed length number of bytes written: 66
  120020. *
  120021. * r A single precision integer.
  120022. * a Byte array.
  120023. */
  120024. static void sp_521_to_bin_17(sp_digit* r, byte* a)
  120025. {
  120026. int i;
  120027. int j = 0;
  120028. a[j++] = r[16] >> 8;
  120029. a[j++] = r[16] >> 0;
  120030. for (i = 15; i >= 0; i--) {
  120031. a[j++] = r[i] >> 24;
  120032. a[j++] = r[i] >> 16;
  120033. a[j++] = r[i] >> 8;
  120034. a[j++] = r[i] >> 0;
  120035. }
  120036. }
  120037. /* Multiply the point by the scalar and serialize the X ordinate.
  120038. * The number is 0 padded to maximum size on output.
  120039. *
  120040. * priv Scalar to multiply the point by.
  120041. * pub Point to multiply.
  120042. * out Buffer to hold X ordinate.
  120043. * outLen On entry, size of the buffer in bytes.
  120044. * On exit, length of data in buffer in bytes.
  120045. * heap Heap to use for allocation.
  120046. * returns BUFFER_E if the buffer is to small for output size,
  120047. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  120048. */
  120049. int sp_ecc_secret_gen_521(const mp_int* priv, const ecc_point* pub, byte* out,
  120050. word32* outLen, void* heap)
  120051. {
  120052. #ifdef WOLFSSL_SP_SMALL_STACK
  120053. sp_point_521* point = NULL;
  120054. sp_digit* k = NULL;
  120055. #else
  120056. sp_point_521 point[1];
  120057. sp_digit k[17];
  120058. #endif
  120059. int err = MP_OKAY;
  120060. if (*outLen < 65U) {
  120061. err = BUFFER_E;
  120062. }
  120063. #ifdef WOLFSSL_SP_SMALL_STACK
  120064. if (err == MP_OKAY) {
  120065. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  120066. DYNAMIC_TYPE_ECC);
  120067. if (point == NULL)
  120068. err = MEMORY_E;
  120069. }
  120070. if (err == MP_OKAY) {
  120071. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  120072. DYNAMIC_TYPE_ECC);
  120073. if (k == NULL)
  120074. err = MEMORY_E;
  120075. }
  120076. #endif
  120077. if (err == MP_OKAY) {
  120078. sp_521_from_mp(k, 17, priv);
  120079. sp_521_point_from_ecc_point_17(point, pub);
  120080. err = sp_521_ecc_mulmod_17(point, point, k, 1, 1, heap);
  120081. }
  120082. if (err == MP_OKAY) {
  120083. sp_521_to_bin_17(point->x, out);
  120084. *outLen = 66;
  120085. }
  120086. #ifdef WOLFSSL_SP_SMALL_STACK
  120087. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  120088. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  120089. #endif
  120090. return err;
  120091. }
  120092. #ifdef WOLFSSL_SP_NONBLOCK
  120093. typedef struct sp_ecc_sec_gen_521_ctx {
  120094. int state;
  120095. union {
  120096. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  120097. };
  120098. sp_digit k[17];
  120099. sp_point_521 point;
  120100. } sp_ecc_sec_gen_521_ctx;
  120101. int sp_ecc_secret_gen_521_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  120102. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  120103. {
  120104. int err = FP_WOULDBLOCK;
  120105. sp_ecc_sec_gen_521_ctx* ctx = (sp_ecc_sec_gen_521_ctx*)sp_ctx->data;
  120106. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  120107. (void)sizeof(ctx_size_test);
  120108. if (*outLen < 32U) {
  120109. err = BUFFER_E;
  120110. }
  120111. switch (ctx->state) {
  120112. case 0:
  120113. sp_521_from_mp(ctx->k, 17, priv);
  120114. sp_521_point_from_ecc_point_17(&ctx->point, pub);
  120115. ctx->state = 1;
  120116. break;
  120117. case 1:
  120118. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  120119. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  120120. if (err == MP_OKAY) {
  120121. sp_521_to_bin_17(ctx->point.x, out);
  120122. *outLen = 66;
  120123. }
  120124. break;
  120125. }
  120126. if (err == MP_OKAY && ctx->state != 1) {
  120127. err = FP_WOULDBLOCK;
  120128. }
  120129. if (err != FP_WOULDBLOCK) {
  120130. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_521_ctx));
  120131. }
  120132. return err;
  120133. }
  120134. #endif /* WOLFSSL_SP_NONBLOCK */
  120135. #endif /* HAVE_ECC_DHE */
  120136. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  120137. static void sp_521_rshift_17(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  120138. {
  120139. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  120140. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  120141. register byte n asm ("r2") = (byte)n_p;
  120142. __asm__ __volatile__ (
  120143. "rsb r12, %[n], #32\n\t"
  120144. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  120145. "ldr r4, [%[a]]\n\t"
  120146. "ldr r5, [%[a], #4]\n\t"
  120147. #else
  120148. "ldrd r4, r5, [%[a]]\n\t"
  120149. #endif
  120150. "lsr r4, r4, %[n]\n\t"
  120151. "lsl r3, r5, r12\n\t"
  120152. "lsr r5, r5, %[n]\n\t"
  120153. "orr r4, r4, r3\n\t"
  120154. "ldr r6, [%[a], #8]\n\t"
  120155. "str r4, [%[a]]\n\t"
  120156. "lsl r3, r6, r12\n\t"
  120157. "lsr r6, r6, %[n]\n\t"
  120158. "orr r5, r5, r3\n\t"
  120159. "ldr r4, [%[a], #12]\n\t"
  120160. "str r5, [%[a], #4]\n\t"
  120161. "lsl r3, r4, r12\n\t"
  120162. "lsr r4, r4, %[n]\n\t"
  120163. "orr r6, r6, r3\n\t"
  120164. "ldr r5, [%[a], #16]\n\t"
  120165. "str r6, [%[a], #8]\n\t"
  120166. "lsl r3, r5, r12\n\t"
  120167. "lsr r5, r5, %[n]\n\t"
  120168. "orr r4, r4, r3\n\t"
  120169. "ldr r6, [%[a], #20]\n\t"
  120170. "str r4, [%[a], #12]\n\t"
  120171. "lsl r3, r6, r12\n\t"
  120172. "lsr r6, r6, %[n]\n\t"
  120173. "orr r5, r5, r3\n\t"
  120174. "ldr r4, [%[a], #24]\n\t"
  120175. "str r5, [%[a], #16]\n\t"
  120176. "lsl r3, r4, r12\n\t"
  120177. "lsr r4, r4, %[n]\n\t"
  120178. "orr r6, r6, r3\n\t"
  120179. "ldr r5, [%[a], #28]\n\t"
  120180. "str r6, [%[a], #20]\n\t"
  120181. "lsl r3, r5, r12\n\t"
  120182. "lsr r5, r5, %[n]\n\t"
  120183. "orr r4, r4, r3\n\t"
  120184. "ldr r6, [%[a], #32]\n\t"
  120185. "str r4, [%[a], #24]\n\t"
  120186. "lsl r3, r6, r12\n\t"
  120187. "lsr r6, r6, %[n]\n\t"
  120188. "orr r5, r5, r3\n\t"
  120189. "ldr r4, [%[a], #36]\n\t"
  120190. "str r5, [%[a], #28]\n\t"
  120191. "lsl r3, r4, r12\n\t"
  120192. "lsr r4, r4, %[n]\n\t"
  120193. "orr r6, r6, r3\n\t"
  120194. "ldr r5, [%[a], #40]\n\t"
  120195. "str r6, [%[a], #32]\n\t"
  120196. "lsl r3, r5, r12\n\t"
  120197. "lsr r5, r5, %[n]\n\t"
  120198. "orr r4, r4, r3\n\t"
  120199. "ldr r6, [%[a], #44]\n\t"
  120200. "str r4, [%[a], #36]\n\t"
  120201. "lsl r3, r6, r12\n\t"
  120202. "lsr r6, r6, %[n]\n\t"
  120203. "orr r5, r5, r3\n\t"
  120204. "ldr r4, [%[a], #48]\n\t"
  120205. "str r5, [%[a], #40]\n\t"
  120206. "lsl r3, r4, r12\n\t"
  120207. "lsr r4, r4, %[n]\n\t"
  120208. "orr r6, r6, r3\n\t"
  120209. "ldr r5, [%[a], #52]\n\t"
  120210. "str r6, [%[a], #44]\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], #56]\n\t"
  120215. "str r4, [%[a], #48]\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], #60]\n\t"
  120220. "str r5, [%[a], #52]\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], #64]\n\t"
  120225. "str r6, [%[a], #56]\n\t"
  120226. "lsl r3, r5, r12\n\t"
  120227. "lsr r5, r5, %[n]\n\t"
  120228. "orr r4, r4, r3\n\t"
  120229. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  120230. "str r4, [%[r], #60]\n\t"
  120231. "str r5, [%[r], #64]\n\t"
  120232. #else
  120233. "strd r4, r5, [%[r], #60]\n\t"
  120234. #endif
  120235. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  120236. :
  120237. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  120238. );
  120239. }
  120240. #endif
  120241. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  120242. #endif
  120243. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  120244. static void sp_521_lshift_17(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  120245. {
  120246. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  120247. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  120248. register byte n asm ("r2") = (byte)n_p;
  120249. __asm__ __volatile__ (
  120250. "rsb r12, %[n], #31\n\t"
  120251. "ldr r5, [%[a], #64]\n\t"
  120252. "lsr r6, r5, #1\n\t"
  120253. "lsl r5, r5, %[n]\n\t"
  120254. "lsr r6, r6, r12\n\t"
  120255. "ldr r4, [%[a], #60]\n\t"
  120256. "str r6, [%[r], #68]\n\t"
  120257. "lsr r3, r4, #1\n\t"
  120258. "lsl r4, r4, %[n]\n\t"
  120259. "lsr r3, r3, r12\n\t"
  120260. "orr r5, r5, r3\n\t"
  120261. "ldr r6, [%[a], #56]\n\t"
  120262. "str r5, [%[r], #64]\n\t"
  120263. "lsr r3, r6, #1\n\t"
  120264. "lsl r6, r6, %[n]\n\t"
  120265. "lsr r3, r3, r12\n\t"
  120266. "orr r4, r4, r3\n\t"
  120267. "ldr r5, [%[a], #52]\n\t"
  120268. "str r4, [%[r], #60]\n\t"
  120269. "lsr r3, r5, #1\n\t"
  120270. "lsl r5, r5, %[n]\n\t"
  120271. "lsr r3, r3, r12\n\t"
  120272. "orr r6, r6, r3\n\t"
  120273. "ldr r4, [%[a], #48]\n\t"
  120274. "str r6, [%[r], #56]\n\t"
  120275. "lsr r3, r4, #1\n\t"
  120276. "lsl r4, r4, %[n]\n\t"
  120277. "lsr r3, r3, r12\n\t"
  120278. "orr r5, r5, r3\n\t"
  120279. "ldr r6, [%[a], #44]\n\t"
  120280. "str r5, [%[r], #52]\n\t"
  120281. "lsr r3, r6, #1\n\t"
  120282. "lsl r6, r6, %[n]\n\t"
  120283. "lsr r3, r3, r12\n\t"
  120284. "orr r4, r4, r3\n\t"
  120285. "ldr r5, [%[a], #40]\n\t"
  120286. "str r4, [%[r], #48]\n\t"
  120287. "lsr r3, r5, #1\n\t"
  120288. "lsl r5, r5, %[n]\n\t"
  120289. "lsr r3, r3, r12\n\t"
  120290. "orr r6, r6, r3\n\t"
  120291. "ldr r4, [%[a], #36]\n\t"
  120292. "str r6, [%[r], #44]\n\t"
  120293. "lsr r3, r4, #1\n\t"
  120294. "lsl r4, r4, %[n]\n\t"
  120295. "lsr r3, r3, r12\n\t"
  120296. "orr r5, r5, r3\n\t"
  120297. "ldr r6, [%[a], #32]\n\t"
  120298. "str r5, [%[r], #40]\n\t"
  120299. "lsr r3, r6, #1\n\t"
  120300. "lsl r6, r6, %[n]\n\t"
  120301. "lsr r3, r3, r12\n\t"
  120302. "orr r4, r4, r3\n\t"
  120303. "ldr r5, [%[a], #28]\n\t"
  120304. "str r4, [%[r], #36]\n\t"
  120305. "lsr r3, r5, #1\n\t"
  120306. "lsl r5, r5, %[n]\n\t"
  120307. "lsr r3, r3, r12\n\t"
  120308. "orr r6, r6, r3\n\t"
  120309. "ldr r4, [%[a], #24]\n\t"
  120310. "str r6, [%[r], #32]\n\t"
  120311. "lsr r3, r4, #1\n\t"
  120312. "lsl r4, r4, %[n]\n\t"
  120313. "lsr r3, r3, r12\n\t"
  120314. "orr r5, r5, r3\n\t"
  120315. "ldr r6, [%[a], #20]\n\t"
  120316. "str r5, [%[r], #28]\n\t"
  120317. "lsr r3, r6, #1\n\t"
  120318. "lsl r6, r6, %[n]\n\t"
  120319. "lsr r3, r3, r12\n\t"
  120320. "orr r4, r4, r3\n\t"
  120321. "ldr r5, [%[a], #16]\n\t"
  120322. "str r4, [%[r], #24]\n\t"
  120323. "lsr r3, r5, #1\n\t"
  120324. "lsl r5, r5, %[n]\n\t"
  120325. "lsr r3, r3, r12\n\t"
  120326. "orr r6, r6, r3\n\t"
  120327. "ldr r4, [%[a], #12]\n\t"
  120328. "str r6, [%[r], #20]\n\t"
  120329. "lsr r3, r4, #1\n\t"
  120330. "lsl r4, r4, %[n]\n\t"
  120331. "lsr r3, r3, r12\n\t"
  120332. "orr r5, r5, r3\n\t"
  120333. "ldr r6, [%[a], #8]\n\t"
  120334. "str r5, [%[r], #16]\n\t"
  120335. "lsr r3, r6, #1\n\t"
  120336. "lsl r6, r6, %[n]\n\t"
  120337. "lsr r3, r3, r12\n\t"
  120338. "orr r4, r4, r3\n\t"
  120339. "ldr r5, [%[a], #4]\n\t"
  120340. "str r4, [%[r], #12]\n\t"
  120341. "lsr r3, r5, #1\n\t"
  120342. "lsl r5, r5, %[n]\n\t"
  120343. "lsr r3, r3, r12\n\t"
  120344. "orr r6, r6, r3\n\t"
  120345. "ldr r4, [%[a]]\n\t"
  120346. "str r6, [%[r], #8]\n\t"
  120347. "lsr r3, r4, #1\n\t"
  120348. "lsl r4, r4, %[n]\n\t"
  120349. "lsr r3, r3, r12\n\t"
  120350. "orr r5, r5, r3\n\t"
  120351. "str r4, [%[r]]\n\t"
  120352. "str r5, [%[r], #4]\n\t"
  120353. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  120354. :
  120355. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  120356. );
  120357. }
  120358. static void sp_521_lshift_34(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  120359. {
  120360. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  120361. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  120362. register byte n asm ("r2") = (byte)n_p;
  120363. __asm__ __volatile__ (
  120364. "rsb r12, %[n], #31\n\t"
  120365. "ldr r5, [%[a], #132]\n\t"
  120366. "lsr r6, r5, #1\n\t"
  120367. "lsl r5, r5, %[n]\n\t"
  120368. "lsr r6, r6, r12\n\t"
  120369. "ldr r4, [%[a], #128]\n\t"
  120370. "str r6, [%[r], #136]\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], #124]\n\t"
  120376. "str r5, [%[r], #132]\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], #120]\n\t"
  120382. "str r4, [%[r], #128]\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], #116]\n\t"
  120388. "str r6, [%[r], #124]\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], #112]\n\t"
  120394. "str r5, [%[r], #120]\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], #108]\n\t"
  120400. "str r4, [%[r], #116]\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], #104]\n\t"
  120406. "str r6, [%[r], #112]\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. "ldr r6, [%[a], #100]\n\t"
  120412. "str r5, [%[r], #108]\n\t"
  120413. "lsr r3, r6, #1\n\t"
  120414. "lsl r6, r6, %[n]\n\t"
  120415. "lsr r3, r3, r12\n\t"
  120416. "orr r4, r4, r3\n\t"
  120417. "ldr r5, [%[a], #96]\n\t"
  120418. "str r4, [%[r], #104]\n\t"
  120419. "lsr r3, r5, #1\n\t"
  120420. "lsl r5, r5, %[n]\n\t"
  120421. "lsr r3, r3, r12\n\t"
  120422. "orr r6, r6, r3\n\t"
  120423. "ldr r4, [%[a], #92]\n\t"
  120424. "str r6, [%[r], #100]\n\t"
  120425. "lsr r3, r4, #1\n\t"
  120426. "lsl r4, r4, %[n]\n\t"
  120427. "lsr r3, r3, r12\n\t"
  120428. "orr r5, r5, r3\n\t"
  120429. "ldr r6, [%[a], #88]\n\t"
  120430. "str r5, [%[r], #96]\n\t"
  120431. "lsr r3, r6, #1\n\t"
  120432. "lsl r6, r6, %[n]\n\t"
  120433. "lsr r3, r3, r12\n\t"
  120434. "orr r4, r4, r3\n\t"
  120435. "ldr r5, [%[a], #84]\n\t"
  120436. "str r4, [%[r], #92]\n\t"
  120437. "lsr r3, r5, #1\n\t"
  120438. "lsl r5, r5, %[n]\n\t"
  120439. "lsr r3, r3, r12\n\t"
  120440. "orr r6, r6, r3\n\t"
  120441. "ldr r4, [%[a], #80]\n\t"
  120442. "str r6, [%[r], #88]\n\t"
  120443. "lsr r3, r4, #1\n\t"
  120444. "lsl r4, r4, %[n]\n\t"
  120445. "lsr r3, r3, r12\n\t"
  120446. "orr r5, r5, r3\n\t"
  120447. "ldr r6, [%[a], #76]\n\t"
  120448. "str r5, [%[r], #84]\n\t"
  120449. "lsr r3, r6, #1\n\t"
  120450. "lsl r6, r6, %[n]\n\t"
  120451. "lsr r3, r3, r12\n\t"
  120452. "orr r4, r4, r3\n\t"
  120453. "ldr r5, [%[a], #72]\n\t"
  120454. "str r4, [%[r], #80]\n\t"
  120455. "lsr r3, r5, #1\n\t"
  120456. "lsl r5, r5, %[n]\n\t"
  120457. "lsr r3, r3, r12\n\t"
  120458. "orr r6, r6, r3\n\t"
  120459. "ldr r4, [%[a], #68]\n\t"
  120460. "str r6, [%[r], #76]\n\t"
  120461. "lsr r3, r4, #1\n\t"
  120462. "lsl r4, r4, %[n]\n\t"
  120463. "lsr r3, r3, r12\n\t"
  120464. "orr r5, r5, r3\n\t"
  120465. "ldr r6, [%[a], #64]\n\t"
  120466. "str r5, [%[r], #72]\n\t"
  120467. "lsr r3, r6, #1\n\t"
  120468. "lsl r6, r6, %[n]\n\t"
  120469. "lsr r3, r3, r12\n\t"
  120470. "orr r4, r4, r3\n\t"
  120471. "ldr r5, [%[a], #60]\n\t"
  120472. "str r4, [%[r], #68]\n\t"
  120473. "lsr r3, r5, #1\n\t"
  120474. "lsl r5, r5, %[n]\n\t"
  120475. "lsr r3, r3, r12\n\t"
  120476. "orr r6, r6, r3\n\t"
  120477. "ldr r4, [%[a], #56]\n\t"
  120478. "str r6, [%[r], #64]\n\t"
  120479. "lsr r3, r4, #1\n\t"
  120480. "lsl r4, r4, %[n]\n\t"
  120481. "lsr r3, r3, r12\n\t"
  120482. "orr r5, r5, r3\n\t"
  120483. "ldr r6, [%[a], #52]\n\t"
  120484. "str r5, [%[r], #60]\n\t"
  120485. "lsr r3, r6, #1\n\t"
  120486. "lsl r6, r6, %[n]\n\t"
  120487. "lsr r3, r3, r12\n\t"
  120488. "orr r4, r4, r3\n\t"
  120489. "ldr r5, [%[a], #48]\n\t"
  120490. "str r4, [%[r], #56]\n\t"
  120491. "lsr r3, r5, #1\n\t"
  120492. "lsl r5, r5, %[n]\n\t"
  120493. "lsr r3, r3, r12\n\t"
  120494. "orr r6, r6, r3\n\t"
  120495. "ldr r4, [%[a], #44]\n\t"
  120496. "str r6, [%[r], #52]\n\t"
  120497. "lsr r3, r4, #1\n\t"
  120498. "lsl r4, r4, %[n]\n\t"
  120499. "lsr r3, r3, r12\n\t"
  120500. "orr r5, r5, r3\n\t"
  120501. "ldr r6, [%[a], #40]\n\t"
  120502. "str r5, [%[r], #48]\n\t"
  120503. "lsr r3, r6, #1\n\t"
  120504. "lsl r6, r6, %[n]\n\t"
  120505. "lsr r3, r3, r12\n\t"
  120506. "orr r4, r4, r3\n\t"
  120507. "ldr r5, [%[a], #36]\n\t"
  120508. "str r4, [%[r], #44]\n\t"
  120509. "lsr r3, r5, #1\n\t"
  120510. "lsl r5, r5, %[n]\n\t"
  120511. "lsr r3, r3, r12\n\t"
  120512. "orr r6, r6, r3\n\t"
  120513. "ldr r4, [%[a], #32]\n\t"
  120514. "str r6, [%[r], #40]\n\t"
  120515. "lsr r3, r4, #1\n\t"
  120516. "lsl r4, r4, %[n]\n\t"
  120517. "lsr r3, r3, r12\n\t"
  120518. "orr r5, r5, r3\n\t"
  120519. "ldr r6, [%[a], #28]\n\t"
  120520. "str r5, [%[r], #36]\n\t"
  120521. "lsr r3, r6, #1\n\t"
  120522. "lsl r6, r6, %[n]\n\t"
  120523. "lsr r3, r3, r12\n\t"
  120524. "orr r4, r4, r3\n\t"
  120525. "ldr r5, [%[a], #24]\n\t"
  120526. "str r4, [%[r], #32]\n\t"
  120527. "lsr r3, r5, #1\n\t"
  120528. "lsl r5, r5, %[n]\n\t"
  120529. "lsr r3, r3, r12\n\t"
  120530. "orr r6, r6, r3\n\t"
  120531. "ldr r4, [%[a], #20]\n\t"
  120532. "str r6, [%[r], #28]\n\t"
  120533. "lsr r3, r4, #1\n\t"
  120534. "lsl r4, r4, %[n]\n\t"
  120535. "lsr r3, r3, r12\n\t"
  120536. "orr r5, r5, r3\n\t"
  120537. "ldr r6, [%[a], #16]\n\t"
  120538. "str r5, [%[r], #24]\n\t"
  120539. "lsr r3, r6, #1\n\t"
  120540. "lsl r6, r6, %[n]\n\t"
  120541. "lsr r3, r3, r12\n\t"
  120542. "orr r4, r4, r3\n\t"
  120543. "ldr r5, [%[a], #12]\n\t"
  120544. "str r4, [%[r], #20]\n\t"
  120545. "lsr r3, r5, #1\n\t"
  120546. "lsl r5, r5, %[n]\n\t"
  120547. "lsr r3, r3, r12\n\t"
  120548. "orr r6, r6, r3\n\t"
  120549. "ldr r4, [%[a], #8]\n\t"
  120550. "str r6, [%[r], #16]\n\t"
  120551. "lsr r3, r4, #1\n\t"
  120552. "lsl r4, r4, %[n]\n\t"
  120553. "lsr r3, r3, r12\n\t"
  120554. "orr r5, r5, r3\n\t"
  120555. "ldr r6, [%[a], #4]\n\t"
  120556. "str r5, [%[r], #12]\n\t"
  120557. "lsr r3, r6, #1\n\t"
  120558. "lsl r6, r6, %[n]\n\t"
  120559. "lsr r3, r3, r12\n\t"
  120560. "orr r4, r4, r3\n\t"
  120561. "ldr r5, [%[a]]\n\t"
  120562. "str r4, [%[r], #8]\n\t"
  120563. "lsr r3, r5, #1\n\t"
  120564. "lsl r5, r5, %[n]\n\t"
  120565. "lsr r3, r3, r12\n\t"
  120566. "orr r6, r6, r3\n\t"
  120567. "str r5, [%[r]]\n\t"
  120568. "str r6, [%[r], #4]\n\t"
  120569. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  120570. :
  120571. : "memory", "r4", "r5", "r6", "r3", "r12", "cc"
  120572. );
  120573. }
  120574. #ifdef WOLFSSL_SP_SMALL
  120575. /* Sub b from a into a. (a -= b)
  120576. *
  120577. * a A single precision integer.
  120578. * b A single precision integer.
  120579. */
  120580. static sp_digit sp_521_sub_in_place_17(sp_digit* a_p, const sp_digit* b_p)
  120581. {
  120582. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  120583. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  120584. __asm__ __volatile__ (
  120585. "mov r12, #0\n\t"
  120586. "add lr, %[a], #0x40\n\t"
  120587. "\n"
  120588. "L_sp_521_sub_in_pkace_17_word_%=: \n\t"
  120589. "rsbs r12, r12, #0\n\t"
  120590. "ldm %[a], {r2, r3, r4, r5}\n\t"
  120591. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  120592. "sbcs r2, r2, r6\n\t"
  120593. "sbcs r3, r3, r7\n\t"
  120594. "sbcs r4, r4, r8\n\t"
  120595. "sbcs r5, r5, r9\n\t"
  120596. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  120597. "sbc r12, r12, r12\n\t"
  120598. "cmp %[a], lr\n\t"
  120599. "bne L_sp_521_sub_in_pkace_17_word_%=\n\t"
  120600. "rsbs r12, r12, #0\n\t"
  120601. "ldm %[a], {r2}\n\t"
  120602. "ldm %[b]!, {r6}\n\t"
  120603. "sbcs r2, r2, r6\n\t"
  120604. "stm %[a]!, {r2}\n\t"
  120605. "sbc %[a], %[a], %[a]\n\t"
  120606. : [a] "+r" (a), [b] "+r" (b)
  120607. :
  120608. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  120609. );
  120610. return (uint32_t)(size_t)a;
  120611. }
  120612. #else
  120613. /* Sub b from a into a. (a -= b)
  120614. *
  120615. * a A single precision integer and result.
  120616. * b A single precision integer.
  120617. */
  120618. static sp_digit sp_521_sub_in_place_17(sp_digit* a_p, const sp_digit* b_p)
  120619. {
  120620. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  120621. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  120622. __asm__ __volatile__ (
  120623. "ldm %[a], {r2, r3, r4, r5}\n\t"
  120624. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  120625. "subs r2, r2, r6\n\t"
  120626. "sbcs r3, r3, r7\n\t"
  120627. "sbcs r4, r4, r8\n\t"
  120628. "sbcs r5, r5, r9\n\t"
  120629. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  120630. "ldm %[a], {r2, r3, r4, r5}\n\t"
  120631. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  120632. "sbcs r2, r2, r6\n\t"
  120633. "sbcs r3, r3, r7\n\t"
  120634. "sbcs r4, r4, r8\n\t"
  120635. "sbcs r5, r5, r9\n\t"
  120636. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  120637. "ldm %[a], {r2, r3, r4, r5}\n\t"
  120638. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  120639. "sbcs r2, r2, r6\n\t"
  120640. "sbcs r3, r3, r7\n\t"
  120641. "sbcs r4, r4, r8\n\t"
  120642. "sbcs r5, r5, r9\n\t"
  120643. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  120644. "ldm %[a], {r2, r3, r4, r5}\n\t"
  120645. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  120646. "sbcs r2, r2, r6\n\t"
  120647. "sbcs r3, r3, r7\n\t"
  120648. "sbcs r4, r4, r8\n\t"
  120649. "sbcs r5, r5, r9\n\t"
  120650. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  120651. "ldm %[a], {r2}\n\t"
  120652. "ldm %[b]!, {r6}\n\t"
  120653. "sbcs r2, r2, r6\n\t"
  120654. "stm %[a]!, {r2}\n\t"
  120655. "sbc %[a], r9, r9\n\t"
  120656. : [a] "+r" (a), [b] "+r" (b)
  120657. :
  120658. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  120659. );
  120660. return (uint32_t)(size_t)a;
  120661. }
  120662. #endif /* WOLFSSL_SP_SMALL */
  120663. #ifdef WOLFSSL_SP_SMALL
  120664. /* Mul a by digit b into r. (r = a * b)
  120665. *
  120666. * r A single precision integer.
  120667. * a A single precision integer.
  120668. * b A single precision digit.
  120669. */
  120670. static void sp_521_mul_d_17(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  120671. {
  120672. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  120673. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  120674. register sp_digit b asm ("r2") = (sp_digit)b_p;
  120675. __asm__ __volatile__ (
  120676. /* A[0] * B */
  120677. "ldr r8, [%[a]]\n\t"
  120678. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120679. "lsl r6, %[b], #16\n\t"
  120680. "lsl r5, r8, #16\n\t"
  120681. "lsr r6, r6, #16\n\t"
  120682. "lsr r5, r5, #16\n\t"
  120683. "mul r5, r6, r5\n\t"
  120684. "lsr r7, r8, #16\n\t"
  120685. "mul r6, r7, r6\n\t"
  120686. "lsr r3, r6, #16\n\t"
  120687. "lsl r6, r6, #16\n\t"
  120688. "adds r5, r5, r6\n\t"
  120689. "adc r3, r3, #0\n\t"
  120690. "lsr r6, %[b], #16\n\t"
  120691. "mul r7, r6, r7\n\t"
  120692. "add r3, r3, r7\n\t"
  120693. "lsl r7, r8, #16\n\t"
  120694. "lsr r7, r7, #16\n\t"
  120695. "mul r6, r7, r6\n\t"
  120696. "lsr r7, r6, #16\n\t"
  120697. "lsl r6, r6, #16\n\t"
  120698. "adds r5, r5, r6\n\t"
  120699. "adc r3, r3, r7\n\t"
  120700. #else
  120701. "umull r5, r3, %[b], r8\n\t"
  120702. #endif
  120703. "mov r4, #0\n\t"
  120704. "str r5, [%[r]]\n\t"
  120705. "mov r5, #0\n\t"
  120706. "mov r9, #4\n\t"
  120707. "\n"
  120708. "L_sp_521_mul_d_17_word_%=: \n\t"
  120709. /* A[i] * B */
  120710. "ldr r8, [%[a], r9]\n\t"
  120711. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120712. "lsl r6, %[b], #16\n\t"
  120713. "lsl r7, r8, #16\n\t"
  120714. "lsr r6, r6, #16\n\t"
  120715. "lsr r7, r7, #16\n\t"
  120716. "mul r7, r6, r7\n\t"
  120717. "adds r3, r3, r7\n\t"
  120718. "adcs r4, r4, #0\n\t"
  120719. "adc r5, r5, #0\n\t"
  120720. "lsr r7, r8, #16\n\t"
  120721. "mul r6, r7, r6\n\t"
  120722. "lsr r7, r6, #16\n\t"
  120723. "lsl r6, r6, #16\n\t"
  120724. "adds r3, r3, r6\n\t"
  120725. "adcs r4, r4, r7\n\t"
  120726. "adc r5, r5, #0\n\t"
  120727. "lsr r6, %[b], #16\n\t"
  120728. "lsr r7, r8, #16\n\t"
  120729. "mul r7, r6, r7\n\t"
  120730. "adds r4, r4, r7\n\t"
  120731. "adc r5, r5, #0\n\t"
  120732. "lsl r7, r8, #16\n\t"
  120733. "lsr r7, r7, #16\n\t"
  120734. "mul r6, r7, r6\n\t"
  120735. "lsr r7, r6, #16\n\t"
  120736. "lsl r6, r6, #16\n\t"
  120737. "adds r3, r3, r6\n\t"
  120738. "adcs r4, r4, r7\n\t"
  120739. "adc r5, r5, #0\n\t"
  120740. #else
  120741. "umull r6, r7, %[b], r8\n\t"
  120742. "adds r3, r3, r6\n\t"
  120743. "adcs r4, r4, r7\n\t"
  120744. "adc r5, r5, #0\n\t"
  120745. #endif
  120746. "str r3, [%[r], r9]\n\t"
  120747. "mov r3, r4\n\t"
  120748. "mov r4, r5\n\t"
  120749. "mov r5, #0\n\t"
  120750. "add r9, r9, #4\n\t"
  120751. "cmp r9, #0x44\n\t"
  120752. "blt L_sp_521_mul_d_17_word_%=\n\t"
  120753. "str r3, [%[r], #68]\n\t"
  120754. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  120755. :
  120756. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  120757. );
  120758. }
  120759. #else
  120760. /* Mul a by digit b into r. (r = a * b)
  120761. *
  120762. * r A single precision integer.
  120763. * a A single precision integer.
  120764. * b A single precision digit.
  120765. */
  120766. static void sp_521_mul_d_17(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  120767. {
  120768. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  120769. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  120770. register sp_digit b asm ("r2") = (sp_digit)b_p;
  120771. __asm__ __volatile__ (
  120772. /* A[0] * B */
  120773. "ldm %[a]!, {r8}\n\t"
  120774. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120775. "lsl r6, %[b], #16\n\t"
  120776. "lsl r3, r8, #16\n\t"
  120777. "lsr r6, r6, #16\n\t"
  120778. "lsr r3, r3, #16\n\t"
  120779. "mul r3, r6, r3\n\t"
  120780. "lsr r7, r8, #16\n\t"
  120781. "mul r6, r7, r6\n\t"
  120782. "lsr r4, r6, #16\n\t"
  120783. "lsl r6, r6, #16\n\t"
  120784. "adds r3, r3, r6\n\t"
  120785. "adc r4, r4, #0\n\t"
  120786. "lsr r6, %[b], #16\n\t"
  120787. "mul r7, r6, r7\n\t"
  120788. "add r4, r4, r7\n\t"
  120789. "lsl r7, r8, #16\n\t"
  120790. "lsr r7, r7, #16\n\t"
  120791. "mul r6, r7, r6\n\t"
  120792. "lsr r7, r6, #16\n\t"
  120793. "lsl r6, r6, #16\n\t"
  120794. "adds r3, r3, r6\n\t"
  120795. "adc r4, r4, r7\n\t"
  120796. #else
  120797. "umull r3, r4, %[b], r8\n\t"
  120798. #endif
  120799. "stm %[r]!, {r3}\n\t"
  120800. "mov r5, #0\n\t"
  120801. /* A[1] * B */
  120802. "ldm %[a]!, {r8}\n\t"
  120803. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120804. "lsl r6, %[b], #16\n\t"
  120805. "lsl r7, r8, #16\n\t"
  120806. "lsr r6, r6, #16\n\t"
  120807. "lsr r7, r7, #16\n\t"
  120808. "mul r7, r6, r7\n\t"
  120809. "adds r4, r4, r7\n\t"
  120810. "adc r5, r5, #0\n\t"
  120811. "lsr r7, r8, #16\n\t"
  120812. "mul r6, r7, r6\n\t"
  120813. "lsr r7, r6, #16\n\t"
  120814. "lsl r6, r6, #16\n\t"
  120815. "adds r4, r4, r6\n\t"
  120816. "adc r5, r5, r7\n\t"
  120817. "lsr r6, %[b], #16\n\t"
  120818. "lsr r7, r8, #16\n\t"
  120819. "mul r7, r6, r7\n\t"
  120820. "add r5, r5, r7\n\t"
  120821. "lsl r7, r8, #16\n\t"
  120822. "lsr r7, r7, #16\n\t"
  120823. "mul r6, r7, r6\n\t"
  120824. "lsr r7, r6, #16\n\t"
  120825. "lsl r6, r6, #16\n\t"
  120826. "adds r4, r4, r6\n\t"
  120827. "adc r5, r5, r7\n\t"
  120828. #else
  120829. "umlal r4, r5, %[b], r8\n\t"
  120830. #endif
  120831. "stm %[r]!, {r4}\n\t"
  120832. "mov r3, #0\n\t"
  120833. /* A[2] * B */
  120834. "ldm %[a]!, {r8}\n\t"
  120835. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120836. "lsl r6, %[b], #16\n\t"
  120837. "lsl r7, r8, #16\n\t"
  120838. "lsr r6, r6, #16\n\t"
  120839. "lsr r7, r7, #16\n\t"
  120840. "mul r7, r6, r7\n\t"
  120841. "adds r5, r5, r7\n\t"
  120842. "adc r3, r3, #0\n\t"
  120843. "lsr r7, r8, #16\n\t"
  120844. "mul r6, r7, r6\n\t"
  120845. "lsr r7, r6, #16\n\t"
  120846. "lsl r6, r6, #16\n\t"
  120847. "adds r5, r5, r6\n\t"
  120848. "adc r3, r3, r7\n\t"
  120849. "lsr r6, %[b], #16\n\t"
  120850. "lsr r7, r8, #16\n\t"
  120851. "mul r7, r6, r7\n\t"
  120852. "add r3, r3, r7\n\t"
  120853. "lsl r7, r8, #16\n\t"
  120854. "lsr r7, r7, #16\n\t"
  120855. "mul r6, r7, r6\n\t"
  120856. "lsr r7, r6, #16\n\t"
  120857. "lsl r6, r6, #16\n\t"
  120858. "adds r5, r5, r6\n\t"
  120859. "adc r3, r3, r7\n\t"
  120860. #else
  120861. "umlal r5, r3, %[b], r8\n\t"
  120862. #endif
  120863. "stm %[r]!, {r5}\n\t"
  120864. "mov r4, #0\n\t"
  120865. /* A[3] * B */
  120866. "ldm %[a]!, {r8}\n\t"
  120867. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120868. "lsl r6, %[b], #16\n\t"
  120869. "lsl r7, r8, #16\n\t"
  120870. "lsr r6, r6, #16\n\t"
  120871. "lsr r7, r7, #16\n\t"
  120872. "mul r7, r6, r7\n\t"
  120873. "adds r3, r3, r7\n\t"
  120874. "adc r4, r4, #0\n\t"
  120875. "lsr r7, r8, #16\n\t"
  120876. "mul r6, r7, r6\n\t"
  120877. "lsr r7, r6, #16\n\t"
  120878. "lsl r6, r6, #16\n\t"
  120879. "adds r3, r3, r6\n\t"
  120880. "adc r4, r4, r7\n\t"
  120881. "lsr r6, %[b], #16\n\t"
  120882. "lsr r7, r8, #16\n\t"
  120883. "mul r7, r6, r7\n\t"
  120884. "add r4, r4, r7\n\t"
  120885. "lsl r7, r8, #16\n\t"
  120886. "lsr r7, r7, #16\n\t"
  120887. "mul r6, r7, r6\n\t"
  120888. "lsr r7, r6, #16\n\t"
  120889. "lsl r6, r6, #16\n\t"
  120890. "adds r3, r3, r6\n\t"
  120891. "adc r4, r4, r7\n\t"
  120892. #else
  120893. "umlal r3, r4, %[b], r8\n\t"
  120894. #endif
  120895. "stm %[r]!, {r3}\n\t"
  120896. "mov r5, #0\n\t"
  120897. /* A[4] * B */
  120898. "ldm %[a]!, {r8}\n\t"
  120899. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120900. "lsl r6, %[b], #16\n\t"
  120901. "lsl r7, r8, #16\n\t"
  120902. "lsr r6, r6, #16\n\t"
  120903. "lsr r7, r7, #16\n\t"
  120904. "mul r7, r6, r7\n\t"
  120905. "adds r4, r4, r7\n\t"
  120906. "adc r5, r5, #0\n\t"
  120907. "lsr r7, r8, #16\n\t"
  120908. "mul r6, r7, r6\n\t"
  120909. "lsr r7, r6, #16\n\t"
  120910. "lsl r6, r6, #16\n\t"
  120911. "adds r4, r4, r6\n\t"
  120912. "adc r5, r5, r7\n\t"
  120913. "lsr r6, %[b], #16\n\t"
  120914. "lsr r7, r8, #16\n\t"
  120915. "mul r7, r6, r7\n\t"
  120916. "add r5, r5, r7\n\t"
  120917. "lsl r7, r8, #16\n\t"
  120918. "lsr r7, r7, #16\n\t"
  120919. "mul r6, r7, r6\n\t"
  120920. "lsr r7, r6, #16\n\t"
  120921. "lsl r6, r6, #16\n\t"
  120922. "adds r4, r4, r6\n\t"
  120923. "adc r5, r5, r7\n\t"
  120924. #else
  120925. "umlal r4, r5, %[b], r8\n\t"
  120926. #endif
  120927. "stm %[r]!, {r4}\n\t"
  120928. "mov r3, #0\n\t"
  120929. /* A[5] * B */
  120930. "ldm %[a]!, {r8}\n\t"
  120931. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120932. "lsl r6, %[b], #16\n\t"
  120933. "lsl r7, r8, #16\n\t"
  120934. "lsr r6, r6, #16\n\t"
  120935. "lsr r7, r7, #16\n\t"
  120936. "mul r7, r6, r7\n\t"
  120937. "adds r5, r5, r7\n\t"
  120938. "adc r3, r3, #0\n\t"
  120939. "lsr r7, r8, #16\n\t"
  120940. "mul r6, r7, r6\n\t"
  120941. "lsr r7, r6, #16\n\t"
  120942. "lsl r6, r6, #16\n\t"
  120943. "adds r5, r5, r6\n\t"
  120944. "adc r3, r3, r7\n\t"
  120945. "lsr r6, %[b], #16\n\t"
  120946. "lsr r7, r8, #16\n\t"
  120947. "mul r7, r6, r7\n\t"
  120948. "add r3, r3, r7\n\t"
  120949. "lsl r7, r8, #16\n\t"
  120950. "lsr r7, r7, #16\n\t"
  120951. "mul r6, r7, r6\n\t"
  120952. "lsr r7, r6, #16\n\t"
  120953. "lsl r6, r6, #16\n\t"
  120954. "adds r5, r5, r6\n\t"
  120955. "adc r3, r3, r7\n\t"
  120956. #else
  120957. "umlal r5, r3, %[b], r8\n\t"
  120958. #endif
  120959. "stm %[r]!, {r5}\n\t"
  120960. "mov r4, #0\n\t"
  120961. /* A[6] * B */
  120962. "ldm %[a]!, {r8}\n\t"
  120963. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120964. "lsl r6, %[b], #16\n\t"
  120965. "lsl r7, r8, #16\n\t"
  120966. "lsr r6, r6, #16\n\t"
  120967. "lsr r7, r7, #16\n\t"
  120968. "mul r7, r6, r7\n\t"
  120969. "adds r3, r3, r7\n\t"
  120970. "adc r4, r4, #0\n\t"
  120971. "lsr r7, r8, #16\n\t"
  120972. "mul r6, r7, r6\n\t"
  120973. "lsr r7, r6, #16\n\t"
  120974. "lsl r6, r6, #16\n\t"
  120975. "adds r3, r3, r6\n\t"
  120976. "adc r4, r4, r7\n\t"
  120977. "lsr r6, %[b], #16\n\t"
  120978. "lsr r7, r8, #16\n\t"
  120979. "mul r7, r6, r7\n\t"
  120980. "add r4, r4, r7\n\t"
  120981. "lsl r7, r8, #16\n\t"
  120982. "lsr r7, r7, #16\n\t"
  120983. "mul r6, r7, r6\n\t"
  120984. "lsr r7, r6, #16\n\t"
  120985. "lsl r6, r6, #16\n\t"
  120986. "adds r3, r3, r6\n\t"
  120987. "adc r4, r4, r7\n\t"
  120988. #else
  120989. "umlal r3, r4, %[b], r8\n\t"
  120990. #endif
  120991. "stm %[r]!, {r3}\n\t"
  120992. "mov r5, #0\n\t"
  120993. /* A[7] * B */
  120994. "ldm %[a]!, {r8}\n\t"
  120995. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  120996. "lsl r6, %[b], #16\n\t"
  120997. "lsl r7, r8, #16\n\t"
  120998. "lsr r6, r6, #16\n\t"
  120999. "lsr r7, r7, #16\n\t"
  121000. "mul r7, r6, r7\n\t"
  121001. "adds r4, r4, r7\n\t"
  121002. "adc r5, r5, #0\n\t"
  121003. "lsr r7, r8, #16\n\t"
  121004. "mul r6, r7, r6\n\t"
  121005. "lsr r7, r6, #16\n\t"
  121006. "lsl r6, r6, #16\n\t"
  121007. "adds r4, r4, r6\n\t"
  121008. "adc r5, r5, r7\n\t"
  121009. "lsr r6, %[b], #16\n\t"
  121010. "lsr r7, r8, #16\n\t"
  121011. "mul r7, r6, r7\n\t"
  121012. "add r5, r5, r7\n\t"
  121013. "lsl r7, r8, #16\n\t"
  121014. "lsr r7, r7, #16\n\t"
  121015. "mul r6, r7, r6\n\t"
  121016. "lsr r7, r6, #16\n\t"
  121017. "lsl r6, r6, #16\n\t"
  121018. "adds r4, r4, r6\n\t"
  121019. "adc r5, r5, r7\n\t"
  121020. #else
  121021. "umlal r4, r5, %[b], r8\n\t"
  121022. #endif
  121023. "stm %[r]!, {r4}\n\t"
  121024. "mov r3, #0\n\t"
  121025. /* A[8] * B */
  121026. "ldm %[a]!, {r8}\n\t"
  121027. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121028. "lsl r6, %[b], #16\n\t"
  121029. "lsl r7, r8, #16\n\t"
  121030. "lsr r6, r6, #16\n\t"
  121031. "lsr r7, r7, #16\n\t"
  121032. "mul r7, r6, r7\n\t"
  121033. "adds r5, r5, r7\n\t"
  121034. "adc r3, r3, #0\n\t"
  121035. "lsr r7, r8, #16\n\t"
  121036. "mul r6, r7, r6\n\t"
  121037. "lsr r7, r6, #16\n\t"
  121038. "lsl r6, r6, #16\n\t"
  121039. "adds r5, r5, r6\n\t"
  121040. "adc r3, r3, r7\n\t"
  121041. "lsr r6, %[b], #16\n\t"
  121042. "lsr r7, r8, #16\n\t"
  121043. "mul r7, r6, r7\n\t"
  121044. "add r3, r3, r7\n\t"
  121045. "lsl r7, r8, #16\n\t"
  121046. "lsr r7, r7, #16\n\t"
  121047. "mul r6, r7, r6\n\t"
  121048. "lsr r7, r6, #16\n\t"
  121049. "lsl r6, r6, #16\n\t"
  121050. "adds r5, r5, r6\n\t"
  121051. "adc r3, r3, r7\n\t"
  121052. #else
  121053. "umlal r5, r3, %[b], r8\n\t"
  121054. #endif
  121055. "stm %[r]!, {r5}\n\t"
  121056. "mov r4, #0\n\t"
  121057. /* A[9] * B */
  121058. "ldm %[a]!, {r8}\n\t"
  121059. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121060. "lsl r6, %[b], #16\n\t"
  121061. "lsl r7, r8, #16\n\t"
  121062. "lsr r6, r6, #16\n\t"
  121063. "lsr r7, r7, #16\n\t"
  121064. "mul r7, r6, r7\n\t"
  121065. "adds r3, r3, r7\n\t"
  121066. "adc r4, r4, #0\n\t"
  121067. "lsr r7, r8, #16\n\t"
  121068. "mul r6, r7, r6\n\t"
  121069. "lsr r7, r6, #16\n\t"
  121070. "lsl r6, r6, #16\n\t"
  121071. "adds r3, r3, r6\n\t"
  121072. "adc r4, r4, r7\n\t"
  121073. "lsr r6, %[b], #16\n\t"
  121074. "lsr r7, r8, #16\n\t"
  121075. "mul r7, r6, r7\n\t"
  121076. "add r4, r4, r7\n\t"
  121077. "lsl r7, r8, #16\n\t"
  121078. "lsr r7, r7, #16\n\t"
  121079. "mul r6, r7, r6\n\t"
  121080. "lsr r7, r6, #16\n\t"
  121081. "lsl r6, r6, #16\n\t"
  121082. "adds r3, r3, r6\n\t"
  121083. "adc r4, r4, r7\n\t"
  121084. #else
  121085. "umlal r3, r4, %[b], r8\n\t"
  121086. #endif
  121087. "stm %[r]!, {r3}\n\t"
  121088. "mov r5, #0\n\t"
  121089. /* A[10] * B */
  121090. "ldm %[a]!, {r8}\n\t"
  121091. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121092. "lsl r6, %[b], #16\n\t"
  121093. "lsl r7, r8, #16\n\t"
  121094. "lsr r6, r6, #16\n\t"
  121095. "lsr r7, r7, #16\n\t"
  121096. "mul r7, r6, r7\n\t"
  121097. "adds r4, r4, r7\n\t"
  121098. "adc r5, r5, #0\n\t"
  121099. "lsr r7, r8, #16\n\t"
  121100. "mul r6, r7, r6\n\t"
  121101. "lsr r7, r6, #16\n\t"
  121102. "lsl r6, r6, #16\n\t"
  121103. "adds r4, r4, r6\n\t"
  121104. "adc r5, r5, r7\n\t"
  121105. "lsr r6, %[b], #16\n\t"
  121106. "lsr r7, r8, #16\n\t"
  121107. "mul r7, r6, r7\n\t"
  121108. "add r5, r5, r7\n\t"
  121109. "lsl r7, r8, #16\n\t"
  121110. "lsr r7, r7, #16\n\t"
  121111. "mul r6, r7, r6\n\t"
  121112. "lsr r7, r6, #16\n\t"
  121113. "lsl r6, r6, #16\n\t"
  121114. "adds r4, r4, r6\n\t"
  121115. "adc r5, r5, r7\n\t"
  121116. #else
  121117. "umlal r4, r5, %[b], r8\n\t"
  121118. #endif
  121119. "stm %[r]!, {r4}\n\t"
  121120. "mov r3, #0\n\t"
  121121. /* A[11] * B */
  121122. "ldm %[a]!, {r8}\n\t"
  121123. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121124. "lsl r6, %[b], #16\n\t"
  121125. "lsl r7, r8, #16\n\t"
  121126. "lsr r6, r6, #16\n\t"
  121127. "lsr r7, r7, #16\n\t"
  121128. "mul r7, r6, r7\n\t"
  121129. "adds r5, r5, r7\n\t"
  121130. "adc r3, r3, #0\n\t"
  121131. "lsr r7, r8, #16\n\t"
  121132. "mul r6, r7, r6\n\t"
  121133. "lsr r7, r6, #16\n\t"
  121134. "lsl r6, r6, #16\n\t"
  121135. "adds r5, r5, r6\n\t"
  121136. "adc r3, r3, r7\n\t"
  121137. "lsr r6, %[b], #16\n\t"
  121138. "lsr r7, r8, #16\n\t"
  121139. "mul r7, r6, r7\n\t"
  121140. "add r3, r3, r7\n\t"
  121141. "lsl r7, r8, #16\n\t"
  121142. "lsr r7, r7, #16\n\t"
  121143. "mul r6, r7, r6\n\t"
  121144. "lsr r7, r6, #16\n\t"
  121145. "lsl r6, r6, #16\n\t"
  121146. "adds r5, r5, r6\n\t"
  121147. "adc r3, r3, r7\n\t"
  121148. #else
  121149. "umlal r5, r3, %[b], r8\n\t"
  121150. #endif
  121151. "stm %[r]!, {r5}\n\t"
  121152. "mov r4, #0\n\t"
  121153. /* A[12] * B */
  121154. "ldm %[a]!, {r8}\n\t"
  121155. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121156. "lsl r6, %[b], #16\n\t"
  121157. "lsl r7, r8, #16\n\t"
  121158. "lsr r6, r6, #16\n\t"
  121159. "lsr r7, r7, #16\n\t"
  121160. "mul r7, r6, r7\n\t"
  121161. "adds r3, r3, r7\n\t"
  121162. "adc r4, r4, #0\n\t"
  121163. "lsr r7, r8, #16\n\t"
  121164. "mul r6, r7, r6\n\t"
  121165. "lsr r7, r6, #16\n\t"
  121166. "lsl r6, r6, #16\n\t"
  121167. "adds r3, r3, r6\n\t"
  121168. "adc r4, r4, r7\n\t"
  121169. "lsr r6, %[b], #16\n\t"
  121170. "lsr r7, r8, #16\n\t"
  121171. "mul r7, r6, r7\n\t"
  121172. "add r4, r4, r7\n\t"
  121173. "lsl r7, r8, #16\n\t"
  121174. "lsr r7, r7, #16\n\t"
  121175. "mul r6, r7, r6\n\t"
  121176. "lsr r7, r6, #16\n\t"
  121177. "lsl r6, r6, #16\n\t"
  121178. "adds r3, r3, r6\n\t"
  121179. "adc r4, r4, r7\n\t"
  121180. #else
  121181. "umlal r3, r4, %[b], r8\n\t"
  121182. #endif
  121183. "stm %[r]!, {r3}\n\t"
  121184. "mov r5, #0\n\t"
  121185. /* A[13] * B */
  121186. "ldm %[a]!, {r8}\n\t"
  121187. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121188. "lsl r6, %[b], #16\n\t"
  121189. "lsl r7, r8, #16\n\t"
  121190. "lsr r6, r6, #16\n\t"
  121191. "lsr r7, r7, #16\n\t"
  121192. "mul r7, r6, r7\n\t"
  121193. "adds r4, r4, r7\n\t"
  121194. "adc r5, r5, #0\n\t"
  121195. "lsr r7, r8, #16\n\t"
  121196. "mul r6, r7, r6\n\t"
  121197. "lsr r7, r6, #16\n\t"
  121198. "lsl r6, r6, #16\n\t"
  121199. "adds r4, r4, r6\n\t"
  121200. "adc r5, r5, r7\n\t"
  121201. "lsr r6, %[b], #16\n\t"
  121202. "lsr r7, r8, #16\n\t"
  121203. "mul r7, r6, r7\n\t"
  121204. "add r5, r5, r7\n\t"
  121205. "lsl r7, r8, #16\n\t"
  121206. "lsr r7, r7, #16\n\t"
  121207. "mul r6, r7, r6\n\t"
  121208. "lsr r7, r6, #16\n\t"
  121209. "lsl r6, r6, #16\n\t"
  121210. "adds r4, r4, r6\n\t"
  121211. "adc r5, r5, r7\n\t"
  121212. #else
  121213. "umlal r4, r5, %[b], r8\n\t"
  121214. #endif
  121215. "stm %[r]!, {r4}\n\t"
  121216. "mov r3, #0\n\t"
  121217. /* A[14] * B */
  121218. "ldm %[a]!, {r8}\n\t"
  121219. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121220. "lsl r6, %[b], #16\n\t"
  121221. "lsl r7, r8, #16\n\t"
  121222. "lsr r6, r6, #16\n\t"
  121223. "lsr r7, r7, #16\n\t"
  121224. "mul r7, r6, r7\n\t"
  121225. "adds r5, r5, r7\n\t"
  121226. "adc r3, r3, #0\n\t"
  121227. "lsr r7, r8, #16\n\t"
  121228. "mul r6, r7, r6\n\t"
  121229. "lsr r7, r6, #16\n\t"
  121230. "lsl r6, r6, #16\n\t"
  121231. "adds r5, r5, r6\n\t"
  121232. "adc r3, r3, r7\n\t"
  121233. "lsr r6, %[b], #16\n\t"
  121234. "lsr r7, r8, #16\n\t"
  121235. "mul r7, r6, r7\n\t"
  121236. "add r3, r3, r7\n\t"
  121237. "lsl r7, r8, #16\n\t"
  121238. "lsr r7, r7, #16\n\t"
  121239. "mul r6, r7, r6\n\t"
  121240. "lsr r7, r6, #16\n\t"
  121241. "lsl r6, r6, #16\n\t"
  121242. "adds r5, r5, r6\n\t"
  121243. "adc r3, r3, r7\n\t"
  121244. #else
  121245. "umlal r5, r3, %[b], r8\n\t"
  121246. #endif
  121247. "stm %[r]!, {r5}\n\t"
  121248. "mov r4, #0\n\t"
  121249. /* A[15] * B */
  121250. "ldm %[a]!, {r8}\n\t"
  121251. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121252. "lsl r6, %[b], #16\n\t"
  121253. "lsl r7, r8, #16\n\t"
  121254. "lsr r6, r6, #16\n\t"
  121255. "lsr r7, r7, #16\n\t"
  121256. "mul r7, r6, r7\n\t"
  121257. "adds r3, r3, r7\n\t"
  121258. "adc r4, r4, #0\n\t"
  121259. "lsr r7, r8, #16\n\t"
  121260. "mul r6, r7, r6\n\t"
  121261. "lsr r7, r6, #16\n\t"
  121262. "lsl r6, r6, #16\n\t"
  121263. "adds r3, r3, r6\n\t"
  121264. "adc r4, r4, r7\n\t"
  121265. "lsr r6, %[b], #16\n\t"
  121266. "lsr r7, r8, #16\n\t"
  121267. "mul r7, r6, r7\n\t"
  121268. "add r4, r4, r7\n\t"
  121269. "lsl r7, r8, #16\n\t"
  121270. "lsr r7, r7, #16\n\t"
  121271. "mul r6, r7, r6\n\t"
  121272. "lsr r7, r6, #16\n\t"
  121273. "lsl r6, r6, #16\n\t"
  121274. "adds r3, r3, r6\n\t"
  121275. "adc r4, r4, r7\n\t"
  121276. #else
  121277. "umlal r3, r4, %[b], r8\n\t"
  121278. #endif
  121279. "stm %[r]!, {r3}\n\t"
  121280. "mov r5, #0\n\t"
  121281. /* A[16] * B */
  121282. "ldm %[a]!, {r8}\n\t"
  121283. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121284. "lsl r6, %[b], #16\n\t"
  121285. "lsl r7, r8, #16\n\t"
  121286. "lsr r6, r6, #16\n\t"
  121287. "lsr r7, r7, #16\n\t"
  121288. "mul r7, r6, r7\n\t"
  121289. "adds r4, r4, r7\n\t"
  121290. "adc r5, r5, #0\n\t"
  121291. "lsr r7, r8, #16\n\t"
  121292. "mul r6, r7, r6\n\t"
  121293. "lsr r7, r6, #16\n\t"
  121294. "lsl r6, r6, #16\n\t"
  121295. "adds r4, r4, r6\n\t"
  121296. "adc r5, r5, r7\n\t"
  121297. "lsr r6, %[b], #16\n\t"
  121298. "lsr r7, r8, #16\n\t"
  121299. "mul r7, r6, r7\n\t"
  121300. "add r5, r5, r7\n\t"
  121301. "lsl r7, r8, #16\n\t"
  121302. "lsr r7, r7, #16\n\t"
  121303. "mul r6, r7, r6\n\t"
  121304. "lsr r7, r6, #16\n\t"
  121305. "lsl r6, r6, #16\n\t"
  121306. "adds r4, r4, r6\n\t"
  121307. "adc r5, r5, r7\n\t"
  121308. #else
  121309. "umlal r4, r5, %[b], r8\n\t"
  121310. #endif
  121311. "stm %[r]!, {r4}\n\t"
  121312. "str r5, [%[r]]\n\t"
  121313. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  121314. :
  121315. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  121316. );
  121317. }
  121318. #endif /* WOLFSSL_SP_SMALL */
  121319. #ifdef WOLFSSL_SP_USE_UDIV
  121320. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  121321. *
  121322. * d1 The high order half of the number to divide.
  121323. * d0 The low order half of the number to divide.
  121324. * div The divisor.
  121325. * returns the result of the division.
  121326. *
  121327. * Note that this is an approximate div. It may give an answer 1 larger.
  121328. */
  121329. static sp_digit div_521_word_17(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  121330. {
  121331. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  121332. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  121333. register sp_digit div asm ("r2") = (sp_digit)div_p;
  121334. __asm__ __volatile__ (
  121335. "lsr r6, %[div], #16\n\t"
  121336. "add lr, r6, #1\n\t"
  121337. "udiv r4, %[d1], lr\n\t"
  121338. "lsl r5, %[div], #16\n\t"
  121339. "lsl r4, r4, #16\n\t"
  121340. "umull r3, r12, %[div], r4\n\t"
  121341. "subs %[d0], %[d0], r3\n\t"
  121342. "sbc %[d1], %[d1], r12\n\t"
  121343. "subs r3, %[d1], lr\n\t"
  121344. "sbc r7, r7, r7\n\t"
  121345. "add r7, r7, #1\n\t"
  121346. "rsb r8, r7, #0\n\t"
  121347. "lsl r7, r7, #16\n\t"
  121348. "and r5, r5, r8\n\t"
  121349. "and r6, r6, r8\n\t"
  121350. "subs %[d0], %[d0], r5\n\t"
  121351. "add r4, r4, r7\n\t"
  121352. "sbc %[d1], %[d1], r6\n\t"
  121353. "lsl r12, %[d1], #16\n\t"
  121354. "lsr r3, %[d0], #16\n\t"
  121355. "orr r3, r3, r12\n\t"
  121356. "udiv r3, r3, lr\n\t"
  121357. "add r4, r4, r3\n\t"
  121358. "umull r3, r12, %[div], r3\n\t"
  121359. "subs %[d0], %[d0], r3\n\t"
  121360. "sbc %[d1], %[d1], r12\n\t"
  121361. "lsl r12, %[d1], #16\n\t"
  121362. "lsr r3, %[d0], #16\n\t"
  121363. "orr r3, r3, r12\n\t"
  121364. "udiv r3, r3, lr\n\t"
  121365. "add r4, r4, r3\n\t"
  121366. "mul r3, %[div], r3\n\t"
  121367. "sub %[d0], %[d0], r3\n\t"
  121368. "udiv r3, %[d0], %[div]\n\t"
  121369. "add %[d1], r4, r3\n\t"
  121370. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  121371. :
  121372. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  121373. );
  121374. return (uint32_t)(size_t)d1;
  121375. }
  121376. #else
  121377. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  121378. *
  121379. * d1 The high order half of the number to divide.
  121380. * d0 The low order half of the number to divide.
  121381. * div The divisor.
  121382. * returns the result of the division.
  121383. *
  121384. * Note that this is an approximate div. It may give an answer 1 larger.
  121385. */
  121386. static sp_digit div_521_word_17(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  121387. {
  121388. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  121389. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  121390. register sp_digit div asm ("r2") = (sp_digit)div_p;
  121391. __asm__ __volatile__ (
  121392. "lsr lr, %[div], #1\n\t"
  121393. "add lr, lr, #1\n\t"
  121394. "mov r4, %[d0]\n\t"
  121395. "mov r5, %[d1]\n\t"
  121396. /* Do top 32 */
  121397. "subs r6, lr, r5\n\t"
  121398. "sbc r6, r6, r6\n\t"
  121399. "mov r3, #0\n\t"
  121400. "sub r3, r3, r6\n\t"
  121401. "and r6, r6, lr\n\t"
  121402. "subs r5, r5, r6\n\t"
  121403. /* Next 30 bits */
  121404. "mov r12, #29\n\t"
  121405. "\n"
  121406. "L_div_521_word_17_bit_%=: \n\t"
  121407. "lsls r4, r4, #1\n\t"
  121408. "adc r5, r5, r5\n\t"
  121409. "subs r6, lr, r5\n\t"
  121410. "sbc r6, r6, r6\n\t"
  121411. "add r3, r3, r3\n\t"
  121412. "sub r3, r3, r6\n\t"
  121413. "and r6, r6, lr\n\t"
  121414. "subs r5, r5, r6\n\t"
  121415. "subs r12, r12, #1\n\t"
  121416. "bpl L_div_521_word_17_bit_%=\n\t"
  121417. "add r3, r3, r3\n\t"
  121418. "add r3, r3, #1\n\t"
  121419. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121420. "lsl r7, r3, #16\n\t"
  121421. "lsl r4, %[div], #16\n\t"
  121422. "lsr r7, r7, #16\n\t"
  121423. "lsr r4, r4, #16\n\t"
  121424. "mul r4, r7, r4\n\t"
  121425. "lsr r8, %[div], #16\n\t"
  121426. "mul r7, r8, r7\n\t"
  121427. "lsr r5, r7, #16\n\t"
  121428. "lsl r7, r7, #16\n\t"
  121429. "adds r4, r4, r7\n\t"
  121430. "adc r5, r5, #0\n\t"
  121431. "lsr r7, r3, #16\n\t"
  121432. "mul r8, r7, r8\n\t"
  121433. "add r5, r5, r8\n\t"
  121434. "lsl r8, %[div], #16\n\t"
  121435. "lsr r8, r8, #16\n\t"
  121436. "mul r7, r8, r7\n\t"
  121437. "lsr r8, r7, #16\n\t"
  121438. "lsl r7, r7, #16\n\t"
  121439. "adds r4, r4, r7\n\t"
  121440. "adc r5, r5, r8\n\t"
  121441. #else
  121442. "umull r4, r5, r3, %[div]\n\t"
  121443. #endif
  121444. "subs r7, %[d0], r4\n\t"
  121445. "sbc r8, %[d1], r5\n\t"
  121446. "add r3, r3, r8\n\t"
  121447. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121448. "lsl r7, r3, #16\n\t"
  121449. "lsl r4, %[div], #16\n\t"
  121450. "lsr r7, r7, #16\n\t"
  121451. "lsr r4, r4, #16\n\t"
  121452. "mul r4, r7, r4\n\t"
  121453. "lsr r8, %[div], #16\n\t"
  121454. "mul r7, r8, r7\n\t"
  121455. "lsr r5, r7, #16\n\t"
  121456. "lsl r7, r7, #16\n\t"
  121457. "adds r4, r4, r7\n\t"
  121458. "adc r5, r5, #0\n\t"
  121459. "lsr r7, r3, #16\n\t"
  121460. "mul r8, r7, r8\n\t"
  121461. "add r5, r5, r8\n\t"
  121462. "lsl r8, %[div], #16\n\t"
  121463. "lsr r8, r8, #16\n\t"
  121464. "mul r7, r8, r7\n\t"
  121465. "lsr r8, r7, #16\n\t"
  121466. "lsl r7, r7, #16\n\t"
  121467. "adds r4, r4, r7\n\t"
  121468. "adc r5, r5, r8\n\t"
  121469. #else
  121470. "umull r4, r5, r3, %[div]\n\t"
  121471. #endif
  121472. "subs r7, %[d0], r4\n\t"
  121473. "sbc r8, %[d1], r5\n\t"
  121474. "add r3, r3, r8\n\t"
  121475. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  121476. "lsl r7, r3, #16\n\t"
  121477. "lsl r4, %[div], #16\n\t"
  121478. "lsr r7, r7, #16\n\t"
  121479. "lsr r4, r4, #16\n\t"
  121480. "mul r4, r7, r4\n\t"
  121481. "lsr r8, %[div], #16\n\t"
  121482. "mul r7, r8, r7\n\t"
  121483. "lsr r5, r7, #16\n\t"
  121484. "lsl r7, r7, #16\n\t"
  121485. "adds r4, r4, r7\n\t"
  121486. "adc r5, r5, #0\n\t"
  121487. "lsr r7, r3, #16\n\t"
  121488. "mul r8, r7, r8\n\t"
  121489. "add r5, r5, r8\n\t"
  121490. "lsl r8, %[div], #16\n\t"
  121491. "lsr r8, r8, #16\n\t"
  121492. "mul r7, r8, r7\n\t"
  121493. "lsr r8, r7, #16\n\t"
  121494. "lsl r7, r7, #16\n\t"
  121495. "adds r4, r4, r7\n\t"
  121496. "adc r5, r5, r8\n\t"
  121497. #else
  121498. "umull r4, r5, r3, %[div]\n\t"
  121499. #endif
  121500. "subs r7, %[d0], r4\n\t"
  121501. "sbc r8, %[d1], r5\n\t"
  121502. "add r3, r3, r8\n\t"
  121503. "subs r6, %[div], r7\n\t"
  121504. "sbc r6, r6, r6\n\t"
  121505. "sub %[d1], r3, r6\n\t"
  121506. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  121507. :
  121508. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  121509. );
  121510. return (uint32_t)(size_t)d1;
  121511. }
  121512. #endif
  121513. /* AND m into each word of a and store in r.
  121514. *
  121515. * r A single precision integer.
  121516. * a A single precision integer.
  121517. * m Mask to AND against each digit.
  121518. */
  121519. static void sp_521_mask_17(sp_digit* r, const sp_digit* a, sp_digit m)
  121520. {
  121521. #ifdef WOLFSSL_SP_SMALL
  121522. int i;
  121523. for (i=0; i<17; i++) {
  121524. r[i] = a[i] & m;
  121525. }
  121526. #else
  121527. int i;
  121528. for (i = 0; i < 16; i += 8) {
  121529. r[i+0] = a[i+0] & m;
  121530. r[i+1] = a[i+1] & m;
  121531. r[i+2] = a[i+2] & m;
  121532. r[i+3] = a[i+3] & m;
  121533. r[i+4] = a[i+4] & m;
  121534. r[i+5] = a[i+5] & m;
  121535. r[i+6] = a[i+6] & m;
  121536. r[i+7] = a[i+7] & m;
  121537. }
  121538. r[16] = a[16] & m;
  121539. #endif
  121540. }
  121541. /* Divide d in a and put remainder into r (m*d + r = a)
  121542. * m is not calculated as it is not needed at this time.
  121543. *
  121544. * a Number to be divided.
  121545. * d Number to divide with.
  121546. * m Multiplier result.
  121547. * r Remainder from the division.
  121548. * returns MP_OKAY indicating success.
  121549. */
  121550. static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d,
  121551. sp_digit* m, sp_digit* r)
  121552. {
  121553. sp_digit t1[35];
  121554. sp_digit t2[18];
  121555. sp_digit sd[18];
  121556. sp_digit div;
  121557. sp_digit r1;
  121558. int i;
  121559. ASSERT_SAVED_VECTOR_REGISTERS();
  121560. (void)m;
  121561. div = (d[16] << 23) | (d[15] >> 9);
  121562. XMEMCPY(t1, a, sizeof(*t1) * 2 * 17);
  121563. r1 = sp_521_cmp_17(&t1[17], d) >= 0;
  121564. sp_521_cond_sub_17(&t1[17], &t1[17], d, (sp_digit)0 - r1);
  121565. sp_521_lshift_17(sd, d, 23);
  121566. sp_521_lshift_34(t1, t1, 23);
  121567. for (i = 16; i >= 0; i--) {
  121568. sp_digit hi = t1[17 + i] - (t1[17 + i] == div);
  121569. r1 = div_521_word_17(hi, t1[17 + i - 1], div);
  121570. sp_521_mul_d_17(t2, sd, r1);
  121571. t1[17 + i] += sp_521_sub_in_place_17(&t1[i], t2);
  121572. t1[17 + i] -= t2[17];
  121573. sp_521_mask_17(t2, sd, t1[17 + i]);
  121574. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  121575. sp_521_mask_17(t2, sd, t1[17 + i]);
  121576. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  121577. }
  121578. r1 = sp_521_cmp_17(t1, sd) >= 0;
  121579. sp_521_cond_sub_17(r, t1, sd, (sp_digit)0 - r1);
  121580. sp_521_rshift_17(r, r, 23);
  121581. return MP_OKAY;
  121582. }
  121583. /* Reduce a modulo m into r. (r = a mod m)
  121584. *
  121585. * r A single precision number that is the reduced result.
  121586. * a A single precision number that is to be reduced.
  121587. * m A single precision number that is the modulus to reduce with.
  121588. * returns MP_OKAY indicating success.
  121589. */
  121590. static WC_INLINE int sp_521_mod_17(sp_digit* r, const sp_digit* a,
  121591. const sp_digit* m)
  121592. {
  121593. return sp_521_div_17(a, m, NULL, r);
  121594. }
  121595. #endif
  121596. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  121597. /* Multiply two number mod the order of P521 curve. (r = a * b mod order)
  121598. *
  121599. * r Result of the multiplication.
  121600. * a First operand of the multiplication.
  121601. * b Second operand of the multiplication.
  121602. */
  121603. static void sp_521_mont_mul_order_17(sp_digit* r, const sp_digit* a, const sp_digit* b)
  121604. {
  121605. sp_521_mul_17(r, a, b);
  121606. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  121607. }
  121608. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  121609. #ifdef WOLFSSL_SP_SMALL
  121610. /* Order-2 for the P521 curve. */
  121611. static const uint32_t p521_order_minus_2[17] = {
  121612. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  121613. 0xbf2f966bU,0x51868783U,0xfffffffaU,0xffffffffU,0xffffffffU,0xffffffffU,
  121614. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  121615. };
  121616. #else
  121617. /* The low half of the order-2 of the P521 curve. */
  121618. static const uint32_t p521_order_low[9] = {
  121619. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  121620. 0xbf2f966bU,0x51868783U,0xfffffffaU
  121621. };
  121622. #endif /* WOLFSSL_SP_SMALL */
  121623. /* Square number mod the order of P521 curve. (r = a * a mod order)
  121624. *
  121625. * r Result of the squaring.
  121626. * a Number to square.
  121627. */
  121628. static void sp_521_mont_sqr_order_17(sp_digit* r, const sp_digit* a)
  121629. {
  121630. sp_521_sqr_17(r, a);
  121631. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  121632. }
  121633. #ifndef WOLFSSL_SP_SMALL
  121634. /* Square number mod the order of P521 curve a number of times.
  121635. * (r = a ^ n mod order)
  121636. *
  121637. * r Result of the squaring.
  121638. * a Number to square.
  121639. */
  121640. static void sp_521_mont_sqr_n_order_17(sp_digit* r, const sp_digit* a, int n)
  121641. {
  121642. int i;
  121643. sp_521_mont_sqr_order_17(r, a);
  121644. for (i=1; i<n; i++) {
  121645. sp_521_mont_sqr_order_17(r, r);
  121646. }
  121647. }
  121648. #endif /* !WOLFSSL_SP_SMALL */
  121649. /* Invert the number, in Montgomery form, modulo the order of the P521 curve.
  121650. * (r = 1 / a mod order)
  121651. *
  121652. * r Inverse result.
  121653. * a Number to invert.
  121654. * td Temporary data.
  121655. */
  121656. #ifdef WOLFSSL_SP_NONBLOCK
  121657. typedef struct sp_521_mont_inv_order_17_ctx {
  121658. int state;
  121659. int i;
  121660. } sp_521_mont_inv_order_17_ctx;
  121661. static int sp_521_mont_inv_order_17_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  121662. sp_digit* t)
  121663. {
  121664. int err = FP_WOULDBLOCK;
  121665. sp_521_mont_inv_order_17_ctx* ctx = (sp_521_mont_inv_order_17_ctx*)sp_ctx;
  121666. typedef char ctx_size_test[sizeof(sp_521_mont_inv_order_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  121667. (void)sizeof(ctx_size_test);
  121668. switch (ctx->state) {
  121669. case 0:
  121670. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  121671. ctx->i = 519;
  121672. ctx->state = 1;
  121673. break;
  121674. case 1:
  121675. sp_521_mont_sqr_order_17(t, t);
  121676. ctx->state = 2;
  121677. break;
  121678. case 2:
  121679. if ((p521_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  121680. sp_521_mont_mul_order_17(t, t, a);
  121681. }
  121682. ctx->i--;
  121683. ctx->state = (ctx->i == 0) ? 3 : 1;
  121684. break;
  121685. case 3:
  121686. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  121687. err = MP_OKAY;
  121688. break;
  121689. }
  121690. return err;
  121691. }
  121692. #endif /* WOLFSSL_SP_NONBLOCK */
  121693. static void sp_521_mont_inv_order_17(sp_digit* r, const sp_digit* a,
  121694. sp_digit* td)
  121695. {
  121696. #ifdef WOLFSSL_SP_SMALL
  121697. sp_digit* t = td;
  121698. int i;
  121699. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  121700. for (i=519; i>=0; i--) {
  121701. sp_521_mont_sqr_order_17(t, t);
  121702. if ((p521_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  121703. sp_521_mont_mul_order_17(t, t, a);
  121704. }
  121705. }
  121706. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  121707. #else
  121708. sp_digit* t = td;
  121709. sp_digit* t2 = td + 2 * 17;
  121710. sp_digit* t3 = td + 4 * 17;
  121711. int i;
  121712. /* t = a^2 */
  121713. sp_521_mont_sqr_order_17(t, a);
  121714. /* t = a^3 = t * a */
  121715. sp_521_mont_mul_order_17(t, t, a);
  121716. /* t= a^c = t ^ 2 ^ 2 */
  121717. sp_521_mont_sqr_n_order_17(t2, t, 2);
  121718. /* t = a^f = t2 * t */
  121719. sp_521_mont_mul_order_17(t, t2, t);
  121720. /* t3 = a^1e */
  121721. sp_521_mont_sqr_order_17(t3, t);
  121722. /* t3 = a^1f = t3 * a */
  121723. sp_521_mont_mul_order_17(t3, t3, a);
  121724. /* t2= a^f0 = t ^ 2 ^ 4 */
  121725. sp_521_mont_sqr_n_order_17(t2, t, 4);
  121726. /* t = a^ff = t2 * t */
  121727. sp_521_mont_mul_order_17(t, t2, t);
  121728. /* t2= a^ff00 = t ^ 2 ^ 8 */
  121729. sp_521_mont_sqr_n_order_17(t2, t, 8);
  121730. /* t3= a^ffff = t2 * t */
  121731. sp_521_mont_mul_order_17(t, t2, t);
  121732. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  121733. sp_521_mont_sqr_n_order_17(t2, t, 16);
  121734. /* t = a^ffffffff = t2 * t */
  121735. sp_521_mont_mul_order_17(t, t2, t);
  121736. /* t2= a^ffffffff00000000 = t ^ 2 ^ 32 */
  121737. sp_521_mont_sqr_n_order_17(t2, t, 32);
  121738. /* t = a^ffffffffffffffff = t2 * t */
  121739. sp_521_mont_mul_order_17(t, t2, t);
  121740. /* t2= a^ffffffffffffffff0000000000000000 = t ^ 2 ^ 64 */
  121741. sp_521_mont_sqr_n_order_17(t2, t, 64);
  121742. /* t = a^ffffffffffffffffffffffffffffffff = t2 * t */
  121743. sp_521_mont_mul_order_17(t, t2, t);
  121744. /* t2= a^ffffffffffffffffffffffffffffffff00000000000000000000000000000000 = t ^ 2 ^ 128 */
  121745. sp_521_mont_sqr_n_order_17(t2, t, 128);
  121746. /* t = a^ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  121747. sp_521_mont_mul_order_17(t, t2, t);
  121748. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0 */
  121749. sp_521_mont_sqr_n_order_17(t2, t, 5);
  121750. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t * t3 */
  121751. sp_521_mont_mul_order_17(t2, t2, t3);
  121752. for (i=259; i>=1; i--) {
  121753. sp_521_mont_sqr_order_17(t2, t2);
  121754. if ((p521_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  121755. sp_521_mont_mul_order_17(t2, t2, a);
  121756. }
  121757. }
  121758. sp_521_mont_sqr_order_17(t2, t2);
  121759. sp_521_mont_mul_order_17(r, t2, a);
  121760. #endif /* WOLFSSL_SP_SMALL */
  121761. }
  121762. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  121763. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  121764. #ifdef HAVE_ECC_SIGN
  121765. #ifndef SP_ECC_MAX_SIG_GEN
  121766. #define SP_ECC_MAX_SIG_GEN 64
  121767. #endif
  121768. /* Calculate second signature value S from R, k and private value.
  121769. *
  121770. * s = (r * x + e) / k
  121771. *
  121772. * s Signature value.
  121773. * r First signature value.
  121774. * k Ephemeral private key.
  121775. * x Private key as a number.
  121776. * e Hash of message as a number.
  121777. * tmp Temporary storage for intermediate numbers.
  121778. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  121779. */
  121780. static int sp_521_calc_s_17(sp_digit* s, const sp_digit* r, sp_digit* k,
  121781. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  121782. {
  121783. int err;
  121784. sp_digit carry;
  121785. sp_int32 c;
  121786. sp_digit* kInv = k;
  121787. /* Conv k to Montgomery form (mod order) */
  121788. sp_521_mul_17(k, k, p521_norm_order);
  121789. err = sp_521_mod_17(k, k, p521_order);
  121790. if (err == MP_OKAY) {
  121791. sp_521_norm_17(k);
  121792. /* kInv = 1/k mod order */
  121793. sp_521_mont_inv_order_17(kInv, k, tmp);
  121794. sp_521_norm_17(kInv);
  121795. /* s = r * x + e */
  121796. sp_521_mul_17(x, x, r);
  121797. err = sp_521_mod_17(x, x, p521_order);
  121798. }
  121799. if (err == MP_OKAY) {
  121800. sp_521_norm_17(x);
  121801. carry = sp_521_add_17(s, e, x);
  121802. sp_521_cond_sub_17(s, s, p521_order, 0 - carry);
  121803. sp_521_norm_17(s);
  121804. c = sp_521_cmp_17(s, p521_order);
  121805. sp_521_cond_sub_17(s, s, p521_order,
  121806. (sp_digit)0 - (sp_digit)(c >= 0));
  121807. sp_521_norm_17(s);
  121808. /* s = s * k^-1 mod order */
  121809. sp_521_mont_mul_order_17(s, s, kInv);
  121810. sp_521_norm_17(s);
  121811. }
  121812. return err;
  121813. }
  121814. /* Sign the hash using the private key.
  121815. * e = [hash, 521 bits] from binary
  121816. * r = (k.G)->x mod order
  121817. * s = (r * x + e) / k mod order
  121818. * The hash is truncated to the first 521 bits.
  121819. *
  121820. * hash Hash to sign.
  121821. * hashLen Length of the hash data.
  121822. * rng Random number generator.
  121823. * priv Private part of key - scalar.
  121824. * rm First part of result as an mp_int.
  121825. * sm Sirst part of result as an mp_int.
  121826. * heap Heap to use for allocation.
  121827. * returns RNG failures, MEMORY_E when memory allocation fails and
  121828. * MP_OKAY on success.
  121829. */
  121830. int sp_ecc_sign_521(const byte* hash, word32 hashLen, WC_RNG* rng,
  121831. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  121832. {
  121833. #ifdef WOLFSSL_SP_SMALL_STACK
  121834. sp_digit* e = NULL;
  121835. sp_point_521* point = NULL;
  121836. #else
  121837. sp_digit e[7 * 2 * 17];
  121838. sp_point_521 point[1];
  121839. #endif
  121840. sp_digit* x = NULL;
  121841. sp_digit* k = NULL;
  121842. sp_digit* r = NULL;
  121843. sp_digit* tmp = NULL;
  121844. sp_digit* s = NULL;
  121845. sp_int32 c;
  121846. int err = MP_OKAY;
  121847. int i;
  121848. (void)heap;
  121849. #ifdef WOLFSSL_SP_SMALL_STACK
  121850. if (err == MP_OKAY) {
  121851. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  121852. DYNAMIC_TYPE_ECC);
  121853. if (point == NULL)
  121854. err = MEMORY_E;
  121855. }
  121856. if (err == MP_OKAY) {
  121857. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 17, heap,
  121858. DYNAMIC_TYPE_ECC);
  121859. if (e == NULL)
  121860. err = MEMORY_E;
  121861. }
  121862. #endif
  121863. if (err == MP_OKAY) {
  121864. x = e + 2 * 17;
  121865. k = e + 4 * 17;
  121866. r = e + 6 * 17;
  121867. tmp = e + 8 * 17;
  121868. s = e;
  121869. if (hashLen > 66U) {
  121870. hashLen = 66U;
  121871. }
  121872. }
  121873. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  121874. /* New random point. */
  121875. if (km == NULL || mp_iszero(km)) {
  121876. err = sp_521_ecc_gen_k_17(rng, k);
  121877. }
  121878. else {
  121879. sp_521_from_mp(k, 17, km);
  121880. mp_zero(km);
  121881. }
  121882. if (err == MP_OKAY) {
  121883. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, heap);
  121884. }
  121885. if (err == MP_OKAY) {
  121886. /* r = point->x mod order */
  121887. XMEMCPY(r, point->x, sizeof(sp_digit) * 17U);
  121888. sp_521_norm_17(r);
  121889. c = sp_521_cmp_17(r, p521_order);
  121890. sp_521_cond_sub_17(r, r, p521_order,
  121891. (sp_digit)0 - (sp_digit)(c >= 0));
  121892. sp_521_norm_17(r);
  121893. if (!sp_521_iszero_17(r)) {
  121894. /* x is modified in calculation of s. */
  121895. sp_521_from_mp(x, 17, priv);
  121896. /* s ptr == e ptr, e is modified in calculation of s. */
  121897. sp_521_from_bin(e, 17, hash, (int)hashLen);
  121898. /* Take 521 leftmost bits of hash. */
  121899. if (hashLen == 66U) {
  121900. sp_521_rshift_17(e, e, 7);
  121901. }
  121902. err = sp_521_calc_s_17(s, r, k, x, e, tmp);
  121903. /* Check that signature is usable. */
  121904. if ((err == MP_OKAY) && (!sp_521_iszero_17(s))) {
  121905. break;
  121906. }
  121907. }
  121908. }
  121909. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  121910. i = 1;
  121911. #endif
  121912. }
  121913. if (i == 0) {
  121914. err = RNG_FAILURE_E;
  121915. }
  121916. if (err == MP_OKAY) {
  121917. err = sp_521_to_mp(r, rm);
  121918. }
  121919. if (err == MP_OKAY) {
  121920. err = sp_521_to_mp(s, sm);
  121921. }
  121922. #ifdef WOLFSSL_SP_SMALL_STACK
  121923. if (e != NULL)
  121924. #endif
  121925. {
  121926. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 17);
  121927. #ifdef WOLFSSL_SP_SMALL_STACK
  121928. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  121929. #endif
  121930. }
  121931. #ifdef WOLFSSL_SP_SMALL_STACK
  121932. if (point != NULL)
  121933. #endif
  121934. {
  121935. ForceZero(point, sizeof(sp_point_521));
  121936. #ifdef WOLFSSL_SP_SMALL_STACK
  121937. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  121938. #endif
  121939. }
  121940. return err;
  121941. }
  121942. #ifdef WOLFSSL_SP_NONBLOCK
  121943. typedef struct sp_ecc_sign_521_ctx {
  121944. int state;
  121945. union {
  121946. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  121947. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  121948. };
  121949. sp_digit e[2*17];
  121950. sp_digit x[2*17];
  121951. sp_digit k[2*17];
  121952. sp_digit r[2*17];
  121953. sp_digit tmp[3 * 2*17];
  121954. sp_point_521 point;
  121955. sp_digit* s;
  121956. sp_digit* kInv;
  121957. int i;
  121958. } sp_ecc_sign_521_ctx;
  121959. int sp_ecc_sign_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  121960. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  121961. {
  121962. int err = FP_WOULDBLOCK;
  121963. sp_ecc_sign_521_ctx* ctx = (sp_ecc_sign_521_ctx*)sp_ctx->data;
  121964. typedef char ctx_size_test[sizeof(sp_ecc_sign_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  121965. (void)sizeof(ctx_size_test);
  121966. switch (ctx->state) {
  121967. case 0: /* INIT */
  121968. ctx->s = ctx->e;
  121969. ctx->kInv = ctx->k;
  121970. ctx->i = SP_ECC_MAX_SIG_GEN;
  121971. ctx->state = 1;
  121972. break;
  121973. case 1: /* GEN */
  121974. /* New random point. */
  121975. if (km == NULL || mp_iszero(km)) {
  121976. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  121977. }
  121978. else {
  121979. sp_521_from_mp(ctx->k, 17, km);
  121980. mp_zero(km);
  121981. }
  121982. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  121983. ctx->state = 2;
  121984. break;
  121985. case 2: /* MULMOD */
  121986. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  121987. &ctx->point, &p521_base, ctx->k, 1, 1, heap);
  121988. if (err == MP_OKAY) {
  121989. ctx->state = 3;
  121990. }
  121991. break;
  121992. case 3: /* MODORDER */
  121993. {
  121994. sp_int32 c;
  121995. /* r = point->x mod order */
  121996. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 17U);
  121997. sp_521_norm_17(ctx->r);
  121998. c = sp_521_cmp_17(ctx->r, p521_order);
  121999. sp_521_cond_sub_17(ctx->r, ctx->r, p521_order,
  122000. (sp_digit)0 - (sp_digit)(c >= 0));
  122001. sp_521_norm_17(ctx->r);
  122002. if (hashLen > 66U) {
  122003. hashLen = 66U;
  122004. }
  122005. sp_521_from_mp(ctx->x, 17, priv);
  122006. sp_521_from_bin(ctx->e, 17, hash, (int)hashLen);
  122007. if (hashLen == 66U) {
  122008. sp_521_rshift_17(ctx->e, ctx->e, 7);
  122009. }
  122010. ctx->state = 4;
  122011. break;
  122012. }
  122013. case 4: /* KMODORDER */
  122014. /* Conv k to Montgomery form (mod order) */
  122015. sp_521_mul_17(ctx->k, ctx->k, p521_norm_order);
  122016. err = sp_521_mod_17(ctx->k, ctx->k, p521_order);
  122017. if (err == MP_OKAY) {
  122018. sp_521_norm_17(ctx->k);
  122019. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  122020. ctx->state = 5;
  122021. }
  122022. break;
  122023. case 5: /* KINV */
  122024. /* kInv = 1/k mod order */
  122025. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  122026. if (err == MP_OKAY) {
  122027. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  122028. ctx->state = 6;
  122029. }
  122030. break;
  122031. case 6: /* KINVNORM */
  122032. sp_521_norm_17(ctx->kInv);
  122033. ctx->state = 7;
  122034. break;
  122035. case 7: /* R */
  122036. /* s = r * x + e */
  122037. sp_521_mul_17(ctx->x, ctx->x, ctx->r);
  122038. ctx->state = 8;
  122039. break;
  122040. case 8: /* S1 */
  122041. err = sp_521_mod_17(ctx->x, ctx->x, p521_order);
  122042. if (err == MP_OKAY)
  122043. ctx->state = 9;
  122044. break;
  122045. case 9: /* S2 */
  122046. {
  122047. sp_digit carry;
  122048. sp_int32 c;
  122049. sp_521_norm_17(ctx->x);
  122050. carry = sp_521_add_17(ctx->s, ctx->e, ctx->x);
  122051. sp_521_cond_sub_17(ctx->s, ctx->s,
  122052. p521_order, 0 - carry);
  122053. sp_521_norm_17(ctx->s);
  122054. c = sp_521_cmp_17(ctx->s, p521_order);
  122055. sp_521_cond_sub_17(ctx->s, ctx->s, p521_order,
  122056. (sp_digit)0 - (sp_digit)(c >= 0));
  122057. sp_521_norm_17(ctx->s);
  122058. /* s = s * k^-1 mod order */
  122059. sp_521_mont_mul_order_17(ctx->s, ctx->s, ctx->kInv);
  122060. sp_521_norm_17(ctx->s);
  122061. /* Check that signature is usable. */
  122062. if (sp_521_iszero_17(ctx->s) == 0) {
  122063. ctx->state = 10;
  122064. break;
  122065. }
  122066. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  122067. ctx->i = 1;
  122068. #endif
  122069. /* not usable gen, try again */
  122070. ctx->i--;
  122071. if (ctx->i == 0) {
  122072. err = RNG_FAILURE_E;
  122073. }
  122074. ctx->state = 1;
  122075. break;
  122076. }
  122077. case 10: /* RES */
  122078. err = sp_521_to_mp(ctx->r, rm);
  122079. if (err == MP_OKAY) {
  122080. err = sp_521_to_mp(ctx->s, sm);
  122081. }
  122082. break;
  122083. }
  122084. if (err == MP_OKAY && ctx->state != 10) {
  122085. err = FP_WOULDBLOCK;
  122086. }
  122087. if (err != FP_WOULDBLOCK) {
  122088. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 17U);
  122089. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 17U);
  122090. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 17U);
  122091. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 17U);
  122092. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 17U);
  122093. }
  122094. return err;
  122095. }
  122096. #endif /* WOLFSSL_SP_NONBLOCK */
  122097. #endif /* HAVE_ECC_SIGN */
  122098. #ifndef WOLFSSL_SP_SMALL
  122099. #ifdef WOLFSSL_SP_SMALL
  122100. /* Sub b from a into r. (r = a - b)
  122101. *
  122102. * r A single precision integer.
  122103. * a A single precision integer.
  122104. * b A single precision integer.
  122105. */
  122106. static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  122107. {
  122108. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  122109. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  122110. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  122111. __asm__ __volatile__ (
  122112. "mov r12, #0\n\t"
  122113. "add lr, %[a], #0x40\n\t"
  122114. "\n"
  122115. "L_sp_521_sub_17_word_%=: \n\t"
  122116. "rsbs r12, r12, #0\n\t"
  122117. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122118. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  122119. "sbcs r3, r3, r7\n\t"
  122120. "sbcs r4, r4, r8\n\t"
  122121. "sbcs r5, r5, r9\n\t"
  122122. "sbcs r6, r6, r10\n\t"
  122123. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122124. "sbc r12, r3, r3\n\t"
  122125. "cmp %[a], lr\n\t"
  122126. "bne L_sp_521_sub_17_word_%=\n\t"
  122127. "rsbs r12, r12, #0\n\t"
  122128. "ldm %[a]!, {r3}\n\t"
  122129. "ldm %[b]!, {r7}\n\t"
  122130. "sbcs r3, r3, r7\n\t"
  122131. "stm %[r]!, {r3}\n\t"
  122132. "sbc %[r], r6, r6\n\t"
  122133. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  122134. :
  122135. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc"
  122136. );
  122137. return (uint32_t)(size_t)r;
  122138. }
  122139. #else
  122140. /* Sub b from a into r. (r = a - b)
  122141. *
  122142. * r A single precision integer.
  122143. * a A single precision integer.
  122144. * b A single precision integer.
  122145. */
  122146. static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  122147. {
  122148. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  122149. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  122150. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  122151. __asm__ __volatile__ (
  122152. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122153. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  122154. "subs r3, r3, r7\n\t"
  122155. "sbcs r4, r4, r8\n\t"
  122156. "sbcs r5, r5, r9\n\t"
  122157. "sbcs r6, r6, r10\n\t"
  122158. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122159. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122160. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  122161. "sbcs r3, r3, r7\n\t"
  122162. "sbcs r4, r4, r8\n\t"
  122163. "sbcs r5, r5, r9\n\t"
  122164. "sbcs r6, r6, r10\n\t"
  122165. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122166. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122167. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  122168. "sbcs r3, r3, r7\n\t"
  122169. "sbcs r4, r4, r8\n\t"
  122170. "sbcs r5, r5, r9\n\t"
  122171. "sbcs r6, r6, r10\n\t"
  122172. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122173. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  122174. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  122175. "sbcs r3, r3, r7\n\t"
  122176. "sbcs r4, r4, r8\n\t"
  122177. "sbcs r5, r5, r9\n\t"
  122178. "sbcs r6, r6, r10\n\t"
  122179. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122180. "ldm %[a]!, {r3}\n\t"
  122181. "ldm %[b]!, {r7}\n\t"
  122182. "sbcs r3, r3, r7\n\t"
  122183. "stm %[r]!, {r3}\n\t"
  122184. "sbc %[r], r6, r6\n\t"
  122185. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  122186. :
  122187. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  122188. );
  122189. return (uint32_t)(size_t)r;
  122190. }
  122191. #endif /* WOLFSSL_SP_SMALL */
  122192. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  122193. *
  122194. * r Result of division by 2.
  122195. * a Number to divide.
  122196. * m Modulus.
  122197. */
  122198. static void sp_521_div2_mod_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  122199. {
  122200. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  122201. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  122202. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  122203. __asm__ __volatile__ (
  122204. "ldm %[a]!, {r4}\n\t"
  122205. "ands r3, r4, #1\n\t"
  122206. "beq L_sp_521_div2_mod_17_even_%=\n\t"
  122207. "mov r12, #0\n\t"
  122208. "ldm %[a]!, {r5, r6, r7}\n\t"
  122209. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  122210. "adds r4, r4, r8\n\t"
  122211. "adcs r5, r5, r9\n\t"
  122212. "adcs r6, r6, r10\n\t"
  122213. "adcs r7, r7, r11\n\t"
  122214. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122215. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122216. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  122217. "adcs r4, r4, r8\n\t"
  122218. "adcs r5, r5, r9\n\t"
  122219. "adcs r6, r6, r10\n\t"
  122220. "adcs r7, r7, r11\n\t"
  122221. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122222. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122223. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  122224. "adcs r4, r4, r8\n\t"
  122225. "adcs r5, r5, r9\n\t"
  122226. "adcs r6, r6, r10\n\t"
  122227. "adcs r7, r7, r11\n\t"
  122228. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122229. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122230. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  122231. "adcs r4, r4, r8\n\t"
  122232. "adcs r5, r5, r9\n\t"
  122233. "adcs r6, r6, r10\n\t"
  122234. "adcs r7, r7, r11\n\t"
  122235. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122236. "ldm %[a]!, {r4}\n\t"
  122237. "ldm %[m]!, {r8}\n\t"
  122238. "adcs r4, r4, r8\n\t"
  122239. "stm %[r]!, {r4}\n\t"
  122240. "adc r3, r12, r12\n\t"
  122241. "b L_sp_521_div2_mod_17_div2_%=\n\t"
  122242. "\n"
  122243. "L_sp_521_div2_mod_17_even_%=: \n\t"
  122244. "ldm %[a]!, {r5, r6, r7}\n\t"
  122245. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122246. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122247. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122248. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122249. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122250. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  122251. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  122252. "ldm %[a]!, {r4}\n\t"
  122253. "stm %[r]!, {r4}\n\t"
  122254. "\n"
  122255. "L_sp_521_div2_mod_17_div2_%=: \n\t"
  122256. "sub %[r], %[r], #0x44\n\t"
  122257. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122258. "ldr r8, [%[r]]\n\t"
  122259. "ldr r9, [%[r], #4]\n\t"
  122260. #else
  122261. "ldrd r8, r9, [%[r]]\n\t"
  122262. #endif
  122263. "lsr r8, r8, #1\n\t"
  122264. "orr r8, r8, r9, lsl #31\n\t"
  122265. "lsr r9, r9, #1\n\t"
  122266. "ldr r10, [%[r], #8]\n\t"
  122267. "str r8, [%[r]]\n\t"
  122268. "orr r9, r9, r10, lsl #31\n\t"
  122269. "lsr r10, r10, #1\n\t"
  122270. "ldr r8, [%[r], #12]\n\t"
  122271. "str r9, [%[r], #4]\n\t"
  122272. "orr r10, r10, r8, lsl #31\n\t"
  122273. "lsr r8, r8, #1\n\t"
  122274. "ldr r9, [%[r], #16]\n\t"
  122275. "str r10, [%[r], #8]\n\t"
  122276. "orr r8, r8, r9, lsl #31\n\t"
  122277. "lsr r9, r9, #1\n\t"
  122278. "ldr r10, [%[r], #20]\n\t"
  122279. "str r8, [%[r], #12]\n\t"
  122280. "orr r9, r9, r10, lsl #31\n\t"
  122281. "lsr r10, r10, #1\n\t"
  122282. "ldr r8, [%[r], #24]\n\t"
  122283. "str r9, [%[r], #16]\n\t"
  122284. "orr r10, r10, r8, lsl #31\n\t"
  122285. "lsr r8, r8, #1\n\t"
  122286. "ldr r9, [%[r], #28]\n\t"
  122287. "str r10, [%[r], #20]\n\t"
  122288. "orr r8, r8, r9, lsl #31\n\t"
  122289. "lsr r9, r9, #1\n\t"
  122290. "ldr r10, [%[r], #32]\n\t"
  122291. "str r8, [%[r], #24]\n\t"
  122292. "orr r9, r9, r10, lsl #31\n\t"
  122293. "lsr r10, r10, #1\n\t"
  122294. "ldr r8, [%[r], #36]\n\t"
  122295. "str r9, [%[r], #28]\n\t"
  122296. "orr r10, r10, r8, lsl #31\n\t"
  122297. "lsr r8, r8, #1\n\t"
  122298. "ldr r9, [%[r], #40]\n\t"
  122299. "str r10, [%[r], #32]\n\t"
  122300. "orr r8, r8, r9, lsl #31\n\t"
  122301. "lsr r9, r9, #1\n\t"
  122302. "ldr r10, [%[r], #44]\n\t"
  122303. "str r8, [%[r], #36]\n\t"
  122304. "orr r9, r9, r10, lsl #31\n\t"
  122305. "lsr r10, r10, #1\n\t"
  122306. "ldr r8, [%[r], #48]\n\t"
  122307. "str r9, [%[r], #40]\n\t"
  122308. "orr r10, r10, r8, lsl #31\n\t"
  122309. "lsr r8, r8, #1\n\t"
  122310. "ldr r9, [%[r], #52]\n\t"
  122311. "str r10, [%[r], #44]\n\t"
  122312. "orr r8, r8, r9, lsl #31\n\t"
  122313. "lsr r9, r9, #1\n\t"
  122314. "ldr r10, [%[r], #56]\n\t"
  122315. "str r8, [%[r], #48]\n\t"
  122316. "orr r9, r9, r10, lsl #31\n\t"
  122317. "lsr r10, r10, #1\n\t"
  122318. "ldr r8, [%[r], #60]\n\t"
  122319. "str r9, [%[r], #52]\n\t"
  122320. "orr r10, r10, r8, lsl #31\n\t"
  122321. "lsr r8, r8, #1\n\t"
  122322. "ldr r9, [%[r], #64]\n\t"
  122323. "str r10, [%[r], #56]\n\t"
  122324. "orr r8, r8, r9, lsl #31\n\t"
  122325. "lsr r9, r9, #1\n\t"
  122326. "orr r9, r9, r3, lsl #31\n\t"
  122327. "str r8, [%[r], #60]\n\t"
  122328. "str r9, [%[r], #64]\n\t"
  122329. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  122330. :
  122331. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  122332. );
  122333. }
  122334. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122335. static const unsigned char L_sp_521_num_bits_17_table[] = {
  122336. 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03,
  122337. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  122338. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  122339. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  122340. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  122341. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  122342. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  122343. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  122344. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122345. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122346. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122347. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122348. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122349. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122350. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122351. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122352. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122353. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122354. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122355. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122356. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122357. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122358. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122359. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122360. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122361. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122362. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122363. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122364. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122365. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122366. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122367. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  122368. };
  122369. static int sp_521_num_bits_17(const sp_digit* a_p)
  122370. {
  122371. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  122372. register unsigned char* L_sp_521_num_bits_17_table_c asm ("r1") = (unsigned char*)&L_sp_521_num_bits_17_table;
  122373. __asm__ __volatile__ (
  122374. "mov lr, %[L_sp_521_num_bits_17_table]\n\t"
  122375. "ldr r1, [%[a], #64]\n\t"
  122376. "cmp r1, #0\n\t"
  122377. "beq L_sp_521_num_bits_17_16_%=\n\t"
  122378. "lsr r3, r1, #24\n\t"
  122379. "cmp r3, #0\n\t"
  122380. "beq L_sp_521_num_bits_17_16_3_%=\n\t"
  122381. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122382. "mov r2, #0x2\n\t"
  122383. "lsl r2, r2, #8\n\t"
  122384. "add r2, r2, #0x18\n\t"
  122385. #else
  122386. "mov r2, #0x218\n\t"
  122387. #endif
  122388. "ldrb r12, [lr, r3]\n\t"
  122389. "add r12, r2, r12\n\t"
  122390. "b L_sp_521_num_bits_17_18_%=\n\t"
  122391. "\n"
  122392. "L_sp_521_num_bits_17_16_3_%=: \n\t"
  122393. "lsr r3, r1, #16\n\t"
  122394. "and r3, r3, #0xff\n\t"
  122395. "cmp r3, #0\n\t"
  122396. "beq L_sp_521_num_bits_17_16_2_%=\n\t"
  122397. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122398. "mov r2, #0x2\n\t"
  122399. "lsl r2, r2, #8\n\t"
  122400. "add r2, r2, #0x10\n\t"
  122401. #else
  122402. "mov r2, #0x210\n\t"
  122403. #endif
  122404. "ldrb r12, [lr, r3]\n\t"
  122405. "add r12, r2, r12\n\t"
  122406. "b L_sp_521_num_bits_17_18_%=\n\t"
  122407. "\n"
  122408. "L_sp_521_num_bits_17_16_2_%=: \n\t"
  122409. "lsr r3, r1, #8\n\t"
  122410. "and r3, r3, #0xff\n\t"
  122411. "cmp r3, #0\n\t"
  122412. "beq L_sp_521_num_bits_17_16_1_%=\n\t"
  122413. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122414. "mov r2, #0x2\n\t"
  122415. "lsl r2, r2, #8\n\t"
  122416. "add r2, r2, #0x8\n\t"
  122417. #else
  122418. "mov r2, #0x208\n\t"
  122419. #endif
  122420. "ldrb r12, [lr, r3]\n\t"
  122421. "add r12, r2, r12\n\t"
  122422. "b L_sp_521_num_bits_17_18_%=\n\t"
  122423. "\n"
  122424. "L_sp_521_num_bits_17_16_1_%=: \n\t"
  122425. "and r3, r1, #0xff\n\t"
  122426. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122427. "mov r2, #0x2\n\t"
  122428. "lsl r2, r2, #8\n\t"
  122429. "add r2, r2, #0x0\n\t"
  122430. #else
  122431. "mov r2, #0x200\n\t"
  122432. #endif
  122433. "ldrb r12, [lr, r3]\n\t"
  122434. "add r12, r2, r12\n\t"
  122435. "b L_sp_521_num_bits_17_18_%=\n\t"
  122436. "\n"
  122437. "L_sp_521_num_bits_17_16_%=: \n\t"
  122438. "ldr r1, [%[a], #60]\n\t"
  122439. "cmp r1, #0\n\t"
  122440. "beq L_sp_521_num_bits_17_15_%=\n\t"
  122441. "lsr r3, r1, #24\n\t"
  122442. "cmp r3, #0\n\t"
  122443. "beq L_sp_521_num_bits_17_15_3_%=\n\t"
  122444. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122445. "mov r2, #0x1\n\t"
  122446. "lsl r2, r2, #8\n\t"
  122447. "add r2, r2, #0xf8\n\t"
  122448. #else
  122449. "mov r2, #0x1f8\n\t"
  122450. #endif
  122451. "ldrb r12, [lr, r3]\n\t"
  122452. "add r12, r2, r12\n\t"
  122453. "b L_sp_521_num_bits_17_18_%=\n\t"
  122454. "\n"
  122455. "L_sp_521_num_bits_17_15_3_%=: \n\t"
  122456. "lsr r3, r1, #16\n\t"
  122457. "and r3, r3, #0xff\n\t"
  122458. "cmp r3, #0\n\t"
  122459. "beq L_sp_521_num_bits_17_15_2_%=\n\t"
  122460. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122461. "mov r2, #0x1\n\t"
  122462. "lsl r2, r2, #8\n\t"
  122463. "add r2, r2, #0xf0\n\t"
  122464. #else
  122465. "mov r2, #0x1f0\n\t"
  122466. #endif
  122467. "ldrb r12, [lr, r3]\n\t"
  122468. "add r12, r2, r12\n\t"
  122469. "b L_sp_521_num_bits_17_18_%=\n\t"
  122470. "\n"
  122471. "L_sp_521_num_bits_17_15_2_%=: \n\t"
  122472. "lsr r3, r1, #8\n\t"
  122473. "and r3, r3, #0xff\n\t"
  122474. "cmp r3, #0\n\t"
  122475. "beq L_sp_521_num_bits_17_15_1_%=\n\t"
  122476. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122477. "mov r2, #0x1\n\t"
  122478. "lsl r2, r2, #8\n\t"
  122479. "add r2, r2, #0xe8\n\t"
  122480. #else
  122481. "mov r2, #0x1e8\n\t"
  122482. #endif
  122483. "ldrb r12, [lr, r3]\n\t"
  122484. "add r12, r2, r12\n\t"
  122485. "b L_sp_521_num_bits_17_18_%=\n\t"
  122486. "\n"
  122487. "L_sp_521_num_bits_17_15_1_%=: \n\t"
  122488. "and r3, r1, #0xff\n\t"
  122489. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122490. "mov r2, #0x1\n\t"
  122491. "lsl r2, r2, #8\n\t"
  122492. "add r2, r2, #0xe0\n\t"
  122493. #else
  122494. "mov r2, #0x1e0\n\t"
  122495. #endif
  122496. "ldrb r12, [lr, r3]\n\t"
  122497. "add r12, r2, r12\n\t"
  122498. "b L_sp_521_num_bits_17_18_%=\n\t"
  122499. "\n"
  122500. "L_sp_521_num_bits_17_15_%=: \n\t"
  122501. "ldr r1, [%[a], #56]\n\t"
  122502. "cmp r1, #0\n\t"
  122503. "beq L_sp_521_num_bits_17_14_%=\n\t"
  122504. "lsr r3, r1, #24\n\t"
  122505. "cmp r3, #0\n\t"
  122506. "beq L_sp_521_num_bits_17_14_3_%=\n\t"
  122507. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122508. "mov r2, #0x1\n\t"
  122509. "lsl r2, r2, #8\n\t"
  122510. "add r2, r2, #0xd8\n\t"
  122511. #else
  122512. "mov r2, #0x1d8\n\t"
  122513. #endif
  122514. "ldrb r12, [lr, r3]\n\t"
  122515. "add r12, r2, r12\n\t"
  122516. "b L_sp_521_num_bits_17_18_%=\n\t"
  122517. "\n"
  122518. "L_sp_521_num_bits_17_14_3_%=: \n\t"
  122519. "lsr r3, r1, #16\n\t"
  122520. "and r3, r3, #0xff\n\t"
  122521. "cmp r3, #0\n\t"
  122522. "beq L_sp_521_num_bits_17_14_2_%=\n\t"
  122523. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122524. "mov r2, #0x1\n\t"
  122525. "lsl r2, r2, #8\n\t"
  122526. "add r2, r2, #0xd0\n\t"
  122527. #else
  122528. "mov r2, #0x1d0\n\t"
  122529. #endif
  122530. "ldrb r12, [lr, r3]\n\t"
  122531. "add r12, r2, r12\n\t"
  122532. "b L_sp_521_num_bits_17_18_%=\n\t"
  122533. "\n"
  122534. "L_sp_521_num_bits_17_14_2_%=: \n\t"
  122535. "lsr r3, r1, #8\n\t"
  122536. "and r3, r3, #0xff\n\t"
  122537. "cmp r3, #0\n\t"
  122538. "beq L_sp_521_num_bits_17_14_1_%=\n\t"
  122539. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122540. "mov r2, #0x1\n\t"
  122541. "lsl r2, r2, #8\n\t"
  122542. "add r2, r2, #0xc8\n\t"
  122543. #else
  122544. "mov r2, #0x1c8\n\t"
  122545. #endif
  122546. "ldrb r12, [lr, r3]\n\t"
  122547. "add r12, r2, r12\n\t"
  122548. "b L_sp_521_num_bits_17_18_%=\n\t"
  122549. "\n"
  122550. "L_sp_521_num_bits_17_14_1_%=: \n\t"
  122551. "and r3, r1, #0xff\n\t"
  122552. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122553. "mov r2, #0x1\n\t"
  122554. "lsl r2, r2, #8\n\t"
  122555. "add r2, r2, #0xc0\n\t"
  122556. #else
  122557. "mov r2, #0x1c0\n\t"
  122558. #endif
  122559. "ldrb r12, [lr, r3]\n\t"
  122560. "add r12, r2, r12\n\t"
  122561. "b L_sp_521_num_bits_17_18_%=\n\t"
  122562. "\n"
  122563. "L_sp_521_num_bits_17_14_%=: \n\t"
  122564. "ldr r1, [%[a], #52]\n\t"
  122565. "cmp r1, #0\n\t"
  122566. "beq L_sp_521_num_bits_17_13_%=\n\t"
  122567. "lsr r3, r1, #24\n\t"
  122568. "cmp r3, #0\n\t"
  122569. "beq L_sp_521_num_bits_17_13_3_%=\n\t"
  122570. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122571. "mov r2, #0x1\n\t"
  122572. "lsl r2, r2, #8\n\t"
  122573. "add r2, r2, #0xb8\n\t"
  122574. #else
  122575. "mov r2, #0x1b8\n\t"
  122576. #endif
  122577. "ldrb r12, [lr, r3]\n\t"
  122578. "add r12, r2, r12\n\t"
  122579. "b L_sp_521_num_bits_17_18_%=\n\t"
  122580. "\n"
  122581. "L_sp_521_num_bits_17_13_3_%=: \n\t"
  122582. "lsr r3, r1, #16\n\t"
  122583. "and r3, r3, #0xff\n\t"
  122584. "cmp r3, #0\n\t"
  122585. "beq L_sp_521_num_bits_17_13_2_%=\n\t"
  122586. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122587. "mov r2, #0x1\n\t"
  122588. "lsl r2, r2, #8\n\t"
  122589. "add r2, r2, #0xb0\n\t"
  122590. #else
  122591. "mov r2, #0x1b0\n\t"
  122592. #endif
  122593. "ldrb r12, [lr, r3]\n\t"
  122594. "add r12, r2, r12\n\t"
  122595. "b L_sp_521_num_bits_17_18_%=\n\t"
  122596. "\n"
  122597. "L_sp_521_num_bits_17_13_2_%=: \n\t"
  122598. "lsr r3, r1, #8\n\t"
  122599. "and r3, r3, #0xff\n\t"
  122600. "cmp r3, #0\n\t"
  122601. "beq L_sp_521_num_bits_17_13_1_%=\n\t"
  122602. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122603. "mov r2, #0x1\n\t"
  122604. "lsl r2, r2, #8\n\t"
  122605. "add r2, r2, #0xa8\n\t"
  122606. #else
  122607. "mov r2, #0x1a8\n\t"
  122608. #endif
  122609. "ldrb r12, [lr, r3]\n\t"
  122610. "add r12, r2, r12\n\t"
  122611. "b L_sp_521_num_bits_17_18_%=\n\t"
  122612. "\n"
  122613. "L_sp_521_num_bits_17_13_1_%=: \n\t"
  122614. "and r3, r1, #0xff\n\t"
  122615. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122616. "mov r2, #0x1\n\t"
  122617. "lsl r2, r2, #8\n\t"
  122618. "add r2, r2, #0xa0\n\t"
  122619. #else
  122620. "mov r2, #0x1a0\n\t"
  122621. #endif
  122622. "ldrb r12, [lr, r3]\n\t"
  122623. "add r12, r2, r12\n\t"
  122624. "b L_sp_521_num_bits_17_18_%=\n\t"
  122625. "\n"
  122626. "L_sp_521_num_bits_17_13_%=: \n\t"
  122627. "ldr r1, [%[a], #48]\n\t"
  122628. "cmp r1, #0\n\t"
  122629. "beq L_sp_521_num_bits_17_12_%=\n\t"
  122630. "lsr r3, r1, #24\n\t"
  122631. "cmp r3, #0\n\t"
  122632. "beq L_sp_521_num_bits_17_12_3_%=\n\t"
  122633. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122634. "mov r2, #0x1\n\t"
  122635. "lsl r2, r2, #8\n\t"
  122636. "add r2, r2, #0x98\n\t"
  122637. #else
  122638. "mov r2, #0x198\n\t"
  122639. #endif
  122640. "ldrb r12, [lr, r3]\n\t"
  122641. "add r12, r2, r12\n\t"
  122642. "b L_sp_521_num_bits_17_18_%=\n\t"
  122643. "\n"
  122644. "L_sp_521_num_bits_17_12_3_%=: \n\t"
  122645. "lsr r3, r1, #16\n\t"
  122646. "and r3, r3, #0xff\n\t"
  122647. "cmp r3, #0\n\t"
  122648. "beq L_sp_521_num_bits_17_12_2_%=\n\t"
  122649. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122650. "mov r2, #0x1\n\t"
  122651. "lsl r2, r2, #8\n\t"
  122652. "add r2, r2, #0x90\n\t"
  122653. #else
  122654. "mov r2, #0x190\n\t"
  122655. #endif
  122656. "ldrb r12, [lr, r3]\n\t"
  122657. "add r12, r2, r12\n\t"
  122658. "b L_sp_521_num_bits_17_18_%=\n\t"
  122659. "\n"
  122660. "L_sp_521_num_bits_17_12_2_%=: \n\t"
  122661. "lsr r3, r1, #8\n\t"
  122662. "and r3, r3, #0xff\n\t"
  122663. "cmp r3, #0\n\t"
  122664. "beq L_sp_521_num_bits_17_12_1_%=\n\t"
  122665. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122666. "mov r2, #0x1\n\t"
  122667. "lsl r2, r2, #8\n\t"
  122668. "add r2, r2, #0x88\n\t"
  122669. #else
  122670. "mov r2, #0x188\n\t"
  122671. #endif
  122672. "ldrb r12, [lr, r3]\n\t"
  122673. "add r12, r2, r12\n\t"
  122674. "b L_sp_521_num_bits_17_18_%=\n\t"
  122675. "\n"
  122676. "L_sp_521_num_bits_17_12_1_%=: \n\t"
  122677. "and r3, r1, #0xff\n\t"
  122678. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122679. "mov r2, #0x1\n\t"
  122680. "lsl r2, r2, #8\n\t"
  122681. "add r2, r2, #0x80\n\t"
  122682. #else
  122683. "mov r2, #0x180\n\t"
  122684. #endif
  122685. "ldrb r12, [lr, r3]\n\t"
  122686. "add r12, r2, r12\n\t"
  122687. "b L_sp_521_num_bits_17_18_%=\n\t"
  122688. "\n"
  122689. "L_sp_521_num_bits_17_12_%=: \n\t"
  122690. "ldr r1, [%[a], #44]\n\t"
  122691. "cmp r1, #0\n\t"
  122692. "beq L_sp_521_num_bits_17_11_%=\n\t"
  122693. "lsr r3, r1, #24\n\t"
  122694. "cmp r3, #0\n\t"
  122695. "beq L_sp_521_num_bits_17_11_3_%=\n\t"
  122696. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122697. "mov r2, #0x1\n\t"
  122698. "lsl r2, r2, #8\n\t"
  122699. "add r2, r2, #0x78\n\t"
  122700. #else
  122701. "mov r2, #0x178\n\t"
  122702. #endif
  122703. "ldrb r12, [lr, r3]\n\t"
  122704. "add r12, r2, r12\n\t"
  122705. "b L_sp_521_num_bits_17_18_%=\n\t"
  122706. "\n"
  122707. "L_sp_521_num_bits_17_11_3_%=: \n\t"
  122708. "lsr r3, r1, #16\n\t"
  122709. "and r3, r3, #0xff\n\t"
  122710. "cmp r3, #0\n\t"
  122711. "beq L_sp_521_num_bits_17_11_2_%=\n\t"
  122712. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122713. "mov r2, #0x1\n\t"
  122714. "lsl r2, r2, #8\n\t"
  122715. "add r2, r2, #0x70\n\t"
  122716. #else
  122717. "mov r2, #0x170\n\t"
  122718. #endif
  122719. "ldrb r12, [lr, r3]\n\t"
  122720. "add r12, r2, r12\n\t"
  122721. "b L_sp_521_num_bits_17_18_%=\n\t"
  122722. "\n"
  122723. "L_sp_521_num_bits_17_11_2_%=: \n\t"
  122724. "lsr r3, r1, #8\n\t"
  122725. "and r3, r3, #0xff\n\t"
  122726. "cmp r3, #0\n\t"
  122727. "beq L_sp_521_num_bits_17_11_1_%=\n\t"
  122728. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122729. "mov r2, #0x1\n\t"
  122730. "lsl r2, r2, #8\n\t"
  122731. "add r2, r2, #0x68\n\t"
  122732. #else
  122733. "mov r2, #0x168\n\t"
  122734. #endif
  122735. "ldrb r12, [lr, r3]\n\t"
  122736. "add r12, r2, r12\n\t"
  122737. "b L_sp_521_num_bits_17_18_%=\n\t"
  122738. "\n"
  122739. "L_sp_521_num_bits_17_11_1_%=: \n\t"
  122740. "and r3, r1, #0xff\n\t"
  122741. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122742. "mov r2, #0x1\n\t"
  122743. "lsl r2, r2, #8\n\t"
  122744. "add r2, r2, #0x60\n\t"
  122745. #else
  122746. "mov r2, #0x160\n\t"
  122747. #endif
  122748. "ldrb r12, [lr, r3]\n\t"
  122749. "add r12, r2, r12\n\t"
  122750. "b L_sp_521_num_bits_17_18_%=\n\t"
  122751. "\n"
  122752. "L_sp_521_num_bits_17_11_%=: \n\t"
  122753. "ldr r1, [%[a], #40]\n\t"
  122754. "cmp r1, #0\n\t"
  122755. "beq L_sp_521_num_bits_17_10_%=\n\t"
  122756. "lsr r3, r1, #24\n\t"
  122757. "cmp r3, #0\n\t"
  122758. "beq L_sp_521_num_bits_17_10_3_%=\n\t"
  122759. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122760. "mov r2, #0x1\n\t"
  122761. "lsl r2, r2, #8\n\t"
  122762. "add r2, r2, #0x58\n\t"
  122763. #else
  122764. "mov r2, #0x158\n\t"
  122765. #endif
  122766. "ldrb r12, [lr, r3]\n\t"
  122767. "add r12, r2, r12\n\t"
  122768. "b L_sp_521_num_bits_17_18_%=\n\t"
  122769. "\n"
  122770. "L_sp_521_num_bits_17_10_3_%=: \n\t"
  122771. "lsr r3, r1, #16\n\t"
  122772. "and r3, r3, #0xff\n\t"
  122773. "cmp r3, #0\n\t"
  122774. "beq L_sp_521_num_bits_17_10_2_%=\n\t"
  122775. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122776. "mov r2, #0x1\n\t"
  122777. "lsl r2, r2, #8\n\t"
  122778. "add r2, r2, #0x50\n\t"
  122779. #else
  122780. "mov r2, #0x150\n\t"
  122781. #endif
  122782. "ldrb r12, [lr, r3]\n\t"
  122783. "add r12, r2, r12\n\t"
  122784. "b L_sp_521_num_bits_17_18_%=\n\t"
  122785. "\n"
  122786. "L_sp_521_num_bits_17_10_2_%=: \n\t"
  122787. "lsr r3, r1, #8\n\t"
  122788. "and r3, r3, #0xff\n\t"
  122789. "cmp r3, #0\n\t"
  122790. "beq L_sp_521_num_bits_17_10_1_%=\n\t"
  122791. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122792. "mov r2, #0x1\n\t"
  122793. "lsl r2, r2, #8\n\t"
  122794. "add r2, r2, #0x48\n\t"
  122795. #else
  122796. "mov r2, #0x148\n\t"
  122797. #endif
  122798. "ldrb r12, [lr, r3]\n\t"
  122799. "add r12, r2, r12\n\t"
  122800. "b L_sp_521_num_bits_17_18_%=\n\t"
  122801. "\n"
  122802. "L_sp_521_num_bits_17_10_1_%=: \n\t"
  122803. "and r3, r1, #0xff\n\t"
  122804. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122805. "mov r2, #0x1\n\t"
  122806. "lsl r2, r2, #8\n\t"
  122807. "add r2, r2, #0x40\n\t"
  122808. #else
  122809. "mov r2, #0x140\n\t"
  122810. #endif
  122811. "ldrb r12, [lr, r3]\n\t"
  122812. "add r12, r2, r12\n\t"
  122813. "b L_sp_521_num_bits_17_18_%=\n\t"
  122814. "\n"
  122815. "L_sp_521_num_bits_17_10_%=: \n\t"
  122816. "ldr r1, [%[a], #36]\n\t"
  122817. "cmp r1, #0\n\t"
  122818. "beq L_sp_521_num_bits_17_9_%=\n\t"
  122819. "lsr r3, r1, #24\n\t"
  122820. "cmp r3, #0\n\t"
  122821. "beq L_sp_521_num_bits_17_9_3_%=\n\t"
  122822. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122823. "mov r2, #0x1\n\t"
  122824. "lsl r2, r2, #8\n\t"
  122825. "add r2, r2, #0x38\n\t"
  122826. #else
  122827. "mov r2, #0x138\n\t"
  122828. #endif
  122829. "ldrb r12, [lr, r3]\n\t"
  122830. "add r12, r2, r12\n\t"
  122831. "b L_sp_521_num_bits_17_18_%=\n\t"
  122832. "\n"
  122833. "L_sp_521_num_bits_17_9_3_%=: \n\t"
  122834. "lsr r3, r1, #16\n\t"
  122835. "and r3, r3, #0xff\n\t"
  122836. "cmp r3, #0\n\t"
  122837. "beq L_sp_521_num_bits_17_9_2_%=\n\t"
  122838. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122839. "mov r2, #0x1\n\t"
  122840. "lsl r2, r2, #8\n\t"
  122841. "add r2, r2, #0x30\n\t"
  122842. #else
  122843. "mov r2, #0x130\n\t"
  122844. #endif
  122845. "ldrb r12, [lr, r3]\n\t"
  122846. "add r12, r2, r12\n\t"
  122847. "b L_sp_521_num_bits_17_18_%=\n\t"
  122848. "\n"
  122849. "L_sp_521_num_bits_17_9_2_%=: \n\t"
  122850. "lsr r3, r1, #8\n\t"
  122851. "and r3, r3, #0xff\n\t"
  122852. "cmp r3, #0\n\t"
  122853. "beq L_sp_521_num_bits_17_9_1_%=\n\t"
  122854. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122855. "mov r2, #0x1\n\t"
  122856. "lsl r2, r2, #8\n\t"
  122857. "add r2, r2, #0x28\n\t"
  122858. #else
  122859. "mov r2, #0x128\n\t"
  122860. #endif
  122861. "ldrb r12, [lr, r3]\n\t"
  122862. "add r12, r2, r12\n\t"
  122863. "b L_sp_521_num_bits_17_18_%=\n\t"
  122864. "\n"
  122865. "L_sp_521_num_bits_17_9_1_%=: \n\t"
  122866. "and r3, r1, #0xff\n\t"
  122867. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122868. "mov r2, #0x1\n\t"
  122869. "lsl r2, r2, #8\n\t"
  122870. "add r2, r2, #0x20\n\t"
  122871. #else
  122872. "mov r2, #0x120\n\t"
  122873. #endif
  122874. "ldrb r12, [lr, r3]\n\t"
  122875. "add r12, r2, r12\n\t"
  122876. "b L_sp_521_num_bits_17_18_%=\n\t"
  122877. "\n"
  122878. "L_sp_521_num_bits_17_9_%=: \n\t"
  122879. "ldr r1, [%[a], #32]\n\t"
  122880. "cmp r1, #0\n\t"
  122881. "beq L_sp_521_num_bits_17_8_%=\n\t"
  122882. "lsr r3, r1, #24\n\t"
  122883. "cmp r3, #0\n\t"
  122884. "beq L_sp_521_num_bits_17_8_3_%=\n\t"
  122885. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122886. "mov r2, #0x1\n\t"
  122887. "lsl r2, r2, #8\n\t"
  122888. "add r2, r2, #0x18\n\t"
  122889. #else
  122890. "mov r2, #0x118\n\t"
  122891. #endif
  122892. "ldrb r12, [lr, r3]\n\t"
  122893. "add r12, r2, r12\n\t"
  122894. "b L_sp_521_num_bits_17_18_%=\n\t"
  122895. "\n"
  122896. "L_sp_521_num_bits_17_8_3_%=: \n\t"
  122897. "lsr r3, r1, #16\n\t"
  122898. "and r3, r3, #0xff\n\t"
  122899. "cmp r3, #0\n\t"
  122900. "beq L_sp_521_num_bits_17_8_2_%=\n\t"
  122901. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122902. "mov r2, #0x1\n\t"
  122903. "lsl r2, r2, #8\n\t"
  122904. "add r2, r2, #0x10\n\t"
  122905. #else
  122906. "mov r2, #0x110\n\t"
  122907. #endif
  122908. "ldrb r12, [lr, r3]\n\t"
  122909. "add r12, r2, r12\n\t"
  122910. "b L_sp_521_num_bits_17_18_%=\n\t"
  122911. "\n"
  122912. "L_sp_521_num_bits_17_8_2_%=: \n\t"
  122913. "lsr r3, r1, #8\n\t"
  122914. "and r3, r3, #0xff\n\t"
  122915. "cmp r3, #0\n\t"
  122916. "beq L_sp_521_num_bits_17_8_1_%=\n\t"
  122917. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122918. "mov r2, #0x1\n\t"
  122919. "lsl r2, r2, #8\n\t"
  122920. "add r2, r2, #0x8\n\t"
  122921. #else
  122922. "mov r2, #0x108\n\t"
  122923. #endif
  122924. "ldrb r12, [lr, r3]\n\t"
  122925. "add r12, r2, r12\n\t"
  122926. "b L_sp_521_num_bits_17_18_%=\n\t"
  122927. "\n"
  122928. "L_sp_521_num_bits_17_8_1_%=: \n\t"
  122929. "and r3, r1, #0xff\n\t"
  122930. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  122931. "mov r2, #0x1\n\t"
  122932. "lsl r2, r2, #8\n\t"
  122933. "add r2, r2, #0x0\n\t"
  122934. #else
  122935. "mov r2, #0x100\n\t"
  122936. #endif
  122937. "ldrb r12, [lr, r3]\n\t"
  122938. "add r12, r2, r12\n\t"
  122939. "b L_sp_521_num_bits_17_18_%=\n\t"
  122940. "\n"
  122941. "L_sp_521_num_bits_17_8_%=: \n\t"
  122942. "ldr r1, [%[a], #28]\n\t"
  122943. "cmp r1, #0\n\t"
  122944. "beq L_sp_521_num_bits_17_7_%=\n\t"
  122945. "lsr r3, r1, #24\n\t"
  122946. "cmp r3, #0\n\t"
  122947. "beq L_sp_521_num_bits_17_7_3_%=\n\t"
  122948. "mov r2, #0xf8\n\t"
  122949. "ldrb r12, [lr, r3]\n\t"
  122950. "add r12, r2, r12\n\t"
  122951. "b L_sp_521_num_bits_17_18_%=\n\t"
  122952. "\n"
  122953. "L_sp_521_num_bits_17_7_3_%=: \n\t"
  122954. "lsr r3, r1, #16\n\t"
  122955. "and r3, r3, #0xff\n\t"
  122956. "cmp r3, #0\n\t"
  122957. "beq L_sp_521_num_bits_17_7_2_%=\n\t"
  122958. "mov r2, #0xf0\n\t"
  122959. "ldrb r12, [lr, r3]\n\t"
  122960. "add r12, r2, r12\n\t"
  122961. "b L_sp_521_num_bits_17_18_%=\n\t"
  122962. "\n"
  122963. "L_sp_521_num_bits_17_7_2_%=: \n\t"
  122964. "lsr r3, r1, #8\n\t"
  122965. "and r3, r3, #0xff\n\t"
  122966. "cmp r3, #0\n\t"
  122967. "beq L_sp_521_num_bits_17_7_1_%=\n\t"
  122968. "mov r2, #0xe8\n\t"
  122969. "ldrb r12, [lr, r3]\n\t"
  122970. "add r12, r2, r12\n\t"
  122971. "b L_sp_521_num_bits_17_18_%=\n\t"
  122972. "\n"
  122973. "L_sp_521_num_bits_17_7_1_%=: \n\t"
  122974. "and r3, r1, #0xff\n\t"
  122975. "mov r2, #0xe0\n\t"
  122976. "ldrb r12, [lr, r3]\n\t"
  122977. "add r12, r2, r12\n\t"
  122978. "b L_sp_521_num_bits_17_18_%=\n\t"
  122979. "\n"
  122980. "L_sp_521_num_bits_17_7_%=: \n\t"
  122981. "ldr r1, [%[a], #24]\n\t"
  122982. "cmp r1, #0\n\t"
  122983. "beq L_sp_521_num_bits_17_6_%=\n\t"
  122984. "lsr r3, r1, #24\n\t"
  122985. "cmp r3, #0\n\t"
  122986. "beq L_sp_521_num_bits_17_6_3_%=\n\t"
  122987. "mov r2, #0xd8\n\t"
  122988. "ldrb r12, [lr, r3]\n\t"
  122989. "add r12, r2, r12\n\t"
  122990. "b L_sp_521_num_bits_17_18_%=\n\t"
  122991. "\n"
  122992. "L_sp_521_num_bits_17_6_3_%=: \n\t"
  122993. "lsr r3, r1, #16\n\t"
  122994. "and r3, r3, #0xff\n\t"
  122995. "cmp r3, #0\n\t"
  122996. "beq L_sp_521_num_bits_17_6_2_%=\n\t"
  122997. "mov r2, #0xd0\n\t"
  122998. "ldrb r12, [lr, r3]\n\t"
  122999. "add r12, r2, r12\n\t"
  123000. "b L_sp_521_num_bits_17_18_%=\n\t"
  123001. "\n"
  123002. "L_sp_521_num_bits_17_6_2_%=: \n\t"
  123003. "lsr r3, r1, #8\n\t"
  123004. "and r3, r3, #0xff\n\t"
  123005. "cmp r3, #0\n\t"
  123006. "beq L_sp_521_num_bits_17_6_1_%=\n\t"
  123007. "mov r2, #0xc8\n\t"
  123008. "ldrb r12, [lr, r3]\n\t"
  123009. "add r12, r2, r12\n\t"
  123010. "b L_sp_521_num_bits_17_18_%=\n\t"
  123011. "\n"
  123012. "L_sp_521_num_bits_17_6_1_%=: \n\t"
  123013. "and r3, r1, #0xff\n\t"
  123014. "mov r2, #0xc0\n\t"
  123015. "ldrb r12, [lr, r3]\n\t"
  123016. "add r12, r2, r12\n\t"
  123017. "b L_sp_521_num_bits_17_18_%=\n\t"
  123018. "\n"
  123019. "L_sp_521_num_bits_17_6_%=: \n\t"
  123020. "ldr r1, [%[a], #20]\n\t"
  123021. "cmp r1, #0\n\t"
  123022. "beq L_sp_521_num_bits_17_5_%=\n\t"
  123023. "lsr r3, r1, #24\n\t"
  123024. "cmp r3, #0\n\t"
  123025. "beq L_sp_521_num_bits_17_5_3_%=\n\t"
  123026. "mov r2, #0xb8\n\t"
  123027. "ldrb r12, [lr, r3]\n\t"
  123028. "add r12, r2, r12\n\t"
  123029. "b L_sp_521_num_bits_17_18_%=\n\t"
  123030. "\n"
  123031. "L_sp_521_num_bits_17_5_3_%=: \n\t"
  123032. "lsr r3, r1, #16\n\t"
  123033. "and r3, r3, #0xff\n\t"
  123034. "cmp r3, #0\n\t"
  123035. "beq L_sp_521_num_bits_17_5_2_%=\n\t"
  123036. "mov r2, #0xb0\n\t"
  123037. "ldrb r12, [lr, r3]\n\t"
  123038. "add r12, r2, r12\n\t"
  123039. "b L_sp_521_num_bits_17_18_%=\n\t"
  123040. "\n"
  123041. "L_sp_521_num_bits_17_5_2_%=: \n\t"
  123042. "lsr r3, r1, #8\n\t"
  123043. "and r3, r3, #0xff\n\t"
  123044. "cmp r3, #0\n\t"
  123045. "beq L_sp_521_num_bits_17_5_1_%=\n\t"
  123046. "mov r2, #0xa8\n\t"
  123047. "ldrb r12, [lr, r3]\n\t"
  123048. "add r12, r2, r12\n\t"
  123049. "b L_sp_521_num_bits_17_18_%=\n\t"
  123050. "\n"
  123051. "L_sp_521_num_bits_17_5_1_%=: \n\t"
  123052. "and r3, r1, #0xff\n\t"
  123053. "mov r2, #0xa0\n\t"
  123054. "ldrb r12, [lr, r3]\n\t"
  123055. "add r12, r2, r12\n\t"
  123056. "b L_sp_521_num_bits_17_18_%=\n\t"
  123057. "\n"
  123058. "L_sp_521_num_bits_17_5_%=: \n\t"
  123059. "ldr r1, [%[a], #16]\n\t"
  123060. "cmp r1, #0\n\t"
  123061. "beq L_sp_521_num_bits_17_4_%=\n\t"
  123062. "lsr r3, r1, #24\n\t"
  123063. "cmp r3, #0\n\t"
  123064. "beq L_sp_521_num_bits_17_4_3_%=\n\t"
  123065. "mov r2, #0x98\n\t"
  123066. "ldrb r12, [lr, r3]\n\t"
  123067. "add r12, r2, r12\n\t"
  123068. "b L_sp_521_num_bits_17_18_%=\n\t"
  123069. "\n"
  123070. "L_sp_521_num_bits_17_4_3_%=: \n\t"
  123071. "lsr r3, r1, #16\n\t"
  123072. "and r3, r3, #0xff\n\t"
  123073. "cmp r3, #0\n\t"
  123074. "beq L_sp_521_num_bits_17_4_2_%=\n\t"
  123075. "mov r2, #0x90\n\t"
  123076. "ldrb r12, [lr, r3]\n\t"
  123077. "add r12, r2, r12\n\t"
  123078. "b L_sp_521_num_bits_17_18_%=\n\t"
  123079. "\n"
  123080. "L_sp_521_num_bits_17_4_2_%=: \n\t"
  123081. "lsr r3, r1, #8\n\t"
  123082. "and r3, r3, #0xff\n\t"
  123083. "cmp r3, #0\n\t"
  123084. "beq L_sp_521_num_bits_17_4_1_%=\n\t"
  123085. "mov r2, #0x88\n\t"
  123086. "ldrb r12, [lr, r3]\n\t"
  123087. "add r12, r2, r12\n\t"
  123088. "b L_sp_521_num_bits_17_18_%=\n\t"
  123089. "\n"
  123090. "L_sp_521_num_bits_17_4_1_%=: \n\t"
  123091. "and r3, r1, #0xff\n\t"
  123092. "mov r2, #0x80\n\t"
  123093. "ldrb r12, [lr, r3]\n\t"
  123094. "add r12, r2, r12\n\t"
  123095. "b L_sp_521_num_bits_17_18_%=\n\t"
  123096. "\n"
  123097. "L_sp_521_num_bits_17_4_%=: \n\t"
  123098. "ldr r1, [%[a], #12]\n\t"
  123099. "cmp r1, #0\n\t"
  123100. "beq L_sp_521_num_bits_17_3_%=\n\t"
  123101. "lsr r3, r1, #24\n\t"
  123102. "cmp r3, #0\n\t"
  123103. "beq L_sp_521_num_bits_17_3_3_%=\n\t"
  123104. "mov r2, #0x78\n\t"
  123105. "ldrb r12, [lr, r3]\n\t"
  123106. "add r12, r2, r12\n\t"
  123107. "b L_sp_521_num_bits_17_18_%=\n\t"
  123108. "\n"
  123109. "L_sp_521_num_bits_17_3_3_%=: \n\t"
  123110. "lsr r3, r1, #16\n\t"
  123111. "and r3, r3, #0xff\n\t"
  123112. "cmp r3, #0\n\t"
  123113. "beq L_sp_521_num_bits_17_3_2_%=\n\t"
  123114. "mov r2, #0x70\n\t"
  123115. "ldrb r12, [lr, r3]\n\t"
  123116. "add r12, r2, r12\n\t"
  123117. "b L_sp_521_num_bits_17_18_%=\n\t"
  123118. "\n"
  123119. "L_sp_521_num_bits_17_3_2_%=: \n\t"
  123120. "lsr r3, r1, #8\n\t"
  123121. "and r3, r3, #0xff\n\t"
  123122. "cmp r3, #0\n\t"
  123123. "beq L_sp_521_num_bits_17_3_1_%=\n\t"
  123124. "mov r2, #0x68\n\t"
  123125. "ldrb r12, [lr, r3]\n\t"
  123126. "add r12, r2, r12\n\t"
  123127. "b L_sp_521_num_bits_17_18_%=\n\t"
  123128. "\n"
  123129. "L_sp_521_num_bits_17_3_1_%=: \n\t"
  123130. "and r3, r1, #0xff\n\t"
  123131. "mov r2, #0x60\n\t"
  123132. "ldrb r12, [lr, r3]\n\t"
  123133. "add r12, r2, r12\n\t"
  123134. "b L_sp_521_num_bits_17_18_%=\n\t"
  123135. "\n"
  123136. "L_sp_521_num_bits_17_3_%=: \n\t"
  123137. "ldr r1, [%[a], #8]\n\t"
  123138. "cmp r1, #0\n\t"
  123139. "beq L_sp_521_num_bits_17_2_%=\n\t"
  123140. "lsr r3, r1, #24\n\t"
  123141. "cmp r3, #0\n\t"
  123142. "beq L_sp_521_num_bits_17_2_3_%=\n\t"
  123143. "mov r2, #0x58\n\t"
  123144. "ldrb r12, [lr, r3]\n\t"
  123145. "add r12, r2, r12\n\t"
  123146. "b L_sp_521_num_bits_17_18_%=\n\t"
  123147. "\n"
  123148. "L_sp_521_num_bits_17_2_3_%=: \n\t"
  123149. "lsr r3, r1, #16\n\t"
  123150. "and r3, r3, #0xff\n\t"
  123151. "cmp r3, #0\n\t"
  123152. "beq L_sp_521_num_bits_17_2_2_%=\n\t"
  123153. "mov r2, #0x50\n\t"
  123154. "ldrb r12, [lr, r3]\n\t"
  123155. "add r12, r2, r12\n\t"
  123156. "b L_sp_521_num_bits_17_18_%=\n\t"
  123157. "\n"
  123158. "L_sp_521_num_bits_17_2_2_%=: \n\t"
  123159. "lsr r3, r1, #8\n\t"
  123160. "and r3, r3, #0xff\n\t"
  123161. "cmp r3, #0\n\t"
  123162. "beq L_sp_521_num_bits_17_2_1_%=\n\t"
  123163. "mov r2, #0x48\n\t"
  123164. "ldrb r12, [lr, r3]\n\t"
  123165. "add r12, r2, r12\n\t"
  123166. "b L_sp_521_num_bits_17_18_%=\n\t"
  123167. "\n"
  123168. "L_sp_521_num_bits_17_2_1_%=: \n\t"
  123169. "and r3, r1, #0xff\n\t"
  123170. "mov r2, #0x40\n\t"
  123171. "ldrb r12, [lr, r3]\n\t"
  123172. "add r12, r2, r12\n\t"
  123173. "b L_sp_521_num_bits_17_18_%=\n\t"
  123174. "\n"
  123175. "L_sp_521_num_bits_17_2_%=: \n\t"
  123176. "ldr r1, [%[a], #4]\n\t"
  123177. "cmp r1, #0\n\t"
  123178. "beq L_sp_521_num_bits_17_1_%=\n\t"
  123179. "lsr r3, r1, #24\n\t"
  123180. "cmp r3, #0\n\t"
  123181. "beq L_sp_521_num_bits_17_1_3_%=\n\t"
  123182. "mov r2, #56\n\t"
  123183. "ldrb r12, [lr, r3]\n\t"
  123184. "add r12, r2, r12\n\t"
  123185. "b L_sp_521_num_bits_17_18_%=\n\t"
  123186. "\n"
  123187. "L_sp_521_num_bits_17_1_3_%=: \n\t"
  123188. "lsr r3, r1, #16\n\t"
  123189. "and r3, r3, #0xff\n\t"
  123190. "cmp r3, #0\n\t"
  123191. "beq L_sp_521_num_bits_17_1_2_%=\n\t"
  123192. "mov r2, #48\n\t"
  123193. "ldrb r12, [lr, r3]\n\t"
  123194. "add r12, r2, r12\n\t"
  123195. "b L_sp_521_num_bits_17_18_%=\n\t"
  123196. "\n"
  123197. "L_sp_521_num_bits_17_1_2_%=: \n\t"
  123198. "lsr r3, r1, #8\n\t"
  123199. "and r3, r3, #0xff\n\t"
  123200. "cmp r3, #0\n\t"
  123201. "beq L_sp_521_num_bits_17_1_1_%=\n\t"
  123202. "mov r2, #40\n\t"
  123203. "ldrb r12, [lr, r3]\n\t"
  123204. "add r12, r2, r12\n\t"
  123205. "b L_sp_521_num_bits_17_18_%=\n\t"
  123206. "\n"
  123207. "L_sp_521_num_bits_17_1_1_%=: \n\t"
  123208. "and r3, r1, #0xff\n\t"
  123209. "mov r2, #32\n\t"
  123210. "ldrb r12, [lr, r3]\n\t"
  123211. "add r12, r2, r12\n\t"
  123212. "b L_sp_521_num_bits_17_18_%=\n\t"
  123213. "\n"
  123214. "L_sp_521_num_bits_17_1_%=: \n\t"
  123215. "ldr r1, [%[a]]\n\t"
  123216. "lsr r3, r1, #24\n\t"
  123217. "cmp r3, #0\n\t"
  123218. "beq L_sp_521_num_bits_17_0_3_%=\n\t"
  123219. "mov r2, #24\n\t"
  123220. "ldrb r12, [lr, r3]\n\t"
  123221. "add r12, r2, r12\n\t"
  123222. "b L_sp_521_num_bits_17_18_%=\n\t"
  123223. "\n"
  123224. "L_sp_521_num_bits_17_0_3_%=: \n\t"
  123225. "lsr r3, r1, #16\n\t"
  123226. "and r3, r3, #0xff\n\t"
  123227. "cmp r3, #0\n\t"
  123228. "beq L_sp_521_num_bits_17_0_2_%=\n\t"
  123229. "mov r2, #16\n\t"
  123230. "ldrb r12, [lr, r3]\n\t"
  123231. "add r12, r2, r12\n\t"
  123232. "b L_sp_521_num_bits_17_18_%=\n\t"
  123233. "\n"
  123234. "L_sp_521_num_bits_17_0_2_%=: \n\t"
  123235. "lsr r3, r1, #8\n\t"
  123236. "and r3, r3, #0xff\n\t"
  123237. "cmp r3, #0\n\t"
  123238. "beq L_sp_521_num_bits_17_0_1_%=\n\t"
  123239. "mov r2, #8\n\t"
  123240. "ldrb r12, [lr, r3]\n\t"
  123241. "add r12, r2, r12\n\t"
  123242. "b L_sp_521_num_bits_17_18_%=\n\t"
  123243. "\n"
  123244. "L_sp_521_num_bits_17_0_1_%=: \n\t"
  123245. "and r3, r1, #0xff\n\t"
  123246. "ldrb r12, [lr, r3]\n\t"
  123247. "\n"
  123248. "L_sp_521_num_bits_17_18_%=: \n\t"
  123249. "mov %[a], r12\n\t"
  123250. : [a] "+r" (a), [L_sp_521_num_bits_17_table] "+r" (L_sp_521_num_bits_17_table_c)
  123251. :
  123252. : "memory", "r2", "r3", "r12", "lr", "cc"
  123253. );
  123254. return (uint32_t)(size_t)a;
  123255. }
  123256. #else
  123257. static int sp_521_num_bits_17(const sp_digit* a_p)
  123258. {
  123259. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  123260. __asm__ __volatile__ (
  123261. "ldr r1, [%[a], #64]\n\t"
  123262. "cmp r1, #0\n\t"
  123263. "beq L_sp_521_num_bits_17_16_%=\n\t"
  123264. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123265. "mov r2, #0x2\n\t"
  123266. "lsl r2, r2, #8\n\t"
  123267. "add r2, r2, #0x20\n\t"
  123268. #else
  123269. "mov r2, #0x220\n\t"
  123270. #endif
  123271. "clz r12, r1\n\t"
  123272. "sub r12, r2, r12\n\t"
  123273. "b L_sp_521_num_bits_17_18_%=\n\t"
  123274. "\n"
  123275. "L_sp_521_num_bits_17_16_%=: \n\t"
  123276. "ldr r1, [%[a], #60]\n\t"
  123277. "cmp r1, #0\n\t"
  123278. "beq L_sp_521_num_bits_17_15_%=\n\t"
  123279. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123280. "mov r2, #0x2\n\t"
  123281. "lsl r2, r2, #8\n\t"
  123282. "add r2, r2, #0x0\n\t"
  123283. #else
  123284. "mov r2, #0x200\n\t"
  123285. #endif
  123286. "clz r12, r1\n\t"
  123287. "sub r12, r2, r12\n\t"
  123288. "b L_sp_521_num_bits_17_18_%=\n\t"
  123289. "\n"
  123290. "L_sp_521_num_bits_17_15_%=: \n\t"
  123291. "ldr r1, [%[a], #56]\n\t"
  123292. "cmp r1, #0\n\t"
  123293. "beq L_sp_521_num_bits_17_14_%=\n\t"
  123294. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123295. "mov r2, #0x1\n\t"
  123296. "lsl r2, r2, #8\n\t"
  123297. "add r2, r2, #0xe0\n\t"
  123298. #else
  123299. "mov r2, #0x1e0\n\t"
  123300. #endif
  123301. "clz r12, r1\n\t"
  123302. "sub r12, r2, r12\n\t"
  123303. "b L_sp_521_num_bits_17_18_%=\n\t"
  123304. "\n"
  123305. "L_sp_521_num_bits_17_14_%=: \n\t"
  123306. "ldr r1, [%[a], #52]\n\t"
  123307. "cmp r1, #0\n\t"
  123308. "beq L_sp_521_num_bits_17_13_%=\n\t"
  123309. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123310. "mov r2, #0x1\n\t"
  123311. "lsl r2, r2, #8\n\t"
  123312. "add r2, r2, #0xc0\n\t"
  123313. #else
  123314. "mov r2, #0x1c0\n\t"
  123315. #endif
  123316. "clz r12, r1\n\t"
  123317. "sub r12, r2, r12\n\t"
  123318. "b L_sp_521_num_bits_17_18_%=\n\t"
  123319. "\n"
  123320. "L_sp_521_num_bits_17_13_%=: \n\t"
  123321. "ldr r1, [%[a], #48]\n\t"
  123322. "cmp r1, #0\n\t"
  123323. "beq L_sp_521_num_bits_17_12_%=\n\t"
  123324. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123325. "mov r2, #0x1\n\t"
  123326. "lsl r2, r2, #8\n\t"
  123327. "add r2, r2, #0xa0\n\t"
  123328. #else
  123329. "mov r2, #0x1a0\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_12_%=: \n\t"
  123336. "ldr r1, [%[a], #44]\n\t"
  123337. "cmp r1, #0\n\t"
  123338. "beq L_sp_521_num_bits_17_11_%=\n\t"
  123339. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  123340. "mov r2, #0x1\n\t"
  123341. "lsl r2, r2, #8\n\t"
  123342. "add r2, r2, #0x80\n\t"
  123343. #else
  123344. "mov r2, #0x180\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_11_%=: \n\t"
  123351. "ldr r1, [%[a], #40]\n\t"
  123352. "cmp r1, #0\n\t"
  123353. "beq L_sp_521_num_bits_17_10_%=\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, #0x60\n\t"
  123358. #else
  123359. "mov r2, #0x160\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_10_%=: \n\t"
  123366. "ldr r1, [%[a], #36]\n\t"
  123367. "cmp r1, #0\n\t"
  123368. "beq L_sp_521_num_bits_17_9_%=\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, #0x40\n\t"
  123373. #else
  123374. "mov r2, #0x140\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_9_%=: \n\t"
  123381. "ldr r1, [%[a], #32]\n\t"
  123382. "cmp r1, #0\n\t"
  123383. "beq L_sp_521_num_bits_17_8_%=\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, #0x20\n\t"
  123388. #else
  123389. "mov r2, #0x120\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_8_%=: \n\t"
  123396. "ldr r1, [%[a], #28]\n\t"
  123397. "cmp r1, #0\n\t"
  123398. "beq L_sp_521_num_bits_17_7_%=\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, #0x0\n\t"
  123403. #else
  123404. "mov r2, #0x100\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_7_%=: \n\t"
  123411. "ldr r1, [%[a], #24]\n\t"
  123412. "cmp r1, #0\n\t"
  123413. "beq L_sp_521_num_bits_17_6_%=\n\t"
  123414. "mov r2, #0xe0\n\t"
  123415. "clz r12, r1\n\t"
  123416. "sub r12, r2, r12\n\t"
  123417. "b L_sp_521_num_bits_17_18_%=\n\t"
  123418. "\n"
  123419. "L_sp_521_num_bits_17_6_%=: \n\t"
  123420. "ldr r1, [%[a], #20]\n\t"
  123421. "cmp r1, #0\n\t"
  123422. "beq L_sp_521_num_bits_17_5_%=\n\t"
  123423. "mov r2, #0xc0\n\t"
  123424. "clz r12, r1\n\t"
  123425. "sub r12, r2, r12\n\t"
  123426. "b L_sp_521_num_bits_17_18_%=\n\t"
  123427. "\n"
  123428. "L_sp_521_num_bits_17_5_%=: \n\t"
  123429. "ldr r1, [%[a], #16]\n\t"
  123430. "cmp r1, #0\n\t"
  123431. "beq L_sp_521_num_bits_17_4_%=\n\t"
  123432. "mov r2, #0xa0\n\t"
  123433. "clz r12, r1\n\t"
  123434. "sub r12, r2, r12\n\t"
  123435. "b L_sp_521_num_bits_17_18_%=\n\t"
  123436. "\n"
  123437. "L_sp_521_num_bits_17_4_%=: \n\t"
  123438. "ldr r1, [%[a], #12]\n\t"
  123439. "cmp r1, #0\n\t"
  123440. "beq L_sp_521_num_bits_17_3_%=\n\t"
  123441. "mov r2, #0x80\n\t"
  123442. "clz r12, r1\n\t"
  123443. "sub r12, r2, r12\n\t"
  123444. "b L_sp_521_num_bits_17_18_%=\n\t"
  123445. "\n"
  123446. "L_sp_521_num_bits_17_3_%=: \n\t"
  123447. "ldr r1, [%[a], #8]\n\t"
  123448. "cmp r1, #0\n\t"
  123449. "beq L_sp_521_num_bits_17_2_%=\n\t"
  123450. "mov r2, #0x60\n\t"
  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_2_%=: \n\t"
  123456. "ldr r1, [%[a], #4]\n\t"
  123457. "cmp r1, #0\n\t"
  123458. "beq L_sp_521_num_bits_17_1_%=\n\t"
  123459. "mov r2, #0x40\n\t"
  123460. "clz r12, r1\n\t"
  123461. "sub r12, r2, r12\n\t"
  123462. "b L_sp_521_num_bits_17_18_%=\n\t"
  123463. "\n"
  123464. "L_sp_521_num_bits_17_1_%=: \n\t"
  123465. "ldr r1, [%[a]]\n\t"
  123466. "mov r2, #32\n\t"
  123467. "clz r12, r1\n\t"
  123468. "sub r12, r2, r12\n\t"
  123469. "\n"
  123470. "L_sp_521_num_bits_17_18_%=: \n\t"
  123471. "mov %[a], r12\n\t"
  123472. : [a] "+r" (a)
  123473. :
  123474. : "memory", "r1", "r2", "r3", "r12", "lr", "cc"
  123475. );
  123476. return (uint32_t)(size_t)a;
  123477. }
  123478. #endif /* WOLFSSL_ARM_ARCH && (WOLFSSL_ARM_ARCH < 7) */
  123479. /* Non-constant time modular inversion.
  123480. *
  123481. * @param [out] r Resulting number.
  123482. * @param [in] a Number to invert.
  123483. * @param [in] m Modulus.
  123484. * @return MP_OKAY on success.
  123485. */
  123486. static int sp_521_mod_inv_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  123487. {
  123488. sp_digit u[17];
  123489. sp_digit v[17];
  123490. sp_digit b[17];
  123491. sp_digit d[17];
  123492. int ut, vt;
  123493. sp_digit o;
  123494. XMEMCPY(u, m, sizeof(u));
  123495. XMEMCPY(v, a, sizeof(v));
  123496. ut = sp_521_num_bits_17(u);
  123497. vt = sp_521_num_bits_17(v);
  123498. XMEMSET(b, 0, sizeof(b));
  123499. if ((v[0] & 1) == 0) {
  123500. sp_521_rshift1_17(v, v);
  123501. XMEMCPY(d, m, sizeof(u));
  123502. d[0] += 1;
  123503. sp_521_rshift1_17(d, d);
  123504. vt--;
  123505. while ((v[0] & 1) == 0) {
  123506. sp_521_rshift1_17(v, v);
  123507. sp_521_div2_mod_17(d, d, m);
  123508. vt--;
  123509. }
  123510. }
  123511. else {
  123512. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  123513. d[0] = 1;
  123514. }
  123515. while (ut > 1 && vt > 1) {
  123516. if ((ut > vt) || ((ut == vt) && (sp_521_cmp_17(u, v) >= 0))) {
  123517. sp_521_sub_17(u, u, v);
  123518. o = sp_521_sub_17(b, b, d);
  123519. if (o != 0)
  123520. sp_521_add_17(b, b, m);
  123521. ut = sp_521_num_bits_17(u);
  123522. do {
  123523. sp_521_rshift1_17(u, u);
  123524. sp_521_div2_mod_17(b, b, m);
  123525. ut--;
  123526. }
  123527. while (ut > 0 && (u[0] & 1) == 0);
  123528. }
  123529. else {
  123530. sp_521_sub_17(v, v, u);
  123531. o = sp_521_sub_17(d, d, b);
  123532. if (o != 0)
  123533. sp_521_add_17(d, d, m);
  123534. vt = sp_521_num_bits_17(v);
  123535. do {
  123536. sp_521_rshift1_17(v, v);
  123537. sp_521_div2_mod_17(d, d, m);
  123538. vt--;
  123539. }
  123540. while (vt > 0 && (v[0] & 1) == 0);
  123541. }
  123542. }
  123543. if (ut == 1)
  123544. XMEMCPY(r, b, sizeof(b));
  123545. else
  123546. XMEMCPY(r, d, sizeof(d));
  123547. return MP_OKAY;
  123548. }
  123549. #endif /* WOLFSSL_SP_SMALL */
  123550. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  123551. *
  123552. * p1 First point to add and holds result.
  123553. * p2 Second point to add.
  123554. * tmp Temporary storage for intermediate numbers.
  123555. */
  123556. static void sp_521_add_points_17(sp_point_521* p1, const sp_point_521* p2,
  123557. sp_digit* tmp)
  123558. {
  123559. sp_521_proj_point_add_17(p1, p1, p2, tmp);
  123560. if (sp_521_iszero_17(p1->z)) {
  123561. if (sp_521_iszero_17(p1->x) && sp_521_iszero_17(p1->y)) {
  123562. sp_521_proj_point_dbl_17(p1, p2, tmp);
  123563. }
  123564. else {
  123565. /* Y ordinate is not used from here - don't set. */
  123566. p1->x[0] = 0;
  123567. p1->x[1] = 0;
  123568. p1->x[2] = 0;
  123569. p1->x[3] = 0;
  123570. p1->x[4] = 0;
  123571. p1->x[5] = 0;
  123572. p1->x[6] = 0;
  123573. p1->x[7] = 0;
  123574. p1->x[8] = 0;
  123575. p1->x[9] = 0;
  123576. p1->x[10] = 0;
  123577. p1->x[11] = 0;
  123578. p1->x[12] = 0;
  123579. p1->x[13] = 0;
  123580. p1->x[14] = 0;
  123581. p1->x[15] = 0;
  123582. p1->x[16] = 0;
  123583. XMEMCPY(p1->z, p521_norm_mod, sizeof(p521_norm_mod));
  123584. }
  123585. }
  123586. }
  123587. /* Calculate the verification point: [e/s]G + [r/s]Q
  123588. *
  123589. * p1 Calculated point.
  123590. * p2 Public point and temporary.
  123591. * s Second part of signature as a number.
  123592. * u1 Temporary number.
  123593. * u2 Temporary number.
  123594. * heap Heap to use for allocation.
  123595. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  123596. */
  123597. static int sp_521_calc_vfy_point_17(sp_point_521* p1, sp_point_521* p2,
  123598. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  123599. {
  123600. int err;
  123601. #ifndef WOLFSSL_SP_SMALL
  123602. err = sp_521_mod_inv_17(s, s, p521_order);
  123603. if (err == MP_OKAY)
  123604. #endif /* !WOLFSSL_SP_SMALL */
  123605. {
  123606. sp_521_mul_17(s, s, p521_norm_order);
  123607. err = sp_521_mod_17(s, s, p521_order);
  123608. }
  123609. if (err == MP_OKAY) {
  123610. sp_521_norm_17(s);
  123611. #ifdef WOLFSSL_SP_SMALL
  123612. {
  123613. sp_521_mont_inv_order_17(s, s, tmp);
  123614. sp_521_mont_mul_order_17(u1, u1, s);
  123615. sp_521_mont_mul_order_17(u2, u2, s);
  123616. }
  123617. #else
  123618. {
  123619. sp_521_mont_mul_order_17(u1, u1, s);
  123620. sp_521_mont_mul_order_17(u2, u2, s);
  123621. }
  123622. #endif /* WOLFSSL_SP_SMALL */
  123623. {
  123624. err = sp_521_ecc_mulmod_base_17(p1, u1, 0, 0, heap);
  123625. }
  123626. }
  123627. if ((err == MP_OKAY) && sp_521_iszero_17(p1->z)) {
  123628. p1->infinity = 1;
  123629. }
  123630. if (err == MP_OKAY) {
  123631. err = sp_521_ecc_mulmod_17(p2, p2, u2, 0, 0, heap);
  123632. }
  123633. if ((err == MP_OKAY) && sp_521_iszero_17(p2->z)) {
  123634. p2->infinity = 1;
  123635. }
  123636. if (err == MP_OKAY) {
  123637. sp_521_add_points_17(p1, p2, tmp);
  123638. }
  123639. return err;
  123640. }
  123641. #ifdef HAVE_ECC_VERIFY
  123642. /* Verify the signature values with the hash and public key.
  123643. * e = Truncate(hash, 521)
  123644. * u1 = e/s mod order
  123645. * u2 = r/s mod order
  123646. * r == (u1.G + u2.Q)->x mod order
  123647. * Optimization: Leave point in projective form.
  123648. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  123649. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  123650. * The hash is truncated to the first 521 bits.
  123651. *
  123652. * hash Hash to sign.
  123653. * hashLen Length of the hash data.
  123654. * rng Random number generator.
  123655. * priv Private part of key - scalar.
  123656. * rm First part of result as an mp_int.
  123657. * sm Sirst part of result as an mp_int.
  123658. * heap Heap to use for allocation.
  123659. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  123660. */
  123661. int sp_ecc_verify_521(const byte* hash, word32 hashLen, const mp_int* pX,
  123662. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  123663. int* res, void* heap)
  123664. {
  123665. #ifdef WOLFSSL_SP_SMALL_STACK
  123666. sp_digit* u1 = NULL;
  123667. sp_point_521* p1 = NULL;
  123668. #else
  123669. sp_digit u1[18 * 17];
  123670. sp_point_521 p1[2];
  123671. #endif
  123672. sp_digit* u2 = NULL;
  123673. sp_digit* s = NULL;
  123674. sp_digit* tmp = NULL;
  123675. sp_point_521* p2 = NULL;
  123676. sp_digit carry;
  123677. sp_int32 c = 0;
  123678. int err = MP_OKAY;
  123679. #ifdef WOLFSSL_SP_SMALL_STACK
  123680. if (err == MP_OKAY) {
  123681. p1 = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  123682. DYNAMIC_TYPE_ECC);
  123683. if (p1 == NULL)
  123684. err = MEMORY_E;
  123685. }
  123686. if (err == MP_OKAY) {
  123687. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 17, heap,
  123688. DYNAMIC_TYPE_ECC);
  123689. if (u1 == NULL)
  123690. err = MEMORY_E;
  123691. }
  123692. #endif
  123693. if (err == MP_OKAY) {
  123694. u2 = u1 + 2 * 17;
  123695. s = u1 + 4 * 17;
  123696. tmp = u1 + 6 * 17;
  123697. p2 = p1 + 1;
  123698. if (hashLen > 66U) {
  123699. hashLen = 66U;
  123700. }
  123701. sp_521_from_bin(u1, 17, hash, (int)hashLen);
  123702. sp_521_from_mp(u2, 17, rm);
  123703. sp_521_from_mp(s, 17, sm);
  123704. sp_521_from_mp(p2->x, 17, pX);
  123705. sp_521_from_mp(p2->y, 17, pY);
  123706. sp_521_from_mp(p2->z, 17, pZ);
  123707. if (hashLen == 66U) {
  123708. sp_521_rshift_17(u1, u1, 7);
  123709. }
  123710. err = sp_521_calc_vfy_point_17(p1, p2, s, u1, u2, tmp, heap);
  123711. }
  123712. if (err == MP_OKAY) {
  123713. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  123714. /* Reload r and convert to Montgomery form. */
  123715. sp_521_from_mp(u2, 17, rm);
  123716. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  123717. }
  123718. if (err == MP_OKAY) {
  123719. /* u1 = r.z'.z' mod prime */
  123720. sp_521_mont_sqr_17(p1->z, p1->z, p521_mod, p521_mp_mod);
  123721. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  123722. *res = (int)(sp_521_cmp_17(p1->x, u1) == 0);
  123723. if (*res == 0) {
  123724. /* Reload r and add order. */
  123725. sp_521_from_mp(u2, 17, rm);
  123726. carry = sp_521_add_17(u2, u2, p521_order);
  123727. /* Carry means result is greater than mod and is not valid. */
  123728. if (carry == 0) {
  123729. sp_521_norm_17(u2);
  123730. /* Compare with mod and if greater or equal then not valid. */
  123731. c = sp_521_cmp_17(u2, p521_mod);
  123732. }
  123733. }
  123734. if ((*res == 0) && (c < 0)) {
  123735. /* Convert to Montogomery form */
  123736. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  123737. if (err == MP_OKAY) {
  123738. /* u1 = (r + 1*order).z'.z' mod prime */
  123739. {
  123740. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  123741. }
  123742. *res = (sp_521_cmp_17(p1->x, u1) == 0);
  123743. }
  123744. }
  123745. }
  123746. #ifdef WOLFSSL_SP_SMALL_STACK
  123747. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  123748. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  123749. #endif
  123750. return err;
  123751. }
  123752. #ifdef WOLFSSL_SP_NONBLOCK
  123753. typedef struct sp_ecc_verify_521_ctx {
  123754. int state;
  123755. union {
  123756. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  123757. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  123758. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  123759. sp_521_proj_point_add_17_ctx add_ctx;
  123760. };
  123761. sp_digit u1[2*17];
  123762. sp_digit u2[2*17];
  123763. sp_digit s[2*17];
  123764. sp_digit tmp[2*17 * 6];
  123765. sp_point_521 p1;
  123766. sp_point_521 p2;
  123767. } sp_ecc_verify_521_ctx;
  123768. int sp_ecc_verify_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  123769. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  123770. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  123771. {
  123772. int err = FP_WOULDBLOCK;
  123773. sp_ecc_verify_521_ctx* ctx = (sp_ecc_verify_521_ctx*)sp_ctx->data;
  123774. typedef char ctx_size_test[sizeof(sp_ecc_verify_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  123775. (void)sizeof(ctx_size_test);
  123776. switch (ctx->state) {
  123777. case 0: /* INIT */
  123778. if (hashLen > 66U) {
  123779. hashLen = 66U;
  123780. }
  123781. sp_521_from_bin(ctx->u1, 17, hash, (int)hashLen);
  123782. sp_521_from_mp(ctx->u2, 17, rm);
  123783. sp_521_from_mp(ctx->s, 17, sm);
  123784. sp_521_from_mp(ctx->p2.x, 17, pX);
  123785. sp_521_from_mp(ctx->p2.y, 17, pY);
  123786. sp_521_from_mp(ctx->p2.z, 17, pZ);
  123787. if (hashLen == 66U) {
  123788. sp_521_rshift_17(ctx->u1, ctx->u1, 7);
  123789. }
  123790. ctx->state = 1;
  123791. break;
  123792. case 1: /* NORMS0 */
  123793. sp_521_mul_17(ctx->s, ctx->s, p521_norm_order);
  123794. err = sp_521_mod_17(ctx->s, ctx->s, p521_order);
  123795. if (err == MP_OKAY)
  123796. ctx->state = 2;
  123797. break;
  123798. case 2: /* NORMS1 */
  123799. sp_521_norm_17(ctx->s);
  123800. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  123801. ctx->state = 3;
  123802. break;
  123803. case 3: /* NORMS2 */
  123804. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  123805. if (err == MP_OKAY) {
  123806. ctx->state = 4;
  123807. }
  123808. break;
  123809. case 4: /* NORMS3 */
  123810. sp_521_mont_mul_order_17(ctx->u1, ctx->u1, ctx->s);
  123811. ctx->state = 5;
  123812. break;
  123813. case 5: /* NORMS4 */
  123814. sp_521_mont_mul_order_17(ctx->u2, ctx->u2, ctx->s);
  123815. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  123816. ctx->state = 6;
  123817. break;
  123818. case 6: /* MULBASE */
  123819. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p521_base, ctx->u1, 0, 0, heap);
  123820. if (err == MP_OKAY) {
  123821. if (sp_521_iszero_17(ctx->p1.z)) {
  123822. ctx->p1.infinity = 1;
  123823. }
  123824. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  123825. ctx->state = 7;
  123826. }
  123827. break;
  123828. case 7: /* MULMOD */
  123829. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  123830. if (err == MP_OKAY) {
  123831. if (sp_521_iszero_17(ctx->p2.z)) {
  123832. ctx->p2.infinity = 1;
  123833. }
  123834. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  123835. ctx->state = 8;
  123836. }
  123837. break;
  123838. case 8: /* ADD */
  123839. err = sp_521_proj_point_add_17_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  123840. if (err == MP_OKAY)
  123841. ctx->state = 9;
  123842. break;
  123843. case 9: /* MONT */
  123844. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  123845. /* Reload r and convert to Montgomery form. */
  123846. sp_521_from_mp(ctx->u2, 17, rm);
  123847. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  123848. if (err == MP_OKAY)
  123849. ctx->state = 10;
  123850. break;
  123851. case 10: /* SQR */
  123852. /* u1 = r.z'.z' mod prime */
  123853. sp_521_mont_sqr_17(ctx->p1.z, ctx->p1.z, p521_mod, p521_mp_mod);
  123854. ctx->state = 11;
  123855. break;
  123856. case 11: /* MUL */
  123857. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod, p521_mp_mod);
  123858. ctx->state = 12;
  123859. break;
  123860. case 12: /* RES */
  123861. {
  123862. sp_int32 c = 0;
  123863. err = MP_OKAY; /* math okay, now check result */
  123864. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  123865. if (*res == 0) {
  123866. sp_digit carry;
  123867. /* Reload r and add order. */
  123868. sp_521_from_mp(ctx->u2, 17, rm);
  123869. carry = sp_521_add_17(ctx->u2, ctx->u2, p521_order);
  123870. /* Carry means result is greater than mod and is not valid. */
  123871. if (carry == 0) {
  123872. sp_521_norm_17(ctx->u2);
  123873. /* Compare with mod and if greater or equal then not valid. */
  123874. c = sp_521_cmp_17(ctx->u2, p521_mod);
  123875. }
  123876. }
  123877. if ((*res == 0) && (c < 0)) {
  123878. /* Convert to Montogomery form */
  123879. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  123880. if (err == MP_OKAY) {
  123881. /* u1 = (r + 1*order).z'.z' mod prime */
  123882. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod,
  123883. p521_mp_mod);
  123884. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  123885. }
  123886. }
  123887. break;
  123888. }
  123889. } /* switch */
  123890. if (err == MP_OKAY && ctx->state != 12) {
  123891. err = FP_WOULDBLOCK;
  123892. }
  123893. return err;
  123894. }
  123895. #endif /* WOLFSSL_SP_NONBLOCK */
  123896. #endif /* HAVE_ECC_VERIFY */
  123897. #ifdef HAVE_ECC_CHECK_KEY
  123898. /* Check that the x and y ordinates are a valid point on the curve.
  123899. *
  123900. * point EC point.
  123901. * heap Heap to use if dynamically allocating.
  123902. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  123903. * not on the curve and MP_OKAY otherwise.
  123904. */
  123905. static int sp_521_ecc_is_point_17(const sp_point_521* point,
  123906. void* heap)
  123907. {
  123908. #ifdef WOLFSSL_SP_SMALL_STACK
  123909. sp_digit* t1 = NULL;
  123910. #else
  123911. sp_digit t1[17 * 4];
  123912. #endif
  123913. sp_digit* t2 = NULL;
  123914. int err = MP_OKAY;
  123915. #ifdef WOLFSSL_SP_SMALL_STACK
  123916. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17 * 4, heap, DYNAMIC_TYPE_ECC);
  123917. if (t1 == NULL)
  123918. err = MEMORY_E;
  123919. #endif
  123920. (void)heap;
  123921. if (err == MP_OKAY) {
  123922. t2 = t1 + 2 * 17;
  123923. /* y^2 - x^3 - a.x = b */
  123924. sp_521_sqr_17(t1, point->y);
  123925. (void)sp_521_mod_17(t1, t1, p521_mod);
  123926. sp_521_sqr_17(t2, point->x);
  123927. (void)sp_521_mod_17(t2, t2, p521_mod);
  123928. sp_521_mul_17(t2, t2, point->x);
  123929. (void)sp_521_mod_17(t2, t2, p521_mod);
  123930. sp_521_mont_sub_17(t1, t1, t2, p521_mod);
  123931. /* y^2 - x^3 + 3.x = b, when a = -3 */
  123932. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  123933. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  123934. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  123935. if (sp_521_cmp_17(t1, p521_b) != 0) {
  123936. err = MP_VAL;
  123937. }
  123938. }
  123939. #ifdef WOLFSSL_SP_SMALL_STACK
  123940. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  123941. #endif
  123942. return err;
  123943. }
  123944. /* Check that the x and y ordinates are a valid point on the curve.
  123945. *
  123946. * pX X ordinate of EC point.
  123947. * pY Y ordinate of EC point.
  123948. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  123949. * not on the curve and MP_OKAY otherwise.
  123950. */
  123951. int sp_ecc_is_point_521(const mp_int* pX, const mp_int* pY)
  123952. {
  123953. #ifdef WOLFSSL_SP_SMALL_STACK
  123954. sp_point_521* pub = NULL;
  123955. #else
  123956. sp_point_521 pub[1];
  123957. #endif
  123958. const byte one[1] = { 1 };
  123959. int err = MP_OKAY;
  123960. #ifdef WOLFSSL_SP_SMALL_STACK
  123961. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  123962. DYNAMIC_TYPE_ECC);
  123963. if (pub == NULL)
  123964. err = MEMORY_E;
  123965. #endif
  123966. if (err == MP_OKAY) {
  123967. sp_521_from_mp(pub->x, 17, pX);
  123968. sp_521_from_mp(pub->y, 17, pY);
  123969. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  123970. err = sp_521_ecc_is_point_17(pub, NULL);
  123971. }
  123972. #ifdef WOLFSSL_SP_SMALL_STACK
  123973. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  123974. #endif
  123975. return err;
  123976. }
  123977. /* Check that the private scalar generates the EC point (px, py), the point is
  123978. * on the curve and the point has the correct order.
  123979. *
  123980. * pX X ordinate of EC point.
  123981. * pY Y ordinate of EC point.
  123982. * privm Private scalar that generates EC point.
  123983. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  123984. * not on the curve, ECC_INF_E if the point does not have the correct order,
  123985. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  123986. * MP_OKAY otherwise.
  123987. */
  123988. int sp_ecc_check_key_521(const mp_int* pX, const mp_int* pY,
  123989. const mp_int* privm, void* heap)
  123990. {
  123991. #ifdef WOLFSSL_SP_SMALL_STACK
  123992. sp_digit* priv = NULL;
  123993. sp_point_521* pub = NULL;
  123994. #else
  123995. sp_digit priv[17];
  123996. sp_point_521 pub[2];
  123997. #endif
  123998. sp_point_521* p = NULL;
  123999. const byte one[1] = { 1 };
  124000. int err = MP_OKAY;
  124001. /* Quick check the lengs of public key ordinates and private key are in
  124002. * range. Proper check later.
  124003. */
  124004. if (((mp_count_bits(pX) > 521) ||
  124005. (mp_count_bits(pY) > 521) ||
  124006. ((privm != NULL) && (mp_count_bits(privm) > 521)))) {
  124007. err = ECC_OUT_OF_RANGE_E;
  124008. }
  124009. #ifdef WOLFSSL_SP_SMALL_STACK
  124010. if (err == MP_OKAY) {
  124011. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  124012. DYNAMIC_TYPE_ECC);
  124013. if (pub == NULL)
  124014. err = MEMORY_E;
  124015. }
  124016. if (err == MP_OKAY && privm) {
  124017. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  124018. DYNAMIC_TYPE_ECC);
  124019. if (priv == NULL)
  124020. err = MEMORY_E;
  124021. }
  124022. #endif
  124023. if (err == MP_OKAY) {
  124024. p = pub + 1;
  124025. sp_521_from_mp(pub->x, 17, pX);
  124026. sp_521_from_mp(pub->y, 17, pY);
  124027. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  124028. if (privm)
  124029. sp_521_from_mp(priv, 17, privm);
  124030. /* Check point at infinitiy. */
  124031. if ((sp_521_iszero_17(pub->x) != 0) &&
  124032. (sp_521_iszero_17(pub->y) != 0)) {
  124033. err = ECC_INF_E;
  124034. }
  124035. }
  124036. /* Check range of X and Y */
  124037. if ((err == MP_OKAY) &&
  124038. ((sp_521_cmp_17(pub->x, p521_mod) >= 0) ||
  124039. (sp_521_cmp_17(pub->y, p521_mod) >= 0))) {
  124040. err = ECC_OUT_OF_RANGE_E;
  124041. }
  124042. if (err == MP_OKAY) {
  124043. /* Check point is on curve */
  124044. err = sp_521_ecc_is_point_17(pub, heap);
  124045. }
  124046. if (err == MP_OKAY) {
  124047. /* Point * order = infinity */
  124048. err = sp_521_ecc_mulmod_17(p, pub, p521_order, 1, 1, heap);
  124049. }
  124050. /* Check result is infinity */
  124051. if ((err == MP_OKAY) && ((sp_521_iszero_17(p->x) == 0) ||
  124052. (sp_521_iszero_17(p->y) == 0))) {
  124053. err = ECC_INF_E;
  124054. }
  124055. if (privm) {
  124056. if (err == MP_OKAY) {
  124057. /* Base * private = point */
  124058. err = sp_521_ecc_mulmod_base_17(p, priv, 1, 1, heap);
  124059. }
  124060. /* Check result is public key */
  124061. if ((err == MP_OKAY) &&
  124062. ((sp_521_cmp_17(p->x, pub->x) != 0) ||
  124063. (sp_521_cmp_17(p->y, pub->y) != 0))) {
  124064. err = ECC_PRIV_KEY_E;
  124065. }
  124066. }
  124067. #ifdef WOLFSSL_SP_SMALL_STACK
  124068. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  124069. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  124070. #endif
  124071. return err;
  124072. }
  124073. #endif
  124074. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  124075. /* Add two projective EC points together.
  124076. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  124077. *
  124078. * pX First EC point's X ordinate.
  124079. * pY First EC point's Y ordinate.
  124080. * pZ First EC point's Z ordinate.
  124081. * qX Second EC point's X ordinate.
  124082. * qY Second EC point's Y ordinate.
  124083. * qZ Second EC point's Z ordinate.
  124084. * rX Resultant EC point's X ordinate.
  124085. * rY Resultant EC point's Y ordinate.
  124086. * rZ Resultant EC point's Z ordinate.
  124087. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  124088. */
  124089. int sp_ecc_proj_add_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  124090. mp_int* qX, mp_int* qY, mp_int* qZ,
  124091. mp_int* rX, mp_int* rY, mp_int* rZ)
  124092. {
  124093. #ifdef WOLFSSL_SP_SMALL_STACK
  124094. sp_digit* tmp = NULL;
  124095. sp_point_521* p = NULL;
  124096. #else
  124097. sp_digit tmp[2 * 17 * 6];
  124098. sp_point_521 p[2];
  124099. #endif
  124100. sp_point_521* q = NULL;
  124101. int err = MP_OKAY;
  124102. #ifdef WOLFSSL_SP_SMALL_STACK
  124103. if (err == MP_OKAY) {
  124104. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, NULL,
  124105. DYNAMIC_TYPE_ECC);
  124106. if (p == NULL)
  124107. err = MEMORY_E;
  124108. }
  124109. if (err == MP_OKAY) {
  124110. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, NULL,
  124111. DYNAMIC_TYPE_ECC);
  124112. if (tmp == NULL) {
  124113. err = MEMORY_E;
  124114. }
  124115. }
  124116. #endif
  124117. if (err == MP_OKAY) {
  124118. q = p + 1;
  124119. sp_521_from_mp(p->x, 17, pX);
  124120. sp_521_from_mp(p->y, 17, pY);
  124121. sp_521_from_mp(p->z, 17, pZ);
  124122. sp_521_from_mp(q->x, 17, qX);
  124123. sp_521_from_mp(q->y, 17, qY);
  124124. sp_521_from_mp(q->z, 17, qZ);
  124125. p->infinity = sp_521_iszero_17(p->x) &
  124126. sp_521_iszero_17(p->y);
  124127. q->infinity = sp_521_iszero_17(q->x) &
  124128. sp_521_iszero_17(q->y);
  124129. sp_521_proj_point_add_17(p, p, q, tmp);
  124130. }
  124131. if (err == MP_OKAY) {
  124132. err = sp_521_to_mp(p->x, rX);
  124133. }
  124134. if (err == MP_OKAY) {
  124135. err = sp_521_to_mp(p->y, rY);
  124136. }
  124137. if (err == MP_OKAY) {
  124138. err = sp_521_to_mp(p->z, rZ);
  124139. }
  124140. #ifdef WOLFSSL_SP_SMALL_STACK
  124141. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  124142. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  124143. #endif
  124144. return err;
  124145. }
  124146. /* Double a projective EC point.
  124147. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  124148. *
  124149. * pX EC point's X ordinate.
  124150. * pY EC point's Y ordinate.
  124151. * pZ EC point's Z ordinate.
  124152. * rX Resultant EC point's X ordinate.
  124153. * rY Resultant EC point's Y ordinate.
  124154. * rZ Resultant EC point's Z ordinate.
  124155. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  124156. */
  124157. int sp_ecc_proj_dbl_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  124158. mp_int* rX, mp_int* rY, mp_int* rZ)
  124159. {
  124160. #ifdef WOLFSSL_SP_SMALL_STACK
  124161. sp_digit* tmp = NULL;
  124162. sp_point_521* p = NULL;
  124163. #else
  124164. sp_digit tmp[2 * 17 * 2];
  124165. sp_point_521 p[1];
  124166. #endif
  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), 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 * 2, NULL,
  124177. DYNAMIC_TYPE_ECC);
  124178. if (tmp == NULL)
  124179. err = MEMORY_E;
  124180. }
  124181. #endif
  124182. if (err == MP_OKAY) {
  124183. sp_521_from_mp(p->x, 17, pX);
  124184. sp_521_from_mp(p->y, 17, pY);
  124185. sp_521_from_mp(p->z, 17, pZ);
  124186. p->infinity = sp_521_iszero_17(p->x) &
  124187. sp_521_iszero_17(p->y);
  124188. sp_521_proj_point_dbl_17(p, p, tmp);
  124189. }
  124190. if (err == MP_OKAY) {
  124191. err = sp_521_to_mp(p->x, rX);
  124192. }
  124193. if (err == MP_OKAY) {
  124194. err = sp_521_to_mp(p->y, rY);
  124195. }
  124196. if (err == MP_OKAY) {
  124197. err = sp_521_to_mp(p->z, rZ);
  124198. }
  124199. #ifdef WOLFSSL_SP_SMALL_STACK
  124200. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  124201. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  124202. #endif
  124203. return err;
  124204. }
  124205. /* Map a projective EC point to affine in place.
  124206. * pZ will be one.
  124207. *
  124208. * pX EC point's X ordinate.
  124209. * pY EC point's Y ordinate.
  124210. * pZ EC point's Z ordinate.
  124211. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  124212. */
  124213. int sp_ecc_map_521(mp_int* pX, mp_int* pY, mp_int* pZ)
  124214. {
  124215. #ifdef WOLFSSL_SP_SMALL_STACK
  124216. sp_digit* tmp = NULL;
  124217. sp_point_521* p = NULL;
  124218. #else
  124219. sp_digit tmp[2 * 17 * 5];
  124220. sp_point_521 p[1];
  124221. #endif
  124222. int err = MP_OKAY;
  124223. #ifdef WOLFSSL_SP_SMALL_STACK
  124224. if (err == MP_OKAY) {
  124225. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  124226. DYNAMIC_TYPE_ECC);
  124227. if (p == NULL)
  124228. err = MEMORY_E;
  124229. }
  124230. if (err == MP_OKAY) {
  124231. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 5, NULL,
  124232. DYNAMIC_TYPE_ECC);
  124233. if (tmp == NULL)
  124234. err = MEMORY_E;
  124235. }
  124236. #endif
  124237. if (err == MP_OKAY) {
  124238. sp_521_from_mp(p->x, 17, pX);
  124239. sp_521_from_mp(p->y, 17, pY);
  124240. sp_521_from_mp(p->z, 17, pZ);
  124241. p->infinity = sp_521_iszero_17(p->x) &
  124242. sp_521_iszero_17(p->y);
  124243. sp_521_map_17(p, p, tmp);
  124244. }
  124245. if (err == MP_OKAY) {
  124246. err = sp_521_to_mp(p->x, pX);
  124247. }
  124248. if (err == MP_OKAY) {
  124249. err = sp_521_to_mp(p->y, pY);
  124250. }
  124251. if (err == MP_OKAY) {
  124252. err = sp_521_to_mp(p->z, pZ);
  124253. }
  124254. #ifdef WOLFSSL_SP_SMALL_STACK
  124255. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  124256. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  124257. #endif
  124258. return err;
  124259. }
  124260. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  124261. #ifdef HAVE_COMP_KEY
  124262. /* Square root power for the P521 curve. */
  124263. static const uint32_t p521_sqrt_power[17] = {
  124264. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  124265. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  124266. 0x00000000,0x00000000,0x00000080
  124267. };
  124268. /* Find the square root of a number mod the prime of the curve.
  124269. *
  124270. * y The number to operate on and the result.
  124271. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  124272. */
  124273. static int sp_521_mont_sqrt_17(sp_digit* y)
  124274. {
  124275. #ifdef WOLFSSL_SP_SMALL_STACK
  124276. sp_digit* t = NULL;
  124277. #else
  124278. sp_digit t[2 * 17];
  124279. #endif
  124280. int err = MP_OKAY;
  124281. #ifdef WOLFSSL_SP_SMALL_STACK
  124282. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17, NULL, DYNAMIC_TYPE_ECC);
  124283. if (t == NULL)
  124284. err = MEMORY_E;
  124285. #endif
  124286. if (err == MP_OKAY) {
  124287. {
  124288. int i;
  124289. XMEMCPY(t, y, sizeof(sp_digit) * 17);
  124290. for (i=518; i>=0; i--) {
  124291. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  124292. if (p521_sqrt_power[i / 32] & ((sp_digit)1 << (i % 32)))
  124293. sp_521_mont_mul_17(t, t, y, p521_mod, p521_mp_mod);
  124294. }
  124295. XMEMCPY(y, t, sizeof(sp_digit) * 17);
  124296. }
  124297. }
  124298. #ifdef WOLFSSL_SP_SMALL_STACK
  124299. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  124300. #endif
  124301. return err;
  124302. }
  124303. /* Uncompress the point given the X ordinate.
  124304. *
  124305. * xm X ordinate.
  124306. * odd Whether the Y ordinate is odd.
  124307. * ym Calculated Y ordinate.
  124308. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  124309. */
  124310. int sp_ecc_uncompress_521(mp_int* xm, int odd, mp_int* ym)
  124311. {
  124312. #ifdef WOLFSSL_SP_SMALL_STACK
  124313. sp_digit* x = NULL;
  124314. #else
  124315. sp_digit x[4 * 17];
  124316. #endif
  124317. sp_digit* y = NULL;
  124318. int err = MP_OKAY;
  124319. #ifdef WOLFSSL_SP_SMALL_STACK
  124320. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 17, NULL, DYNAMIC_TYPE_ECC);
  124321. if (x == NULL)
  124322. err = MEMORY_E;
  124323. #endif
  124324. if (err == MP_OKAY) {
  124325. y = x + 2 * 17;
  124326. sp_521_from_mp(x, 17, xm);
  124327. err = sp_521_mod_mul_norm_17(x, x, p521_mod);
  124328. }
  124329. if (err == MP_OKAY) {
  124330. /* y = x^3 */
  124331. {
  124332. sp_521_mont_sqr_17(y, x, p521_mod, p521_mp_mod);
  124333. sp_521_mont_mul_17(y, y, x, p521_mod, p521_mp_mod);
  124334. }
  124335. /* y = x^3 - 3x */
  124336. sp_521_mont_sub_17(y, y, x, p521_mod);
  124337. sp_521_mont_sub_17(y, y, x, p521_mod);
  124338. sp_521_mont_sub_17(y, y, x, p521_mod);
  124339. /* y = x^3 - 3x + b */
  124340. err = sp_521_mod_mul_norm_17(x, p521_b, p521_mod);
  124341. }
  124342. if (err == MP_OKAY) {
  124343. sp_521_mont_add_17(y, y, x, p521_mod);
  124344. /* y = sqrt(x^3 - 3x + b) */
  124345. err = sp_521_mont_sqrt_17(y);
  124346. }
  124347. if (err == MP_OKAY) {
  124348. XMEMSET(y + 17, 0, 17U * sizeof(sp_digit));
  124349. sp_521_mont_reduce_17(y, p521_mod, p521_mp_mod);
  124350. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  124351. sp_521_mont_sub_17(y, p521_mod, y, p521_mod);
  124352. }
  124353. err = sp_521_to_mp(y, ym);
  124354. }
  124355. #ifdef WOLFSSL_SP_SMALL_STACK
  124356. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  124357. #endif
  124358. return err;
  124359. }
  124360. #endif
  124361. #endif /* WOLFSSL_SP_521 */
  124362. #ifdef WOLFCRYPT_HAVE_SAKKE
  124363. #ifdef WOLFSSL_SP_1024
  124364. /* Point structure to use. */
  124365. typedef struct sp_point_1024 {
  124366. /* X ordinate of point. */
  124367. sp_digit x[2 * 32];
  124368. /* Y ordinate of point. */
  124369. sp_digit y[2 * 32];
  124370. /* Z ordinate of point. */
  124371. sp_digit z[2 * 32];
  124372. /* Indicates point is at infinity. */
  124373. int infinity;
  124374. } sp_point_1024;
  124375. #ifndef WOLFSSL_SP_SMALL
  124376. /* Multiply a and b into r. (r = a * b)
  124377. *
  124378. * r A single precision integer.
  124379. * a A single precision integer.
  124380. * b A single precision integer.
  124381. */
  124382. static void sp_1024_mul_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  124383. {
  124384. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  124385. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  124386. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  124387. __asm__ __volatile__ (
  124388. "sub sp, sp, #0x40\n\t"
  124389. /* A[0] * B[0] */
  124390. "ldr r11, [%[a]]\n\t"
  124391. "ldr r12, [%[b]]\n\t"
  124392. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124393. "lsl r6, r11, #16\n\t"
  124394. "lsl r3, r12, #16\n\t"
  124395. "lsr r6, r6, #16\n\t"
  124396. "lsr r3, r3, #16\n\t"
  124397. "mul r3, r6, r3\n\t"
  124398. "lsr r7, r12, #16\n\t"
  124399. "mul r6, r7, r6\n\t"
  124400. "lsr r4, r6, #16\n\t"
  124401. "lsl r6, r6, #16\n\t"
  124402. "adds r3, r3, r6\n\t"
  124403. "adc r4, r4, #0\n\t"
  124404. "lsr r6, r11, #16\n\t"
  124405. "mul r7, r6, r7\n\t"
  124406. "add r4, r4, r7\n\t"
  124407. "lsl r7, r12, #16\n\t"
  124408. "lsr r7, r7, #16\n\t"
  124409. "mul r6, r7, r6\n\t"
  124410. "lsr r7, r6, #16\n\t"
  124411. "lsl r6, r6, #16\n\t"
  124412. "adds r3, r3, r6\n\t"
  124413. "adc r4, r4, r7\n\t"
  124414. "mov r5, #0\n\t"
  124415. #else
  124416. "umull r3, r4, r11, r12\n\t"
  124417. "mov r5, #0\n\t"
  124418. #endif
  124419. "str r3, [sp]\n\t"
  124420. /* A[0] * B[1] */
  124421. "ldr r9, [%[b], #4]\n\t"
  124422. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124423. "lsl r6, r11, #16\n\t"
  124424. "lsl r7, r9, #16\n\t"
  124425. "lsr r6, r6, #16\n\t"
  124426. "lsr r7, r7, #16\n\t"
  124427. "mul r7, r6, r7\n\t"
  124428. "adds r4, r4, r7\n\t"
  124429. "adcs r5, r5, #0\n\t"
  124430. "mov r3, #0\n\t"
  124431. "adc r3, r3, #0\n\t"
  124432. "lsr r7, r9, #16\n\t"
  124433. "mul r6, r7, r6\n\t"
  124434. "lsr r7, r6, #16\n\t"
  124435. "lsl r6, r6, #16\n\t"
  124436. "adds r4, r4, r6\n\t"
  124437. "adcs r5, r5, r7\n\t"
  124438. "adc r3, r3, #0\n\t"
  124439. "lsr r6, r11, #16\n\t"
  124440. "lsr r7, r9, #16\n\t"
  124441. "mul r7, r6, r7\n\t"
  124442. "adds r5, r5, r7\n\t"
  124443. "adc r3, r3, #0\n\t"
  124444. "lsl r7, r9, #16\n\t"
  124445. "lsr r7, r7, #16\n\t"
  124446. "mul r6, r7, r6\n\t"
  124447. "lsr r7, r6, #16\n\t"
  124448. "lsl r6, r6, #16\n\t"
  124449. "adds r4, r4, r6\n\t"
  124450. "adcs r5, r5, r7\n\t"
  124451. "adc r3, r3, #0\n\t"
  124452. #else
  124453. "umull r6, r7, r11, r9\n\t"
  124454. "adds r4, r4, r6\n\t"
  124455. "adcs r5, r5, r7\n\t"
  124456. "mov r3, #0\n\t"
  124457. "adc r3, r3, #0\n\t"
  124458. #endif
  124459. /* A[1] * B[0] */
  124460. "ldr r8, [%[a], #4]\n\t"
  124461. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124462. "lsl r6, r8, #16\n\t"
  124463. "lsl r7, r12, #16\n\t"
  124464. "lsr r6, r6, #16\n\t"
  124465. "lsr r7, r7, #16\n\t"
  124466. "mul r7, r6, r7\n\t"
  124467. "adds r4, r4, r7\n\t"
  124468. "adcs r5, r5, #0\n\t"
  124469. "adc r3, r3, #0\n\t"
  124470. "lsr r7, r12, #16\n\t"
  124471. "mul r6, r7, r6\n\t"
  124472. "lsr r7, r6, #16\n\t"
  124473. "lsl r6, r6, #16\n\t"
  124474. "adds r4, r4, r6\n\t"
  124475. "adcs r5, r5, r7\n\t"
  124476. "adc r3, r3, #0\n\t"
  124477. "lsr r6, r8, #16\n\t"
  124478. "lsr r7, r12, #16\n\t"
  124479. "mul r7, r6, r7\n\t"
  124480. "adds r5, r5, r7\n\t"
  124481. "adc r3, r3, #0\n\t"
  124482. "lsl r7, r12, #16\n\t"
  124483. "lsr r7, r7, #16\n\t"
  124484. "mul r6, r7, r6\n\t"
  124485. "lsr r7, r6, #16\n\t"
  124486. "lsl r6, r6, #16\n\t"
  124487. "adds r4, r4, r6\n\t"
  124488. "adcs r5, r5, r7\n\t"
  124489. "adc r3, r3, #0\n\t"
  124490. #else
  124491. "umull r6, r7, r8, r12\n\t"
  124492. "adds r4, r4, r6\n\t"
  124493. "adcs r5, r5, r7\n\t"
  124494. "adc r3, r3, #0\n\t"
  124495. #endif
  124496. "str r4, [sp, #4]\n\t"
  124497. /* A[2] * B[0] */
  124498. "ldr r8, [%[a], #8]\n\t"
  124499. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124500. "lsl r6, r8, #16\n\t"
  124501. "lsl r7, r12, #16\n\t"
  124502. "lsr r6, r6, #16\n\t"
  124503. "lsr r7, r7, #16\n\t"
  124504. "mul r7, r6, r7\n\t"
  124505. "adds r5, r5, r7\n\t"
  124506. "adcs r3, r3, #0\n\t"
  124507. "mov r4, #0\n\t"
  124508. "adc r4, r4, #0\n\t"
  124509. "lsr r7, r12, #16\n\t"
  124510. "mul r6, r7, r6\n\t"
  124511. "lsr r7, r6, #16\n\t"
  124512. "lsl r6, r6, #16\n\t"
  124513. "adds r5, r5, r6\n\t"
  124514. "adcs r3, r3, r7\n\t"
  124515. "adc r4, r4, #0\n\t"
  124516. "lsr r6, r8, #16\n\t"
  124517. "lsr r7, r12, #16\n\t"
  124518. "mul r7, r6, r7\n\t"
  124519. "adds r3, r3, r7\n\t"
  124520. "adc r4, r4, #0\n\t"
  124521. "lsl r7, r12, #16\n\t"
  124522. "lsr r7, r7, #16\n\t"
  124523. "mul r6, r7, r6\n\t"
  124524. "lsr r7, r6, #16\n\t"
  124525. "lsl r6, r6, #16\n\t"
  124526. "adds r5, r5, r6\n\t"
  124527. "adcs r3, r3, r7\n\t"
  124528. "adc r4, r4, #0\n\t"
  124529. #else
  124530. "umull r6, r7, r8, r12\n\t"
  124531. "adds r5, r5, r6\n\t"
  124532. "adcs r3, r3, r7\n\t"
  124533. "mov r4, #0\n\t"
  124534. "adc r4, r4, #0\n\t"
  124535. #endif
  124536. /* A[1] * B[1] */
  124537. "ldr r11, [%[a], #4]\n\t"
  124538. "ldr r12, [%[b], #4]\n\t"
  124539. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124540. "lsl r6, r11, #16\n\t"
  124541. "lsl r7, r12, #16\n\t"
  124542. "lsr r6, r6, #16\n\t"
  124543. "lsr r7, r7, #16\n\t"
  124544. "mul r7, r6, r7\n\t"
  124545. "adds r5, r5, r7\n\t"
  124546. "adcs r3, r3, #0\n\t"
  124547. "adc r4, r4, #0\n\t"
  124548. "lsr r7, r12, #16\n\t"
  124549. "mul r6, r7, r6\n\t"
  124550. "lsr r7, r6, #16\n\t"
  124551. "lsl r6, r6, #16\n\t"
  124552. "adds r5, r5, r6\n\t"
  124553. "adcs r3, r3, r7\n\t"
  124554. "adc r4, r4, #0\n\t"
  124555. "lsr r6, r11, #16\n\t"
  124556. "lsr r7, r12, #16\n\t"
  124557. "mul r7, r6, r7\n\t"
  124558. "adds r3, r3, r7\n\t"
  124559. "adc r4, r4, #0\n\t"
  124560. "lsl r7, r12, #16\n\t"
  124561. "lsr r7, r7, #16\n\t"
  124562. "mul r6, r7, r6\n\t"
  124563. "lsr r7, r6, #16\n\t"
  124564. "lsl r6, r6, #16\n\t"
  124565. "adds r5, r5, r6\n\t"
  124566. "adcs r3, r3, r7\n\t"
  124567. "adc r4, r4, #0\n\t"
  124568. #else
  124569. "umull r6, r7, r11, r12\n\t"
  124570. "adds r5, r5, r6\n\t"
  124571. "adcs r3, r3, r7\n\t"
  124572. "adc r4, r4, #0\n\t"
  124573. #endif
  124574. /* A[0] * B[2] */
  124575. "ldr r8, [%[a]]\n\t"
  124576. "ldr r9, [%[b], #8]\n\t"
  124577. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124578. "lsl r6, r8, #16\n\t"
  124579. "lsl r7, r9, #16\n\t"
  124580. "lsr r6, r6, #16\n\t"
  124581. "lsr r7, r7, #16\n\t"
  124582. "mul r7, r6, r7\n\t"
  124583. "adds r5, r5, r7\n\t"
  124584. "adcs r3, r3, #0\n\t"
  124585. "adc r4, r4, #0\n\t"
  124586. "lsr r7, r9, #16\n\t"
  124587. "mul r6, r7, r6\n\t"
  124588. "lsr r7, r6, #16\n\t"
  124589. "lsl r6, r6, #16\n\t"
  124590. "adds r5, r5, r6\n\t"
  124591. "adcs r3, r3, r7\n\t"
  124592. "adc r4, r4, #0\n\t"
  124593. "lsr r6, r8, #16\n\t"
  124594. "lsr r7, r9, #16\n\t"
  124595. "mul r7, r6, r7\n\t"
  124596. "adds r3, r3, r7\n\t"
  124597. "adc r4, r4, #0\n\t"
  124598. "lsl r7, r9, #16\n\t"
  124599. "lsr r7, r7, #16\n\t"
  124600. "mul r6, r7, r6\n\t"
  124601. "lsr r7, r6, #16\n\t"
  124602. "lsl r6, r6, #16\n\t"
  124603. "adds r5, r5, r6\n\t"
  124604. "adcs r3, r3, r7\n\t"
  124605. "adc r4, r4, #0\n\t"
  124606. #else
  124607. "umull r6, r7, r8, r9\n\t"
  124608. "adds r5, r5, r6\n\t"
  124609. "adcs r3, r3, r7\n\t"
  124610. "adc r4, r4, #0\n\t"
  124611. #endif
  124612. "str r5, [sp, #8]\n\t"
  124613. /* A[0] * B[3] */
  124614. "ldr r9, [%[b], #12]\n\t"
  124615. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124616. "lsl r6, r8, #16\n\t"
  124617. "lsl r7, r9, #16\n\t"
  124618. "lsr r6, r6, #16\n\t"
  124619. "lsr r7, r7, #16\n\t"
  124620. "mul r7, r6, r7\n\t"
  124621. "adds r3, r3, r7\n\t"
  124622. "adcs r4, r4, #0\n\t"
  124623. "mov r5, #0\n\t"
  124624. "adc r5, r5, #0\n\t"
  124625. "lsr r7, r9, #16\n\t"
  124626. "mul r6, r7, r6\n\t"
  124627. "lsr r7, r6, #16\n\t"
  124628. "lsl r6, r6, #16\n\t"
  124629. "adds r3, r3, r6\n\t"
  124630. "adcs r4, r4, r7\n\t"
  124631. "adc r5, r5, #0\n\t"
  124632. "lsr r6, r8, #16\n\t"
  124633. "lsr r7, r9, #16\n\t"
  124634. "mul r7, r6, r7\n\t"
  124635. "adds r4, r4, r7\n\t"
  124636. "adc r5, r5, #0\n\t"
  124637. "lsl r7, r9, #16\n\t"
  124638. "lsr r7, r7, #16\n\t"
  124639. "mul r6, r7, r6\n\t"
  124640. "lsr r7, r6, #16\n\t"
  124641. "lsl r6, r6, #16\n\t"
  124642. "adds r3, r3, r6\n\t"
  124643. "adcs r4, r4, r7\n\t"
  124644. "adc r5, r5, #0\n\t"
  124645. #else
  124646. "umull r6, r7, r8, r9\n\t"
  124647. "adds r3, r3, r6\n\t"
  124648. "adcs r4, r4, r7\n\t"
  124649. "mov r5, #0\n\t"
  124650. "adc r5, r5, #0\n\t"
  124651. #endif
  124652. /* A[1] * B[2] */
  124653. "ldr r9, [%[b], #8]\n\t"
  124654. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124655. "lsl r6, r11, #16\n\t"
  124656. "lsl r7, r9, #16\n\t"
  124657. "lsr r6, r6, #16\n\t"
  124658. "lsr r7, r7, #16\n\t"
  124659. "mul r7, r6, r7\n\t"
  124660. "adds r3, r3, r7\n\t"
  124661. "adcs r4, r4, #0\n\t"
  124662. "adc r5, r5, #0\n\t"
  124663. "lsr r7, r9, #16\n\t"
  124664. "mul r6, r7, r6\n\t"
  124665. "lsr r7, r6, #16\n\t"
  124666. "lsl r6, r6, #16\n\t"
  124667. "adds r3, r3, r6\n\t"
  124668. "adcs r4, r4, r7\n\t"
  124669. "adc r5, r5, #0\n\t"
  124670. "lsr r6, r11, #16\n\t"
  124671. "lsr r7, r9, #16\n\t"
  124672. "mul r7, r6, r7\n\t"
  124673. "adds r4, r4, r7\n\t"
  124674. "adc r5, r5, #0\n\t"
  124675. "lsl r7, r9, #16\n\t"
  124676. "lsr r7, r7, #16\n\t"
  124677. "mul r6, r7, r6\n\t"
  124678. "lsr r7, r6, #16\n\t"
  124679. "lsl r6, r6, #16\n\t"
  124680. "adds r3, r3, r6\n\t"
  124681. "adcs r4, r4, r7\n\t"
  124682. "adc r5, r5, #0\n\t"
  124683. #else
  124684. "umull r6, r7, r11, r9\n\t"
  124685. "adds r3, r3, r6\n\t"
  124686. "adcs r4, r4, r7\n\t"
  124687. "adc r5, r5, #0\n\t"
  124688. #endif
  124689. /* A[2] * B[1] */
  124690. "ldr r8, [%[a], #8]\n\t"
  124691. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124692. "lsl r6, r8, #16\n\t"
  124693. "lsl r7, r12, #16\n\t"
  124694. "lsr r6, r6, #16\n\t"
  124695. "lsr r7, r7, #16\n\t"
  124696. "mul r7, r6, r7\n\t"
  124697. "adds r3, r3, r7\n\t"
  124698. "adcs r4, r4, #0\n\t"
  124699. "adc r5, r5, #0\n\t"
  124700. "lsr r7, r12, #16\n\t"
  124701. "mul r6, r7, r6\n\t"
  124702. "lsr r7, r6, #16\n\t"
  124703. "lsl r6, r6, #16\n\t"
  124704. "adds r3, r3, r6\n\t"
  124705. "adcs r4, r4, r7\n\t"
  124706. "adc r5, r5, #0\n\t"
  124707. "lsr r6, r8, #16\n\t"
  124708. "lsr r7, r12, #16\n\t"
  124709. "mul r7, r6, r7\n\t"
  124710. "adds r4, r4, r7\n\t"
  124711. "adc r5, r5, #0\n\t"
  124712. "lsl r7, r12, #16\n\t"
  124713. "lsr r7, r7, #16\n\t"
  124714. "mul r6, r7, r6\n\t"
  124715. "lsr r7, r6, #16\n\t"
  124716. "lsl r6, r6, #16\n\t"
  124717. "adds r3, r3, r6\n\t"
  124718. "adcs r4, r4, r7\n\t"
  124719. "adc r5, r5, #0\n\t"
  124720. #else
  124721. "umull r6, r7, r8, r12\n\t"
  124722. "adds r3, r3, r6\n\t"
  124723. "adcs r4, r4, r7\n\t"
  124724. "adc r5, r5, #0\n\t"
  124725. #endif
  124726. /* A[3] * B[0] */
  124727. "ldr r8, [%[a], #12]\n\t"
  124728. "ldr r9, [%[b]]\n\t"
  124729. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124730. "lsl r6, r8, #16\n\t"
  124731. "lsl r7, r9, #16\n\t"
  124732. "lsr r6, r6, #16\n\t"
  124733. "lsr r7, r7, #16\n\t"
  124734. "mul r7, r6, r7\n\t"
  124735. "adds r3, r3, r7\n\t"
  124736. "adcs r4, r4, #0\n\t"
  124737. "adc r5, r5, #0\n\t"
  124738. "lsr r7, r9, #16\n\t"
  124739. "mul r6, r7, r6\n\t"
  124740. "lsr r7, r6, #16\n\t"
  124741. "lsl r6, r6, #16\n\t"
  124742. "adds r3, r3, r6\n\t"
  124743. "adcs r4, r4, r7\n\t"
  124744. "adc r5, r5, #0\n\t"
  124745. "lsr r6, r8, #16\n\t"
  124746. "lsr r7, r9, #16\n\t"
  124747. "mul r7, r6, r7\n\t"
  124748. "adds r4, r4, r7\n\t"
  124749. "adc r5, r5, #0\n\t"
  124750. "lsl r7, r9, #16\n\t"
  124751. "lsr r7, r7, #16\n\t"
  124752. "mul r6, r7, r6\n\t"
  124753. "lsr r7, r6, #16\n\t"
  124754. "lsl r6, r6, #16\n\t"
  124755. "adds r3, r3, r6\n\t"
  124756. "adcs r4, r4, r7\n\t"
  124757. "adc r5, r5, #0\n\t"
  124758. #else
  124759. "umull r6, r7, r8, r9\n\t"
  124760. "adds r3, r3, r6\n\t"
  124761. "adcs r4, r4, r7\n\t"
  124762. "adc r5, r5, #0\n\t"
  124763. #endif
  124764. "str r3, [sp, #12]\n\t"
  124765. /* A[4] * B[0] */
  124766. "ldr r8, [%[a], #16]\n\t"
  124767. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124768. "lsl r6, r8, #16\n\t"
  124769. "lsl r7, r9, #16\n\t"
  124770. "lsr r6, r6, #16\n\t"
  124771. "lsr r7, r7, #16\n\t"
  124772. "mul r7, r6, r7\n\t"
  124773. "adds r4, r4, r7\n\t"
  124774. "adcs r5, r5, #0\n\t"
  124775. "mov r3, #0\n\t"
  124776. "adc r3, r3, #0\n\t"
  124777. "lsr r7, r9, #16\n\t"
  124778. "mul r6, r7, r6\n\t"
  124779. "lsr r7, r6, #16\n\t"
  124780. "lsl r6, r6, #16\n\t"
  124781. "adds r4, r4, r6\n\t"
  124782. "adcs r5, r5, r7\n\t"
  124783. "adc r3, r3, #0\n\t"
  124784. "lsr r6, r8, #16\n\t"
  124785. "lsr r7, r9, #16\n\t"
  124786. "mul r7, r6, r7\n\t"
  124787. "adds r5, r5, r7\n\t"
  124788. "adc r3, r3, #0\n\t"
  124789. "lsl r7, r9, #16\n\t"
  124790. "lsr r7, r7, #16\n\t"
  124791. "mul r6, r7, r6\n\t"
  124792. "lsr r7, r6, #16\n\t"
  124793. "lsl r6, r6, #16\n\t"
  124794. "adds r4, r4, r6\n\t"
  124795. "adcs r5, r5, r7\n\t"
  124796. "adc r3, r3, #0\n\t"
  124797. #else
  124798. "umull r6, r7, r8, r9\n\t"
  124799. "adds r4, r4, r6\n\t"
  124800. "adcs r5, r5, r7\n\t"
  124801. "mov r3, #0\n\t"
  124802. "adc r3, r3, #0\n\t"
  124803. #endif
  124804. /* A[3] * B[1] */
  124805. "ldr r8, [%[a], #12]\n\t"
  124806. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124807. "lsl r6, r8, #16\n\t"
  124808. "lsl r7, r12, #16\n\t"
  124809. "lsr r6, r6, #16\n\t"
  124810. "lsr r7, r7, #16\n\t"
  124811. "mul r7, r6, r7\n\t"
  124812. "adds r4, r4, r7\n\t"
  124813. "adcs r5, r5, #0\n\t"
  124814. "adc r3, r3, #0\n\t"
  124815. "lsr r7, r12, #16\n\t"
  124816. "mul r6, r7, r6\n\t"
  124817. "lsr r7, r6, #16\n\t"
  124818. "lsl r6, r6, #16\n\t"
  124819. "adds r4, r4, r6\n\t"
  124820. "adcs r5, r5, r7\n\t"
  124821. "adc r3, r3, #0\n\t"
  124822. "lsr r6, r8, #16\n\t"
  124823. "lsr r7, r12, #16\n\t"
  124824. "mul r7, r6, r7\n\t"
  124825. "adds r5, r5, r7\n\t"
  124826. "adc r3, r3, #0\n\t"
  124827. "lsl r7, r12, #16\n\t"
  124828. "lsr r7, r7, #16\n\t"
  124829. "mul r6, r7, r6\n\t"
  124830. "lsr r7, r6, #16\n\t"
  124831. "lsl r6, r6, #16\n\t"
  124832. "adds r4, r4, r6\n\t"
  124833. "adcs r5, r5, r7\n\t"
  124834. "adc r3, r3, #0\n\t"
  124835. #else
  124836. "umull r6, r7, r8, r12\n\t"
  124837. "adds r4, r4, r6\n\t"
  124838. "adcs r5, r5, r7\n\t"
  124839. "adc r3, r3, #0\n\t"
  124840. #endif
  124841. /* A[2] * B[2] */
  124842. "ldr r11, [%[a], #8]\n\t"
  124843. "ldr r12, [%[b], #8]\n\t"
  124844. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124845. "lsl r6, r11, #16\n\t"
  124846. "lsl r7, r12, #16\n\t"
  124847. "lsr r6, r6, #16\n\t"
  124848. "lsr r7, r7, #16\n\t"
  124849. "mul r7, r6, r7\n\t"
  124850. "adds r4, r4, r7\n\t"
  124851. "adcs r5, r5, #0\n\t"
  124852. "adc r3, r3, #0\n\t"
  124853. "lsr r7, r12, #16\n\t"
  124854. "mul r6, r7, r6\n\t"
  124855. "lsr r7, r6, #16\n\t"
  124856. "lsl r6, r6, #16\n\t"
  124857. "adds r4, r4, r6\n\t"
  124858. "adcs r5, r5, r7\n\t"
  124859. "adc r3, r3, #0\n\t"
  124860. "lsr r6, r11, #16\n\t"
  124861. "lsr r7, r12, #16\n\t"
  124862. "mul r7, r6, r7\n\t"
  124863. "adds r5, r5, r7\n\t"
  124864. "adc r3, r3, #0\n\t"
  124865. "lsl r7, r12, #16\n\t"
  124866. "lsr r7, r7, #16\n\t"
  124867. "mul r6, r7, r6\n\t"
  124868. "lsr r7, r6, #16\n\t"
  124869. "lsl r6, r6, #16\n\t"
  124870. "adds r4, r4, r6\n\t"
  124871. "adcs r5, r5, r7\n\t"
  124872. "adc r3, r3, #0\n\t"
  124873. #else
  124874. "umull r6, r7, r11, r12\n\t"
  124875. "adds r4, r4, r6\n\t"
  124876. "adcs r5, r5, r7\n\t"
  124877. "adc r3, r3, #0\n\t"
  124878. #endif
  124879. /* A[1] * B[3] */
  124880. "ldr r8, [%[a], #4]\n\t"
  124881. "ldr r9, [%[b], #12]\n\t"
  124882. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124883. "lsl r6, r8, #16\n\t"
  124884. "lsl r7, r9, #16\n\t"
  124885. "lsr r6, r6, #16\n\t"
  124886. "lsr r7, r7, #16\n\t"
  124887. "mul r7, r6, r7\n\t"
  124888. "adds r4, r4, r7\n\t"
  124889. "adcs r5, r5, #0\n\t"
  124890. "adc r3, r3, #0\n\t"
  124891. "lsr r7, r9, #16\n\t"
  124892. "mul r6, r7, r6\n\t"
  124893. "lsr r7, r6, #16\n\t"
  124894. "lsl r6, r6, #16\n\t"
  124895. "adds r4, r4, r6\n\t"
  124896. "adcs r5, r5, r7\n\t"
  124897. "adc r3, r3, #0\n\t"
  124898. "lsr r6, r8, #16\n\t"
  124899. "lsr r7, r9, #16\n\t"
  124900. "mul r7, r6, r7\n\t"
  124901. "adds r5, r5, r7\n\t"
  124902. "adc r3, r3, #0\n\t"
  124903. "lsl r7, r9, #16\n\t"
  124904. "lsr r7, r7, #16\n\t"
  124905. "mul r6, r7, r6\n\t"
  124906. "lsr r7, r6, #16\n\t"
  124907. "lsl r6, r6, #16\n\t"
  124908. "adds r4, r4, r6\n\t"
  124909. "adcs r5, r5, r7\n\t"
  124910. "adc r3, r3, #0\n\t"
  124911. #else
  124912. "umull r6, r7, r8, r9\n\t"
  124913. "adds r4, r4, r6\n\t"
  124914. "adcs r5, r5, r7\n\t"
  124915. "adc r3, r3, #0\n\t"
  124916. #endif
  124917. /* A[0] * B[4] */
  124918. "ldr r8, [%[a]]\n\t"
  124919. "ldr r9, [%[b], #16]\n\t"
  124920. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124921. "lsl r6, r8, #16\n\t"
  124922. "lsl r7, r9, #16\n\t"
  124923. "lsr r6, r6, #16\n\t"
  124924. "lsr r7, r7, #16\n\t"
  124925. "mul r7, r6, r7\n\t"
  124926. "adds r4, r4, r7\n\t"
  124927. "adcs r5, r5, #0\n\t"
  124928. "adc r3, r3, #0\n\t"
  124929. "lsr r7, r9, #16\n\t"
  124930. "mul r6, r7, r6\n\t"
  124931. "lsr r7, r6, #16\n\t"
  124932. "lsl r6, r6, #16\n\t"
  124933. "adds r4, r4, r6\n\t"
  124934. "adcs r5, r5, r7\n\t"
  124935. "adc r3, r3, #0\n\t"
  124936. "lsr r6, r8, #16\n\t"
  124937. "lsr r7, r9, #16\n\t"
  124938. "mul r7, r6, r7\n\t"
  124939. "adds r5, r5, r7\n\t"
  124940. "adc r3, r3, #0\n\t"
  124941. "lsl r7, r9, #16\n\t"
  124942. "lsr r7, r7, #16\n\t"
  124943. "mul r6, r7, r6\n\t"
  124944. "lsr r7, r6, #16\n\t"
  124945. "lsl r6, r6, #16\n\t"
  124946. "adds r4, r4, r6\n\t"
  124947. "adcs r5, r5, r7\n\t"
  124948. "adc r3, r3, #0\n\t"
  124949. #else
  124950. "umull r6, r7, r8, r9\n\t"
  124951. "adds r4, r4, r6\n\t"
  124952. "adcs r5, r5, r7\n\t"
  124953. "adc r3, r3, #0\n\t"
  124954. #endif
  124955. "str r4, [sp, #16]\n\t"
  124956. /* A[0] * B[5] */
  124957. "ldr r9, [%[b], #20]\n\t"
  124958. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124959. "lsl r6, r8, #16\n\t"
  124960. "lsl r7, r9, #16\n\t"
  124961. "lsr r6, r6, #16\n\t"
  124962. "lsr r7, r7, #16\n\t"
  124963. "mul r7, r6, r7\n\t"
  124964. "adds r5, r5, r7\n\t"
  124965. "adcs r3, r3, #0\n\t"
  124966. "mov r4, #0\n\t"
  124967. "adc r4, r4, #0\n\t"
  124968. "lsr r7, r9, #16\n\t"
  124969. "mul r6, r7, r6\n\t"
  124970. "lsr r7, r6, #16\n\t"
  124971. "lsl r6, r6, #16\n\t"
  124972. "adds r5, r5, r6\n\t"
  124973. "adcs r3, r3, r7\n\t"
  124974. "adc r4, r4, #0\n\t"
  124975. "lsr r6, r8, #16\n\t"
  124976. "lsr r7, r9, #16\n\t"
  124977. "mul r7, r6, r7\n\t"
  124978. "adds r3, r3, r7\n\t"
  124979. "adc r4, r4, #0\n\t"
  124980. "lsl r7, r9, #16\n\t"
  124981. "lsr r7, r7, #16\n\t"
  124982. "mul r6, r7, r6\n\t"
  124983. "lsr r7, r6, #16\n\t"
  124984. "lsl r6, r6, #16\n\t"
  124985. "adds r5, r5, r6\n\t"
  124986. "adcs r3, r3, r7\n\t"
  124987. "adc r4, r4, #0\n\t"
  124988. #else
  124989. "umull r6, r7, r8, r9\n\t"
  124990. "adds r5, r5, r6\n\t"
  124991. "adcs r3, r3, r7\n\t"
  124992. "mov r4, #0\n\t"
  124993. "adc r4, r4, #0\n\t"
  124994. #endif
  124995. /* A[1] * B[4] */
  124996. "ldr r8, [%[a], #4]\n\t"
  124997. "ldr r9, [%[b], #16]\n\t"
  124998. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  124999. "lsl r6, r8, #16\n\t"
  125000. "lsl r7, r9, #16\n\t"
  125001. "lsr r6, r6, #16\n\t"
  125002. "lsr r7, r7, #16\n\t"
  125003. "mul r7, r6, r7\n\t"
  125004. "adds r5, r5, r7\n\t"
  125005. "adcs r3, r3, #0\n\t"
  125006. "adc r4, r4, #0\n\t"
  125007. "lsr r7, r9, #16\n\t"
  125008. "mul r6, r7, r6\n\t"
  125009. "lsr r7, r6, #16\n\t"
  125010. "lsl r6, r6, #16\n\t"
  125011. "adds r5, r5, r6\n\t"
  125012. "adcs r3, r3, r7\n\t"
  125013. "adc r4, r4, #0\n\t"
  125014. "lsr r6, r8, #16\n\t"
  125015. "lsr r7, r9, #16\n\t"
  125016. "mul r7, r6, r7\n\t"
  125017. "adds r3, r3, r7\n\t"
  125018. "adc r4, r4, #0\n\t"
  125019. "lsl r7, r9, #16\n\t"
  125020. "lsr r7, r7, #16\n\t"
  125021. "mul r6, r7, r6\n\t"
  125022. "lsr r7, r6, #16\n\t"
  125023. "lsl r6, r6, #16\n\t"
  125024. "adds r5, r5, r6\n\t"
  125025. "adcs r3, r3, r7\n\t"
  125026. "adc r4, r4, #0\n\t"
  125027. #else
  125028. "umull r6, r7, r8, r9\n\t"
  125029. "adds r5, r5, r6\n\t"
  125030. "adcs r3, r3, r7\n\t"
  125031. "adc r4, r4, #0\n\t"
  125032. #endif
  125033. /* A[2] * B[3] */
  125034. "ldr r9, [%[b], #12]\n\t"
  125035. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125036. "lsl r6, r11, #16\n\t"
  125037. "lsl r7, r9, #16\n\t"
  125038. "lsr r6, r6, #16\n\t"
  125039. "lsr r7, r7, #16\n\t"
  125040. "mul r7, r6, r7\n\t"
  125041. "adds r5, r5, r7\n\t"
  125042. "adcs r3, r3, #0\n\t"
  125043. "adc r4, r4, #0\n\t"
  125044. "lsr r7, r9, #16\n\t"
  125045. "mul r6, r7, r6\n\t"
  125046. "lsr r7, r6, #16\n\t"
  125047. "lsl r6, r6, #16\n\t"
  125048. "adds r5, r5, r6\n\t"
  125049. "adcs r3, r3, r7\n\t"
  125050. "adc r4, r4, #0\n\t"
  125051. "lsr r6, r11, #16\n\t"
  125052. "lsr r7, r9, #16\n\t"
  125053. "mul r7, r6, r7\n\t"
  125054. "adds r3, r3, r7\n\t"
  125055. "adc r4, r4, #0\n\t"
  125056. "lsl r7, r9, #16\n\t"
  125057. "lsr r7, r7, #16\n\t"
  125058. "mul r6, r7, r6\n\t"
  125059. "lsr r7, r6, #16\n\t"
  125060. "lsl r6, r6, #16\n\t"
  125061. "adds r5, r5, r6\n\t"
  125062. "adcs r3, r3, r7\n\t"
  125063. "adc r4, r4, #0\n\t"
  125064. #else
  125065. "umull r6, r7, r11, r9\n\t"
  125066. "adds r5, r5, r6\n\t"
  125067. "adcs r3, r3, r7\n\t"
  125068. "adc r4, r4, #0\n\t"
  125069. #endif
  125070. /* A[3] * B[2] */
  125071. "ldr r8, [%[a], #12]\n\t"
  125072. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125073. "lsl r6, r8, #16\n\t"
  125074. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[4] * B[1] */
  125108. "ldr r8, [%[a], #16]\n\t"
  125109. "ldr r9, [%[b], #4]\n\t"
  125110. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125111. "lsl r6, r8, #16\n\t"
  125112. "lsl r7, r9, #16\n\t"
  125113. "lsr r6, r6, #16\n\t"
  125114. "lsr r7, r7, #16\n\t"
  125115. "mul r7, r6, r7\n\t"
  125116. "adds r5, r5, r7\n\t"
  125117. "adcs r3, r3, #0\n\t"
  125118. "adc r4, r4, #0\n\t"
  125119. "lsr r7, r9, #16\n\t"
  125120. "mul r6, r7, r6\n\t"
  125121. "lsr r7, r6, #16\n\t"
  125122. "lsl r6, r6, #16\n\t"
  125123. "adds r5, r5, r6\n\t"
  125124. "adcs r3, r3, r7\n\t"
  125125. "adc r4, r4, #0\n\t"
  125126. "lsr r6, r8, #16\n\t"
  125127. "lsr r7, r9, #16\n\t"
  125128. "mul r7, r6, r7\n\t"
  125129. "adds r3, r3, r7\n\t"
  125130. "adc r4, r4, #0\n\t"
  125131. "lsl r7, r9, #16\n\t"
  125132. "lsr r7, r7, #16\n\t"
  125133. "mul r6, r7, r6\n\t"
  125134. "lsr r7, r6, #16\n\t"
  125135. "lsl r6, r6, #16\n\t"
  125136. "adds r5, r5, r6\n\t"
  125137. "adcs r3, r3, r7\n\t"
  125138. "adc r4, r4, #0\n\t"
  125139. #else
  125140. "umull r6, r7, r8, r9\n\t"
  125141. "adds r5, r5, r6\n\t"
  125142. "adcs r3, r3, r7\n\t"
  125143. "adc r4, r4, #0\n\t"
  125144. #endif
  125145. /* A[5] * B[0] */
  125146. "ldr r8, [%[a], #20]\n\t"
  125147. "ldr r9, [%[b]]\n\t"
  125148. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125149. "lsl r6, r8, #16\n\t"
  125150. "lsl r7, r9, #16\n\t"
  125151. "lsr r6, r6, #16\n\t"
  125152. "lsr r7, r7, #16\n\t"
  125153. "mul r7, r6, r7\n\t"
  125154. "adds r5, r5, r7\n\t"
  125155. "adcs r3, r3, #0\n\t"
  125156. "adc r4, r4, #0\n\t"
  125157. "lsr r7, r9, #16\n\t"
  125158. "mul r6, r7, r6\n\t"
  125159. "lsr r7, r6, #16\n\t"
  125160. "lsl r6, r6, #16\n\t"
  125161. "adds r5, r5, r6\n\t"
  125162. "adcs r3, r3, r7\n\t"
  125163. "adc r4, r4, #0\n\t"
  125164. "lsr r6, r8, #16\n\t"
  125165. "lsr r7, r9, #16\n\t"
  125166. "mul r7, r6, r7\n\t"
  125167. "adds r3, r3, r7\n\t"
  125168. "adc r4, r4, #0\n\t"
  125169. "lsl r7, r9, #16\n\t"
  125170. "lsr r7, r7, #16\n\t"
  125171. "mul r6, r7, r6\n\t"
  125172. "lsr r7, r6, #16\n\t"
  125173. "lsl r6, r6, #16\n\t"
  125174. "adds r5, r5, r6\n\t"
  125175. "adcs r3, r3, r7\n\t"
  125176. "adc r4, r4, #0\n\t"
  125177. #else
  125178. "umull r6, r7, r8, r9\n\t"
  125179. "adds r5, r5, r6\n\t"
  125180. "adcs r3, r3, r7\n\t"
  125181. "adc r4, r4, #0\n\t"
  125182. #endif
  125183. "str r5, [sp, #20]\n\t"
  125184. /* A[6] * B[0] */
  125185. "ldr r8, [%[a], #24]\n\t"
  125186. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125187. "lsl r6, r8, #16\n\t"
  125188. "lsl r7, r9, #16\n\t"
  125189. "lsr r6, r6, #16\n\t"
  125190. "lsr r7, r7, #16\n\t"
  125191. "mul r7, r6, r7\n\t"
  125192. "adds r3, r3, r7\n\t"
  125193. "adcs r4, r4, #0\n\t"
  125194. "mov r5, #0\n\t"
  125195. "adc r5, r5, #0\n\t"
  125196. "lsr r7, r9, #16\n\t"
  125197. "mul r6, r7, r6\n\t"
  125198. "lsr r7, r6, #16\n\t"
  125199. "lsl r6, r6, #16\n\t"
  125200. "adds r3, r3, r6\n\t"
  125201. "adcs r4, r4, r7\n\t"
  125202. "adc r5, r5, #0\n\t"
  125203. "lsr r6, r8, #16\n\t"
  125204. "lsr r7, r9, #16\n\t"
  125205. "mul r7, r6, r7\n\t"
  125206. "adds r4, r4, r7\n\t"
  125207. "adc r5, r5, #0\n\t"
  125208. "lsl r7, r9, #16\n\t"
  125209. "lsr r7, r7, #16\n\t"
  125210. "mul r6, r7, r6\n\t"
  125211. "lsr r7, r6, #16\n\t"
  125212. "lsl r6, r6, #16\n\t"
  125213. "adds r3, r3, r6\n\t"
  125214. "adcs r4, r4, r7\n\t"
  125215. "adc r5, r5, #0\n\t"
  125216. #else
  125217. "umull r6, r7, r8, r9\n\t"
  125218. "adds r3, r3, r6\n\t"
  125219. "adcs r4, r4, r7\n\t"
  125220. "mov r5, #0\n\t"
  125221. "adc r5, r5, #0\n\t"
  125222. #endif
  125223. /* A[5] * B[1] */
  125224. "ldr r8, [%[a], #20]\n\t"
  125225. "ldr r9, [%[b], #4]\n\t"
  125226. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125227. "lsl r6, r8, #16\n\t"
  125228. "lsl r7, r9, #16\n\t"
  125229. "lsr r6, r6, #16\n\t"
  125230. "lsr r7, r7, #16\n\t"
  125231. "mul r7, r6, r7\n\t"
  125232. "adds r3, r3, r7\n\t"
  125233. "adcs r4, r4, #0\n\t"
  125234. "adc r5, r5, #0\n\t"
  125235. "lsr r7, r9, #16\n\t"
  125236. "mul r6, r7, r6\n\t"
  125237. "lsr r7, r6, #16\n\t"
  125238. "lsl r6, r6, #16\n\t"
  125239. "adds r3, r3, r6\n\t"
  125240. "adcs r4, r4, r7\n\t"
  125241. "adc r5, r5, #0\n\t"
  125242. "lsr r6, r8, #16\n\t"
  125243. "lsr r7, r9, #16\n\t"
  125244. "mul r7, r6, r7\n\t"
  125245. "adds r4, r4, r7\n\t"
  125246. "adc r5, r5, #0\n\t"
  125247. "lsl r7, r9, #16\n\t"
  125248. "lsr r7, r7, #16\n\t"
  125249. "mul r6, r7, r6\n\t"
  125250. "lsr r7, r6, #16\n\t"
  125251. "lsl r6, r6, #16\n\t"
  125252. "adds r3, r3, r6\n\t"
  125253. "adcs r4, r4, r7\n\t"
  125254. "adc r5, r5, #0\n\t"
  125255. #else
  125256. "umull r6, r7, r8, r9\n\t"
  125257. "adds r3, r3, r6\n\t"
  125258. "adcs r4, r4, r7\n\t"
  125259. "adc r5, r5, #0\n\t"
  125260. #endif
  125261. /* A[4] * B[2] */
  125262. "ldr r8, [%[a], #16]\n\t"
  125263. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125264. "lsl r6, r8, #16\n\t"
  125265. "lsl r7, r12, #16\n\t"
  125266. "lsr r6, r6, #16\n\t"
  125267. "lsr r7, r7, #16\n\t"
  125268. "mul r7, r6, r7\n\t"
  125269. "adds r3, r3, r7\n\t"
  125270. "adcs r4, r4, #0\n\t"
  125271. "adc r5, r5, #0\n\t"
  125272. "lsr r7, r12, #16\n\t"
  125273. "mul r6, r7, r6\n\t"
  125274. "lsr r7, r6, #16\n\t"
  125275. "lsl r6, r6, #16\n\t"
  125276. "adds r3, r3, r6\n\t"
  125277. "adcs r4, r4, r7\n\t"
  125278. "adc r5, r5, #0\n\t"
  125279. "lsr r6, r8, #16\n\t"
  125280. "lsr r7, r12, #16\n\t"
  125281. "mul r7, r6, r7\n\t"
  125282. "adds r4, r4, r7\n\t"
  125283. "adc r5, r5, #0\n\t"
  125284. "lsl r7, r12, #16\n\t"
  125285. "lsr r7, r7, #16\n\t"
  125286. "mul r6, r7, r6\n\t"
  125287. "lsr r7, r6, #16\n\t"
  125288. "lsl r6, r6, #16\n\t"
  125289. "adds r3, r3, r6\n\t"
  125290. "adcs r4, r4, r7\n\t"
  125291. "adc r5, r5, #0\n\t"
  125292. #else
  125293. "umull r6, r7, r8, r12\n\t"
  125294. "adds r3, r3, r6\n\t"
  125295. "adcs r4, r4, r7\n\t"
  125296. "adc r5, r5, #0\n\t"
  125297. #endif
  125298. /* A[3] * B[3] */
  125299. "ldr r11, [%[a], #12]\n\t"
  125300. "ldr r12, [%[b], #12]\n\t"
  125301. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125302. "lsl r6, r11, #16\n\t"
  125303. "lsl r7, r12, #16\n\t"
  125304. "lsr r6, r6, #16\n\t"
  125305. "lsr r7, r7, #16\n\t"
  125306. "mul r7, r6, r7\n\t"
  125307. "adds r3, r3, r7\n\t"
  125308. "adcs r4, r4, #0\n\t"
  125309. "adc r5, r5, #0\n\t"
  125310. "lsr r7, r12, #16\n\t"
  125311. "mul r6, r7, r6\n\t"
  125312. "lsr r7, r6, #16\n\t"
  125313. "lsl r6, r6, #16\n\t"
  125314. "adds r3, r3, r6\n\t"
  125315. "adcs r4, r4, r7\n\t"
  125316. "adc r5, r5, #0\n\t"
  125317. "lsr r6, r11, #16\n\t"
  125318. "lsr r7, r12, #16\n\t"
  125319. "mul r7, r6, r7\n\t"
  125320. "adds r4, r4, r7\n\t"
  125321. "adc r5, r5, #0\n\t"
  125322. "lsl r7, r12, #16\n\t"
  125323. "lsr r7, r7, #16\n\t"
  125324. "mul r6, r7, r6\n\t"
  125325. "lsr r7, r6, #16\n\t"
  125326. "lsl r6, r6, #16\n\t"
  125327. "adds r3, r3, r6\n\t"
  125328. "adcs r4, r4, r7\n\t"
  125329. "adc r5, r5, #0\n\t"
  125330. #else
  125331. "umull r6, r7, r11, r12\n\t"
  125332. "adds r3, r3, r6\n\t"
  125333. "adcs r4, r4, r7\n\t"
  125334. "adc r5, r5, #0\n\t"
  125335. #endif
  125336. /* A[2] * B[4] */
  125337. "ldr r8, [%[a], #8]\n\t"
  125338. "ldr r9, [%[b], #16]\n\t"
  125339. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125340. "lsl r6, r8, #16\n\t"
  125341. "lsl r7, r9, #16\n\t"
  125342. "lsr r6, r6, #16\n\t"
  125343. "lsr r7, r7, #16\n\t"
  125344. "mul r7, r6, r7\n\t"
  125345. "adds r3, r3, r7\n\t"
  125346. "adcs r4, r4, #0\n\t"
  125347. "adc r5, r5, #0\n\t"
  125348. "lsr r7, r9, #16\n\t"
  125349. "mul r6, r7, r6\n\t"
  125350. "lsr r7, r6, #16\n\t"
  125351. "lsl r6, r6, #16\n\t"
  125352. "adds r3, r3, r6\n\t"
  125353. "adcs r4, r4, r7\n\t"
  125354. "adc r5, r5, #0\n\t"
  125355. "lsr r6, r8, #16\n\t"
  125356. "lsr r7, r9, #16\n\t"
  125357. "mul r7, r6, r7\n\t"
  125358. "adds r4, r4, r7\n\t"
  125359. "adc r5, r5, #0\n\t"
  125360. "lsl r7, r9, #16\n\t"
  125361. "lsr r7, r7, #16\n\t"
  125362. "mul r6, r7, r6\n\t"
  125363. "lsr r7, r6, #16\n\t"
  125364. "lsl r6, r6, #16\n\t"
  125365. "adds r3, r3, r6\n\t"
  125366. "adcs r4, r4, r7\n\t"
  125367. "adc r5, r5, #0\n\t"
  125368. #else
  125369. "umull r6, r7, r8, r9\n\t"
  125370. "adds r3, r3, r6\n\t"
  125371. "adcs r4, r4, r7\n\t"
  125372. "adc r5, r5, #0\n\t"
  125373. #endif
  125374. /* A[1] * B[5] */
  125375. "ldr r8, [%[a], #4]\n\t"
  125376. "ldr r9, [%[b], #20]\n\t"
  125377. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125378. "lsl r6, r8, #16\n\t"
  125379. "lsl r7, r9, #16\n\t"
  125380. "lsr r6, r6, #16\n\t"
  125381. "lsr r7, r7, #16\n\t"
  125382. "mul r7, r6, r7\n\t"
  125383. "adds r3, r3, r7\n\t"
  125384. "adcs r4, r4, #0\n\t"
  125385. "adc r5, r5, #0\n\t"
  125386. "lsr r7, r9, #16\n\t"
  125387. "mul r6, r7, r6\n\t"
  125388. "lsr r7, r6, #16\n\t"
  125389. "lsl r6, r6, #16\n\t"
  125390. "adds r3, r3, r6\n\t"
  125391. "adcs r4, r4, r7\n\t"
  125392. "adc r5, r5, #0\n\t"
  125393. "lsr r6, r8, #16\n\t"
  125394. "lsr r7, r9, #16\n\t"
  125395. "mul r7, r6, r7\n\t"
  125396. "adds r4, r4, r7\n\t"
  125397. "adc r5, r5, #0\n\t"
  125398. "lsl r7, r9, #16\n\t"
  125399. "lsr r7, r7, #16\n\t"
  125400. "mul r6, r7, r6\n\t"
  125401. "lsr r7, r6, #16\n\t"
  125402. "lsl r6, r6, #16\n\t"
  125403. "adds r3, r3, r6\n\t"
  125404. "adcs r4, r4, r7\n\t"
  125405. "adc r5, r5, #0\n\t"
  125406. #else
  125407. "umull r6, r7, r8, r9\n\t"
  125408. "adds r3, r3, r6\n\t"
  125409. "adcs r4, r4, r7\n\t"
  125410. "adc r5, r5, #0\n\t"
  125411. #endif
  125412. /* A[0] * B[6] */
  125413. "ldr r8, [%[a]]\n\t"
  125414. "ldr r9, [%[b], #24]\n\t"
  125415. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125416. "lsl r6, r8, #16\n\t"
  125417. "lsl r7, r9, #16\n\t"
  125418. "lsr r6, r6, #16\n\t"
  125419. "lsr r7, r7, #16\n\t"
  125420. "mul r7, r6, r7\n\t"
  125421. "adds r3, r3, r7\n\t"
  125422. "adcs r4, r4, #0\n\t"
  125423. "adc r5, r5, #0\n\t"
  125424. "lsr r7, r9, #16\n\t"
  125425. "mul r6, r7, r6\n\t"
  125426. "lsr r7, r6, #16\n\t"
  125427. "lsl r6, r6, #16\n\t"
  125428. "adds r3, r3, r6\n\t"
  125429. "adcs r4, r4, r7\n\t"
  125430. "adc r5, r5, #0\n\t"
  125431. "lsr r6, r8, #16\n\t"
  125432. "lsr r7, r9, #16\n\t"
  125433. "mul r7, r6, r7\n\t"
  125434. "adds r4, r4, r7\n\t"
  125435. "adc r5, r5, #0\n\t"
  125436. "lsl r7, r9, #16\n\t"
  125437. "lsr r7, r7, #16\n\t"
  125438. "mul r6, r7, r6\n\t"
  125439. "lsr r7, r6, #16\n\t"
  125440. "lsl r6, r6, #16\n\t"
  125441. "adds r3, r3, r6\n\t"
  125442. "adcs r4, r4, r7\n\t"
  125443. "adc r5, r5, #0\n\t"
  125444. #else
  125445. "umull r6, r7, r8, r9\n\t"
  125446. "adds r3, r3, r6\n\t"
  125447. "adcs r4, r4, r7\n\t"
  125448. "adc r5, r5, #0\n\t"
  125449. #endif
  125450. "str r3, [sp, #24]\n\t"
  125451. /* A[0] * B[7] */
  125452. "ldr r9, [%[b], #28]\n\t"
  125453. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125454. "lsl r6, r8, #16\n\t"
  125455. "lsl r7, r9, #16\n\t"
  125456. "lsr r6, r6, #16\n\t"
  125457. "lsr r7, r7, #16\n\t"
  125458. "mul r7, r6, r7\n\t"
  125459. "adds r4, r4, r7\n\t"
  125460. "adcs r5, r5, #0\n\t"
  125461. "mov r3, #0\n\t"
  125462. "adc r3, r3, #0\n\t"
  125463. "lsr r7, r9, #16\n\t"
  125464. "mul r6, r7, r6\n\t"
  125465. "lsr r7, r6, #16\n\t"
  125466. "lsl r6, r6, #16\n\t"
  125467. "adds r4, r4, r6\n\t"
  125468. "adcs r5, r5, r7\n\t"
  125469. "adc r3, r3, #0\n\t"
  125470. "lsr r6, r8, #16\n\t"
  125471. "lsr r7, r9, #16\n\t"
  125472. "mul r7, r6, r7\n\t"
  125473. "adds r5, r5, r7\n\t"
  125474. "adc r3, r3, #0\n\t"
  125475. "lsl r7, r9, #16\n\t"
  125476. "lsr r7, r7, #16\n\t"
  125477. "mul r6, r7, r6\n\t"
  125478. "lsr r7, r6, #16\n\t"
  125479. "lsl r6, r6, #16\n\t"
  125480. "adds r4, r4, r6\n\t"
  125481. "adcs r5, r5, r7\n\t"
  125482. "adc r3, r3, #0\n\t"
  125483. #else
  125484. "umull r6, r7, r8, r9\n\t"
  125485. "adds r4, r4, r6\n\t"
  125486. "adcs r5, r5, r7\n\t"
  125487. "mov r3, #0\n\t"
  125488. "adc r3, r3, #0\n\t"
  125489. #endif
  125490. /* A[1] * B[6] */
  125491. "ldr r8, [%[a], #4]\n\t"
  125492. "ldr r9, [%[b], #24]\n\t"
  125493. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125494. "lsl r6, r8, #16\n\t"
  125495. "lsl r7, r9, #16\n\t"
  125496. "lsr r6, r6, #16\n\t"
  125497. "lsr r7, r7, #16\n\t"
  125498. "mul r7, r6, r7\n\t"
  125499. "adds r4, r4, r7\n\t"
  125500. "adcs r5, r5, #0\n\t"
  125501. "adc r3, r3, #0\n\t"
  125502. "lsr r7, r9, #16\n\t"
  125503. "mul r6, r7, r6\n\t"
  125504. "lsr r7, r6, #16\n\t"
  125505. "lsl r6, r6, #16\n\t"
  125506. "adds r4, r4, r6\n\t"
  125507. "adcs r5, r5, r7\n\t"
  125508. "adc r3, r3, #0\n\t"
  125509. "lsr r6, r8, #16\n\t"
  125510. "lsr r7, r9, #16\n\t"
  125511. "mul r7, r6, r7\n\t"
  125512. "adds r5, r5, r7\n\t"
  125513. "adc r3, r3, #0\n\t"
  125514. "lsl r7, r9, #16\n\t"
  125515. "lsr r7, r7, #16\n\t"
  125516. "mul r6, r7, r6\n\t"
  125517. "lsr r7, r6, #16\n\t"
  125518. "lsl r6, r6, #16\n\t"
  125519. "adds r4, r4, r6\n\t"
  125520. "adcs r5, r5, r7\n\t"
  125521. "adc r3, r3, #0\n\t"
  125522. #else
  125523. "umull r6, r7, r8, r9\n\t"
  125524. "adds r4, r4, r6\n\t"
  125525. "adcs r5, r5, r7\n\t"
  125526. "adc r3, r3, #0\n\t"
  125527. #endif
  125528. /* A[2] * B[5] */
  125529. "ldr r8, [%[a], #8]\n\t"
  125530. "ldr r9, [%[b], #20]\n\t"
  125531. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125532. "lsl r6, r8, #16\n\t"
  125533. "lsl r7, r9, #16\n\t"
  125534. "lsr r6, r6, #16\n\t"
  125535. "lsr r7, r7, #16\n\t"
  125536. "mul r7, r6, r7\n\t"
  125537. "adds r4, r4, r7\n\t"
  125538. "adcs r5, r5, #0\n\t"
  125539. "adc r3, r3, #0\n\t"
  125540. "lsr r7, r9, #16\n\t"
  125541. "mul r6, r7, r6\n\t"
  125542. "lsr r7, r6, #16\n\t"
  125543. "lsl r6, r6, #16\n\t"
  125544. "adds r4, r4, r6\n\t"
  125545. "adcs r5, r5, r7\n\t"
  125546. "adc r3, r3, #0\n\t"
  125547. "lsr r6, r8, #16\n\t"
  125548. "lsr r7, r9, #16\n\t"
  125549. "mul r7, r6, r7\n\t"
  125550. "adds r5, r5, r7\n\t"
  125551. "adc r3, r3, #0\n\t"
  125552. "lsl r7, r9, #16\n\t"
  125553. "lsr r7, r7, #16\n\t"
  125554. "mul r6, r7, r6\n\t"
  125555. "lsr r7, r6, #16\n\t"
  125556. "lsl r6, r6, #16\n\t"
  125557. "adds r4, r4, r6\n\t"
  125558. "adcs r5, r5, r7\n\t"
  125559. "adc r3, r3, #0\n\t"
  125560. #else
  125561. "umull r6, r7, r8, r9\n\t"
  125562. "adds r4, r4, r6\n\t"
  125563. "adcs r5, r5, r7\n\t"
  125564. "adc r3, r3, #0\n\t"
  125565. #endif
  125566. /* A[3] * B[4] */
  125567. "ldr r9, [%[b], #16]\n\t"
  125568. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125569. "lsl r6, r11, #16\n\t"
  125570. "lsl r7, r9, #16\n\t"
  125571. "lsr r6, r6, #16\n\t"
  125572. "lsr r7, r7, #16\n\t"
  125573. "mul r7, r6, r7\n\t"
  125574. "adds r4, r4, r7\n\t"
  125575. "adcs r5, r5, #0\n\t"
  125576. "adc r3, r3, #0\n\t"
  125577. "lsr r7, r9, #16\n\t"
  125578. "mul r6, r7, r6\n\t"
  125579. "lsr r7, r6, #16\n\t"
  125580. "lsl r6, r6, #16\n\t"
  125581. "adds r4, r4, r6\n\t"
  125582. "adcs r5, r5, r7\n\t"
  125583. "adc r3, r3, #0\n\t"
  125584. "lsr r6, r11, #16\n\t"
  125585. "lsr r7, r9, #16\n\t"
  125586. "mul r7, r6, r7\n\t"
  125587. "adds r5, r5, r7\n\t"
  125588. "adc r3, r3, #0\n\t"
  125589. "lsl r7, r9, #16\n\t"
  125590. "lsr r7, r7, #16\n\t"
  125591. "mul r6, r7, r6\n\t"
  125592. "lsr r7, r6, #16\n\t"
  125593. "lsl r6, r6, #16\n\t"
  125594. "adds r4, r4, r6\n\t"
  125595. "adcs r5, r5, r7\n\t"
  125596. "adc r3, r3, #0\n\t"
  125597. #else
  125598. "umull r6, r7, r11, r9\n\t"
  125599. "adds r4, r4, r6\n\t"
  125600. "adcs r5, r5, r7\n\t"
  125601. "adc r3, r3, #0\n\t"
  125602. #endif
  125603. /* A[4] * B[3] */
  125604. "ldr r8, [%[a], #16]\n\t"
  125605. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125606. "lsl r6, r8, #16\n\t"
  125607. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[5] * B[2] */
  125641. "ldr r8, [%[a], #20]\n\t"
  125642. "ldr r9, [%[b], #8]\n\t"
  125643. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125644. "lsl r6, r8, #16\n\t"
  125645. "lsl r7, r9, #16\n\t"
  125646. "lsr r6, r6, #16\n\t"
  125647. "lsr r7, r7, #16\n\t"
  125648. "mul r7, r6, r7\n\t"
  125649. "adds r4, r4, r7\n\t"
  125650. "adcs r5, r5, #0\n\t"
  125651. "adc r3, r3, #0\n\t"
  125652. "lsr r7, r9, #16\n\t"
  125653. "mul r6, r7, r6\n\t"
  125654. "lsr r7, r6, #16\n\t"
  125655. "lsl r6, r6, #16\n\t"
  125656. "adds r4, r4, r6\n\t"
  125657. "adcs r5, r5, r7\n\t"
  125658. "adc r3, r3, #0\n\t"
  125659. "lsr r6, r8, #16\n\t"
  125660. "lsr r7, r9, #16\n\t"
  125661. "mul r7, r6, r7\n\t"
  125662. "adds r5, r5, r7\n\t"
  125663. "adc r3, r3, #0\n\t"
  125664. "lsl r7, r9, #16\n\t"
  125665. "lsr r7, r7, #16\n\t"
  125666. "mul r6, r7, r6\n\t"
  125667. "lsr r7, r6, #16\n\t"
  125668. "lsl r6, r6, #16\n\t"
  125669. "adds r4, r4, r6\n\t"
  125670. "adcs r5, r5, r7\n\t"
  125671. "adc r3, r3, #0\n\t"
  125672. #else
  125673. "umull r6, r7, r8, r9\n\t"
  125674. "adds r4, r4, r6\n\t"
  125675. "adcs r5, r5, r7\n\t"
  125676. "adc r3, r3, #0\n\t"
  125677. #endif
  125678. /* A[6] * B[1] */
  125679. "ldr r8, [%[a], #24]\n\t"
  125680. "ldr r9, [%[b], #4]\n\t"
  125681. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125682. "lsl r6, r8, #16\n\t"
  125683. "lsl r7, r9, #16\n\t"
  125684. "lsr r6, r6, #16\n\t"
  125685. "lsr r7, r7, #16\n\t"
  125686. "mul r7, r6, r7\n\t"
  125687. "adds r4, r4, r7\n\t"
  125688. "adcs r5, r5, #0\n\t"
  125689. "adc r3, r3, #0\n\t"
  125690. "lsr r7, r9, #16\n\t"
  125691. "mul r6, r7, r6\n\t"
  125692. "lsr r7, r6, #16\n\t"
  125693. "lsl r6, r6, #16\n\t"
  125694. "adds r4, r4, r6\n\t"
  125695. "adcs r5, r5, r7\n\t"
  125696. "adc r3, r3, #0\n\t"
  125697. "lsr r6, r8, #16\n\t"
  125698. "lsr r7, r9, #16\n\t"
  125699. "mul r7, r6, r7\n\t"
  125700. "adds r5, r5, r7\n\t"
  125701. "adc r3, r3, #0\n\t"
  125702. "lsl r7, r9, #16\n\t"
  125703. "lsr r7, r7, #16\n\t"
  125704. "mul r6, r7, r6\n\t"
  125705. "lsr r7, r6, #16\n\t"
  125706. "lsl r6, r6, #16\n\t"
  125707. "adds r4, r4, r6\n\t"
  125708. "adcs r5, r5, r7\n\t"
  125709. "adc r3, r3, #0\n\t"
  125710. #else
  125711. "umull r6, r7, r8, r9\n\t"
  125712. "adds r4, r4, r6\n\t"
  125713. "adcs r5, r5, r7\n\t"
  125714. "adc r3, r3, #0\n\t"
  125715. #endif
  125716. /* A[7] * B[0] */
  125717. "ldr r8, [%[a], #28]\n\t"
  125718. "ldr r9, [%[b]]\n\t"
  125719. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125720. "lsl r6, r8, #16\n\t"
  125721. "lsl r7, r9, #16\n\t"
  125722. "lsr r6, r6, #16\n\t"
  125723. "lsr r7, r7, #16\n\t"
  125724. "mul r7, r6, r7\n\t"
  125725. "adds r4, r4, r7\n\t"
  125726. "adcs r5, r5, #0\n\t"
  125727. "adc r3, r3, #0\n\t"
  125728. "lsr r7, r9, #16\n\t"
  125729. "mul r6, r7, r6\n\t"
  125730. "lsr r7, r6, #16\n\t"
  125731. "lsl r6, r6, #16\n\t"
  125732. "adds r4, r4, r6\n\t"
  125733. "adcs r5, r5, r7\n\t"
  125734. "adc r3, r3, #0\n\t"
  125735. "lsr r6, r8, #16\n\t"
  125736. "lsr r7, r9, #16\n\t"
  125737. "mul r7, r6, r7\n\t"
  125738. "adds r5, r5, r7\n\t"
  125739. "adc r3, r3, #0\n\t"
  125740. "lsl r7, r9, #16\n\t"
  125741. "lsr r7, r7, #16\n\t"
  125742. "mul r6, r7, r6\n\t"
  125743. "lsr r7, r6, #16\n\t"
  125744. "lsl r6, r6, #16\n\t"
  125745. "adds r4, r4, r6\n\t"
  125746. "adcs r5, r5, r7\n\t"
  125747. "adc r3, r3, #0\n\t"
  125748. #else
  125749. "umull r6, r7, r8, r9\n\t"
  125750. "adds r4, r4, r6\n\t"
  125751. "adcs r5, r5, r7\n\t"
  125752. "adc r3, r3, #0\n\t"
  125753. #endif
  125754. "str r4, [sp, #28]\n\t"
  125755. /* A[8] * B[0] */
  125756. "ldr r8, [%[a], #32]\n\t"
  125757. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125758. "lsl r6, r8, #16\n\t"
  125759. "lsl r7, r9, #16\n\t"
  125760. "lsr r6, r6, #16\n\t"
  125761. "lsr r7, r7, #16\n\t"
  125762. "mul r7, r6, r7\n\t"
  125763. "adds r5, r5, r7\n\t"
  125764. "adcs r3, r3, #0\n\t"
  125765. "mov r4, #0\n\t"
  125766. "adc r4, r4, #0\n\t"
  125767. "lsr r7, r9, #16\n\t"
  125768. "mul r6, r7, r6\n\t"
  125769. "lsr r7, r6, #16\n\t"
  125770. "lsl r6, r6, #16\n\t"
  125771. "adds r5, r5, r6\n\t"
  125772. "adcs r3, r3, r7\n\t"
  125773. "adc r4, r4, #0\n\t"
  125774. "lsr r6, r8, #16\n\t"
  125775. "lsr r7, r9, #16\n\t"
  125776. "mul r7, r6, r7\n\t"
  125777. "adds r3, r3, r7\n\t"
  125778. "adc r4, r4, #0\n\t"
  125779. "lsl r7, r9, #16\n\t"
  125780. "lsr r7, r7, #16\n\t"
  125781. "mul r6, r7, r6\n\t"
  125782. "lsr r7, r6, #16\n\t"
  125783. "lsl r6, r6, #16\n\t"
  125784. "adds r5, r5, r6\n\t"
  125785. "adcs r3, r3, r7\n\t"
  125786. "adc r4, r4, #0\n\t"
  125787. #else
  125788. "umull r6, r7, r8, r9\n\t"
  125789. "adds r5, r5, r6\n\t"
  125790. "adcs r3, r3, r7\n\t"
  125791. "mov r4, #0\n\t"
  125792. "adc r4, r4, #0\n\t"
  125793. #endif
  125794. /* A[7] * B[1] */
  125795. "ldr r8, [%[a], #28]\n\t"
  125796. "ldr r9, [%[b], #4]\n\t"
  125797. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125798. "lsl r6, r8, #16\n\t"
  125799. "lsl r7, r9, #16\n\t"
  125800. "lsr r6, r6, #16\n\t"
  125801. "lsr r7, r7, #16\n\t"
  125802. "mul r7, r6, r7\n\t"
  125803. "adds r5, r5, r7\n\t"
  125804. "adcs r3, r3, #0\n\t"
  125805. "adc r4, r4, #0\n\t"
  125806. "lsr r7, r9, #16\n\t"
  125807. "mul r6, r7, r6\n\t"
  125808. "lsr r7, r6, #16\n\t"
  125809. "lsl r6, r6, #16\n\t"
  125810. "adds r5, r5, r6\n\t"
  125811. "adcs r3, r3, r7\n\t"
  125812. "adc r4, r4, #0\n\t"
  125813. "lsr r6, r8, #16\n\t"
  125814. "lsr r7, r9, #16\n\t"
  125815. "mul r7, r6, r7\n\t"
  125816. "adds r3, r3, r7\n\t"
  125817. "adc r4, r4, #0\n\t"
  125818. "lsl r7, r9, #16\n\t"
  125819. "lsr r7, r7, #16\n\t"
  125820. "mul r6, r7, r6\n\t"
  125821. "lsr r7, r6, #16\n\t"
  125822. "lsl r6, r6, #16\n\t"
  125823. "adds r5, r5, r6\n\t"
  125824. "adcs r3, r3, r7\n\t"
  125825. "adc r4, r4, #0\n\t"
  125826. #else
  125827. "umull r6, r7, r8, r9\n\t"
  125828. "adds r5, r5, r6\n\t"
  125829. "adcs r3, r3, r7\n\t"
  125830. "adc r4, r4, #0\n\t"
  125831. #endif
  125832. /* A[6] * B[2] */
  125833. "ldr r8, [%[a], #24]\n\t"
  125834. "ldr r9, [%[b], #8]\n\t"
  125835. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125836. "lsl r6, r8, #16\n\t"
  125837. "lsl r7, r9, #16\n\t"
  125838. "lsr r6, r6, #16\n\t"
  125839. "lsr r7, r7, #16\n\t"
  125840. "mul r7, r6, r7\n\t"
  125841. "adds r5, r5, r7\n\t"
  125842. "adcs r3, r3, #0\n\t"
  125843. "adc r4, r4, #0\n\t"
  125844. "lsr r7, r9, #16\n\t"
  125845. "mul r6, r7, r6\n\t"
  125846. "lsr r7, r6, #16\n\t"
  125847. "lsl r6, r6, #16\n\t"
  125848. "adds r5, r5, r6\n\t"
  125849. "adcs r3, r3, r7\n\t"
  125850. "adc r4, r4, #0\n\t"
  125851. "lsr r6, r8, #16\n\t"
  125852. "lsr r7, r9, #16\n\t"
  125853. "mul r7, r6, r7\n\t"
  125854. "adds r3, r3, r7\n\t"
  125855. "adc r4, r4, #0\n\t"
  125856. "lsl r7, r9, #16\n\t"
  125857. "lsr r7, r7, #16\n\t"
  125858. "mul r6, r7, r6\n\t"
  125859. "lsr r7, r6, #16\n\t"
  125860. "lsl r6, r6, #16\n\t"
  125861. "adds r5, r5, r6\n\t"
  125862. "adcs r3, r3, r7\n\t"
  125863. "adc r4, r4, #0\n\t"
  125864. #else
  125865. "umull r6, r7, r8, r9\n\t"
  125866. "adds r5, r5, r6\n\t"
  125867. "adcs r3, r3, r7\n\t"
  125868. "adc r4, r4, #0\n\t"
  125869. #endif
  125870. /* A[5] * B[3] */
  125871. "ldr r8, [%[a], #20]\n\t"
  125872. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125873. "lsl r6, r8, #16\n\t"
  125874. "lsl r7, r12, #16\n\t"
  125875. "lsr r6, r6, #16\n\t"
  125876. "lsr r7, r7, #16\n\t"
  125877. "mul r7, r6, r7\n\t"
  125878. "adds r5, r5, r7\n\t"
  125879. "adcs r3, r3, #0\n\t"
  125880. "adc r4, r4, #0\n\t"
  125881. "lsr r7, r12, #16\n\t"
  125882. "mul r6, r7, r6\n\t"
  125883. "lsr r7, r6, #16\n\t"
  125884. "lsl r6, r6, #16\n\t"
  125885. "adds r5, r5, r6\n\t"
  125886. "adcs r3, r3, r7\n\t"
  125887. "adc r4, r4, #0\n\t"
  125888. "lsr r6, r8, #16\n\t"
  125889. "lsr r7, r12, #16\n\t"
  125890. "mul r7, r6, r7\n\t"
  125891. "adds r3, r3, r7\n\t"
  125892. "adc r4, r4, #0\n\t"
  125893. "lsl r7, r12, #16\n\t"
  125894. "lsr r7, r7, #16\n\t"
  125895. "mul r6, r7, r6\n\t"
  125896. "lsr r7, r6, #16\n\t"
  125897. "lsl r6, r6, #16\n\t"
  125898. "adds r5, r5, r6\n\t"
  125899. "adcs r3, r3, r7\n\t"
  125900. "adc r4, r4, #0\n\t"
  125901. #else
  125902. "umull r6, r7, r8, r12\n\t"
  125903. "adds r5, r5, r6\n\t"
  125904. "adcs r3, r3, r7\n\t"
  125905. "adc r4, r4, #0\n\t"
  125906. #endif
  125907. /* A[4] * B[4] */
  125908. "ldr r11, [%[a], #16]\n\t"
  125909. "ldr r12, [%[b], #16]\n\t"
  125910. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125911. "lsl r6, r11, #16\n\t"
  125912. "lsl r7, r12, #16\n\t"
  125913. "lsr r6, r6, #16\n\t"
  125914. "lsr r7, r7, #16\n\t"
  125915. "mul r7, r6, r7\n\t"
  125916. "adds r5, r5, r7\n\t"
  125917. "adcs r3, r3, #0\n\t"
  125918. "adc r4, r4, #0\n\t"
  125919. "lsr r7, r12, #16\n\t"
  125920. "mul r6, r7, r6\n\t"
  125921. "lsr r7, r6, #16\n\t"
  125922. "lsl r6, r6, #16\n\t"
  125923. "adds r5, r5, r6\n\t"
  125924. "adcs r3, r3, r7\n\t"
  125925. "adc r4, r4, #0\n\t"
  125926. "lsr r6, r11, #16\n\t"
  125927. "lsr r7, r12, #16\n\t"
  125928. "mul r7, r6, r7\n\t"
  125929. "adds r3, r3, r7\n\t"
  125930. "adc r4, r4, #0\n\t"
  125931. "lsl r7, r12, #16\n\t"
  125932. "lsr r7, r7, #16\n\t"
  125933. "mul r6, r7, r6\n\t"
  125934. "lsr r7, r6, #16\n\t"
  125935. "lsl r6, r6, #16\n\t"
  125936. "adds r5, r5, r6\n\t"
  125937. "adcs r3, r3, r7\n\t"
  125938. "adc r4, r4, #0\n\t"
  125939. #else
  125940. "umull r6, r7, r11, r12\n\t"
  125941. "adds r5, r5, r6\n\t"
  125942. "adcs r3, r3, r7\n\t"
  125943. "adc r4, r4, #0\n\t"
  125944. #endif
  125945. /* A[3] * B[5] */
  125946. "ldr r8, [%[a], #12]\n\t"
  125947. "ldr r9, [%[b], #20]\n\t"
  125948. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125949. "lsl r6, r8, #16\n\t"
  125950. "lsl r7, r9, #16\n\t"
  125951. "lsr r6, r6, #16\n\t"
  125952. "lsr r7, r7, #16\n\t"
  125953. "mul r7, r6, r7\n\t"
  125954. "adds r5, r5, r7\n\t"
  125955. "adcs r3, r3, #0\n\t"
  125956. "adc r4, r4, #0\n\t"
  125957. "lsr r7, r9, #16\n\t"
  125958. "mul r6, r7, r6\n\t"
  125959. "lsr r7, r6, #16\n\t"
  125960. "lsl r6, r6, #16\n\t"
  125961. "adds r5, r5, r6\n\t"
  125962. "adcs r3, r3, r7\n\t"
  125963. "adc r4, r4, #0\n\t"
  125964. "lsr r6, r8, #16\n\t"
  125965. "lsr r7, r9, #16\n\t"
  125966. "mul r7, r6, r7\n\t"
  125967. "adds r3, r3, r7\n\t"
  125968. "adc r4, r4, #0\n\t"
  125969. "lsl r7, r9, #16\n\t"
  125970. "lsr r7, r7, #16\n\t"
  125971. "mul r6, r7, r6\n\t"
  125972. "lsr r7, r6, #16\n\t"
  125973. "lsl r6, r6, #16\n\t"
  125974. "adds r5, r5, r6\n\t"
  125975. "adcs r3, r3, r7\n\t"
  125976. "adc r4, r4, #0\n\t"
  125977. #else
  125978. "umull r6, r7, r8, r9\n\t"
  125979. "adds r5, r5, r6\n\t"
  125980. "adcs r3, r3, r7\n\t"
  125981. "adc r4, r4, #0\n\t"
  125982. #endif
  125983. /* A[2] * B[6] */
  125984. "ldr r8, [%[a], #8]\n\t"
  125985. "ldr r9, [%[b], #24]\n\t"
  125986. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  125987. "lsl r6, r8, #16\n\t"
  125988. "lsl r7, r9, #16\n\t"
  125989. "lsr r6, r6, #16\n\t"
  125990. "lsr r7, r7, #16\n\t"
  125991. "mul r7, r6, r7\n\t"
  125992. "adds r5, r5, r7\n\t"
  125993. "adcs r3, r3, #0\n\t"
  125994. "adc r4, r4, #0\n\t"
  125995. "lsr r7, r9, #16\n\t"
  125996. "mul r6, r7, r6\n\t"
  125997. "lsr r7, r6, #16\n\t"
  125998. "lsl r6, r6, #16\n\t"
  125999. "adds r5, r5, r6\n\t"
  126000. "adcs r3, r3, r7\n\t"
  126001. "adc r4, r4, #0\n\t"
  126002. "lsr r6, r8, #16\n\t"
  126003. "lsr r7, r9, #16\n\t"
  126004. "mul r7, r6, r7\n\t"
  126005. "adds r3, r3, r7\n\t"
  126006. "adc r4, r4, #0\n\t"
  126007. "lsl r7, r9, #16\n\t"
  126008. "lsr r7, r7, #16\n\t"
  126009. "mul r6, r7, r6\n\t"
  126010. "lsr r7, r6, #16\n\t"
  126011. "lsl r6, r6, #16\n\t"
  126012. "adds r5, r5, r6\n\t"
  126013. "adcs r3, r3, r7\n\t"
  126014. "adc r4, r4, #0\n\t"
  126015. #else
  126016. "umull r6, r7, r8, r9\n\t"
  126017. "adds r5, r5, r6\n\t"
  126018. "adcs r3, r3, r7\n\t"
  126019. "adc r4, r4, #0\n\t"
  126020. #endif
  126021. /* A[1] * B[7] */
  126022. "ldr r8, [%[a], #4]\n\t"
  126023. "ldr r9, [%[b], #28]\n\t"
  126024. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126025. "lsl r6, r8, #16\n\t"
  126026. "lsl r7, r9, #16\n\t"
  126027. "lsr r6, r6, #16\n\t"
  126028. "lsr r7, r7, #16\n\t"
  126029. "mul r7, r6, r7\n\t"
  126030. "adds r5, r5, r7\n\t"
  126031. "adcs r3, r3, #0\n\t"
  126032. "adc r4, r4, #0\n\t"
  126033. "lsr r7, r9, #16\n\t"
  126034. "mul r6, r7, r6\n\t"
  126035. "lsr r7, r6, #16\n\t"
  126036. "lsl r6, r6, #16\n\t"
  126037. "adds r5, r5, r6\n\t"
  126038. "adcs r3, r3, r7\n\t"
  126039. "adc r4, r4, #0\n\t"
  126040. "lsr r6, r8, #16\n\t"
  126041. "lsr r7, r9, #16\n\t"
  126042. "mul r7, r6, r7\n\t"
  126043. "adds r3, r3, r7\n\t"
  126044. "adc r4, r4, #0\n\t"
  126045. "lsl r7, r9, #16\n\t"
  126046. "lsr r7, r7, #16\n\t"
  126047. "mul r6, r7, r6\n\t"
  126048. "lsr r7, r6, #16\n\t"
  126049. "lsl r6, r6, #16\n\t"
  126050. "adds r5, r5, r6\n\t"
  126051. "adcs r3, r3, r7\n\t"
  126052. "adc r4, r4, #0\n\t"
  126053. #else
  126054. "umull r6, r7, r8, r9\n\t"
  126055. "adds r5, r5, r6\n\t"
  126056. "adcs r3, r3, r7\n\t"
  126057. "adc r4, r4, #0\n\t"
  126058. #endif
  126059. /* A[0] * B[8] */
  126060. "ldr r8, [%[a]]\n\t"
  126061. "ldr r9, [%[b], #32]\n\t"
  126062. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126063. "lsl r6, r8, #16\n\t"
  126064. "lsl r7, r9, #16\n\t"
  126065. "lsr r6, r6, #16\n\t"
  126066. "lsr r7, r7, #16\n\t"
  126067. "mul r7, r6, r7\n\t"
  126068. "adds r5, r5, r7\n\t"
  126069. "adcs r3, r3, #0\n\t"
  126070. "adc r4, r4, #0\n\t"
  126071. "lsr r7, r9, #16\n\t"
  126072. "mul r6, r7, r6\n\t"
  126073. "lsr r7, r6, #16\n\t"
  126074. "lsl r6, r6, #16\n\t"
  126075. "adds r5, r5, r6\n\t"
  126076. "adcs r3, r3, r7\n\t"
  126077. "adc r4, r4, #0\n\t"
  126078. "lsr r6, r8, #16\n\t"
  126079. "lsr r7, r9, #16\n\t"
  126080. "mul r7, r6, r7\n\t"
  126081. "adds r3, r3, r7\n\t"
  126082. "adc r4, r4, #0\n\t"
  126083. "lsl r7, r9, #16\n\t"
  126084. "lsr r7, r7, #16\n\t"
  126085. "mul r6, r7, r6\n\t"
  126086. "lsr r7, r6, #16\n\t"
  126087. "lsl r6, r6, #16\n\t"
  126088. "adds r5, r5, r6\n\t"
  126089. "adcs r3, r3, r7\n\t"
  126090. "adc r4, r4, #0\n\t"
  126091. #else
  126092. "umull r6, r7, r8, r9\n\t"
  126093. "adds r5, r5, r6\n\t"
  126094. "adcs r3, r3, r7\n\t"
  126095. "adc r4, r4, #0\n\t"
  126096. #endif
  126097. "str r5, [sp, #32]\n\t"
  126098. /* A[0] * B[9] */
  126099. "ldr r9, [%[b], #36]\n\t"
  126100. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126101. "lsl r6, r8, #16\n\t"
  126102. "lsl r7, r9, #16\n\t"
  126103. "lsr r6, r6, #16\n\t"
  126104. "lsr r7, r7, #16\n\t"
  126105. "mul r7, r6, r7\n\t"
  126106. "adds r3, r3, r7\n\t"
  126107. "adcs r4, r4, #0\n\t"
  126108. "mov r5, #0\n\t"
  126109. "adc r5, r5, #0\n\t"
  126110. "lsr r7, r9, #16\n\t"
  126111. "mul r6, r7, r6\n\t"
  126112. "lsr r7, r6, #16\n\t"
  126113. "lsl r6, r6, #16\n\t"
  126114. "adds r3, r3, r6\n\t"
  126115. "adcs r4, r4, r7\n\t"
  126116. "adc r5, r5, #0\n\t"
  126117. "lsr r6, r8, #16\n\t"
  126118. "lsr r7, r9, #16\n\t"
  126119. "mul r7, r6, r7\n\t"
  126120. "adds r4, r4, r7\n\t"
  126121. "adc r5, r5, #0\n\t"
  126122. "lsl r7, r9, #16\n\t"
  126123. "lsr r7, r7, #16\n\t"
  126124. "mul r6, r7, r6\n\t"
  126125. "lsr r7, r6, #16\n\t"
  126126. "lsl r6, r6, #16\n\t"
  126127. "adds r3, r3, r6\n\t"
  126128. "adcs r4, r4, r7\n\t"
  126129. "adc r5, r5, #0\n\t"
  126130. #else
  126131. "umull r6, r7, r8, r9\n\t"
  126132. "adds r3, r3, r6\n\t"
  126133. "adcs r4, r4, r7\n\t"
  126134. "mov r5, #0\n\t"
  126135. "adc r5, r5, #0\n\t"
  126136. #endif
  126137. /* A[1] * B[8] */
  126138. "ldr r8, [%[a], #4]\n\t"
  126139. "ldr r9, [%[b], #32]\n\t"
  126140. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126141. "lsl r6, r8, #16\n\t"
  126142. "lsl r7, r9, #16\n\t"
  126143. "lsr r6, r6, #16\n\t"
  126144. "lsr r7, r7, #16\n\t"
  126145. "mul r7, r6, r7\n\t"
  126146. "adds r3, r3, r7\n\t"
  126147. "adcs r4, r4, #0\n\t"
  126148. "adc r5, r5, #0\n\t"
  126149. "lsr r7, r9, #16\n\t"
  126150. "mul r6, r7, r6\n\t"
  126151. "lsr r7, r6, #16\n\t"
  126152. "lsl r6, r6, #16\n\t"
  126153. "adds r3, r3, r6\n\t"
  126154. "adcs r4, r4, r7\n\t"
  126155. "adc r5, r5, #0\n\t"
  126156. "lsr r6, r8, #16\n\t"
  126157. "lsr r7, r9, #16\n\t"
  126158. "mul r7, r6, r7\n\t"
  126159. "adds r4, r4, r7\n\t"
  126160. "adc r5, r5, #0\n\t"
  126161. "lsl r7, r9, #16\n\t"
  126162. "lsr r7, r7, #16\n\t"
  126163. "mul r6, r7, r6\n\t"
  126164. "lsr r7, r6, #16\n\t"
  126165. "lsl r6, r6, #16\n\t"
  126166. "adds r3, r3, r6\n\t"
  126167. "adcs r4, r4, r7\n\t"
  126168. "adc r5, r5, #0\n\t"
  126169. #else
  126170. "umull r6, r7, r8, r9\n\t"
  126171. "adds r3, r3, r6\n\t"
  126172. "adcs r4, r4, r7\n\t"
  126173. "adc r5, r5, #0\n\t"
  126174. #endif
  126175. /* A[2] * B[7] */
  126176. "ldr r8, [%[a], #8]\n\t"
  126177. "ldr r9, [%[b], #28]\n\t"
  126178. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126179. "lsl r6, r8, #16\n\t"
  126180. "lsl r7, r9, #16\n\t"
  126181. "lsr r6, r6, #16\n\t"
  126182. "lsr r7, r7, #16\n\t"
  126183. "mul r7, r6, r7\n\t"
  126184. "adds r3, r3, r7\n\t"
  126185. "adcs r4, r4, #0\n\t"
  126186. "adc r5, r5, #0\n\t"
  126187. "lsr r7, r9, #16\n\t"
  126188. "mul r6, r7, r6\n\t"
  126189. "lsr r7, r6, #16\n\t"
  126190. "lsl r6, r6, #16\n\t"
  126191. "adds r3, r3, r6\n\t"
  126192. "adcs r4, r4, r7\n\t"
  126193. "adc r5, r5, #0\n\t"
  126194. "lsr r6, r8, #16\n\t"
  126195. "lsr r7, r9, #16\n\t"
  126196. "mul r7, r6, r7\n\t"
  126197. "adds r4, r4, r7\n\t"
  126198. "adc r5, r5, #0\n\t"
  126199. "lsl r7, r9, #16\n\t"
  126200. "lsr r7, r7, #16\n\t"
  126201. "mul r6, r7, r6\n\t"
  126202. "lsr r7, r6, #16\n\t"
  126203. "lsl r6, r6, #16\n\t"
  126204. "adds r3, r3, r6\n\t"
  126205. "adcs r4, r4, r7\n\t"
  126206. "adc r5, r5, #0\n\t"
  126207. #else
  126208. "umull r6, r7, r8, r9\n\t"
  126209. "adds r3, r3, r6\n\t"
  126210. "adcs r4, r4, r7\n\t"
  126211. "adc r5, r5, #0\n\t"
  126212. #endif
  126213. /* A[3] * B[6] */
  126214. "ldr r8, [%[a], #12]\n\t"
  126215. "ldr r9, [%[b], #24]\n\t"
  126216. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126217. "lsl r6, r8, #16\n\t"
  126218. "lsl r7, r9, #16\n\t"
  126219. "lsr r6, r6, #16\n\t"
  126220. "lsr r7, r7, #16\n\t"
  126221. "mul r7, r6, r7\n\t"
  126222. "adds r3, r3, r7\n\t"
  126223. "adcs r4, r4, #0\n\t"
  126224. "adc r5, r5, #0\n\t"
  126225. "lsr r7, r9, #16\n\t"
  126226. "mul r6, r7, r6\n\t"
  126227. "lsr r7, r6, #16\n\t"
  126228. "lsl r6, r6, #16\n\t"
  126229. "adds r3, r3, r6\n\t"
  126230. "adcs r4, r4, r7\n\t"
  126231. "adc r5, r5, #0\n\t"
  126232. "lsr r6, r8, #16\n\t"
  126233. "lsr r7, r9, #16\n\t"
  126234. "mul r7, r6, r7\n\t"
  126235. "adds r4, r4, r7\n\t"
  126236. "adc r5, r5, #0\n\t"
  126237. "lsl r7, r9, #16\n\t"
  126238. "lsr r7, r7, #16\n\t"
  126239. "mul r6, r7, r6\n\t"
  126240. "lsr r7, r6, #16\n\t"
  126241. "lsl r6, r6, #16\n\t"
  126242. "adds r3, r3, r6\n\t"
  126243. "adcs r4, r4, r7\n\t"
  126244. "adc r5, r5, #0\n\t"
  126245. #else
  126246. "umull r6, r7, r8, r9\n\t"
  126247. "adds r3, r3, r6\n\t"
  126248. "adcs r4, r4, r7\n\t"
  126249. "adc r5, r5, #0\n\t"
  126250. #endif
  126251. /* A[4] * B[5] */
  126252. "ldr r9, [%[b], #20]\n\t"
  126253. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126254. "lsl r6, r11, #16\n\t"
  126255. "lsl r7, r9, #16\n\t"
  126256. "lsr r6, r6, #16\n\t"
  126257. "lsr r7, r7, #16\n\t"
  126258. "mul r7, r6, r7\n\t"
  126259. "adds r3, r3, r7\n\t"
  126260. "adcs r4, r4, #0\n\t"
  126261. "adc r5, r5, #0\n\t"
  126262. "lsr r7, r9, #16\n\t"
  126263. "mul r6, r7, r6\n\t"
  126264. "lsr r7, r6, #16\n\t"
  126265. "lsl r6, r6, #16\n\t"
  126266. "adds r3, r3, r6\n\t"
  126267. "adcs r4, r4, r7\n\t"
  126268. "adc r5, r5, #0\n\t"
  126269. "lsr r6, r11, #16\n\t"
  126270. "lsr r7, r9, #16\n\t"
  126271. "mul r7, r6, r7\n\t"
  126272. "adds r4, r4, r7\n\t"
  126273. "adc r5, r5, #0\n\t"
  126274. "lsl r7, r9, #16\n\t"
  126275. "lsr r7, r7, #16\n\t"
  126276. "mul r6, r7, r6\n\t"
  126277. "lsr r7, r6, #16\n\t"
  126278. "lsl r6, r6, #16\n\t"
  126279. "adds r3, r3, r6\n\t"
  126280. "adcs r4, r4, r7\n\t"
  126281. "adc r5, r5, #0\n\t"
  126282. #else
  126283. "umull r6, r7, r11, r9\n\t"
  126284. "adds r3, r3, r6\n\t"
  126285. "adcs r4, r4, r7\n\t"
  126286. "adc r5, r5, #0\n\t"
  126287. #endif
  126288. /* A[5] * B[4] */
  126289. "ldr r8, [%[a], #20]\n\t"
  126290. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126291. "lsl r6, r8, #16\n\t"
  126292. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[6] * B[3] */
  126326. "ldr r8, [%[a], #24]\n\t"
  126327. "ldr r9, [%[b], #12]\n\t"
  126328. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126329. "lsl r6, r8, #16\n\t"
  126330. "lsl r7, r9, #16\n\t"
  126331. "lsr r6, r6, #16\n\t"
  126332. "lsr r7, r7, #16\n\t"
  126333. "mul r7, r6, r7\n\t"
  126334. "adds r3, r3, r7\n\t"
  126335. "adcs r4, r4, #0\n\t"
  126336. "adc r5, r5, #0\n\t"
  126337. "lsr r7, r9, #16\n\t"
  126338. "mul r6, r7, r6\n\t"
  126339. "lsr r7, r6, #16\n\t"
  126340. "lsl r6, r6, #16\n\t"
  126341. "adds r3, r3, r6\n\t"
  126342. "adcs r4, r4, r7\n\t"
  126343. "adc r5, r5, #0\n\t"
  126344. "lsr r6, r8, #16\n\t"
  126345. "lsr r7, r9, #16\n\t"
  126346. "mul r7, r6, r7\n\t"
  126347. "adds r4, r4, r7\n\t"
  126348. "adc r5, r5, #0\n\t"
  126349. "lsl r7, r9, #16\n\t"
  126350. "lsr r7, r7, #16\n\t"
  126351. "mul r6, r7, r6\n\t"
  126352. "lsr r7, r6, #16\n\t"
  126353. "lsl r6, r6, #16\n\t"
  126354. "adds r3, r3, r6\n\t"
  126355. "adcs r4, r4, r7\n\t"
  126356. "adc r5, r5, #0\n\t"
  126357. #else
  126358. "umull r6, r7, r8, r9\n\t"
  126359. "adds r3, r3, r6\n\t"
  126360. "adcs r4, r4, r7\n\t"
  126361. "adc r5, r5, #0\n\t"
  126362. #endif
  126363. /* A[7] * B[2] */
  126364. "ldr r8, [%[a], #28]\n\t"
  126365. "ldr r9, [%[b], #8]\n\t"
  126366. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126367. "lsl r6, r8, #16\n\t"
  126368. "lsl r7, r9, #16\n\t"
  126369. "lsr r6, r6, #16\n\t"
  126370. "lsr r7, r7, #16\n\t"
  126371. "mul r7, r6, r7\n\t"
  126372. "adds r3, r3, r7\n\t"
  126373. "adcs r4, r4, #0\n\t"
  126374. "adc r5, r5, #0\n\t"
  126375. "lsr r7, r9, #16\n\t"
  126376. "mul r6, r7, r6\n\t"
  126377. "lsr r7, r6, #16\n\t"
  126378. "lsl r6, r6, #16\n\t"
  126379. "adds r3, r3, r6\n\t"
  126380. "adcs r4, r4, r7\n\t"
  126381. "adc r5, r5, #0\n\t"
  126382. "lsr r6, r8, #16\n\t"
  126383. "lsr r7, r9, #16\n\t"
  126384. "mul r7, r6, r7\n\t"
  126385. "adds r4, r4, r7\n\t"
  126386. "adc r5, r5, #0\n\t"
  126387. "lsl r7, r9, #16\n\t"
  126388. "lsr r7, r7, #16\n\t"
  126389. "mul r6, r7, r6\n\t"
  126390. "lsr r7, r6, #16\n\t"
  126391. "lsl r6, r6, #16\n\t"
  126392. "adds r3, r3, r6\n\t"
  126393. "adcs r4, r4, r7\n\t"
  126394. "adc r5, r5, #0\n\t"
  126395. #else
  126396. "umull r6, r7, r8, r9\n\t"
  126397. "adds r3, r3, r6\n\t"
  126398. "adcs r4, r4, r7\n\t"
  126399. "adc r5, r5, #0\n\t"
  126400. #endif
  126401. /* A[8] * B[1] */
  126402. "ldr r8, [%[a], #32]\n\t"
  126403. "ldr r9, [%[b], #4]\n\t"
  126404. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126405. "lsl r6, r8, #16\n\t"
  126406. "lsl r7, r9, #16\n\t"
  126407. "lsr r6, r6, #16\n\t"
  126408. "lsr r7, r7, #16\n\t"
  126409. "mul r7, r6, r7\n\t"
  126410. "adds r3, r3, r7\n\t"
  126411. "adcs r4, r4, #0\n\t"
  126412. "adc r5, r5, #0\n\t"
  126413. "lsr r7, r9, #16\n\t"
  126414. "mul r6, r7, r6\n\t"
  126415. "lsr r7, r6, #16\n\t"
  126416. "lsl r6, r6, #16\n\t"
  126417. "adds r3, r3, r6\n\t"
  126418. "adcs r4, r4, r7\n\t"
  126419. "adc r5, r5, #0\n\t"
  126420. "lsr r6, r8, #16\n\t"
  126421. "lsr r7, r9, #16\n\t"
  126422. "mul r7, r6, r7\n\t"
  126423. "adds r4, r4, r7\n\t"
  126424. "adc r5, r5, #0\n\t"
  126425. "lsl r7, r9, #16\n\t"
  126426. "lsr r7, r7, #16\n\t"
  126427. "mul r6, r7, r6\n\t"
  126428. "lsr r7, r6, #16\n\t"
  126429. "lsl r6, r6, #16\n\t"
  126430. "adds r3, r3, r6\n\t"
  126431. "adcs r4, r4, r7\n\t"
  126432. "adc r5, r5, #0\n\t"
  126433. #else
  126434. "umull r6, r7, r8, r9\n\t"
  126435. "adds r3, r3, r6\n\t"
  126436. "adcs r4, r4, r7\n\t"
  126437. "adc r5, r5, #0\n\t"
  126438. #endif
  126439. /* A[9] * B[0] */
  126440. "ldr r8, [%[a], #36]\n\t"
  126441. "ldr r9, [%[b]]\n\t"
  126442. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126443. "lsl r6, r8, #16\n\t"
  126444. "lsl r7, r9, #16\n\t"
  126445. "lsr r6, r6, #16\n\t"
  126446. "lsr r7, r7, #16\n\t"
  126447. "mul r7, r6, r7\n\t"
  126448. "adds r3, r3, r7\n\t"
  126449. "adcs r4, r4, #0\n\t"
  126450. "adc r5, r5, #0\n\t"
  126451. "lsr r7, r9, #16\n\t"
  126452. "mul r6, r7, r6\n\t"
  126453. "lsr r7, r6, #16\n\t"
  126454. "lsl r6, r6, #16\n\t"
  126455. "adds r3, r3, r6\n\t"
  126456. "adcs r4, r4, r7\n\t"
  126457. "adc r5, r5, #0\n\t"
  126458. "lsr r6, r8, #16\n\t"
  126459. "lsr r7, r9, #16\n\t"
  126460. "mul r7, r6, r7\n\t"
  126461. "adds r4, r4, r7\n\t"
  126462. "adc r5, r5, #0\n\t"
  126463. "lsl r7, r9, #16\n\t"
  126464. "lsr r7, r7, #16\n\t"
  126465. "mul r6, r7, r6\n\t"
  126466. "lsr r7, r6, #16\n\t"
  126467. "lsl r6, r6, #16\n\t"
  126468. "adds r3, r3, r6\n\t"
  126469. "adcs r4, r4, r7\n\t"
  126470. "adc r5, r5, #0\n\t"
  126471. #else
  126472. "umull r6, r7, r8, r9\n\t"
  126473. "adds r3, r3, r6\n\t"
  126474. "adcs r4, r4, r7\n\t"
  126475. "adc r5, r5, #0\n\t"
  126476. #endif
  126477. "str r3, [sp, #36]\n\t"
  126478. /* A[10] * B[0] */
  126479. "ldr r8, [%[a], #40]\n\t"
  126480. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126481. "lsl r6, r8, #16\n\t"
  126482. "lsl r7, r9, #16\n\t"
  126483. "lsr r6, r6, #16\n\t"
  126484. "lsr r7, r7, #16\n\t"
  126485. "mul r7, r6, r7\n\t"
  126486. "adds r4, r4, r7\n\t"
  126487. "adcs r5, r5, #0\n\t"
  126488. "mov r3, #0\n\t"
  126489. "adc r3, r3, #0\n\t"
  126490. "lsr r7, r9, #16\n\t"
  126491. "mul r6, r7, r6\n\t"
  126492. "lsr r7, r6, #16\n\t"
  126493. "lsl r6, r6, #16\n\t"
  126494. "adds r4, r4, r6\n\t"
  126495. "adcs r5, r5, r7\n\t"
  126496. "adc r3, r3, #0\n\t"
  126497. "lsr r6, r8, #16\n\t"
  126498. "lsr r7, r9, #16\n\t"
  126499. "mul r7, r6, r7\n\t"
  126500. "adds r5, r5, r7\n\t"
  126501. "adc r3, r3, #0\n\t"
  126502. "lsl r7, r9, #16\n\t"
  126503. "lsr r7, r7, #16\n\t"
  126504. "mul r6, r7, r6\n\t"
  126505. "lsr r7, r6, #16\n\t"
  126506. "lsl r6, r6, #16\n\t"
  126507. "adds r4, r4, r6\n\t"
  126508. "adcs r5, r5, r7\n\t"
  126509. "adc r3, r3, #0\n\t"
  126510. #else
  126511. "umull r6, r7, r8, r9\n\t"
  126512. "adds r4, r4, r6\n\t"
  126513. "adcs r5, r5, r7\n\t"
  126514. "mov r3, #0\n\t"
  126515. "adc r3, r3, #0\n\t"
  126516. #endif
  126517. /* A[9] * B[1] */
  126518. "ldr r8, [%[a], #36]\n\t"
  126519. "ldr r9, [%[b], #4]\n\t"
  126520. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126521. "lsl r6, r8, #16\n\t"
  126522. "lsl r7, r9, #16\n\t"
  126523. "lsr r6, r6, #16\n\t"
  126524. "lsr r7, r7, #16\n\t"
  126525. "mul r7, r6, r7\n\t"
  126526. "adds r4, r4, r7\n\t"
  126527. "adcs r5, r5, #0\n\t"
  126528. "adc r3, r3, #0\n\t"
  126529. "lsr r7, r9, #16\n\t"
  126530. "mul r6, r7, r6\n\t"
  126531. "lsr r7, r6, #16\n\t"
  126532. "lsl r6, r6, #16\n\t"
  126533. "adds r4, r4, r6\n\t"
  126534. "adcs r5, r5, r7\n\t"
  126535. "adc r3, r3, #0\n\t"
  126536. "lsr r6, r8, #16\n\t"
  126537. "lsr r7, r9, #16\n\t"
  126538. "mul r7, r6, r7\n\t"
  126539. "adds r5, r5, r7\n\t"
  126540. "adc r3, r3, #0\n\t"
  126541. "lsl r7, r9, #16\n\t"
  126542. "lsr r7, r7, #16\n\t"
  126543. "mul r6, r7, r6\n\t"
  126544. "lsr r7, r6, #16\n\t"
  126545. "lsl r6, r6, #16\n\t"
  126546. "adds r4, r4, r6\n\t"
  126547. "adcs r5, r5, r7\n\t"
  126548. "adc r3, r3, #0\n\t"
  126549. #else
  126550. "umull r6, r7, r8, r9\n\t"
  126551. "adds r4, r4, r6\n\t"
  126552. "adcs r5, r5, r7\n\t"
  126553. "adc r3, r3, #0\n\t"
  126554. #endif
  126555. /* A[8] * B[2] */
  126556. "ldr r8, [%[a], #32]\n\t"
  126557. "ldr r9, [%[b], #8]\n\t"
  126558. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126559. "lsl r6, r8, #16\n\t"
  126560. "lsl r7, r9, #16\n\t"
  126561. "lsr r6, r6, #16\n\t"
  126562. "lsr r7, r7, #16\n\t"
  126563. "mul r7, r6, r7\n\t"
  126564. "adds r4, r4, r7\n\t"
  126565. "adcs r5, r5, #0\n\t"
  126566. "adc r3, r3, #0\n\t"
  126567. "lsr r7, r9, #16\n\t"
  126568. "mul r6, r7, r6\n\t"
  126569. "lsr r7, r6, #16\n\t"
  126570. "lsl r6, r6, #16\n\t"
  126571. "adds r4, r4, r6\n\t"
  126572. "adcs r5, r5, r7\n\t"
  126573. "adc r3, r3, #0\n\t"
  126574. "lsr r6, r8, #16\n\t"
  126575. "lsr r7, r9, #16\n\t"
  126576. "mul r7, r6, r7\n\t"
  126577. "adds r5, r5, r7\n\t"
  126578. "adc r3, r3, #0\n\t"
  126579. "lsl r7, r9, #16\n\t"
  126580. "lsr r7, r7, #16\n\t"
  126581. "mul r6, r7, r6\n\t"
  126582. "lsr r7, r6, #16\n\t"
  126583. "lsl r6, r6, #16\n\t"
  126584. "adds r4, r4, r6\n\t"
  126585. "adcs r5, r5, r7\n\t"
  126586. "adc r3, r3, #0\n\t"
  126587. #else
  126588. "umull r6, r7, r8, r9\n\t"
  126589. "adds r4, r4, r6\n\t"
  126590. "adcs r5, r5, r7\n\t"
  126591. "adc r3, r3, #0\n\t"
  126592. #endif
  126593. /* A[7] * B[3] */
  126594. "ldr r8, [%[a], #28]\n\t"
  126595. "ldr r9, [%[b], #12]\n\t"
  126596. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126597. "lsl r6, r8, #16\n\t"
  126598. "lsl r7, r9, #16\n\t"
  126599. "lsr r6, r6, #16\n\t"
  126600. "lsr r7, r7, #16\n\t"
  126601. "mul r7, r6, r7\n\t"
  126602. "adds r4, r4, r7\n\t"
  126603. "adcs r5, r5, #0\n\t"
  126604. "adc r3, r3, #0\n\t"
  126605. "lsr r7, r9, #16\n\t"
  126606. "mul r6, r7, r6\n\t"
  126607. "lsr r7, r6, #16\n\t"
  126608. "lsl r6, r6, #16\n\t"
  126609. "adds r4, r4, r6\n\t"
  126610. "adcs r5, r5, r7\n\t"
  126611. "adc r3, r3, #0\n\t"
  126612. "lsr r6, r8, #16\n\t"
  126613. "lsr r7, r9, #16\n\t"
  126614. "mul r7, r6, r7\n\t"
  126615. "adds r5, r5, r7\n\t"
  126616. "adc r3, r3, #0\n\t"
  126617. "lsl r7, r9, #16\n\t"
  126618. "lsr r7, r7, #16\n\t"
  126619. "mul r6, r7, r6\n\t"
  126620. "lsr r7, r6, #16\n\t"
  126621. "lsl r6, r6, #16\n\t"
  126622. "adds r4, r4, r6\n\t"
  126623. "adcs r5, r5, r7\n\t"
  126624. "adc r3, r3, #0\n\t"
  126625. #else
  126626. "umull r6, r7, r8, r9\n\t"
  126627. "adds r4, r4, r6\n\t"
  126628. "adcs r5, r5, r7\n\t"
  126629. "adc r3, r3, #0\n\t"
  126630. #endif
  126631. /* A[6] * B[4] */
  126632. "ldr r8, [%[a], #24]\n\t"
  126633. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126634. "lsl r6, r8, #16\n\t"
  126635. "lsl r7, r12, #16\n\t"
  126636. "lsr r6, r6, #16\n\t"
  126637. "lsr r7, r7, #16\n\t"
  126638. "mul r7, r6, r7\n\t"
  126639. "adds r4, r4, r7\n\t"
  126640. "adcs r5, r5, #0\n\t"
  126641. "adc r3, r3, #0\n\t"
  126642. "lsr r7, r12, #16\n\t"
  126643. "mul r6, r7, r6\n\t"
  126644. "lsr r7, r6, #16\n\t"
  126645. "lsl r6, r6, #16\n\t"
  126646. "adds r4, r4, r6\n\t"
  126647. "adcs r5, r5, r7\n\t"
  126648. "adc r3, r3, #0\n\t"
  126649. "lsr r6, r8, #16\n\t"
  126650. "lsr r7, r12, #16\n\t"
  126651. "mul r7, r6, r7\n\t"
  126652. "adds r5, r5, r7\n\t"
  126653. "adc r3, r3, #0\n\t"
  126654. "lsl r7, r12, #16\n\t"
  126655. "lsr r7, r7, #16\n\t"
  126656. "mul r6, r7, r6\n\t"
  126657. "lsr r7, r6, #16\n\t"
  126658. "lsl r6, r6, #16\n\t"
  126659. "adds r4, r4, r6\n\t"
  126660. "adcs r5, r5, r7\n\t"
  126661. "adc r3, r3, #0\n\t"
  126662. #else
  126663. "umull r6, r7, r8, r12\n\t"
  126664. "adds r4, r4, r6\n\t"
  126665. "adcs r5, r5, r7\n\t"
  126666. "adc r3, r3, #0\n\t"
  126667. #endif
  126668. /* A[5] * B[5] */
  126669. "ldr r11, [%[a], #20]\n\t"
  126670. "ldr r12, [%[b], #20]\n\t"
  126671. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126672. "lsl r6, r11, #16\n\t"
  126673. "lsl r7, r12, #16\n\t"
  126674. "lsr r6, r6, #16\n\t"
  126675. "lsr r7, r7, #16\n\t"
  126676. "mul r7, r6, r7\n\t"
  126677. "adds r4, r4, r7\n\t"
  126678. "adcs r5, r5, #0\n\t"
  126679. "adc r3, r3, #0\n\t"
  126680. "lsr r7, r12, #16\n\t"
  126681. "mul r6, r7, r6\n\t"
  126682. "lsr r7, r6, #16\n\t"
  126683. "lsl r6, r6, #16\n\t"
  126684. "adds r4, r4, r6\n\t"
  126685. "adcs r5, r5, r7\n\t"
  126686. "adc r3, r3, #0\n\t"
  126687. "lsr r6, r11, #16\n\t"
  126688. "lsr r7, r12, #16\n\t"
  126689. "mul r7, r6, r7\n\t"
  126690. "adds r5, r5, r7\n\t"
  126691. "adc r3, r3, #0\n\t"
  126692. "lsl r7, r12, #16\n\t"
  126693. "lsr r7, r7, #16\n\t"
  126694. "mul r6, r7, r6\n\t"
  126695. "lsr r7, r6, #16\n\t"
  126696. "lsl r6, r6, #16\n\t"
  126697. "adds r4, r4, r6\n\t"
  126698. "adcs r5, r5, r7\n\t"
  126699. "adc r3, r3, #0\n\t"
  126700. #else
  126701. "umull r6, r7, r11, r12\n\t"
  126702. "adds r4, r4, r6\n\t"
  126703. "adcs r5, r5, r7\n\t"
  126704. "adc r3, r3, #0\n\t"
  126705. #endif
  126706. /* A[4] * B[6] */
  126707. "ldr r8, [%[a], #16]\n\t"
  126708. "ldr r9, [%[b], #24]\n\t"
  126709. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126710. "lsl r6, r8, #16\n\t"
  126711. "lsl r7, r9, #16\n\t"
  126712. "lsr r6, r6, #16\n\t"
  126713. "lsr r7, r7, #16\n\t"
  126714. "mul r7, r6, r7\n\t"
  126715. "adds r4, r4, r7\n\t"
  126716. "adcs r5, r5, #0\n\t"
  126717. "adc r3, r3, #0\n\t"
  126718. "lsr r7, r9, #16\n\t"
  126719. "mul r6, r7, r6\n\t"
  126720. "lsr r7, r6, #16\n\t"
  126721. "lsl r6, r6, #16\n\t"
  126722. "adds r4, r4, r6\n\t"
  126723. "adcs r5, r5, r7\n\t"
  126724. "adc r3, r3, #0\n\t"
  126725. "lsr r6, r8, #16\n\t"
  126726. "lsr r7, r9, #16\n\t"
  126727. "mul r7, r6, r7\n\t"
  126728. "adds r5, r5, r7\n\t"
  126729. "adc r3, r3, #0\n\t"
  126730. "lsl r7, r9, #16\n\t"
  126731. "lsr r7, r7, #16\n\t"
  126732. "mul r6, r7, r6\n\t"
  126733. "lsr r7, r6, #16\n\t"
  126734. "lsl r6, r6, #16\n\t"
  126735. "adds r4, r4, r6\n\t"
  126736. "adcs r5, r5, r7\n\t"
  126737. "adc r3, r3, #0\n\t"
  126738. #else
  126739. "umull r6, r7, r8, r9\n\t"
  126740. "adds r4, r4, r6\n\t"
  126741. "adcs r5, r5, r7\n\t"
  126742. "adc r3, r3, #0\n\t"
  126743. #endif
  126744. /* A[3] * B[7] */
  126745. "ldr r8, [%[a], #12]\n\t"
  126746. "ldr r9, [%[b], #28]\n\t"
  126747. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126748. "lsl r6, r8, #16\n\t"
  126749. "lsl r7, r9, #16\n\t"
  126750. "lsr r6, r6, #16\n\t"
  126751. "lsr r7, r7, #16\n\t"
  126752. "mul r7, r6, r7\n\t"
  126753. "adds r4, r4, r7\n\t"
  126754. "adcs r5, r5, #0\n\t"
  126755. "adc r3, r3, #0\n\t"
  126756. "lsr r7, r9, #16\n\t"
  126757. "mul r6, r7, r6\n\t"
  126758. "lsr r7, r6, #16\n\t"
  126759. "lsl r6, r6, #16\n\t"
  126760. "adds r4, r4, r6\n\t"
  126761. "adcs r5, r5, r7\n\t"
  126762. "adc r3, r3, #0\n\t"
  126763. "lsr r6, r8, #16\n\t"
  126764. "lsr r7, r9, #16\n\t"
  126765. "mul r7, r6, r7\n\t"
  126766. "adds r5, r5, r7\n\t"
  126767. "adc r3, r3, #0\n\t"
  126768. "lsl r7, r9, #16\n\t"
  126769. "lsr r7, r7, #16\n\t"
  126770. "mul r6, r7, r6\n\t"
  126771. "lsr r7, r6, #16\n\t"
  126772. "lsl r6, r6, #16\n\t"
  126773. "adds r4, r4, r6\n\t"
  126774. "adcs r5, r5, r7\n\t"
  126775. "adc r3, r3, #0\n\t"
  126776. #else
  126777. "umull r6, r7, r8, r9\n\t"
  126778. "adds r4, r4, r6\n\t"
  126779. "adcs r5, r5, r7\n\t"
  126780. "adc r3, r3, #0\n\t"
  126781. #endif
  126782. /* A[2] * B[8] */
  126783. "ldr r8, [%[a], #8]\n\t"
  126784. "ldr r9, [%[b], #32]\n\t"
  126785. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126786. "lsl r6, r8, #16\n\t"
  126787. "lsl r7, r9, #16\n\t"
  126788. "lsr r6, r6, #16\n\t"
  126789. "lsr r7, r7, #16\n\t"
  126790. "mul r7, r6, r7\n\t"
  126791. "adds r4, r4, r7\n\t"
  126792. "adcs r5, r5, #0\n\t"
  126793. "adc r3, r3, #0\n\t"
  126794. "lsr r7, r9, #16\n\t"
  126795. "mul r6, r7, r6\n\t"
  126796. "lsr r7, r6, #16\n\t"
  126797. "lsl r6, r6, #16\n\t"
  126798. "adds r4, r4, r6\n\t"
  126799. "adcs r5, r5, r7\n\t"
  126800. "adc r3, r3, #0\n\t"
  126801. "lsr r6, r8, #16\n\t"
  126802. "lsr r7, r9, #16\n\t"
  126803. "mul r7, r6, r7\n\t"
  126804. "adds r5, r5, r7\n\t"
  126805. "adc r3, r3, #0\n\t"
  126806. "lsl r7, r9, #16\n\t"
  126807. "lsr r7, r7, #16\n\t"
  126808. "mul r6, r7, r6\n\t"
  126809. "lsr r7, r6, #16\n\t"
  126810. "lsl r6, r6, #16\n\t"
  126811. "adds r4, r4, r6\n\t"
  126812. "adcs r5, r5, r7\n\t"
  126813. "adc r3, r3, #0\n\t"
  126814. #else
  126815. "umull r6, r7, r8, r9\n\t"
  126816. "adds r4, r4, r6\n\t"
  126817. "adcs r5, r5, r7\n\t"
  126818. "adc r3, r3, #0\n\t"
  126819. #endif
  126820. /* A[1] * B[9] */
  126821. "ldr r8, [%[a], #4]\n\t"
  126822. "ldr r9, [%[b], #36]\n\t"
  126823. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126824. "lsl r6, r8, #16\n\t"
  126825. "lsl r7, r9, #16\n\t"
  126826. "lsr r6, r6, #16\n\t"
  126827. "lsr r7, r7, #16\n\t"
  126828. "mul r7, r6, r7\n\t"
  126829. "adds r4, r4, r7\n\t"
  126830. "adcs r5, r5, #0\n\t"
  126831. "adc r3, r3, #0\n\t"
  126832. "lsr r7, r9, #16\n\t"
  126833. "mul r6, r7, r6\n\t"
  126834. "lsr r7, r6, #16\n\t"
  126835. "lsl r6, r6, #16\n\t"
  126836. "adds r4, r4, r6\n\t"
  126837. "adcs r5, r5, r7\n\t"
  126838. "adc r3, r3, #0\n\t"
  126839. "lsr r6, r8, #16\n\t"
  126840. "lsr r7, r9, #16\n\t"
  126841. "mul r7, r6, r7\n\t"
  126842. "adds r5, r5, r7\n\t"
  126843. "adc r3, r3, #0\n\t"
  126844. "lsl r7, r9, #16\n\t"
  126845. "lsr r7, r7, #16\n\t"
  126846. "mul r6, r7, r6\n\t"
  126847. "lsr r7, r6, #16\n\t"
  126848. "lsl r6, r6, #16\n\t"
  126849. "adds r4, r4, r6\n\t"
  126850. "adcs r5, r5, r7\n\t"
  126851. "adc r3, r3, #0\n\t"
  126852. #else
  126853. "umull r6, r7, r8, r9\n\t"
  126854. "adds r4, r4, r6\n\t"
  126855. "adcs r5, r5, r7\n\t"
  126856. "adc r3, r3, #0\n\t"
  126857. #endif
  126858. /* A[0] * B[10] */
  126859. "ldr r8, [%[a]]\n\t"
  126860. "ldr r9, [%[b], #40]\n\t"
  126861. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126862. "lsl r6, r8, #16\n\t"
  126863. "lsl r7, r9, #16\n\t"
  126864. "lsr r6, r6, #16\n\t"
  126865. "lsr r7, r7, #16\n\t"
  126866. "mul r7, r6, r7\n\t"
  126867. "adds r4, r4, r7\n\t"
  126868. "adcs r5, r5, #0\n\t"
  126869. "adc r3, r3, #0\n\t"
  126870. "lsr r7, r9, #16\n\t"
  126871. "mul r6, r7, r6\n\t"
  126872. "lsr r7, r6, #16\n\t"
  126873. "lsl r6, r6, #16\n\t"
  126874. "adds r4, r4, r6\n\t"
  126875. "adcs r5, r5, r7\n\t"
  126876. "adc r3, r3, #0\n\t"
  126877. "lsr r6, r8, #16\n\t"
  126878. "lsr r7, r9, #16\n\t"
  126879. "mul r7, r6, r7\n\t"
  126880. "adds r5, r5, r7\n\t"
  126881. "adc r3, r3, #0\n\t"
  126882. "lsl r7, r9, #16\n\t"
  126883. "lsr r7, r7, #16\n\t"
  126884. "mul r6, r7, r6\n\t"
  126885. "lsr r7, r6, #16\n\t"
  126886. "lsl r6, r6, #16\n\t"
  126887. "adds r4, r4, r6\n\t"
  126888. "adcs r5, r5, r7\n\t"
  126889. "adc r3, r3, #0\n\t"
  126890. #else
  126891. "umull r6, r7, r8, r9\n\t"
  126892. "adds r4, r4, r6\n\t"
  126893. "adcs r5, r5, r7\n\t"
  126894. "adc r3, r3, #0\n\t"
  126895. #endif
  126896. "str r4, [sp, #40]\n\t"
  126897. /* A[0] * B[11] */
  126898. "ldr r9, [%[b], #44]\n\t"
  126899. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126900. "lsl r6, r8, #16\n\t"
  126901. "lsl r7, r9, #16\n\t"
  126902. "lsr r6, r6, #16\n\t"
  126903. "lsr r7, r7, #16\n\t"
  126904. "mul r7, r6, r7\n\t"
  126905. "adds r5, r5, r7\n\t"
  126906. "adcs r3, r3, #0\n\t"
  126907. "mov r4, #0\n\t"
  126908. "adc r4, r4, #0\n\t"
  126909. "lsr r7, r9, #16\n\t"
  126910. "mul r6, r7, r6\n\t"
  126911. "lsr r7, r6, #16\n\t"
  126912. "lsl r6, r6, #16\n\t"
  126913. "adds r5, r5, r6\n\t"
  126914. "adcs r3, r3, r7\n\t"
  126915. "adc r4, r4, #0\n\t"
  126916. "lsr r6, r8, #16\n\t"
  126917. "lsr r7, r9, #16\n\t"
  126918. "mul r7, r6, r7\n\t"
  126919. "adds r3, r3, r7\n\t"
  126920. "adc r4, r4, #0\n\t"
  126921. "lsl r7, r9, #16\n\t"
  126922. "lsr r7, r7, #16\n\t"
  126923. "mul r6, r7, r6\n\t"
  126924. "lsr r7, r6, #16\n\t"
  126925. "lsl r6, r6, #16\n\t"
  126926. "adds r5, r5, r6\n\t"
  126927. "adcs r3, r3, r7\n\t"
  126928. "adc r4, r4, #0\n\t"
  126929. #else
  126930. "umull r6, r7, r8, r9\n\t"
  126931. "adds r5, r5, r6\n\t"
  126932. "adcs r3, r3, r7\n\t"
  126933. "mov r4, #0\n\t"
  126934. "adc r4, r4, #0\n\t"
  126935. #endif
  126936. /* A[1] * B[10] */
  126937. "ldr r8, [%[a], #4]\n\t"
  126938. "ldr r9, [%[b], #40]\n\t"
  126939. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126940. "lsl r6, r8, #16\n\t"
  126941. "lsl r7, r9, #16\n\t"
  126942. "lsr r6, r6, #16\n\t"
  126943. "lsr r7, r7, #16\n\t"
  126944. "mul r7, r6, r7\n\t"
  126945. "adds r5, r5, r7\n\t"
  126946. "adcs r3, r3, #0\n\t"
  126947. "adc r4, r4, #0\n\t"
  126948. "lsr r7, r9, #16\n\t"
  126949. "mul r6, r7, r6\n\t"
  126950. "lsr r7, r6, #16\n\t"
  126951. "lsl r6, r6, #16\n\t"
  126952. "adds r5, r5, r6\n\t"
  126953. "adcs r3, r3, r7\n\t"
  126954. "adc r4, r4, #0\n\t"
  126955. "lsr r6, r8, #16\n\t"
  126956. "lsr r7, r9, #16\n\t"
  126957. "mul r7, r6, r7\n\t"
  126958. "adds r3, r3, r7\n\t"
  126959. "adc r4, r4, #0\n\t"
  126960. "lsl r7, r9, #16\n\t"
  126961. "lsr r7, r7, #16\n\t"
  126962. "mul r6, r7, r6\n\t"
  126963. "lsr r7, r6, #16\n\t"
  126964. "lsl r6, r6, #16\n\t"
  126965. "adds r5, r5, r6\n\t"
  126966. "adcs r3, r3, r7\n\t"
  126967. "adc r4, r4, #0\n\t"
  126968. #else
  126969. "umull r6, r7, r8, r9\n\t"
  126970. "adds r5, r5, r6\n\t"
  126971. "adcs r3, r3, r7\n\t"
  126972. "adc r4, r4, #0\n\t"
  126973. #endif
  126974. /* A[2] * B[9] */
  126975. "ldr r8, [%[a], #8]\n\t"
  126976. "ldr r9, [%[b], #36]\n\t"
  126977. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  126978. "lsl r6, r8, #16\n\t"
  126979. "lsl r7, r9, #16\n\t"
  126980. "lsr r6, r6, #16\n\t"
  126981. "lsr r7, r7, #16\n\t"
  126982. "mul r7, r6, r7\n\t"
  126983. "adds r5, r5, r7\n\t"
  126984. "adcs r3, r3, #0\n\t"
  126985. "adc r4, r4, #0\n\t"
  126986. "lsr r7, r9, #16\n\t"
  126987. "mul r6, r7, r6\n\t"
  126988. "lsr r7, r6, #16\n\t"
  126989. "lsl r6, r6, #16\n\t"
  126990. "adds r5, r5, r6\n\t"
  126991. "adcs r3, r3, r7\n\t"
  126992. "adc r4, r4, #0\n\t"
  126993. "lsr r6, r8, #16\n\t"
  126994. "lsr r7, r9, #16\n\t"
  126995. "mul r7, r6, r7\n\t"
  126996. "adds r3, r3, r7\n\t"
  126997. "adc r4, r4, #0\n\t"
  126998. "lsl r7, r9, #16\n\t"
  126999. "lsr r7, r7, #16\n\t"
  127000. "mul r6, r7, r6\n\t"
  127001. "lsr r7, r6, #16\n\t"
  127002. "lsl r6, r6, #16\n\t"
  127003. "adds r5, r5, r6\n\t"
  127004. "adcs r3, r3, r7\n\t"
  127005. "adc r4, r4, #0\n\t"
  127006. #else
  127007. "umull r6, r7, r8, r9\n\t"
  127008. "adds r5, r5, r6\n\t"
  127009. "adcs r3, r3, r7\n\t"
  127010. "adc r4, r4, #0\n\t"
  127011. #endif
  127012. /* A[3] * B[8] */
  127013. "ldr r8, [%[a], #12]\n\t"
  127014. "ldr r9, [%[b], #32]\n\t"
  127015. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127016. "lsl r6, r8, #16\n\t"
  127017. "lsl r7, r9, #16\n\t"
  127018. "lsr r6, r6, #16\n\t"
  127019. "lsr r7, r7, #16\n\t"
  127020. "mul r7, r6, r7\n\t"
  127021. "adds r5, r5, r7\n\t"
  127022. "adcs r3, r3, #0\n\t"
  127023. "adc r4, r4, #0\n\t"
  127024. "lsr r7, r9, #16\n\t"
  127025. "mul r6, r7, r6\n\t"
  127026. "lsr r7, r6, #16\n\t"
  127027. "lsl r6, r6, #16\n\t"
  127028. "adds r5, r5, r6\n\t"
  127029. "adcs r3, r3, r7\n\t"
  127030. "adc r4, r4, #0\n\t"
  127031. "lsr r6, r8, #16\n\t"
  127032. "lsr r7, r9, #16\n\t"
  127033. "mul r7, r6, r7\n\t"
  127034. "adds r3, r3, r7\n\t"
  127035. "adc r4, r4, #0\n\t"
  127036. "lsl r7, r9, #16\n\t"
  127037. "lsr r7, r7, #16\n\t"
  127038. "mul r6, r7, r6\n\t"
  127039. "lsr r7, r6, #16\n\t"
  127040. "lsl r6, r6, #16\n\t"
  127041. "adds r5, r5, r6\n\t"
  127042. "adcs r3, r3, r7\n\t"
  127043. "adc r4, r4, #0\n\t"
  127044. #else
  127045. "umull r6, r7, r8, r9\n\t"
  127046. "adds r5, r5, r6\n\t"
  127047. "adcs r3, r3, r7\n\t"
  127048. "adc r4, r4, #0\n\t"
  127049. #endif
  127050. /* A[4] * B[7] */
  127051. "ldr r8, [%[a], #16]\n\t"
  127052. "ldr r9, [%[b], #28]\n\t"
  127053. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127054. "lsl r6, r8, #16\n\t"
  127055. "lsl r7, r9, #16\n\t"
  127056. "lsr r6, r6, #16\n\t"
  127057. "lsr r7, r7, #16\n\t"
  127058. "mul r7, r6, r7\n\t"
  127059. "adds r5, r5, r7\n\t"
  127060. "adcs r3, r3, #0\n\t"
  127061. "adc r4, r4, #0\n\t"
  127062. "lsr r7, r9, #16\n\t"
  127063. "mul r6, r7, r6\n\t"
  127064. "lsr r7, r6, #16\n\t"
  127065. "lsl r6, r6, #16\n\t"
  127066. "adds r5, r5, r6\n\t"
  127067. "adcs r3, r3, r7\n\t"
  127068. "adc r4, r4, #0\n\t"
  127069. "lsr r6, r8, #16\n\t"
  127070. "lsr r7, r9, #16\n\t"
  127071. "mul r7, r6, r7\n\t"
  127072. "adds r3, r3, r7\n\t"
  127073. "adc r4, r4, #0\n\t"
  127074. "lsl r7, r9, #16\n\t"
  127075. "lsr r7, r7, #16\n\t"
  127076. "mul r6, r7, r6\n\t"
  127077. "lsr r7, r6, #16\n\t"
  127078. "lsl r6, r6, #16\n\t"
  127079. "adds r5, r5, r6\n\t"
  127080. "adcs r3, r3, r7\n\t"
  127081. "adc r4, r4, #0\n\t"
  127082. #else
  127083. "umull r6, r7, r8, r9\n\t"
  127084. "adds r5, r5, r6\n\t"
  127085. "adcs r3, r3, r7\n\t"
  127086. "adc r4, r4, #0\n\t"
  127087. #endif
  127088. /* A[5] * B[6] */
  127089. "ldr r9, [%[b], #24]\n\t"
  127090. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127091. "lsl r6, r11, #16\n\t"
  127092. "lsl r7, r9, #16\n\t"
  127093. "lsr r6, r6, #16\n\t"
  127094. "lsr r7, r7, #16\n\t"
  127095. "mul r7, r6, r7\n\t"
  127096. "adds r5, r5, r7\n\t"
  127097. "adcs r3, r3, #0\n\t"
  127098. "adc r4, r4, #0\n\t"
  127099. "lsr r7, r9, #16\n\t"
  127100. "mul r6, r7, r6\n\t"
  127101. "lsr r7, r6, #16\n\t"
  127102. "lsl r6, r6, #16\n\t"
  127103. "adds r5, r5, r6\n\t"
  127104. "adcs r3, r3, r7\n\t"
  127105. "adc r4, r4, #0\n\t"
  127106. "lsr r6, r11, #16\n\t"
  127107. "lsr r7, r9, #16\n\t"
  127108. "mul r7, r6, r7\n\t"
  127109. "adds r3, r3, r7\n\t"
  127110. "adc r4, r4, #0\n\t"
  127111. "lsl r7, r9, #16\n\t"
  127112. "lsr r7, r7, #16\n\t"
  127113. "mul r6, r7, r6\n\t"
  127114. "lsr r7, r6, #16\n\t"
  127115. "lsl r6, r6, #16\n\t"
  127116. "adds r5, r5, r6\n\t"
  127117. "adcs r3, r3, r7\n\t"
  127118. "adc r4, r4, #0\n\t"
  127119. #else
  127120. "umull r6, r7, r11, r9\n\t"
  127121. "adds r5, r5, r6\n\t"
  127122. "adcs r3, r3, r7\n\t"
  127123. "adc r4, r4, #0\n\t"
  127124. #endif
  127125. /* A[6] * B[5] */
  127126. "ldr r8, [%[a], #24]\n\t"
  127127. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127128. "lsl r6, r8, #16\n\t"
  127129. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[7] * B[4] */
  127163. "ldr r8, [%[a], #28]\n\t"
  127164. "ldr r9, [%[b], #16]\n\t"
  127165. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127166. "lsl r6, r8, #16\n\t"
  127167. "lsl r7, r9, #16\n\t"
  127168. "lsr r6, r6, #16\n\t"
  127169. "lsr r7, r7, #16\n\t"
  127170. "mul r7, r6, r7\n\t"
  127171. "adds r5, r5, r7\n\t"
  127172. "adcs r3, r3, #0\n\t"
  127173. "adc r4, r4, #0\n\t"
  127174. "lsr r7, r9, #16\n\t"
  127175. "mul r6, r7, r6\n\t"
  127176. "lsr r7, r6, #16\n\t"
  127177. "lsl r6, r6, #16\n\t"
  127178. "adds r5, r5, r6\n\t"
  127179. "adcs r3, r3, r7\n\t"
  127180. "adc r4, r4, #0\n\t"
  127181. "lsr r6, r8, #16\n\t"
  127182. "lsr r7, r9, #16\n\t"
  127183. "mul r7, r6, r7\n\t"
  127184. "adds r3, r3, r7\n\t"
  127185. "adc r4, r4, #0\n\t"
  127186. "lsl r7, r9, #16\n\t"
  127187. "lsr r7, r7, #16\n\t"
  127188. "mul r6, r7, r6\n\t"
  127189. "lsr r7, r6, #16\n\t"
  127190. "lsl r6, r6, #16\n\t"
  127191. "adds r5, r5, r6\n\t"
  127192. "adcs r3, r3, r7\n\t"
  127193. "adc r4, r4, #0\n\t"
  127194. #else
  127195. "umull r6, r7, r8, r9\n\t"
  127196. "adds r5, r5, r6\n\t"
  127197. "adcs r3, r3, r7\n\t"
  127198. "adc r4, r4, #0\n\t"
  127199. #endif
  127200. /* A[8] * B[3] */
  127201. "ldr r8, [%[a], #32]\n\t"
  127202. "ldr r9, [%[b], #12]\n\t"
  127203. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127204. "lsl r6, r8, #16\n\t"
  127205. "lsl r7, r9, #16\n\t"
  127206. "lsr r6, r6, #16\n\t"
  127207. "lsr r7, r7, #16\n\t"
  127208. "mul r7, r6, r7\n\t"
  127209. "adds r5, r5, r7\n\t"
  127210. "adcs r3, r3, #0\n\t"
  127211. "adc r4, r4, #0\n\t"
  127212. "lsr r7, r9, #16\n\t"
  127213. "mul r6, r7, r6\n\t"
  127214. "lsr r7, r6, #16\n\t"
  127215. "lsl r6, r6, #16\n\t"
  127216. "adds r5, r5, r6\n\t"
  127217. "adcs r3, r3, r7\n\t"
  127218. "adc r4, r4, #0\n\t"
  127219. "lsr r6, r8, #16\n\t"
  127220. "lsr r7, r9, #16\n\t"
  127221. "mul r7, r6, r7\n\t"
  127222. "adds r3, r3, r7\n\t"
  127223. "adc r4, r4, #0\n\t"
  127224. "lsl r7, r9, #16\n\t"
  127225. "lsr r7, r7, #16\n\t"
  127226. "mul r6, r7, r6\n\t"
  127227. "lsr r7, r6, #16\n\t"
  127228. "lsl r6, r6, #16\n\t"
  127229. "adds r5, r5, r6\n\t"
  127230. "adcs r3, r3, r7\n\t"
  127231. "adc r4, r4, #0\n\t"
  127232. #else
  127233. "umull r6, r7, r8, r9\n\t"
  127234. "adds r5, r5, r6\n\t"
  127235. "adcs r3, r3, r7\n\t"
  127236. "adc r4, r4, #0\n\t"
  127237. #endif
  127238. /* A[9] * B[2] */
  127239. "ldr r8, [%[a], #36]\n\t"
  127240. "ldr r9, [%[b], #8]\n\t"
  127241. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127242. "lsl r6, r8, #16\n\t"
  127243. "lsl r7, r9, #16\n\t"
  127244. "lsr r6, r6, #16\n\t"
  127245. "lsr r7, r7, #16\n\t"
  127246. "mul r7, r6, r7\n\t"
  127247. "adds r5, r5, r7\n\t"
  127248. "adcs r3, r3, #0\n\t"
  127249. "adc r4, r4, #0\n\t"
  127250. "lsr r7, r9, #16\n\t"
  127251. "mul r6, r7, r6\n\t"
  127252. "lsr r7, r6, #16\n\t"
  127253. "lsl r6, r6, #16\n\t"
  127254. "adds r5, r5, r6\n\t"
  127255. "adcs r3, r3, r7\n\t"
  127256. "adc r4, r4, #0\n\t"
  127257. "lsr r6, r8, #16\n\t"
  127258. "lsr r7, r9, #16\n\t"
  127259. "mul r7, r6, r7\n\t"
  127260. "adds r3, r3, r7\n\t"
  127261. "adc r4, r4, #0\n\t"
  127262. "lsl r7, r9, #16\n\t"
  127263. "lsr r7, r7, #16\n\t"
  127264. "mul r6, r7, r6\n\t"
  127265. "lsr r7, r6, #16\n\t"
  127266. "lsl r6, r6, #16\n\t"
  127267. "adds r5, r5, r6\n\t"
  127268. "adcs r3, r3, r7\n\t"
  127269. "adc r4, r4, #0\n\t"
  127270. #else
  127271. "umull r6, r7, r8, r9\n\t"
  127272. "adds r5, r5, r6\n\t"
  127273. "adcs r3, r3, r7\n\t"
  127274. "adc r4, r4, #0\n\t"
  127275. #endif
  127276. /* A[10] * B[1] */
  127277. "ldr r8, [%[a], #40]\n\t"
  127278. "ldr r9, [%[b], #4]\n\t"
  127279. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127280. "lsl r6, r8, #16\n\t"
  127281. "lsl r7, r9, #16\n\t"
  127282. "lsr r6, r6, #16\n\t"
  127283. "lsr r7, r7, #16\n\t"
  127284. "mul r7, r6, r7\n\t"
  127285. "adds r5, r5, r7\n\t"
  127286. "adcs r3, r3, #0\n\t"
  127287. "adc r4, r4, #0\n\t"
  127288. "lsr r7, r9, #16\n\t"
  127289. "mul r6, r7, r6\n\t"
  127290. "lsr r7, r6, #16\n\t"
  127291. "lsl r6, r6, #16\n\t"
  127292. "adds r5, r5, r6\n\t"
  127293. "adcs r3, r3, r7\n\t"
  127294. "adc r4, r4, #0\n\t"
  127295. "lsr r6, r8, #16\n\t"
  127296. "lsr r7, r9, #16\n\t"
  127297. "mul r7, r6, r7\n\t"
  127298. "adds r3, r3, r7\n\t"
  127299. "adc r4, r4, #0\n\t"
  127300. "lsl r7, r9, #16\n\t"
  127301. "lsr r7, r7, #16\n\t"
  127302. "mul r6, r7, r6\n\t"
  127303. "lsr r7, r6, #16\n\t"
  127304. "lsl r6, r6, #16\n\t"
  127305. "adds r5, r5, r6\n\t"
  127306. "adcs r3, r3, r7\n\t"
  127307. "adc r4, r4, #0\n\t"
  127308. #else
  127309. "umull r6, r7, r8, r9\n\t"
  127310. "adds r5, r5, r6\n\t"
  127311. "adcs r3, r3, r7\n\t"
  127312. "adc r4, r4, #0\n\t"
  127313. #endif
  127314. /* A[11] * B[0] */
  127315. "ldr r8, [%[a], #44]\n\t"
  127316. "ldr r9, [%[b]]\n\t"
  127317. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127318. "lsl r6, r8, #16\n\t"
  127319. "lsl r7, r9, #16\n\t"
  127320. "lsr r6, r6, #16\n\t"
  127321. "lsr r7, r7, #16\n\t"
  127322. "mul r7, r6, r7\n\t"
  127323. "adds r5, r5, r7\n\t"
  127324. "adcs r3, r3, #0\n\t"
  127325. "adc r4, r4, #0\n\t"
  127326. "lsr r7, r9, #16\n\t"
  127327. "mul r6, r7, r6\n\t"
  127328. "lsr r7, r6, #16\n\t"
  127329. "lsl r6, r6, #16\n\t"
  127330. "adds r5, r5, r6\n\t"
  127331. "adcs r3, r3, r7\n\t"
  127332. "adc r4, r4, #0\n\t"
  127333. "lsr r6, r8, #16\n\t"
  127334. "lsr r7, r9, #16\n\t"
  127335. "mul r7, r6, r7\n\t"
  127336. "adds r3, r3, r7\n\t"
  127337. "adc r4, r4, #0\n\t"
  127338. "lsl r7, r9, #16\n\t"
  127339. "lsr r7, r7, #16\n\t"
  127340. "mul r6, r7, r6\n\t"
  127341. "lsr r7, r6, #16\n\t"
  127342. "lsl r6, r6, #16\n\t"
  127343. "adds r5, r5, r6\n\t"
  127344. "adcs r3, r3, r7\n\t"
  127345. "adc r4, r4, #0\n\t"
  127346. #else
  127347. "umull r6, r7, r8, r9\n\t"
  127348. "adds r5, r5, r6\n\t"
  127349. "adcs r3, r3, r7\n\t"
  127350. "adc r4, r4, #0\n\t"
  127351. #endif
  127352. "str r5, [sp, #44]\n\t"
  127353. /* A[12] * B[0] */
  127354. "ldr r8, [%[a], #48]\n\t"
  127355. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127356. "lsl r6, r8, #16\n\t"
  127357. "lsl r7, r9, #16\n\t"
  127358. "lsr r6, r6, #16\n\t"
  127359. "lsr r7, r7, #16\n\t"
  127360. "mul r7, r6, r7\n\t"
  127361. "adds r3, r3, r7\n\t"
  127362. "adcs r4, r4, #0\n\t"
  127363. "mov r5, #0\n\t"
  127364. "adc r5, r5, #0\n\t"
  127365. "lsr r7, r9, #16\n\t"
  127366. "mul r6, r7, r6\n\t"
  127367. "lsr r7, r6, #16\n\t"
  127368. "lsl r6, r6, #16\n\t"
  127369. "adds r3, r3, r6\n\t"
  127370. "adcs r4, r4, r7\n\t"
  127371. "adc r5, r5, #0\n\t"
  127372. "lsr r6, r8, #16\n\t"
  127373. "lsr r7, r9, #16\n\t"
  127374. "mul r7, r6, r7\n\t"
  127375. "adds r4, r4, r7\n\t"
  127376. "adc r5, r5, #0\n\t"
  127377. "lsl r7, r9, #16\n\t"
  127378. "lsr r7, r7, #16\n\t"
  127379. "mul r6, r7, r6\n\t"
  127380. "lsr r7, r6, #16\n\t"
  127381. "lsl r6, r6, #16\n\t"
  127382. "adds r3, r3, r6\n\t"
  127383. "adcs r4, r4, r7\n\t"
  127384. "adc r5, r5, #0\n\t"
  127385. #else
  127386. "umull r6, r7, r8, r9\n\t"
  127387. "adds r3, r3, r6\n\t"
  127388. "adcs r4, r4, r7\n\t"
  127389. "mov r5, #0\n\t"
  127390. "adc r5, r5, #0\n\t"
  127391. #endif
  127392. /* A[11] * B[1] */
  127393. "ldr r8, [%[a], #44]\n\t"
  127394. "ldr r9, [%[b], #4]\n\t"
  127395. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127396. "lsl r6, r8, #16\n\t"
  127397. "lsl r7, r9, #16\n\t"
  127398. "lsr r6, r6, #16\n\t"
  127399. "lsr r7, r7, #16\n\t"
  127400. "mul r7, r6, r7\n\t"
  127401. "adds r3, r3, r7\n\t"
  127402. "adcs r4, r4, #0\n\t"
  127403. "adc r5, r5, #0\n\t"
  127404. "lsr r7, r9, #16\n\t"
  127405. "mul r6, r7, r6\n\t"
  127406. "lsr r7, r6, #16\n\t"
  127407. "lsl r6, r6, #16\n\t"
  127408. "adds r3, r3, r6\n\t"
  127409. "adcs r4, r4, r7\n\t"
  127410. "adc r5, r5, #0\n\t"
  127411. "lsr r6, r8, #16\n\t"
  127412. "lsr r7, r9, #16\n\t"
  127413. "mul r7, r6, r7\n\t"
  127414. "adds r4, r4, r7\n\t"
  127415. "adc r5, r5, #0\n\t"
  127416. "lsl r7, r9, #16\n\t"
  127417. "lsr r7, r7, #16\n\t"
  127418. "mul r6, r7, r6\n\t"
  127419. "lsr r7, r6, #16\n\t"
  127420. "lsl r6, r6, #16\n\t"
  127421. "adds r3, r3, r6\n\t"
  127422. "adcs r4, r4, r7\n\t"
  127423. "adc r5, r5, #0\n\t"
  127424. #else
  127425. "umull r6, r7, r8, r9\n\t"
  127426. "adds r3, r3, r6\n\t"
  127427. "adcs r4, r4, r7\n\t"
  127428. "adc r5, r5, #0\n\t"
  127429. #endif
  127430. /* A[10] * B[2] */
  127431. "ldr r8, [%[a], #40]\n\t"
  127432. "ldr r9, [%[b], #8]\n\t"
  127433. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127434. "lsl r6, r8, #16\n\t"
  127435. "lsl r7, r9, #16\n\t"
  127436. "lsr r6, r6, #16\n\t"
  127437. "lsr r7, r7, #16\n\t"
  127438. "mul r7, r6, r7\n\t"
  127439. "adds r3, r3, r7\n\t"
  127440. "adcs r4, r4, #0\n\t"
  127441. "adc r5, r5, #0\n\t"
  127442. "lsr r7, r9, #16\n\t"
  127443. "mul r6, r7, r6\n\t"
  127444. "lsr r7, r6, #16\n\t"
  127445. "lsl r6, r6, #16\n\t"
  127446. "adds r3, r3, r6\n\t"
  127447. "adcs r4, r4, r7\n\t"
  127448. "adc r5, r5, #0\n\t"
  127449. "lsr r6, r8, #16\n\t"
  127450. "lsr r7, r9, #16\n\t"
  127451. "mul r7, r6, r7\n\t"
  127452. "adds r4, r4, r7\n\t"
  127453. "adc r5, r5, #0\n\t"
  127454. "lsl r7, r9, #16\n\t"
  127455. "lsr r7, r7, #16\n\t"
  127456. "mul r6, r7, r6\n\t"
  127457. "lsr r7, r6, #16\n\t"
  127458. "lsl r6, r6, #16\n\t"
  127459. "adds r3, r3, r6\n\t"
  127460. "adcs r4, r4, r7\n\t"
  127461. "adc r5, r5, #0\n\t"
  127462. #else
  127463. "umull r6, r7, r8, r9\n\t"
  127464. "adds r3, r3, r6\n\t"
  127465. "adcs r4, r4, r7\n\t"
  127466. "adc r5, r5, #0\n\t"
  127467. #endif
  127468. /* A[9] * B[3] */
  127469. "ldr r8, [%[a], #36]\n\t"
  127470. "ldr r9, [%[b], #12]\n\t"
  127471. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127472. "lsl r6, r8, #16\n\t"
  127473. "lsl r7, r9, #16\n\t"
  127474. "lsr r6, r6, #16\n\t"
  127475. "lsr r7, r7, #16\n\t"
  127476. "mul r7, r6, r7\n\t"
  127477. "adds r3, r3, r7\n\t"
  127478. "adcs r4, r4, #0\n\t"
  127479. "adc r5, r5, #0\n\t"
  127480. "lsr r7, r9, #16\n\t"
  127481. "mul r6, r7, r6\n\t"
  127482. "lsr r7, r6, #16\n\t"
  127483. "lsl r6, r6, #16\n\t"
  127484. "adds r3, r3, r6\n\t"
  127485. "adcs r4, r4, r7\n\t"
  127486. "adc r5, r5, #0\n\t"
  127487. "lsr r6, r8, #16\n\t"
  127488. "lsr r7, r9, #16\n\t"
  127489. "mul r7, r6, r7\n\t"
  127490. "adds r4, r4, r7\n\t"
  127491. "adc r5, r5, #0\n\t"
  127492. "lsl r7, r9, #16\n\t"
  127493. "lsr r7, r7, #16\n\t"
  127494. "mul r6, r7, r6\n\t"
  127495. "lsr r7, r6, #16\n\t"
  127496. "lsl r6, r6, #16\n\t"
  127497. "adds r3, r3, r6\n\t"
  127498. "adcs r4, r4, r7\n\t"
  127499. "adc r5, r5, #0\n\t"
  127500. #else
  127501. "umull r6, r7, r8, r9\n\t"
  127502. "adds r3, r3, r6\n\t"
  127503. "adcs r4, r4, r7\n\t"
  127504. "adc r5, r5, #0\n\t"
  127505. #endif
  127506. /* A[8] * B[4] */
  127507. "ldr r8, [%[a], #32]\n\t"
  127508. "ldr r9, [%[b], #16]\n\t"
  127509. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127510. "lsl r6, r8, #16\n\t"
  127511. "lsl r7, r9, #16\n\t"
  127512. "lsr r6, r6, #16\n\t"
  127513. "lsr r7, r7, #16\n\t"
  127514. "mul r7, r6, r7\n\t"
  127515. "adds r3, r3, r7\n\t"
  127516. "adcs r4, r4, #0\n\t"
  127517. "adc r5, r5, #0\n\t"
  127518. "lsr r7, r9, #16\n\t"
  127519. "mul r6, r7, r6\n\t"
  127520. "lsr r7, r6, #16\n\t"
  127521. "lsl r6, r6, #16\n\t"
  127522. "adds r3, r3, r6\n\t"
  127523. "adcs r4, r4, r7\n\t"
  127524. "adc r5, r5, #0\n\t"
  127525. "lsr r6, r8, #16\n\t"
  127526. "lsr r7, r9, #16\n\t"
  127527. "mul r7, r6, r7\n\t"
  127528. "adds r4, r4, r7\n\t"
  127529. "adc r5, r5, #0\n\t"
  127530. "lsl r7, r9, #16\n\t"
  127531. "lsr r7, r7, #16\n\t"
  127532. "mul r6, r7, r6\n\t"
  127533. "lsr r7, r6, #16\n\t"
  127534. "lsl r6, r6, #16\n\t"
  127535. "adds r3, r3, r6\n\t"
  127536. "adcs r4, r4, r7\n\t"
  127537. "adc r5, r5, #0\n\t"
  127538. #else
  127539. "umull r6, r7, r8, r9\n\t"
  127540. "adds r3, r3, r6\n\t"
  127541. "adcs r4, r4, r7\n\t"
  127542. "adc r5, r5, #0\n\t"
  127543. #endif
  127544. /* A[7] * B[5] */
  127545. "ldr r8, [%[a], #28]\n\t"
  127546. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127547. "lsl r6, r8, #16\n\t"
  127548. "lsl r7, r12, #16\n\t"
  127549. "lsr r6, r6, #16\n\t"
  127550. "lsr r7, r7, #16\n\t"
  127551. "mul r7, r6, r7\n\t"
  127552. "adds r3, r3, r7\n\t"
  127553. "adcs r4, r4, #0\n\t"
  127554. "adc r5, r5, #0\n\t"
  127555. "lsr r7, r12, #16\n\t"
  127556. "mul r6, r7, r6\n\t"
  127557. "lsr r7, r6, #16\n\t"
  127558. "lsl r6, r6, #16\n\t"
  127559. "adds r3, r3, r6\n\t"
  127560. "adcs r4, r4, r7\n\t"
  127561. "adc r5, r5, #0\n\t"
  127562. "lsr r6, r8, #16\n\t"
  127563. "lsr r7, r12, #16\n\t"
  127564. "mul r7, r6, r7\n\t"
  127565. "adds r4, r4, r7\n\t"
  127566. "adc r5, r5, #0\n\t"
  127567. "lsl r7, r12, #16\n\t"
  127568. "lsr r7, r7, #16\n\t"
  127569. "mul r6, r7, r6\n\t"
  127570. "lsr r7, r6, #16\n\t"
  127571. "lsl r6, r6, #16\n\t"
  127572. "adds r3, r3, r6\n\t"
  127573. "adcs r4, r4, r7\n\t"
  127574. "adc r5, r5, #0\n\t"
  127575. #else
  127576. "umull r6, r7, r8, r12\n\t"
  127577. "adds r3, r3, r6\n\t"
  127578. "adcs r4, r4, r7\n\t"
  127579. "adc r5, r5, #0\n\t"
  127580. #endif
  127581. /* A[6] * B[6] */
  127582. "ldr r11, [%[a], #24]\n\t"
  127583. "ldr r12, [%[b], #24]\n\t"
  127584. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127585. "lsl r6, r11, #16\n\t"
  127586. "lsl r7, r12, #16\n\t"
  127587. "lsr r6, r6, #16\n\t"
  127588. "lsr r7, r7, #16\n\t"
  127589. "mul r7, r6, r7\n\t"
  127590. "adds r3, r3, r7\n\t"
  127591. "adcs r4, r4, #0\n\t"
  127592. "adc r5, r5, #0\n\t"
  127593. "lsr r7, r12, #16\n\t"
  127594. "mul r6, r7, r6\n\t"
  127595. "lsr r7, r6, #16\n\t"
  127596. "lsl r6, r6, #16\n\t"
  127597. "adds r3, r3, r6\n\t"
  127598. "adcs r4, r4, r7\n\t"
  127599. "adc r5, r5, #0\n\t"
  127600. "lsr r6, r11, #16\n\t"
  127601. "lsr r7, r12, #16\n\t"
  127602. "mul r7, r6, r7\n\t"
  127603. "adds r4, r4, r7\n\t"
  127604. "adc r5, r5, #0\n\t"
  127605. "lsl r7, r12, #16\n\t"
  127606. "lsr r7, r7, #16\n\t"
  127607. "mul r6, r7, r6\n\t"
  127608. "lsr r7, r6, #16\n\t"
  127609. "lsl r6, r6, #16\n\t"
  127610. "adds r3, r3, r6\n\t"
  127611. "adcs r4, r4, r7\n\t"
  127612. "adc r5, r5, #0\n\t"
  127613. #else
  127614. "umull r6, r7, r11, r12\n\t"
  127615. "adds r3, r3, r6\n\t"
  127616. "adcs r4, r4, r7\n\t"
  127617. "adc r5, r5, #0\n\t"
  127618. #endif
  127619. /* A[5] * B[7] */
  127620. "ldr r8, [%[a], #20]\n\t"
  127621. "ldr r9, [%[b], #28]\n\t"
  127622. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127623. "lsl r6, r8, #16\n\t"
  127624. "lsl r7, r9, #16\n\t"
  127625. "lsr r6, r6, #16\n\t"
  127626. "lsr r7, r7, #16\n\t"
  127627. "mul r7, r6, r7\n\t"
  127628. "adds r3, r3, r7\n\t"
  127629. "adcs r4, r4, #0\n\t"
  127630. "adc r5, r5, #0\n\t"
  127631. "lsr r7, r9, #16\n\t"
  127632. "mul r6, r7, r6\n\t"
  127633. "lsr r7, r6, #16\n\t"
  127634. "lsl r6, r6, #16\n\t"
  127635. "adds r3, r3, r6\n\t"
  127636. "adcs r4, r4, r7\n\t"
  127637. "adc r5, r5, #0\n\t"
  127638. "lsr r6, r8, #16\n\t"
  127639. "lsr r7, r9, #16\n\t"
  127640. "mul r7, r6, r7\n\t"
  127641. "adds r4, r4, r7\n\t"
  127642. "adc r5, r5, #0\n\t"
  127643. "lsl r7, r9, #16\n\t"
  127644. "lsr r7, r7, #16\n\t"
  127645. "mul r6, r7, r6\n\t"
  127646. "lsr r7, r6, #16\n\t"
  127647. "lsl r6, r6, #16\n\t"
  127648. "adds r3, r3, r6\n\t"
  127649. "adcs r4, r4, r7\n\t"
  127650. "adc r5, r5, #0\n\t"
  127651. #else
  127652. "umull r6, r7, r8, r9\n\t"
  127653. "adds r3, r3, r6\n\t"
  127654. "adcs r4, r4, r7\n\t"
  127655. "adc r5, r5, #0\n\t"
  127656. #endif
  127657. /* A[4] * B[8] */
  127658. "ldr r8, [%[a], #16]\n\t"
  127659. "ldr r9, [%[b], #32]\n\t"
  127660. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127661. "lsl r6, r8, #16\n\t"
  127662. "lsl r7, r9, #16\n\t"
  127663. "lsr r6, r6, #16\n\t"
  127664. "lsr r7, r7, #16\n\t"
  127665. "mul r7, r6, r7\n\t"
  127666. "adds r3, r3, r7\n\t"
  127667. "adcs r4, r4, #0\n\t"
  127668. "adc r5, r5, #0\n\t"
  127669. "lsr r7, r9, #16\n\t"
  127670. "mul r6, r7, r6\n\t"
  127671. "lsr r7, r6, #16\n\t"
  127672. "lsl r6, r6, #16\n\t"
  127673. "adds r3, r3, r6\n\t"
  127674. "adcs r4, r4, r7\n\t"
  127675. "adc r5, r5, #0\n\t"
  127676. "lsr r6, r8, #16\n\t"
  127677. "lsr r7, r9, #16\n\t"
  127678. "mul r7, r6, r7\n\t"
  127679. "adds r4, r4, r7\n\t"
  127680. "adc r5, r5, #0\n\t"
  127681. "lsl r7, r9, #16\n\t"
  127682. "lsr r7, r7, #16\n\t"
  127683. "mul r6, r7, r6\n\t"
  127684. "lsr r7, r6, #16\n\t"
  127685. "lsl r6, r6, #16\n\t"
  127686. "adds r3, r3, r6\n\t"
  127687. "adcs r4, r4, r7\n\t"
  127688. "adc r5, r5, #0\n\t"
  127689. #else
  127690. "umull r6, r7, r8, r9\n\t"
  127691. "adds r3, r3, r6\n\t"
  127692. "adcs r4, r4, r7\n\t"
  127693. "adc r5, r5, #0\n\t"
  127694. #endif
  127695. /* A[3] * B[9] */
  127696. "ldr r8, [%[a], #12]\n\t"
  127697. "ldr r9, [%[b], #36]\n\t"
  127698. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127699. "lsl r6, r8, #16\n\t"
  127700. "lsl r7, r9, #16\n\t"
  127701. "lsr r6, r6, #16\n\t"
  127702. "lsr r7, r7, #16\n\t"
  127703. "mul r7, r6, r7\n\t"
  127704. "adds r3, r3, r7\n\t"
  127705. "adcs r4, r4, #0\n\t"
  127706. "adc r5, r5, #0\n\t"
  127707. "lsr r7, r9, #16\n\t"
  127708. "mul r6, r7, r6\n\t"
  127709. "lsr r7, r6, #16\n\t"
  127710. "lsl r6, r6, #16\n\t"
  127711. "adds r3, r3, r6\n\t"
  127712. "adcs r4, r4, r7\n\t"
  127713. "adc r5, r5, #0\n\t"
  127714. "lsr r6, r8, #16\n\t"
  127715. "lsr r7, r9, #16\n\t"
  127716. "mul r7, r6, r7\n\t"
  127717. "adds r4, r4, r7\n\t"
  127718. "adc r5, r5, #0\n\t"
  127719. "lsl r7, r9, #16\n\t"
  127720. "lsr r7, r7, #16\n\t"
  127721. "mul r6, r7, r6\n\t"
  127722. "lsr r7, r6, #16\n\t"
  127723. "lsl r6, r6, #16\n\t"
  127724. "adds r3, r3, r6\n\t"
  127725. "adcs r4, r4, r7\n\t"
  127726. "adc r5, r5, #0\n\t"
  127727. #else
  127728. "umull r6, r7, r8, r9\n\t"
  127729. "adds r3, r3, r6\n\t"
  127730. "adcs r4, r4, r7\n\t"
  127731. "adc r5, r5, #0\n\t"
  127732. #endif
  127733. /* A[2] * B[10] */
  127734. "ldr r8, [%[a], #8]\n\t"
  127735. "ldr r9, [%[b], #40]\n\t"
  127736. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127737. "lsl r6, r8, #16\n\t"
  127738. "lsl r7, r9, #16\n\t"
  127739. "lsr r6, r6, #16\n\t"
  127740. "lsr r7, r7, #16\n\t"
  127741. "mul r7, r6, r7\n\t"
  127742. "adds r3, r3, r7\n\t"
  127743. "adcs r4, r4, #0\n\t"
  127744. "adc r5, r5, #0\n\t"
  127745. "lsr r7, r9, #16\n\t"
  127746. "mul r6, r7, r6\n\t"
  127747. "lsr r7, r6, #16\n\t"
  127748. "lsl r6, r6, #16\n\t"
  127749. "adds r3, r3, r6\n\t"
  127750. "adcs r4, r4, r7\n\t"
  127751. "adc r5, r5, #0\n\t"
  127752. "lsr r6, r8, #16\n\t"
  127753. "lsr r7, r9, #16\n\t"
  127754. "mul r7, r6, r7\n\t"
  127755. "adds r4, r4, r7\n\t"
  127756. "adc r5, r5, #0\n\t"
  127757. "lsl r7, r9, #16\n\t"
  127758. "lsr r7, r7, #16\n\t"
  127759. "mul r6, r7, r6\n\t"
  127760. "lsr r7, r6, #16\n\t"
  127761. "lsl r6, r6, #16\n\t"
  127762. "adds r3, r3, r6\n\t"
  127763. "adcs r4, r4, r7\n\t"
  127764. "adc r5, r5, #0\n\t"
  127765. #else
  127766. "umull r6, r7, r8, r9\n\t"
  127767. "adds r3, r3, r6\n\t"
  127768. "adcs r4, r4, r7\n\t"
  127769. "adc r5, r5, #0\n\t"
  127770. #endif
  127771. /* A[1] * B[11] */
  127772. "ldr r8, [%[a], #4]\n\t"
  127773. "ldr r9, [%[b], #44]\n\t"
  127774. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127775. "lsl r6, r8, #16\n\t"
  127776. "lsl r7, r9, #16\n\t"
  127777. "lsr r6, r6, #16\n\t"
  127778. "lsr r7, r7, #16\n\t"
  127779. "mul r7, r6, r7\n\t"
  127780. "adds r3, r3, r7\n\t"
  127781. "adcs r4, r4, #0\n\t"
  127782. "adc r5, r5, #0\n\t"
  127783. "lsr r7, r9, #16\n\t"
  127784. "mul r6, r7, r6\n\t"
  127785. "lsr r7, r6, #16\n\t"
  127786. "lsl r6, r6, #16\n\t"
  127787. "adds r3, r3, r6\n\t"
  127788. "adcs r4, r4, r7\n\t"
  127789. "adc r5, r5, #0\n\t"
  127790. "lsr r6, r8, #16\n\t"
  127791. "lsr r7, r9, #16\n\t"
  127792. "mul r7, r6, r7\n\t"
  127793. "adds r4, r4, r7\n\t"
  127794. "adc r5, r5, #0\n\t"
  127795. "lsl r7, r9, #16\n\t"
  127796. "lsr r7, r7, #16\n\t"
  127797. "mul r6, r7, r6\n\t"
  127798. "lsr r7, r6, #16\n\t"
  127799. "lsl r6, r6, #16\n\t"
  127800. "adds r3, r3, r6\n\t"
  127801. "adcs r4, r4, r7\n\t"
  127802. "adc r5, r5, #0\n\t"
  127803. #else
  127804. "umull r6, r7, r8, r9\n\t"
  127805. "adds r3, r3, r6\n\t"
  127806. "adcs r4, r4, r7\n\t"
  127807. "adc r5, r5, #0\n\t"
  127808. #endif
  127809. /* A[0] * B[12] */
  127810. "ldr r8, [%[a]]\n\t"
  127811. "ldr r9, [%[b], #48]\n\t"
  127812. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127813. "lsl r6, r8, #16\n\t"
  127814. "lsl r7, r9, #16\n\t"
  127815. "lsr r6, r6, #16\n\t"
  127816. "lsr r7, r7, #16\n\t"
  127817. "mul r7, r6, r7\n\t"
  127818. "adds r3, r3, r7\n\t"
  127819. "adcs r4, r4, #0\n\t"
  127820. "adc r5, r5, #0\n\t"
  127821. "lsr r7, r9, #16\n\t"
  127822. "mul r6, r7, r6\n\t"
  127823. "lsr r7, r6, #16\n\t"
  127824. "lsl r6, r6, #16\n\t"
  127825. "adds r3, r3, r6\n\t"
  127826. "adcs r4, r4, r7\n\t"
  127827. "adc r5, r5, #0\n\t"
  127828. "lsr r6, r8, #16\n\t"
  127829. "lsr r7, r9, #16\n\t"
  127830. "mul r7, r6, r7\n\t"
  127831. "adds r4, r4, r7\n\t"
  127832. "adc r5, r5, #0\n\t"
  127833. "lsl r7, r9, #16\n\t"
  127834. "lsr r7, r7, #16\n\t"
  127835. "mul r6, r7, r6\n\t"
  127836. "lsr r7, r6, #16\n\t"
  127837. "lsl r6, r6, #16\n\t"
  127838. "adds r3, r3, r6\n\t"
  127839. "adcs r4, r4, r7\n\t"
  127840. "adc r5, r5, #0\n\t"
  127841. #else
  127842. "umull r6, r7, r8, r9\n\t"
  127843. "adds r3, r3, r6\n\t"
  127844. "adcs r4, r4, r7\n\t"
  127845. "adc r5, r5, #0\n\t"
  127846. #endif
  127847. "str r3, [sp, #48]\n\t"
  127848. /* A[0] * B[13] */
  127849. "ldr r9, [%[b], #52]\n\t"
  127850. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127851. "lsl r6, r8, #16\n\t"
  127852. "lsl r7, r9, #16\n\t"
  127853. "lsr r6, r6, #16\n\t"
  127854. "lsr r7, r7, #16\n\t"
  127855. "mul r7, r6, r7\n\t"
  127856. "adds r4, r4, r7\n\t"
  127857. "adcs r5, r5, #0\n\t"
  127858. "mov r3, #0\n\t"
  127859. "adc r3, r3, #0\n\t"
  127860. "lsr r7, r9, #16\n\t"
  127861. "mul r6, r7, r6\n\t"
  127862. "lsr r7, r6, #16\n\t"
  127863. "lsl r6, r6, #16\n\t"
  127864. "adds r4, r4, r6\n\t"
  127865. "adcs r5, r5, r7\n\t"
  127866. "adc r3, r3, #0\n\t"
  127867. "lsr r6, r8, #16\n\t"
  127868. "lsr r7, r9, #16\n\t"
  127869. "mul r7, r6, r7\n\t"
  127870. "adds r5, r5, r7\n\t"
  127871. "adc r3, r3, #0\n\t"
  127872. "lsl r7, r9, #16\n\t"
  127873. "lsr r7, r7, #16\n\t"
  127874. "mul r6, r7, r6\n\t"
  127875. "lsr r7, r6, #16\n\t"
  127876. "lsl r6, r6, #16\n\t"
  127877. "adds r4, r4, r6\n\t"
  127878. "adcs r5, r5, r7\n\t"
  127879. "adc r3, r3, #0\n\t"
  127880. #else
  127881. "umull r6, r7, r8, r9\n\t"
  127882. "adds r4, r4, r6\n\t"
  127883. "adcs r5, r5, r7\n\t"
  127884. "mov r3, #0\n\t"
  127885. "adc r3, r3, #0\n\t"
  127886. #endif
  127887. /* A[1] * B[12] */
  127888. "ldr r8, [%[a], #4]\n\t"
  127889. "ldr r9, [%[b], #48]\n\t"
  127890. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127891. "lsl r6, r8, #16\n\t"
  127892. "lsl r7, r9, #16\n\t"
  127893. "lsr r6, r6, #16\n\t"
  127894. "lsr r7, r7, #16\n\t"
  127895. "mul r7, r6, r7\n\t"
  127896. "adds r4, r4, r7\n\t"
  127897. "adcs r5, r5, #0\n\t"
  127898. "adc r3, r3, #0\n\t"
  127899. "lsr r7, r9, #16\n\t"
  127900. "mul r6, r7, r6\n\t"
  127901. "lsr r7, r6, #16\n\t"
  127902. "lsl r6, r6, #16\n\t"
  127903. "adds r4, r4, r6\n\t"
  127904. "adcs r5, r5, r7\n\t"
  127905. "adc r3, r3, #0\n\t"
  127906. "lsr r6, r8, #16\n\t"
  127907. "lsr r7, r9, #16\n\t"
  127908. "mul r7, r6, r7\n\t"
  127909. "adds r5, r5, r7\n\t"
  127910. "adc r3, r3, #0\n\t"
  127911. "lsl r7, r9, #16\n\t"
  127912. "lsr r7, r7, #16\n\t"
  127913. "mul r6, r7, r6\n\t"
  127914. "lsr r7, r6, #16\n\t"
  127915. "lsl r6, r6, #16\n\t"
  127916. "adds r4, r4, r6\n\t"
  127917. "adcs r5, r5, r7\n\t"
  127918. "adc r3, r3, #0\n\t"
  127919. #else
  127920. "umull r6, r7, r8, r9\n\t"
  127921. "adds r4, r4, r6\n\t"
  127922. "adcs r5, r5, r7\n\t"
  127923. "adc r3, r3, #0\n\t"
  127924. #endif
  127925. /* A[2] * B[11] */
  127926. "ldr r8, [%[a], #8]\n\t"
  127927. "ldr r9, [%[b], #44]\n\t"
  127928. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127929. "lsl r6, r8, #16\n\t"
  127930. "lsl r7, r9, #16\n\t"
  127931. "lsr r6, r6, #16\n\t"
  127932. "lsr r7, r7, #16\n\t"
  127933. "mul r7, r6, r7\n\t"
  127934. "adds r4, r4, r7\n\t"
  127935. "adcs r5, r5, #0\n\t"
  127936. "adc r3, r3, #0\n\t"
  127937. "lsr r7, r9, #16\n\t"
  127938. "mul r6, r7, r6\n\t"
  127939. "lsr r7, r6, #16\n\t"
  127940. "lsl r6, r6, #16\n\t"
  127941. "adds r4, r4, r6\n\t"
  127942. "adcs r5, r5, r7\n\t"
  127943. "adc r3, r3, #0\n\t"
  127944. "lsr r6, r8, #16\n\t"
  127945. "lsr r7, r9, #16\n\t"
  127946. "mul r7, r6, r7\n\t"
  127947. "adds r5, r5, r7\n\t"
  127948. "adc r3, r3, #0\n\t"
  127949. "lsl r7, r9, #16\n\t"
  127950. "lsr r7, r7, #16\n\t"
  127951. "mul r6, r7, r6\n\t"
  127952. "lsr r7, r6, #16\n\t"
  127953. "lsl r6, r6, #16\n\t"
  127954. "adds r4, r4, r6\n\t"
  127955. "adcs r5, r5, r7\n\t"
  127956. "adc r3, r3, #0\n\t"
  127957. #else
  127958. "umull r6, r7, r8, r9\n\t"
  127959. "adds r4, r4, r6\n\t"
  127960. "adcs r5, r5, r7\n\t"
  127961. "adc r3, r3, #0\n\t"
  127962. #endif
  127963. /* A[3] * B[10] */
  127964. "ldr r8, [%[a], #12]\n\t"
  127965. "ldr r9, [%[b], #40]\n\t"
  127966. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  127967. "lsl r6, r8, #16\n\t"
  127968. "lsl r7, r9, #16\n\t"
  127969. "lsr r6, r6, #16\n\t"
  127970. "lsr r7, r7, #16\n\t"
  127971. "mul r7, r6, r7\n\t"
  127972. "adds r4, r4, r7\n\t"
  127973. "adcs r5, r5, #0\n\t"
  127974. "adc r3, r3, #0\n\t"
  127975. "lsr r7, r9, #16\n\t"
  127976. "mul r6, r7, r6\n\t"
  127977. "lsr r7, r6, #16\n\t"
  127978. "lsl r6, r6, #16\n\t"
  127979. "adds r4, r4, r6\n\t"
  127980. "adcs r5, r5, r7\n\t"
  127981. "adc r3, r3, #0\n\t"
  127982. "lsr r6, r8, #16\n\t"
  127983. "lsr r7, r9, #16\n\t"
  127984. "mul r7, r6, r7\n\t"
  127985. "adds r5, r5, r7\n\t"
  127986. "adc r3, r3, #0\n\t"
  127987. "lsl r7, r9, #16\n\t"
  127988. "lsr r7, r7, #16\n\t"
  127989. "mul r6, r7, r6\n\t"
  127990. "lsr r7, r6, #16\n\t"
  127991. "lsl r6, r6, #16\n\t"
  127992. "adds r4, r4, r6\n\t"
  127993. "adcs r5, r5, r7\n\t"
  127994. "adc r3, r3, #0\n\t"
  127995. #else
  127996. "umull r6, r7, r8, r9\n\t"
  127997. "adds r4, r4, r6\n\t"
  127998. "adcs r5, r5, r7\n\t"
  127999. "adc r3, r3, #0\n\t"
  128000. #endif
  128001. /* A[4] * B[9] */
  128002. "ldr r8, [%[a], #16]\n\t"
  128003. "ldr r9, [%[b], #36]\n\t"
  128004. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128005. "lsl r6, r8, #16\n\t"
  128006. "lsl r7, r9, #16\n\t"
  128007. "lsr r6, r6, #16\n\t"
  128008. "lsr r7, r7, #16\n\t"
  128009. "mul r7, r6, r7\n\t"
  128010. "adds r4, r4, r7\n\t"
  128011. "adcs r5, r5, #0\n\t"
  128012. "adc r3, r3, #0\n\t"
  128013. "lsr r7, r9, #16\n\t"
  128014. "mul r6, r7, r6\n\t"
  128015. "lsr r7, r6, #16\n\t"
  128016. "lsl r6, r6, #16\n\t"
  128017. "adds r4, r4, r6\n\t"
  128018. "adcs r5, r5, r7\n\t"
  128019. "adc r3, r3, #0\n\t"
  128020. "lsr r6, r8, #16\n\t"
  128021. "lsr r7, r9, #16\n\t"
  128022. "mul r7, r6, r7\n\t"
  128023. "adds r5, r5, r7\n\t"
  128024. "adc r3, r3, #0\n\t"
  128025. "lsl r7, r9, #16\n\t"
  128026. "lsr r7, r7, #16\n\t"
  128027. "mul r6, r7, r6\n\t"
  128028. "lsr r7, r6, #16\n\t"
  128029. "lsl r6, r6, #16\n\t"
  128030. "adds r4, r4, r6\n\t"
  128031. "adcs r5, r5, r7\n\t"
  128032. "adc r3, r3, #0\n\t"
  128033. #else
  128034. "umull r6, r7, r8, r9\n\t"
  128035. "adds r4, r4, r6\n\t"
  128036. "adcs r5, r5, r7\n\t"
  128037. "adc r3, r3, #0\n\t"
  128038. #endif
  128039. /* A[5] * B[8] */
  128040. "ldr r8, [%[a], #20]\n\t"
  128041. "ldr r9, [%[b], #32]\n\t"
  128042. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128043. "lsl r6, r8, #16\n\t"
  128044. "lsl r7, r9, #16\n\t"
  128045. "lsr r6, r6, #16\n\t"
  128046. "lsr r7, r7, #16\n\t"
  128047. "mul r7, r6, r7\n\t"
  128048. "adds r4, r4, r7\n\t"
  128049. "adcs r5, r5, #0\n\t"
  128050. "adc r3, r3, #0\n\t"
  128051. "lsr r7, r9, #16\n\t"
  128052. "mul r6, r7, r6\n\t"
  128053. "lsr r7, r6, #16\n\t"
  128054. "lsl r6, r6, #16\n\t"
  128055. "adds r4, r4, r6\n\t"
  128056. "adcs r5, r5, r7\n\t"
  128057. "adc r3, r3, #0\n\t"
  128058. "lsr r6, r8, #16\n\t"
  128059. "lsr r7, r9, #16\n\t"
  128060. "mul r7, r6, r7\n\t"
  128061. "adds r5, r5, r7\n\t"
  128062. "adc r3, r3, #0\n\t"
  128063. "lsl r7, r9, #16\n\t"
  128064. "lsr r7, r7, #16\n\t"
  128065. "mul r6, r7, r6\n\t"
  128066. "lsr r7, r6, #16\n\t"
  128067. "lsl r6, r6, #16\n\t"
  128068. "adds r4, r4, r6\n\t"
  128069. "adcs r5, r5, r7\n\t"
  128070. "adc r3, r3, #0\n\t"
  128071. #else
  128072. "umull r6, r7, r8, r9\n\t"
  128073. "adds r4, r4, r6\n\t"
  128074. "adcs r5, r5, r7\n\t"
  128075. "adc r3, r3, #0\n\t"
  128076. #endif
  128077. /* A[6] * B[7] */
  128078. "ldr r9, [%[b], #28]\n\t"
  128079. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128080. "lsl r6, r11, #16\n\t"
  128081. "lsl r7, r9, #16\n\t"
  128082. "lsr r6, r6, #16\n\t"
  128083. "lsr r7, r7, #16\n\t"
  128084. "mul r7, r6, r7\n\t"
  128085. "adds r4, r4, r7\n\t"
  128086. "adcs r5, r5, #0\n\t"
  128087. "adc r3, r3, #0\n\t"
  128088. "lsr r7, r9, #16\n\t"
  128089. "mul r6, r7, r6\n\t"
  128090. "lsr r7, r6, #16\n\t"
  128091. "lsl r6, r6, #16\n\t"
  128092. "adds r4, r4, r6\n\t"
  128093. "adcs r5, r5, r7\n\t"
  128094. "adc r3, r3, #0\n\t"
  128095. "lsr r6, r11, #16\n\t"
  128096. "lsr r7, r9, #16\n\t"
  128097. "mul r7, r6, r7\n\t"
  128098. "adds r5, r5, r7\n\t"
  128099. "adc r3, r3, #0\n\t"
  128100. "lsl r7, r9, #16\n\t"
  128101. "lsr r7, r7, #16\n\t"
  128102. "mul r6, r7, r6\n\t"
  128103. "lsr r7, r6, #16\n\t"
  128104. "lsl r6, r6, #16\n\t"
  128105. "adds r4, r4, r6\n\t"
  128106. "adcs r5, r5, r7\n\t"
  128107. "adc r3, r3, #0\n\t"
  128108. #else
  128109. "umull r6, r7, r11, r9\n\t"
  128110. "adds r4, r4, r6\n\t"
  128111. "adcs r5, r5, r7\n\t"
  128112. "adc r3, r3, #0\n\t"
  128113. #endif
  128114. /* A[7] * B[6] */
  128115. "ldr r8, [%[a], #28]\n\t"
  128116. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128117. "lsl r6, r8, #16\n\t"
  128118. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[8] * B[5] */
  128152. "ldr r8, [%[a], #32]\n\t"
  128153. "ldr r9, [%[b], #20]\n\t"
  128154. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128155. "lsl r6, r8, #16\n\t"
  128156. "lsl r7, r9, #16\n\t"
  128157. "lsr r6, r6, #16\n\t"
  128158. "lsr r7, r7, #16\n\t"
  128159. "mul r7, r6, r7\n\t"
  128160. "adds r4, r4, r7\n\t"
  128161. "adcs r5, r5, #0\n\t"
  128162. "adc r3, r3, #0\n\t"
  128163. "lsr r7, r9, #16\n\t"
  128164. "mul r6, r7, r6\n\t"
  128165. "lsr r7, r6, #16\n\t"
  128166. "lsl r6, r6, #16\n\t"
  128167. "adds r4, r4, r6\n\t"
  128168. "adcs r5, r5, r7\n\t"
  128169. "adc r3, r3, #0\n\t"
  128170. "lsr r6, r8, #16\n\t"
  128171. "lsr r7, r9, #16\n\t"
  128172. "mul r7, r6, r7\n\t"
  128173. "adds r5, r5, r7\n\t"
  128174. "adc r3, r3, #0\n\t"
  128175. "lsl r7, r9, #16\n\t"
  128176. "lsr r7, r7, #16\n\t"
  128177. "mul r6, r7, r6\n\t"
  128178. "lsr r7, r6, #16\n\t"
  128179. "lsl r6, r6, #16\n\t"
  128180. "adds r4, r4, r6\n\t"
  128181. "adcs r5, r5, r7\n\t"
  128182. "adc r3, r3, #0\n\t"
  128183. #else
  128184. "umull r6, r7, r8, r9\n\t"
  128185. "adds r4, r4, r6\n\t"
  128186. "adcs r5, r5, r7\n\t"
  128187. "adc r3, r3, #0\n\t"
  128188. #endif
  128189. /* A[9] * B[4] */
  128190. "ldr r8, [%[a], #36]\n\t"
  128191. "ldr r9, [%[b], #16]\n\t"
  128192. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128193. "lsl r6, r8, #16\n\t"
  128194. "lsl r7, r9, #16\n\t"
  128195. "lsr r6, r6, #16\n\t"
  128196. "lsr r7, r7, #16\n\t"
  128197. "mul r7, r6, r7\n\t"
  128198. "adds r4, r4, r7\n\t"
  128199. "adcs r5, r5, #0\n\t"
  128200. "adc r3, r3, #0\n\t"
  128201. "lsr r7, r9, #16\n\t"
  128202. "mul r6, r7, r6\n\t"
  128203. "lsr r7, r6, #16\n\t"
  128204. "lsl r6, r6, #16\n\t"
  128205. "adds r4, r4, r6\n\t"
  128206. "adcs r5, r5, r7\n\t"
  128207. "adc r3, r3, #0\n\t"
  128208. "lsr r6, r8, #16\n\t"
  128209. "lsr r7, r9, #16\n\t"
  128210. "mul r7, r6, r7\n\t"
  128211. "adds r5, r5, r7\n\t"
  128212. "adc r3, r3, #0\n\t"
  128213. "lsl r7, r9, #16\n\t"
  128214. "lsr r7, r7, #16\n\t"
  128215. "mul r6, r7, r6\n\t"
  128216. "lsr r7, r6, #16\n\t"
  128217. "lsl r6, r6, #16\n\t"
  128218. "adds r4, r4, r6\n\t"
  128219. "adcs r5, r5, r7\n\t"
  128220. "adc r3, r3, #0\n\t"
  128221. #else
  128222. "umull r6, r7, r8, r9\n\t"
  128223. "adds r4, r4, r6\n\t"
  128224. "adcs r5, r5, r7\n\t"
  128225. "adc r3, r3, #0\n\t"
  128226. #endif
  128227. /* A[10] * B[3] */
  128228. "ldr r8, [%[a], #40]\n\t"
  128229. "ldr r9, [%[b], #12]\n\t"
  128230. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128231. "lsl r6, r8, #16\n\t"
  128232. "lsl r7, r9, #16\n\t"
  128233. "lsr r6, r6, #16\n\t"
  128234. "lsr r7, r7, #16\n\t"
  128235. "mul r7, r6, r7\n\t"
  128236. "adds r4, r4, r7\n\t"
  128237. "adcs r5, r5, #0\n\t"
  128238. "adc r3, r3, #0\n\t"
  128239. "lsr r7, r9, #16\n\t"
  128240. "mul r6, r7, r6\n\t"
  128241. "lsr r7, r6, #16\n\t"
  128242. "lsl r6, r6, #16\n\t"
  128243. "adds r4, r4, r6\n\t"
  128244. "adcs r5, r5, r7\n\t"
  128245. "adc r3, r3, #0\n\t"
  128246. "lsr r6, r8, #16\n\t"
  128247. "lsr r7, r9, #16\n\t"
  128248. "mul r7, r6, r7\n\t"
  128249. "adds r5, r5, r7\n\t"
  128250. "adc r3, r3, #0\n\t"
  128251. "lsl r7, r9, #16\n\t"
  128252. "lsr r7, r7, #16\n\t"
  128253. "mul r6, r7, r6\n\t"
  128254. "lsr r7, r6, #16\n\t"
  128255. "lsl r6, r6, #16\n\t"
  128256. "adds r4, r4, r6\n\t"
  128257. "adcs r5, r5, r7\n\t"
  128258. "adc r3, r3, #0\n\t"
  128259. #else
  128260. "umull r6, r7, r8, r9\n\t"
  128261. "adds r4, r4, r6\n\t"
  128262. "adcs r5, r5, r7\n\t"
  128263. "adc r3, r3, #0\n\t"
  128264. #endif
  128265. /* A[11] * B[2] */
  128266. "ldr r8, [%[a], #44]\n\t"
  128267. "ldr r9, [%[b], #8]\n\t"
  128268. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128269. "lsl r6, r8, #16\n\t"
  128270. "lsl r7, r9, #16\n\t"
  128271. "lsr r6, r6, #16\n\t"
  128272. "lsr r7, r7, #16\n\t"
  128273. "mul r7, r6, r7\n\t"
  128274. "adds r4, r4, r7\n\t"
  128275. "adcs r5, r5, #0\n\t"
  128276. "adc r3, r3, #0\n\t"
  128277. "lsr r7, r9, #16\n\t"
  128278. "mul r6, r7, r6\n\t"
  128279. "lsr r7, r6, #16\n\t"
  128280. "lsl r6, r6, #16\n\t"
  128281. "adds r4, r4, r6\n\t"
  128282. "adcs r5, r5, r7\n\t"
  128283. "adc r3, r3, #0\n\t"
  128284. "lsr r6, r8, #16\n\t"
  128285. "lsr r7, r9, #16\n\t"
  128286. "mul r7, r6, r7\n\t"
  128287. "adds r5, r5, r7\n\t"
  128288. "adc r3, r3, #0\n\t"
  128289. "lsl r7, r9, #16\n\t"
  128290. "lsr r7, r7, #16\n\t"
  128291. "mul r6, r7, r6\n\t"
  128292. "lsr r7, r6, #16\n\t"
  128293. "lsl r6, r6, #16\n\t"
  128294. "adds r4, r4, r6\n\t"
  128295. "adcs r5, r5, r7\n\t"
  128296. "adc r3, r3, #0\n\t"
  128297. #else
  128298. "umull r6, r7, r8, r9\n\t"
  128299. "adds r4, r4, r6\n\t"
  128300. "adcs r5, r5, r7\n\t"
  128301. "adc r3, r3, #0\n\t"
  128302. #endif
  128303. /* A[12] * B[1] */
  128304. "ldr r8, [%[a], #48]\n\t"
  128305. "ldr r9, [%[b], #4]\n\t"
  128306. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128307. "lsl r6, r8, #16\n\t"
  128308. "lsl r7, r9, #16\n\t"
  128309. "lsr r6, r6, #16\n\t"
  128310. "lsr r7, r7, #16\n\t"
  128311. "mul r7, r6, r7\n\t"
  128312. "adds r4, r4, r7\n\t"
  128313. "adcs r5, r5, #0\n\t"
  128314. "adc r3, r3, #0\n\t"
  128315. "lsr r7, r9, #16\n\t"
  128316. "mul r6, r7, r6\n\t"
  128317. "lsr r7, r6, #16\n\t"
  128318. "lsl r6, r6, #16\n\t"
  128319. "adds r4, r4, r6\n\t"
  128320. "adcs r5, r5, r7\n\t"
  128321. "adc r3, r3, #0\n\t"
  128322. "lsr r6, r8, #16\n\t"
  128323. "lsr r7, r9, #16\n\t"
  128324. "mul r7, r6, r7\n\t"
  128325. "adds r5, r5, r7\n\t"
  128326. "adc r3, r3, #0\n\t"
  128327. "lsl r7, r9, #16\n\t"
  128328. "lsr r7, r7, #16\n\t"
  128329. "mul r6, r7, r6\n\t"
  128330. "lsr r7, r6, #16\n\t"
  128331. "lsl r6, r6, #16\n\t"
  128332. "adds r4, r4, r6\n\t"
  128333. "adcs r5, r5, r7\n\t"
  128334. "adc r3, r3, #0\n\t"
  128335. #else
  128336. "umull r6, r7, r8, r9\n\t"
  128337. "adds r4, r4, r6\n\t"
  128338. "adcs r5, r5, r7\n\t"
  128339. "adc r3, r3, #0\n\t"
  128340. #endif
  128341. /* A[13] * B[0] */
  128342. "ldr r8, [%[a], #52]\n\t"
  128343. "ldr r9, [%[b]]\n\t"
  128344. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128345. "lsl r6, r8, #16\n\t"
  128346. "lsl r7, r9, #16\n\t"
  128347. "lsr r6, r6, #16\n\t"
  128348. "lsr r7, r7, #16\n\t"
  128349. "mul r7, r6, r7\n\t"
  128350. "adds r4, r4, r7\n\t"
  128351. "adcs r5, r5, #0\n\t"
  128352. "adc r3, r3, #0\n\t"
  128353. "lsr r7, r9, #16\n\t"
  128354. "mul r6, r7, r6\n\t"
  128355. "lsr r7, r6, #16\n\t"
  128356. "lsl r6, r6, #16\n\t"
  128357. "adds r4, r4, r6\n\t"
  128358. "adcs r5, r5, r7\n\t"
  128359. "adc r3, r3, #0\n\t"
  128360. "lsr r6, r8, #16\n\t"
  128361. "lsr r7, r9, #16\n\t"
  128362. "mul r7, r6, r7\n\t"
  128363. "adds r5, r5, r7\n\t"
  128364. "adc r3, r3, #0\n\t"
  128365. "lsl r7, r9, #16\n\t"
  128366. "lsr r7, r7, #16\n\t"
  128367. "mul r6, r7, r6\n\t"
  128368. "lsr r7, r6, #16\n\t"
  128369. "lsl r6, r6, #16\n\t"
  128370. "adds r4, r4, r6\n\t"
  128371. "adcs r5, r5, r7\n\t"
  128372. "adc r3, r3, #0\n\t"
  128373. #else
  128374. "umull r6, r7, r8, r9\n\t"
  128375. "adds r4, r4, r6\n\t"
  128376. "adcs r5, r5, r7\n\t"
  128377. "adc r3, r3, #0\n\t"
  128378. #endif
  128379. "str r4, [sp, #52]\n\t"
  128380. /* A[14] * B[0] */
  128381. "ldr r8, [%[a], #56]\n\t"
  128382. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128383. "lsl r6, r8, #16\n\t"
  128384. "lsl r7, r9, #16\n\t"
  128385. "lsr r6, r6, #16\n\t"
  128386. "lsr r7, r7, #16\n\t"
  128387. "mul r7, r6, r7\n\t"
  128388. "adds r5, r5, r7\n\t"
  128389. "adcs r3, r3, #0\n\t"
  128390. "mov r4, #0\n\t"
  128391. "adc r4, r4, #0\n\t"
  128392. "lsr r7, r9, #16\n\t"
  128393. "mul r6, r7, r6\n\t"
  128394. "lsr r7, r6, #16\n\t"
  128395. "lsl r6, r6, #16\n\t"
  128396. "adds r5, r5, r6\n\t"
  128397. "adcs r3, r3, r7\n\t"
  128398. "adc r4, r4, #0\n\t"
  128399. "lsr r6, r8, #16\n\t"
  128400. "lsr r7, r9, #16\n\t"
  128401. "mul r7, r6, r7\n\t"
  128402. "adds r3, r3, r7\n\t"
  128403. "adc r4, r4, #0\n\t"
  128404. "lsl r7, r9, #16\n\t"
  128405. "lsr r7, r7, #16\n\t"
  128406. "mul r6, r7, r6\n\t"
  128407. "lsr r7, r6, #16\n\t"
  128408. "lsl r6, r6, #16\n\t"
  128409. "adds r5, r5, r6\n\t"
  128410. "adcs r3, r3, r7\n\t"
  128411. "adc r4, r4, #0\n\t"
  128412. #else
  128413. "umull r6, r7, r8, r9\n\t"
  128414. "adds r5, r5, r6\n\t"
  128415. "adcs r3, r3, r7\n\t"
  128416. "mov r4, #0\n\t"
  128417. "adc r4, r4, #0\n\t"
  128418. #endif
  128419. /* A[13] * B[1] */
  128420. "ldr r8, [%[a], #52]\n\t"
  128421. "ldr r9, [%[b], #4]\n\t"
  128422. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128423. "lsl r6, r8, #16\n\t"
  128424. "lsl r7, r9, #16\n\t"
  128425. "lsr r6, r6, #16\n\t"
  128426. "lsr r7, r7, #16\n\t"
  128427. "mul r7, r6, r7\n\t"
  128428. "adds r5, r5, r7\n\t"
  128429. "adcs r3, r3, #0\n\t"
  128430. "adc r4, r4, #0\n\t"
  128431. "lsr r7, r9, #16\n\t"
  128432. "mul r6, r7, r6\n\t"
  128433. "lsr r7, r6, #16\n\t"
  128434. "lsl r6, r6, #16\n\t"
  128435. "adds r5, r5, r6\n\t"
  128436. "adcs r3, r3, r7\n\t"
  128437. "adc r4, r4, #0\n\t"
  128438. "lsr r6, r8, #16\n\t"
  128439. "lsr r7, r9, #16\n\t"
  128440. "mul r7, r6, r7\n\t"
  128441. "adds r3, r3, r7\n\t"
  128442. "adc r4, r4, #0\n\t"
  128443. "lsl r7, r9, #16\n\t"
  128444. "lsr r7, r7, #16\n\t"
  128445. "mul r6, r7, r6\n\t"
  128446. "lsr r7, r6, #16\n\t"
  128447. "lsl r6, r6, #16\n\t"
  128448. "adds r5, r5, r6\n\t"
  128449. "adcs r3, r3, r7\n\t"
  128450. "adc r4, r4, #0\n\t"
  128451. #else
  128452. "umull r6, r7, r8, r9\n\t"
  128453. "adds r5, r5, r6\n\t"
  128454. "adcs r3, r3, r7\n\t"
  128455. "adc r4, r4, #0\n\t"
  128456. #endif
  128457. /* A[12] * B[2] */
  128458. "ldr r8, [%[a], #48]\n\t"
  128459. "ldr r9, [%[b], #8]\n\t"
  128460. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128461. "lsl r6, r8, #16\n\t"
  128462. "lsl r7, r9, #16\n\t"
  128463. "lsr r6, r6, #16\n\t"
  128464. "lsr r7, r7, #16\n\t"
  128465. "mul r7, r6, r7\n\t"
  128466. "adds r5, r5, r7\n\t"
  128467. "adcs r3, r3, #0\n\t"
  128468. "adc r4, r4, #0\n\t"
  128469. "lsr r7, r9, #16\n\t"
  128470. "mul r6, r7, r6\n\t"
  128471. "lsr r7, r6, #16\n\t"
  128472. "lsl r6, r6, #16\n\t"
  128473. "adds r5, r5, r6\n\t"
  128474. "adcs r3, r3, r7\n\t"
  128475. "adc r4, r4, #0\n\t"
  128476. "lsr r6, r8, #16\n\t"
  128477. "lsr r7, r9, #16\n\t"
  128478. "mul r7, r6, r7\n\t"
  128479. "adds r3, r3, r7\n\t"
  128480. "adc r4, r4, #0\n\t"
  128481. "lsl r7, r9, #16\n\t"
  128482. "lsr r7, r7, #16\n\t"
  128483. "mul r6, r7, r6\n\t"
  128484. "lsr r7, r6, #16\n\t"
  128485. "lsl r6, r6, #16\n\t"
  128486. "adds r5, r5, r6\n\t"
  128487. "adcs r3, r3, r7\n\t"
  128488. "adc r4, r4, #0\n\t"
  128489. #else
  128490. "umull r6, r7, r8, r9\n\t"
  128491. "adds r5, r5, r6\n\t"
  128492. "adcs r3, r3, r7\n\t"
  128493. "adc r4, r4, #0\n\t"
  128494. #endif
  128495. /* A[11] * B[3] */
  128496. "ldr r8, [%[a], #44]\n\t"
  128497. "ldr r9, [%[b], #12]\n\t"
  128498. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128499. "lsl r6, r8, #16\n\t"
  128500. "lsl r7, r9, #16\n\t"
  128501. "lsr r6, r6, #16\n\t"
  128502. "lsr r7, r7, #16\n\t"
  128503. "mul r7, r6, r7\n\t"
  128504. "adds r5, r5, r7\n\t"
  128505. "adcs r3, r3, #0\n\t"
  128506. "adc r4, r4, #0\n\t"
  128507. "lsr r7, r9, #16\n\t"
  128508. "mul r6, r7, r6\n\t"
  128509. "lsr r7, r6, #16\n\t"
  128510. "lsl r6, r6, #16\n\t"
  128511. "adds r5, r5, r6\n\t"
  128512. "adcs r3, r3, r7\n\t"
  128513. "adc r4, r4, #0\n\t"
  128514. "lsr r6, r8, #16\n\t"
  128515. "lsr r7, r9, #16\n\t"
  128516. "mul r7, r6, r7\n\t"
  128517. "adds r3, r3, r7\n\t"
  128518. "adc r4, r4, #0\n\t"
  128519. "lsl r7, r9, #16\n\t"
  128520. "lsr r7, r7, #16\n\t"
  128521. "mul r6, r7, r6\n\t"
  128522. "lsr r7, r6, #16\n\t"
  128523. "lsl r6, r6, #16\n\t"
  128524. "adds r5, r5, r6\n\t"
  128525. "adcs r3, r3, r7\n\t"
  128526. "adc r4, r4, #0\n\t"
  128527. #else
  128528. "umull r6, r7, r8, r9\n\t"
  128529. "adds r5, r5, r6\n\t"
  128530. "adcs r3, r3, r7\n\t"
  128531. "adc r4, r4, #0\n\t"
  128532. #endif
  128533. /* A[10] * B[4] */
  128534. "ldr r8, [%[a], #40]\n\t"
  128535. "ldr r9, [%[b], #16]\n\t"
  128536. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128537. "lsl r6, r8, #16\n\t"
  128538. "lsl r7, r9, #16\n\t"
  128539. "lsr r6, r6, #16\n\t"
  128540. "lsr r7, r7, #16\n\t"
  128541. "mul r7, r6, r7\n\t"
  128542. "adds r5, r5, r7\n\t"
  128543. "adcs r3, r3, #0\n\t"
  128544. "adc r4, r4, #0\n\t"
  128545. "lsr r7, r9, #16\n\t"
  128546. "mul r6, r7, r6\n\t"
  128547. "lsr r7, r6, #16\n\t"
  128548. "lsl r6, r6, #16\n\t"
  128549. "adds r5, r5, r6\n\t"
  128550. "adcs r3, r3, r7\n\t"
  128551. "adc r4, r4, #0\n\t"
  128552. "lsr r6, r8, #16\n\t"
  128553. "lsr r7, r9, #16\n\t"
  128554. "mul r7, r6, r7\n\t"
  128555. "adds r3, r3, r7\n\t"
  128556. "adc r4, r4, #0\n\t"
  128557. "lsl r7, r9, #16\n\t"
  128558. "lsr r7, r7, #16\n\t"
  128559. "mul r6, r7, r6\n\t"
  128560. "lsr r7, r6, #16\n\t"
  128561. "lsl r6, r6, #16\n\t"
  128562. "adds r5, r5, r6\n\t"
  128563. "adcs r3, r3, r7\n\t"
  128564. "adc r4, r4, #0\n\t"
  128565. #else
  128566. "umull r6, r7, r8, r9\n\t"
  128567. "adds r5, r5, r6\n\t"
  128568. "adcs r3, r3, r7\n\t"
  128569. "adc r4, r4, #0\n\t"
  128570. #endif
  128571. /* A[9] * B[5] */
  128572. "ldr r8, [%[a], #36]\n\t"
  128573. "ldr r9, [%[b], #20]\n\t"
  128574. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128575. "lsl r6, r8, #16\n\t"
  128576. "lsl r7, r9, #16\n\t"
  128577. "lsr r6, r6, #16\n\t"
  128578. "lsr r7, r7, #16\n\t"
  128579. "mul r7, r6, r7\n\t"
  128580. "adds r5, r5, r7\n\t"
  128581. "adcs r3, r3, #0\n\t"
  128582. "adc r4, r4, #0\n\t"
  128583. "lsr r7, r9, #16\n\t"
  128584. "mul r6, r7, r6\n\t"
  128585. "lsr r7, r6, #16\n\t"
  128586. "lsl r6, r6, #16\n\t"
  128587. "adds r5, r5, r6\n\t"
  128588. "adcs r3, r3, r7\n\t"
  128589. "adc r4, r4, #0\n\t"
  128590. "lsr r6, r8, #16\n\t"
  128591. "lsr r7, r9, #16\n\t"
  128592. "mul r7, r6, r7\n\t"
  128593. "adds r3, r3, r7\n\t"
  128594. "adc r4, r4, #0\n\t"
  128595. "lsl r7, r9, #16\n\t"
  128596. "lsr r7, r7, #16\n\t"
  128597. "mul r6, r7, r6\n\t"
  128598. "lsr r7, r6, #16\n\t"
  128599. "lsl r6, r6, #16\n\t"
  128600. "adds r5, r5, r6\n\t"
  128601. "adcs r3, r3, r7\n\t"
  128602. "adc r4, r4, #0\n\t"
  128603. #else
  128604. "umull r6, r7, r8, r9\n\t"
  128605. "adds r5, r5, r6\n\t"
  128606. "adcs r3, r3, r7\n\t"
  128607. "adc r4, r4, #0\n\t"
  128608. #endif
  128609. /* A[8] * B[6] */
  128610. "ldr r8, [%[a], #32]\n\t"
  128611. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128612. "lsl r6, r8, #16\n\t"
  128613. "lsl r7, r12, #16\n\t"
  128614. "lsr r6, r6, #16\n\t"
  128615. "lsr r7, r7, #16\n\t"
  128616. "mul r7, r6, r7\n\t"
  128617. "adds r5, r5, r7\n\t"
  128618. "adcs r3, r3, #0\n\t"
  128619. "adc r4, r4, #0\n\t"
  128620. "lsr r7, r12, #16\n\t"
  128621. "mul r6, r7, r6\n\t"
  128622. "lsr r7, r6, #16\n\t"
  128623. "lsl r6, r6, #16\n\t"
  128624. "adds r5, r5, r6\n\t"
  128625. "adcs r3, r3, r7\n\t"
  128626. "adc r4, r4, #0\n\t"
  128627. "lsr r6, r8, #16\n\t"
  128628. "lsr r7, r12, #16\n\t"
  128629. "mul r7, r6, r7\n\t"
  128630. "adds r3, r3, r7\n\t"
  128631. "adc r4, r4, #0\n\t"
  128632. "lsl r7, r12, #16\n\t"
  128633. "lsr r7, r7, #16\n\t"
  128634. "mul r6, r7, r6\n\t"
  128635. "lsr r7, r6, #16\n\t"
  128636. "lsl r6, r6, #16\n\t"
  128637. "adds r5, r5, r6\n\t"
  128638. "adcs r3, r3, r7\n\t"
  128639. "adc r4, r4, #0\n\t"
  128640. #else
  128641. "umull r6, r7, r8, r12\n\t"
  128642. "adds r5, r5, r6\n\t"
  128643. "adcs r3, r3, r7\n\t"
  128644. "adc r4, r4, #0\n\t"
  128645. #endif
  128646. /* A[7] * B[7] */
  128647. "ldr r11, [%[a], #28]\n\t"
  128648. "ldr r12, [%[b], #28]\n\t"
  128649. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128650. "lsl r6, r11, #16\n\t"
  128651. "lsl r7, r12, #16\n\t"
  128652. "lsr r6, r6, #16\n\t"
  128653. "lsr r7, r7, #16\n\t"
  128654. "mul r7, r6, r7\n\t"
  128655. "adds r5, r5, r7\n\t"
  128656. "adcs r3, r3, #0\n\t"
  128657. "adc r4, r4, #0\n\t"
  128658. "lsr r7, r12, #16\n\t"
  128659. "mul r6, r7, r6\n\t"
  128660. "lsr r7, r6, #16\n\t"
  128661. "lsl r6, r6, #16\n\t"
  128662. "adds r5, r5, r6\n\t"
  128663. "adcs r3, r3, r7\n\t"
  128664. "adc r4, r4, #0\n\t"
  128665. "lsr r6, r11, #16\n\t"
  128666. "lsr r7, r12, #16\n\t"
  128667. "mul r7, r6, r7\n\t"
  128668. "adds r3, r3, r7\n\t"
  128669. "adc r4, r4, #0\n\t"
  128670. "lsl r7, r12, #16\n\t"
  128671. "lsr r7, r7, #16\n\t"
  128672. "mul r6, r7, r6\n\t"
  128673. "lsr r7, r6, #16\n\t"
  128674. "lsl r6, r6, #16\n\t"
  128675. "adds r5, r5, r6\n\t"
  128676. "adcs r3, r3, r7\n\t"
  128677. "adc r4, r4, #0\n\t"
  128678. #else
  128679. "umull r6, r7, r11, r12\n\t"
  128680. "adds r5, r5, r6\n\t"
  128681. "adcs r3, r3, r7\n\t"
  128682. "adc r4, r4, #0\n\t"
  128683. #endif
  128684. /* A[6] * B[8] */
  128685. "ldr r8, [%[a], #24]\n\t"
  128686. "ldr r9, [%[b], #32]\n\t"
  128687. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128688. "lsl r6, r8, #16\n\t"
  128689. "lsl r7, r9, #16\n\t"
  128690. "lsr r6, r6, #16\n\t"
  128691. "lsr r7, r7, #16\n\t"
  128692. "mul r7, r6, r7\n\t"
  128693. "adds r5, r5, r7\n\t"
  128694. "adcs r3, r3, #0\n\t"
  128695. "adc r4, r4, #0\n\t"
  128696. "lsr r7, r9, #16\n\t"
  128697. "mul r6, r7, r6\n\t"
  128698. "lsr r7, r6, #16\n\t"
  128699. "lsl r6, r6, #16\n\t"
  128700. "adds r5, r5, r6\n\t"
  128701. "adcs r3, r3, r7\n\t"
  128702. "adc r4, r4, #0\n\t"
  128703. "lsr r6, r8, #16\n\t"
  128704. "lsr r7, r9, #16\n\t"
  128705. "mul r7, r6, r7\n\t"
  128706. "adds r3, r3, r7\n\t"
  128707. "adc r4, r4, #0\n\t"
  128708. "lsl r7, r9, #16\n\t"
  128709. "lsr r7, r7, #16\n\t"
  128710. "mul r6, r7, r6\n\t"
  128711. "lsr r7, r6, #16\n\t"
  128712. "lsl r6, r6, #16\n\t"
  128713. "adds r5, r5, r6\n\t"
  128714. "adcs r3, r3, r7\n\t"
  128715. "adc r4, r4, #0\n\t"
  128716. #else
  128717. "umull r6, r7, r8, r9\n\t"
  128718. "adds r5, r5, r6\n\t"
  128719. "adcs r3, r3, r7\n\t"
  128720. "adc r4, r4, #0\n\t"
  128721. #endif
  128722. /* A[5] * B[9] */
  128723. "ldr r8, [%[a], #20]\n\t"
  128724. "ldr r9, [%[b], #36]\n\t"
  128725. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128726. "lsl r6, r8, #16\n\t"
  128727. "lsl r7, r9, #16\n\t"
  128728. "lsr r6, r6, #16\n\t"
  128729. "lsr r7, r7, #16\n\t"
  128730. "mul r7, r6, r7\n\t"
  128731. "adds r5, r5, r7\n\t"
  128732. "adcs r3, r3, #0\n\t"
  128733. "adc r4, r4, #0\n\t"
  128734. "lsr r7, r9, #16\n\t"
  128735. "mul r6, r7, r6\n\t"
  128736. "lsr r7, r6, #16\n\t"
  128737. "lsl r6, r6, #16\n\t"
  128738. "adds r5, r5, r6\n\t"
  128739. "adcs r3, r3, r7\n\t"
  128740. "adc r4, r4, #0\n\t"
  128741. "lsr r6, r8, #16\n\t"
  128742. "lsr r7, r9, #16\n\t"
  128743. "mul r7, r6, r7\n\t"
  128744. "adds r3, r3, r7\n\t"
  128745. "adc r4, r4, #0\n\t"
  128746. "lsl r7, r9, #16\n\t"
  128747. "lsr r7, r7, #16\n\t"
  128748. "mul r6, r7, r6\n\t"
  128749. "lsr r7, r6, #16\n\t"
  128750. "lsl r6, r6, #16\n\t"
  128751. "adds r5, r5, r6\n\t"
  128752. "adcs r3, r3, r7\n\t"
  128753. "adc r4, r4, #0\n\t"
  128754. #else
  128755. "umull r6, r7, r8, r9\n\t"
  128756. "adds r5, r5, r6\n\t"
  128757. "adcs r3, r3, r7\n\t"
  128758. "adc r4, r4, #0\n\t"
  128759. #endif
  128760. /* A[4] * B[10] */
  128761. "ldr r8, [%[a], #16]\n\t"
  128762. "ldr r9, [%[b], #40]\n\t"
  128763. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128764. "lsl r6, r8, #16\n\t"
  128765. "lsl r7, r9, #16\n\t"
  128766. "lsr r6, r6, #16\n\t"
  128767. "lsr r7, r7, #16\n\t"
  128768. "mul r7, r6, r7\n\t"
  128769. "adds r5, r5, r7\n\t"
  128770. "adcs r3, r3, #0\n\t"
  128771. "adc r4, r4, #0\n\t"
  128772. "lsr r7, r9, #16\n\t"
  128773. "mul r6, r7, r6\n\t"
  128774. "lsr r7, r6, #16\n\t"
  128775. "lsl r6, r6, #16\n\t"
  128776. "adds r5, r5, r6\n\t"
  128777. "adcs r3, r3, r7\n\t"
  128778. "adc r4, r4, #0\n\t"
  128779. "lsr r6, r8, #16\n\t"
  128780. "lsr r7, r9, #16\n\t"
  128781. "mul r7, r6, r7\n\t"
  128782. "adds r3, r3, r7\n\t"
  128783. "adc r4, r4, #0\n\t"
  128784. "lsl r7, r9, #16\n\t"
  128785. "lsr r7, r7, #16\n\t"
  128786. "mul r6, r7, r6\n\t"
  128787. "lsr r7, r6, #16\n\t"
  128788. "lsl r6, r6, #16\n\t"
  128789. "adds r5, r5, r6\n\t"
  128790. "adcs r3, r3, r7\n\t"
  128791. "adc r4, r4, #0\n\t"
  128792. #else
  128793. "umull r6, r7, r8, r9\n\t"
  128794. "adds r5, r5, r6\n\t"
  128795. "adcs r3, r3, r7\n\t"
  128796. "adc r4, r4, #0\n\t"
  128797. #endif
  128798. /* A[3] * B[11] */
  128799. "ldr r8, [%[a], #12]\n\t"
  128800. "ldr r9, [%[b], #44]\n\t"
  128801. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128802. "lsl r6, r8, #16\n\t"
  128803. "lsl r7, r9, #16\n\t"
  128804. "lsr r6, r6, #16\n\t"
  128805. "lsr r7, r7, #16\n\t"
  128806. "mul r7, r6, r7\n\t"
  128807. "adds r5, r5, r7\n\t"
  128808. "adcs r3, r3, #0\n\t"
  128809. "adc r4, r4, #0\n\t"
  128810. "lsr r7, r9, #16\n\t"
  128811. "mul r6, r7, r6\n\t"
  128812. "lsr r7, r6, #16\n\t"
  128813. "lsl r6, r6, #16\n\t"
  128814. "adds r5, r5, r6\n\t"
  128815. "adcs r3, r3, r7\n\t"
  128816. "adc r4, r4, #0\n\t"
  128817. "lsr r6, r8, #16\n\t"
  128818. "lsr r7, r9, #16\n\t"
  128819. "mul r7, r6, r7\n\t"
  128820. "adds r3, r3, r7\n\t"
  128821. "adc r4, r4, #0\n\t"
  128822. "lsl r7, r9, #16\n\t"
  128823. "lsr r7, r7, #16\n\t"
  128824. "mul r6, r7, r6\n\t"
  128825. "lsr r7, r6, #16\n\t"
  128826. "lsl r6, r6, #16\n\t"
  128827. "adds r5, r5, r6\n\t"
  128828. "adcs r3, r3, r7\n\t"
  128829. "adc r4, r4, #0\n\t"
  128830. #else
  128831. "umull r6, r7, r8, r9\n\t"
  128832. "adds r5, r5, r6\n\t"
  128833. "adcs r3, r3, r7\n\t"
  128834. "adc r4, r4, #0\n\t"
  128835. #endif
  128836. /* A[2] * B[12] */
  128837. "ldr r8, [%[a], #8]\n\t"
  128838. "ldr r9, [%[b], #48]\n\t"
  128839. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128840. "lsl r6, r8, #16\n\t"
  128841. "lsl r7, r9, #16\n\t"
  128842. "lsr r6, r6, #16\n\t"
  128843. "lsr r7, r7, #16\n\t"
  128844. "mul r7, r6, r7\n\t"
  128845. "adds r5, r5, r7\n\t"
  128846. "adcs r3, r3, #0\n\t"
  128847. "adc r4, r4, #0\n\t"
  128848. "lsr r7, r9, #16\n\t"
  128849. "mul r6, r7, r6\n\t"
  128850. "lsr r7, r6, #16\n\t"
  128851. "lsl r6, r6, #16\n\t"
  128852. "adds r5, r5, r6\n\t"
  128853. "adcs r3, r3, r7\n\t"
  128854. "adc r4, r4, #0\n\t"
  128855. "lsr r6, r8, #16\n\t"
  128856. "lsr r7, r9, #16\n\t"
  128857. "mul r7, r6, r7\n\t"
  128858. "adds r3, r3, r7\n\t"
  128859. "adc r4, r4, #0\n\t"
  128860. "lsl r7, r9, #16\n\t"
  128861. "lsr r7, r7, #16\n\t"
  128862. "mul r6, r7, r6\n\t"
  128863. "lsr r7, r6, #16\n\t"
  128864. "lsl r6, r6, #16\n\t"
  128865. "adds r5, r5, r6\n\t"
  128866. "adcs r3, r3, r7\n\t"
  128867. "adc r4, r4, #0\n\t"
  128868. #else
  128869. "umull r6, r7, r8, r9\n\t"
  128870. "adds r5, r5, r6\n\t"
  128871. "adcs r3, r3, r7\n\t"
  128872. "adc r4, r4, #0\n\t"
  128873. #endif
  128874. /* A[1] * B[13] */
  128875. "ldr r8, [%[a], #4]\n\t"
  128876. "ldr r9, [%[b], #52]\n\t"
  128877. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128878. "lsl r6, r8, #16\n\t"
  128879. "lsl r7, r9, #16\n\t"
  128880. "lsr r6, r6, #16\n\t"
  128881. "lsr r7, r7, #16\n\t"
  128882. "mul r7, r6, r7\n\t"
  128883. "adds r5, r5, r7\n\t"
  128884. "adcs r3, r3, #0\n\t"
  128885. "adc r4, r4, #0\n\t"
  128886. "lsr r7, r9, #16\n\t"
  128887. "mul r6, r7, r6\n\t"
  128888. "lsr r7, r6, #16\n\t"
  128889. "lsl r6, r6, #16\n\t"
  128890. "adds r5, r5, r6\n\t"
  128891. "adcs r3, r3, r7\n\t"
  128892. "adc r4, r4, #0\n\t"
  128893. "lsr r6, r8, #16\n\t"
  128894. "lsr r7, r9, #16\n\t"
  128895. "mul r7, r6, r7\n\t"
  128896. "adds r3, r3, r7\n\t"
  128897. "adc r4, r4, #0\n\t"
  128898. "lsl r7, r9, #16\n\t"
  128899. "lsr r7, r7, #16\n\t"
  128900. "mul r6, r7, r6\n\t"
  128901. "lsr r7, r6, #16\n\t"
  128902. "lsl r6, r6, #16\n\t"
  128903. "adds r5, r5, r6\n\t"
  128904. "adcs r3, r3, r7\n\t"
  128905. "adc r4, r4, #0\n\t"
  128906. #else
  128907. "umull r6, r7, r8, r9\n\t"
  128908. "adds r5, r5, r6\n\t"
  128909. "adcs r3, r3, r7\n\t"
  128910. "adc r4, r4, #0\n\t"
  128911. #endif
  128912. /* A[0] * B[14] */
  128913. "ldr r8, [%[a]]\n\t"
  128914. "ldr r9, [%[b], #56]\n\t"
  128915. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128916. "lsl r6, r8, #16\n\t"
  128917. "lsl r7, r9, #16\n\t"
  128918. "lsr r6, r6, #16\n\t"
  128919. "lsr r7, r7, #16\n\t"
  128920. "mul r7, r6, r7\n\t"
  128921. "adds r5, r5, r7\n\t"
  128922. "adcs r3, r3, #0\n\t"
  128923. "adc r4, r4, #0\n\t"
  128924. "lsr r7, r9, #16\n\t"
  128925. "mul r6, r7, r6\n\t"
  128926. "lsr r7, r6, #16\n\t"
  128927. "lsl r6, r6, #16\n\t"
  128928. "adds r5, r5, r6\n\t"
  128929. "adcs r3, r3, r7\n\t"
  128930. "adc r4, r4, #0\n\t"
  128931. "lsr r6, r8, #16\n\t"
  128932. "lsr r7, r9, #16\n\t"
  128933. "mul r7, r6, r7\n\t"
  128934. "adds r3, r3, r7\n\t"
  128935. "adc r4, r4, #0\n\t"
  128936. "lsl r7, r9, #16\n\t"
  128937. "lsr r7, r7, #16\n\t"
  128938. "mul r6, r7, r6\n\t"
  128939. "lsr r7, r6, #16\n\t"
  128940. "lsl r6, r6, #16\n\t"
  128941. "adds r5, r5, r6\n\t"
  128942. "adcs r3, r3, r7\n\t"
  128943. "adc r4, r4, #0\n\t"
  128944. #else
  128945. "umull r6, r7, r8, r9\n\t"
  128946. "adds r5, r5, r6\n\t"
  128947. "adcs r3, r3, r7\n\t"
  128948. "adc r4, r4, #0\n\t"
  128949. #endif
  128950. "str r5, [sp, #56]\n\t"
  128951. /* A[0] * B[15] */
  128952. "ldr r9, [%[b], #60]\n\t"
  128953. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128954. "lsl r6, r8, #16\n\t"
  128955. "lsl r7, r9, #16\n\t"
  128956. "lsr r6, r6, #16\n\t"
  128957. "lsr r7, r7, #16\n\t"
  128958. "mul r7, r6, r7\n\t"
  128959. "adds r3, r3, r7\n\t"
  128960. "adcs r4, r4, #0\n\t"
  128961. "mov r5, #0\n\t"
  128962. "adc r5, r5, #0\n\t"
  128963. "lsr r7, r9, #16\n\t"
  128964. "mul r6, r7, r6\n\t"
  128965. "lsr r7, r6, #16\n\t"
  128966. "lsl r6, r6, #16\n\t"
  128967. "adds r3, r3, r6\n\t"
  128968. "adcs r4, r4, r7\n\t"
  128969. "adc r5, r5, #0\n\t"
  128970. "lsr r6, r8, #16\n\t"
  128971. "lsr r7, r9, #16\n\t"
  128972. "mul r7, r6, r7\n\t"
  128973. "adds r4, r4, r7\n\t"
  128974. "adc r5, r5, #0\n\t"
  128975. "lsl r7, r9, #16\n\t"
  128976. "lsr r7, r7, #16\n\t"
  128977. "mul r6, r7, r6\n\t"
  128978. "lsr r7, r6, #16\n\t"
  128979. "lsl r6, r6, #16\n\t"
  128980. "adds r3, r3, r6\n\t"
  128981. "adcs r4, r4, r7\n\t"
  128982. "adc r5, r5, #0\n\t"
  128983. #else
  128984. "umull r6, r7, r8, r9\n\t"
  128985. "adds r3, r3, r6\n\t"
  128986. "adcs r4, r4, r7\n\t"
  128987. "mov r5, #0\n\t"
  128988. "adc r5, r5, #0\n\t"
  128989. #endif
  128990. /* A[1] * B[14] */
  128991. "ldr r8, [%[a], #4]\n\t"
  128992. "ldr r9, [%[b], #56]\n\t"
  128993. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  128994. "lsl r6, r8, #16\n\t"
  128995. "lsl r7, r9, #16\n\t"
  128996. "lsr r6, r6, #16\n\t"
  128997. "lsr r7, r7, #16\n\t"
  128998. "mul r7, r6, r7\n\t"
  128999. "adds r3, r3, r7\n\t"
  129000. "adcs r4, r4, #0\n\t"
  129001. "adc r5, r5, #0\n\t"
  129002. "lsr r7, r9, #16\n\t"
  129003. "mul r6, r7, r6\n\t"
  129004. "lsr r7, r6, #16\n\t"
  129005. "lsl r6, r6, #16\n\t"
  129006. "adds r3, r3, r6\n\t"
  129007. "adcs r4, r4, r7\n\t"
  129008. "adc r5, r5, #0\n\t"
  129009. "lsr r6, r8, #16\n\t"
  129010. "lsr r7, r9, #16\n\t"
  129011. "mul r7, r6, r7\n\t"
  129012. "adds r4, r4, r7\n\t"
  129013. "adc r5, r5, #0\n\t"
  129014. "lsl r7, r9, #16\n\t"
  129015. "lsr r7, r7, #16\n\t"
  129016. "mul r6, r7, r6\n\t"
  129017. "lsr r7, r6, #16\n\t"
  129018. "lsl r6, r6, #16\n\t"
  129019. "adds r3, r3, r6\n\t"
  129020. "adcs r4, r4, r7\n\t"
  129021. "adc r5, r5, #0\n\t"
  129022. #else
  129023. "umull r6, r7, r8, r9\n\t"
  129024. "adds r3, r3, r6\n\t"
  129025. "adcs r4, r4, r7\n\t"
  129026. "adc r5, r5, #0\n\t"
  129027. #endif
  129028. /* A[2] * B[13] */
  129029. "ldr r8, [%[a], #8]\n\t"
  129030. "ldr r9, [%[b], #52]\n\t"
  129031. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129032. "lsl r6, r8, #16\n\t"
  129033. "lsl r7, r9, #16\n\t"
  129034. "lsr r6, r6, #16\n\t"
  129035. "lsr r7, r7, #16\n\t"
  129036. "mul r7, r6, r7\n\t"
  129037. "adds r3, r3, r7\n\t"
  129038. "adcs r4, r4, #0\n\t"
  129039. "adc r5, r5, #0\n\t"
  129040. "lsr r7, r9, #16\n\t"
  129041. "mul r6, r7, r6\n\t"
  129042. "lsr r7, r6, #16\n\t"
  129043. "lsl r6, r6, #16\n\t"
  129044. "adds r3, r3, r6\n\t"
  129045. "adcs r4, r4, r7\n\t"
  129046. "adc r5, r5, #0\n\t"
  129047. "lsr r6, r8, #16\n\t"
  129048. "lsr r7, r9, #16\n\t"
  129049. "mul r7, r6, r7\n\t"
  129050. "adds r4, r4, r7\n\t"
  129051. "adc r5, r5, #0\n\t"
  129052. "lsl r7, r9, #16\n\t"
  129053. "lsr r7, r7, #16\n\t"
  129054. "mul r6, r7, r6\n\t"
  129055. "lsr r7, r6, #16\n\t"
  129056. "lsl r6, r6, #16\n\t"
  129057. "adds r3, r3, r6\n\t"
  129058. "adcs r4, r4, r7\n\t"
  129059. "adc r5, r5, #0\n\t"
  129060. #else
  129061. "umull r6, r7, r8, r9\n\t"
  129062. "adds r3, r3, r6\n\t"
  129063. "adcs r4, r4, r7\n\t"
  129064. "adc r5, r5, #0\n\t"
  129065. #endif
  129066. /* A[3] * B[12] */
  129067. "ldr r8, [%[a], #12]\n\t"
  129068. "ldr r9, [%[b], #48]\n\t"
  129069. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129070. "lsl r6, r8, #16\n\t"
  129071. "lsl r7, r9, #16\n\t"
  129072. "lsr r6, r6, #16\n\t"
  129073. "lsr r7, r7, #16\n\t"
  129074. "mul r7, r6, r7\n\t"
  129075. "adds r3, r3, r7\n\t"
  129076. "adcs r4, r4, #0\n\t"
  129077. "adc r5, r5, #0\n\t"
  129078. "lsr r7, r9, #16\n\t"
  129079. "mul r6, r7, r6\n\t"
  129080. "lsr r7, r6, #16\n\t"
  129081. "lsl r6, r6, #16\n\t"
  129082. "adds r3, r3, r6\n\t"
  129083. "adcs r4, r4, r7\n\t"
  129084. "adc r5, r5, #0\n\t"
  129085. "lsr r6, r8, #16\n\t"
  129086. "lsr r7, r9, #16\n\t"
  129087. "mul r7, r6, r7\n\t"
  129088. "adds r4, r4, r7\n\t"
  129089. "adc r5, r5, #0\n\t"
  129090. "lsl r7, r9, #16\n\t"
  129091. "lsr r7, r7, #16\n\t"
  129092. "mul r6, r7, r6\n\t"
  129093. "lsr r7, r6, #16\n\t"
  129094. "lsl r6, r6, #16\n\t"
  129095. "adds r3, r3, r6\n\t"
  129096. "adcs r4, r4, r7\n\t"
  129097. "adc r5, r5, #0\n\t"
  129098. #else
  129099. "umull r6, r7, r8, r9\n\t"
  129100. "adds r3, r3, r6\n\t"
  129101. "adcs r4, r4, r7\n\t"
  129102. "adc r5, r5, #0\n\t"
  129103. #endif
  129104. /* A[4] * B[11] */
  129105. "ldr r8, [%[a], #16]\n\t"
  129106. "ldr r9, [%[b], #44]\n\t"
  129107. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129108. "lsl r6, r8, #16\n\t"
  129109. "lsl r7, r9, #16\n\t"
  129110. "lsr r6, r6, #16\n\t"
  129111. "lsr r7, r7, #16\n\t"
  129112. "mul r7, r6, r7\n\t"
  129113. "adds r3, r3, r7\n\t"
  129114. "adcs r4, r4, #0\n\t"
  129115. "adc r5, r5, #0\n\t"
  129116. "lsr r7, r9, #16\n\t"
  129117. "mul r6, r7, r6\n\t"
  129118. "lsr r7, r6, #16\n\t"
  129119. "lsl r6, r6, #16\n\t"
  129120. "adds r3, r3, r6\n\t"
  129121. "adcs r4, r4, r7\n\t"
  129122. "adc r5, r5, #0\n\t"
  129123. "lsr r6, r8, #16\n\t"
  129124. "lsr r7, r9, #16\n\t"
  129125. "mul r7, r6, r7\n\t"
  129126. "adds r4, r4, r7\n\t"
  129127. "adc r5, r5, #0\n\t"
  129128. "lsl r7, r9, #16\n\t"
  129129. "lsr r7, r7, #16\n\t"
  129130. "mul r6, r7, r6\n\t"
  129131. "lsr r7, r6, #16\n\t"
  129132. "lsl r6, r6, #16\n\t"
  129133. "adds r3, r3, r6\n\t"
  129134. "adcs r4, r4, r7\n\t"
  129135. "adc r5, r5, #0\n\t"
  129136. #else
  129137. "umull r6, r7, r8, r9\n\t"
  129138. "adds r3, r3, r6\n\t"
  129139. "adcs r4, r4, r7\n\t"
  129140. "adc r5, r5, #0\n\t"
  129141. #endif
  129142. /* A[5] * B[10] */
  129143. "ldr r8, [%[a], #20]\n\t"
  129144. "ldr r9, [%[b], #40]\n\t"
  129145. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129146. "lsl r6, r8, #16\n\t"
  129147. "lsl r7, r9, #16\n\t"
  129148. "lsr r6, r6, #16\n\t"
  129149. "lsr r7, r7, #16\n\t"
  129150. "mul r7, r6, r7\n\t"
  129151. "adds r3, r3, r7\n\t"
  129152. "adcs r4, r4, #0\n\t"
  129153. "adc r5, r5, #0\n\t"
  129154. "lsr r7, r9, #16\n\t"
  129155. "mul r6, r7, r6\n\t"
  129156. "lsr r7, r6, #16\n\t"
  129157. "lsl r6, r6, #16\n\t"
  129158. "adds r3, r3, r6\n\t"
  129159. "adcs r4, r4, r7\n\t"
  129160. "adc r5, r5, #0\n\t"
  129161. "lsr r6, r8, #16\n\t"
  129162. "lsr r7, r9, #16\n\t"
  129163. "mul r7, r6, r7\n\t"
  129164. "adds r4, r4, r7\n\t"
  129165. "adc r5, r5, #0\n\t"
  129166. "lsl r7, r9, #16\n\t"
  129167. "lsr r7, r7, #16\n\t"
  129168. "mul r6, r7, r6\n\t"
  129169. "lsr r7, r6, #16\n\t"
  129170. "lsl r6, r6, #16\n\t"
  129171. "adds r3, r3, r6\n\t"
  129172. "adcs r4, r4, r7\n\t"
  129173. "adc r5, r5, #0\n\t"
  129174. #else
  129175. "umull r6, r7, r8, r9\n\t"
  129176. "adds r3, r3, r6\n\t"
  129177. "adcs r4, r4, r7\n\t"
  129178. "adc r5, r5, #0\n\t"
  129179. #endif
  129180. /* A[6] * B[9] */
  129181. "ldr r8, [%[a], #24]\n\t"
  129182. "ldr r9, [%[b], #36]\n\t"
  129183. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129184. "lsl r6, r8, #16\n\t"
  129185. "lsl r7, r9, #16\n\t"
  129186. "lsr r6, r6, #16\n\t"
  129187. "lsr r7, r7, #16\n\t"
  129188. "mul r7, r6, r7\n\t"
  129189. "adds r3, r3, r7\n\t"
  129190. "adcs r4, r4, #0\n\t"
  129191. "adc r5, r5, #0\n\t"
  129192. "lsr r7, r9, #16\n\t"
  129193. "mul r6, r7, r6\n\t"
  129194. "lsr r7, r6, #16\n\t"
  129195. "lsl r6, r6, #16\n\t"
  129196. "adds r3, r3, r6\n\t"
  129197. "adcs r4, r4, r7\n\t"
  129198. "adc r5, r5, #0\n\t"
  129199. "lsr r6, r8, #16\n\t"
  129200. "lsr r7, r9, #16\n\t"
  129201. "mul r7, r6, r7\n\t"
  129202. "adds r4, r4, r7\n\t"
  129203. "adc r5, r5, #0\n\t"
  129204. "lsl r7, r9, #16\n\t"
  129205. "lsr r7, r7, #16\n\t"
  129206. "mul r6, r7, r6\n\t"
  129207. "lsr r7, r6, #16\n\t"
  129208. "lsl r6, r6, #16\n\t"
  129209. "adds r3, r3, r6\n\t"
  129210. "adcs r4, r4, r7\n\t"
  129211. "adc r5, r5, #0\n\t"
  129212. #else
  129213. "umull r6, r7, r8, r9\n\t"
  129214. "adds r3, r3, r6\n\t"
  129215. "adcs r4, r4, r7\n\t"
  129216. "adc r5, r5, #0\n\t"
  129217. #endif
  129218. /* A[7] * B[8] */
  129219. "ldr r9, [%[b], #32]\n\t"
  129220. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129221. "lsl r6, r11, #16\n\t"
  129222. "lsl r7, r9, #16\n\t"
  129223. "lsr r6, r6, #16\n\t"
  129224. "lsr r7, r7, #16\n\t"
  129225. "mul r7, r6, r7\n\t"
  129226. "adds r3, r3, r7\n\t"
  129227. "adcs r4, r4, #0\n\t"
  129228. "adc r5, r5, #0\n\t"
  129229. "lsr r7, r9, #16\n\t"
  129230. "mul r6, r7, r6\n\t"
  129231. "lsr r7, r6, #16\n\t"
  129232. "lsl r6, r6, #16\n\t"
  129233. "adds r3, r3, r6\n\t"
  129234. "adcs r4, r4, r7\n\t"
  129235. "adc r5, r5, #0\n\t"
  129236. "lsr r6, r11, #16\n\t"
  129237. "lsr r7, r9, #16\n\t"
  129238. "mul r7, r6, r7\n\t"
  129239. "adds r4, r4, r7\n\t"
  129240. "adc r5, r5, #0\n\t"
  129241. "lsl r7, r9, #16\n\t"
  129242. "lsr r7, r7, #16\n\t"
  129243. "mul r6, r7, r6\n\t"
  129244. "lsr r7, r6, #16\n\t"
  129245. "lsl r6, r6, #16\n\t"
  129246. "adds r3, r3, r6\n\t"
  129247. "adcs r4, r4, r7\n\t"
  129248. "adc r5, r5, #0\n\t"
  129249. #else
  129250. "umull r6, r7, r11, r9\n\t"
  129251. "adds r3, r3, r6\n\t"
  129252. "adcs r4, r4, r7\n\t"
  129253. "adc r5, r5, #0\n\t"
  129254. #endif
  129255. /* A[8] * B[7] */
  129256. "ldr r8, [%[a], #32]\n\t"
  129257. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129258. "lsl r6, r8, #16\n\t"
  129259. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[9] * B[6] */
  129293. "ldr r8, [%[a], #36]\n\t"
  129294. "ldr r9, [%[b], #24]\n\t"
  129295. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129296. "lsl r6, r8, #16\n\t"
  129297. "lsl r7, r9, #16\n\t"
  129298. "lsr r6, r6, #16\n\t"
  129299. "lsr r7, r7, #16\n\t"
  129300. "mul r7, r6, r7\n\t"
  129301. "adds r3, r3, r7\n\t"
  129302. "adcs r4, r4, #0\n\t"
  129303. "adc r5, r5, #0\n\t"
  129304. "lsr r7, r9, #16\n\t"
  129305. "mul r6, r7, r6\n\t"
  129306. "lsr r7, r6, #16\n\t"
  129307. "lsl r6, r6, #16\n\t"
  129308. "adds r3, r3, r6\n\t"
  129309. "adcs r4, r4, r7\n\t"
  129310. "adc r5, r5, #0\n\t"
  129311. "lsr r6, r8, #16\n\t"
  129312. "lsr r7, r9, #16\n\t"
  129313. "mul r7, r6, r7\n\t"
  129314. "adds r4, r4, r7\n\t"
  129315. "adc r5, r5, #0\n\t"
  129316. "lsl r7, r9, #16\n\t"
  129317. "lsr r7, r7, #16\n\t"
  129318. "mul r6, r7, r6\n\t"
  129319. "lsr r7, r6, #16\n\t"
  129320. "lsl r6, r6, #16\n\t"
  129321. "adds r3, r3, r6\n\t"
  129322. "adcs r4, r4, r7\n\t"
  129323. "adc r5, r5, #0\n\t"
  129324. #else
  129325. "umull r6, r7, r8, r9\n\t"
  129326. "adds r3, r3, r6\n\t"
  129327. "adcs r4, r4, r7\n\t"
  129328. "adc r5, r5, #0\n\t"
  129329. #endif
  129330. /* A[10] * B[5] */
  129331. "ldr r8, [%[a], #40]\n\t"
  129332. "ldr r9, [%[b], #20]\n\t"
  129333. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129334. "lsl r6, r8, #16\n\t"
  129335. "lsl r7, r9, #16\n\t"
  129336. "lsr r6, r6, #16\n\t"
  129337. "lsr r7, r7, #16\n\t"
  129338. "mul r7, r6, r7\n\t"
  129339. "adds r3, r3, r7\n\t"
  129340. "adcs r4, r4, #0\n\t"
  129341. "adc r5, r5, #0\n\t"
  129342. "lsr r7, r9, #16\n\t"
  129343. "mul r6, r7, r6\n\t"
  129344. "lsr r7, r6, #16\n\t"
  129345. "lsl r6, r6, #16\n\t"
  129346. "adds r3, r3, r6\n\t"
  129347. "adcs r4, r4, r7\n\t"
  129348. "adc r5, r5, #0\n\t"
  129349. "lsr r6, r8, #16\n\t"
  129350. "lsr r7, r9, #16\n\t"
  129351. "mul r7, r6, r7\n\t"
  129352. "adds r4, r4, r7\n\t"
  129353. "adc r5, r5, #0\n\t"
  129354. "lsl r7, r9, #16\n\t"
  129355. "lsr r7, r7, #16\n\t"
  129356. "mul r6, r7, r6\n\t"
  129357. "lsr r7, r6, #16\n\t"
  129358. "lsl r6, r6, #16\n\t"
  129359. "adds r3, r3, r6\n\t"
  129360. "adcs r4, r4, r7\n\t"
  129361. "adc r5, r5, #0\n\t"
  129362. #else
  129363. "umull r6, r7, r8, r9\n\t"
  129364. "adds r3, r3, r6\n\t"
  129365. "adcs r4, r4, r7\n\t"
  129366. "adc r5, r5, #0\n\t"
  129367. #endif
  129368. /* A[11] * B[4] */
  129369. "ldr r8, [%[a], #44]\n\t"
  129370. "ldr r9, [%[b], #16]\n\t"
  129371. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129372. "lsl r6, r8, #16\n\t"
  129373. "lsl r7, r9, #16\n\t"
  129374. "lsr r6, r6, #16\n\t"
  129375. "lsr r7, r7, #16\n\t"
  129376. "mul r7, r6, r7\n\t"
  129377. "adds r3, r3, r7\n\t"
  129378. "adcs r4, r4, #0\n\t"
  129379. "adc r5, r5, #0\n\t"
  129380. "lsr r7, r9, #16\n\t"
  129381. "mul r6, r7, r6\n\t"
  129382. "lsr r7, r6, #16\n\t"
  129383. "lsl r6, r6, #16\n\t"
  129384. "adds r3, r3, r6\n\t"
  129385. "adcs r4, r4, r7\n\t"
  129386. "adc r5, r5, #0\n\t"
  129387. "lsr r6, r8, #16\n\t"
  129388. "lsr r7, r9, #16\n\t"
  129389. "mul r7, r6, r7\n\t"
  129390. "adds r4, r4, r7\n\t"
  129391. "adc r5, r5, #0\n\t"
  129392. "lsl r7, r9, #16\n\t"
  129393. "lsr r7, r7, #16\n\t"
  129394. "mul r6, r7, r6\n\t"
  129395. "lsr r7, r6, #16\n\t"
  129396. "lsl r6, r6, #16\n\t"
  129397. "adds r3, r3, r6\n\t"
  129398. "adcs r4, r4, r7\n\t"
  129399. "adc r5, r5, #0\n\t"
  129400. #else
  129401. "umull r6, r7, r8, r9\n\t"
  129402. "adds r3, r3, r6\n\t"
  129403. "adcs r4, r4, r7\n\t"
  129404. "adc r5, r5, #0\n\t"
  129405. #endif
  129406. /* A[12] * B[3] */
  129407. "ldr r8, [%[a], #48]\n\t"
  129408. "ldr r9, [%[b], #12]\n\t"
  129409. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129410. "lsl r6, r8, #16\n\t"
  129411. "lsl r7, r9, #16\n\t"
  129412. "lsr r6, r6, #16\n\t"
  129413. "lsr r7, r7, #16\n\t"
  129414. "mul r7, r6, r7\n\t"
  129415. "adds r3, r3, r7\n\t"
  129416. "adcs r4, r4, #0\n\t"
  129417. "adc r5, r5, #0\n\t"
  129418. "lsr r7, r9, #16\n\t"
  129419. "mul r6, r7, r6\n\t"
  129420. "lsr r7, r6, #16\n\t"
  129421. "lsl r6, r6, #16\n\t"
  129422. "adds r3, r3, r6\n\t"
  129423. "adcs r4, r4, r7\n\t"
  129424. "adc r5, r5, #0\n\t"
  129425. "lsr r6, r8, #16\n\t"
  129426. "lsr r7, r9, #16\n\t"
  129427. "mul r7, r6, r7\n\t"
  129428. "adds r4, r4, r7\n\t"
  129429. "adc r5, r5, #0\n\t"
  129430. "lsl r7, r9, #16\n\t"
  129431. "lsr r7, r7, #16\n\t"
  129432. "mul r6, r7, r6\n\t"
  129433. "lsr r7, r6, #16\n\t"
  129434. "lsl r6, r6, #16\n\t"
  129435. "adds r3, r3, r6\n\t"
  129436. "adcs r4, r4, r7\n\t"
  129437. "adc r5, r5, #0\n\t"
  129438. #else
  129439. "umull r6, r7, r8, r9\n\t"
  129440. "adds r3, r3, r6\n\t"
  129441. "adcs r4, r4, r7\n\t"
  129442. "adc r5, r5, #0\n\t"
  129443. #endif
  129444. /* A[13] * B[2] */
  129445. "ldr r8, [%[a], #52]\n\t"
  129446. "ldr r9, [%[b], #8]\n\t"
  129447. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129448. "lsl r6, r8, #16\n\t"
  129449. "lsl r7, r9, #16\n\t"
  129450. "lsr r6, r6, #16\n\t"
  129451. "lsr r7, r7, #16\n\t"
  129452. "mul r7, r6, r7\n\t"
  129453. "adds r3, r3, r7\n\t"
  129454. "adcs r4, r4, #0\n\t"
  129455. "adc r5, r5, #0\n\t"
  129456. "lsr r7, r9, #16\n\t"
  129457. "mul r6, r7, r6\n\t"
  129458. "lsr r7, r6, #16\n\t"
  129459. "lsl r6, r6, #16\n\t"
  129460. "adds r3, r3, r6\n\t"
  129461. "adcs r4, r4, r7\n\t"
  129462. "adc r5, r5, #0\n\t"
  129463. "lsr r6, r8, #16\n\t"
  129464. "lsr r7, r9, #16\n\t"
  129465. "mul r7, r6, r7\n\t"
  129466. "adds r4, r4, r7\n\t"
  129467. "adc r5, r5, #0\n\t"
  129468. "lsl r7, r9, #16\n\t"
  129469. "lsr r7, r7, #16\n\t"
  129470. "mul r6, r7, r6\n\t"
  129471. "lsr r7, r6, #16\n\t"
  129472. "lsl r6, r6, #16\n\t"
  129473. "adds r3, r3, r6\n\t"
  129474. "adcs r4, r4, r7\n\t"
  129475. "adc r5, r5, #0\n\t"
  129476. #else
  129477. "umull r6, r7, r8, r9\n\t"
  129478. "adds r3, r3, r6\n\t"
  129479. "adcs r4, r4, r7\n\t"
  129480. "adc r5, r5, #0\n\t"
  129481. #endif
  129482. /* A[14] * B[1] */
  129483. "ldr r8, [%[a], #56]\n\t"
  129484. "ldr r9, [%[b], #4]\n\t"
  129485. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129486. "lsl r6, r8, #16\n\t"
  129487. "lsl r7, r9, #16\n\t"
  129488. "lsr r6, r6, #16\n\t"
  129489. "lsr r7, r7, #16\n\t"
  129490. "mul r7, r6, r7\n\t"
  129491. "adds r3, r3, r7\n\t"
  129492. "adcs r4, r4, #0\n\t"
  129493. "adc r5, r5, #0\n\t"
  129494. "lsr r7, r9, #16\n\t"
  129495. "mul r6, r7, r6\n\t"
  129496. "lsr r7, r6, #16\n\t"
  129497. "lsl r6, r6, #16\n\t"
  129498. "adds r3, r3, r6\n\t"
  129499. "adcs r4, r4, r7\n\t"
  129500. "adc r5, r5, #0\n\t"
  129501. "lsr r6, r8, #16\n\t"
  129502. "lsr r7, r9, #16\n\t"
  129503. "mul r7, r6, r7\n\t"
  129504. "adds r4, r4, r7\n\t"
  129505. "adc r5, r5, #0\n\t"
  129506. "lsl r7, r9, #16\n\t"
  129507. "lsr r7, r7, #16\n\t"
  129508. "mul r6, r7, r6\n\t"
  129509. "lsr r7, r6, #16\n\t"
  129510. "lsl r6, r6, #16\n\t"
  129511. "adds r3, r3, r6\n\t"
  129512. "adcs r4, r4, r7\n\t"
  129513. "adc r5, r5, #0\n\t"
  129514. #else
  129515. "umull r6, r7, r8, r9\n\t"
  129516. "adds r3, r3, r6\n\t"
  129517. "adcs r4, r4, r7\n\t"
  129518. "adc r5, r5, #0\n\t"
  129519. #endif
  129520. /* A[15] * B[0] */
  129521. "ldr r8, [%[a], #60]\n\t"
  129522. "ldr r9, [%[b]]\n\t"
  129523. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129524. "lsl r6, r8, #16\n\t"
  129525. "lsl r7, r9, #16\n\t"
  129526. "lsr r6, r6, #16\n\t"
  129527. "lsr r7, r7, #16\n\t"
  129528. "mul r7, r6, r7\n\t"
  129529. "adds r3, r3, r7\n\t"
  129530. "adcs r4, r4, #0\n\t"
  129531. "adc r5, r5, #0\n\t"
  129532. "lsr r7, r9, #16\n\t"
  129533. "mul r6, r7, r6\n\t"
  129534. "lsr r7, r6, #16\n\t"
  129535. "lsl r6, r6, #16\n\t"
  129536. "adds r3, r3, r6\n\t"
  129537. "adcs r4, r4, r7\n\t"
  129538. "adc r5, r5, #0\n\t"
  129539. "lsr r6, r8, #16\n\t"
  129540. "lsr r7, r9, #16\n\t"
  129541. "mul r7, r6, r7\n\t"
  129542. "adds r4, r4, r7\n\t"
  129543. "adc r5, r5, #0\n\t"
  129544. "lsl r7, r9, #16\n\t"
  129545. "lsr r7, r7, #16\n\t"
  129546. "mul r6, r7, r6\n\t"
  129547. "lsr r7, r6, #16\n\t"
  129548. "lsl r6, r6, #16\n\t"
  129549. "adds r3, r3, r6\n\t"
  129550. "adcs r4, r4, r7\n\t"
  129551. "adc r5, r5, #0\n\t"
  129552. #else
  129553. "umull r6, r7, r8, r9\n\t"
  129554. "adds r3, r3, r6\n\t"
  129555. "adcs r4, r4, r7\n\t"
  129556. "adc r5, r5, #0\n\t"
  129557. #endif
  129558. "str r3, [sp, #60]\n\t"
  129559. /* A[15] * B[1] */
  129560. "ldr r9, [%[b], #4]\n\t"
  129561. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129562. "lsl r6, r8, #16\n\t"
  129563. "lsl r7, r9, #16\n\t"
  129564. "lsr r6, r6, #16\n\t"
  129565. "lsr r7, r7, #16\n\t"
  129566. "mul r7, r6, r7\n\t"
  129567. "adds r4, r4, r7\n\t"
  129568. "adcs r5, r5, #0\n\t"
  129569. "mov r3, #0\n\t"
  129570. "adc r3, r3, #0\n\t"
  129571. "lsr r7, r9, #16\n\t"
  129572. "mul r6, r7, r6\n\t"
  129573. "lsr r7, r6, #16\n\t"
  129574. "lsl r6, r6, #16\n\t"
  129575. "adds r4, r4, r6\n\t"
  129576. "adcs r5, r5, r7\n\t"
  129577. "adc r3, r3, #0\n\t"
  129578. "lsr r6, r8, #16\n\t"
  129579. "lsr r7, r9, #16\n\t"
  129580. "mul r7, r6, r7\n\t"
  129581. "adds r5, r5, r7\n\t"
  129582. "adc r3, r3, #0\n\t"
  129583. "lsl r7, r9, #16\n\t"
  129584. "lsr r7, r7, #16\n\t"
  129585. "mul r6, r7, r6\n\t"
  129586. "lsr r7, r6, #16\n\t"
  129587. "lsl r6, r6, #16\n\t"
  129588. "adds r4, r4, r6\n\t"
  129589. "adcs r5, r5, r7\n\t"
  129590. "adc r3, r3, #0\n\t"
  129591. #else
  129592. "umull r6, r7, r8, r9\n\t"
  129593. "adds r4, r4, r6\n\t"
  129594. "adcs r5, r5, r7\n\t"
  129595. "mov r3, #0\n\t"
  129596. "adc r3, r3, #0\n\t"
  129597. #endif
  129598. /* A[14] * B[2] */
  129599. "ldr r8, [%[a], #56]\n\t"
  129600. "ldr r9, [%[b], #8]\n\t"
  129601. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129602. "lsl r6, r8, #16\n\t"
  129603. "lsl r7, r9, #16\n\t"
  129604. "lsr r6, r6, #16\n\t"
  129605. "lsr r7, r7, #16\n\t"
  129606. "mul r7, r6, r7\n\t"
  129607. "adds r4, r4, r7\n\t"
  129608. "adcs r5, r5, #0\n\t"
  129609. "adc r3, r3, #0\n\t"
  129610. "lsr r7, r9, #16\n\t"
  129611. "mul r6, r7, r6\n\t"
  129612. "lsr r7, r6, #16\n\t"
  129613. "lsl r6, r6, #16\n\t"
  129614. "adds r4, r4, r6\n\t"
  129615. "adcs r5, r5, r7\n\t"
  129616. "adc r3, r3, #0\n\t"
  129617. "lsr r6, r8, #16\n\t"
  129618. "lsr r7, r9, #16\n\t"
  129619. "mul r7, r6, r7\n\t"
  129620. "adds r5, r5, r7\n\t"
  129621. "adc r3, r3, #0\n\t"
  129622. "lsl r7, r9, #16\n\t"
  129623. "lsr r7, r7, #16\n\t"
  129624. "mul r6, r7, r6\n\t"
  129625. "lsr r7, r6, #16\n\t"
  129626. "lsl r6, r6, #16\n\t"
  129627. "adds r4, r4, r6\n\t"
  129628. "adcs r5, r5, r7\n\t"
  129629. "adc r3, r3, #0\n\t"
  129630. #else
  129631. "umull r6, r7, r8, r9\n\t"
  129632. "adds r4, r4, r6\n\t"
  129633. "adcs r5, r5, r7\n\t"
  129634. "adc r3, r3, #0\n\t"
  129635. #endif
  129636. /* A[13] * B[3] */
  129637. "ldr r8, [%[a], #52]\n\t"
  129638. "ldr r9, [%[b], #12]\n\t"
  129639. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129640. "lsl r6, r8, #16\n\t"
  129641. "lsl r7, r9, #16\n\t"
  129642. "lsr r6, r6, #16\n\t"
  129643. "lsr r7, r7, #16\n\t"
  129644. "mul r7, r6, r7\n\t"
  129645. "adds r4, r4, r7\n\t"
  129646. "adcs r5, r5, #0\n\t"
  129647. "adc r3, r3, #0\n\t"
  129648. "lsr r7, r9, #16\n\t"
  129649. "mul r6, r7, r6\n\t"
  129650. "lsr r7, r6, #16\n\t"
  129651. "lsl r6, r6, #16\n\t"
  129652. "adds r4, r4, r6\n\t"
  129653. "adcs r5, r5, r7\n\t"
  129654. "adc r3, r3, #0\n\t"
  129655. "lsr r6, r8, #16\n\t"
  129656. "lsr r7, r9, #16\n\t"
  129657. "mul r7, r6, r7\n\t"
  129658. "adds r5, r5, r7\n\t"
  129659. "adc r3, r3, #0\n\t"
  129660. "lsl r7, r9, #16\n\t"
  129661. "lsr r7, r7, #16\n\t"
  129662. "mul r6, r7, r6\n\t"
  129663. "lsr r7, r6, #16\n\t"
  129664. "lsl r6, r6, #16\n\t"
  129665. "adds r4, r4, r6\n\t"
  129666. "adcs r5, r5, r7\n\t"
  129667. "adc r3, r3, #0\n\t"
  129668. #else
  129669. "umull r6, r7, r8, r9\n\t"
  129670. "adds r4, r4, r6\n\t"
  129671. "adcs r5, r5, r7\n\t"
  129672. "adc r3, r3, #0\n\t"
  129673. #endif
  129674. /* A[12] * B[4] */
  129675. "ldr r8, [%[a], #48]\n\t"
  129676. "ldr r9, [%[b], #16]\n\t"
  129677. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129678. "lsl r6, r8, #16\n\t"
  129679. "lsl r7, r9, #16\n\t"
  129680. "lsr r6, r6, #16\n\t"
  129681. "lsr r7, r7, #16\n\t"
  129682. "mul r7, r6, r7\n\t"
  129683. "adds r4, r4, r7\n\t"
  129684. "adcs r5, r5, #0\n\t"
  129685. "adc r3, r3, #0\n\t"
  129686. "lsr r7, r9, #16\n\t"
  129687. "mul r6, r7, r6\n\t"
  129688. "lsr r7, r6, #16\n\t"
  129689. "lsl r6, r6, #16\n\t"
  129690. "adds r4, r4, r6\n\t"
  129691. "adcs r5, r5, r7\n\t"
  129692. "adc r3, r3, #0\n\t"
  129693. "lsr r6, r8, #16\n\t"
  129694. "lsr r7, r9, #16\n\t"
  129695. "mul r7, r6, r7\n\t"
  129696. "adds r5, r5, r7\n\t"
  129697. "adc r3, r3, #0\n\t"
  129698. "lsl r7, r9, #16\n\t"
  129699. "lsr r7, r7, #16\n\t"
  129700. "mul r6, r7, r6\n\t"
  129701. "lsr r7, r6, #16\n\t"
  129702. "lsl r6, r6, #16\n\t"
  129703. "adds r4, r4, r6\n\t"
  129704. "adcs r5, r5, r7\n\t"
  129705. "adc r3, r3, #0\n\t"
  129706. #else
  129707. "umull r6, r7, r8, r9\n\t"
  129708. "adds r4, r4, r6\n\t"
  129709. "adcs r5, r5, r7\n\t"
  129710. "adc r3, r3, #0\n\t"
  129711. #endif
  129712. /* A[11] * B[5] */
  129713. "ldr r8, [%[a], #44]\n\t"
  129714. "ldr r9, [%[b], #20]\n\t"
  129715. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129716. "lsl r6, r8, #16\n\t"
  129717. "lsl r7, r9, #16\n\t"
  129718. "lsr r6, r6, #16\n\t"
  129719. "lsr r7, r7, #16\n\t"
  129720. "mul r7, r6, r7\n\t"
  129721. "adds r4, r4, r7\n\t"
  129722. "adcs r5, r5, #0\n\t"
  129723. "adc r3, r3, #0\n\t"
  129724. "lsr r7, r9, #16\n\t"
  129725. "mul r6, r7, r6\n\t"
  129726. "lsr r7, r6, #16\n\t"
  129727. "lsl r6, r6, #16\n\t"
  129728. "adds r4, r4, r6\n\t"
  129729. "adcs r5, r5, r7\n\t"
  129730. "adc r3, r3, #0\n\t"
  129731. "lsr r6, r8, #16\n\t"
  129732. "lsr r7, r9, #16\n\t"
  129733. "mul r7, r6, r7\n\t"
  129734. "adds r5, r5, r7\n\t"
  129735. "adc r3, r3, #0\n\t"
  129736. "lsl r7, r9, #16\n\t"
  129737. "lsr r7, r7, #16\n\t"
  129738. "mul r6, r7, r6\n\t"
  129739. "lsr r7, r6, #16\n\t"
  129740. "lsl r6, r6, #16\n\t"
  129741. "adds r4, r4, r6\n\t"
  129742. "adcs r5, r5, r7\n\t"
  129743. "adc r3, r3, #0\n\t"
  129744. #else
  129745. "umull r6, r7, r8, r9\n\t"
  129746. "adds r4, r4, r6\n\t"
  129747. "adcs r5, r5, r7\n\t"
  129748. "adc r3, r3, #0\n\t"
  129749. #endif
  129750. /* A[10] * B[6] */
  129751. "ldr r8, [%[a], #40]\n\t"
  129752. "ldr r9, [%[b], #24]\n\t"
  129753. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129754. "lsl r6, r8, #16\n\t"
  129755. "lsl r7, r9, #16\n\t"
  129756. "lsr r6, r6, #16\n\t"
  129757. "lsr r7, r7, #16\n\t"
  129758. "mul r7, r6, r7\n\t"
  129759. "adds r4, r4, r7\n\t"
  129760. "adcs r5, r5, #0\n\t"
  129761. "adc r3, r3, #0\n\t"
  129762. "lsr r7, r9, #16\n\t"
  129763. "mul r6, r7, r6\n\t"
  129764. "lsr r7, r6, #16\n\t"
  129765. "lsl r6, r6, #16\n\t"
  129766. "adds r4, r4, r6\n\t"
  129767. "adcs r5, r5, r7\n\t"
  129768. "adc r3, r3, #0\n\t"
  129769. "lsr r6, r8, #16\n\t"
  129770. "lsr r7, r9, #16\n\t"
  129771. "mul r7, r6, r7\n\t"
  129772. "adds r5, r5, r7\n\t"
  129773. "adc r3, r3, #0\n\t"
  129774. "lsl r7, r9, #16\n\t"
  129775. "lsr r7, r7, #16\n\t"
  129776. "mul r6, r7, r6\n\t"
  129777. "lsr r7, r6, #16\n\t"
  129778. "lsl r6, r6, #16\n\t"
  129779. "adds r4, r4, r6\n\t"
  129780. "adcs r5, r5, r7\n\t"
  129781. "adc r3, r3, #0\n\t"
  129782. #else
  129783. "umull r6, r7, r8, r9\n\t"
  129784. "adds r4, r4, r6\n\t"
  129785. "adcs r5, r5, r7\n\t"
  129786. "adc r3, r3, #0\n\t"
  129787. #endif
  129788. /* A[9] * B[7] */
  129789. "ldr r8, [%[a], #36]\n\t"
  129790. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129791. "lsl r6, r8, #16\n\t"
  129792. "lsl r7, r12, #16\n\t"
  129793. "lsr r6, r6, #16\n\t"
  129794. "lsr r7, r7, #16\n\t"
  129795. "mul r7, r6, r7\n\t"
  129796. "adds r4, r4, r7\n\t"
  129797. "adcs r5, r5, #0\n\t"
  129798. "adc r3, r3, #0\n\t"
  129799. "lsr r7, r12, #16\n\t"
  129800. "mul r6, r7, r6\n\t"
  129801. "lsr r7, r6, #16\n\t"
  129802. "lsl r6, r6, #16\n\t"
  129803. "adds r4, r4, r6\n\t"
  129804. "adcs r5, r5, r7\n\t"
  129805. "adc r3, r3, #0\n\t"
  129806. "lsr r6, r8, #16\n\t"
  129807. "lsr r7, r12, #16\n\t"
  129808. "mul r7, r6, r7\n\t"
  129809. "adds r5, r5, r7\n\t"
  129810. "adc r3, r3, #0\n\t"
  129811. "lsl r7, r12, #16\n\t"
  129812. "lsr r7, r7, #16\n\t"
  129813. "mul r6, r7, r6\n\t"
  129814. "lsr r7, r6, #16\n\t"
  129815. "lsl r6, r6, #16\n\t"
  129816. "adds r4, r4, r6\n\t"
  129817. "adcs r5, r5, r7\n\t"
  129818. "adc r3, r3, #0\n\t"
  129819. #else
  129820. "umull r6, r7, r8, r12\n\t"
  129821. "adds r4, r4, r6\n\t"
  129822. "adcs r5, r5, r7\n\t"
  129823. "adc r3, r3, #0\n\t"
  129824. #endif
  129825. /* A[8] * B[8] */
  129826. "ldr r11, [%[a], #32]\n\t"
  129827. "ldr r12, [%[b], #32]\n\t"
  129828. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129829. "lsl r6, r11, #16\n\t"
  129830. "lsl r7, r12, #16\n\t"
  129831. "lsr r6, r6, #16\n\t"
  129832. "lsr r7, r7, #16\n\t"
  129833. "mul r7, r6, r7\n\t"
  129834. "adds r4, r4, r7\n\t"
  129835. "adcs r5, r5, #0\n\t"
  129836. "adc r3, r3, #0\n\t"
  129837. "lsr r7, r12, #16\n\t"
  129838. "mul r6, r7, r6\n\t"
  129839. "lsr r7, r6, #16\n\t"
  129840. "lsl r6, r6, #16\n\t"
  129841. "adds r4, r4, r6\n\t"
  129842. "adcs r5, r5, r7\n\t"
  129843. "adc r3, r3, #0\n\t"
  129844. "lsr r6, r11, #16\n\t"
  129845. "lsr r7, r12, #16\n\t"
  129846. "mul r7, r6, r7\n\t"
  129847. "adds r5, r5, r7\n\t"
  129848. "adc r3, r3, #0\n\t"
  129849. "lsl r7, r12, #16\n\t"
  129850. "lsr r7, r7, #16\n\t"
  129851. "mul r6, r7, r6\n\t"
  129852. "lsr r7, r6, #16\n\t"
  129853. "lsl r6, r6, #16\n\t"
  129854. "adds r4, r4, r6\n\t"
  129855. "adcs r5, r5, r7\n\t"
  129856. "adc r3, r3, #0\n\t"
  129857. #else
  129858. "umull r6, r7, r11, r12\n\t"
  129859. "adds r4, r4, r6\n\t"
  129860. "adcs r5, r5, r7\n\t"
  129861. "adc r3, r3, #0\n\t"
  129862. #endif
  129863. /* A[7] * B[9] */
  129864. "ldr r8, [%[a], #28]\n\t"
  129865. "ldr r9, [%[b], #36]\n\t"
  129866. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129867. "lsl r6, r8, #16\n\t"
  129868. "lsl r7, r9, #16\n\t"
  129869. "lsr r6, r6, #16\n\t"
  129870. "lsr r7, r7, #16\n\t"
  129871. "mul r7, r6, r7\n\t"
  129872. "adds r4, r4, r7\n\t"
  129873. "adcs r5, r5, #0\n\t"
  129874. "adc r3, r3, #0\n\t"
  129875. "lsr r7, r9, #16\n\t"
  129876. "mul r6, r7, r6\n\t"
  129877. "lsr r7, r6, #16\n\t"
  129878. "lsl r6, r6, #16\n\t"
  129879. "adds r4, r4, r6\n\t"
  129880. "adcs r5, r5, r7\n\t"
  129881. "adc r3, r3, #0\n\t"
  129882. "lsr r6, r8, #16\n\t"
  129883. "lsr r7, r9, #16\n\t"
  129884. "mul r7, r6, r7\n\t"
  129885. "adds r5, r5, r7\n\t"
  129886. "adc r3, r3, #0\n\t"
  129887. "lsl r7, r9, #16\n\t"
  129888. "lsr r7, r7, #16\n\t"
  129889. "mul r6, r7, r6\n\t"
  129890. "lsr r7, r6, #16\n\t"
  129891. "lsl r6, r6, #16\n\t"
  129892. "adds r4, r4, r6\n\t"
  129893. "adcs r5, r5, r7\n\t"
  129894. "adc r3, r3, #0\n\t"
  129895. #else
  129896. "umull r6, r7, r8, r9\n\t"
  129897. "adds r4, r4, r6\n\t"
  129898. "adcs r5, r5, r7\n\t"
  129899. "adc r3, r3, #0\n\t"
  129900. #endif
  129901. /* A[6] * B[10] */
  129902. "ldr r8, [%[a], #24]\n\t"
  129903. "ldr r9, [%[b], #40]\n\t"
  129904. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129905. "lsl r6, r8, #16\n\t"
  129906. "lsl r7, r9, #16\n\t"
  129907. "lsr r6, r6, #16\n\t"
  129908. "lsr r7, r7, #16\n\t"
  129909. "mul r7, r6, r7\n\t"
  129910. "adds r4, r4, r7\n\t"
  129911. "adcs r5, r5, #0\n\t"
  129912. "adc r3, r3, #0\n\t"
  129913. "lsr r7, r9, #16\n\t"
  129914. "mul r6, r7, r6\n\t"
  129915. "lsr r7, r6, #16\n\t"
  129916. "lsl r6, r6, #16\n\t"
  129917. "adds r4, r4, r6\n\t"
  129918. "adcs r5, r5, r7\n\t"
  129919. "adc r3, r3, #0\n\t"
  129920. "lsr r6, r8, #16\n\t"
  129921. "lsr r7, r9, #16\n\t"
  129922. "mul r7, r6, r7\n\t"
  129923. "adds r5, r5, r7\n\t"
  129924. "adc r3, r3, #0\n\t"
  129925. "lsl r7, r9, #16\n\t"
  129926. "lsr r7, r7, #16\n\t"
  129927. "mul r6, r7, r6\n\t"
  129928. "lsr r7, r6, #16\n\t"
  129929. "lsl r6, r6, #16\n\t"
  129930. "adds r4, r4, r6\n\t"
  129931. "adcs r5, r5, r7\n\t"
  129932. "adc r3, r3, #0\n\t"
  129933. #else
  129934. "umull r6, r7, r8, r9\n\t"
  129935. "adds r4, r4, r6\n\t"
  129936. "adcs r5, r5, r7\n\t"
  129937. "adc r3, r3, #0\n\t"
  129938. #endif
  129939. /* A[5] * B[11] */
  129940. "ldr r8, [%[a], #20]\n\t"
  129941. "ldr r9, [%[b], #44]\n\t"
  129942. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129943. "lsl r6, r8, #16\n\t"
  129944. "lsl r7, r9, #16\n\t"
  129945. "lsr r6, r6, #16\n\t"
  129946. "lsr r7, r7, #16\n\t"
  129947. "mul r7, r6, r7\n\t"
  129948. "adds r4, r4, r7\n\t"
  129949. "adcs r5, r5, #0\n\t"
  129950. "adc r3, r3, #0\n\t"
  129951. "lsr r7, r9, #16\n\t"
  129952. "mul r6, r7, r6\n\t"
  129953. "lsr r7, r6, #16\n\t"
  129954. "lsl r6, r6, #16\n\t"
  129955. "adds r4, r4, r6\n\t"
  129956. "adcs r5, r5, r7\n\t"
  129957. "adc r3, r3, #0\n\t"
  129958. "lsr r6, r8, #16\n\t"
  129959. "lsr r7, r9, #16\n\t"
  129960. "mul r7, r6, r7\n\t"
  129961. "adds r5, r5, r7\n\t"
  129962. "adc r3, r3, #0\n\t"
  129963. "lsl r7, r9, #16\n\t"
  129964. "lsr r7, r7, #16\n\t"
  129965. "mul r6, r7, r6\n\t"
  129966. "lsr r7, r6, #16\n\t"
  129967. "lsl r6, r6, #16\n\t"
  129968. "adds r4, r4, r6\n\t"
  129969. "adcs r5, r5, r7\n\t"
  129970. "adc r3, r3, #0\n\t"
  129971. #else
  129972. "umull r6, r7, r8, r9\n\t"
  129973. "adds r4, r4, r6\n\t"
  129974. "adcs r5, r5, r7\n\t"
  129975. "adc r3, r3, #0\n\t"
  129976. #endif
  129977. /* A[4] * B[12] */
  129978. "ldr r8, [%[a], #16]\n\t"
  129979. "ldr r9, [%[b], #48]\n\t"
  129980. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  129981. "lsl r6, r8, #16\n\t"
  129982. "lsl r7, r9, #16\n\t"
  129983. "lsr r6, r6, #16\n\t"
  129984. "lsr r7, r7, #16\n\t"
  129985. "mul r7, r6, r7\n\t"
  129986. "adds r4, r4, r7\n\t"
  129987. "adcs r5, r5, #0\n\t"
  129988. "adc r3, r3, #0\n\t"
  129989. "lsr r7, r9, #16\n\t"
  129990. "mul r6, r7, r6\n\t"
  129991. "lsr r7, r6, #16\n\t"
  129992. "lsl r6, r6, #16\n\t"
  129993. "adds r4, r4, r6\n\t"
  129994. "adcs r5, r5, r7\n\t"
  129995. "adc r3, r3, #0\n\t"
  129996. "lsr r6, r8, #16\n\t"
  129997. "lsr r7, r9, #16\n\t"
  129998. "mul r7, r6, r7\n\t"
  129999. "adds r5, r5, r7\n\t"
  130000. "adc r3, r3, #0\n\t"
  130001. "lsl r7, r9, #16\n\t"
  130002. "lsr r7, r7, #16\n\t"
  130003. "mul r6, r7, r6\n\t"
  130004. "lsr r7, r6, #16\n\t"
  130005. "lsl r6, r6, #16\n\t"
  130006. "adds r4, r4, r6\n\t"
  130007. "adcs r5, r5, r7\n\t"
  130008. "adc r3, r3, #0\n\t"
  130009. #else
  130010. "umull r6, r7, r8, r9\n\t"
  130011. "adds r4, r4, r6\n\t"
  130012. "adcs r5, r5, r7\n\t"
  130013. "adc r3, r3, #0\n\t"
  130014. #endif
  130015. /* A[3] * B[13] */
  130016. "ldr r8, [%[a], #12]\n\t"
  130017. "ldr r9, [%[b], #52]\n\t"
  130018. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130019. "lsl r6, r8, #16\n\t"
  130020. "lsl r7, r9, #16\n\t"
  130021. "lsr r6, r6, #16\n\t"
  130022. "lsr r7, r7, #16\n\t"
  130023. "mul r7, r6, r7\n\t"
  130024. "adds r4, r4, r7\n\t"
  130025. "adcs r5, r5, #0\n\t"
  130026. "adc r3, r3, #0\n\t"
  130027. "lsr r7, r9, #16\n\t"
  130028. "mul r6, r7, r6\n\t"
  130029. "lsr r7, r6, #16\n\t"
  130030. "lsl r6, r6, #16\n\t"
  130031. "adds r4, r4, r6\n\t"
  130032. "adcs r5, r5, r7\n\t"
  130033. "adc r3, r3, #0\n\t"
  130034. "lsr r6, r8, #16\n\t"
  130035. "lsr r7, r9, #16\n\t"
  130036. "mul r7, r6, r7\n\t"
  130037. "adds r5, r5, r7\n\t"
  130038. "adc r3, r3, #0\n\t"
  130039. "lsl r7, r9, #16\n\t"
  130040. "lsr r7, r7, #16\n\t"
  130041. "mul r6, r7, r6\n\t"
  130042. "lsr r7, r6, #16\n\t"
  130043. "lsl r6, r6, #16\n\t"
  130044. "adds r4, r4, r6\n\t"
  130045. "adcs r5, r5, r7\n\t"
  130046. "adc r3, r3, #0\n\t"
  130047. #else
  130048. "umull r6, r7, r8, r9\n\t"
  130049. "adds r4, r4, r6\n\t"
  130050. "adcs r5, r5, r7\n\t"
  130051. "adc r3, r3, #0\n\t"
  130052. #endif
  130053. /* A[2] * B[14] */
  130054. "ldr r8, [%[a], #8]\n\t"
  130055. "ldr r9, [%[b], #56]\n\t"
  130056. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130057. "lsl r6, r8, #16\n\t"
  130058. "lsl r7, r9, #16\n\t"
  130059. "lsr r6, r6, #16\n\t"
  130060. "lsr r7, r7, #16\n\t"
  130061. "mul r7, r6, r7\n\t"
  130062. "adds r4, r4, r7\n\t"
  130063. "adcs r5, r5, #0\n\t"
  130064. "adc r3, r3, #0\n\t"
  130065. "lsr r7, r9, #16\n\t"
  130066. "mul r6, r7, r6\n\t"
  130067. "lsr r7, r6, #16\n\t"
  130068. "lsl r6, r6, #16\n\t"
  130069. "adds r4, r4, r6\n\t"
  130070. "adcs r5, r5, r7\n\t"
  130071. "adc r3, r3, #0\n\t"
  130072. "lsr r6, r8, #16\n\t"
  130073. "lsr r7, r9, #16\n\t"
  130074. "mul r7, r6, r7\n\t"
  130075. "adds r5, r5, r7\n\t"
  130076. "adc r3, r3, #0\n\t"
  130077. "lsl r7, r9, #16\n\t"
  130078. "lsr r7, r7, #16\n\t"
  130079. "mul r6, r7, r6\n\t"
  130080. "lsr r7, r6, #16\n\t"
  130081. "lsl r6, r6, #16\n\t"
  130082. "adds r4, r4, r6\n\t"
  130083. "adcs r5, r5, r7\n\t"
  130084. "adc r3, r3, #0\n\t"
  130085. #else
  130086. "umull r6, r7, r8, r9\n\t"
  130087. "adds r4, r4, r6\n\t"
  130088. "adcs r5, r5, r7\n\t"
  130089. "adc r3, r3, #0\n\t"
  130090. #endif
  130091. /* A[1] * B[15] */
  130092. "ldr r8, [%[a], #4]\n\t"
  130093. "ldr r9, [%[b], #60]\n\t"
  130094. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130095. "lsl r6, r8, #16\n\t"
  130096. "lsl r7, r9, #16\n\t"
  130097. "lsr r6, r6, #16\n\t"
  130098. "lsr r7, r7, #16\n\t"
  130099. "mul r7, r6, r7\n\t"
  130100. "adds r4, r4, r7\n\t"
  130101. "adcs r5, r5, #0\n\t"
  130102. "adc r3, r3, #0\n\t"
  130103. "lsr r7, r9, #16\n\t"
  130104. "mul r6, r7, r6\n\t"
  130105. "lsr r7, r6, #16\n\t"
  130106. "lsl r6, r6, #16\n\t"
  130107. "adds r4, r4, r6\n\t"
  130108. "adcs r5, r5, r7\n\t"
  130109. "adc r3, r3, #0\n\t"
  130110. "lsr r6, r8, #16\n\t"
  130111. "lsr r7, r9, #16\n\t"
  130112. "mul r7, r6, r7\n\t"
  130113. "adds r5, r5, r7\n\t"
  130114. "adc r3, r3, #0\n\t"
  130115. "lsl r7, r9, #16\n\t"
  130116. "lsr r7, r7, #16\n\t"
  130117. "mul r6, r7, r6\n\t"
  130118. "lsr r7, r6, #16\n\t"
  130119. "lsl r6, r6, #16\n\t"
  130120. "adds r4, r4, r6\n\t"
  130121. "adcs r5, r5, r7\n\t"
  130122. "adc r3, r3, #0\n\t"
  130123. #else
  130124. "umull r6, r7, r8, r9\n\t"
  130125. "adds r4, r4, r6\n\t"
  130126. "adcs r5, r5, r7\n\t"
  130127. "adc r3, r3, #0\n\t"
  130128. #endif
  130129. "str r4, [%[r], #64]\n\t"
  130130. /* A[2] * B[15] */
  130131. "ldr r8, [%[a], #8]\n\t"
  130132. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130133. "lsl r6, r8, #16\n\t"
  130134. "lsl r7, r9, #16\n\t"
  130135. "lsr r6, r6, #16\n\t"
  130136. "lsr r7, r7, #16\n\t"
  130137. "mul r7, r6, r7\n\t"
  130138. "adds r5, r5, r7\n\t"
  130139. "adcs r3, r3, #0\n\t"
  130140. "mov r4, #0\n\t"
  130141. "adc r4, r4, #0\n\t"
  130142. "lsr r7, r9, #16\n\t"
  130143. "mul r6, r7, r6\n\t"
  130144. "lsr r7, r6, #16\n\t"
  130145. "lsl r6, r6, #16\n\t"
  130146. "adds r5, r5, r6\n\t"
  130147. "adcs r3, r3, r7\n\t"
  130148. "adc r4, r4, #0\n\t"
  130149. "lsr r6, r8, #16\n\t"
  130150. "lsr r7, r9, #16\n\t"
  130151. "mul r7, r6, r7\n\t"
  130152. "adds r3, r3, r7\n\t"
  130153. "adc r4, r4, #0\n\t"
  130154. "lsl r7, r9, #16\n\t"
  130155. "lsr r7, r7, #16\n\t"
  130156. "mul r6, r7, r6\n\t"
  130157. "lsr r7, r6, #16\n\t"
  130158. "lsl r6, r6, #16\n\t"
  130159. "adds r5, r5, r6\n\t"
  130160. "adcs r3, r3, r7\n\t"
  130161. "adc r4, r4, #0\n\t"
  130162. #else
  130163. "umull r6, r7, r8, r9\n\t"
  130164. "adds r5, r5, r6\n\t"
  130165. "adcs r3, r3, r7\n\t"
  130166. "mov r4, #0\n\t"
  130167. "adc r4, r4, #0\n\t"
  130168. #endif
  130169. /* A[3] * B[14] */
  130170. "ldr r8, [%[a], #12]\n\t"
  130171. "ldr r9, [%[b], #56]\n\t"
  130172. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130173. "lsl r6, r8, #16\n\t"
  130174. "lsl r7, r9, #16\n\t"
  130175. "lsr r6, r6, #16\n\t"
  130176. "lsr r7, r7, #16\n\t"
  130177. "mul r7, r6, r7\n\t"
  130178. "adds r5, r5, r7\n\t"
  130179. "adcs r3, r3, #0\n\t"
  130180. "adc r4, r4, #0\n\t"
  130181. "lsr r7, r9, #16\n\t"
  130182. "mul r6, r7, r6\n\t"
  130183. "lsr r7, r6, #16\n\t"
  130184. "lsl r6, r6, #16\n\t"
  130185. "adds r5, r5, r6\n\t"
  130186. "adcs r3, r3, r7\n\t"
  130187. "adc r4, r4, #0\n\t"
  130188. "lsr r6, r8, #16\n\t"
  130189. "lsr r7, r9, #16\n\t"
  130190. "mul r7, r6, r7\n\t"
  130191. "adds r3, r3, r7\n\t"
  130192. "adc r4, r4, #0\n\t"
  130193. "lsl r7, r9, #16\n\t"
  130194. "lsr r7, r7, #16\n\t"
  130195. "mul r6, r7, r6\n\t"
  130196. "lsr r7, r6, #16\n\t"
  130197. "lsl r6, r6, #16\n\t"
  130198. "adds r5, r5, r6\n\t"
  130199. "adcs r3, r3, r7\n\t"
  130200. "adc r4, r4, #0\n\t"
  130201. #else
  130202. "umull r6, r7, r8, r9\n\t"
  130203. "adds r5, r5, r6\n\t"
  130204. "adcs r3, r3, r7\n\t"
  130205. "adc r4, r4, #0\n\t"
  130206. #endif
  130207. /* A[4] * B[13] */
  130208. "ldr r8, [%[a], #16]\n\t"
  130209. "ldr r9, [%[b], #52]\n\t"
  130210. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130211. "lsl r6, r8, #16\n\t"
  130212. "lsl r7, r9, #16\n\t"
  130213. "lsr r6, r6, #16\n\t"
  130214. "lsr r7, r7, #16\n\t"
  130215. "mul r7, r6, r7\n\t"
  130216. "adds r5, r5, r7\n\t"
  130217. "adcs r3, r3, #0\n\t"
  130218. "adc r4, r4, #0\n\t"
  130219. "lsr r7, r9, #16\n\t"
  130220. "mul r6, r7, r6\n\t"
  130221. "lsr r7, r6, #16\n\t"
  130222. "lsl r6, r6, #16\n\t"
  130223. "adds r5, r5, r6\n\t"
  130224. "adcs r3, r3, r7\n\t"
  130225. "adc r4, r4, #0\n\t"
  130226. "lsr r6, r8, #16\n\t"
  130227. "lsr r7, r9, #16\n\t"
  130228. "mul r7, r6, r7\n\t"
  130229. "adds r3, r3, r7\n\t"
  130230. "adc r4, r4, #0\n\t"
  130231. "lsl r7, r9, #16\n\t"
  130232. "lsr r7, r7, #16\n\t"
  130233. "mul r6, r7, r6\n\t"
  130234. "lsr r7, r6, #16\n\t"
  130235. "lsl r6, r6, #16\n\t"
  130236. "adds r5, r5, r6\n\t"
  130237. "adcs r3, r3, r7\n\t"
  130238. "adc r4, r4, #0\n\t"
  130239. #else
  130240. "umull r6, r7, r8, r9\n\t"
  130241. "adds r5, r5, r6\n\t"
  130242. "adcs r3, r3, r7\n\t"
  130243. "adc r4, r4, #0\n\t"
  130244. #endif
  130245. /* A[5] * B[12] */
  130246. "ldr r8, [%[a], #20]\n\t"
  130247. "ldr r9, [%[b], #48]\n\t"
  130248. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130249. "lsl r6, r8, #16\n\t"
  130250. "lsl r7, r9, #16\n\t"
  130251. "lsr r6, r6, #16\n\t"
  130252. "lsr r7, r7, #16\n\t"
  130253. "mul r7, r6, r7\n\t"
  130254. "adds r5, r5, r7\n\t"
  130255. "adcs r3, r3, #0\n\t"
  130256. "adc r4, r4, #0\n\t"
  130257. "lsr r7, r9, #16\n\t"
  130258. "mul r6, r7, r6\n\t"
  130259. "lsr r7, r6, #16\n\t"
  130260. "lsl r6, r6, #16\n\t"
  130261. "adds r5, r5, r6\n\t"
  130262. "adcs r3, r3, r7\n\t"
  130263. "adc r4, r4, #0\n\t"
  130264. "lsr r6, r8, #16\n\t"
  130265. "lsr r7, r9, #16\n\t"
  130266. "mul r7, r6, r7\n\t"
  130267. "adds r3, r3, r7\n\t"
  130268. "adc r4, r4, #0\n\t"
  130269. "lsl r7, r9, #16\n\t"
  130270. "lsr r7, r7, #16\n\t"
  130271. "mul r6, r7, r6\n\t"
  130272. "lsr r7, r6, #16\n\t"
  130273. "lsl r6, r6, #16\n\t"
  130274. "adds r5, r5, r6\n\t"
  130275. "adcs r3, r3, r7\n\t"
  130276. "adc r4, r4, #0\n\t"
  130277. #else
  130278. "umull r6, r7, r8, r9\n\t"
  130279. "adds r5, r5, r6\n\t"
  130280. "adcs r3, r3, r7\n\t"
  130281. "adc r4, r4, #0\n\t"
  130282. #endif
  130283. /* A[6] * B[11] */
  130284. "ldr r8, [%[a], #24]\n\t"
  130285. "ldr r9, [%[b], #44]\n\t"
  130286. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130287. "lsl r6, r8, #16\n\t"
  130288. "lsl r7, r9, #16\n\t"
  130289. "lsr r6, r6, #16\n\t"
  130290. "lsr r7, r7, #16\n\t"
  130291. "mul r7, r6, r7\n\t"
  130292. "adds r5, r5, r7\n\t"
  130293. "adcs r3, r3, #0\n\t"
  130294. "adc r4, r4, #0\n\t"
  130295. "lsr r7, r9, #16\n\t"
  130296. "mul r6, r7, r6\n\t"
  130297. "lsr r7, r6, #16\n\t"
  130298. "lsl r6, r6, #16\n\t"
  130299. "adds r5, r5, r6\n\t"
  130300. "adcs r3, r3, r7\n\t"
  130301. "adc r4, r4, #0\n\t"
  130302. "lsr r6, r8, #16\n\t"
  130303. "lsr r7, r9, #16\n\t"
  130304. "mul r7, r6, r7\n\t"
  130305. "adds r3, r3, r7\n\t"
  130306. "adc r4, r4, #0\n\t"
  130307. "lsl r7, r9, #16\n\t"
  130308. "lsr r7, r7, #16\n\t"
  130309. "mul r6, r7, r6\n\t"
  130310. "lsr r7, r6, #16\n\t"
  130311. "lsl r6, r6, #16\n\t"
  130312. "adds r5, r5, r6\n\t"
  130313. "adcs r3, r3, r7\n\t"
  130314. "adc r4, r4, #0\n\t"
  130315. #else
  130316. "umull r6, r7, r8, r9\n\t"
  130317. "adds r5, r5, r6\n\t"
  130318. "adcs r3, r3, r7\n\t"
  130319. "adc r4, r4, #0\n\t"
  130320. #endif
  130321. /* A[7] * B[10] */
  130322. "ldr r8, [%[a], #28]\n\t"
  130323. "ldr r9, [%[b], #40]\n\t"
  130324. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130325. "lsl r6, r8, #16\n\t"
  130326. "lsl r7, r9, #16\n\t"
  130327. "lsr r6, r6, #16\n\t"
  130328. "lsr r7, r7, #16\n\t"
  130329. "mul r7, r6, r7\n\t"
  130330. "adds r5, r5, r7\n\t"
  130331. "adcs r3, r3, #0\n\t"
  130332. "adc r4, r4, #0\n\t"
  130333. "lsr r7, r9, #16\n\t"
  130334. "mul r6, r7, r6\n\t"
  130335. "lsr r7, r6, #16\n\t"
  130336. "lsl r6, r6, #16\n\t"
  130337. "adds r5, r5, r6\n\t"
  130338. "adcs r3, r3, r7\n\t"
  130339. "adc r4, r4, #0\n\t"
  130340. "lsr r6, r8, #16\n\t"
  130341. "lsr r7, r9, #16\n\t"
  130342. "mul r7, r6, r7\n\t"
  130343. "adds r3, r3, r7\n\t"
  130344. "adc r4, r4, #0\n\t"
  130345. "lsl r7, r9, #16\n\t"
  130346. "lsr r7, r7, #16\n\t"
  130347. "mul r6, r7, r6\n\t"
  130348. "lsr r7, r6, #16\n\t"
  130349. "lsl r6, r6, #16\n\t"
  130350. "adds r5, r5, r6\n\t"
  130351. "adcs r3, r3, r7\n\t"
  130352. "adc r4, r4, #0\n\t"
  130353. #else
  130354. "umull r6, r7, r8, r9\n\t"
  130355. "adds r5, r5, r6\n\t"
  130356. "adcs r3, r3, r7\n\t"
  130357. "adc r4, r4, #0\n\t"
  130358. #endif
  130359. /* A[8] * B[9] */
  130360. "ldr r9, [%[b], #36]\n\t"
  130361. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130362. "lsl r6, r11, #16\n\t"
  130363. "lsl r7, r9, #16\n\t"
  130364. "lsr r6, r6, #16\n\t"
  130365. "lsr r7, r7, #16\n\t"
  130366. "mul r7, r6, r7\n\t"
  130367. "adds r5, r5, r7\n\t"
  130368. "adcs r3, r3, #0\n\t"
  130369. "adc r4, r4, #0\n\t"
  130370. "lsr r7, r9, #16\n\t"
  130371. "mul r6, r7, r6\n\t"
  130372. "lsr r7, r6, #16\n\t"
  130373. "lsl r6, r6, #16\n\t"
  130374. "adds r5, r5, r6\n\t"
  130375. "adcs r3, r3, r7\n\t"
  130376. "adc r4, r4, #0\n\t"
  130377. "lsr r6, r11, #16\n\t"
  130378. "lsr r7, r9, #16\n\t"
  130379. "mul r7, r6, r7\n\t"
  130380. "adds r3, r3, r7\n\t"
  130381. "adc r4, r4, #0\n\t"
  130382. "lsl r7, r9, #16\n\t"
  130383. "lsr r7, r7, #16\n\t"
  130384. "mul r6, r7, r6\n\t"
  130385. "lsr r7, r6, #16\n\t"
  130386. "lsl r6, r6, #16\n\t"
  130387. "adds r5, r5, r6\n\t"
  130388. "adcs r3, r3, r7\n\t"
  130389. "adc r4, r4, #0\n\t"
  130390. #else
  130391. "umull r6, r7, r11, r9\n\t"
  130392. "adds r5, r5, r6\n\t"
  130393. "adcs r3, r3, r7\n\t"
  130394. "adc r4, r4, #0\n\t"
  130395. #endif
  130396. /* A[9] * B[8] */
  130397. "ldr r8, [%[a], #36]\n\t"
  130398. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130399. "lsl r6, r8, #16\n\t"
  130400. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[10] * B[7] */
  130434. "ldr r8, [%[a], #40]\n\t"
  130435. "ldr r9, [%[b], #28]\n\t"
  130436. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130437. "lsl r6, r8, #16\n\t"
  130438. "lsl r7, r9, #16\n\t"
  130439. "lsr r6, r6, #16\n\t"
  130440. "lsr r7, r7, #16\n\t"
  130441. "mul r7, r6, r7\n\t"
  130442. "adds r5, r5, r7\n\t"
  130443. "adcs r3, r3, #0\n\t"
  130444. "adc r4, r4, #0\n\t"
  130445. "lsr r7, r9, #16\n\t"
  130446. "mul r6, r7, r6\n\t"
  130447. "lsr r7, r6, #16\n\t"
  130448. "lsl r6, r6, #16\n\t"
  130449. "adds r5, r5, r6\n\t"
  130450. "adcs r3, r3, r7\n\t"
  130451. "adc r4, r4, #0\n\t"
  130452. "lsr r6, r8, #16\n\t"
  130453. "lsr r7, r9, #16\n\t"
  130454. "mul r7, r6, r7\n\t"
  130455. "adds r3, r3, r7\n\t"
  130456. "adc r4, r4, #0\n\t"
  130457. "lsl r7, r9, #16\n\t"
  130458. "lsr r7, r7, #16\n\t"
  130459. "mul r6, r7, r6\n\t"
  130460. "lsr r7, r6, #16\n\t"
  130461. "lsl r6, r6, #16\n\t"
  130462. "adds r5, r5, r6\n\t"
  130463. "adcs r3, r3, r7\n\t"
  130464. "adc r4, r4, #0\n\t"
  130465. #else
  130466. "umull r6, r7, r8, r9\n\t"
  130467. "adds r5, r5, r6\n\t"
  130468. "adcs r3, r3, r7\n\t"
  130469. "adc r4, r4, #0\n\t"
  130470. #endif
  130471. /* A[11] * B[6] */
  130472. "ldr r8, [%[a], #44]\n\t"
  130473. "ldr r9, [%[b], #24]\n\t"
  130474. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130475. "lsl r6, r8, #16\n\t"
  130476. "lsl r7, r9, #16\n\t"
  130477. "lsr r6, r6, #16\n\t"
  130478. "lsr r7, r7, #16\n\t"
  130479. "mul r7, r6, r7\n\t"
  130480. "adds r5, r5, r7\n\t"
  130481. "adcs r3, r3, #0\n\t"
  130482. "adc r4, r4, #0\n\t"
  130483. "lsr r7, r9, #16\n\t"
  130484. "mul r6, r7, r6\n\t"
  130485. "lsr r7, r6, #16\n\t"
  130486. "lsl r6, r6, #16\n\t"
  130487. "adds r5, r5, r6\n\t"
  130488. "adcs r3, r3, r7\n\t"
  130489. "adc r4, r4, #0\n\t"
  130490. "lsr r6, r8, #16\n\t"
  130491. "lsr r7, r9, #16\n\t"
  130492. "mul r7, r6, r7\n\t"
  130493. "adds r3, r3, r7\n\t"
  130494. "adc r4, r4, #0\n\t"
  130495. "lsl r7, r9, #16\n\t"
  130496. "lsr r7, r7, #16\n\t"
  130497. "mul r6, r7, r6\n\t"
  130498. "lsr r7, r6, #16\n\t"
  130499. "lsl r6, r6, #16\n\t"
  130500. "adds r5, r5, r6\n\t"
  130501. "adcs r3, r3, r7\n\t"
  130502. "adc r4, r4, #0\n\t"
  130503. #else
  130504. "umull r6, r7, r8, r9\n\t"
  130505. "adds r5, r5, r6\n\t"
  130506. "adcs r3, r3, r7\n\t"
  130507. "adc r4, r4, #0\n\t"
  130508. #endif
  130509. /* A[12] * B[5] */
  130510. "ldr r8, [%[a], #48]\n\t"
  130511. "ldr r9, [%[b], #20]\n\t"
  130512. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130513. "lsl r6, r8, #16\n\t"
  130514. "lsl r7, r9, #16\n\t"
  130515. "lsr r6, r6, #16\n\t"
  130516. "lsr r7, r7, #16\n\t"
  130517. "mul r7, r6, r7\n\t"
  130518. "adds r5, r5, r7\n\t"
  130519. "adcs r3, r3, #0\n\t"
  130520. "adc r4, r4, #0\n\t"
  130521. "lsr r7, r9, #16\n\t"
  130522. "mul r6, r7, r6\n\t"
  130523. "lsr r7, r6, #16\n\t"
  130524. "lsl r6, r6, #16\n\t"
  130525. "adds r5, r5, r6\n\t"
  130526. "adcs r3, r3, r7\n\t"
  130527. "adc r4, r4, #0\n\t"
  130528. "lsr r6, r8, #16\n\t"
  130529. "lsr r7, r9, #16\n\t"
  130530. "mul r7, r6, r7\n\t"
  130531. "adds r3, r3, r7\n\t"
  130532. "adc r4, r4, #0\n\t"
  130533. "lsl r7, r9, #16\n\t"
  130534. "lsr r7, r7, #16\n\t"
  130535. "mul r6, r7, r6\n\t"
  130536. "lsr r7, r6, #16\n\t"
  130537. "lsl r6, r6, #16\n\t"
  130538. "adds r5, r5, r6\n\t"
  130539. "adcs r3, r3, r7\n\t"
  130540. "adc r4, r4, #0\n\t"
  130541. #else
  130542. "umull r6, r7, r8, r9\n\t"
  130543. "adds r5, r5, r6\n\t"
  130544. "adcs r3, r3, r7\n\t"
  130545. "adc r4, r4, #0\n\t"
  130546. #endif
  130547. /* A[13] * B[4] */
  130548. "ldr r8, [%[a], #52]\n\t"
  130549. "ldr r9, [%[b], #16]\n\t"
  130550. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130551. "lsl r6, r8, #16\n\t"
  130552. "lsl r7, r9, #16\n\t"
  130553. "lsr r6, r6, #16\n\t"
  130554. "lsr r7, r7, #16\n\t"
  130555. "mul r7, r6, r7\n\t"
  130556. "adds r5, r5, r7\n\t"
  130557. "adcs r3, r3, #0\n\t"
  130558. "adc r4, r4, #0\n\t"
  130559. "lsr r7, r9, #16\n\t"
  130560. "mul r6, r7, r6\n\t"
  130561. "lsr r7, r6, #16\n\t"
  130562. "lsl r6, r6, #16\n\t"
  130563. "adds r5, r5, r6\n\t"
  130564. "adcs r3, r3, r7\n\t"
  130565. "adc r4, r4, #0\n\t"
  130566. "lsr r6, r8, #16\n\t"
  130567. "lsr r7, r9, #16\n\t"
  130568. "mul r7, r6, r7\n\t"
  130569. "adds r3, r3, r7\n\t"
  130570. "adc r4, r4, #0\n\t"
  130571. "lsl r7, r9, #16\n\t"
  130572. "lsr r7, r7, #16\n\t"
  130573. "mul r6, r7, r6\n\t"
  130574. "lsr r7, r6, #16\n\t"
  130575. "lsl r6, r6, #16\n\t"
  130576. "adds r5, r5, r6\n\t"
  130577. "adcs r3, r3, r7\n\t"
  130578. "adc r4, r4, #0\n\t"
  130579. #else
  130580. "umull r6, r7, r8, r9\n\t"
  130581. "adds r5, r5, r6\n\t"
  130582. "adcs r3, r3, r7\n\t"
  130583. "adc r4, r4, #0\n\t"
  130584. #endif
  130585. /* A[14] * B[3] */
  130586. "ldr r8, [%[a], #56]\n\t"
  130587. "ldr r9, [%[b], #12]\n\t"
  130588. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130589. "lsl r6, r8, #16\n\t"
  130590. "lsl r7, r9, #16\n\t"
  130591. "lsr r6, r6, #16\n\t"
  130592. "lsr r7, r7, #16\n\t"
  130593. "mul r7, r6, r7\n\t"
  130594. "adds r5, r5, r7\n\t"
  130595. "adcs r3, r3, #0\n\t"
  130596. "adc r4, r4, #0\n\t"
  130597. "lsr r7, r9, #16\n\t"
  130598. "mul r6, r7, r6\n\t"
  130599. "lsr r7, r6, #16\n\t"
  130600. "lsl r6, r6, #16\n\t"
  130601. "adds r5, r5, r6\n\t"
  130602. "adcs r3, r3, r7\n\t"
  130603. "adc r4, r4, #0\n\t"
  130604. "lsr r6, r8, #16\n\t"
  130605. "lsr r7, r9, #16\n\t"
  130606. "mul r7, r6, r7\n\t"
  130607. "adds r3, r3, r7\n\t"
  130608. "adc r4, r4, #0\n\t"
  130609. "lsl r7, r9, #16\n\t"
  130610. "lsr r7, r7, #16\n\t"
  130611. "mul r6, r7, r6\n\t"
  130612. "lsr r7, r6, #16\n\t"
  130613. "lsl r6, r6, #16\n\t"
  130614. "adds r5, r5, r6\n\t"
  130615. "adcs r3, r3, r7\n\t"
  130616. "adc r4, r4, #0\n\t"
  130617. #else
  130618. "umull r6, r7, r8, r9\n\t"
  130619. "adds r5, r5, r6\n\t"
  130620. "adcs r3, r3, r7\n\t"
  130621. "adc r4, r4, #0\n\t"
  130622. #endif
  130623. /* A[15] * B[2] */
  130624. "ldr r8, [%[a], #60]\n\t"
  130625. "ldr r9, [%[b], #8]\n\t"
  130626. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130627. "lsl r6, r8, #16\n\t"
  130628. "lsl r7, r9, #16\n\t"
  130629. "lsr r6, r6, #16\n\t"
  130630. "lsr r7, r7, #16\n\t"
  130631. "mul r7, r6, r7\n\t"
  130632. "adds r5, r5, r7\n\t"
  130633. "adcs r3, r3, #0\n\t"
  130634. "adc r4, r4, #0\n\t"
  130635. "lsr r7, r9, #16\n\t"
  130636. "mul r6, r7, r6\n\t"
  130637. "lsr r7, r6, #16\n\t"
  130638. "lsl r6, r6, #16\n\t"
  130639. "adds r5, r5, r6\n\t"
  130640. "adcs r3, r3, r7\n\t"
  130641. "adc r4, r4, #0\n\t"
  130642. "lsr r6, r8, #16\n\t"
  130643. "lsr r7, r9, #16\n\t"
  130644. "mul r7, r6, r7\n\t"
  130645. "adds r3, r3, r7\n\t"
  130646. "adc r4, r4, #0\n\t"
  130647. "lsl r7, r9, #16\n\t"
  130648. "lsr r7, r7, #16\n\t"
  130649. "mul r6, r7, r6\n\t"
  130650. "lsr r7, r6, #16\n\t"
  130651. "lsl r6, r6, #16\n\t"
  130652. "adds r5, r5, r6\n\t"
  130653. "adcs r3, r3, r7\n\t"
  130654. "adc r4, r4, #0\n\t"
  130655. #else
  130656. "umull r6, r7, r8, r9\n\t"
  130657. "adds r5, r5, r6\n\t"
  130658. "adcs r3, r3, r7\n\t"
  130659. "adc r4, r4, #0\n\t"
  130660. #endif
  130661. "str r5, [%[r], #68]\n\t"
  130662. /* A[15] * B[3] */
  130663. "ldr r9, [%[b], #12]\n\t"
  130664. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130665. "lsl r6, r8, #16\n\t"
  130666. "lsl r7, r9, #16\n\t"
  130667. "lsr r6, r6, #16\n\t"
  130668. "lsr r7, r7, #16\n\t"
  130669. "mul r7, r6, r7\n\t"
  130670. "adds r3, r3, r7\n\t"
  130671. "adcs r4, r4, #0\n\t"
  130672. "mov r5, #0\n\t"
  130673. "adc r5, r5, #0\n\t"
  130674. "lsr r7, r9, #16\n\t"
  130675. "mul r6, r7, r6\n\t"
  130676. "lsr r7, r6, #16\n\t"
  130677. "lsl r6, r6, #16\n\t"
  130678. "adds r3, r3, r6\n\t"
  130679. "adcs r4, r4, r7\n\t"
  130680. "adc r5, r5, #0\n\t"
  130681. "lsr r6, r8, #16\n\t"
  130682. "lsr r7, r9, #16\n\t"
  130683. "mul r7, r6, r7\n\t"
  130684. "adds r4, r4, r7\n\t"
  130685. "adc r5, r5, #0\n\t"
  130686. "lsl r7, r9, #16\n\t"
  130687. "lsr r7, r7, #16\n\t"
  130688. "mul r6, r7, r6\n\t"
  130689. "lsr r7, r6, #16\n\t"
  130690. "lsl r6, r6, #16\n\t"
  130691. "adds r3, r3, r6\n\t"
  130692. "adcs r4, r4, r7\n\t"
  130693. "adc r5, r5, #0\n\t"
  130694. #else
  130695. "umull r6, r7, r8, r9\n\t"
  130696. "adds r3, r3, r6\n\t"
  130697. "adcs r4, r4, r7\n\t"
  130698. "mov r5, #0\n\t"
  130699. "adc r5, r5, #0\n\t"
  130700. #endif
  130701. /* A[14] * B[4] */
  130702. "ldr r8, [%[a], #56]\n\t"
  130703. "ldr r9, [%[b], #16]\n\t"
  130704. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130705. "lsl r6, r8, #16\n\t"
  130706. "lsl r7, r9, #16\n\t"
  130707. "lsr r6, r6, #16\n\t"
  130708. "lsr r7, r7, #16\n\t"
  130709. "mul r7, r6, r7\n\t"
  130710. "adds r3, r3, r7\n\t"
  130711. "adcs r4, r4, #0\n\t"
  130712. "adc r5, r5, #0\n\t"
  130713. "lsr r7, r9, #16\n\t"
  130714. "mul r6, r7, r6\n\t"
  130715. "lsr r7, r6, #16\n\t"
  130716. "lsl r6, r6, #16\n\t"
  130717. "adds r3, r3, r6\n\t"
  130718. "adcs r4, r4, r7\n\t"
  130719. "adc r5, r5, #0\n\t"
  130720. "lsr r6, r8, #16\n\t"
  130721. "lsr r7, r9, #16\n\t"
  130722. "mul r7, r6, r7\n\t"
  130723. "adds r4, r4, r7\n\t"
  130724. "adc r5, r5, #0\n\t"
  130725. "lsl r7, r9, #16\n\t"
  130726. "lsr r7, r7, #16\n\t"
  130727. "mul r6, r7, r6\n\t"
  130728. "lsr r7, r6, #16\n\t"
  130729. "lsl r6, r6, #16\n\t"
  130730. "adds r3, r3, r6\n\t"
  130731. "adcs r4, r4, r7\n\t"
  130732. "adc r5, r5, #0\n\t"
  130733. #else
  130734. "umull r6, r7, r8, r9\n\t"
  130735. "adds r3, r3, r6\n\t"
  130736. "adcs r4, r4, r7\n\t"
  130737. "adc r5, r5, #0\n\t"
  130738. #endif
  130739. /* A[13] * B[5] */
  130740. "ldr r8, [%[a], #52]\n\t"
  130741. "ldr r9, [%[b], #20]\n\t"
  130742. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130743. "lsl r6, r8, #16\n\t"
  130744. "lsl r7, r9, #16\n\t"
  130745. "lsr r6, r6, #16\n\t"
  130746. "lsr r7, r7, #16\n\t"
  130747. "mul r7, r6, r7\n\t"
  130748. "adds r3, r3, r7\n\t"
  130749. "adcs r4, r4, #0\n\t"
  130750. "adc r5, r5, #0\n\t"
  130751. "lsr r7, r9, #16\n\t"
  130752. "mul r6, r7, r6\n\t"
  130753. "lsr r7, r6, #16\n\t"
  130754. "lsl r6, r6, #16\n\t"
  130755. "adds r3, r3, r6\n\t"
  130756. "adcs r4, r4, r7\n\t"
  130757. "adc r5, r5, #0\n\t"
  130758. "lsr r6, r8, #16\n\t"
  130759. "lsr r7, r9, #16\n\t"
  130760. "mul r7, r6, r7\n\t"
  130761. "adds r4, r4, r7\n\t"
  130762. "adc r5, r5, #0\n\t"
  130763. "lsl r7, r9, #16\n\t"
  130764. "lsr r7, r7, #16\n\t"
  130765. "mul r6, r7, r6\n\t"
  130766. "lsr r7, r6, #16\n\t"
  130767. "lsl r6, r6, #16\n\t"
  130768. "adds r3, r3, r6\n\t"
  130769. "adcs r4, r4, r7\n\t"
  130770. "adc r5, r5, #0\n\t"
  130771. #else
  130772. "umull r6, r7, r8, r9\n\t"
  130773. "adds r3, r3, r6\n\t"
  130774. "adcs r4, r4, r7\n\t"
  130775. "adc r5, r5, #0\n\t"
  130776. #endif
  130777. /* A[12] * B[6] */
  130778. "ldr r8, [%[a], #48]\n\t"
  130779. "ldr r9, [%[b], #24]\n\t"
  130780. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130781. "lsl r6, r8, #16\n\t"
  130782. "lsl r7, r9, #16\n\t"
  130783. "lsr r6, r6, #16\n\t"
  130784. "lsr r7, r7, #16\n\t"
  130785. "mul r7, r6, r7\n\t"
  130786. "adds r3, r3, r7\n\t"
  130787. "adcs r4, r4, #0\n\t"
  130788. "adc r5, r5, #0\n\t"
  130789. "lsr r7, r9, #16\n\t"
  130790. "mul r6, r7, r6\n\t"
  130791. "lsr r7, r6, #16\n\t"
  130792. "lsl r6, r6, #16\n\t"
  130793. "adds r3, r3, r6\n\t"
  130794. "adcs r4, r4, r7\n\t"
  130795. "adc r5, r5, #0\n\t"
  130796. "lsr r6, r8, #16\n\t"
  130797. "lsr r7, r9, #16\n\t"
  130798. "mul r7, r6, r7\n\t"
  130799. "adds r4, r4, r7\n\t"
  130800. "adc r5, r5, #0\n\t"
  130801. "lsl r7, r9, #16\n\t"
  130802. "lsr r7, r7, #16\n\t"
  130803. "mul r6, r7, r6\n\t"
  130804. "lsr r7, r6, #16\n\t"
  130805. "lsl r6, r6, #16\n\t"
  130806. "adds r3, r3, r6\n\t"
  130807. "adcs r4, r4, r7\n\t"
  130808. "adc r5, r5, #0\n\t"
  130809. #else
  130810. "umull r6, r7, r8, r9\n\t"
  130811. "adds r3, r3, r6\n\t"
  130812. "adcs r4, r4, r7\n\t"
  130813. "adc r5, r5, #0\n\t"
  130814. #endif
  130815. /* A[11] * B[7] */
  130816. "ldr r8, [%[a], #44]\n\t"
  130817. "ldr r9, [%[b], #28]\n\t"
  130818. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130819. "lsl r6, r8, #16\n\t"
  130820. "lsl r7, r9, #16\n\t"
  130821. "lsr r6, r6, #16\n\t"
  130822. "lsr r7, r7, #16\n\t"
  130823. "mul r7, r6, r7\n\t"
  130824. "adds r3, r3, r7\n\t"
  130825. "adcs r4, r4, #0\n\t"
  130826. "adc r5, r5, #0\n\t"
  130827. "lsr r7, r9, #16\n\t"
  130828. "mul r6, r7, r6\n\t"
  130829. "lsr r7, r6, #16\n\t"
  130830. "lsl r6, r6, #16\n\t"
  130831. "adds r3, r3, r6\n\t"
  130832. "adcs r4, r4, r7\n\t"
  130833. "adc r5, r5, #0\n\t"
  130834. "lsr r6, r8, #16\n\t"
  130835. "lsr r7, r9, #16\n\t"
  130836. "mul r7, r6, r7\n\t"
  130837. "adds r4, r4, r7\n\t"
  130838. "adc r5, r5, #0\n\t"
  130839. "lsl r7, r9, #16\n\t"
  130840. "lsr r7, r7, #16\n\t"
  130841. "mul r6, r7, r6\n\t"
  130842. "lsr r7, r6, #16\n\t"
  130843. "lsl r6, r6, #16\n\t"
  130844. "adds r3, r3, r6\n\t"
  130845. "adcs r4, r4, r7\n\t"
  130846. "adc r5, r5, #0\n\t"
  130847. #else
  130848. "umull r6, r7, r8, r9\n\t"
  130849. "adds r3, r3, r6\n\t"
  130850. "adcs r4, r4, r7\n\t"
  130851. "adc r5, r5, #0\n\t"
  130852. #endif
  130853. /* A[10] * B[8] */
  130854. "ldr r8, [%[a], #40]\n\t"
  130855. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130856. "lsl r6, r8, #16\n\t"
  130857. "lsl r7, r12, #16\n\t"
  130858. "lsr r6, r6, #16\n\t"
  130859. "lsr r7, r7, #16\n\t"
  130860. "mul r7, r6, r7\n\t"
  130861. "adds r3, r3, r7\n\t"
  130862. "adcs r4, r4, #0\n\t"
  130863. "adc r5, r5, #0\n\t"
  130864. "lsr r7, r12, #16\n\t"
  130865. "mul r6, r7, r6\n\t"
  130866. "lsr r7, r6, #16\n\t"
  130867. "lsl r6, r6, #16\n\t"
  130868. "adds r3, r3, r6\n\t"
  130869. "adcs r4, r4, r7\n\t"
  130870. "adc r5, r5, #0\n\t"
  130871. "lsr r6, r8, #16\n\t"
  130872. "lsr r7, r12, #16\n\t"
  130873. "mul r7, r6, r7\n\t"
  130874. "adds r4, r4, r7\n\t"
  130875. "adc r5, r5, #0\n\t"
  130876. "lsl r7, r12, #16\n\t"
  130877. "lsr r7, r7, #16\n\t"
  130878. "mul r6, r7, r6\n\t"
  130879. "lsr r7, r6, #16\n\t"
  130880. "lsl r6, r6, #16\n\t"
  130881. "adds r3, r3, r6\n\t"
  130882. "adcs r4, r4, r7\n\t"
  130883. "adc r5, r5, #0\n\t"
  130884. #else
  130885. "umull r6, r7, r8, r12\n\t"
  130886. "adds r3, r3, r6\n\t"
  130887. "adcs r4, r4, r7\n\t"
  130888. "adc r5, r5, #0\n\t"
  130889. #endif
  130890. /* A[9] * B[9] */
  130891. "ldr r11, [%[a], #36]\n\t"
  130892. "ldr r12, [%[b], #36]\n\t"
  130893. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130894. "lsl r6, r11, #16\n\t"
  130895. "lsl r7, r12, #16\n\t"
  130896. "lsr r6, r6, #16\n\t"
  130897. "lsr r7, r7, #16\n\t"
  130898. "mul r7, r6, r7\n\t"
  130899. "adds r3, r3, r7\n\t"
  130900. "adcs r4, r4, #0\n\t"
  130901. "adc r5, r5, #0\n\t"
  130902. "lsr r7, r12, #16\n\t"
  130903. "mul r6, r7, r6\n\t"
  130904. "lsr r7, r6, #16\n\t"
  130905. "lsl r6, r6, #16\n\t"
  130906. "adds r3, r3, r6\n\t"
  130907. "adcs r4, r4, r7\n\t"
  130908. "adc r5, r5, #0\n\t"
  130909. "lsr r6, r11, #16\n\t"
  130910. "lsr r7, r12, #16\n\t"
  130911. "mul r7, r6, r7\n\t"
  130912. "adds r4, r4, r7\n\t"
  130913. "adc r5, r5, #0\n\t"
  130914. "lsl r7, r12, #16\n\t"
  130915. "lsr r7, r7, #16\n\t"
  130916. "mul r6, r7, r6\n\t"
  130917. "lsr r7, r6, #16\n\t"
  130918. "lsl r6, r6, #16\n\t"
  130919. "adds r3, r3, r6\n\t"
  130920. "adcs r4, r4, r7\n\t"
  130921. "adc r5, r5, #0\n\t"
  130922. #else
  130923. "umull r6, r7, r11, r12\n\t"
  130924. "adds r3, r3, r6\n\t"
  130925. "adcs r4, r4, r7\n\t"
  130926. "adc r5, r5, #0\n\t"
  130927. #endif
  130928. /* A[8] * B[10] */
  130929. "ldr r8, [%[a], #32]\n\t"
  130930. "ldr r9, [%[b], #40]\n\t"
  130931. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130932. "lsl r6, r8, #16\n\t"
  130933. "lsl r7, r9, #16\n\t"
  130934. "lsr r6, r6, #16\n\t"
  130935. "lsr r7, r7, #16\n\t"
  130936. "mul r7, r6, r7\n\t"
  130937. "adds r3, r3, r7\n\t"
  130938. "adcs r4, r4, #0\n\t"
  130939. "adc r5, r5, #0\n\t"
  130940. "lsr r7, r9, #16\n\t"
  130941. "mul r6, r7, r6\n\t"
  130942. "lsr r7, r6, #16\n\t"
  130943. "lsl r6, r6, #16\n\t"
  130944. "adds r3, r3, r6\n\t"
  130945. "adcs r4, r4, r7\n\t"
  130946. "adc r5, r5, #0\n\t"
  130947. "lsr r6, r8, #16\n\t"
  130948. "lsr r7, r9, #16\n\t"
  130949. "mul r7, r6, r7\n\t"
  130950. "adds r4, r4, r7\n\t"
  130951. "adc r5, r5, #0\n\t"
  130952. "lsl r7, r9, #16\n\t"
  130953. "lsr r7, r7, #16\n\t"
  130954. "mul r6, r7, r6\n\t"
  130955. "lsr r7, r6, #16\n\t"
  130956. "lsl r6, r6, #16\n\t"
  130957. "adds r3, r3, r6\n\t"
  130958. "adcs r4, r4, r7\n\t"
  130959. "adc r5, r5, #0\n\t"
  130960. #else
  130961. "umull r6, r7, r8, r9\n\t"
  130962. "adds r3, r3, r6\n\t"
  130963. "adcs r4, r4, r7\n\t"
  130964. "adc r5, r5, #0\n\t"
  130965. #endif
  130966. /* A[7] * B[11] */
  130967. "ldr r8, [%[a], #28]\n\t"
  130968. "ldr r9, [%[b], #44]\n\t"
  130969. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  130970. "lsl r6, r8, #16\n\t"
  130971. "lsl r7, r9, #16\n\t"
  130972. "lsr r6, r6, #16\n\t"
  130973. "lsr r7, r7, #16\n\t"
  130974. "mul r7, r6, r7\n\t"
  130975. "adds r3, r3, r7\n\t"
  130976. "adcs r4, r4, #0\n\t"
  130977. "adc r5, r5, #0\n\t"
  130978. "lsr r7, r9, #16\n\t"
  130979. "mul r6, r7, r6\n\t"
  130980. "lsr r7, r6, #16\n\t"
  130981. "lsl r6, r6, #16\n\t"
  130982. "adds r3, r3, r6\n\t"
  130983. "adcs r4, r4, r7\n\t"
  130984. "adc r5, r5, #0\n\t"
  130985. "lsr r6, r8, #16\n\t"
  130986. "lsr r7, r9, #16\n\t"
  130987. "mul r7, r6, r7\n\t"
  130988. "adds r4, r4, r7\n\t"
  130989. "adc r5, r5, #0\n\t"
  130990. "lsl r7, r9, #16\n\t"
  130991. "lsr r7, r7, #16\n\t"
  130992. "mul r6, r7, r6\n\t"
  130993. "lsr r7, r6, #16\n\t"
  130994. "lsl r6, r6, #16\n\t"
  130995. "adds r3, r3, r6\n\t"
  130996. "adcs r4, r4, r7\n\t"
  130997. "adc r5, r5, #0\n\t"
  130998. #else
  130999. "umull r6, r7, r8, r9\n\t"
  131000. "adds r3, r3, r6\n\t"
  131001. "adcs r4, r4, r7\n\t"
  131002. "adc r5, r5, #0\n\t"
  131003. #endif
  131004. /* A[6] * B[12] */
  131005. "ldr r8, [%[a], #24]\n\t"
  131006. "ldr r9, [%[b], #48]\n\t"
  131007. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131008. "lsl r6, r8, #16\n\t"
  131009. "lsl r7, r9, #16\n\t"
  131010. "lsr r6, r6, #16\n\t"
  131011. "lsr r7, r7, #16\n\t"
  131012. "mul r7, r6, r7\n\t"
  131013. "adds r3, r3, r7\n\t"
  131014. "adcs r4, r4, #0\n\t"
  131015. "adc r5, r5, #0\n\t"
  131016. "lsr r7, r9, #16\n\t"
  131017. "mul r6, r7, r6\n\t"
  131018. "lsr r7, r6, #16\n\t"
  131019. "lsl r6, r6, #16\n\t"
  131020. "adds r3, r3, r6\n\t"
  131021. "adcs r4, r4, r7\n\t"
  131022. "adc r5, r5, #0\n\t"
  131023. "lsr r6, r8, #16\n\t"
  131024. "lsr r7, r9, #16\n\t"
  131025. "mul r7, r6, r7\n\t"
  131026. "adds r4, r4, r7\n\t"
  131027. "adc r5, r5, #0\n\t"
  131028. "lsl r7, r9, #16\n\t"
  131029. "lsr r7, r7, #16\n\t"
  131030. "mul r6, r7, r6\n\t"
  131031. "lsr r7, r6, #16\n\t"
  131032. "lsl r6, r6, #16\n\t"
  131033. "adds r3, r3, r6\n\t"
  131034. "adcs r4, r4, r7\n\t"
  131035. "adc r5, r5, #0\n\t"
  131036. #else
  131037. "umull r6, r7, r8, r9\n\t"
  131038. "adds r3, r3, r6\n\t"
  131039. "adcs r4, r4, r7\n\t"
  131040. "adc r5, r5, #0\n\t"
  131041. #endif
  131042. /* A[5] * B[13] */
  131043. "ldr r8, [%[a], #20]\n\t"
  131044. "ldr r9, [%[b], #52]\n\t"
  131045. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131046. "lsl r6, r8, #16\n\t"
  131047. "lsl r7, r9, #16\n\t"
  131048. "lsr r6, r6, #16\n\t"
  131049. "lsr r7, r7, #16\n\t"
  131050. "mul r7, r6, r7\n\t"
  131051. "adds r3, r3, r7\n\t"
  131052. "adcs r4, r4, #0\n\t"
  131053. "adc r5, r5, #0\n\t"
  131054. "lsr r7, r9, #16\n\t"
  131055. "mul r6, r7, r6\n\t"
  131056. "lsr r7, r6, #16\n\t"
  131057. "lsl r6, r6, #16\n\t"
  131058. "adds r3, r3, r6\n\t"
  131059. "adcs r4, r4, r7\n\t"
  131060. "adc r5, r5, #0\n\t"
  131061. "lsr r6, r8, #16\n\t"
  131062. "lsr r7, r9, #16\n\t"
  131063. "mul r7, r6, r7\n\t"
  131064. "adds r4, r4, r7\n\t"
  131065. "adc r5, r5, #0\n\t"
  131066. "lsl r7, r9, #16\n\t"
  131067. "lsr r7, r7, #16\n\t"
  131068. "mul r6, r7, r6\n\t"
  131069. "lsr r7, r6, #16\n\t"
  131070. "lsl r6, r6, #16\n\t"
  131071. "adds r3, r3, r6\n\t"
  131072. "adcs r4, r4, r7\n\t"
  131073. "adc r5, r5, #0\n\t"
  131074. #else
  131075. "umull r6, r7, r8, r9\n\t"
  131076. "adds r3, r3, r6\n\t"
  131077. "adcs r4, r4, r7\n\t"
  131078. "adc r5, r5, #0\n\t"
  131079. #endif
  131080. /* A[4] * B[14] */
  131081. "ldr r8, [%[a], #16]\n\t"
  131082. "ldr r9, [%[b], #56]\n\t"
  131083. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131084. "lsl r6, r8, #16\n\t"
  131085. "lsl r7, r9, #16\n\t"
  131086. "lsr r6, r6, #16\n\t"
  131087. "lsr r7, r7, #16\n\t"
  131088. "mul r7, r6, r7\n\t"
  131089. "adds r3, r3, r7\n\t"
  131090. "adcs r4, r4, #0\n\t"
  131091. "adc r5, r5, #0\n\t"
  131092. "lsr r7, r9, #16\n\t"
  131093. "mul r6, r7, r6\n\t"
  131094. "lsr r7, r6, #16\n\t"
  131095. "lsl r6, r6, #16\n\t"
  131096. "adds r3, r3, r6\n\t"
  131097. "adcs r4, r4, r7\n\t"
  131098. "adc r5, r5, #0\n\t"
  131099. "lsr r6, r8, #16\n\t"
  131100. "lsr r7, r9, #16\n\t"
  131101. "mul r7, r6, r7\n\t"
  131102. "adds r4, r4, r7\n\t"
  131103. "adc r5, r5, #0\n\t"
  131104. "lsl r7, r9, #16\n\t"
  131105. "lsr r7, r7, #16\n\t"
  131106. "mul r6, r7, r6\n\t"
  131107. "lsr r7, r6, #16\n\t"
  131108. "lsl r6, r6, #16\n\t"
  131109. "adds r3, r3, r6\n\t"
  131110. "adcs r4, r4, r7\n\t"
  131111. "adc r5, r5, #0\n\t"
  131112. #else
  131113. "umull r6, r7, r8, r9\n\t"
  131114. "adds r3, r3, r6\n\t"
  131115. "adcs r4, r4, r7\n\t"
  131116. "adc r5, r5, #0\n\t"
  131117. #endif
  131118. /* A[3] * B[15] */
  131119. "ldr r8, [%[a], #12]\n\t"
  131120. "ldr r9, [%[b], #60]\n\t"
  131121. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131122. "lsl r6, r8, #16\n\t"
  131123. "lsl r7, r9, #16\n\t"
  131124. "lsr r6, r6, #16\n\t"
  131125. "lsr r7, r7, #16\n\t"
  131126. "mul r7, r6, r7\n\t"
  131127. "adds r3, r3, r7\n\t"
  131128. "adcs r4, r4, #0\n\t"
  131129. "adc r5, r5, #0\n\t"
  131130. "lsr r7, r9, #16\n\t"
  131131. "mul r6, r7, r6\n\t"
  131132. "lsr r7, r6, #16\n\t"
  131133. "lsl r6, r6, #16\n\t"
  131134. "adds r3, r3, r6\n\t"
  131135. "adcs r4, r4, r7\n\t"
  131136. "adc r5, r5, #0\n\t"
  131137. "lsr r6, r8, #16\n\t"
  131138. "lsr r7, r9, #16\n\t"
  131139. "mul r7, r6, r7\n\t"
  131140. "adds r4, r4, r7\n\t"
  131141. "adc r5, r5, #0\n\t"
  131142. "lsl r7, r9, #16\n\t"
  131143. "lsr r7, r7, #16\n\t"
  131144. "mul r6, r7, r6\n\t"
  131145. "lsr r7, r6, #16\n\t"
  131146. "lsl r6, r6, #16\n\t"
  131147. "adds r3, r3, r6\n\t"
  131148. "adcs r4, r4, r7\n\t"
  131149. "adc r5, r5, #0\n\t"
  131150. #else
  131151. "umull r6, r7, r8, r9\n\t"
  131152. "adds r3, r3, r6\n\t"
  131153. "adcs r4, r4, r7\n\t"
  131154. "adc r5, r5, #0\n\t"
  131155. #endif
  131156. "str r3, [%[r], #72]\n\t"
  131157. /* A[4] * B[15] */
  131158. "ldr r8, [%[a], #16]\n\t"
  131159. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131160. "lsl r6, r8, #16\n\t"
  131161. "lsl r7, r9, #16\n\t"
  131162. "lsr r6, r6, #16\n\t"
  131163. "lsr r7, r7, #16\n\t"
  131164. "mul r7, r6, r7\n\t"
  131165. "adds r4, r4, r7\n\t"
  131166. "adcs r5, r5, #0\n\t"
  131167. "mov r3, #0\n\t"
  131168. "adc r3, r3, #0\n\t"
  131169. "lsr r7, r9, #16\n\t"
  131170. "mul r6, r7, r6\n\t"
  131171. "lsr r7, r6, #16\n\t"
  131172. "lsl r6, r6, #16\n\t"
  131173. "adds r4, r4, r6\n\t"
  131174. "adcs r5, r5, r7\n\t"
  131175. "adc r3, r3, #0\n\t"
  131176. "lsr r6, r8, #16\n\t"
  131177. "lsr r7, r9, #16\n\t"
  131178. "mul r7, r6, r7\n\t"
  131179. "adds r5, r5, r7\n\t"
  131180. "adc r3, r3, #0\n\t"
  131181. "lsl r7, r9, #16\n\t"
  131182. "lsr r7, r7, #16\n\t"
  131183. "mul r6, r7, r6\n\t"
  131184. "lsr r7, r6, #16\n\t"
  131185. "lsl r6, r6, #16\n\t"
  131186. "adds r4, r4, r6\n\t"
  131187. "adcs r5, r5, r7\n\t"
  131188. "adc r3, r3, #0\n\t"
  131189. #else
  131190. "umull r6, r7, r8, r9\n\t"
  131191. "adds r4, r4, r6\n\t"
  131192. "adcs r5, r5, r7\n\t"
  131193. "mov r3, #0\n\t"
  131194. "adc r3, r3, #0\n\t"
  131195. #endif
  131196. /* A[5] * B[14] */
  131197. "ldr r8, [%[a], #20]\n\t"
  131198. "ldr r9, [%[b], #56]\n\t"
  131199. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131200. "lsl r6, r8, #16\n\t"
  131201. "lsl r7, r9, #16\n\t"
  131202. "lsr r6, r6, #16\n\t"
  131203. "lsr r7, r7, #16\n\t"
  131204. "mul r7, r6, r7\n\t"
  131205. "adds r4, r4, r7\n\t"
  131206. "adcs r5, r5, #0\n\t"
  131207. "adc r3, r3, #0\n\t"
  131208. "lsr r7, r9, #16\n\t"
  131209. "mul r6, r7, r6\n\t"
  131210. "lsr r7, r6, #16\n\t"
  131211. "lsl r6, r6, #16\n\t"
  131212. "adds r4, r4, r6\n\t"
  131213. "adcs r5, r5, r7\n\t"
  131214. "adc r3, r3, #0\n\t"
  131215. "lsr r6, r8, #16\n\t"
  131216. "lsr r7, r9, #16\n\t"
  131217. "mul r7, r6, r7\n\t"
  131218. "adds r5, r5, r7\n\t"
  131219. "adc r3, r3, #0\n\t"
  131220. "lsl r7, r9, #16\n\t"
  131221. "lsr r7, r7, #16\n\t"
  131222. "mul r6, r7, r6\n\t"
  131223. "lsr r7, r6, #16\n\t"
  131224. "lsl r6, r6, #16\n\t"
  131225. "adds r4, r4, r6\n\t"
  131226. "adcs r5, r5, r7\n\t"
  131227. "adc r3, r3, #0\n\t"
  131228. #else
  131229. "umull r6, r7, r8, r9\n\t"
  131230. "adds r4, r4, r6\n\t"
  131231. "adcs r5, r5, r7\n\t"
  131232. "adc r3, r3, #0\n\t"
  131233. #endif
  131234. /* A[6] * B[13] */
  131235. "ldr r8, [%[a], #24]\n\t"
  131236. "ldr r9, [%[b], #52]\n\t"
  131237. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131238. "lsl r6, r8, #16\n\t"
  131239. "lsl r7, r9, #16\n\t"
  131240. "lsr r6, r6, #16\n\t"
  131241. "lsr r7, r7, #16\n\t"
  131242. "mul r7, r6, r7\n\t"
  131243. "adds r4, r4, r7\n\t"
  131244. "adcs r5, r5, #0\n\t"
  131245. "adc r3, r3, #0\n\t"
  131246. "lsr r7, r9, #16\n\t"
  131247. "mul r6, r7, r6\n\t"
  131248. "lsr r7, r6, #16\n\t"
  131249. "lsl r6, r6, #16\n\t"
  131250. "adds r4, r4, r6\n\t"
  131251. "adcs r5, r5, r7\n\t"
  131252. "adc r3, r3, #0\n\t"
  131253. "lsr r6, r8, #16\n\t"
  131254. "lsr r7, r9, #16\n\t"
  131255. "mul r7, r6, r7\n\t"
  131256. "adds r5, r5, r7\n\t"
  131257. "adc r3, r3, #0\n\t"
  131258. "lsl r7, r9, #16\n\t"
  131259. "lsr r7, r7, #16\n\t"
  131260. "mul r6, r7, r6\n\t"
  131261. "lsr r7, r6, #16\n\t"
  131262. "lsl r6, r6, #16\n\t"
  131263. "adds r4, r4, r6\n\t"
  131264. "adcs r5, r5, r7\n\t"
  131265. "adc r3, r3, #0\n\t"
  131266. #else
  131267. "umull r6, r7, r8, r9\n\t"
  131268. "adds r4, r4, r6\n\t"
  131269. "adcs r5, r5, r7\n\t"
  131270. "adc r3, r3, #0\n\t"
  131271. #endif
  131272. /* A[7] * B[12] */
  131273. "ldr r8, [%[a], #28]\n\t"
  131274. "ldr r9, [%[b], #48]\n\t"
  131275. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131276. "lsl r6, r8, #16\n\t"
  131277. "lsl r7, r9, #16\n\t"
  131278. "lsr r6, r6, #16\n\t"
  131279. "lsr r7, r7, #16\n\t"
  131280. "mul r7, r6, r7\n\t"
  131281. "adds r4, r4, r7\n\t"
  131282. "adcs r5, r5, #0\n\t"
  131283. "adc r3, r3, #0\n\t"
  131284. "lsr r7, r9, #16\n\t"
  131285. "mul r6, r7, r6\n\t"
  131286. "lsr r7, r6, #16\n\t"
  131287. "lsl r6, r6, #16\n\t"
  131288. "adds r4, r4, r6\n\t"
  131289. "adcs r5, r5, r7\n\t"
  131290. "adc r3, r3, #0\n\t"
  131291. "lsr r6, r8, #16\n\t"
  131292. "lsr r7, r9, #16\n\t"
  131293. "mul r7, r6, r7\n\t"
  131294. "adds r5, r5, r7\n\t"
  131295. "adc r3, r3, #0\n\t"
  131296. "lsl r7, r9, #16\n\t"
  131297. "lsr r7, r7, #16\n\t"
  131298. "mul r6, r7, r6\n\t"
  131299. "lsr r7, r6, #16\n\t"
  131300. "lsl r6, r6, #16\n\t"
  131301. "adds r4, r4, r6\n\t"
  131302. "adcs r5, r5, r7\n\t"
  131303. "adc r3, r3, #0\n\t"
  131304. #else
  131305. "umull r6, r7, r8, r9\n\t"
  131306. "adds r4, r4, r6\n\t"
  131307. "adcs r5, r5, r7\n\t"
  131308. "adc r3, r3, #0\n\t"
  131309. #endif
  131310. /* A[8] * B[11] */
  131311. "ldr r8, [%[a], #32]\n\t"
  131312. "ldr r9, [%[b], #44]\n\t"
  131313. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131314. "lsl r6, r8, #16\n\t"
  131315. "lsl r7, r9, #16\n\t"
  131316. "lsr r6, r6, #16\n\t"
  131317. "lsr r7, r7, #16\n\t"
  131318. "mul r7, r6, r7\n\t"
  131319. "adds r4, r4, r7\n\t"
  131320. "adcs r5, r5, #0\n\t"
  131321. "adc r3, r3, #0\n\t"
  131322. "lsr r7, r9, #16\n\t"
  131323. "mul r6, r7, r6\n\t"
  131324. "lsr r7, r6, #16\n\t"
  131325. "lsl r6, r6, #16\n\t"
  131326. "adds r4, r4, r6\n\t"
  131327. "adcs r5, r5, r7\n\t"
  131328. "adc r3, r3, #0\n\t"
  131329. "lsr r6, r8, #16\n\t"
  131330. "lsr r7, r9, #16\n\t"
  131331. "mul r7, r6, r7\n\t"
  131332. "adds r5, r5, r7\n\t"
  131333. "adc r3, r3, #0\n\t"
  131334. "lsl r7, r9, #16\n\t"
  131335. "lsr r7, r7, #16\n\t"
  131336. "mul r6, r7, r6\n\t"
  131337. "lsr r7, r6, #16\n\t"
  131338. "lsl r6, r6, #16\n\t"
  131339. "adds r4, r4, r6\n\t"
  131340. "adcs r5, r5, r7\n\t"
  131341. "adc r3, r3, #0\n\t"
  131342. #else
  131343. "umull r6, r7, r8, r9\n\t"
  131344. "adds r4, r4, r6\n\t"
  131345. "adcs r5, r5, r7\n\t"
  131346. "adc r3, r3, #0\n\t"
  131347. #endif
  131348. /* A[9] * B[10] */
  131349. "ldr r9, [%[b], #40]\n\t"
  131350. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131351. "lsl r6, r11, #16\n\t"
  131352. "lsl r7, r9, #16\n\t"
  131353. "lsr r6, r6, #16\n\t"
  131354. "lsr r7, r7, #16\n\t"
  131355. "mul r7, r6, r7\n\t"
  131356. "adds r4, r4, r7\n\t"
  131357. "adcs r5, r5, #0\n\t"
  131358. "adc r3, r3, #0\n\t"
  131359. "lsr r7, r9, #16\n\t"
  131360. "mul r6, r7, r6\n\t"
  131361. "lsr r7, r6, #16\n\t"
  131362. "lsl r6, r6, #16\n\t"
  131363. "adds r4, r4, r6\n\t"
  131364. "adcs r5, r5, r7\n\t"
  131365. "adc r3, r3, #0\n\t"
  131366. "lsr r6, r11, #16\n\t"
  131367. "lsr r7, r9, #16\n\t"
  131368. "mul r7, r6, r7\n\t"
  131369. "adds r5, r5, r7\n\t"
  131370. "adc r3, r3, #0\n\t"
  131371. "lsl r7, r9, #16\n\t"
  131372. "lsr r7, r7, #16\n\t"
  131373. "mul r6, r7, r6\n\t"
  131374. "lsr r7, r6, #16\n\t"
  131375. "lsl r6, r6, #16\n\t"
  131376. "adds r4, r4, r6\n\t"
  131377. "adcs r5, r5, r7\n\t"
  131378. "adc r3, r3, #0\n\t"
  131379. #else
  131380. "umull r6, r7, r11, r9\n\t"
  131381. "adds r4, r4, r6\n\t"
  131382. "adcs r5, r5, r7\n\t"
  131383. "adc r3, r3, #0\n\t"
  131384. #endif
  131385. /* A[10] * B[9] */
  131386. "ldr r8, [%[a], #40]\n\t"
  131387. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131388. "lsl r6, r8, #16\n\t"
  131389. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[11] * B[8] */
  131423. "ldr r8, [%[a], #44]\n\t"
  131424. "ldr r9, [%[b], #32]\n\t"
  131425. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131426. "lsl r6, r8, #16\n\t"
  131427. "lsl r7, r9, #16\n\t"
  131428. "lsr r6, r6, #16\n\t"
  131429. "lsr r7, r7, #16\n\t"
  131430. "mul r7, r6, r7\n\t"
  131431. "adds r4, r4, r7\n\t"
  131432. "adcs r5, r5, #0\n\t"
  131433. "adc r3, r3, #0\n\t"
  131434. "lsr r7, r9, #16\n\t"
  131435. "mul r6, r7, r6\n\t"
  131436. "lsr r7, r6, #16\n\t"
  131437. "lsl r6, r6, #16\n\t"
  131438. "adds r4, r4, r6\n\t"
  131439. "adcs r5, r5, r7\n\t"
  131440. "adc r3, r3, #0\n\t"
  131441. "lsr r6, r8, #16\n\t"
  131442. "lsr r7, r9, #16\n\t"
  131443. "mul r7, r6, r7\n\t"
  131444. "adds r5, r5, r7\n\t"
  131445. "adc r3, r3, #0\n\t"
  131446. "lsl r7, r9, #16\n\t"
  131447. "lsr r7, r7, #16\n\t"
  131448. "mul r6, r7, r6\n\t"
  131449. "lsr r7, r6, #16\n\t"
  131450. "lsl r6, r6, #16\n\t"
  131451. "adds r4, r4, r6\n\t"
  131452. "adcs r5, r5, r7\n\t"
  131453. "adc r3, r3, #0\n\t"
  131454. #else
  131455. "umull r6, r7, r8, r9\n\t"
  131456. "adds r4, r4, r6\n\t"
  131457. "adcs r5, r5, r7\n\t"
  131458. "adc r3, r3, #0\n\t"
  131459. #endif
  131460. /* A[12] * B[7] */
  131461. "ldr r8, [%[a], #48]\n\t"
  131462. "ldr r9, [%[b], #28]\n\t"
  131463. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131464. "lsl r6, r8, #16\n\t"
  131465. "lsl r7, r9, #16\n\t"
  131466. "lsr r6, r6, #16\n\t"
  131467. "lsr r7, r7, #16\n\t"
  131468. "mul r7, r6, r7\n\t"
  131469. "adds r4, r4, r7\n\t"
  131470. "adcs r5, r5, #0\n\t"
  131471. "adc r3, r3, #0\n\t"
  131472. "lsr r7, r9, #16\n\t"
  131473. "mul r6, r7, r6\n\t"
  131474. "lsr r7, r6, #16\n\t"
  131475. "lsl r6, r6, #16\n\t"
  131476. "adds r4, r4, r6\n\t"
  131477. "adcs r5, r5, r7\n\t"
  131478. "adc r3, r3, #0\n\t"
  131479. "lsr r6, r8, #16\n\t"
  131480. "lsr r7, r9, #16\n\t"
  131481. "mul r7, r6, r7\n\t"
  131482. "adds r5, r5, r7\n\t"
  131483. "adc r3, r3, #0\n\t"
  131484. "lsl r7, r9, #16\n\t"
  131485. "lsr r7, r7, #16\n\t"
  131486. "mul r6, r7, r6\n\t"
  131487. "lsr r7, r6, #16\n\t"
  131488. "lsl r6, r6, #16\n\t"
  131489. "adds r4, r4, r6\n\t"
  131490. "adcs r5, r5, r7\n\t"
  131491. "adc r3, r3, #0\n\t"
  131492. #else
  131493. "umull r6, r7, r8, r9\n\t"
  131494. "adds r4, r4, r6\n\t"
  131495. "adcs r5, r5, r7\n\t"
  131496. "adc r3, r3, #0\n\t"
  131497. #endif
  131498. /* A[13] * B[6] */
  131499. "ldr r8, [%[a], #52]\n\t"
  131500. "ldr r9, [%[b], #24]\n\t"
  131501. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131502. "lsl r6, r8, #16\n\t"
  131503. "lsl r7, r9, #16\n\t"
  131504. "lsr r6, r6, #16\n\t"
  131505. "lsr r7, r7, #16\n\t"
  131506. "mul r7, r6, r7\n\t"
  131507. "adds r4, r4, r7\n\t"
  131508. "adcs r5, r5, #0\n\t"
  131509. "adc r3, r3, #0\n\t"
  131510. "lsr r7, r9, #16\n\t"
  131511. "mul r6, r7, r6\n\t"
  131512. "lsr r7, r6, #16\n\t"
  131513. "lsl r6, r6, #16\n\t"
  131514. "adds r4, r4, r6\n\t"
  131515. "adcs r5, r5, r7\n\t"
  131516. "adc r3, r3, #0\n\t"
  131517. "lsr r6, r8, #16\n\t"
  131518. "lsr r7, r9, #16\n\t"
  131519. "mul r7, r6, r7\n\t"
  131520. "adds r5, r5, r7\n\t"
  131521. "adc r3, r3, #0\n\t"
  131522. "lsl r7, r9, #16\n\t"
  131523. "lsr r7, r7, #16\n\t"
  131524. "mul r6, r7, r6\n\t"
  131525. "lsr r7, r6, #16\n\t"
  131526. "lsl r6, r6, #16\n\t"
  131527. "adds r4, r4, r6\n\t"
  131528. "adcs r5, r5, r7\n\t"
  131529. "adc r3, r3, #0\n\t"
  131530. #else
  131531. "umull r6, r7, r8, r9\n\t"
  131532. "adds r4, r4, r6\n\t"
  131533. "adcs r5, r5, r7\n\t"
  131534. "adc r3, r3, #0\n\t"
  131535. #endif
  131536. /* A[14] * B[5] */
  131537. "ldr r8, [%[a], #56]\n\t"
  131538. "ldr r9, [%[b], #20]\n\t"
  131539. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131540. "lsl r6, r8, #16\n\t"
  131541. "lsl r7, r9, #16\n\t"
  131542. "lsr r6, r6, #16\n\t"
  131543. "lsr r7, r7, #16\n\t"
  131544. "mul r7, r6, r7\n\t"
  131545. "adds r4, r4, r7\n\t"
  131546. "adcs r5, r5, #0\n\t"
  131547. "adc r3, r3, #0\n\t"
  131548. "lsr r7, r9, #16\n\t"
  131549. "mul r6, r7, r6\n\t"
  131550. "lsr r7, r6, #16\n\t"
  131551. "lsl r6, r6, #16\n\t"
  131552. "adds r4, r4, r6\n\t"
  131553. "adcs r5, r5, r7\n\t"
  131554. "adc r3, r3, #0\n\t"
  131555. "lsr r6, r8, #16\n\t"
  131556. "lsr r7, r9, #16\n\t"
  131557. "mul r7, r6, r7\n\t"
  131558. "adds r5, r5, r7\n\t"
  131559. "adc r3, r3, #0\n\t"
  131560. "lsl r7, r9, #16\n\t"
  131561. "lsr r7, r7, #16\n\t"
  131562. "mul r6, r7, r6\n\t"
  131563. "lsr r7, r6, #16\n\t"
  131564. "lsl r6, r6, #16\n\t"
  131565. "adds r4, r4, r6\n\t"
  131566. "adcs r5, r5, r7\n\t"
  131567. "adc r3, r3, #0\n\t"
  131568. #else
  131569. "umull r6, r7, r8, r9\n\t"
  131570. "adds r4, r4, r6\n\t"
  131571. "adcs r5, r5, r7\n\t"
  131572. "adc r3, r3, #0\n\t"
  131573. #endif
  131574. /* A[15] * B[4] */
  131575. "ldr r8, [%[a], #60]\n\t"
  131576. "ldr r9, [%[b], #16]\n\t"
  131577. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131578. "lsl r6, r8, #16\n\t"
  131579. "lsl r7, r9, #16\n\t"
  131580. "lsr r6, r6, #16\n\t"
  131581. "lsr r7, r7, #16\n\t"
  131582. "mul r7, r6, r7\n\t"
  131583. "adds r4, r4, r7\n\t"
  131584. "adcs r5, r5, #0\n\t"
  131585. "adc r3, r3, #0\n\t"
  131586. "lsr r7, r9, #16\n\t"
  131587. "mul r6, r7, r6\n\t"
  131588. "lsr r7, r6, #16\n\t"
  131589. "lsl r6, r6, #16\n\t"
  131590. "adds r4, r4, r6\n\t"
  131591. "adcs r5, r5, r7\n\t"
  131592. "adc r3, r3, #0\n\t"
  131593. "lsr r6, r8, #16\n\t"
  131594. "lsr r7, r9, #16\n\t"
  131595. "mul r7, r6, r7\n\t"
  131596. "adds r5, r5, r7\n\t"
  131597. "adc r3, r3, #0\n\t"
  131598. "lsl r7, r9, #16\n\t"
  131599. "lsr r7, r7, #16\n\t"
  131600. "mul r6, r7, r6\n\t"
  131601. "lsr r7, r6, #16\n\t"
  131602. "lsl r6, r6, #16\n\t"
  131603. "adds r4, r4, r6\n\t"
  131604. "adcs r5, r5, r7\n\t"
  131605. "adc r3, r3, #0\n\t"
  131606. #else
  131607. "umull r6, r7, r8, r9\n\t"
  131608. "adds r4, r4, r6\n\t"
  131609. "adcs r5, r5, r7\n\t"
  131610. "adc r3, r3, #0\n\t"
  131611. #endif
  131612. "str r4, [%[r], #76]\n\t"
  131613. /* A[15] * B[5] */
  131614. "ldr r9, [%[b], #20]\n\t"
  131615. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131616. "lsl r6, r8, #16\n\t"
  131617. "lsl r7, r9, #16\n\t"
  131618. "lsr r6, r6, #16\n\t"
  131619. "lsr r7, r7, #16\n\t"
  131620. "mul r7, r6, r7\n\t"
  131621. "adds r5, r5, r7\n\t"
  131622. "adcs r3, r3, #0\n\t"
  131623. "mov r4, #0\n\t"
  131624. "adc r4, r4, #0\n\t"
  131625. "lsr r7, r9, #16\n\t"
  131626. "mul r6, r7, r6\n\t"
  131627. "lsr r7, r6, #16\n\t"
  131628. "lsl r6, r6, #16\n\t"
  131629. "adds r5, r5, r6\n\t"
  131630. "adcs r3, r3, r7\n\t"
  131631. "adc r4, r4, #0\n\t"
  131632. "lsr r6, r8, #16\n\t"
  131633. "lsr r7, r9, #16\n\t"
  131634. "mul r7, r6, r7\n\t"
  131635. "adds r3, r3, r7\n\t"
  131636. "adc r4, r4, #0\n\t"
  131637. "lsl r7, r9, #16\n\t"
  131638. "lsr r7, r7, #16\n\t"
  131639. "mul r6, r7, r6\n\t"
  131640. "lsr r7, r6, #16\n\t"
  131641. "lsl r6, r6, #16\n\t"
  131642. "adds r5, r5, r6\n\t"
  131643. "adcs r3, r3, r7\n\t"
  131644. "adc r4, r4, #0\n\t"
  131645. #else
  131646. "umull r6, r7, r8, r9\n\t"
  131647. "adds r5, r5, r6\n\t"
  131648. "adcs r3, r3, r7\n\t"
  131649. "mov r4, #0\n\t"
  131650. "adc r4, r4, #0\n\t"
  131651. #endif
  131652. /* A[14] * B[6] */
  131653. "ldr r8, [%[a], #56]\n\t"
  131654. "ldr r9, [%[b], #24]\n\t"
  131655. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131656. "lsl r6, r8, #16\n\t"
  131657. "lsl r7, r9, #16\n\t"
  131658. "lsr r6, r6, #16\n\t"
  131659. "lsr r7, r7, #16\n\t"
  131660. "mul r7, r6, r7\n\t"
  131661. "adds r5, r5, r7\n\t"
  131662. "adcs r3, r3, #0\n\t"
  131663. "adc r4, r4, #0\n\t"
  131664. "lsr r7, r9, #16\n\t"
  131665. "mul r6, r7, r6\n\t"
  131666. "lsr r7, r6, #16\n\t"
  131667. "lsl r6, r6, #16\n\t"
  131668. "adds r5, r5, r6\n\t"
  131669. "adcs r3, r3, r7\n\t"
  131670. "adc r4, r4, #0\n\t"
  131671. "lsr r6, r8, #16\n\t"
  131672. "lsr r7, r9, #16\n\t"
  131673. "mul r7, r6, r7\n\t"
  131674. "adds r3, r3, r7\n\t"
  131675. "adc r4, r4, #0\n\t"
  131676. "lsl r7, r9, #16\n\t"
  131677. "lsr r7, r7, #16\n\t"
  131678. "mul r6, r7, r6\n\t"
  131679. "lsr r7, r6, #16\n\t"
  131680. "lsl r6, r6, #16\n\t"
  131681. "adds r5, r5, r6\n\t"
  131682. "adcs r3, r3, r7\n\t"
  131683. "adc r4, r4, #0\n\t"
  131684. #else
  131685. "umull r6, r7, r8, r9\n\t"
  131686. "adds r5, r5, r6\n\t"
  131687. "adcs r3, r3, r7\n\t"
  131688. "adc r4, r4, #0\n\t"
  131689. #endif
  131690. /* A[13] * B[7] */
  131691. "ldr r8, [%[a], #52]\n\t"
  131692. "ldr r9, [%[b], #28]\n\t"
  131693. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131694. "lsl r6, r8, #16\n\t"
  131695. "lsl r7, r9, #16\n\t"
  131696. "lsr r6, r6, #16\n\t"
  131697. "lsr r7, r7, #16\n\t"
  131698. "mul r7, r6, r7\n\t"
  131699. "adds r5, r5, r7\n\t"
  131700. "adcs r3, r3, #0\n\t"
  131701. "adc r4, r4, #0\n\t"
  131702. "lsr r7, r9, #16\n\t"
  131703. "mul r6, r7, r6\n\t"
  131704. "lsr r7, r6, #16\n\t"
  131705. "lsl r6, r6, #16\n\t"
  131706. "adds r5, r5, r6\n\t"
  131707. "adcs r3, r3, r7\n\t"
  131708. "adc r4, r4, #0\n\t"
  131709. "lsr r6, r8, #16\n\t"
  131710. "lsr r7, r9, #16\n\t"
  131711. "mul r7, r6, r7\n\t"
  131712. "adds r3, r3, r7\n\t"
  131713. "adc r4, r4, #0\n\t"
  131714. "lsl r7, r9, #16\n\t"
  131715. "lsr r7, r7, #16\n\t"
  131716. "mul r6, r7, r6\n\t"
  131717. "lsr r7, r6, #16\n\t"
  131718. "lsl r6, r6, #16\n\t"
  131719. "adds r5, r5, r6\n\t"
  131720. "adcs r3, r3, r7\n\t"
  131721. "adc r4, r4, #0\n\t"
  131722. #else
  131723. "umull r6, r7, r8, r9\n\t"
  131724. "adds r5, r5, r6\n\t"
  131725. "adcs r3, r3, r7\n\t"
  131726. "adc r4, r4, #0\n\t"
  131727. #endif
  131728. /* A[12] * B[8] */
  131729. "ldr r8, [%[a], #48]\n\t"
  131730. "ldr r9, [%[b], #32]\n\t"
  131731. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131732. "lsl r6, r8, #16\n\t"
  131733. "lsl r7, r9, #16\n\t"
  131734. "lsr r6, r6, #16\n\t"
  131735. "lsr r7, r7, #16\n\t"
  131736. "mul r7, r6, r7\n\t"
  131737. "adds r5, r5, r7\n\t"
  131738. "adcs r3, r3, #0\n\t"
  131739. "adc r4, r4, #0\n\t"
  131740. "lsr r7, r9, #16\n\t"
  131741. "mul r6, r7, r6\n\t"
  131742. "lsr r7, r6, #16\n\t"
  131743. "lsl r6, r6, #16\n\t"
  131744. "adds r5, r5, r6\n\t"
  131745. "adcs r3, r3, r7\n\t"
  131746. "adc r4, r4, #0\n\t"
  131747. "lsr r6, r8, #16\n\t"
  131748. "lsr r7, r9, #16\n\t"
  131749. "mul r7, r6, r7\n\t"
  131750. "adds r3, r3, r7\n\t"
  131751. "adc r4, r4, #0\n\t"
  131752. "lsl r7, r9, #16\n\t"
  131753. "lsr r7, r7, #16\n\t"
  131754. "mul r6, r7, r6\n\t"
  131755. "lsr r7, r6, #16\n\t"
  131756. "lsl r6, r6, #16\n\t"
  131757. "adds r5, r5, r6\n\t"
  131758. "adcs r3, r3, r7\n\t"
  131759. "adc r4, r4, #0\n\t"
  131760. #else
  131761. "umull r6, r7, r8, r9\n\t"
  131762. "adds r5, r5, r6\n\t"
  131763. "adcs r3, r3, r7\n\t"
  131764. "adc r4, r4, #0\n\t"
  131765. #endif
  131766. /* A[11] * B[9] */
  131767. "ldr r8, [%[a], #44]\n\t"
  131768. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131769. "lsl r6, r8, #16\n\t"
  131770. "lsl r7, r12, #16\n\t"
  131771. "lsr r6, r6, #16\n\t"
  131772. "lsr r7, r7, #16\n\t"
  131773. "mul r7, r6, r7\n\t"
  131774. "adds r5, r5, r7\n\t"
  131775. "adcs r3, r3, #0\n\t"
  131776. "adc r4, r4, #0\n\t"
  131777. "lsr r7, r12, #16\n\t"
  131778. "mul r6, r7, r6\n\t"
  131779. "lsr r7, r6, #16\n\t"
  131780. "lsl r6, r6, #16\n\t"
  131781. "adds r5, r5, r6\n\t"
  131782. "adcs r3, r3, r7\n\t"
  131783. "adc r4, r4, #0\n\t"
  131784. "lsr r6, r8, #16\n\t"
  131785. "lsr r7, r12, #16\n\t"
  131786. "mul r7, r6, r7\n\t"
  131787. "adds r3, r3, r7\n\t"
  131788. "adc r4, r4, #0\n\t"
  131789. "lsl r7, r12, #16\n\t"
  131790. "lsr r7, r7, #16\n\t"
  131791. "mul r6, r7, r6\n\t"
  131792. "lsr r7, r6, #16\n\t"
  131793. "lsl r6, r6, #16\n\t"
  131794. "adds r5, r5, r6\n\t"
  131795. "adcs r3, r3, r7\n\t"
  131796. "adc r4, r4, #0\n\t"
  131797. #else
  131798. "umull r6, r7, r8, r12\n\t"
  131799. "adds r5, r5, r6\n\t"
  131800. "adcs r3, r3, r7\n\t"
  131801. "adc r4, r4, #0\n\t"
  131802. #endif
  131803. /* A[10] * B[10] */
  131804. "ldr r11, [%[a], #40]\n\t"
  131805. "ldr r12, [%[b], #40]\n\t"
  131806. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131807. "lsl r6, r11, #16\n\t"
  131808. "lsl r7, r12, #16\n\t"
  131809. "lsr r6, r6, #16\n\t"
  131810. "lsr r7, r7, #16\n\t"
  131811. "mul r7, r6, r7\n\t"
  131812. "adds r5, r5, r7\n\t"
  131813. "adcs r3, r3, #0\n\t"
  131814. "adc r4, r4, #0\n\t"
  131815. "lsr r7, r12, #16\n\t"
  131816. "mul r6, r7, r6\n\t"
  131817. "lsr r7, r6, #16\n\t"
  131818. "lsl r6, r6, #16\n\t"
  131819. "adds r5, r5, r6\n\t"
  131820. "adcs r3, r3, r7\n\t"
  131821. "adc r4, r4, #0\n\t"
  131822. "lsr r6, r11, #16\n\t"
  131823. "lsr r7, r12, #16\n\t"
  131824. "mul r7, r6, r7\n\t"
  131825. "adds r3, r3, r7\n\t"
  131826. "adc r4, r4, #0\n\t"
  131827. "lsl r7, r12, #16\n\t"
  131828. "lsr r7, r7, #16\n\t"
  131829. "mul r6, r7, r6\n\t"
  131830. "lsr r7, r6, #16\n\t"
  131831. "lsl r6, r6, #16\n\t"
  131832. "adds r5, r5, r6\n\t"
  131833. "adcs r3, r3, r7\n\t"
  131834. "adc r4, r4, #0\n\t"
  131835. #else
  131836. "umull r6, r7, r11, r12\n\t"
  131837. "adds r5, r5, r6\n\t"
  131838. "adcs r3, r3, r7\n\t"
  131839. "adc r4, r4, #0\n\t"
  131840. #endif
  131841. /* A[9] * B[11] */
  131842. "ldr r8, [%[a], #36]\n\t"
  131843. "ldr r9, [%[b], #44]\n\t"
  131844. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131845. "lsl r6, r8, #16\n\t"
  131846. "lsl r7, r9, #16\n\t"
  131847. "lsr r6, r6, #16\n\t"
  131848. "lsr r7, r7, #16\n\t"
  131849. "mul r7, r6, r7\n\t"
  131850. "adds r5, r5, r7\n\t"
  131851. "adcs r3, r3, #0\n\t"
  131852. "adc r4, r4, #0\n\t"
  131853. "lsr r7, r9, #16\n\t"
  131854. "mul r6, r7, r6\n\t"
  131855. "lsr r7, r6, #16\n\t"
  131856. "lsl r6, r6, #16\n\t"
  131857. "adds r5, r5, r6\n\t"
  131858. "adcs r3, r3, r7\n\t"
  131859. "adc r4, r4, #0\n\t"
  131860. "lsr r6, r8, #16\n\t"
  131861. "lsr r7, r9, #16\n\t"
  131862. "mul r7, r6, r7\n\t"
  131863. "adds r3, r3, r7\n\t"
  131864. "adc r4, r4, #0\n\t"
  131865. "lsl r7, r9, #16\n\t"
  131866. "lsr r7, r7, #16\n\t"
  131867. "mul r6, r7, r6\n\t"
  131868. "lsr r7, r6, #16\n\t"
  131869. "lsl r6, r6, #16\n\t"
  131870. "adds r5, r5, r6\n\t"
  131871. "adcs r3, r3, r7\n\t"
  131872. "adc r4, r4, #0\n\t"
  131873. #else
  131874. "umull r6, r7, r8, r9\n\t"
  131875. "adds r5, r5, r6\n\t"
  131876. "adcs r3, r3, r7\n\t"
  131877. "adc r4, r4, #0\n\t"
  131878. #endif
  131879. /* A[8] * B[12] */
  131880. "ldr r8, [%[a], #32]\n\t"
  131881. "ldr r9, [%[b], #48]\n\t"
  131882. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131883. "lsl r6, r8, #16\n\t"
  131884. "lsl r7, r9, #16\n\t"
  131885. "lsr r6, r6, #16\n\t"
  131886. "lsr r7, r7, #16\n\t"
  131887. "mul r7, r6, r7\n\t"
  131888. "adds r5, r5, r7\n\t"
  131889. "adcs r3, r3, #0\n\t"
  131890. "adc r4, r4, #0\n\t"
  131891. "lsr r7, r9, #16\n\t"
  131892. "mul r6, r7, r6\n\t"
  131893. "lsr r7, r6, #16\n\t"
  131894. "lsl r6, r6, #16\n\t"
  131895. "adds r5, r5, r6\n\t"
  131896. "adcs r3, r3, r7\n\t"
  131897. "adc r4, r4, #0\n\t"
  131898. "lsr r6, r8, #16\n\t"
  131899. "lsr r7, r9, #16\n\t"
  131900. "mul r7, r6, r7\n\t"
  131901. "adds r3, r3, r7\n\t"
  131902. "adc r4, r4, #0\n\t"
  131903. "lsl r7, r9, #16\n\t"
  131904. "lsr r7, r7, #16\n\t"
  131905. "mul r6, r7, r6\n\t"
  131906. "lsr r7, r6, #16\n\t"
  131907. "lsl r6, r6, #16\n\t"
  131908. "adds r5, r5, r6\n\t"
  131909. "adcs r3, r3, r7\n\t"
  131910. "adc r4, r4, #0\n\t"
  131911. #else
  131912. "umull r6, r7, r8, r9\n\t"
  131913. "adds r5, r5, r6\n\t"
  131914. "adcs r3, r3, r7\n\t"
  131915. "adc r4, r4, #0\n\t"
  131916. #endif
  131917. /* A[7] * B[13] */
  131918. "ldr r8, [%[a], #28]\n\t"
  131919. "ldr r9, [%[b], #52]\n\t"
  131920. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131921. "lsl r6, r8, #16\n\t"
  131922. "lsl r7, r9, #16\n\t"
  131923. "lsr r6, r6, #16\n\t"
  131924. "lsr r7, r7, #16\n\t"
  131925. "mul r7, r6, r7\n\t"
  131926. "adds r5, r5, r7\n\t"
  131927. "adcs r3, r3, #0\n\t"
  131928. "adc r4, r4, #0\n\t"
  131929. "lsr r7, r9, #16\n\t"
  131930. "mul r6, r7, r6\n\t"
  131931. "lsr r7, r6, #16\n\t"
  131932. "lsl r6, r6, #16\n\t"
  131933. "adds r5, r5, r6\n\t"
  131934. "adcs r3, r3, r7\n\t"
  131935. "adc r4, r4, #0\n\t"
  131936. "lsr r6, r8, #16\n\t"
  131937. "lsr r7, r9, #16\n\t"
  131938. "mul r7, r6, r7\n\t"
  131939. "adds r3, r3, r7\n\t"
  131940. "adc r4, r4, #0\n\t"
  131941. "lsl r7, r9, #16\n\t"
  131942. "lsr r7, r7, #16\n\t"
  131943. "mul r6, r7, r6\n\t"
  131944. "lsr r7, r6, #16\n\t"
  131945. "lsl r6, r6, #16\n\t"
  131946. "adds r5, r5, r6\n\t"
  131947. "adcs r3, r3, r7\n\t"
  131948. "adc r4, r4, #0\n\t"
  131949. #else
  131950. "umull r6, r7, r8, r9\n\t"
  131951. "adds r5, r5, r6\n\t"
  131952. "adcs r3, r3, r7\n\t"
  131953. "adc r4, r4, #0\n\t"
  131954. #endif
  131955. /* A[6] * B[14] */
  131956. "ldr r8, [%[a], #24]\n\t"
  131957. "ldr r9, [%[b], #56]\n\t"
  131958. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131959. "lsl r6, r8, #16\n\t"
  131960. "lsl r7, r9, #16\n\t"
  131961. "lsr r6, r6, #16\n\t"
  131962. "lsr r7, r7, #16\n\t"
  131963. "mul r7, r6, r7\n\t"
  131964. "adds r5, r5, r7\n\t"
  131965. "adcs r3, r3, #0\n\t"
  131966. "adc r4, r4, #0\n\t"
  131967. "lsr r7, r9, #16\n\t"
  131968. "mul r6, r7, r6\n\t"
  131969. "lsr r7, r6, #16\n\t"
  131970. "lsl r6, r6, #16\n\t"
  131971. "adds r5, r5, r6\n\t"
  131972. "adcs r3, r3, r7\n\t"
  131973. "adc r4, r4, #0\n\t"
  131974. "lsr r6, r8, #16\n\t"
  131975. "lsr r7, r9, #16\n\t"
  131976. "mul r7, r6, r7\n\t"
  131977. "adds r3, r3, r7\n\t"
  131978. "adc r4, r4, #0\n\t"
  131979. "lsl r7, r9, #16\n\t"
  131980. "lsr r7, r7, #16\n\t"
  131981. "mul r6, r7, r6\n\t"
  131982. "lsr r7, r6, #16\n\t"
  131983. "lsl r6, r6, #16\n\t"
  131984. "adds r5, r5, r6\n\t"
  131985. "adcs r3, r3, r7\n\t"
  131986. "adc r4, r4, #0\n\t"
  131987. #else
  131988. "umull r6, r7, r8, r9\n\t"
  131989. "adds r5, r5, r6\n\t"
  131990. "adcs r3, r3, r7\n\t"
  131991. "adc r4, r4, #0\n\t"
  131992. #endif
  131993. /* A[5] * B[15] */
  131994. "ldr r8, [%[a], #20]\n\t"
  131995. "ldr r9, [%[b], #60]\n\t"
  131996. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  131997. "lsl r6, r8, #16\n\t"
  131998. "lsl r7, r9, #16\n\t"
  131999. "lsr r6, r6, #16\n\t"
  132000. "lsr r7, r7, #16\n\t"
  132001. "mul r7, r6, r7\n\t"
  132002. "adds r5, r5, r7\n\t"
  132003. "adcs r3, r3, #0\n\t"
  132004. "adc r4, r4, #0\n\t"
  132005. "lsr r7, r9, #16\n\t"
  132006. "mul r6, r7, r6\n\t"
  132007. "lsr r7, r6, #16\n\t"
  132008. "lsl r6, r6, #16\n\t"
  132009. "adds r5, r5, r6\n\t"
  132010. "adcs r3, r3, r7\n\t"
  132011. "adc r4, r4, #0\n\t"
  132012. "lsr r6, r8, #16\n\t"
  132013. "lsr r7, r9, #16\n\t"
  132014. "mul r7, r6, r7\n\t"
  132015. "adds r3, r3, r7\n\t"
  132016. "adc r4, r4, #0\n\t"
  132017. "lsl r7, r9, #16\n\t"
  132018. "lsr r7, r7, #16\n\t"
  132019. "mul r6, r7, r6\n\t"
  132020. "lsr r7, r6, #16\n\t"
  132021. "lsl r6, r6, #16\n\t"
  132022. "adds r5, r5, r6\n\t"
  132023. "adcs r3, r3, r7\n\t"
  132024. "adc r4, r4, #0\n\t"
  132025. #else
  132026. "umull r6, r7, r8, r9\n\t"
  132027. "adds r5, r5, r6\n\t"
  132028. "adcs r3, r3, r7\n\t"
  132029. "adc r4, r4, #0\n\t"
  132030. #endif
  132031. "str r5, [%[r], #80]\n\t"
  132032. /* A[6] * B[15] */
  132033. "ldr r8, [%[a], #24]\n\t"
  132034. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132035. "lsl r6, r8, #16\n\t"
  132036. "lsl r7, r9, #16\n\t"
  132037. "lsr r6, r6, #16\n\t"
  132038. "lsr r7, r7, #16\n\t"
  132039. "mul r7, r6, r7\n\t"
  132040. "adds r3, r3, r7\n\t"
  132041. "adcs r4, r4, #0\n\t"
  132042. "mov r5, #0\n\t"
  132043. "adc r5, r5, #0\n\t"
  132044. "lsr r7, r9, #16\n\t"
  132045. "mul r6, r7, r6\n\t"
  132046. "lsr r7, r6, #16\n\t"
  132047. "lsl r6, r6, #16\n\t"
  132048. "adds r3, r3, r6\n\t"
  132049. "adcs r4, r4, r7\n\t"
  132050. "adc r5, r5, #0\n\t"
  132051. "lsr r6, r8, #16\n\t"
  132052. "lsr r7, r9, #16\n\t"
  132053. "mul r7, r6, r7\n\t"
  132054. "adds r4, r4, r7\n\t"
  132055. "adc r5, r5, #0\n\t"
  132056. "lsl r7, r9, #16\n\t"
  132057. "lsr r7, r7, #16\n\t"
  132058. "mul r6, r7, r6\n\t"
  132059. "lsr r7, r6, #16\n\t"
  132060. "lsl r6, r6, #16\n\t"
  132061. "adds r3, r3, r6\n\t"
  132062. "adcs r4, r4, r7\n\t"
  132063. "adc r5, r5, #0\n\t"
  132064. #else
  132065. "umull r6, r7, r8, r9\n\t"
  132066. "adds r3, r3, r6\n\t"
  132067. "adcs r4, r4, r7\n\t"
  132068. "mov r5, #0\n\t"
  132069. "adc r5, r5, #0\n\t"
  132070. #endif
  132071. /* A[7] * B[14] */
  132072. "ldr r8, [%[a], #28]\n\t"
  132073. "ldr r9, [%[b], #56]\n\t"
  132074. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132075. "lsl r6, r8, #16\n\t"
  132076. "lsl r7, r9, #16\n\t"
  132077. "lsr r6, r6, #16\n\t"
  132078. "lsr r7, r7, #16\n\t"
  132079. "mul r7, r6, r7\n\t"
  132080. "adds r3, r3, r7\n\t"
  132081. "adcs r4, r4, #0\n\t"
  132082. "adc r5, r5, #0\n\t"
  132083. "lsr r7, r9, #16\n\t"
  132084. "mul r6, r7, r6\n\t"
  132085. "lsr r7, r6, #16\n\t"
  132086. "lsl r6, r6, #16\n\t"
  132087. "adds r3, r3, r6\n\t"
  132088. "adcs r4, r4, r7\n\t"
  132089. "adc r5, r5, #0\n\t"
  132090. "lsr r6, r8, #16\n\t"
  132091. "lsr r7, r9, #16\n\t"
  132092. "mul r7, r6, r7\n\t"
  132093. "adds r4, r4, r7\n\t"
  132094. "adc r5, r5, #0\n\t"
  132095. "lsl r7, r9, #16\n\t"
  132096. "lsr r7, r7, #16\n\t"
  132097. "mul r6, r7, r6\n\t"
  132098. "lsr r7, r6, #16\n\t"
  132099. "lsl r6, r6, #16\n\t"
  132100. "adds r3, r3, r6\n\t"
  132101. "adcs r4, r4, r7\n\t"
  132102. "adc r5, r5, #0\n\t"
  132103. #else
  132104. "umull r6, r7, r8, r9\n\t"
  132105. "adds r3, r3, r6\n\t"
  132106. "adcs r4, r4, r7\n\t"
  132107. "adc r5, r5, #0\n\t"
  132108. #endif
  132109. /* A[8] * B[13] */
  132110. "ldr r8, [%[a], #32]\n\t"
  132111. "ldr r9, [%[b], #52]\n\t"
  132112. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132113. "lsl r6, r8, #16\n\t"
  132114. "lsl r7, r9, #16\n\t"
  132115. "lsr r6, r6, #16\n\t"
  132116. "lsr r7, r7, #16\n\t"
  132117. "mul r7, r6, r7\n\t"
  132118. "adds r3, r3, r7\n\t"
  132119. "adcs r4, r4, #0\n\t"
  132120. "adc r5, r5, #0\n\t"
  132121. "lsr r7, r9, #16\n\t"
  132122. "mul r6, r7, r6\n\t"
  132123. "lsr r7, r6, #16\n\t"
  132124. "lsl r6, r6, #16\n\t"
  132125. "adds r3, r3, r6\n\t"
  132126. "adcs r4, r4, r7\n\t"
  132127. "adc r5, r5, #0\n\t"
  132128. "lsr r6, r8, #16\n\t"
  132129. "lsr r7, r9, #16\n\t"
  132130. "mul r7, r6, r7\n\t"
  132131. "adds r4, r4, r7\n\t"
  132132. "adc r5, r5, #0\n\t"
  132133. "lsl r7, r9, #16\n\t"
  132134. "lsr r7, r7, #16\n\t"
  132135. "mul r6, r7, r6\n\t"
  132136. "lsr r7, r6, #16\n\t"
  132137. "lsl r6, r6, #16\n\t"
  132138. "adds r3, r3, r6\n\t"
  132139. "adcs r4, r4, r7\n\t"
  132140. "adc r5, r5, #0\n\t"
  132141. #else
  132142. "umull r6, r7, r8, r9\n\t"
  132143. "adds r3, r3, r6\n\t"
  132144. "adcs r4, r4, r7\n\t"
  132145. "adc r5, r5, #0\n\t"
  132146. #endif
  132147. /* A[9] * B[12] */
  132148. "ldr r8, [%[a], #36]\n\t"
  132149. "ldr r9, [%[b], #48]\n\t"
  132150. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132151. "lsl r6, r8, #16\n\t"
  132152. "lsl r7, r9, #16\n\t"
  132153. "lsr r6, r6, #16\n\t"
  132154. "lsr r7, r7, #16\n\t"
  132155. "mul r7, r6, r7\n\t"
  132156. "adds r3, r3, r7\n\t"
  132157. "adcs r4, r4, #0\n\t"
  132158. "adc r5, r5, #0\n\t"
  132159. "lsr r7, r9, #16\n\t"
  132160. "mul r6, r7, r6\n\t"
  132161. "lsr r7, r6, #16\n\t"
  132162. "lsl r6, r6, #16\n\t"
  132163. "adds r3, r3, r6\n\t"
  132164. "adcs r4, r4, r7\n\t"
  132165. "adc r5, r5, #0\n\t"
  132166. "lsr r6, r8, #16\n\t"
  132167. "lsr r7, r9, #16\n\t"
  132168. "mul r7, r6, r7\n\t"
  132169. "adds r4, r4, r7\n\t"
  132170. "adc r5, r5, #0\n\t"
  132171. "lsl r7, r9, #16\n\t"
  132172. "lsr r7, r7, #16\n\t"
  132173. "mul r6, r7, r6\n\t"
  132174. "lsr r7, r6, #16\n\t"
  132175. "lsl r6, r6, #16\n\t"
  132176. "adds r3, r3, r6\n\t"
  132177. "adcs r4, r4, r7\n\t"
  132178. "adc r5, r5, #0\n\t"
  132179. #else
  132180. "umull r6, r7, r8, r9\n\t"
  132181. "adds r3, r3, r6\n\t"
  132182. "adcs r4, r4, r7\n\t"
  132183. "adc r5, r5, #0\n\t"
  132184. #endif
  132185. /* A[10] * B[11] */
  132186. "ldr r9, [%[b], #44]\n\t"
  132187. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132188. "lsl r6, r11, #16\n\t"
  132189. "lsl r7, r9, #16\n\t"
  132190. "lsr r6, r6, #16\n\t"
  132191. "lsr r7, r7, #16\n\t"
  132192. "mul r7, r6, r7\n\t"
  132193. "adds r3, r3, r7\n\t"
  132194. "adcs r4, r4, #0\n\t"
  132195. "adc r5, r5, #0\n\t"
  132196. "lsr r7, r9, #16\n\t"
  132197. "mul r6, r7, r6\n\t"
  132198. "lsr r7, r6, #16\n\t"
  132199. "lsl r6, r6, #16\n\t"
  132200. "adds r3, r3, r6\n\t"
  132201. "adcs r4, r4, r7\n\t"
  132202. "adc r5, r5, #0\n\t"
  132203. "lsr r6, r11, #16\n\t"
  132204. "lsr r7, r9, #16\n\t"
  132205. "mul r7, r6, r7\n\t"
  132206. "adds r4, r4, r7\n\t"
  132207. "adc r5, r5, #0\n\t"
  132208. "lsl r7, r9, #16\n\t"
  132209. "lsr r7, r7, #16\n\t"
  132210. "mul r6, r7, r6\n\t"
  132211. "lsr r7, r6, #16\n\t"
  132212. "lsl r6, r6, #16\n\t"
  132213. "adds r3, r3, r6\n\t"
  132214. "adcs r4, r4, r7\n\t"
  132215. "adc r5, r5, #0\n\t"
  132216. #else
  132217. "umull r6, r7, r11, r9\n\t"
  132218. "adds r3, r3, r6\n\t"
  132219. "adcs r4, r4, r7\n\t"
  132220. "adc r5, r5, #0\n\t"
  132221. #endif
  132222. /* A[11] * B[10] */
  132223. "ldr r8, [%[a], #44]\n\t"
  132224. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132225. "lsl r6, r8, #16\n\t"
  132226. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[12] * B[9] */
  132260. "ldr r8, [%[a], #48]\n\t"
  132261. "ldr r9, [%[b], #36]\n\t"
  132262. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132263. "lsl r6, r8, #16\n\t"
  132264. "lsl r7, r9, #16\n\t"
  132265. "lsr r6, r6, #16\n\t"
  132266. "lsr r7, r7, #16\n\t"
  132267. "mul r7, r6, r7\n\t"
  132268. "adds r3, r3, r7\n\t"
  132269. "adcs r4, r4, #0\n\t"
  132270. "adc r5, r5, #0\n\t"
  132271. "lsr r7, r9, #16\n\t"
  132272. "mul r6, r7, r6\n\t"
  132273. "lsr r7, r6, #16\n\t"
  132274. "lsl r6, r6, #16\n\t"
  132275. "adds r3, r3, r6\n\t"
  132276. "adcs r4, r4, r7\n\t"
  132277. "adc r5, r5, #0\n\t"
  132278. "lsr r6, r8, #16\n\t"
  132279. "lsr r7, r9, #16\n\t"
  132280. "mul r7, r6, r7\n\t"
  132281. "adds r4, r4, r7\n\t"
  132282. "adc r5, r5, #0\n\t"
  132283. "lsl r7, r9, #16\n\t"
  132284. "lsr r7, r7, #16\n\t"
  132285. "mul r6, r7, r6\n\t"
  132286. "lsr r7, r6, #16\n\t"
  132287. "lsl r6, r6, #16\n\t"
  132288. "adds r3, r3, r6\n\t"
  132289. "adcs r4, r4, r7\n\t"
  132290. "adc r5, r5, #0\n\t"
  132291. #else
  132292. "umull r6, r7, r8, r9\n\t"
  132293. "adds r3, r3, r6\n\t"
  132294. "adcs r4, r4, r7\n\t"
  132295. "adc r5, r5, #0\n\t"
  132296. #endif
  132297. /* A[13] * B[8] */
  132298. "ldr r8, [%[a], #52]\n\t"
  132299. "ldr r9, [%[b], #32]\n\t"
  132300. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132301. "lsl r6, r8, #16\n\t"
  132302. "lsl r7, r9, #16\n\t"
  132303. "lsr r6, r6, #16\n\t"
  132304. "lsr r7, r7, #16\n\t"
  132305. "mul r7, r6, r7\n\t"
  132306. "adds r3, r3, r7\n\t"
  132307. "adcs r4, r4, #0\n\t"
  132308. "adc r5, r5, #0\n\t"
  132309. "lsr r7, r9, #16\n\t"
  132310. "mul r6, r7, r6\n\t"
  132311. "lsr r7, r6, #16\n\t"
  132312. "lsl r6, r6, #16\n\t"
  132313. "adds r3, r3, r6\n\t"
  132314. "adcs r4, r4, r7\n\t"
  132315. "adc r5, r5, #0\n\t"
  132316. "lsr r6, r8, #16\n\t"
  132317. "lsr r7, r9, #16\n\t"
  132318. "mul r7, r6, r7\n\t"
  132319. "adds r4, r4, r7\n\t"
  132320. "adc r5, r5, #0\n\t"
  132321. "lsl r7, r9, #16\n\t"
  132322. "lsr r7, r7, #16\n\t"
  132323. "mul r6, r7, r6\n\t"
  132324. "lsr r7, r6, #16\n\t"
  132325. "lsl r6, r6, #16\n\t"
  132326. "adds r3, r3, r6\n\t"
  132327. "adcs r4, r4, r7\n\t"
  132328. "adc r5, r5, #0\n\t"
  132329. #else
  132330. "umull r6, r7, r8, r9\n\t"
  132331. "adds r3, r3, r6\n\t"
  132332. "adcs r4, r4, r7\n\t"
  132333. "adc r5, r5, #0\n\t"
  132334. #endif
  132335. /* A[14] * B[7] */
  132336. "ldr r8, [%[a], #56]\n\t"
  132337. "ldr r9, [%[b], #28]\n\t"
  132338. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132339. "lsl r6, r8, #16\n\t"
  132340. "lsl r7, r9, #16\n\t"
  132341. "lsr r6, r6, #16\n\t"
  132342. "lsr r7, r7, #16\n\t"
  132343. "mul r7, r6, r7\n\t"
  132344. "adds r3, r3, r7\n\t"
  132345. "adcs r4, r4, #0\n\t"
  132346. "adc r5, r5, #0\n\t"
  132347. "lsr r7, r9, #16\n\t"
  132348. "mul r6, r7, r6\n\t"
  132349. "lsr r7, r6, #16\n\t"
  132350. "lsl r6, r6, #16\n\t"
  132351. "adds r3, r3, r6\n\t"
  132352. "adcs r4, r4, r7\n\t"
  132353. "adc r5, r5, #0\n\t"
  132354. "lsr r6, r8, #16\n\t"
  132355. "lsr r7, r9, #16\n\t"
  132356. "mul r7, r6, r7\n\t"
  132357. "adds r4, r4, r7\n\t"
  132358. "adc r5, r5, #0\n\t"
  132359. "lsl r7, r9, #16\n\t"
  132360. "lsr r7, r7, #16\n\t"
  132361. "mul r6, r7, r6\n\t"
  132362. "lsr r7, r6, #16\n\t"
  132363. "lsl r6, r6, #16\n\t"
  132364. "adds r3, r3, r6\n\t"
  132365. "adcs r4, r4, r7\n\t"
  132366. "adc r5, r5, #0\n\t"
  132367. #else
  132368. "umull r6, r7, r8, r9\n\t"
  132369. "adds r3, r3, r6\n\t"
  132370. "adcs r4, r4, r7\n\t"
  132371. "adc r5, r5, #0\n\t"
  132372. #endif
  132373. /* A[15] * B[6] */
  132374. "ldr r8, [%[a], #60]\n\t"
  132375. "ldr r9, [%[b], #24]\n\t"
  132376. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132377. "lsl r6, r8, #16\n\t"
  132378. "lsl r7, r9, #16\n\t"
  132379. "lsr r6, r6, #16\n\t"
  132380. "lsr r7, r7, #16\n\t"
  132381. "mul r7, r6, r7\n\t"
  132382. "adds r3, r3, r7\n\t"
  132383. "adcs r4, r4, #0\n\t"
  132384. "adc r5, r5, #0\n\t"
  132385. "lsr r7, r9, #16\n\t"
  132386. "mul r6, r7, r6\n\t"
  132387. "lsr r7, r6, #16\n\t"
  132388. "lsl r6, r6, #16\n\t"
  132389. "adds r3, r3, r6\n\t"
  132390. "adcs r4, r4, r7\n\t"
  132391. "adc r5, r5, #0\n\t"
  132392. "lsr r6, r8, #16\n\t"
  132393. "lsr r7, r9, #16\n\t"
  132394. "mul r7, r6, r7\n\t"
  132395. "adds r4, r4, r7\n\t"
  132396. "adc r5, r5, #0\n\t"
  132397. "lsl r7, r9, #16\n\t"
  132398. "lsr r7, r7, #16\n\t"
  132399. "mul r6, r7, r6\n\t"
  132400. "lsr r7, r6, #16\n\t"
  132401. "lsl r6, r6, #16\n\t"
  132402. "adds r3, r3, r6\n\t"
  132403. "adcs r4, r4, r7\n\t"
  132404. "adc r5, r5, #0\n\t"
  132405. #else
  132406. "umull r6, r7, r8, r9\n\t"
  132407. "adds r3, r3, r6\n\t"
  132408. "adcs r4, r4, r7\n\t"
  132409. "adc r5, r5, #0\n\t"
  132410. #endif
  132411. "str r3, [%[r], #84]\n\t"
  132412. /* A[15] * B[7] */
  132413. "ldr r9, [%[b], #28]\n\t"
  132414. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132415. "lsl r6, r8, #16\n\t"
  132416. "lsl r7, r9, #16\n\t"
  132417. "lsr r6, r6, #16\n\t"
  132418. "lsr r7, r7, #16\n\t"
  132419. "mul r7, r6, r7\n\t"
  132420. "adds r4, r4, r7\n\t"
  132421. "adcs r5, r5, #0\n\t"
  132422. "mov r3, #0\n\t"
  132423. "adc r3, r3, #0\n\t"
  132424. "lsr r7, r9, #16\n\t"
  132425. "mul r6, r7, r6\n\t"
  132426. "lsr r7, r6, #16\n\t"
  132427. "lsl r6, r6, #16\n\t"
  132428. "adds r4, r4, r6\n\t"
  132429. "adcs r5, r5, r7\n\t"
  132430. "adc r3, r3, #0\n\t"
  132431. "lsr r6, r8, #16\n\t"
  132432. "lsr r7, r9, #16\n\t"
  132433. "mul r7, r6, r7\n\t"
  132434. "adds r5, r5, r7\n\t"
  132435. "adc r3, r3, #0\n\t"
  132436. "lsl r7, r9, #16\n\t"
  132437. "lsr r7, r7, #16\n\t"
  132438. "mul r6, r7, r6\n\t"
  132439. "lsr r7, r6, #16\n\t"
  132440. "lsl r6, r6, #16\n\t"
  132441. "adds r4, r4, r6\n\t"
  132442. "adcs r5, r5, r7\n\t"
  132443. "adc r3, r3, #0\n\t"
  132444. #else
  132445. "umull r6, r7, r8, r9\n\t"
  132446. "adds r4, r4, r6\n\t"
  132447. "adcs r5, r5, r7\n\t"
  132448. "mov r3, #0\n\t"
  132449. "adc r3, r3, #0\n\t"
  132450. #endif
  132451. /* A[14] * B[8] */
  132452. "ldr r8, [%[a], #56]\n\t"
  132453. "ldr r9, [%[b], #32]\n\t"
  132454. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132455. "lsl r6, r8, #16\n\t"
  132456. "lsl r7, r9, #16\n\t"
  132457. "lsr r6, r6, #16\n\t"
  132458. "lsr r7, r7, #16\n\t"
  132459. "mul r7, r6, r7\n\t"
  132460. "adds r4, r4, r7\n\t"
  132461. "adcs r5, r5, #0\n\t"
  132462. "adc r3, r3, #0\n\t"
  132463. "lsr r7, r9, #16\n\t"
  132464. "mul r6, r7, r6\n\t"
  132465. "lsr r7, r6, #16\n\t"
  132466. "lsl r6, r6, #16\n\t"
  132467. "adds r4, r4, r6\n\t"
  132468. "adcs r5, r5, r7\n\t"
  132469. "adc r3, r3, #0\n\t"
  132470. "lsr r6, r8, #16\n\t"
  132471. "lsr r7, r9, #16\n\t"
  132472. "mul r7, r6, r7\n\t"
  132473. "adds r5, r5, r7\n\t"
  132474. "adc r3, r3, #0\n\t"
  132475. "lsl r7, r9, #16\n\t"
  132476. "lsr r7, r7, #16\n\t"
  132477. "mul r6, r7, r6\n\t"
  132478. "lsr r7, r6, #16\n\t"
  132479. "lsl r6, r6, #16\n\t"
  132480. "adds r4, r4, r6\n\t"
  132481. "adcs r5, r5, r7\n\t"
  132482. "adc r3, r3, #0\n\t"
  132483. #else
  132484. "umull r6, r7, r8, r9\n\t"
  132485. "adds r4, r4, r6\n\t"
  132486. "adcs r5, r5, r7\n\t"
  132487. "adc r3, r3, #0\n\t"
  132488. #endif
  132489. /* A[13] * B[9] */
  132490. "ldr r8, [%[a], #52]\n\t"
  132491. "ldr r9, [%[b], #36]\n\t"
  132492. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132493. "lsl r6, r8, #16\n\t"
  132494. "lsl r7, r9, #16\n\t"
  132495. "lsr r6, r6, #16\n\t"
  132496. "lsr r7, r7, #16\n\t"
  132497. "mul r7, r6, r7\n\t"
  132498. "adds r4, r4, r7\n\t"
  132499. "adcs r5, r5, #0\n\t"
  132500. "adc r3, r3, #0\n\t"
  132501. "lsr r7, r9, #16\n\t"
  132502. "mul r6, r7, r6\n\t"
  132503. "lsr r7, r6, #16\n\t"
  132504. "lsl r6, r6, #16\n\t"
  132505. "adds r4, r4, r6\n\t"
  132506. "adcs r5, r5, r7\n\t"
  132507. "adc r3, r3, #0\n\t"
  132508. "lsr r6, r8, #16\n\t"
  132509. "lsr r7, r9, #16\n\t"
  132510. "mul r7, r6, r7\n\t"
  132511. "adds r5, r5, r7\n\t"
  132512. "adc r3, r3, #0\n\t"
  132513. "lsl r7, r9, #16\n\t"
  132514. "lsr r7, r7, #16\n\t"
  132515. "mul r6, r7, r6\n\t"
  132516. "lsr r7, r6, #16\n\t"
  132517. "lsl r6, r6, #16\n\t"
  132518. "adds r4, r4, r6\n\t"
  132519. "adcs r5, r5, r7\n\t"
  132520. "adc r3, r3, #0\n\t"
  132521. #else
  132522. "umull r6, r7, r8, r9\n\t"
  132523. "adds r4, r4, r6\n\t"
  132524. "adcs r5, r5, r7\n\t"
  132525. "adc r3, r3, #0\n\t"
  132526. #endif
  132527. /* A[12] * B[10] */
  132528. "ldr r8, [%[a], #48]\n\t"
  132529. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132530. "lsl r6, r8, #16\n\t"
  132531. "lsl r7, r12, #16\n\t"
  132532. "lsr r6, r6, #16\n\t"
  132533. "lsr r7, r7, #16\n\t"
  132534. "mul r7, r6, r7\n\t"
  132535. "adds r4, r4, r7\n\t"
  132536. "adcs r5, r5, #0\n\t"
  132537. "adc r3, r3, #0\n\t"
  132538. "lsr r7, r12, #16\n\t"
  132539. "mul r6, r7, r6\n\t"
  132540. "lsr r7, r6, #16\n\t"
  132541. "lsl r6, r6, #16\n\t"
  132542. "adds r4, r4, r6\n\t"
  132543. "adcs r5, r5, r7\n\t"
  132544. "adc r3, r3, #0\n\t"
  132545. "lsr r6, r8, #16\n\t"
  132546. "lsr r7, r12, #16\n\t"
  132547. "mul r7, r6, r7\n\t"
  132548. "adds r5, r5, r7\n\t"
  132549. "adc r3, r3, #0\n\t"
  132550. "lsl r7, r12, #16\n\t"
  132551. "lsr r7, r7, #16\n\t"
  132552. "mul r6, r7, r6\n\t"
  132553. "lsr r7, r6, #16\n\t"
  132554. "lsl r6, r6, #16\n\t"
  132555. "adds r4, r4, r6\n\t"
  132556. "adcs r5, r5, r7\n\t"
  132557. "adc r3, r3, #0\n\t"
  132558. #else
  132559. "umull r6, r7, r8, r12\n\t"
  132560. "adds r4, r4, r6\n\t"
  132561. "adcs r5, r5, r7\n\t"
  132562. "adc r3, r3, #0\n\t"
  132563. #endif
  132564. /* A[11] * B[11] */
  132565. "ldr r11, [%[a], #44]\n\t"
  132566. "ldr r12, [%[b], #44]\n\t"
  132567. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132568. "lsl r6, r11, #16\n\t"
  132569. "lsl r7, r12, #16\n\t"
  132570. "lsr r6, r6, #16\n\t"
  132571. "lsr r7, r7, #16\n\t"
  132572. "mul r7, r6, r7\n\t"
  132573. "adds r4, r4, r7\n\t"
  132574. "adcs r5, r5, #0\n\t"
  132575. "adc r3, r3, #0\n\t"
  132576. "lsr r7, r12, #16\n\t"
  132577. "mul r6, r7, r6\n\t"
  132578. "lsr r7, r6, #16\n\t"
  132579. "lsl r6, r6, #16\n\t"
  132580. "adds r4, r4, r6\n\t"
  132581. "adcs r5, r5, r7\n\t"
  132582. "adc r3, r3, #0\n\t"
  132583. "lsr r6, r11, #16\n\t"
  132584. "lsr r7, r12, #16\n\t"
  132585. "mul r7, r6, r7\n\t"
  132586. "adds r5, r5, r7\n\t"
  132587. "adc r3, r3, #0\n\t"
  132588. "lsl r7, r12, #16\n\t"
  132589. "lsr r7, r7, #16\n\t"
  132590. "mul r6, r7, r6\n\t"
  132591. "lsr r7, r6, #16\n\t"
  132592. "lsl r6, r6, #16\n\t"
  132593. "adds r4, r4, r6\n\t"
  132594. "adcs r5, r5, r7\n\t"
  132595. "adc r3, r3, #0\n\t"
  132596. #else
  132597. "umull r6, r7, r11, r12\n\t"
  132598. "adds r4, r4, r6\n\t"
  132599. "adcs r5, r5, r7\n\t"
  132600. "adc r3, r3, #0\n\t"
  132601. #endif
  132602. /* A[10] * B[12] */
  132603. "ldr r8, [%[a], #40]\n\t"
  132604. "ldr r9, [%[b], #48]\n\t"
  132605. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132606. "lsl r6, r8, #16\n\t"
  132607. "lsl r7, r9, #16\n\t"
  132608. "lsr r6, r6, #16\n\t"
  132609. "lsr r7, r7, #16\n\t"
  132610. "mul r7, r6, r7\n\t"
  132611. "adds r4, r4, r7\n\t"
  132612. "adcs r5, r5, #0\n\t"
  132613. "adc r3, r3, #0\n\t"
  132614. "lsr r7, r9, #16\n\t"
  132615. "mul r6, r7, r6\n\t"
  132616. "lsr r7, r6, #16\n\t"
  132617. "lsl r6, r6, #16\n\t"
  132618. "adds r4, r4, r6\n\t"
  132619. "adcs r5, r5, r7\n\t"
  132620. "adc r3, r3, #0\n\t"
  132621. "lsr r6, r8, #16\n\t"
  132622. "lsr r7, r9, #16\n\t"
  132623. "mul r7, r6, r7\n\t"
  132624. "adds r5, r5, r7\n\t"
  132625. "adc r3, r3, #0\n\t"
  132626. "lsl r7, r9, #16\n\t"
  132627. "lsr r7, r7, #16\n\t"
  132628. "mul r6, r7, r6\n\t"
  132629. "lsr r7, r6, #16\n\t"
  132630. "lsl r6, r6, #16\n\t"
  132631. "adds r4, r4, r6\n\t"
  132632. "adcs r5, r5, r7\n\t"
  132633. "adc r3, r3, #0\n\t"
  132634. #else
  132635. "umull r6, r7, r8, r9\n\t"
  132636. "adds r4, r4, r6\n\t"
  132637. "adcs r5, r5, r7\n\t"
  132638. "adc r3, r3, #0\n\t"
  132639. #endif
  132640. /* A[9] * B[13] */
  132641. "ldr r8, [%[a], #36]\n\t"
  132642. "ldr r9, [%[b], #52]\n\t"
  132643. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132644. "lsl r6, r8, #16\n\t"
  132645. "lsl r7, r9, #16\n\t"
  132646. "lsr r6, r6, #16\n\t"
  132647. "lsr r7, r7, #16\n\t"
  132648. "mul r7, r6, r7\n\t"
  132649. "adds r4, r4, r7\n\t"
  132650. "adcs r5, r5, #0\n\t"
  132651. "adc r3, r3, #0\n\t"
  132652. "lsr r7, r9, #16\n\t"
  132653. "mul r6, r7, r6\n\t"
  132654. "lsr r7, r6, #16\n\t"
  132655. "lsl r6, r6, #16\n\t"
  132656. "adds r4, r4, r6\n\t"
  132657. "adcs r5, r5, r7\n\t"
  132658. "adc r3, r3, #0\n\t"
  132659. "lsr r6, r8, #16\n\t"
  132660. "lsr r7, r9, #16\n\t"
  132661. "mul r7, r6, r7\n\t"
  132662. "adds r5, r5, r7\n\t"
  132663. "adc r3, r3, #0\n\t"
  132664. "lsl r7, r9, #16\n\t"
  132665. "lsr r7, r7, #16\n\t"
  132666. "mul r6, r7, r6\n\t"
  132667. "lsr r7, r6, #16\n\t"
  132668. "lsl r6, r6, #16\n\t"
  132669. "adds r4, r4, r6\n\t"
  132670. "adcs r5, r5, r7\n\t"
  132671. "adc r3, r3, #0\n\t"
  132672. #else
  132673. "umull r6, r7, r8, r9\n\t"
  132674. "adds r4, r4, r6\n\t"
  132675. "adcs r5, r5, r7\n\t"
  132676. "adc r3, r3, #0\n\t"
  132677. #endif
  132678. /* A[8] * B[14] */
  132679. "ldr r8, [%[a], #32]\n\t"
  132680. "ldr r9, [%[b], #56]\n\t"
  132681. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132682. "lsl r6, r8, #16\n\t"
  132683. "lsl r7, r9, #16\n\t"
  132684. "lsr r6, r6, #16\n\t"
  132685. "lsr r7, r7, #16\n\t"
  132686. "mul r7, r6, r7\n\t"
  132687. "adds r4, r4, r7\n\t"
  132688. "adcs r5, r5, #0\n\t"
  132689. "adc r3, r3, #0\n\t"
  132690. "lsr r7, r9, #16\n\t"
  132691. "mul r6, r7, r6\n\t"
  132692. "lsr r7, r6, #16\n\t"
  132693. "lsl r6, r6, #16\n\t"
  132694. "adds r4, r4, r6\n\t"
  132695. "adcs r5, r5, r7\n\t"
  132696. "adc r3, r3, #0\n\t"
  132697. "lsr r6, r8, #16\n\t"
  132698. "lsr r7, r9, #16\n\t"
  132699. "mul r7, r6, r7\n\t"
  132700. "adds r5, r5, r7\n\t"
  132701. "adc r3, r3, #0\n\t"
  132702. "lsl r7, r9, #16\n\t"
  132703. "lsr r7, r7, #16\n\t"
  132704. "mul r6, r7, r6\n\t"
  132705. "lsr r7, r6, #16\n\t"
  132706. "lsl r6, r6, #16\n\t"
  132707. "adds r4, r4, r6\n\t"
  132708. "adcs r5, r5, r7\n\t"
  132709. "adc r3, r3, #0\n\t"
  132710. #else
  132711. "umull r6, r7, r8, r9\n\t"
  132712. "adds r4, r4, r6\n\t"
  132713. "adcs r5, r5, r7\n\t"
  132714. "adc r3, r3, #0\n\t"
  132715. #endif
  132716. /* A[7] * B[15] */
  132717. "ldr r8, [%[a], #28]\n\t"
  132718. "ldr r9, [%[b], #60]\n\t"
  132719. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132720. "lsl r6, r8, #16\n\t"
  132721. "lsl r7, r9, #16\n\t"
  132722. "lsr r6, r6, #16\n\t"
  132723. "lsr r7, r7, #16\n\t"
  132724. "mul r7, r6, r7\n\t"
  132725. "adds r4, r4, r7\n\t"
  132726. "adcs r5, r5, #0\n\t"
  132727. "adc r3, r3, #0\n\t"
  132728. "lsr r7, r9, #16\n\t"
  132729. "mul r6, r7, r6\n\t"
  132730. "lsr r7, r6, #16\n\t"
  132731. "lsl r6, r6, #16\n\t"
  132732. "adds r4, r4, r6\n\t"
  132733. "adcs r5, r5, r7\n\t"
  132734. "adc r3, r3, #0\n\t"
  132735. "lsr r6, r8, #16\n\t"
  132736. "lsr r7, r9, #16\n\t"
  132737. "mul r7, r6, r7\n\t"
  132738. "adds r5, r5, r7\n\t"
  132739. "adc r3, r3, #0\n\t"
  132740. "lsl r7, r9, #16\n\t"
  132741. "lsr r7, r7, #16\n\t"
  132742. "mul r6, r7, r6\n\t"
  132743. "lsr r7, r6, #16\n\t"
  132744. "lsl r6, r6, #16\n\t"
  132745. "adds r4, r4, r6\n\t"
  132746. "adcs r5, r5, r7\n\t"
  132747. "adc r3, r3, #0\n\t"
  132748. #else
  132749. "umull r6, r7, r8, r9\n\t"
  132750. "adds r4, r4, r6\n\t"
  132751. "adcs r5, r5, r7\n\t"
  132752. "adc r3, r3, #0\n\t"
  132753. #endif
  132754. "str r4, [%[r], #88]\n\t"
  132755. /* A[8] * B[15] */
  132756. "ldr r8, [%[a], #32]\n\t"
  132757. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132758. "lsl r6, r8, #16\n\t"
  132759. "lsl r7, r9, #16\n\t"
  132760. "lsr r6, r6, #16\n\t"
  132761. "lsr r7, r7, #16\n\t"
  132762. "mul r7, r6, r7\n\t"
  132763. "adds r5, r5, r7\n\t"
  132764. "adcs r3, r3, #0\n\t"
  132765. "mov r4, #0\n\t"
  132766. "adc r4, r4, #0\n\t"
  132767. "lsr r7, r9, #16\n\t"
  132768. "mul r6, r7, r6\n\t"
  132769. "lsr r7, r6, #16\n\t"
  132770. "lsl r6, r6, #16\n\t"
  132771. "adds r5, r5, r6\n\t"
  132772. "adcs r3, r3, r7\n\t"
  132773. "adc r4, r4, #0\n\t"
  132774. "lsr r6, r8, #16\n\t"
  132775. "lsr r7, r9, #16\n\t"
  132776. "mul r7, r6, r7\n\t"
  132777. "adds r3, r3, r7\n\t"
  132778. "adc r4, r4, #0\n\t"
  132779. "lsl r7, r9, #16\n\t"
  132780. "lsr r7, r7, #16\n\t"
  132781. "mul r6, r7, r6\n\t"
  132782. "lsr r7, r6, #16\n\t"
  132783. "lsl r6, r6, #16\n\t"
  132784. "adds r5, r5, r6\n\t"
  132785. "adcs r3, r3, r7\n\t"
  132786. "adc r4, r4, #0\n\t"
  132787. #else
  132788. "umull r6, r7, r8, r9\n\t"
  132789. "adds r5, r5, r6\n\t"
  132790. "adcs r3, r3, r7\n\t"
  132791. "mov r4, #0\n\t"
  132792. "adc r4, r4, #0\n\t"
  132793. #endif
  132794. /* A[9] * B[14] */
  132795. "ldr r8, [%[a], #36]\n\t"
  132796. "ldr r9, [%[b], #56]\n\t"
  132797. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132798. "lsl r6, r8, #16\n\t"
  132799. "lsl r7, r9, #16\n\t"
  132800. "lsr r6, r6, #16\n\t"
  132801. "lsr r7, r7, #16\n\t"
  132802. "mul r7, r6, r7\n\t"
  132803. "adds r5, r5, r7\n\t"
  132804. "adcs r3, r3, #0\n\t"
  132805. "adc r4, r4, #0\n\t"
  132806. "lsr r7, r9, #16\n\t"
  132807. "mul r6, r7, r6\n\t"
  132808. "lsr r7, r6, #16\n\t"
  132809. "lsl r6, r6, #16\n\t"
  132810. "adds r5, r5, r6\n\t"
  132811. "adcs r3, r3, r7\n\t"
  132812. "adc r4, r4, #0\n\t"
  132813. "lsr r6, r8, #16\n\t"
  132814. "lsr r7, r9, #16\n\t"
  132815. "mul r7, r6, r7\n\t"
  132816. "adds r3, r3, r7\n\t"
  132817. "adc r4, r4, #0\n\t"
  132818. "lsl r7, r9, #16\n\t"
  132819. "lsr r7, r7, #16\n\t"
  132820. "mul r6, r7, r6\n\t"
  132821. "lsr r7, r6, #16\n\t"
  132822. "lsl r6, r6, #16\n\t"
  132823. "adds r5, r5, r6\n\t"
  132824. "adcs r3, r3, r7\n\t"
  132825. "adc r4, r4, #0\n\t"
  132826. #else
  132827. "umull r6, r7, r8, r9\n\t"
  132828. "adds r5, r5, r6\n\t"
  132829. "adcs r3, r3, r7\n\t"
  132830. "adc r4, r4, #0\n\t"
  132831. #endif
  132832. /* A[10] * B[13] */
  132833. "ldr r8, [%[a], #40]\n\t"
  132834. "ldr r9, [%[b], #52]\n\t"
  132835. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132836. "lsl r6, r8, #16\n\t"
  132837. "lsl r7, r9, #16\n\t"
  132838. "lsr r6, r6, #16\n\t"
  132839. "lsr r7, r7, #16\n\t"
  132840. "mul r7, r6, r7\n\t"
  132841. "adds r5, r5, r7\n\t"
  132842. "adcs r3, r3, #0\n\t"
  132843. "adc r4, r4, #0\n\t"
  132844. "lsr r7, r9, #16\n\t"
  132845. "mul r6, r7, r6\n\t"
  132846. "lsr r7, r6, #16\n\t"
  132847. "lsl r6, r6, #16\n\t"
  132848. "adds r5, r5, r6\n\t"
  132849. "adcs r3, r3, r7\n\t"
  132850. "adc r4, r4, #0\n\t"
  132851. "lsr r6, r8, #16\n\t"
  132852. "lsr r7, r9, #16\n\t"
  132853. "mul r7, r6, r7\n\t"
  132854. "adds r3, r3, r7\n\t"
  132855. "adc r4, r4, #0\n\t"
  132856. "lsl r7, r9, #16\n\t"
  132857. "lsr r7, r7, #16\n\t"
  132858. "mul r6, r7, r6\n\t"
  132859. "lsr r7, r6, #16\n\t"
  132860. "lsl r6, r6, #16\n\t"
  132861. "adds r5, r5, r6\n\t"
  132862. "adcs r3, r3, r7\n\t"
  132863. "adc r4, r4, #0\n\t"
  132864. #else
  132865. "umull r6, r7, r8, r9\n\t"
  132866. "adds r5, r5, r6\n\t"
  132867. "adcs r3, r3, r7\n\t"
  132868. "adc r4, r4, #0\n\t"
  132869. #endif
  132870. /* A[11] * B[12] */
  132871. "ldr r9, [%[b], #48]\n\t"
  132872. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132873. "lsl r6, r11, #16\n\t"
  132874. "lsl r7, r9, #16\n\t"
  132875. "lsr r6, r6, #16\n\t"
  132876. "lsr r7, r7, #16\n\t"
  132877. "mul r7, r6, r7\n\t"
  132878. "adds r5, r5, r7\n\t"
  132879. "adcs r3, r3, #0\n\t"
  132880. "adc r4, r4, #0\n\t"
  132881. "lsr r7, r9, #16\n\t"
  132882. "mul r6, r7, r6\n\t"
  132883. "lsr r7, r6, #16\n\t"
  132884. "lsl r6, r6, #16\n\t"
  132885. "adds r5, r5, r6\n\t"
  132886. "adcs r3, r3, r7\n\t"
  132887. "adc r4, r4, #0\n\t"
  132888. "lsr r6, r11, #16\n\t"
  132889. "lsr r7, r9, #16\n\t"
  132890. "mul r7, r6, r7\n\t"
  132891. "adds r3, r3, r7\n\t"
  132892. "adc r4, r4, #0\n\t"
  132893. "lsl r7, r9, #16\n\t"
  132894. "lsr r7, r7, #16\n\t"
  132895. "mul r6, r7, r6\n\t"
  132896. "lsr r7, r6, #16\n\t"
  132897. "lsl r6, r6, #16\n\t"
  132898. "adds r5, r5, r6\n\t"
  132899. "adcs r3, r3, r7\n\t"
  132900. "adc r4, r4, #0\n\t"
  132901. #else
  132902. "umull r6, r7, r11, r9\n\t"
  132903. "adds r5, r5, r6\n\t"
  132904. "adcs r3, r3, r7\n\t"
  132905. "adc r4, r4, #0\n\t"
  132906. #endif
  132907. /* A[12] * B[11] */
  132908. "ldr r8, [%[a], #48]\n\t"
  132909. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132910. "lsl r6, r8, #16\n\t"
  132911. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[13] * B[10] */
  132945. "ldr r8, [%[a], #52]\n\t"
  132946. "ldr r9, [%[b], #40]\n\t"
  132947. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132948. "lsl r6, r8, #16\n\t"
  132949. "lsl r7, r9, #16\n\t"
  132950. "lsr r6, r6, #16\n\t"
  132951. "lsr r7, r7, #16\n\t"
  132952. "mul r7, r6, r7\n\t"
  132953. "adds r5, r5, r7\n\t"
  132954. "adcs r3, r3, #0\n\t"
  132955. "adc r4, r4, #0\n\t"
  132956. "lsr r7, r9, #16\n\t"
  132957. "mul r6, r7, r6\n\t"
  132958. "lsr r7, r6, #16\n\t"
  132959. "lsl r6, r6, #16\n\t"
  132960. "adds r5, r5, r6\n\t"
  132961. "adcs r3, r3, r7\n\t"
  132962. "adc r4, r4, #0\n\t"
  132963. "lsr r6, r8, #16\n\t"
  132964. "lsr r7, r9, #16\n\t"
  132965. "mul r7, r6, r7\n\t"
  132966. "adds r3, r3, r7\n\t"
  132967. "adc r4, r4, #0\n\t"
  132968. "lsl r7, r9, #16\n\t"
  132969. "lsr r7, r7, #16\n\t"
  132970. "mul r6, r7, r6\n\t"
  132971. "lsr r7, r6, #16\n\t"
  132972. "lsl r6, r6, #16\n\t"
  132973. "adds r5, r5, r6\n\t"
  132974. "adcs r3, r3, r7\n\t"
  132975. "adc r4, r4, #0\n\t"
  132976. #else
  132977. "umull r6, r7, r8, r9\n\t"
  132978. "adds r5, r5, r6\n\t"
  132979. "adcs r3, r3, r7\n\t"
  132980. "adc r4, r4, #0\n\t"
  132981. #endif
  132982. /* A[14] * B[9] */
  132983. "ldr r8, [%[a], #56]\n\t"
  132984. "ldr r9, [%[b], #36]\n\t"
  132985. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  132986. "lsl r6, r8, #16\n\t"
  132987. "lsl r7, r9, #16\n\t"
  132988. "lsr r6, r6, #16\n\t"
  132989. "lsr r7, r7, #16\n\t"
  132990. "mul r7, r6, r7\n\t"
  132991. "adds r5, r5, r7\n\t"
  132992. "adcs r3, r3, #0\n\t"
  132993. "adc r4, r4, #0\n\t"
  132994. "lsr r7, r9, #16\n\t"
  132995. "mul r6, r7, r6\n\t"
  132996. "lsr r7, r6, #16\n\t"
  132997. "lsl r6, r6, #16\n\t"
  132998. "adds r5, r5, r6\n\t"
  132999. "adcs r3, r3, r7\n\t"
  133000. "adc r4, r4, #0\n\t"
  133001. "lsr r6, r8, #16\n\t"
  133002. "lsr r7, r9, #16\n\t"
  133003. "mul r7, r6, r7\n\t"
  133004. "adds r3, r3, r7\n\t"
  133005. "adc r4, r4, #0\n\t"
  133006. "lsl r7, r9, #16\n\t"
  133007. "lsr r7, r7, #16\n\t"
  133008. "mul r6, r7, r6\n\t"
  133009. "lsr r7, r6, #16\n\t"
  133010. "lsl r6, r6, #16\n\t"
  133011. "adds r5, r5, r6\n\t"
  133012. "adcs r3, r3, r7\n\t"
  133013. "adc r4, r4, #0\n\t"
  133014. #else
  133015. "umull r6, r7, r8, r9\n\t"
  133016. "adds r5, r5, r6\n\t"
  133017. "adcs r3, r3, r7\n\t"
  133018. "adc r4, r4, #0\n\t"
  133019. #endif
  133020. /* A[15] * B[8] */
  133021. "ldr r8, [%[a], #60]\n\t"
  133022. "ldr r9, [%[b], #32]\n\t"
  133023. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133024. "lsl r6, r8, #16\n\t"
  133025. "lsl r7, r9, #16\n\t"
  133026. "lsr r6, r6, #16\n\t"
  133027. "lsr r7, r7, #16\n\t"
  133028. "mul r7, r6, r7\n\t"
  133029. "adds r5, r5, r7\n\t"
  133030. "adcs r3, r3, #0\n\t"
  133031. "adc r4, r4, #0\n\t"
  133032. "lsr r7, r9, #16\n\t"
  133033. "mul r6, r7, r6\n\t"
  133034. "lsr r7, r6, #16\n\t"
  133035. "lsl r6, r6, #16\n\t"
  133036. "adds r5, r5, r6\n\t"
  133037. "adcs r3, r3, r7\n\t"
  133038. "adc r4, r4, #0\n\t"
  133039. "lsr r6, r8, #16\n\t"
  133040. "lsr r7, r9, #16\n\t"
  133041. "mul r7, r6, r7\n\t"
  133042. "adds r3, r3, r7\n\t"
  133043. "adc r4, r4, #0\n\t"
  133044. "lsl r7, r9, #16\n\t"
  133045. "lsr r7, r7, #16\n\t"
  133046. "mul r6, r7, r6\n\t"
  133047. "lsr r7, r6, #16\n\t"
  133048. "lsl r6, r6, #16\n\t"
  133049. "adds r5, r5, r6\n\t"
  133050. "adcs r3, r3, r7\n\t"
  133051. "adc r4, r4, #0\n\t"
  133052. #else
  133053. "umull r6, r7, r8, r9\n\t"
  133054. "adds r5, r5, r6\n\t"
  133055. "adcs r3, r3, r7\n\t"
  133056. "adc r4, r4, #0\n\t"
  133057. #endif
  133058. "str r5, [%[r], #92]\n\t"
  133059. /* A[15] * B[9] */
  133060. "ldr r9, [%[b], #36]\n\t"
  133061. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133062. "lsl r6, r8, #16\n\t"
  133063. "lsl r7, r9, #16\n\t"
  133064. "lsr r6, r6, #16\n\t"
  133065. "lsr r7, r7, #16\n\t"
  133066. "mul r7, r6, r7\n\t"
  133067. "adds r3, r3, r7\n\t"
  133068. "adcs r4, r4, #0\n\t"
  133069. "mov r5, #0\n\t"
  133070. "adc r5, r5, #0\n\t"
  133071. "lsr r7, r9, #16\n\t"
  133072. "mul r6, r7, r6\n\t"
  133073. "lsr r7, r6, #16\n\t"
  133074. "lsl r6, r6, #16\n\t"
  133075. "adds r3, r3, r6\n\t"
  133076. "adcs r4, r4, r7\n\t"
  133077. "adc r5, r5, #0\n\t"
  133078. "lsr r6, r8, #16\n\t"
  133079. "lsr r7, r9, #16\n\t"
  133080. "mul r7, r6, r7\n\t"
  133081. "adds r4, r4, r7\n\t"
  133082. "adc r5, r5, #0\n\t"
  133083. "lsl r7, r9, #16\n\t"
  133084. "lsr r7, r7, #16\n\t"
  133085. "mul r6, r7, r6\n\t"
  133086. "lsr r7, r6, #16\n\t"
  133087. "lsl r6, r6, #16\n\t"
  133088. "adds r3, r3, r6\n\t"
  133089. "adcs r4, r4, r7\n\t"
  133090. "adc r5, r5, #0\n\t"
  133091. #else
  133092. "umull r6, r7, r8, r9\n\t"
  133093. "adds r3, r3, r6\n\t"
  133094. "adcs r4, r4, r7\n\t"
  133095. "mov r5, #0\n\t"
  133096. "adc r5, r5, #0\n\t"
  133097. #endif
  133098. /* A[14] * B[10] */
  133099. "ldr r8, [%[a], #56]\n\t"
  133100. "ldr r9, [%[b], #40]\n\t"
  133101. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133102. "lsl r6, r8, #16\n\t"
  133103. "lsl r7, r9, #16\n\t"
  133104. "lsr r6, r6, #16\n\t"
  133105. "lsr r7, r7, #16\n\t"
  133106. "mul r7, r6, r7\n\t"
  133107. "adds r3, r3, r7\n\t"
  133108. "adcs r4, r4, #0\n\t"
  133109. "adc r5, r5, #0\n\t"
  133110. "lsr r7, r9, #16\n\t"
  133111. "mul r6, r7, r6\n\t"
  133112. "lsr r7, r6, #16\n\t"
  133113. "lsl r6, r6, #16\n\t"
  133114. "adds r3, r3, r6\n\t"
  133115. "adcs r4, r4, r7\n\t"
  133116. "adc r5, r5, #0\n\t"
  133117. "lsr r6, r8, #16\n\t"
  133118. "lsr r7, r9, #16\n\t"
  133119. "mul r7, r6, r7\n\t"
  133120. "adds r4, r4, r7\n\t"
  133121. "adc r5, r5, #0\n\t"
  133122. "lsl r7, r9, #16\n\t"
  133123. "lsr r7, r7, #16\n\t"
  133124. "mul r6, r7, r6\n\t"
  133125. "lsr r7, r6, #16\n\t"
  133126. "lsl r6, r6, #16\n\t"
  133127. "adds r3, r3, r6\n\t"
  133128. "adcs r4, r4, r7\n\t"
  133129. "adc r5, r5, #0\n\t"
  133130. #else
  133131. "umull r6, r7, r8, r9\n\t"
  133132. "adds r3, r3, r6\n\t"
  133133. "adcs r4, r4, r7\n\t"
  133134. "adc r5, r5, #0\n\t"
  133135. #endif
  133136. /* A[13] * B[11] */
  133137. "ldr r8, [%[a], #52]\n\t"
  133138. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133139. "lsl r6, r8, #16\n\t"
  133140. "lsl r7, r12, #16\n\t"
  133141. "lsr r6, r6, #16\n\t"
  133142. "lsr r7, r7, #16\n\t"
  133143. "mul r7, r6, r7\n\t"
  133144. "adds r3, r3, r7\n\t"
  133145. "adcs r4, r4, #0\n\t"
  133146. "adc r5, r5, #0\n\t"
  133147. "lsr r7, r12, #16\n\t"
  133148. "mul r6, r7, r6\n\t"
  133149. "lsr r7, r6, #16\n\t"
  133150. "lsl r6, r6, #16\n\t"
  133151. "adds r3, r3, r6\n\t"
  133152. "adcs r4, r4, r7\n\t"
  133153. "adc r5, r5, #0\n\t"
  133154. "lsr r6, r8, #16\n\t"
  133155. "lsr r7, r12, #16\n\t"
  133156. "mul r7, r6, r7\n\t"
  133157. "adds r4, r4, r7\n\t"
  133158. "adc r5, r5, #0\n\t"
  133159. "lsl r7, r12, #16\n\t"
  133160. "lsr r7, r7, #16\n\t"
  133161. "mul r6, r7, r6\n\t"
  133162. "lsr r7, r6, #16\n\t"
  133163. "lsl r6, r6, #16\n\t"
  133164. "adds r3, r3, r6\n\t"
  133165. "adcs r4, r4, r7\n\t"
  133166. "adc r5, r5, #0\n\t"
  133167. #else
  133168. "umull r6, r7, r8, r12\n\t"
  133169. "adds r3, r3, r6\n\t"
  133170. "adcs r4, r4, r7\n\t"
  133171. "adc r5, r5, #0\n\t"
  133172. #endif
  133173. /* A[12] * B[12] */
  133174. "ldr r11, [%[a], #48]\n\t"
  133175. "ldr r12, [%[b], #48]\n\t"
  133176. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133177. "lsl r6, r11, #16\n\t"
  133178. "lsl r7, r12, #16\n\t"
  133179. "lsr r6, r6, #16\n\t"
  133180. "lsr r7, r7, #16\n\t"
  133181. "mul r7, r6, r7\n\t"
  133182. "adds r3, r3, r7\n\t"
  133183. "adcs r4, r4, #0\n\t"
  133184. "adc r5, r5, #0\n\t"
  133185. "lsr r7, r12, #16\n\t"
  133186. "mul r6, r7, r6\n\t"
  133187. "lsr r7, r6, #16\n\t"
  133188. "lsl r6, r6, #16\n\t"
  133189. "adds r3, r3, r6\n\t"
  133190. "adcs r4, r4, r7\n\t"
  133191. "adc r5, r5, #0\n\t"
  133192. "lsr r6, r11, #16\n\t"
  133193. "lsr r7, r12, #16\n\t"
  133194. "mul r7, r6, r7\n\t"
  133195. "adds r4, r4, r7\n\t"
  133196. "adc r5, r5, #0\n\t"
  133197. "lsl r7, r12, #16\n\t"
  133198. "lsr r7, r7, #16\n\t"
  133199. "mul r6, r7, r6\n\t"
  133200. "lsr r7, r6, #16\n\t"
  133201. "lsl r6, r6, #16\n\t"
  133202. "adds r3, r3, r6\n\t"
  133203. "adcs r4, r4, r7\n\t"
  133204. "adc r5, r5, #0\n\t"
  133205. #else
  133206. "umull r6, r7, r11, r12\n\t"
  133207. "adds r3, r3, r6\n\t"
  133208. "adcs r4, r4, r7\n\t"
  133209. "adc r5, r5, #0\n\t"
  133210. #endif
  133211. /* A[11] * B[13] */
  133212. "ldr r8, [%[a], #44]\n\t"
  133213. "ldr r9, [%[b], #52]\n\t"
  133214. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133215. "lsl r6, r8, #16\n\t"
  133216. "lsl r7, r9, #16\n\t"
  133217. "lsr r6, r6, #16\n\t"
  133218. "lsr r7, r7, #16\n\t"
  133219. "mul r7, r6, r7\n\t"
  133220. "adds r3, r3, r7\n\t"
  133221. "adcs r4, r4, #0\n\t"
  133222. "adc r5, r5, #0\n\t"
  133223. "lsr r7, r9, #16\n\t"
  133224. "mul r6, r7, r6\n\t"
  133225. "lsr r7, r6, #16\n\t"
  133226. "lsl r6, r6, #16\n\t"
  133227. "adds r3, r3, r6\n\t"
  133228. "adcs r4, r4, r7\n\t"
  133229. "adc r5, r5, #0\n\t"
  133230. "lsr r6, r8, #16\n\t"
  133231. "lsr r7, r9, #16\n\t"
  133232. "mul r7, r6, r7\n\t"
  133233. "adds r4, r4, r7\n\t"
  133234. "adc r5, r5, #0\n\t"
  133235. "lsl r7, r9, #16\n\t"
  133236. "lsr r7, r7, #16\n\t"
  133237. "mul r6, r7, r6\n\t"
  133238. "lsr r7, r6, #16\n\t"
  133239. "lsl r6, r6, #16\n\t"
  133240. "adds r3, r3, r6\n\t"
  133241. "adcs r4, r4, r7\n\t"
  133242. "adc r5, r5, #0\n\t"
  133243. #else
  133244. "umull r6, r7, r8, r9\n\t"
  133245. "adds r3, r3, r6\n\t"
  133246. "adcs r4, r4, r7\n\t"
  133247. "adc r5, r5, #0\n\t"
  133248. #endif
  133249. /* A[10] * B[14] */
  133250. "ldr r8, [%[a], #40]\n\t"
  133251. "ldr r9, [%[b], #56]\n\t"
  133252. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133253. "lsl r6, r8, #16\n\t"
  133254. "lsl r7, r9, #16\n\t"
  133255. "lsr r6, r6, #16\n\t"
  133256. "lsr r7, r7, #16\n\t"
  133257. "mul r7, r6, r7\n\t"
  133258. "adds r3, r3, r7\n\t"
  133259. "adcs r4, r4, #0\n\t"
  133260. "adc r5, r5, #0\n\t"
  133261. "lsr r7, r9, #16\n\t"
  133262. "mul r6, r7, r6\n\t"
  133263. "lsr r7, r6, #16\n\t"
  133264. "lsl r6, r6, #16\n\t"
  133265. "adds r3, r3, r6\n\t"
  133266. "adcs r4, r4, r7\n\t"
  133267. "adc r5, r5, #0\n\t"
  133268. "lsr r6, r8, #16\n\t"
  133269. "lsr r7, r9, #16\n\t"
  133270. "mul r7, r6, r7\n\t"
  133271. "adds r4, r4, r7\n\t"
  133272. "adc r5, r5, #0\n\t"
  133273. "lsl r7, r9, #16\n\t"
  133274. "lsr r7, r7, #16\n\t"
  133275. "mul r6, r7, r6\n\t"
  133276. "lsr r7, r6, #16\n\t"
  133277. "lsl r6, r6, #16\n\t"
  133278. "adds r3, r3, r6\n\t"
  133279. "adcs r4, r4, r7\n\t"
  133280. "adc r5, r5, #0\n\t"
  133281. #else
  133282. "umull r6, r7, r8, r9\n\t"
  133283. "adds r3, r3, r6\n\t"
  133284. "adcs r4, r4, r7\n\t"
  133285. "adc r5, r5, #0\n\t"
  133286. #endif
  133287. /* A[9] * B[15] */
  133288. "ldr r8, [%[a], #36]\n\t"
  133289. "ldr r9, [%[b], #60]\n\t"
  133290. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133291. "lsl r6, r8, #16\n\t"
  133292. "lsl r7, r9, #16\n\t"
  133293. "lsr r6, r6, #16\n\t"
  133294. "lsr r7, r7, #16\n\t"
  133295. "mul r7, r6, r7\n\t"
  133296. "adds r3, r3, r7\n\t"
  133297. "adcs r4, r4, #0\n\t"
  133298. "adc r5, r5, #0\n\t"
  133299. "lsr r7, r9, #16\n\t"
  133300. "mul r6, r7, r6\n\t"
  133301. "lsr r7, r6, #16\n\t"
  133302. "lsl r6, r6, #16\n\t"
  133303. "adds r3, r3, r6\n\t"
  133304. "adcs r4, r4, r7\n\t"
  133305. "adc r5, r5, #0\n\t"
  133306. "lsr r6, r8, #16\n\t"
  133307. "lsr r7, r9, #16\n\t"
  133308. "mul r7, r6, r7\n\t"
  133309. "adds r4, r4, r7\n\t"
  133310. "adc r5, r5, #0\n\t"
  133311. "lsl r7, r9, #16\n\t"
  133312. "lsr r7, r7, #16\n\t"
  133313. "mul r6, r7, r6\n\t"
  133314. "lsr r7, r6, #16\n\t"
  133315. "lsl r6, r6, #16\n\t"
  133316. "adds r3, r3, r6\n\t"
  133317. "adcs r4, r4, r7\n\t"
  133318. "adc r5, r5, #0\n\t"
  133319. #else
  133320. "umull r6, r7, r8, r9\n\t"
  133321. "adds r3, r3, r6\n\t"
  133322. "adcs r4, r4, r7\n\t"
  133323. "adc r5, r5, #0\n\t"
  133324. #endif
  133325. "str r3, [%[r], #96]\n\t"
  133326. /* A[10] * B[15] */
  133327. "ldr r8, [%[a], #40]\n\t"
  133328. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133329. "lsl r6, r8, #16\n\t"
  133330. "lsl r7, r9, #16\n\t"
  133331. "lsr r6, r6, #16\n\t"
  133332. "lsr r7, r7, #16\n\t"
  133333. "mul r7, r6, r7\n\t"
  133334. "adds r4, r4, r7\n\t"
  133335. "adcs r5, r5, #0\n\t"
  133336. "mov r3, #0\n\t"
  133337. "adc r3, r3, #0\n\t"
  133338. "lsr r7, r9, #16\n\t"
  133339. "mul r6, r7, r6\n\t"
  133340. "lsr r7, r6, #16\n\t"
  133341. "lsl r6, r6, #16\n\t"
  133342. "adds r4, r4, r6\n\t"
  133343. "adcs r5, r5, r7\n\t"
  133344. "adc r3, r3, #0\n\t"
  133345. "lsr r6, r8, #16\n\t"
  133346. "lsr r7, r9, #16\n\t"
  133347. "mul r7, r6, r7\n\t"
  133348. "adds r5, r5, r7\n\t"
  133349. "adc r3, r3, #0\n\t"
  133350. "lsl r7, r9, #16\n\t"
  133351. "lsr r7, r7, #16\n\t"
  133352. "mul r6, r7, r6\n\t"
  133353. "lsr r7, r6, #16\n\t"
  133354. "lsl r6, r6, #16\n\t"
  133355. "adds r4, r4, r6\n\t"
  133356. "adcs r5, r5, r7\n\t"
  133357. "adc r3, r3, #0\n\t"
  133358. #else
  133359. "umull r6, r7, r8, r9\n\t"
  133360. "adds r4, r4, r6\n\t"
  133361. "adcs r5, r5, r7\n\t"
  133362. "mov r3, #0\n\t"
  133363. "adc r3, r3, #0\n\t"
  133364. #endif
  133365. /* A[11] * B[14] */
  133366. "ldr r8, [%[a], #44]\n\t"
  133367. "ldr r9, [%[b], #56]\n\t"
  133368. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133369. "lsl r6, r8, #16\n\t"
  133370. "lsl r7, r9, #16\n\t"
  133371. "lsr r6, r6, #16\n\t"
  133372. "lsr r7, r7, #16\n\t"
  133373. "mul r7, r6, r7\n\t"
  133374. "adds r4, r4, r7\n\t"
  133375. "adcs r5, r5, #0\n\t"
  133376. "adc r3, r3, #0\n\t"
  133377. "lsr r7, r9, #16\n\t"
  133378. "mul r6, r7, r6\n\t"
  133379. "lsr r7, r6, #16\n\t"
  133380. "lsl r6, r6, #16\n\t"
  133381. "adds r4, r4, r6\n\t"
  133382. "adcs r5, r5, r7\n\t"
  133383. "adc r3, r3, #0\n\t"
  133384. "lsr r6, r8, #16\n\t"
  133385. "lsr r7, r9, #16\n\t"
  133386. "mul r7, r6, r7\n\t"
  133387. "adds r5, r5, r7\n\t"
  133388. "adc r3, r3, #0\n\t"
  133389. "lsl r7, r9, #16\n\t"
  133390. "lsr r7, r7, #16\n\t"
  133391. "mul r6, r7, r6\n\t"
  133392. "lsr r7, r6, #16\n\t"
  133393. "lsl r6, r6, #16\n\t"
  133394. "adds r4, r4, r6\n\t"
  133395. "adcs r5, r5, r7\n\t"
  133396. "adc r3, r3, #0\n\t"
  133397. #else
  133398. "umull r6, r7, r8, r9\n\t"
  133399. "adds r4, r4, r6\n\t"
  133400. "adcs r5, r5, r7\n\t"
  133401. "adc r3, r3, #0\n\t"
  133402. #endif
  133403. /* A[12] * B[13] */
  133404. "ldr r9, [%[b], #52]\n\t"
  133405. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133406. "lsl r6, r11, #16\n\t"
  133407. "lsl r7, r9, #16\n\t"
  133408. "lsr r6, r6, #16\n\t"
  133409. "lsr r7, r7, #16\n\t"
  133410. "mul r7, r6, r7\n\t"
  133411. "adds r4, r4, r7\n\t"
  133412. "adcs r5, r5, #0\n\t"
  133413. "adc r3, r3, #0\n\t"
  133414. "lsr r7, r9, #16\n\t"
  133415. "mul r6, r7, r6\n\t"
  133416. "lsr r7, r6, #16\n\t"
  133417. "lsl r6, r6, #16\n\t"
  133418. "adds r4, r4, r6\n\t"
  133419. "adcs r5, r5, r7\n\t"
  133420. "adc r3, r3, #0\n\t"
  133421. "lsr r6, r11, #16\n\t"
  133422. "lsr r7, r9, #16\n\t"
  133423. "mul r7, r6, r7\n\t"
  133424. "adds r5, r5, r7\n\t"
  133425. "adc r3, r3, #0\n\t"
  133426. "lsl r7, r9, #16\n\t"
  133427. "lsr r7, r7, #16\n\t"
  133428. "mul r6, r7, r6\n\t"
  133429. "lsr r7, r6, #16\n\t"
  133430. "lsl r6, r6, #16\n\t"
  133431. "adds r4, r4, r6\n\t"
  133432. "adcs r5, r5, r7\n\t"
  133433. "adc r3, r3, #0\n\t"
  133434. #else
  133435. "umull r6, r7, r11, r9\n\t"
  133436. "adds r4, r4, r6\n\t"
  133437. "adcs r5, r5, r7\n\t"
  133438. "adc r3, r3, #0\n\t"
  133439. #endif
  133440. /* A[13] * B[12] */
  133441. "ldr r8, [%[a], #52]\n\t"
  133442. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133443. "lsl r6, r8, #16\n\t"
  133444. "lsl r7, r12, #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, r12, #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, r12, #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, r12, #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, r12\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[14] * B[11] */
  133478. "ldr r8, [%[a], #56]\n\t"
  133479. "ldr r9, [%[b], #44]\n\t"
  133480. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133481. "lsl r6, r8, #16\n\t"
  133482. "lsl r7, r9, #16\n\t"
  133483. "lsr r6, r6, #16\n\t"
  133484. "lsr r7, r7, #16\n\t"
  133485. "mul r7, r6, r7\n\t"
  133486. "adds r4, r4, r7\n\t"
  133487. "adcs r5, r5, #0\n\t"
  133488. "adc r3, r3, #0\n\t"
  133489. "lsr r7, r9, #16\n\t"
  133490. "mul r6, r7, r6\n\t"
  133491. "lsr r7, r6, #16\n\t"
  133492. "lsl r6, r6, #16\n\t"
  133493. "adds r4, r4, r6\n\t"
  133494. "adcs r5, r5, r7\n\t"
  133495. "adc r3, r3, #0\n\t"
  133496. "lsr r6, r8, #16\n\t"
  133497. "lsr r7, r9, #16\n\t"
  133498. "mul r7, r6, r7\n\t"
  133499. "adds r5, r5, r7\n\t"
  133500. "adc r3, r3, #0\n\t"
  133501. "lsl r7, r9, #16\n\t"
  133502. "lsr r7, r7, #16\n\t"
  133503. "mul r6, r7, r6\n\t"
  133504. "lsr r7, r6, #16\n\t"
  133505. "lsl r6, r6, #16\n\t"
  133506. "adds r4, r4, r6\n\t"
  133507. "adcs r5, r5, r7\n\t"
  133508. "adc r3, r3, #0\n\t"
  133509. #else
  133510. "umull r6, r7, r8, r9\n\t"
  133511. "adds r4, r4, r6\n\t"
  133512. "adcs r5, r5, r7\n\t"
  133513. "adc r3, r3, #0\n\t"
  133514. #endif
  133515. /* A[15] * B[10] */
  133516. "ldr r8, [%[a], #60]\n\t"
  133517. "ldr r9, [%[b], #40]\n\t"
  133518. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133519. "lsl r6, r8, #16\n\t"
  133520. "lsl r7, r9, #16\n\t"
  133521. "lsr r6, r6, #16\n\t"
  133522. "lsr r7, r7, #16\n\t"
  133523. "mul r7, r6, r7\n\t"
  133524. "adds r4, r4, r7\n\t"
  133525. "adcs r5, r5, #0\n\t"
  133526. "adc r3, r3, #0\n\t"
  133527. "lsr r7, r9, #16\n\t"
  133528. "mul r6, r7, r6\n\t"
  133529. "lsr r7, r6, #16\n\t"
  133530. "lsl r6, r6, #16\n\t"
  133531. "adds r4, r4, r6\n\t"
  133532. "adcs r5, r5, r7\n\t"
  133533. "adc r3, r3, #0\n\t"
  133534. "lsr r6, r8, #16\n\t"
  133535. "lsr r7, r9, #16\n\t"
  133536. "mul r7, r6, r7\n\t"
  133537. "adds r5, r5, r7\n\t"
  133538. "adc r3, r3, #0\n\t"
  133539. "lsl r7, r9, #16\n\t"
  133540. "lsr r7, r7, #16\n\t"
  133541. "mul r6, r7, r6\n\t"
  133542. "lsr r7, r6, #16\n\t"
  133543. "lsl r6, r6, #16\n\t"
  133544. "adds r4, r4, r6\n\t"
  133545. "adcs r5, r5, r7\n\t"
  133546. "adc r3, r3, #0\n\t"
  133547. #else
  133548. "umull r6, r7, r8, r9\n\t"
  133549. "adds r4, r4, r6\n\t"
  133550. "adcs r5, r5, r7\n\t"
  133551. "adc r3, r3, #0\n\t"
  133552. #endif
  133553. "str r4, [%[r], #100]\n\t"
  133554. /* A[15] * B[11] */
  133555. "ldr r9, [%[b], #44]\n\t"
  133556. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133557. "lsl r6, r8, #16\n\t"
  133558. "lsl r7, r9, #16\n\t"
  133559. "lsr r6, r6, #16\n\t"
  133560. "lsr r7, r7, #16\n\t"
  133561. "mul r7, r6, r7\n\t"
  133562. "adds r5, r5, r7\n\t"
  133563. "adcs r3, r3, #0\n\t"
  133564. "mov r4, #0\n\t"
  133565. "adc r4, r4, #0\n\t"
  133566. "lsr r7, r9, #16\n\t"
  133567. "mul r6, r7, r6\n\t"
  133568. "lsr r7, r6, #16\n\t"
  133569. "lsl r6, r6, #16\n\t"
  133570. "adds r5, r5, r6\n\t"
  133571. "adcs r3, r3, r7\n\t"
  133572. "adc r4, r4, #0\n\t"
  133573. "lsr r6, r8, #16\n\t"
  133574. "lsr r7, r9, #16\n\t"
  133575. "mul r7, r6, r7\n\t"
  133576. "adds r3, r3, r7\n\t"
  133577. "adc r4, r4, #0\n\t"
  133578. "lsl r7, r9, #16\n\t"
  133579. "lsr r7, r7, #16\n\t"
  133580. "mul r6, r7, r6\n\t"
  133581. "lsr r7, r6, #16\n\t"
  133582. "lsl r6, r6, #16\n\t"
  133583. "adds r5, r5, r6\n\t"
  133584. "adcs r3, r3, r7\n\t"
  133585. "adc r4, r4, #0\n\t"
  133586. #else
  133587. "umull r6, r7, r8, r9\n\t"
  133588. "adds r5, r5, r6\n\t"
  133589. "adcs r3, r3, r7\n\t"
  133590. "mov r4, #0\n\t"
  133591. "adc r4, r4, #0\n\t"
  133592. #endif
  133593. /* A[14] * B[12] */
  133594. "ldr r8, [%[a], #56]\n\t"
  133595. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133596. "lsl r6, r8, #16\n\t"
  133597. "lsl r7, r12, #16\n\t"
  133598. "lsr r6, r6, #16\n\t"
  133599. "lsr r7, r7, #16\n\t"
  133600. "mul r7, r6, r7\n\t"
  133601. "adds r5, r5, r7\n\t"
  133602. "adcs r3, r3, #0\n\t"
  133603. "adc r4, r4, #0\n\t"
  133604. "lsr r7, r12, #16\n\t"
  133605. "mul r6, r7, r6\n\t"
  133606. "lsr r7, r6, #16\n\t"
  133607. "lsl r6, r6, #16\n\t"
  133608. "adds r5, r5, r6\n\t"
  133609. "adcs r3, r3, r7\n\t"
  133610. "adc r4, r4, #0\n\t"
  133611. "lsr r6, r8, #16\n\t"
  133612. "lsr r7, r12, #16\n\t"
  133613. "mul r7, r6, r7\n\t"
  133614. "adds r3, r3, r7\n\t"
  133615. "adc r4, r4, #0\n\t"
  133616. "lsl r7, r12, #16\n\t"
  133617. "lsr r7, r7, #16\n\t"
  133618. "mul r6, r7, r6\n\t"
  133619. "lsr r7, r6, #16\n\t"
  133620. "lsl r6, r6, #16\n\t"
  133621. "adds r5, r5, r6\n\t"
  133622. "adcs r3, r3, r7\n\t"
  133623. "adc r4, r4, #0\n\t"
  133624. #else
  133625. "umull r6, r7, r8, r12\n\t"
  133626. "adds r5, r5, r6\n\t"
  133627. "adcs r3, r3, r7\n\t"
  133628. "adc r4, r4, #0\n\t"
  133629. #endif
  133630. /* A[13] * B[13] */
  133631. "ldr r11, [%[a], #52]\n\t"
  133632. "ldr r12, [%[b], #52]\n\t"
  133633. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133634. "lsl r6, r11, #16\n\t"
  133635. "lsl r7, r12, #16\n\t"
  133636. "lsr r6, r6, #16\n\t"
  133637. "lsr r7, r7, #16\n\t"
  133638. "mul r7, r6, r7\n\t"
  133639. "adds r5, r5, r7\n\t"
  133640. "adcs r3, r3, #0\n\t"
  133641. "adc r4, r4, #0\n\t"
  133642. "lsr r7, r12, #16\n\t"
  133643. "mul r6, r7, r6\n\t"
  133644. "lsr r7, r6, #16\n\t"
  133645. "lsl r6, r6, #16\n\t"
  133646. "adds r5, r5, r6\n\t"
  133647. "adcs r3, r3, r7\n\t"
  133648. "adc r4, r4, #0\n\t"
  133649. "lsr r6, r11, #16\n\t"
  133650. "lsr r7, r12, #16\n\t"
  133651. "mul r7, r6, r7\n\t"
  133652. "adds r3, r3, r7\n\t"
  133653. "adc r4, r4, #0\n\t"
  133654. "lsl r7, r12, #16\n\t"
  133655. "lsr r7, r7, #16\n\t"
  133656. "mul r6, r7, r6\n\t"
  133657. "lsr r7, r6, #16\n\t"
  133658. "lsl r6, r6, #16\n\t"
  133659. "adds r5, r5, r6\n\t"
  133660. "adcs r3, r3, r7\n\t"
  133661. "adc r4, r4, #0\n\t"
  133662. #else
  133663. "umull r6, r7, r11, r12\n\t"
  133664. "adds r5, r5, r6\n\t"
  133665. "adcs r3, r3, r7\n\t"
  133666. "adc r4, r4, #0\n\t"
  133667. #endif
  133668. /* A[12] * B[14] */
  133669. "ldr r8, [%[a], #48]\n\t"
  133670. "ldr r9, [%[b], #56]\n\t"
  133671. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133672. "lsl r6, r8, #16\n\t"
  133673. "lsl r7, r9, #16\n\t"
  133674. "lsr r6, r6, #16\n\t"
  133675. "lsr r7, r7, #16\n\t"
  133676. "mul r7, r6, r7\n\t"
  133677. "adds r5, r5, r7\n\t"
  133678. "adcs r3, r3, #0\n\t"
  133679. "adc r4, r4, #0\n\t"
  133680. "lsr r7, r9, #16\n\t"
  133681. "mul r6, r7, r6\n\t"
  133682. "lsr r7, r6, #16\n\t"
  133683. "lsl r6, r6, #16\n\t"
  133684. "adds r5, r5, r6\n\t"
  133685. "adcs r3, r3, r7\n\t"
  133686. "adc r4, r4, #0\n\t"
  133687. "lsr r6, r8, #16\n\t"
  133688. "lsr r7, r9, #16\n\t"
  133689. "mul r7, r6, r7\n\t"
  133690. "adds r3, r3, r7\n\t"
  133691. "adc r4, r4, #0\n\t"
  133692. "lsl r7, r9, #16\n\t"
  133693. "lsr r7, r7, #16\n\t"
  133694. "mul r6, r7, r6\n\t"
  133695. "lsr r7, r6, #16\n\t"
  133696. "lsl r6, r6, #16\n\t"
  133697. "adds r5, r5, r6\n\t"
  133698. "adcs r3, r3, r7\n\t"
  133699. "adc r4, r4, #0\n\t"
  133700. #else
  133701. "umull r6, r7, r8, r9\n\t"
  133702. "adds r5, r5, r6\n\t"
  133703. "adcs r3, r3, r7\n\t"
  133704. "adc r4, r4, #0\n\t"
  133705. #endif
  133706. /* A[11] * B[15] */
  133707. "ldr r8, [%[a], #44]\n\t"
  133708. "ldr r9, [%[b], #60]\n\t"
  133709. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133710. "lsl r6, r8, #16\n\t"
  133711. "lsl r7, r9, #16\n\t"
  133712. "lsr r6, r6, #16\n\t"
  133713. "lsr r7, r7, #16\n\t"
  133714. "mul r7, r6, r7\n\t"
  133715. "adds r5, r5, r7\n\t"
  133716. "adcs r3, r3, #0\n\t"
  133717. "adc r4, r4, #0\n\t"
  133718. "lsr r7, r9, #16\n\t"
  133719. "mul r6, r7, r6\n\t"
  133720. "lsr r7, r6, #16\n\t"
  133721. "lsl r6, r6, #16\n\t"
  133722. "adds r5, r5, r6\n\t"
  133723. "adcs r3, r3, r7\n\t"
  133724. "adc r4, r4, #0\n\t"
  133725. "lsr r6, r8, #16\n\t"
  133726. "lsr r7, r9, #16\n\t"
  133727. "mul r7, r6, r7\n\t"
  133728. "adds r3, r3, r7\n\t"
  133729. "adc r4, r4, #0\n\t"
  133730. "lsl r7, r9, #16\n\t"
  133731. "lsr r7, r7, #16\n\t"
  133732. "mul r6, r7, r6\n\t"
  133733. "lsr r7, r6, #16\n\t"
  133734. "lsl r6, r6, #16\n\t"
  133735. "adds r5, r5, r6\n\t"
  133736. "adcs r3, r3, r7\n\t"
  133737. "adc r4, r4, #0\n\t"
  133738. #else
  133739. "umull r6, r7, r8, r9\n\t"
  133740. "adds r5, r5, r6\n\t"
  133741. "adcs r3, r3, r7\n\t"
  133742. "adc r4, r4, #0\n\t"
  133743. #endif
  133744. "str r5, [%[r], #104]\n\t"
  133745. /* A[12] * B[15] */
  133746. "ldr r8, [%[a], #48]\n\t"
  133747. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133748. "lsl r6, r8, #16\n\t"
  133749. "lsl r7, r9, #16\n\t"
  133750. "lsr r6, r6, #16\n\t"
  133751. "lsr r7, r7, #16\n\t"
  133752. "mul r7, r6, r7\n\t"
  133753. "adds r3, r3, r7\n\t"
  133754. "adcs r4, r4, #0\n\t"
  133755. "mov r5, #0\n\t"
  133756. "adc r5, r5, #0\n\t"
  133757. "lsr r7, r9, #16\n\t"
  133758. "mul r6, r7, r6\n\t"
  133759. "lsr r7, r6, #16\n\t"
  133760. "lsl r6, r6, #16\n\t"
  133761. "adds r3, r3, r6\n\t"
  133762. "adcs r4, r4, r7\n\t"
  133763. "adc r5, r5, #0\n\t"
  133764. "lsr r6, r8, #16\n\t"
  133765. "lsr r7, r9, #16\n\t"
  133766. "mul r7, r6, r7\n\t"
  133767. "adds r4, r4, r7\n\t"
  133768. "adc r5, r5, #0\n\t"
  133769. "lsl r7, r9, #16\n\t"
  133770. "lsr r7, r7, #16\n\t"
  133771. "mul r6, r7, r6\n\t"
  133772. "lsr r7, r6, #16\n\t"
  133773. "lsl r6, r6, #16\n\t"
  133774. "adds r3, r3, r6\n\t"
  133775. "adcs r4, r4, r7\n\t"
  133776. "adc r5, r5, #0\n\t"
  133777. #else
  133778. "umull r6, r7, r8, r9\n\t"
  133779. "adds r3, r3, r6\n\t"
  133780. "adcs r4, r4, r7\n\t"
  133781. "mov r5, #0\n\t"
  133782. "adc r5, r5, #0\n\t"
  133783. #endif
  133784. /* A[13] * B[14] */
  133785. "ldr r9, [%[b], #56]\n\t"
  133786. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133787. "lsl r6, r11, #16\n\t"
  133788. "lsl r7, r9, #16\n\t"
  133789. "lsr r6, r6, #16\n\t"
  133790. "lsr r7, r7, #16\n\t"
  133791. "mul r7, r6, r7\n\t"
  133792. "adds r3, r3, r7\n\t"
  133793. "adcs r4, r4, #0\n\t"
  133794. "adc r5, r5, #0\n\t"
  133795. "lsr r7, r9, #16\n\t"
  133796. "mul r6, r7, r6\n\t"
  133797. "lsr r7, r6, #16\n\t"
  133798. "lsl r6, r6, #16\n\t"
  133799. "adds r3, r3, r6\n\t"
  133800. "adcs r4, r4, r7\n\t"
  133801. "adc r5, r5, #0\n\t"
  133802. "lsr r6, r11, #16\n\t"
  133803. "lsr r7, r9, #16\n\t"
  133804. "mul r7, r6, r7\n\t"
  133805. "adds r4, r4, r7\n\t"
  133806. "adc r5, r5, #0\n\t"
  133807. "lsl r7, r9, #16\n\t"
  133808. "lsr r7, r7, #16\n\t"
  133809. "mul r6, r7, r6\n\t"
  133810. "lsr r7, r6, #16\n\t"
  133811. "lsl r6, r6, #16\n\t"
  133812. "adds r3, r3, r6\n\t"
  133813. "adcs r4, r4, r7\n\t"
  133814. "adc r5, r5, #0\n\t"
  133815. #else
  133816. "umull r6, r7, r11, r9\n\t"
  133817. "adds r3, r3, r6\n\t"
  133818. "adcs r4, r4, r7\n\t"
  133819. "adc r5, r5, #0\n\t"
  133820. #endif
  133821. /* A[14] * B[13] */
  133822. "ldr r8, [%[a], #56]\n\t"
  133823. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133824. "lsl r6, r8, #16\n\t"
  133825. "lsl r7, r12, #16\n\t"
  133826. "lsr r6, r6, #16\n\t"
  133827. "lsr r7, r7, #16\n\t"
  133828. "mul r7, r6, r7\n\t"
  133829. "adds r3, r3, r7\n\t"
  133830. "adcs r4, r4, #0\n\t"
  133831. "adc r5, r5, #0\n\t"
  133832. "lsr r7, r12, #16\n\t"
  133833. "mul r6, r7, r6\n\t"
  133834. "lsr r7, r6, #16\n\t"
  133835. "lsl r6, r6, #16\n\t"
  133836. "adds r3, r3, r6\n\t"
  133837. "adcs r4, r4, r7\n\t"
  133838. "adc r5, r5, #0\n\t"
  133839. "lsr r6, r8, #16\n\t"
  133840. "lsr r7, r12, #16\n\t"
  133841. "mul r7, r6, r7\n\t"
  133842. "adds r4, r4, r7\n\t"
  133843. "adc r5, r5, #0\n\t"
  133844. "lsl r7, r12, #16\n\t"
  133845. "lsr r7, r7, #16\n\t"
  133846. "mul r6, r7, r6\n\t"
  133847. "lsr r7, r6, #16\n\t"
  133848. "lsl r6, r6, #16\n\t"
  133849. "adds r3, r3, r6\n\t"
  133850. "adcs r4, r4, r7\n\t"
  133851. "adc r5, r5, #0\n\t"
  133852. #else
  133853. "umull r6, r7, r8, r12\n\t"
  133854. "adds r3, r3, r6\n\t"
  133855. "adcs r4, r4, r7\n\t"
  133856. "adc r5, r5, #0\n\t"
  133857. #endif
  133858. /* A[15] * B[12] */
  133859. "ldr r8, [%[a], #60]\n\t"
  133860. "ldr r9, [%[b], #48]\n\t"
  133861. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133862. "lsl r6, r8, #16\n\t"
  133863. "lsl r7, r9, #16\n\t"
  133864. "lsr r6, r6, #16\n\t"
  133865. "lsr r7, r7, #16\n\t"
  133866. "mul r7, r6, r7\n\t"
  133867. "adds r3, r3, r7\n\t"
  133868. "adcs r4, r4, #0\n\t"
  133869. "adc r5, r5, #0\n\t"
  133870. "lsr r7, r9, #16\n\t"
  133871. "mul r6, r7, r6\n\t"
  133872. "lsr r7, r6, #16\n\t"
  133873. "lsl r6, r6, #16\n\t"
  133874. "adds r3, r3, r6\n\t"
  133875. "adcs r4, r4, r7\n\t"
  133876. "adc r5, r5, #0\n\t"
  133877. "lsr r6, r8, #16\n\t"
  133878. "lsr r7, r9, #16\n\t"
  133879. "mul r7, r6, r7\n\t"
  133880. "adds r4, r4, r7\n\t"
  133881. "adc r5, r5, #0\n\t"
  133882. "lsl r7, r9, #16\n\t"
  133883. "lsr r7, r7, #16\n\t"
  133884. "mul r6, r7, r6\n\t"
  133885. "lsr r7, r6, #16\n\t"
  133886. "lsl r6, r6, #16\n\t"
  133887. "adds r3, r3, r6\n\t"
  133888. "adcs r4, r4, r7\n\t"
  133889. "adc r5, r5, #0\n\t"
  133890. #else
  133891. "umull r6, r7, r8, r9\n\t"
  133892. "adds r3, r3, r6\n\t"
  133893. "adcs r4, r4, r7\n\t"
  133894. "adc r5, r5, #0\n\t"
  133895. #endif
  133896. "str r3, [%[r], #108]\n\t"
  133897. /* A[15] * B[13] */
  133898. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133899. "lsl r6, r8, #16\n\t"
  133900. "lsl r7, r12, #16\n\t"
  133901. "lsr r6, r6, #16\n\t"
  133902. "lsr r7, r7, #16\n\t"
  133903. "mul r7, r6, r7\n\t"
  133904. "adds r4, r4, r7\n\t"
  133905. "adcs r5, r5, #0\n\t"
  133906. "mov r3, #0\n\t"
  133907. "adc r3, r3, #0\n\t"
  133908. "lsr r7, r12, #16\n\t"
  133909. "mul r6, r7, r6\n\t"
  133910. "lsr r7, r6, #16\n\t"
  133911. "lsl r6, r6, #16\n\t"
  133912. "adds r4, r4, r6\n\t"
  133913. "adcs r5, r5, r7\n\t"
  133914. "adc r3, r3, #0\n\t"
  133915. "lsr r6, r8, #16\n\t"
  133916. "lsr r7, r12, #16\n\t"
  133917. "mul r7, r6, r7\n\t"
  133918. "adds r5, r5, r7\n\t"
  133919. "adc r3, r3, #0\n\t"
  133920. "lsl r7, r12, #16\n\t"
  133921. "lsr r7, r7, #16\n\t"
  133922. "mul r6, r7, r6\n\t"
  133923. "lsr r7, r6, #16\n\t"
  133924. "lsl r6, r6, #16\n\t"
  133925. "adds r4, r4, r6\n\t"
  133926. "adcs r5, r5, r7\n\t"
  133927. "adc r3, r3, #0\n\t"
  133928. #else
  133929. "umull r6, r7, r8, r12\n\t"
  133930. "adds r4, r4, r6\n\t"
  133931. "adcs r5, r5, r7\n\t"
  133932. "mov r3, #0\n\t"
  133933. "adc r3, r3, #0\n\t"
  133934. #endif
  133935. /* A[14] * B[14] */
  133936. "ldr r11, [%[a], #56]\n\t"
  133937. "ldr r12, [%[b], #56]\n\t"
  133938. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133939. "lsl r6, r11, #16\n\t"
  133940. "lsl r7, r12, #16\n\t"
  133941. "lsr r6, r6, #16\n\t"
  133942. "lsr r7, r7, #16\n\t"
  133943. "mul r7, r6, r7\n\t"
  133944. "adds r4, r4, r7\n\t"
  133945. "adcs r5, r5, #0\n\t"
  133946. "adc r3, r3, #0\n\t"
  133947. "lsr r7, r12, #16\n\t"
  133948. "mul r6, r7, r6\n\t"
  133949. "lsr r7, r6, #16\n\t"
  133950. "lsl r6, r6, #16\n\t"
  133951. "adds r4, r4, r6\n\t"
  133952. "adcs r5, r5, r7\n\t"
  133953. "adc r3, r3, #0\n\t"
  133954. "lsr r6, r11, #16\n\t"
  133955. "lsr r7, r12, #16\n\t"
  133956. "mul r7, r6, r7\n\t"
  133957. "adds r5, r5, r7\n\t"
  133958. "adc r3, r3, #0\n\t"
  133959. "lsl r7, r12, #16\n\t"
  133960. "lsr r7, r7, #16\n\t"
  133961. "mul r6, r7, r6\n\t"
  133962. "lsr r7, r6, #16\n\t"
  133963. "lsl r6, r6, #16\n\t"
  133964. "adds r4, r4, r6\n\t"
  133965. "adcs r5, r5, r7\n\t"
  133966. "adc r3, r3, #0\n\t"
  133967. #else
  133968. "umull r6, r7, r11, r12\n\t"
  133969. "adds r4, r4, r6\n\t"
  133970. "adcs r5, r5, r7\n\t"
  133971. "adc r3, r3, #0\n\t"
  133972. #endif
  133973. /* A[13] * B[15] */
  133974. "ldr r8, [%[a], #52]\n\t"
  133975. "ldr r9, [%[b], #60]\n\t"
  133976. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  133977. "lsl r6, r8, #16\n\t"
  133978. "lsl r7, r9, #16\n\t"
  133979. "lsr r6, r6, #16\n\t"
  133980. "lsr r7, r7, #16\n\t"
  133981. "mul r7, r6, r7\n\t"
  133982. "adds r4, r4, r7\n\t"
  133983. "adcs r5, r5, #0\n\t"
  133984. "adc r3, r3, #0\n\t"
  133985. "lsr r7, r9, #16\n\t"
  133986. "mul r6, r7, r6\n\t"
  133987. "lsr r7, r6, #16\n\t"
  133988. "lsl r6, r6, #16\n\t"
  133989. "adds r4, r4, r6\n\t"
  133990. "adcs r5, r5, r7\n\t"
  133991. "adc r3, r3, #0\n\t"
  133992. "lsr r6, r8, #16\n\t"
  133993. "lsr r7, r9, #16\n\t"
  133994. "mul r7, r6, r7\n\t"
  133995. "adds r5, r5, r7\n\t"
  133996. "adc r3, r3, #0\n\t"
  133997. "lsl r7, r9, #16\n\t"
  133998. "lsr r7, r7, #16\n\t"
  133999. "mul r6, r7, r6\n\t"
  134000. "lsr r7, r6, #16\n\t"
  134001. "lsl r6, r6, #16\n\t"
  134002. "adds r4, r4, r6\n\t"
  134003. "adcs r5, r5, r7\n\t"
  134004. "adc r3, r3, #0\n\t"
  134005. #else
  134006. "umull r6, r7, r8, r9\n\t"
  134007. "adds r4, r4, r6\n\t"
  134008. "adcs r5, r5, r7\n\t"
  134009. "adc r3, r3, #0\n\t"
  134010. #endif
  134011. "str r4, [%[r], #112]\n\t"
  134012. /* A[14] * B[15] */
  134013. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134014. "lsl r6, r11, #16\n\t"
  134015. "lsl r7, r9, #16\n\t"
  134016. "lsr r6, r6, #16\n\t"
  134017. "lsr r7, r7, #16\n\t"
  134018. "mul r7, r6, r7\n\t"
  134019. "adds r5, r5, r7\n\t"
  134020. "adcs r3, r3, #0\n\t"
  134021. "mov r4, #0\n\t"
  134022. "adc r4, r4, #0\n\t"
  134023. "lsr r7, r9, #16\n\t"
  134024. "mul r6, r7, r6\n\t"
  134025. "lsr r7, r6, #16\n\t"
  134026. "lsl r6, r6, #16\n\t"
  134027. "adds r5, r5, r6\n\t"
  134028. "adcs r3, r3, r7\n\t"
  134029. "adc r4, r4, #0\n\t"
  134030. "lsr r6, r11, #16\n\t"
  134031. "lsr r7, r9, #16\n\t"
  134032. "mul r7, r6, r7\n\t"
  134033. "adds r3, r3, r7\n\t"
  134034. "adc r4, r4, #0\n\t"
  134035. "lsl r7, r9, #16\n\t"
  134036. "lsr r7, r7, #16\n\t"
  134037. "mul r6, r7, r6\n\t"
  134038. "lsr r7, r6, #16\n\t"
  134039. "lsl r6, r6, #16\n\t"
  134040. "adds r5, r5, r6\n\t"
  134041. "adcs r3, r3, r7\n\t"
  134042. "adc r4, r4, #0\n\t"
  134043. #else
  134044. "umull r6, r7, r11, r9\n\t"
  134045. "adds r5, r5, r6\n\t"
  134046. "adcs r3, r3, r7\n\t"
  134047. "mov r4, #0\n\t"
  134048. "adc r4, r4, #0\n\t"
  134049. #endif
  134050. /* A[15] * B[14] */
  134051. "ldr r8, [%[a], #60]\n\t"
  134052. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134053. "lsl r6, r8, #16\n\t"
  134054. "lsl r7, r12, #16\n\t"
  134055. "lsr r6, r6, #16\n\t"
  134056. "lsr r7, r7, #16\n\t"
  134057. "mul r7, r6, r7\n\t"
  134058. "adds r5, r5, r7\n\t"
  134059. "adcs r3, r3, #0\n\t"
  134060. "adc r4, r4, #0\n\t"
  134061. "lsr r7, r12, #16\n\t"
  134062. "mul r6, r7, r6\n\t"
  134063. "lsr r7, r6, #16\n\t"
  134064. "lsl r6, r6, #16\n\t"
  134065. "adds r5, r5, r6\n\t"
  134066. "adcs r3, r3, r7\n\t"
  134067. "adc r4, r4, #0\n\t"
  134068. "lsr r6, r8, #16\n\t"
  134069. "lsr r7, r12, #16\n\t"
  134070. "mul r7, r6, r7\n\t"
  134071. "adds r3, r3, r7\n\t"
  134072. "adc r4, r4, #0\n\t"
  134073. "lsl r7, r12, #16\n\t"
  134074. "lsr r7, r7, #16\n\t"
  134075. "mul r6, r7, r6\n\t"
  134076. "lsr r7, r6, #16\n\t"
  134077. "lsl r6, r6, #16\n\t"
  134078. "adds r5, r5, r6\n\t"
  134079. "adcs r3, r3, r7\n\t"
  134080. "adc r4, r4, #0\n\t"
  134081. #else
  134082. "umull r6, r7, r8, r12\n\t"
  134083. "adds r5, r5, r6\n\t"
  134084. "adcs r3, r3, r7\n\t"
  134085. "adc r4, r4, #0\n\t"
  134086. #endif
  134087. "str r5, [%[r], #116]\n\t"
  134088. /* A[15] * B[15] */
  134089. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134090. "lsl r6, r8, #16\n\t"
  134091. "lsl r7, r9, #16\n\t"
  134092. "lsr r6, r6, #16\n\t"
  134093. "lsr r7, r7, #16\n\t"
  134094. "mul r7, r6, r7\n\t"
  134095. "adds r3, r3, r7\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 r3, r3, r6\n\t"
  134102. "adc r4, r4, r7\n\t"
  134103. "lsr r6, r8, #16\n\t"
  134104. "lsr r7, r9, #16\n\t"
  134105. "mul r7, r6, r7\n\t"
  134106. "add r4, r4, r7\n\t"
  134107. "lsl r7, r9, #16\n\t"
  134108. "lsr r7, r7, #16\n\t"
  134109. "mul r6, r7, r6\n\t"
  134110. "lsr r7, r6, #16\n\t"
  134111. "lsl r6, r6, #16\n\t"
  134112. "adds r3, r3, r6\n\t"
  134113. "adc r4, r4, r7\n\t"
  134114. #else
  134115. "umlal r3, r4, r8, r9\n\t"
  134116. #endif
  134117. "str r3, [%[r], #120]\n\t"
  134118. "str r4, [%[r], #124]\n\t"
  134119. "ldm sp!, {r3, r4, r5, r6}\n\t"
  134120. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  134121. "ldm sp!, {r3, r4, r5, r6}\n\t"
  134122. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  134123. "ldm sp!, {r3, r4, r5, r6}\n\t"
  134124. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  134125. "ldm sp!, {r3, r4, r5, r6}\n\t"
  134126. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  134127. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  134128. :
  134129. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc"
  134130. );
  134131. }
  134132. /* Square a and put result in r. (r = a * a)
  134133. *
  134134. * r A single precision integer.
  134135. * a A single precision integer.
  134136. */
  134137. static void sp_1024_sqr_16(sp_digit* r_p, const sp_digit* a_p)
  134138. {
  134139. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  134140. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  134141. __asm__ __volatile__ (
  134142. "sub sp, sp, #0x40\n\t"
  134143. /* A[0] * A[0] */
  134144. "ldr r10, [%[a]]\n\t"
  134145. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134146. "lsr r9, r10, #16\n\t"
  134147. "lsl r2, r10, #16\n\t"
  134148. "lsr r2, r2, #16\n\t"
  134149. "mul r8, r2, r2\n\t"
  134150. "mul r3, r9, r9\n\t"
  134151. "mul r2, r9, r2\n\t"
  134152. "lsr r9, r2, #15\n\t"
  134153. "lsl r2, r2, #17\n\t"
  134154. "adds r8, r8, r2\n\t"
  134155. "adc r3, r3, r9\n\t"
  134156. #else
  134157. "umull r8, r3, r10, r10\n\t"
  134158. #endif
  134159. "mov r4, #0\n\t"
  134160. "str r8, [sp]\n\t"
  134161. /* A[0] * A[1] */
  134162. "ldr r10, [%[a], #4]\n\t"
  134163. "ldr r12, [%[a]]\n\t"
  134164. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134165. "lsl r8, r10, #16\n\t"
  134166. "lsl r9, r12, #16\n\t"
  134167. "lsr r8, r8, #16\n\t"
  134168. "lsr r9, r9, #16\n\t"
  134169. "mul r9, r8, r9\n\t"
  134170. "adds r3, r3, r9\n\t"
  134171. "adcs r4, r4, #0\n\t"
  134172. "mov r2, #0\n\t"
  134173. "adc r2, r2, #0\n\t"
  134174. "adds r3, r3, r9\n\t"
  134175. "adcs r4, r4, #0\n\t"
  134176. "adc r2, r2, #0\n\t"
  134177. "lsr r9, r12, #16\n\t"
  134178. "mul r8, r9, r8\n\t"
  134179. "lsr r9, r8, #16\n\t"
  134180. "lsl r8, r8, #16\n\t"
  134181. "adds r3, r3, r8\n\t"
  134182. "adcs r4, r4, r9\n\t"
  134183. "adc r2, r2, #0\n\t"
  134184. "adds r3, r3, r8\n\t"
  134185. "adcs r4, r4, r9\n\t"
  134186. "adc r2, r2, #0\n\t"
  134187. "lsr r8, r10, #16\n\t"
  134188. "lsr r9, r12, #16\n\t"
  134189. "mul r9, r8, r9\n\t"
  134190. "adds r4, r4, r9\n\t"
  134191. "adc r2, r2, #0\n\t"
  134192. "adds r4, r4, r9\n\t"
  134193. "adc r2, r2, #0\n\t"
  134194. "lsl r9, r12, #16\n\t"
  134195. "lsr r9, r9, #16\n\t"
  134196. "mul r8, r9, r8\n\t"
  134197. "lsr r9, r8, #16\n\t"
  134198. "lsl r8, r8, #16\n\t"
  134199. "adds r3, r3, r8\n\t"
  134200. "adcs r4, r4, r9\n\t"
  134201. "adc r2, r2, #0\n\t"
  134202. "adds r3, r3, r8\n\t"
  134203. "adcs r4, r4, r9\n\t"
  134204. "adc r2, r2, #0\n\t"
  134205. #else
  134206. "umull r8, r9, r10, r12\n\t"
  134207. "adds r3, r3, r8\n\t"
  134208. "adcs r4, r4, r9\n\t"
  134209. "mov r2, #0\n\t"
  134210. "adc r2, r2, #0\n\t"
  134211. "adds r3, r3, r8\n\t"
  134212. "adcs r4, r4, r9\n\t"
  134213. "mov r2, #0\n\t"
  134214. "adc r2, r2, #0\n\t"
  134215. #endif
  134216. "str r3, [sp, #4]\n\t"
  134217. /* A[0] * A[2] */
  134218. "ldr r10, [%[a], #8]\n\t"
  134219. "ldr r12, [%[a]]\n\t"
  134220. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134221. "lsl r8, r10, #16\n\t"
  134222. "lsl r9, r12, #16\n\t"
  134223. "lsr r8, r8, #16\n\t"
  134224. "lsr r9, r9, #16\n\t"
  134225. "mul r9, r8, r9\n\t"
  134226. "adds r4, r4, r9\n\t"
  134227. "adcs r2, r2, #0\n\t"
  134228. "mov r3, #0\n\t"
  134229. "adc r3, r3, #0\n\t"
  134230. "adds r4, r4, r9\n\t"
  134231. "adcs r2, r2, #0\n\t"
  134232. "adc r3, r3, #0\n\t"
  134233. "lsr r9, r12, #16\n\t"
  134234. "mul r8, r9, r8\n\t"
  134235. "lsr r9, r8, #16\n\t"
  134236. "lsl r8, r8, #16\n\t"
  134237. "adds r4, r4, r8\n\t"
  134238. "adcs r2, r2, r9\n\t"
  134239. "adc r3, r3, #0\n\t"
  134240. "adds r4, r4, r8\n\t"
  134241. "adcs r2, r2, r9\n\t"
  134242. "adc r3, r3, #0\n\t"
  134243. "lsr r8, r10, #16\n\t"
  134244. "lsr r9, r12, #16\n\t"
  134245. "mul r9, r8, r9\n\t"
  134246. "adds r2, r2, r9\n\t"
  134247. "adc r3, r3, #0\n\t"
  134248. "adds r2, r2, r9\n\t"
  134249. "adc r3, r3, #0\n\t"
  134250. "lsl r9, r12, #16\n\t"
  134251. "lsr r9, r9, #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 r4, r4, r8\n\t"
  134256. "adcs r2, r2, r9\n\t"
  134257. "adc r3, r3, #0\n\t"
  134258. "adds r4, r4, r8\n\t"
  134259. "adcs r2, r2, r9\n\t"
  134260. "adc r3, r3, #0\n\t"
  134261. #else
  134262. "umull r8, r9, r10, r12\n\t"
  134263. "adds r4, r4, r8\n\t"
  134264. "adcs r2, r2, r9\n\t"
  134265. "mov r3, #0\n\t"
  134266. "adc r3, r3, #0\n\t"
  134267. "adds r4, r4, r8\n\t"
  134268. "adcs r2, r2, r9\n\t"
  134269. "mov r3, #0\n\t"
  134270. "adc r3, r3, #0\n\t"
  134271. #endif
  134272. /* A[1] * A[1] */
  134273. "ldr r10, [%[a], #4]\n\t"
  134274. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134275. "lsl r8, r10, #16\n\t"
  134276. "lsr r9, r10, #16\n\t"
  134277. "lsr r8, r8, #16\n\t"
  134278. "mov r12, r8\n\t"
  134279. "mul r8, r12, r8\n\t"
  134280. "mov r12, r9\n\t"
  134281. "mul r9, r12, r9\n\t"
  134282. "adds r4, r4, r8\n\t"
  134283. "adcs r2, r2, r9\n\t"
  134284. "adc r3, r3, #0\n\t"
  134285. "lsr r9, r10, #16\n\t"
  134286. "lsl r8, r10, #16\n\t"
  134287. "lsr r8, r8, #16\n\t"
  134288. "mul r8, r9, r8\n\t"
  134289. "lsr r9, r8, #15\n\t"
  134290. "lsl r8, r8, #17\n\t"
  134291. "adds r4, r4, r8\n\t"
  134292. "adcs r2, r2, r9\n\t"
  134293. "adc r3, r3, #0\n\t"
  134294. #else
  134295. "umull r8, r9, r10, r10\n\t"
  134296. "adds r4, r4, r8\n\t"
  134297. "adcs r2, r2, r9\n\t"
  134298. "adc r3, r3, #0\n\t"
  134299. #endif
  134300. "str r4, [sp, #8]\n\t"
  134301. /* A[0] * A[3] */
  134302. "ldr r10, [%[a], #12]\n\t"
  134303. "ldr r12, [%[a]]\n\t"
  134304. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134305. "lsl r8, r10, #16\n\t"
  134306. "lsl r9, r12, #16\n\t"
  134307. "lsr r8, r8, #16\n\t"
  134308. "lsr r9, r9, #16\n\t"
  134309. "mul r9, r8, r9\n\t"
  134310. "adds r2, r2, r9\n\t"
  134311. "adcs r3, r3, #0\n\t"
  134312. "mov r4, #0\n\t"
  134313. "adc r4, r4, #0\n\t"
  134314. "adds r2, r2, r9\n\t"
  134315. "adcs r3, r3, #0\n\t"
  134316. "adc r4, r4, #0\n\t"
  134317. "lsr r9, r12, #16\n\t"
  134318. "mul r8, r9, r8\n\t"
  134319. "lsr r9, r8, #16\n\t"
  134320. "lsl r8, r8, #16\n\t"
  134321. "adds r2, r2, r8\n\t"
  134322. "adcs r3, r3, r9\n\t"
  134323. "adc r4, r4, #0\n\t"
  134324. "adds r2, r2, r8\n\t"
  134325. "adcs r3, r3, r9\n\t"
  134326. "adc r4, r4, #0\n\t"
  134327. "lsr r8, r10, #16\n\t"
  134328. "lsr r9, r12, #16\n\t"
  134329. "mul r9, r8, r9\n\t"
  134330. "adds r3, r3, r9\n\t"
  134331. "adc r4, r4, #0\n\t"
  134332. "adds r3, r3, r9\n\t"
  134333. "adc r4, r4, #0\n\t"
  134334. "lsl r9, r12, #16\n\t"
  134335. "lsr r9, r9, #16\n\t"
  134336. "mul r8, r9, r8\n\t"
  134337. "lsr r9, r8, #16\n\t"
  134338. "lsl r8, r8, #16\n\t"
  134339. "adds r2, r2, r8\n\t"
  134340. "adcs r3, r3, r9\n\t"
  134341. "adc r4, r4, #0\n\t"
  134342. "adds r2, r2, r8\n\t"
  134343. "adcs r3, r3, r9\n\t"
  134344. "adc r4, r4, #0\n\t"
  134345. #else
  134346. "umull r8, r9, r10, r12\n\t"
  134347. "adds r2, r2, r8\n\t"
  134348. "adcs r3, r3, r9\n\t"
  134349. "mov r4, #0\n\t"
  134350. "adc r4, r4, #0\n\t"
  134351. "adds r2, r2, r8\n\t"
  134352. "adcs r3, r3, r9\n\t"
  134353. "mov r4, #0\n\t"
  134354. "adc r4, r4, #0\n\t"
  134355. #endif
  134356. /* A[1] * A[2] */
  134357. "ldr r10, [%[a], #8]\n\t"
  134358. "ldr r12, [%[a], #4]\n\t"
  134359. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134360. "lsl r8, r10, #16\n\t"
  134361. "lsl r9, r12, #16\n\t"
  134362. "lsr r8, r8, #16\n\t"
  134363. "lsr r9, r9, #16\n\t"
  134364. "mul r9, r8, r9\n\t"
  134365. "adds r2, r2, r9\n\t"
  134366. "adcs r3, r3, #0\n\t"
  134367. "adc r4, r4, #0\n\t"
  134368. "adds r2, r2, r9\n\t"
  134369. "adcs r3, r3, #0\n\t"
  134370. "adc r4, r4, #0\n\t"
  134371. "lsr r9, r12, #16\n\t"
  134372. "mul r8, r9, r8\n\t"
  134373. "lsr r9, r8, #16\n\t"
  134374. "lsl r8, r8, #16\n\t"
  134375. "adds r2, r2, r8\n\t"
  134376. "adcs r3, r3, r9\n\t"
  134377. "adc r4, r4, #0\n\t"
  134378. "adds r2, r2, r8\n\t"
  134379. "adcs r3, r3, r9\n\t"
  134380. "adc r4, r4, #0\n\t"
  134381. "lsr r8, r10, #16\n\t"
  134382. "lsr r9, r12, #16\n\t"
  134383. "mul r9, r8, r9\n\t"
  134384. "adds r3, r3, r9\n\t"
  134385. "adc r4, r4, #0\n\t"
  134386. "adds r3, r3, r9\n\t"
  134387. "adc r4, r4, #0\n\t"
  134388. "lsl r9, r12, #16\n\t"
  134389. "lsr r9, r9, #16\n\t"
  134390. "mul r8, r9, r8\n\t"
  134391. "lsr r9, r8, #16\n\t"
  134392. "lsl r8, r8, #16\n\t"
  134393. "adds r2, r2, r8\n\t"
  134394. "adcs r3, r3, r9\n\t"
  134395. "adc r4, r4, #0\n\t"
  134396. "adds r2, r2, r8\n\t"
  134397. "adcs r3, r3, r9\n\t"
  134398. "adc r4, r4, #0\n\t"
  134399. #else
  134400. "umull r8, r9, r10, r12\n\t"
  134401. "adds r2, r2, r8\n\t"
  134402. "adcs r3, r3, r9\n\t"
  134403. "adc r4, r4, #0\n\t"
  134404. "adds r2, r2, r8\n\t"
  134405. "adcs r3, r3, r9\n\t"
  134406. "adc r4, r4, #0\n\t"
  134407. #endif
  134408. "str r2, [sp, #12]\n\t"
  134409. /* A[0] * A[4] */
  134410. "ldr r10, [%[a], #16]\n\t"
  134411. "ldr r12, [%[a]]\n\t"
  134412. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134413. "lsl r8, r10, #16\n\t"
  134414. "lsl r9, r12, #16\n\t"
  134415. "lsr r8, r8, #16\n\t"
  134416. "lsr r9, r9, #16\n\t"
  134417. "mul r9, r8, r9\n\t"
  134418. "adds r3, r3, r9\n\t"
  134419. "adcs r4, r4, #0\n\t"
  134420. "mov r2, #0\n\t"
  134421. "adc r2, r2, #0\n\t"
  134422. "adds r3, r3, r9\n\t"
  134423. "adcs r4, r4, #0\n\t"
  134424. "adc r2, r2, #0\n\t"
  134425. "lsr r9, r12, #16\n\t"
  134426. "mul r8, r9, r8\n\t"
  134427. "lsr r9, r8, #16\n\t"
  134428. "lsl r8, r8, #16\n\t"
  134429. "adds r3, r3, r8\n\t"
  134430. "adcs r4, r4, r9\n\t"
  134431. "adc r2, r2, #0\n\t"
  134432. "adds r3, r3, r8\n\t"
  134433. "adcs r4, r4, r9\n\t"
  134434. "adc r2, r2, #0\n\t"
  134435. "lsr r8, r10, #16\n\t"
  134436. "lsr r9, r12, #16\n\t"
  134437. "mul r9, r8, r9\n\t"
  134438. "adds r4, r4, r9\n\t"
  134439. "adc r2, r2, #0\n\t"
  134440. "adds r4, r4, r9\n\t"
  134441. "adc r2, r2, #0\n\t"
  134442. "lsl r9, r12, #16\n\t"
  134443. "lsr r9, r9, #16\n\t"
  134444. "mul r8, r9, r8\n\t"
  134445. "lsr r9, r8, #16\n\t"
  134446. "lsl r8, r8, #16\n\t"
  134447. "adds r3, r3, r8\n\t"
  134448. "adcs r4, r4, r9\n\t"
  134449. "adc r2, r2, #0\n\t"
  134450. "adds r3, r3, r8\n\t"
  134451. "adcs r4, r4, r9\n\t"
  134452. "adc r2, r2, #0\n\t"
  134453. #else
  134454. "umull r8, r9, r10, r12\n\t"
  134455. "adds r3, r3, r8\n\t"
  134456. "adcs r4, r4, r9\n\t"
  134457. "mov r2, #0\n\t"
  134458. "adc r2, r2, #0\n\t"
  134459. "adds r3, r3, r8\n\t"
  134460. "adcs r4, r4, r9\n\t"
  134461. "mov r2, #0\n\t"
  134462. "adc r2, r2, #0\n\t"
  134463. #endif
  134464. /* A[1] * A[3] */
  134465. "ldr r10, [%[a], #12]\n\t"
  134466. "ldr r12, [%[a], #4]\n\t"
  134467. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134468. "lsl r8, r10, #16\n\t"
  134469. "lsl r9, r12, #16\n\t"
  134470. "lsr r8, r8, #16\n\t"
  134471. "lsr r9, r9, #16\n\t"
  134472. "mul r9, r8, r9\n\t"
  134473. "adds r3, r3, r9\n\t"
  134474. "adcs r4, r4, #0\n\t"
  134475. "adc r2, r2, #0\n\t"
  134476. "adds r3, r3, r9\n\t"
  134477. "adcs r4, r4, #0\n\t"
  134478. "adc r2, r2, #0\n\t"
  134479. "lsr r9, r12, #16\n\t"
  134480. "mul r8, r9, r8\n\t"
  134481. "lsr r9, r8, #16\n\t"
  134482. "lsl r8, r8, #16\n\t"
  134483. "adds r3, r3, r8\n\t"
  134484. "adcs r4, r4, r9\n\t"
  134485. "adc r2, r2, #0\n\t"
  134486. "adds r3, r3, r8\n\t"
  134487. "adcs r4, r4, r9\n\t"
  134488. "adc r2, r2, #0\n\t"
  134489. "lsr r8, r10, #16\n\t"
  134490. "lsr r9, r12, #16\n\t"
  134491. "mul r9, r8, r9\n\t"
  134492. "adds r4, r4, r9\n\t"
  134493. "adc r2, r2, #0\n\t"
  134494. "adds r4, r4, r9\n\t"
  134495. "adc r2, r2, #0\n\t"
  134496. "lsl r9, r12, #16\n\t"
  134497. "lsr r9, r9, #16\n\t"
  134498. "mul r8, r9, r8\n\t"
  134499. "lsr r9, r8, #16\n\t"
  134500. "lsl r8, r8, #16\n\t"
  134501. "adds r3, r3, r8\n\t"
  134502. "adcs r4, r4, r9\n\t"
  134503. "adc r2, r2, #0\n\t"
  134504. "adds r3, r3, r8\n\t"
  134505. "adcs r4, r4, r9\n\t"
  134506. "adc r2, r2, #0\n\t"
  134507. #else
  134508. "umull r8, r9, r10, r12\n\t"
  134509. "adds r3, r3, r8\n\t"
  134510. "adcs r4, r4, r9\n\t"
  134511. "adc r2, r2, #0\n\t"
  134512. "adds r3, r3, r8\n\t"
  134513. "adcs r4, r4, r9\n\t"
  134514. "adc r2, r2, #0\n\t"
  134515. #endif
  134516. /* A[2] * A[2] */
  134517. "ldr r10, [%[a], #8]\n\t"
  134518. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134519. "lsl r8, r10, #16\n\t"
  134520. "lsr r9, r10, #16\n\t"
  134521. "lsr r8, r8, #16\n\t"
  134522. "mov r12, r8\n\t"
  134523. "mul r8, r12, r8\n\t"
  134524. "mov r12, r9\n\t"
  134525. "mul r9, r12, r9\n\t"
  134526. "adds r3, r3, r8\n\t"
  134527. "adcs r4, r4, r9\n\t"
  134528. "adc r2, r2, #0\n\t"
  134529. "lsr r9, r10, #16\n\t"
  134530. "lsl r8, r10, #16\n\t"
  134531. "lsr r8, r8, #16\n\t"
  134532. "mul r8, r9, r8\n\t"
  134533. "lsr r9, r8, #15\n\t"
  134534. "lsl r8, r8, #17\n\t"
  134535. "adds r3, r3, r8\n\t"
  134536. "adcs r4, r4, r9\n\t"
  134537. "adc r2, r2, #0\n\t"
  134538. #else
  134539. "umull r8, r9, r10, r10\n\t"
  134540. "adds r3, r3, r8\n\t"
  134541. "adcs r4, r4, r9\n\t"
  134542. "adc r2, r2, #0\n\t"
  134543. #endif
  134544. "str r3, [sp, #16]\n\t"
  134545. /* A[0] * A[5] */
  134546. "ldr r10, [%[a], #20]\n\t"
  134547. "ldr r12, [%[a]]\n\t"
  134548. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134549. "lsl r8, r10, #16\n\t"
  134550. "lsl r5, r12, #16\n\t"
  134551. "lsr r8, r8, #16\n\t"
  134552. "lsr r5, r5, #16\n\t"
  134553. "mul r5, r8, r5\n\t"
  134554. "lsr r9, r12, #16\n\t"
  134555. "mul r8, r9, r8\n\t"
  134556. "lsr r6, r8, #16\n\t"
  134557. "lsl r8, r8, #16\n\t"
  134558. "adds r5, r5, r8\n\t"
  134559. "adc r6, r6, #0\n\t"
  134560. "lsr r8, r10, #16\n\t"
  134561. "mul r9, r8, r9\n\t"
  134562. "add r6, r6, r9\n\t"
  134563. "lsl r9, r12, #16\n\t"
  134564. "lsr r9, r9, #16\n\t"
  134565. "mul r8, r9, r8\n\t"
  134566. "lsr r9, r8, #16\n\t"
  134567. "lsl r8, r8, #16\n\t"
  134568. "adds r5, r5, r8\n\t"
  134569. "adc r6, r6, r9\n\t"
  134570. #else
  134571. "umull r5, r6, r10, r12\n\t"
  134572. #endif
  134573. "mov r3, #0\n\t"
  134574. "mov r7, #0\n\t"
  134575. /* A[1] * A[4] */
  134576. "ldr r10, [%[a], #16]\n\t"
  134577. "ldr r12, [%[a], #4]\n\t"
  134578. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134579. "lsl r8, r10, #16\n\t"
  134580. "lsl r9, r12, #16\n\t"
  134581. "lsr r8, r8, #16\n\t"
  134582. "lsr r9, r9, #16\n\t"
  134583. "mul r9, r8, r9\n\t"
  134584. "adds r5, r5, r9\n\t"
  134585. "adcs r6, r6, #0\n\t"
  134586. "adc r7, r7, #0\n\t"
  134587. "lsr r9, r12, #16\n\t"
  134588. "mul r8, r9, r8\n\t"
  134589. "lsr r9, r8, #16\n\t"
  134590. "lsl r8, r8, #16\n\t"
  134591. "adds r5, r5, r8\n\t"
  134592. "adcs r6, r6, r9\n\t"
  134593. "adc r7, r7, #0\n\t"
  134594. "lsr r8, r10, #16\n\t"
  134595. "lsr r9, r12, #16\n\t"
  134596. "mul r9, r8, r9\n\t"
  134597. "adds r6, r6, r9\n\t"
  134598. "adc r7, r7, #0\n\t"
  134599. "lsl r9, r12, #16\n\t"
  134600. "lsr r9, r9, #16\n\t"
  134601. "mul r8, r9, r8\n\t"
  134602. "lsr r9, r8, #16\n\t"
  134603. "lsl r8, r8, #16\n\t"
  134604. "adds r5, r5, r8\n\t"
  134605. "adcs r6, r6, r9\n\t"
  134606. "adc r7, r7, #0\n\t"
  134607. #else
  134608. "umull r8, r9, r10, r12\n\t"
  134609. "adds r5, r5, r8\n\t"
  134610. "adcs r6, r6, r9\n\t"
  134611. "adc r7, r7, #0\n\t"
  134612. #endif
  134613. /* A[2] * A[3] */
  134614. "ldr r10, [%[a], #12]\n\t"
  134615. "ldr r12, [%[a], #8]\n\t"
  134616. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134617. "lsl r8, r10, #16\n\t"
  134618. "lsl r9, r12, #16\n\t"
  134619. "lsr r8, r8, #16\n\t"
  134620. "lsr r9, r9, #16\n\t"
  134621. "mul r9, r8, r9\n\t"
  134622. "adds r5, r5, r9\n\t"
  134623. "adcs r6, r6, #0\n\t"
  134624. "adc r7, r7, #0\n\t"
  134625. "lsr r9, r12, #16\n\t"
  134626. "mul r8, r9, r8\n\t"
  134627. "lsr r9, r8, #16\n\t"
  134628. "lsl r8, r8, #16\n\t"
  134629. "adds r5, r5, r8\n\t"
  134630. "adcs r6, r6, r9\n\t"
  134631. "adc r7, r7, #0\n\t"
  134632. "lsr r8, r10, #16\n\t"
  134633. "lsr r9, r12, #16\n\t"
  134634. "mul r9, r8, r9\n\t"
  134635. "adds r6, r6, r9\n\t"
  134636. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  134644. "adc r7, r7, #0\n\t"
  134645. #else
  134646. "umull r8, r9, r10, r12\n\t"
  134647. "adds r5, r5, r8\n\t"
  134648. "adcs r6, r6, r9\n\t"
  134649. "adc r7, r7, #0\n\t"
  134650. #endif
  134651. "adds r5, r5, r5\n\t"
  134652. "adcs r6, r6, r6\n\t"
  134653. "adc r7, r7, r7\n\t"
  134654. "adds r4, r4, r5\n\t"
  134655. "adcs r2, r2, r6\n\t"
  134656. "adc r3, r3, r7\n\t"
  134657. "str r4, [sp, #20]\n\t"
  134658. /* A[0] * A[6] */
  134659. "ldr r10, [%[a], #24]\n\t"
  134660. "ldr r12, [%[a]]\n\t"
  134661. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134662. "lsl r8, r10, #16\n\t"
  134663. "lsl r5, r12, #16\n\t"
  134664. "lsr r8, r8, #16\n\t"
  134665. "lsr r5, r5, #16\n\t"
  134666. "mul r5, r8, r5\n\t"
  134667. "lsr r9, r12, #16\n\t"
  134668. "mul r8, r9, r8\n\t"
  134669. "lsr r6, r8, #16\n\t"
  134670. "lsl r8, r8, #16\n\t"
  134671. "adds r5, r5, r8\n\t"
  134672. "adc r6, r6, #0\n\t"
  134673. "lsr r8, r10, #16\n\t"
  134674. "mul r9, r8, r9\n\t"
  134675. "add r6, r6, r9\n\t"
  134676. "lsl r9, r12, #16\n\t"
  134677. "lsr r9, r9, #16\n\t"
  134678. "mul r8, r9, r8\n\t"
  134679. "lsr r9, r8, #16\n\t"
  134680. "lsl r8, r8, #16\n\t"
  134681. "adds r5, r5, r8\n\t"
  134682. "adc r6, r6, r9\n\t"
  134683. #else
  134684. "umull r5, r6, r10, r12\n\t"
  134685. #endif
  134686. "mov r4, #0\n\t"
  134687. "mov r7, #0\n\t"
  134688. /* A[1] * A[5] */
  134689. "ldr r10, [%[a], #20]\n\t"
  134690. "ldr r12, [%[a], #4]\n\t"
  134691. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134692. "lsl r8, r10, #16\n\t"
  134693. "lsl r9, r12, #16\n\t"
  134694. "lsr r8, r8, #16\n\t"
  134695. "lsr r9, r9, #16\n\t"
  134696. "mul r9, r8, r9\n\t"
  134697. "adds r5, r5, r9\n\t"
  134698. "adcs r6, r6, #0\n\t"
  134699. "adc r7, r7, #0\n\t"
  134700. "lsr r9, r12, #16\n\t"
  134701. "mul r8, r9, r8\n\t"
  134702. "lsr r9, r8, #16\n\t"
  134703. "lsl r8, r8, #16\n\t"
  134704. "adds r5, r5, r8\n\t"
  134705. "adcs r6, r6, r9\n\t"
  134706. "adc r7, r7, #0\n\t"
  134707. "lsr r8, r10, #16\n\t"
  134708. "lsr r9, r12, #16\n\t"
  134709. "mul r9, r8, r9\n\t"
  134710. "adds r6, r6, r9\n\t"
  134711. "adc r7, r7, #0\n\t"
  134712. "lsl r9, r12, #16\n\t"
  134713. "lsr r9, r9, #16\n\t"
  134714. "mul r8, r9, r8\n\t"
  134715. "lsr r9, r8, #16\n\t"
  134716. "lsl r8, r8, #16\n\t"
  134717. "adds r5, r5, r8\n\t"
  134718. "adcs r6, r6, r9\n\t"
  134719. "adc r7, r7, #0\n\t"
  134720. #else
  134721. "umull r8, r9, r10, r12\n\t"
  134722. "adds r5, r5, r8\n\t"
  134723. "adcs r6, r6, r9\n\t"
  134724. "adc r7, r7, #0\n\t"
  134725. #endif
  134726. /* A[2] * A[4] */
  134727. "ldr r10, [%[a], #16]\n\t"
  134728. "ldr r12, [%[a], #8]\n\t"
  134729. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134730. "lsl r8, r10, #16\n\t"
  134731. "lsl r9, r12, #16\n\t"
  134732. "lsr r8, r8, #16\n\t"
  134733. "lsr r9, r9, #16\n\t"
  134734. "mul r9, r8, r9\n\t"
  134735. "adds r5, r5, r9\n\t"
  134736. "adcs r6, r6, #0\n\t"
  134737. "adc r7, r7, #0\n\t"
  134738. "lsr r9, r12, #16\n\t"
  134739. "mul r8, r9, r8\n\t"
  134740. "lsr r9, r8, #16\n\t"
  134741. "lsl r8, r8, #16\n\t"
  134742. "adds r5, r5, r8\n\t"
  134743. "adcs r6, r6, r9\n\t"
  134744. "adc r7, r7, #0\n\t"
  134745. "lsr r8, r10, #16\n\t"
  134746. "lsr r9, r12, #16\n\t"
  134747. "mul r9, r8, r9\n\t"
  134748. "adds r6, r6, r9\n\t"
  134749. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  134757. "adc r7, r7, #0\n\t"
  134758. #else
  134759. "umull r8, r9, r10, r12\n\t"
  134760. "adds r5, r5, r8\n\t"
  134761. "adcs r6, r6, r9\n\t"
  134762. "adc r7, r7, #0\n\t"
  134763. #endif
  134764. /* A[3] * A[3] */
  134765. "ldr r10, [%[a], #12]\n\t"
  134766. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134767. "lsl r8, r10, #16\n\t"
  134768. "lsr r9, r10, #16\n\t"
  134769. "lsr r8, r8, #16\n\t"
  134770. "mov r12, r8\n\t"
  134771. "mul r8, r12, r8\n\t"
  134772. "mov r12, r9\n\t"
  134773. "mul r9, r12, r9\n\t"
  134774. "adds r2, r2, r8\n\t"
  134775. "adcs r3, r3, r9\n\t"
  134776. "adc r4, r4, #0\n\t"
  134777. "lsr r9, r10, #16\n\t"
  134778. "lsl r8, r10, #16\n\t"
  134779. "lsr r8, r8, #16\n\t"
  134780. "mul r8, r9, r8\n\t"
  134781. "lsr r9, r8, #15\n\t"
  134782. "lsl r8, r8, #17\n\t"
  134783. "adds r2, r2, r8\n\t"
  134784. "adcs r3, r3, r9\n\t"
  134785. "adc r4, r4, #0\n\t"
  134786. "adds r5, r5, r5\n\t"
  134787. "adcs r6, r6, r6\n\t"
  134788. "adc r7, r7, r7\n\t"
  134789. #else
  134790. "umull r8, r9, r10, r10\n\t"
  134791. "adds r5, r5, r5\n\t"
  134792. "adcs r6, r6, r6\n\t"
  134793. "adc r7, r7, r7\n\t"
  134794. "adds r2, r2, r8\n\t"
  134795. "adcs r3, r3, r9\n\t"
  134796. "adc r4, r4, #0\n\t"
  134797. #endif
  134798. "adds r2, r2, r5\n\t"
  134799. "adcs r3, r3, r6\n\t"
  134800. "adc r4, r4, r7\n\t"
  134801. "str r2, [sp, #24]\n\t"
  134802. /* A[0] * A[7] */
  134803. "ldr r10, [%[a], #28]\n\t"
  134804. "ldr r12, [%[a]]\n\t"
  134805. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134806. "lsl r8, r10, #16\n\t"
  134807. "lsl r5, r12, #16\n\t"
  134808. "lsr r8, r8, #16\n\t"
  134809. "lsr r5, r5, #16\n\t"
  134810. "mul r5, r8, r5\n\t"
  134811. "lsr r9, r12, #16\n\t"
  134812. "mul r8, r9, r8\n\t"
  134813. "lsr r6, r8, #16\n\t"
  134814. "lsl r8, r8, #16\n\t"
  134815. "adds r5, r5, r8\n\t"
  134816. "adc r6, r6, #0\n\t"
  134817. "lsr r8, r10, #16\n\t"
  134818. "mul r9, r8, r9\n\t"
  134819. "add r6, r6, r9\n\t"
  134820. "lsl r9, r12, #16\n\t"
  134821. "lsr r9, r9, #16\n\t"
  134822. "mul r8, r9, r8\n\t"
  134823. "lsr r9, r8, #16\n\t"
  134824. "lsl r8, r8, #16\n\t"
  134825. "adds r5, r5, r8\n\t"
  134826. "adc r6, r6, r9\n\t"
  134827. #else
  134828. "umull r5, r6, r10, r12\n\t"
  134829. #endif
  134830. "mov r2, #0\n\t"
  134831. "mov r7, #0\n\t"
  134832. /* A[1] * A[6] */
  134833. "ldr r10, [%[a], #24]\n\t"
  134834. "ldr r12, [%[a], #4]\n\t"
  134835. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134836. "lsl r8, r10, #16\n\t"
  134837. "lsl r9, r12, #16\n\t"
  134838. "lsr r8, r8, #16\n\t"
  134839. "lsr r9, r9, #16\n\t"
  134840. "mul r9, r8, r9\n\t"
  134841. "adds r5, r5, r9\n\t"
  134842. "adcs r6, r6, #0\n\t"
  134843. "adc r7, r7, #0\n\t"
  134844. "lsr r9, r12, #16\n\t"
  134845. "mul r8, r9, r8\n\t"
  134846. "lsr r9, r8, #16\n\t"
  134847. "lsl r8, r8, #16\n\t"
  134848. "adds r5, r5, r8\n\t"
  134849. "adcs r6, r6, r9\n\t"
  134850. "adc r7, r7, #0\n\t"
  134851. "lsr r8, r10, #16\n\t"
  134852. "lsr r9, r12, #16\n\t"
  134853. "mul r9, r8, r9\n\t"
  134854. "adds r6, r6, r9\n\t"
  134855. "adc r7, r7, #0\n\t"
  134856. "lsl r9, r12, #16\n\t"
  134857. "lsr r9, r9, #16\n\t"
  134858. "mul r8, r9, r8\n\t"
  134859. "lsr r9, r8, #16\n\t"
  134860. "lsl r8, r8, #16\n\t"
  134861. "adds r5, r5, r8\n\t"
  134862. "adcs r6, r6, r9\n\t"
  134863. "adc r7, r7, #0\n\t"
  134864. #else
  134865. "umull r8, r9, r10, r12\n\t"
  134866. "adds r5, r5, r8\n\t"
  134867. "adcs r6, r6, r9\n\t"
  134868. "adc r7, r7, #0\n\t"
  134869. #endif
  134870. /* A[2] * A[5] */
  134871. "ldr r10, [%[a], #20]\n\t"
  134872. "ldr r12, [%[a], #8]\n\t"
  134873. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134874. "lsl r8, r10, #16\n\t"
  134875. "lsl r9, r12, #16\n\t"
  134876. "lsr r8, r8, #16\n\t"
  134877. "lsr r9, r9, #16\n\t"
  134878. "mul r9, r8, r9\n\t"
  134879. "adds r5, r5, r9\n\t"
  134880. "adcs r6, r6, #0\n\t"
  134881. "adc r7, r7, #0\n\t"
  134882. "lsr r9, r12, #16\n\t"
  134883. "mul r8, r9, r8\n\t"
  134884. "lsr r9, r8, #16\n\t"
  134885. "lsl r8, r8, #16\n\t"
  134886. "adds r5, r5, r8\n\t"
  134887. "adcs r6, r6, r9\n\t"
  134888. "adc r7, r7, #0\n\t"
  134889. "lsr r8, r10, #16\n\t"
  134890. "lsr r9, r12, #16\n\t"
  134891. "mul r9, r8, r9\n\t"
  134892. "adds r6, r6, r9\n\t"
  134893. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  134901. "adc r7, r7, #0\n\t"
  134902. #else
  134903. "umull r8, r9, r10, r12\n\t"
  134904. "adds r5, r5, r8\n\t"
  134905. "adcs r6, r6, r9\n\t"
  134906. "adc r7, r7, #0\n\t"
  134907. #endif
  134908. /* A[3] * A[4] */
  134909. "ldr r10, [%[a], #16]\n\t"
  134910. "ldr r12, [%[a], #12]\n\t"
  134911. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134912. "lsl r8, r10, #16\n\t"
  134913. "lsl r9, r12, #16\n\t"
  134914. "lsr r8, r8, #16\n\t"
  134915. "lsr r9, r9, #16\n\t"
  134916. "mul r9, r8, r9\n\t"
  134917. "adds r5, r5, r9\n\t"
  134918. "adcs r6, r6, #0\n\t"
  134919. "adc r7, r7, #0\n\t"
  134920. "lsr r9, r12, #16\n\t"
  134921. "mul r8, r9, r8\n\t"
  134922. "lsr r9, r8, #16\n\t"
  134923. "lsl r8, r8, #16\n\t"
  134924. "adds r5, r5, r8\n\t"
  134925. "adcs r6, r6, r9\n\t"
  134926. "adc r7, r7, #0\n\t"
  134927. "lsr r8, r10, #16\n\t"
  134928. "lsr r9, r12, #16\n\t"
  134929. "mul r9, r8, r9\n\t"
  134930. "adds r6, r6, r9\n\t"
  134931. "adc r7, r7, #0\n\t"
  134932. "lsl r9, r12, #16\n\t"
  134933. "lsr r9, r9, #16\n\t"
  134934. "mul r8, r9, r8\n\t"
  134935. "lsr r9, r8, #16\n\t"
  134936. "lsl r8, r8, #16\n\t"
  134937. "adds r5, r5, r8\n\t"
  134938. "adcs r6, r6, r9\n\t"
  134939. "adc r7, r7, #0\n\t"
  134940. #else
  134941. "umull r8, r9, r10, r12\n\t"
  134942. "adds r5, r5, r8\n\t"
  134943. "adcs r6, r6, r9\n\t"
  134944. "adc r7, r7, #0\n\t"
  134945. #endif
  134946. "adds r5, r5, r5\n\t"
  134947. "adcs r6, r6, r6\n\t"
  134948. "adc r7, r7, r7\n\t"
  134949. "adds r3, r3, r5\n\t"
  134950. "adcs r4, r4, r6\n\t"
  134951. "adc r2, r2, r7\n\t"
  134952. "str r3, [sp, #28]\n\t"
  134953. /* A[0] * A[8] */
  134954. "ldr r10, [%[a], #32]\n\t"
  134955. "ldr r12, [%[a]]\n\t"
  134956. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134957. "lsl r8, r10, #16\n\t"
  134958. "lsl r5, r12, #16\n\t"
  134959. "lsr r8, r8, #16\n\t"
  134960. "lsr r5, r5, #16\n\t"
  134961. "mul r5, r8, r5\n\t"
  134962. "lsr r9, r12, #16\n\t"
  134963. "mul r8, r9, r8\n\t"
  134964. "lsr r6, r8, #16\n\t"
  134965. "lsl r8, r8, #16\n\t"
  134966. "adds r5, r5, r8\n\t"
  134967. "adc r6, r6, #0\n\t"
  134968. "lsr r8, r10, #16\n\t"
  134969. "mul r9, r8, r9\n\t"
  134970. "add r6, r6, r9\n\t"
  134971. "lsl r9, r12, #16\n\t"
  134972. "lsr r9, r9, #16\n\t"
  134973. "mul r8, r9, r8\n\t"
  134974. "lsr r9, r8, #16\n\t"
  134975. "lsl r8, r8, #16\n\t"
  134976. "adds r5, r5, r8\n\t"
  134977. "adc r6, r6, r9\n\t"
  134978. #else
  134979. "umull r5, r6, r10, r12\n\t"
  134980. #endif
  134981. "mov r3, #0\n\t"
  134982. "mov r7, #0\n\t"
  134983. /* A[1] * A[7] */
  134984. "ldr r10, [%[a], #28]\n\t"
  134985. "ldr r12, [%[a], #4]\n\t"
  134986. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  134987. "lsl r8, r10, #16\n\t"
  134988. "lsl r9, r12, #16\n\t"
  134989. "lsr r8, r8, #16\n\t"
  134990. "lsr r9, r9, #16\n\t"
  134991. "mul r9, r8, r9\n\t"
  134992. "adds r5, r5, r9\n\t"
  134993. "adcs r6, r6, #0\n\t"
  134994. "adc r7, r7, #0\n\t"
  134995. "lsr r9, r12, #16\n\t"
  134996. "mul r8, r9, r8\n\t"
  134997. "lsr r9, r8, #16\n\t"
  134998. "lsl r8, r8, #16\n\t"
  134999. "adds r5, r5, r8\n\t"
  135000. "adcs r6, r6, r9\n\t"
  135001. "adc r7, r7, #0\n\t"
  135002. "lsr r8, r10, #16\n\t"
  135003. "lsr r9, r12, #16\n\t"
  135004. "mul r9, r8, r9\n\t"
  135005. "adds r6, r6, r9\n\t"
  135006. "adc r7, r7, #0\n\t"
  135007. "lsl r9, r12, #16\n\t"
  135008. "lsr r9, r9, #16\n\t"
  135009. "mul r8, r9, r8\n\t"
  135010. "lsr r9, r8, #16\n\t"
  135011. "lsl r8, r8, #16\n\t"
  135012. "adds r5, r5, r8\n\t"
  135013. "adcs r6, r6, r9\n\t"
  135014. "adc r7, r7, #0\n\t"
  135015. #else
  135016. "umull r8, r9, r10, r12\n\t"
  135017. "adds r5, r5, r8\n\t"
  135018. "adcs r6, r6, r9\n\t"
  135019. "adc r7, r7, #0\n\t"
  135020. #endif
  135021. /* A[2] * A[6] */
  135022. "ldr r10, [%[a], #24]\n\t"
  135023. "ldr r12, [%[a], #8]\n\t"
  135024. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135025. "lsl r8, r10, #16\n\t"
  135026. "lsl r9, r12, #16\n\t"
  135027. "lsr r8, r8, #16\n\t"
  135028. "lsr r9, r9, #16\n\t"
  135029. "mul r9, r8, r9\n\t"
  135030. "adds r5, r5, r9\n\t"
  135031. "adcs r6, r6, #0\n\t"
  135032. "adc r7, r7, #0\n\t"
  135033. "lsr r9, r12, #16\n\t"
  135034. "mul r8, r9, r8\n\t"
  135035. "lsr r9, r8, #16\n\t"
  135036. "lsl r8, r8, #16\n\t"
  135037. "adds r5, r5, r8\n\t"
  135038. "adcs r6, r6, r9\n\t"
  135039. "adc r7, r7, #0\n\t"
  135040. "lsr r8, r10, #16\n\t"
  135041. "lsr r9, r12, #16\n\t"
  135042. "mul r9, r8, r9\n\t"
  135043. "adds r6, r6, r9\n\t"
  135044. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  135052. "adc r7, r7, #0\n\t"
  135053. #else
  135054. "umull r8, r9, r10, r12\n\t"
  135055. "adds r5, r5, r8\n\t"
  135056. "adcs r6, r6, r9\n\t"
  135057. "adc r7, r7, #0\n\t"
  135058. #endif
  135059. /* A[3] * A[5] */
  135060. "ldr r10, [%[a], #20]\n\t"
  135061. "ldr r12, [%[a], #12]\n\t"
  135062. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135063. "lsl r8, r10, #16\n\t"
  135064. "lsl r9, r12, #16\n\t"
  135065. "lsr r8, r8, #16\n\t"
  135066. "lsr r9, r9, #16\n\t"
  135067. "mul r9, r8, r9\n\t"
  135068. "adds r5, r5, r9\n\t"
  135069. "adcs r6, r6, #0\n\t"
  135070. "adc r7, r7, #0\n\t"
  135071. "lsr r9, r12, #16\n\t"
  135072. "mul r8, r9, r8\n\t"
  135073. "lsr r9, r8, #16\n\t"
  135074. "lsl r8, r8, #16\n\t"
  135075. "adds r5, r5, r8\n\t"
  135076. "adcs r6, r6, r9\n\t"
  135077. "adc r7, r7, #0\n\t"
  135078. "lsr r8, r10, #16\n\t"
  135079. "lsr r9, r12, #16\n\t"
  135080. "mul r9, r8, r9\n\t"
  135081. "adds r6, r6, r9\n\t"
  135082. "adc r7, r7, #0\n\t"
  135083. "lsl r9, r12, #16\n\t"
  135084. "lsr r9, r9, #16\n\t"
  135085. "mul r8, r9, r8\n\t"
  135086. "lsr r9, r8, #16\n\t"
  135087. "lsl r8, r8, #16\n\t"
  135088. "adds r5, r5, r8\n\t"
  135089. "adcs r6, r6, r9\n\t"
  135090. "adc r7, r7, #0\n\t"
  135091. #else
  135092. "umull r8, r9, r10, r12\n\t"
  135093. "adds r5, r5, r8\n\t"
  135094. "adcs r6, r6, r9\n\t"
  135095. "adc r7, r7, #0\n\t"
  135096. #endif
  135097. /* A[4] * A[4] */
  135098. "ldr r10, [%[a], #16]\n\t"
  135099. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135100. "lsl r8, r10, #16\n\t"
  135101. "lsr r9, r10, #16\n\t"
  135102. "lsr r8, r8, #16\n\t"
  135103. "mov r12, r8\n\t"
  135104. "mul r8, r12, r8\n\t"
  135105. "mov r12, r9\n\t"
  135106. "mul r9, r12, r9\n\t"
  135107. "adds r4, r4, r8\n\t"
  135108. "adcs r2, r2, r9\n\t"
  135109. "adc r3, r3, #0\n\t"
  135110. "lsr r9, r10, #16\n\t"
  135111. "lsl r8, r10, #16\n\t"
  135112. "lsr r8, r8, #16\n\t"
  135113. "mul r8, r9, r8\n\t"
  135114. "lsr r9, r8, #15\n\t"
  135115. "lsl r8, r8, #17\n\t"
  135116. "adds r4, r4, r8\n\t"
  135117. "adcs r2, r2, r9\n\t"
  135118. "adc r3, r3, #0\n\t"
  135119. "adds r5, r5, r5\n\t"
  135120. "adcs r6, r6, r6\n\t"
  135121. "adc r7, r7, r7\n\t"
  135122. #else
  135123. "umull r8, r9, r10, r10\n\t"
  135124. "adds r5, r5, r5\n\t"
  135125. "adcs r6, r6, r6\n\t"
  135126. "adc r7, r7, r7\n\t"
  135127. "adds r4, r4, r8\n\t"
  135128. "adcs r2, r2, r9\n\t"
  135129. "adc r3, r3, #0\n\t"
  135130. #endif
  135131. "adds r4, r4, r5\n\t"
  135132. "adcs r2, r2, r6\n\t"
  135133. "adc r3, r3, r7\n\t"
  135134. "str r4, [sp, #32]\n\t"
  135135. /* A[0] * A[9] */
  135136. "ldr r10, [%[a], #36]\n\t"
  135137. "ldr r12, [%[a]]\n\t"
  135138. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135139. "lsl r8, r10, #16\n\t"
  135140. "lsl r5, r12, #16\n\t"
  135141. "lsr r8, r8, #16\n\t"
  135142. "lsr r5, r5, #16\n\t"
  135143. "mul r5, r8, r5\n\t"
  135144. "lsr r9, r12, #16\n\t"
  135145. "mul r8, r9, r8\n\t"
  135146. "lsr r6, r8, #16\n\t"
  135147. "lsl r8, r8, #16\n\t"
  135148. "adds r5, r5, r8\n\t"
  135149. "adc r6, r6, #0\n\t"
  135150. "lsr r8, r10, #16\n\t"
  135151. "mul r9, r8, r9\n\t"
  135152. "add r6, r6, r9\n\t"
  135153. "lsl r9, r12, #16\n\t"
  135154. "lsr r9, r9, #16\n\t"
  135155. "mul r8, r9, r8\n\t"
  135156. "lsr r9, r8, #16\n\t"
  135157. "lsl r8, r8, #16\n\t"
  135158. "adds r5, r5, r8\n\t"
  135159. "adc r6, r6, r9\n\t"
  135160. #else
  135161. "umull r5, r6, r10, r12\n\t"
  135162. #endif
  135163. "mov r4, #0\n\t"
  135164. "mov r7, #0\n\t"
  135165. /* A[1] * A[8] */
  135166. "ldr r10, [%[a], #32]\n\t"
  135167. "ldr r12, [%[a], #4]\n\t"
  135168. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135169. "lsl r8, r10, #16\n\t"
  135170. "lsl r9, r12, #16\n\t"
  135171. "lsr r8, r8, #16\n\t"
  135172. "lsr r9, r9, #16\n\t"
  135173. "mul r9, r8, r9\n\t"
  135174. "adds r5, r5, r9\n\t"
  135175. "adcs r6, r6, #0\n\t"
  135176. "adc r7, r7, #0\n\t"
  135177. "lsr r9, r12, #16\n\t"
  135178. "mul r8, r9, r8\n\t"
  135179. "lsr r9, r8, #16\n\t"
  135180. "lsl r8, r8, #16\n\t"
  135181. "adds r5, r5, r8\n\t"
  135182. "adcs r6, r6, r9\n\t"
  135183. "adc r7, r7, #0\n\t"
  135184. "lsr r8, r10, #16\n\t"
  135185. "lsr r9, r12, #16\n\t"
  135186. "mul r9, r8, r9\n\t"
  135187. "adds r6, r6, r9\n\t"
  135188. "adc r7, r7, #0\n\t"
  135189. "lsl r9, r12, #16\n\t"
  135190. "lsr r9, r9, #16\n\t"
  135191. "mul r8, r9, r8\n\t"
  135192. "lsr r9, r8, #16\n\t"
  135193. "lsl r8, r8, #16\n\t"
  135194. "adds r5, r5, r8\n\t"
  135195. "adcs r6, r6, r9\n\t"
  135196. "adc r7, r7, #0\n\t"
  135197. #else
  135198. "umull r8, r9, r10, r12\n\t"
  135199. "adds r5, r5, r8\n\t"
  135200. "adcs r6, r6, r9\n\t"
  135201. "adc r7, r7, #0\n\t"
  135202. #endif
  135203. /* A[2] * A[7] */
  135204. "ldr r10, [%[a], #28]\n\t"
  135205. "ldr r12, [%[a], #8]\n\t"
  135206. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135207. "lsl r8, r10, #16\n\t"
  135208. "lsl r9, r12, #16\n\t"
  135209. "lsr r8, r8, #16\n\t"
  135210. "lsr r9, r9, #16\n\t"
  135211. "mul r9, r8, r9\n\t"
  135212. "adds r5, r5, r9\n\t"
  135213. "adcs r6, r6, #0\n\t"
  135214. "adc r7, r7, #0\n\t"
  135215. "lsr r9, r12, #16\n\t"
  135216. "mul r8, r9, r8\n\t"
  135217. "lsr r9, r8, #16\n\t"
  135218. "lsl r8, r8, #16\n\t"
  135219. "adds r5, r5, r8\n\t"
  135220. "adcs r6, r6, r9\n\t"
  135221. "adc r7, r7, #0\n\t"
  135222. "lsr r8, r10, #16\n\t"
  135223. "lsr r9, r12, #16\n\t"
  135224. "mul r9, r8, r9\n\t"
  135225. "adds r6, r6, r9\n\t"
  135226. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  135234. "adc r7, r7, #0\n\t"
  135235. #else
  135236. "umull r8, r9, r10, r12\n\t"
  135237. "adds r5, r5, r8\n\t"
  135238. "adcs r6, r6, r9\n\t"
  135239. "adc r7, r7, #0\n\t"
  135240. #endif
  135241. /* A[3] * A[6] */
  135242. "ldr r10, [%[a], #24]\n\t"
  135243. "ldr r12, [%[a], #12]\n\t"
  135244. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135245. "lsl r8, r10, #16\n\t"
  135246. "lsl r9, r12, #16\n\t"
  135247. "lsr r8, r8, #16\n\t"
  135248. "lsr r9, r9, #16\n\t"
  135249. "mul r9, r8, r9\n\t"
  135250. "adds r5, r5, r9\n\t"
  135251. "adcs r6, r6, #0\n\t"
  135252. "adc r7, r7, #0\n\t"
  135253. "lsr r9, r12, #16\n\t"
  135254. "mul r8, r9, r8\n\t"
  135255. "lsr r9, r8, #16\n\t"
  135256. "lsl r8, r8, #16\n\t"
  135257. "adds r5, r5, r8\n\t"
  135258. "adcs r6, r6, r9\n\t"
  135259. "adc r7, r7, #0\n\t"
  135260. "lsr r8, r10, #16\n\t"
  135261. "lsr r9, r12, #16\n\t"
  135262. "mul r9, r8, r9\n\t"
  135263. "adds r6, r6, r9\n\t"
  135264. "adc r7, r7, #0\n\t"
  135265. "lsl r9, r12, #16\n\t"
  135266. "lsr r9, r9, #16\n\t"
  135267. "mul r8, r9, r8\n\t"
  135268. "lsr r9, r8, #16\n\t"
  135269. "lsl r8, r8, #16\n\t"
  135270. "adds r5, r5, r8\n\t"
  135271. "adcs r6, r6, r9\n\t"
  135272. "adc r7, r7, #0\n\t"
  135273. #else
  135274. "umull r8, r9, r10, r12\n\t"
  135275. "adds r5, r5, r8\n\t"
  135276. "adcs r6, r6, r9\n\t"
  135277. "adc r7, r7, #0\n\t"
  135278. #endif
  135279. /* A[4] * A[5] */
  135280. "ldr r10, [%[a], #20]\n\t"
  135281. "ldr r12, [%[a], #16]\n\t"
  135282. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135283. "lsl r8, r10, #16\n\t"
  135284. "lsl r9, r12, #16\n\t"
  135285. "lsr r8, r8, #16\n\t"
  135286. "lsr r9, r9, #16\n\t"
  135287. "mul r9, r8, r9\n\t"
  135288. "adds r5, r5, r9\n\t"
  135289. "adcs r6, r6, #0\n\t"
  135290. "adc r7, r7, #0\n\t"
  135291. "lsr r9, r12, #16\n\t"
  135292. "mul r8, r9, r8\n\t"
  135293. "lsr r9, r8, #16\n\t"
  135294. "lsl r8, r8, #16\n\t"
  135295. "adds r5, r5, r8\n\t"
  135296. "adcs r6, r6, r9\n\t"
  135297. "adc r7, r7, #0\n\t"
  135298. "lsr r8, r10, #16\n\t"
  135299. "lsr r9, r12, #16\n\t"
  135300. "mul r9, r8, r9\n\t"
  135301. "adds r6, r6, r9\n\t"
  135302. "adc r7, r7, #0\n\t"
  135303. "lsl r9, r12, #16\n\t"
  135304. "lsr r9, r9, #16\n\t"
  135305. "mul r8, r9, r8\n\t"
  135306. "lsr r9, r8, #16\n\t"
  135307. "lsl r8, r8, #16\n\t"
  135308. "adds r5, r5, r8\n\t"
  135309. "adcs r6, r6, r9\n\t"
  135310. "adc r7, r7, #0\n\t"
  135311. #else
  135312. "umull r8, r9, r10, r12\n\t"
  135313. "adds r5, r5, r8\n\t"
  135314. "adcs r6, r6, r9\n\t"
  135315. "adc r7, r7, #0\n\t"
  135316. #endif
  135317. "adds r5, r5, r5\n\t"
  135318. "adcs r6, r6, r6\n\t"
  135319. "adc r7, r7, r7\n\t"
  135320. "adds r2, r2, r5\n\t"
  135321. "adcs r3, r3, r6\n\t"
  135322. "adc r4, r4, r7\n\t"
  135323. "str r2, [sp, #36]\n\t"
  135324. /* A[0] * A[10] */
  135325. "ldr r10, [%[a], #40]\n\t"
  135326. "ldr r12, [%[a]]\n\t"
  135327. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135328. "lsl r8, r10, #16\n\t"
  135329. "lsl r5, r12, #16\n\t"
  135330. "lsr r8, r8, #16\n\t"
  135331. "lsr r5, r5, #16\n\t"
  135332. "mul r5, r8, r5\n\t"
  135333. "lsr r9, r12, #16\n\t"
  135334. "mul r8, r9, r8\n\t"
  135335. "lsr r6, r8, #16\n\t"
  135336. "lsl r8, r8, #16\n\t"
  135337. "adds r5, r5, r8\n\t"
  135338. "adc r6, r6, #0\n\t"
  135339. "lsr r8, r10, #16\n\t"
  135340. "mul r9, r8, r9\n\t"
  135341. "add r6, r6, r9\n\t"
  135342. "lsl r9, r12, #16\n\t"
  135343. "lsr r9, r9, #16\n\t"
  135344. "mul r8, r9, r8\n\t"
  135345. "lsr r9, r8, #16\n\t"
  135346. "lsl r8, r8, #16\n\t"
  135347. "adds r5, r5, r8\n\t"
  135348. "adc r6, r6, r9\n\t"
  135349. #else
  135350. "umull r5, r6, r10, r12\n\t"
  135351. #endif
  135352. "mov r2, #0\n\t"
  135353. "mov r7, #0\n\t"
  135354. /* A[1] * A[9] */
  135355. "ldr r10, [%[a], #36]\n\t"
  135356. "ldr r12, [%[a], #4]\n\t"
  135357. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135358. "lsl r8, r10, #16\n\t"
  135359. "lsl r9, r12, #16\n\t"
  135360. "lsr r8, r8, #16\n\t"
  135361. "lsr r9, r9, #16\n\t"
  135362. "mul r9, r8, r9\n\t"
  135363. "adds r5, r5, r9\n\t"
  135364. "adcs r6, r6, #0\n\t"
  135365. "adc r7, r7, #0\n\t"
  135366. "lsr r9, r12, #16\n\t"
  135367. "mul r8, r9, r8\n\t"
  135368. "lsr r9, r8, #16\n\t"
  135369. "lsl r8, r8, #16\n\t"
  135370. "adds r5, r5, r8\n\t"
  135371. "adcs r6, r6, r9\n\t"
  135372. "adc r7, r7, #0\n\t"
  135373. "lsr r8, r10, #16\n\t"
  135374. "lsr r9, r12, #16\n\t"
  135375. "mul r9, r8, r9\n\t"
  135376. "adds r6, r6, r9\n\t"
  135377. "adc r7, r7, #0\n\t"
  135378. "lsl r9, r12, #16\n\t"
  135379. "lsr r9, r9, #16\n\t"
  135380. "mul r8, r9, r8\n\t"
  135381. "lsr r9, r8, #16\n\t"
  135382. "lsl r8, r8, #16\n\t"
  135383. "adds r5, r5, r8\n\t"
  135384. "adcs r6, r6, r9\n\t"
  135385. "adc r7, r7, #0\n\t"
  135386. #else
  135387. "umull r8, r9, r10, r12\n\t"
  135388. "adds r5, r5, r8\n\t"
  135389. "adcs r6, r6, r9\n\t"
  135390. "adc r7, r7, #0\n\t"
  135391. #endif
  135392. /* A[2] * A[8] */
  135393. "ldr r10, [%[a], #32]\n\t"
  135394. "ldr r12, [%[a], #8]\n\t"
  135395. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135396. "lsl r8, r10, #16\n\t"
  135397. "lsl r9, r12, #16\n\t"
  135398. "lsr r8, r8, #16\n\t"
  135399. "lsr r9, r9, #16\n\t"
  135400. "mul r9, r8, r9\n\t"
  135401. "adds r5, r5, r9\n\t"
  135402. "adcs r6, r6, #0\n\t"
  135403. "adc r7, r7, #0\n\t"
  135404. "lsr r9, r12, #16\n\t"
  135405. "mul r8, r9, r8\n\t"
  135406. "lsr r9, r8, #16\n\t"
  135407. "lsl r8, r8, #16\n\t"
  135408. "adds r5, r5, r8\n\t"
  135409. "adcs r6, r6, r9\n\t"
  135410. "adc r7, r7, #0\n\t"
  135411. "lsr r8, r10, #16\n\t"
  135412. "lsr r9, r12, #16\n\t"
  135413. "mul r9, r8, r9\n\t"
  135414. "adds r6, r6, r9\n\t"
  135415. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  135423. "adc r7, r7, #0\n\t"
  135424. #else
  135425. "umull r8, r9, r10, r12\n\t"
  135426. "adds r5, r5, r8\n\t"
  135427. "adcs r6, r6, r9\n\t"
  135428. "adc r7, r7, #0\n\t"
  135429. #endif
  135430. /* A[3] * A[7] */
  135431. "ldr r10, [%[a], #28]\n\t"
  135432. "ldr r12, [%[a], #12]\n\t"
  135433. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135434. "lsl r8, r10, #16\n\t"
  135435. "lsl r9, r12, #16\n\t"
  135436. "lsr r8, r8, #16\n\t"
  135437. "lsr r9, r9, #16\n\t"
  135438. "mul r9, r8, r9\n\t"
  135439. "adds r5, r5, r9\n\t"
  135440. "adcs r6, r6, #0\n\t"
  135441. "adc r7, r7, #0\n\t"
  135442. "lsr r9, r12, #16\n\t"
  135443. "mul r8, r9, r8\n\t"
  135444. "lsr r9, r8, #16\n\t"
  135445. "lsl r8, r8, #16\n\t"
  135446. "adds r5, r5, r8\n\t"
  135447. "adcs r6, r6, r9\n\t"
  135448. "adc r7, r7, #0\n\t"
  135449. "lsr r8, r10, #16\n\t"
  135450. "lsr r9, r12, #16\n\t"
  135451. "mul r9, r8, r9\n\t"
  135452. "adds r6, r6, r9\n\t"
  135453. "adc r7, r7, #0\n\t"
  135454. "lsl r9, r12, #16\n\t"
  135455. "lsr r9, r9, #16\n\t"
  135456. "mul r8, r9, r8\n\t"
  135457. "lsr r9, r8, #16\n\t"
  135458. "lsl r8, r8, #16\n\t"
  135459. "adds r5, r5, r8\n\t"
  135460. "adcs r6, r6, r9\n\t"
  135461. "adc r7, r7, #0\n\t"
  135462. #else
  135463. "umull r8, r9, r10, r12\n\t"
  135464. "adds r5, r5, r8\n\t"
  135465. "adcs r6, r6, r9\n\t"
  135466. "adc r7, r7, #0\n\t"
  135467. #endif
  135468. /* A[4] * A[6] */
  135469. "ldr r10, [%[a], #24]\n\t"
  135470. "ldr r12, [%[a], #16]\n\t"
  135471. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135472. "lsl r8, r10, #16\n\t"
  135473. "lsl r9, r12, #16\n\t"
  135474. "lsr r8, r8, #16\n\t"
  135475. "lsr r9, r9, #16\n\t"
  135476. "mul r9, r8, r9\n\t"
  135477. "adds r5, r5, r9\n\t"
  135478. "adcs r6, r6, #0\n\t"
  135479. "adc r7, r7, #0\n\t"
  135480. "lsr r9, r12, #16\n\t"
  135481. "mul r8, r9, r8\n\t"
  135482. "lsr r9, r8, #16\n\t"
  135483. "lsl r8, r8, #16\n\t"
  135484. "adds r5, r5, r8\n\t"
  135485. "adcs r6, r6, r9\n\t"
  135486. "adc r7, r7, #0\n\t"
  135487. "lsr r8, r10, #16\n\t"
  135488. "lsr r9, r12, #16\n\t"
  135489. "mul r9, r8, r9\n\t"
  135490. "adds r6, r6, r9\n\t"
  135491. "adc r7, r7, #0\n\t"
  135492. "lsl r9, r12, #16\n\t"
  135493. "lsr r9, r9, #16\n\t"
  135494. "mul r8, r9, r8\n\t"
  135495. "lsr r9, r8, #16\n\t"
  135496. "lsl r8, r8, #16\n\t"
  135497. "adds r5, r5, r8\n\t"
  135498. "adcs r6, r6, r9\n\t"
  135499. "adc r7, r7, #0\n\t"
  135500. #else
  135501. "umull r8, r9, r10, r12\n\t"
  135502. "adds r5, r5, r8\n\t"
  135503. "adcs r6, r6, r9\n\t"
  135504. "adc r7, r7, #0\n\t"
  135505. #endif
  135506. /* A[5] * A[5] */
  135507. "ldr r10, [%[a], #20]\n\t"
  135508. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135509. "lsl r8, r10, #16\n\t"
  135510. "lsr r9, r10, #16\n\t"
  135511. "lsr r8, r8, #16\n\t"
  135512. "mov r12, r8\n\t"
  135513. "mul r8, r12, r8\n\t"
  135514. "mov r12, r9\n\t"
  135515. "mul r9, r12, r9\n\t"
  135516. "adds r3, r3, r8\n\t"
  135517. "adcs r4, r4, r9\n\t"
  135518. "adc r2, r2, #0\n\t"
  135519. "lsr r9, r10, #16\n\t"
  135520. "lsl r8, r10, #16\n\t"
  135521. "lsr r8, r8, #16\n\t"
  135522. "mul r8, r9, r8\n\t"
  135523. "lsr r9, r8, #15\n\t"
  135524. "lsl r8, r8, #17\n\t"
  135525. "adds r3, r3, r8\n\t"
  135526. "adcs r4, r4, r9\n\t"
  135527. "adc r2, r2, #0\n\t"
  135528. "adds r5, r5, r5\n\t"
  135529. "adcs r6, r6, r6\n\t"
  135530. "adc r7, r7, r7\n\t"
  135531. #else
  135532. "umull r8, r9, r10, r10\n\t"
  135533. "adds r5, r5, r5\n\t"
  135534. "adcs r6, r6, r6\n\t"
  135535. "adc r7, r7, r7\n\t"
  135536. "adds r3, r3, r8\n\t"
  135537. "adcs r4, r4, r9\n\t"
  135538. "adc r2, r2, #0\n\t"
  135539. #endif
  135540. "adds r3, r3, r5\n\t"
  135541. "adcs r4, r4, r6\n\t"
  135542. "adc r2, r2, r7\n\t"
  135543. "str r3, [sp, #40]\n\t"
  135544. /* A[0] * A[11] */
  135545. "ldr r10, [%[a], #44]\n\t"
  135546. "ldr r12, [%[a]]\n\t"
  135547. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135548. "lsl r8, r10, #16\n\t"
  135549. "lsl r5, r12, #16\n\t"
  135550. "lsr r8, r8, #16\n\t"
  135551. "lsr r5, r5, #16\n\t"
  135552. "mul r5, r8, r5\n\t"
  135553. "lsr r9, r12, #16\n\t"
  135554. "mul r8, r9, r8\n\t"
  135555. "lsr r6, r8, #16\n\t"
  135556. "lsl r8, r8, #16\n\t"
  135557. "adds r5, r5, r8\n\t"
  135558. "adc r6, r6, #0\n\t"
  135559. "lsr r8, r10, #16\n\t"
  135560. "mul r9, r8, r9\n\t"
  135561. "add r6, r6, r9\n\t"
  135562. "lsl r9, r12, #16\n\t"
  135563. "lsr r9, r9, #16\n\t"
  135564. "mul r8, r9, r8\n\t"
  135565. "lsr r9, r8, #16\n\t"
  135566. "lsl r8, r8, #16\n\t"
  135567. "adds r5, r5, r8\n\t"
  135568. "adc r6, r6, r9\n\t"
  135569. #else
  135570. "umull r5, r6, r10, r12\n\t"
  135571. #endif
  135572. "mov r3, #0\n\t"
  135573. "mov r7, #0\n\t"
  135574. /* A[1] * A[10] */
  135575. "ldr r10, [%[a], #40]\n\t"
  135576. "ldr r12, [%[a], #4]\n\t"
  135577. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135578. "lsl r8, r10, #16\n\t"
  135579. "lsl r9, r12, #16\n\t"
  135580. "lsr r8, r8, #16\n\t"
  135581. "lsr r9, r9, #16\n\t"
  135582. "mul r9, r8, r9\n\t"
  135583. "adds r5, r5, r9\n\t"
  135584. "adcs r6, r6, #0\n\t"
  135585. "adc r7, r7, #0\n\t"
  135586. "lsr r9, r12, #16\n\t"
  135587. "mul r8, r9, r8\n\t"
  135588. "lsr r9, r8, #16\n\t"
  135589. "lsl r8, r8, #16\n\t"
  135590. "adds r5, r5, r8\n\t"
  135591. "adcs r6, r6, r9\n\t"
  135592. "adc r7, r7, #0\n\t"
  135593. "lsr r8, r10, #16\n\t"
  135594. "lsr r9, r12, #16\n\t"
  135595. "mul r9, r8, r9\n\t"
  135596. "adds r6, r6, r9\n\t"
  135597. "adc r7, r7, #0\n\t"
  135598. "lsl r9, r12, #16\n\t"
  135599. "lsr r9, r9, #16\n\t"
  135600. "mul r8, r9, r8\n\t"
  135601. "lsr r9, r8, #16\n\t"
  135602. "lsl r8, r8, #16\n\t"
  135603. "adds r5, r5, r8\n\t"
  135604. "adcs r6, r6, r9\n\t"
  135605. "adc r7, r7, #0\n\t"
  135606. #else
  135607. "umull r8, r9, r10, r12\n\t"
  135608. "adds r5, r5, r8\n\t"
  135609. "adcs r6, r6, r9\n\t"
  135610. "adc r7, r7, #0\n\t"
  135611. #endif
  135612. /* A[2] * A[9] */
  135613. "ldr r10, [%[a], #36]\n\t"
  135614. "ldr r12, [%[a], #8]\n\t"
  135615. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135616. "lsl r8, r10, #16\n\t"
  135617. "lsl r9, r12, #16\n\t"
  135618. "lsr r8, r8, #16\n\t"
  135619. "lsr r9, r9, #16\n\t"
  135620. "mul r9, r8, r9\n\t"
  135621. "adds r5, r5, r9\n\t"
  135622. "adcs r6, r6, #0\n\t"
  135623. "adc r7, r7, #0\n\t"
  135624. "lsr r9, r12, #16\n\t"
  135625. "mul r8, r9, r8\n\t"
  135626. "lsr r9, r8, #16\n\t"
  135627. "lsl r8, r8, #16\n\t"
  135628. "adds r5, r5, r8\n\t"
  135629. "adcs r6, r6, r9\n\t"
  135630. "adc r7, r7, #0\n\t"
  135631. "lsr r8, r10, #16\n\t"
  135632. "lsr r9, r12, #16\n\t"
  135633. "mul r9, r8, r9\n\t"
  135634. "adds r6, r6, r9\n\t"
  135635. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  135643. "adc r7, r7, #0\n\t"
  135644. #else
  135645. "umull r8, r9, r10, r12\n\t"
  135646. "adds r5, r5, r8\n\t"
  135647. "adcs r6, r6, r9\n\t"
  135648. "adc r7, r7, #0\n\t"
  135649. #endif
  135650. /* A[3] * A[8] */
  135651. "ldr r10, [%[a], #32]\n\t"
  135652. "ldr r12, [%[a], #12]\n\t"
  135653. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135654. "lsl r8, r10, #16\n\t"
  135655. "lsl r9, r12, #16\n\t"
  135656. "lsr r8, r8, #16\n\t"
  135657. "lsr r9, r9, #16\n\t"
  135658. "mul r9, r8, r9\n\t"
  135659. "adds r5, r5, r9\n\t"
  135660. "adcs r6, r6, #0\n\t"
  135661. "adc r7, r7, #0\n\t"
  135662. "lsr r9, r12, #16\n\t"
  135663. "mul r8, r9, r8\n\t"
  135664. "lsr r9, r8, #16\n\t"
  135665. "lsl r8, r8, #16\n\t"
  135666. "adds r5, r5, r8\n\t"
  135667. "adcs r6, r6, r9\n\t"
  135668. "adc r7, r7, #0\n\t"
  135669. "lsr r8, r10, #16\n\t"
  135670. "lsr r9, r12, #16\n\t"
  135671. "mul r9, r8, r9\n\t"
  135672. "adds r6, r6, r9\n\t"
  135673. "adc r7, r7, #0\n\t"
  135674. "lsl r9, r12, #16\n\t"
  135675. "lsr r9, r9, #16\n\t"
  135676. "mul r8, r9, r8\n\t"
  135677. "lsr r9, r8, #16\n\t"
  135678. "lsl r8, r8, #16\n\t"
  135679. "adds r5, r5, r8\n\t"
  135680. "adcs r6, r6, r9\n\t"
  135681. "adc r7, r7, #0\n\t"
  135682. #else
  135683. "umull r8, r9, r10, r12\n\t"
  135684. "adds r5, r5, r8\n\t"
  135685. "adcs r6, r6, r9\n\t"
  135686. "adc r7, r7, #0\n\t"
  135687. #endif
  135688. /* A[4] * A[7] */
  135689. "ldr r10, [%[a], #28]\n\t"
  135690. "ldr r12, [%[a], #16]\n\t"
  135691. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135692. "lsl r8, r10, #16\n\t"
  135693. "lsl r9, r12, #16\n\t"
  135694. "lsr r8, r8, #16\n\t"
  135695. "lsr r9, r9, #16\n\t"
  135696. "mul r9, r8, r9\n\t"
  135697. "adds r5, r5, r9\n\t"
  135698. "adcs r6, r6, #0\n\t"
  135699. "adc r7, r7, #0\n\t"
  135700. "lsr r9, r12, #16\n\t"
  135701. "mul r8, r9, r8\n\t"
  135702. "lsr r9, r8, #16\n\t"
  135703. "lsl r8, r8, #16\n\t"
  135704. "adds r5, r5, r8\n\t"
  135705. "adcs r6, r6, r9\n\t"
  135706. "adc r7, r7, #0\n\t"
  135707. "lsr r8, r10, #16\n\t"
  135708. "lsr r9, r12, #16\n\t"
  135709. "mul r9, r8, r9\n\t"
  135710. "adds r6, r6, r9\n\t"
  135711. "adc r7, r7, #0\n\t"
  135712. "lsl r9, r12, #16\n\t"
  135713. "lsr r9, r9, #16\n\t"
  135714. "mul r8, r9, r8\n\t"
  135715. "lsr r9, r8, #16\n\t"
  135716. "lsl r8, r8, #16\n\t"
  135717. "adds r5, r5, r8\n\t"
  135718. "adcs r6, r6, r9\n\t"
  135719. "adc r7, r7, #0\n\t"
  135720. #else
  135721. "umull r8, r9, r10, r12\n\t"
  135722. "adds r5, r5, r8\n\t"
  135723. "adcs r6, r6, r9\n\t"
  135724. "adc r7, r7, #0\n\t"
  135725. #endif
  135726. /* A[5] * A[6] */
  135727. "ldr r10, [%[a], #24]\n\t"
  135728. "ldr r12, [%[a], #20]\n\t"
  135729. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135730. "lsl r8, r10, #16\n\t"
  135731. "lsl r9, r12, #16\n\t"
  135732. "lsr r8, r8, #16\n\t"
  135733. "lsr r9, r9, #16\n\t"
  135734. "mul r9, r8, r9\n\t"
  135735. "adds r5, r5, r9\n\t"
  135736. "adcs r6, r6, #0\n\t"
  135737. "adc r7, r7, #0\n\t"
  135738. "lsr r9, r12, #16\n\t"
  135739. "mul r8, r9, r8\n\t"
  135740. "lsr r9, r8, #16\n\t"
  135741. "lsl r8, r8, #16\n\t"
  135742. "adds r5, r5, r8\n\t"
  135743. "adcs r6, r6, r9\n\t"
  135744. "adc r7, r7, #0\n\t"
  135745. "lsr r8, r10, #16\n\t"
  135746. "lsr r9, r12, #16\n\t"
  135747. "mul r9, r8, r9\n\t"
  135748. "adds r6, r6, r9\n\t"
  135749. "adc r7, r7, #0\n\t"
  135750. "lsl r9, r12, #16\n\t"
  135751. "lsr r9, r9, #16\n\t"
  135752. "mul r8, r9, r8\n\t"
  135753. "lsr r9, r8, #16\n\t"
  135754. "lsl r8, r8, #16\n\t"
  135755. "adds r5, r5, r8\n\t"
  135756. "adcs r6, r6, r9\n\t"
  135757. "adc r7, r7, #0\n\t"
  135758. #else
  135759. "umull r8, r9, r10, r12\n\t"
  135760. "adds r5, r5, r8\n\t"
  135761. "adcs r6, r6, r9\n\t"
  135762. "adc r7, r7, #0\n\t"
  135763. #endif
  135764. "adds r5, r5, r5\n\t"
  135765. "adcs r6, r6, r6\n\t"
  135766. "adc r7, r7, r7\n\t"
  135767. "adds r4, r4, r5\n\t"
  135768. "adcs r2, r2, r6\n\t"
  135769. "adc r3, r3, r7\n\t"
  135770. "str r4, [sp, #44]\n\t"
  135771. /* A[0] * A[12] */
  135772. "ldr r10, [%[a], #48]\n\t"
  135773. "ldr r12, [%[a]]\n\t"
  135774. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135775. "lsl r8, r10, #16\n\t"
  135776. "lsl r5, r12, #16\n\t"
  135777. "lsr r8, r8, #16\n\t"
  135778. "lsr r5, r5, #16\n\t"
  135779. "mul r5, r8, r5\n\t"
  135780. "lsr r9, r12, #16\n\t"
  135781. "mul r8, r9, r8\n\t"
  135782. "lsr r6, r8, #16\n\t"
  135783. "lsl r8, r8, #16\n\t"
  135784. "adds r5, r5, r8\n\t"
  135785. "adc r6, r6, #0\n\t"
  135786. "lsr r8, r10, #16\n\t"
  135787. "mul r9, r8, r9\n\t"
  135788. "add r6, r6, r9\n\t"
  135789. "lsl r9, r12, #16\n\t"
  135790. "lsr r9, r9, #16\n\t"
  135791. "mul r8, r9, r8\n\t"
  135792. "lsr r9, r8, #16\n\t"
  135793. "lsl r8, r8, #16\n\t"
  135794. "adds r5, r5, r8\n\t"
  135795. "adc r6, r6, r9\n\t"
  135796. #else
  135797. "umull r5, r6, r10, r12\n\t"
  135798. #endif
  135799. "mov r4, #0\n\t"
  135800. "mov r7, #0\n\t"
  135801. /* A[1] * A[11] */
  135802. "ldr r10, [%[a], #44]\n\t"
  135803. "ldr r12, [%[a], #4]\n\t"
  135804. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135805. "lsl r8, r10, #16\n\t"
  135806. "lsl r9, r12, #16\n\t"
  135807. "lsr r8, r8, #16\n\t"
  135808. "lsr r9, r9, #16\n\t"
  135809. "mul r9, r8, r9\n\t"
  135810. "adds r5, r5, r9\n\t"
  135811. "adcs r6, r6, #0\n\t"
  135812. "adc r7, r7, #0\n\t"
  135813. "lsr r9, r12, #16\n\t"
  135814. "mul r8, r9, r8\n\t"
  135815. "lsr r9, r8, #16\n\t"
  135816. "lsl r8, r8, #16\n\t"
  135817. "adds r5, r5, r8\n\t"
  135818. "adcs r6, r6, r9\n\t"
  135819. "adc r7, r7, #0\n\t"
  135820. "lsr r8, r10, #16\n\t"
  135821. "lsr r9, r12, #16\n\t"
  135822. "mul r9, r8, r9\n\t"
  135823. "adds r6, r6, r9\n\t"
  135824. "adc r7, r7, #0\n\t"
  135825. "lsl r9, r12, #16\n\t"
  135826. "lsr r9, r9, #16\n\t"
  135827. "mul r8, r9, r8\n\t"
  135828. "lsr r9, r8, #16\n\t"
  135829. "lsl r8, r8, #16\n\t"
  135830. "adds r5, r5, r8\n\t"
  135831. "adcs r6, r6, r9\n\t"
  135832. "adc r7, r7, #0\n\t"
  135833. #else
  135834. "umull r8, r9, r10, r12\n\t"
  135835. "adds r5, r5, r8\n\t"
  135836. "adcs r6, r6, r9\n\t"
  135837. "adc r7, r7, #0\n\t"
  135838. #endif
  135839. /* A[2] * A[10] */
  135840. "ldr r10, [%[a], #40]\n\t"
  135841. "ldr r12, [%[a], #8]\n\t"
  135842. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135843. "lsl r8, r10, #16\n\t"
  135844. "lsl r9, r12, #16\n\t"
  135845. "lsr r8, r8, #16\n\t"
  135846. "lsr r9, r9, #16\n\t"
  135847. "mul r9, r8, r9\n\t"
  135848. "adds r5, r5, r9\n\t"
  135849. "adcs r6, r6, #0\n\t"
  135850. "adc r7, r7, #0\n\t"
  135851. "lsr r9, r12, #16\n\t"
  135852. "mul r8, r9, r8\n\t"
  135853. "lsr r9, r8, #16\n\t"
  135854. "lsl r8, r8, #16\n\t"
  135855. "adds r5, r5, r8\n\t"
  135856. "adcs r6, r6, r9\n\t"
  135857. "adc r7, r7, #0\n\t"
  135858. "lsr r8, r10, #16\n\t"
  135859. "lsr r9, r12, #16\n\t"
  135860. "mul r9, r8, r9\n\t"
  135861. "adds r6, r6, r9\n\t"
  135862. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  135870. "adc r7, r7, #0\n\t"
  135871. #else
  135872. "umull r8, r9, r10, r12\n\t"
  135873. "adds r5, r5, r8\n\t"
  135874. "adcs r6, r6, r9\n\t"
  135875. "adc r7, r7, #0\n\t"
  135876. #endif
  135877. /* A[3] * A[9] */
  135878. "ldr r10, [%[a], #36]\n\t"
  135879. "ldr r12, [%[a], #12]\n\t"
  135880. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135881. "lsl r8, r10, #16\n\t"
  135882. "lsl r9, r12, #16\n\t"
  135883. "lsr r8, r8, #16\n\t"
  135884. "lsr r9, r9, #16\n\t"
  135885. "mul r9, r8, r9\n\t"
  135886. "adds r5, r5, r9\n\t"
  135887. "adcs r6, r6, #0\n\t"
  135888. "adc r7, r7, #0\n\t"
  135889. "lsr r9, r12, #16\n\t"
  135890. "mul r8, r9, r8\n\t"
  135891. "lsr r9, r8, #16\n\t"
  135892. "lsl r8, r8, #16\n\t"
  135893. "adds r5, r5, r8\n\t"
  135894. "adcs r6, r6, r9\n\t"
  135895. "adc r7, r7, #0\n\t"
  135896. "lsr r8, r10, #16\n\t"
  135897. "lsr r9, r12, #16\n\t"
  135898. "mul r9, r8, r9\n\t"
  135899. "adds r6, r6, r9\n\t"
  135900. "adc r7, r7, #0\n\t"
  135901. "lsl r9, r12, #16\n\t"
  135902. "lsr r9, r9, #16\n\t"
  135903. "mul r8, r9, r8\n\t"
  135904. "lsr r9, r8, #16\n\t"
  135905. "lsl r8, r8, #16\n\t"
  135906. "adds r5, r5, r8\n\t"
  135907. "adcs r6, r6, r9\n\t"
  135908. "adc r7, r7, #0\n\t"
  135909. #else
  135910. "umull r8, r9, r10, r12\n\t"
  135911. "adds r5, r5, r8\n\t"
  135912. "adcs r6, r6, r9\n\t"
  135913. "adc r7, r7, #0\n\t"
  135914. #endif
  135915. /* A[4] * A[8] */
  135916. "ldr r10, [%[a], #32]\n\t"
  135917. "ldr r12, [%[a], #16]\n\t"
  135918. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135919. "lsl r8, r10, #16\n\t"
  135920. "lsl r9, r12, #16\n\t"
  135921. "lsr r8, r8, #16\n\t"
  135922. "lsr r9, r9, #16\n\t"
  135923. "mul r9, r8, r9\n\t"
  135924. "adds r5, r5, r9\n\t"
  135925. "adcs r6, r6, #0\n\t"
  135926. "adc r7, r7, #0\n\t"
  135927. "lsr r9, r12, #16\n\t"
  135928. "mul r8, r9, r8\n\t"
  135929. "lsr r9, r8, #16\n\t"
  135930. "lsl r8, r8, #16\n\t"
  135931. "adds r5, r5, r8\n\t"
  135932. "adcs r6, r6, r9\n\t"
  135933. "adc r7, r7, #0\n\t"
  135934. "lsr r8, r10, #16\n\t"
  135935. "lsr r9, r12, #16\n\t"
  135936. "mul r9, r8, r9\n\t"
  135937. "adds r6, r6, r9\n\t"
  135938. "adc r7, r7, #0\n\t"
  135939. "lsl r9, r12, #16\n\t"
  135940. "lsr r9, r9, #16\n\t"
  135941. "mul r8, r9, r8\n\t"
  135942. "lsr r9, r8, #16\n\t"
  135943. "lsl r8, r8, #16\n\t"
  135944. "adds r5, r5, r8\n\t"
  135945. "adcs r6, r6, r9\n\t"
  135946. "adc r7, r7, #0\n\t"
  135947. #else
  135948. "umull r8, r9, r10, r12\n\t"
  135949. "adds r5, r5, r8\n\t"
  135950. "adcs r6, r6, r9\n\t"
  135951. "adc r7, r7, #0\n\t"
  135952. #endif
  135953. /* A[5] * A[7] */
  135954. "ldr r10, [%[a], #28]\n\t"
  135955. "ldr r12, [%[a], #20]\n\t"
  135956. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135957. "lsl r8, r10, #16\n\t"
  135958. "lsl r9, r12, #16\n\t"
  135959. "lsr r8, r8, #16\n\t"
  135960. "lsr r9, r9, #16\n\t"
  135961. "mul r9, r8, r9\n\t"
  135962. "adds r5, r5, r9\n\t"
  135963. "adcs r6, r6, #0\n\t"
  135964. "adc r7, r7, #0\n\t"
  135965. "lsr r9, r12, #16\n\t"
  135966. "mul r8, r9, r8\n\t"
  135967. "lsr r9, r8, #16\n\t"
  135968. "lsl r8, r8, #16\n\t"
  135969. "adds r5, r5, r8\n\t"
  135970. "adcs r6, r6, r9\n\t"
  135971. "adc r7, r7, #0\n\t"
  135972. "lsr r8, r10, #16\n\t"
  135973. "lsr r9, r12, #16\n\t"
  135974. "mul r9, r8, r9\n\t"
  135975. "adds r6, r6, r9\n\t"
  135976. "adc r7, r7, #0\n\t"
  135977. "lsl r9, r12, #16\n\t"
  135978. "lsr r9, r9, #16\n\t"
  135979. "mul r8, r9, r8\n\t"
  135980. "lsr r9, r8, #16\n\t"
  135981. "lsl r8, r8, #16\n\t"
  135982. "adds r5, r5, r8\n\t"
  135983. "adcs r6, r6, r9\n\t"
  135984. "adc r7, r7, #0\n\t"
  135985. #else
  135986. "umull r8, r9, r10, r12\n\t"
  135987. "adds r5, r5, r8\n\t"
  135988. "adcs r6, r6, r9\n\t"
  135989. "adc r7, r7, #0\n\t"
  135990. #endif
  135991. /* A[6] * A[6] */
  135992. "ldr r10, [%[a], #24]\n\t"
  135993. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  135994. "lsl r8, r10, #16\n\t"
  135995. "lsr r9, r10, #16\n\t"
  135996. "lsr r8, r8, #16\n\t"
  135997. "mov r12, r8\n\t"
  135998. "mul r8, r12, r8\n\t"
  135999. "mov r12, r9\n\t"
  136000. "mul r9, r12, r9\n\t"
  136001. "adds r2, r2, r8\n\t"
  136002. "adcs r3, r3, r9\n\t"
  136003. "adc r4, r4, #0\n\t"
  136004. "lsr r9, r10, #16\n\t"
  136005. "lsl r8, r10, #16\n\t"
  136006. "lsr r8, r8, #16\n\t"
  136007. "mul r8, r9, r8\n\t"
  136008. "lsr r9, r8, #15\n\t"
  136009. "lsl r8, r8, #17\n\t"
  136010. "adds r2, r2, r8\n\t"
  136011. "adcs r3, r3, r9\n\t"
  136012. "adc r4, r4, #0\n\t"
  136013. "adds r5, r5, r5\n\t"
  136014. "adcs r6, r6, r6\n\t"
  136015. "adc r7, r7, r7\n\t"
  136016. #else
  136017. "umull r8, r9, r10, r10\n\t"
  136018. "adds r5, r5, r5\n\t"
  136019. "adcs r6, r6, r6\n\t"
  136020. "adc r7, r7, r7\n\t"
  136021. "adds r2, r2, r8\n\t"
  136022. "adcs r3, r3, r9\n\t"
  136023. "adc r4, r4, #0\n\t"
  136024. #endif
  136025. "adds r2, r2, r5\n\t"
  136026. "adcs r3, r3, r6\n\t"
  136027. "adc r4, r4, r7\n\t"
  136028. "str r2, [sp, #48]\n\t"
  136029. /* A[0] * A[13] */
  136030. "ldr r10, [%[a], #52]\n\t"
  136031. "ldr r12, [%[a]]\n\t"
  136032. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136033. "lsl r8, r10, #16\n\t"
  136034. "lsl r5, r12, #16\n\t"
  136035. "lsr r8, r8, #16\n\t"
  136036. "lsr r5, r5, #16\n\t"
  136037. "mul r5, r8, r5\n\t"
  136038. "lsr r9, r12, #16\n\t"
  136039. "mul r8, r9, r8\n\t"
  136040. "lsr r6, r8, #16\n\t"
  136041. "lsl r8, r8, #16\n\t"
  136042. "adds r5, r5, r8\n\t"
  136043. "adc r6, r6, #0\n\t"
  136044. "lsr r8, r10, #16\n\t"
  136045. "mul r9, r8, r9\n\t"
  136046. "add r6, r6, r9\n\t"
  136047. "lsl r9, r12, #16\n\t"
  136048. "lsr r9, r9, #16\n\t"
  136049. "mul r8, r9, r8\n\t"
  136050. "lsr r9, r8, #16\n\t"
  136051. "lsl r8, r8, #16\n\t"
  136052. "adds r5, r5, r8\n\t"
  136053. "adc r6, r6, r9\n\t"
  136054. #else
  136055. "umull r5, r6, r10, r12\n\t"
  136056. #endif
  136057. "mov r2, #0\n\t"
  136058. "mov r7, #0\n\t"
  136059. /* A[1] * A[12] */
  136060. "ldr r10, [%[a], #48]\n\t"
  136061. "ldr r12, [%[a], #4]\n\t"
  136062. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136063. "lsl r8, r10, #16\n\t"
  136064. "lsl r9, r12, #16\n\t"
  136065. "lsr r8, r8, #16\n\t"
  136066. "lsr r9, r9, #16\n\t"
  136067. "mul r9, r8, r9\n\t"
  136068. "adds r5, r5, r9\n\t"
  136069. "adcs r6, r6, #0\n\t"
  136070. "adc r7, r7, #0\n\t"
  136071. "lsr r9, r12, #16\n\t"
  136072. "mul r8, r9, r8\n\t"
  136073. "lsr r9, r8, #16\n\t"
  136074. "lsl r8, r8, #16\n\t"
  136075. "adds r5, r5, r8\n\t"
  136076. "adcs r6, r6, r9\n\t"
  136077. "adc r7, r7, #0\n\t"
  136078. "lsr r8, r10, #16\n\t"
  136079. "lsr r9, r12, #16\n\t"
  136080. "mul r9, r8, r9\n\t"
  136081. "adds r6, r6, r9\n\t"
  136082. "adc r7, r7, #0\n\t"
  136083. "lsl r9, r12, #16\n\t"
  136084. "lsr r9, r9, #16\n\t"
  136085. "mul r8, r9, r8\n\t"
  136086. "lsr r9, r8, #16\n\t"
  136087. "lsl r8, r8, #16\n\t"
  136088. "adds r5, r5, r8\n\t"
  136089. "adcs r6, r6, r9\n\t"
  136090. "adc r7, r7, #0\n\t"
  136091. #else
  136092. "umull r8, r9, r10, r12\n\t"
  136093. "adds r5, r5, r8\n\t"
  136094. "adcs r6, r6, r9\n\t"
  136095. "adc r7, r7, #0\n\t"
  136096. #endif
  136097. /* A[2] * A[11] */
  136098. "ldr r10, [%[a], #44]\n\t"
  136099. "ldr r12, [%[a], #8]\n\t"
  136100. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136101. "lsl r8, r10, #16\n\t"
  136102. "lsl r9, r12, #16\n\t"
  136103. "lsr r8, r8, #16\n\t"
  136104. "lsr r9, r9, #16\n\t"
  136105. "mul r9, r8, r9\n\t"
  136106. "adds r5, r5, r9\n\t"
  136107. "adcs r6, r6, #0\n\t"
  136108. "adc r7, r7, #0\n\t"
  136109. "lsr r9, r12, #16\n\t"
  136110. "mul r8, r9, r8\n\t"
  136111. "lsr r9, r8, #16\n\t"
  136112. "lsl r8, r8, #16\n\t"
  136113. "adds r5, r5, r8\n\t"
  136114. "adcs r6, r6, r9\n\t"
  136115. "adc r7, r7, #0\n\t"
  136116. "lsr r8, r10, #16\n\t"
  136117. "lsr r9, r12, #16\n\t"
  136118. "mul r9, r8, r9\n\t"
  136119. "adds r6, r6, r9\n\t"
  136120. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  136128. "adc r7, r7, #0\n\t"
  136129. #else
  136130. "umull r8, r9, r10, r12\n\t"
  136131. "adds r5, r5, r8\n\t"
  136132. "adcs r6, r6, r9\n\t"
  136133. "adc r7, r7, #0\n\t"
  136134. #endif
  136135. /* A[3] * A[10] */
  136136. "ldr r10, [%[a], #40]\n\t"
  136137. "ldr r12, [%[a], #12]\n\t"
  136138. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136139. "lsl r8, r10, #16\n\t"
  136140. "lsl r9, r12, #16\n\t"
  136141. "lsr r8, r8, #16\n\t"
  136142. "lsr r9, r9, #16\n\t"
  136143. "mul r9, r8, r9\n\t"
  136144. "adds r5, r5, r9\n\t"
  136145. "adcs r6, r6, #0\n\t"
  136146. "adc r7, r7, #0\n\t"
  136147. "lsr r9, r12, #16\n\t"
  136148. "mul r8, r9, r8\n\t"
  136149. "lsr r9, r8, #16\n\t"
  136150. "lsl r8, r8, #16\n\t"
  136151. "adds r5, r5, r8\n\t"
  136152. "adcs r6, r6, r9\n\t"
  136153. "adc r7, r7, #0\n\t"
  136154. "lsr r8, r10, #16\n\t"
  136155. "lsr r9, r12, #16\n\t"
  136156. "mul r9, r8, r9\n\t"
  136157. "adds r6, r6, r9\n\t"
  136158. "adc r7, r7, #0\n\t"
  136159. "lsl r9, r12, #16\n\t"
  136160. "lsr r9, r9, #16\n\t"
  136161. "mul r8, r9, r8\n\t"
  136162. "lsr r9, r8, #16\n\t"
  136163. "lsl r8, r8, #16\n\t"
  136164. "adds r5, r5, r8\n\t"
  136165. "adcs r6, r6, r9\n\t"
  136166. "adc r7, r7, #0\n\t"
  136167. #else
  136168. "umull r8, r9, r10, r12\n\t"
  136169. "adds r5, r5, r8\n\t"
  136170. "adcs r6, r6, r9\n\t"
  136171. "adc r7, r7, #0\n\t"
  136172. #endif
  136173. /* A[4] * A[9] */
  136174. "ldr r10, [%[a], #36]\n\t"
  136175. "ldr r12, [%[a], #16]\n\t"
  136176. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136177. "lsl r8, r10, #16\n\t"
  136178. "lsl r9, r12, #16\n\t"
  136179. "lsr r8, r8, #16\n\t"
  136180. "lsr r9, r9, #16\n\t"
  136181. "mul r9, r8, r9\n\t"
  136182. "adds r5, r5, r9\n\t"
  136183. "adcs r6, r6, #0\n\t"
  136184. "adc r7, r7, #0\n\t"
  136185. "lsr r9, r12, #16\n\t"
  136186. "mul r8, r9, r8\n\t"
  136187. "lsr r9, r8, #16\n\t"
  136188. "lsl r8, r8, #16\n\t"
  136189. "adds r5, r5, r8\n\t"
  136190. "adcs r6, r6, r9\n\t"
  136191. "adc r7, r7, #0\n\t"
  136192. "lsr r8, r10, #16\n\t"
  136193. "lsr r9, r12, #16\n\t"
  136194. "mul r9, r8, r9\n\t"
  136195. "adds r6, r6, r9\n\t"
  136196. "adc r7, r7, #0\n\t"
  136197. "lsl r9, r12, #16\n\t"
  136198. "lsr r9, r9, #16\n\t"
  136199. "mul r8, r9, r8\n\t"
  136200. "lsr r9, r8, #16\n\t"
  136201. "lsl r8, r8, #16\n\t"
  136202. "adds r5, r5, r8\n\t"
  136203. "adcs r6, r6, r9\n\t"
  136204. "adc r7, r7, #0\n\t"
  136205. #else
  136206. "umull r8, r9, r10, r12\n\t"
  136207. "adds r5, r5, r8\n\t"
  136208. "adcs r6, r6, r9\n\t"
  136209. "adc r7, r7, #0\n\t"
  136210. #endif
  136211. /* A[5] * A[8] */
  136212. "ldr r10, [%[a], #32]\n\t"
  136213. "ldr r12, [%[a], #20]\n\t"
  136214. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136215. "lsl r8, r10, #16\n\t"
  136216. "lsl r9, r12, #16\n\t"
  136217. "lsr r8, r8, #16\n\t"
  136218. "lsr r9, r9, #16\n\t"
  136219. "mul r9, r8, r9\n\t"
  136220. "adds r5, r5, r9\n\t"
  136221. "adcs r6, r6, #0\n\t"
  136222. "adc r7, r7, #0\n\t"
  136223. "lsr r9, r12, #16\n\t"
  136224. "mul r8, r9, r8\n\t"
  136225. "lsr r9, r8, #16\n\t"
  136226. "lsl r8, r8, #16\n\t"
  136227. "adds r5, r5, r8\n\t"
  136228. "adcs r6, r6, r9\n\t"
  136229. "adc r7, r7, #0\n\t"
  136230. "lsr r8, r10, #16\n\t"
  136231. "lsr r9, r12, #16\n\t"
  136232. "mul r9, r8, r9\n\t"
  136233. "adds r6, r6, r9\n\t"
  136234. "adc r7, r7, #0\n\t"
  136235. "lsl r9, r12, #16\n\t"
  136236. "lsr r9, r9, #16\n\t"
  136237. "mul r8, r9, r8\n\t"
  136238. "lsr r9, r8, #16\n\t"
  136239. "lsl r8, r8, #16\n\t"
  136240. "adds r5, r5, r8\n\t"
  136241. "adcs r6, r6, r9\n\t"
  136242. "adc r7, r7, #0\n\t"
  136243. #else
  136244. "umull r8, r9, r10, r12\n\t"
  136245. "adds r5, r5, r8\n\t"
  136246. "adcs r6, r6, r9\n\t"
  136247. "adc r7, r7, #0\n\t"
  136248. #endif
  136249. /* A[6] * A[7] */
  136250. "ldr r10, [%[a], #28]\n\t"
  136251. "ldr r12, [%[a], #24]\n\t"
  136252. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136253. "lsl r8, r10, #16\n\t"
  136254. "lsl r9, r12, #16\n\t"
  136255. "lsr r8, r8, #16\n\t"
  136256. "lsr r9, r9, #16\n\t"
  136257. "mul r9, r8, r9\n\t"
  136258. "adds r5, r5, r9\n\t"
  136259. "adcs r6, r6, #0\n\t"
  136260. "adc r7, r7, #0\n\t"
  136261. "lsr r9, r12, #16\n\t"
  136262. "mul r8, r9, r8\n\t"
  136263. "lsr r9, r8, #16\n\t"
  136264. "lsl r8, r8, #16\n\t"
  136265. "adds r5, r5, r8\n\t"
  136266. "adcs r6, r6, r9\n\t"
  136267. "adc r7, r7, #0\n\t"
  136268. "lsr r8, r10, #16\n\t"
  136269. "lsr r9, r12, #16\n\t"
  136270. "mul r9, r8, r9\n\t"
  136271. "adds r6, r6, r9\n\t"
  136272. "adc r7, r7, #0\n\t"
  136273. "lsl r9, r12, #16\n\t"
  136274. "lsr r9, r9, #16\n\t"
  136275. "mul r8, r9, r8\n\t"
  136276. "lsr r9, r8, #16\n\t"
  136277. "lsl r8, r8, #16\n\t"
  136278. "adds r5, r5, r8\n\t"
  136279. "adcs r6, r6, r9\n\t"
  136280. "adc r7, r7, #0\n\t"
  136281. #else
  136282. "umull r8, r9, r10, r12\n\t"
  136283. "adds r5, r5, r8\n\t"
  136284. "adcs r6, r6, r9\n\t"
  136285. "adc r7, r7, #0\n\t"
  136286. #endif
  136287. "adds r5, r5, r5\n\t"
  136288. "adcs r6, r6, r6\n\t"
  136289. "adc r7, r7, r7\n\t"
  136290. "adds r3, r3, r5\n\t"
  136291. "adcs r4, r4, r6\n\t"
  136292. "adc r2, r2, r7\n\t"
  136293. "str r3, [sp, #52]\n\t"
  136294. /* A[0] * A[14] */
  136295. "ldr r10, [%[a], #56]\n\t"
  136296. "ldr r12, [%[a]]\n\t"
  136297. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136298. "lsl r8, r10, #16\n\t"
  136299. "lsl r5, r12, #16\n\t"
  136300. "lsr r8, r8, #16\n\t"
  136301. "lsr r5, r5, #16\n\t"
  136302. "mul r5, r8, r5\n\t"
  136303. "lsr r9, r12, #16\n\t"
  136304. "mul r8, r9, r8\n\t"
  136305. "lsr r6, r8, #16\n\t"
  136306. "lsl r8, r8, #16\n\t"
  136307. "adds r5, r5, r8\n\t"
  136308. "adc r6, r6, #0\n\t"
  136309. "lsr r8, r10, #16\n\t"
  136310. "mul r9, r8, r9\n\t"
  136311. "add r6, r6, r9\n\t"
  136312. "lsl r9, r12, #16\n\t"
  136313. "lsr r9, r9, #16\n\t"
  136314. "mul r8, r9, r8\n\t"
  136315. "lsr r9, r8, #16\n\t"
  136316. "lsl r8, r8, #16\n\t"
  136317. "adds r5, r5, r8\n\t"
  136318. "adc r6, r6, r9\n\t"
  136319. #else
  136320. "umull r5, r6, r10, r12\n\t"
  136321. #endif
  136322. "mov r3, #0\n\t"
  136323. "mov r7, #0\n\t"
  136324. /* A[1] * A[13] */
  136325. "ldr r10, [%[a], #52]\n\t"
  136326. "ldr r12, [%[a], #4]\n\t"
  136327. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136328. "lsl r8, r10, #16\n\t"
  136329. "lsl r9, r12, #16\n\t"
  136330. "lsr r8, r8, #16\n\t"
  136331. "lsr r9, r9, #16\n\t"
  136332. "mul r9, r8, r9\n\t"
  136333. "adds r5, r5, r9\n\t"
  136334. "adcs r6, r6, #0\n\t"
  136335. "adc r7, r7, #0\n\t"
  136336. "lsr r9, r12, #16\n\t"
  136337. "mul r8, r9, r8\n\t"
  136338. "lsr r9, r8, #16\n\t"
  136339. "lsl r8, r8, #16\n\t"
  136340. "adds r5, r5, r8\n\t"
  136341. "adcs r6, r6, r9\n\t"
  136342. "adc r7, r7, #0\n\t"
  136343. "lsr r8, r10, #16\n\t"
  136344. "lsr r9, r12, #16\n\t"
  136345. "mul r9, r8, r9\n\t"
  136346. "adds r6, r6, r9\n\t"
  136347. "adc r7, r7, #0\n\t"
  136348. "lsl r9, r12, #16\n\t"
  136349. "lsr r9, r9, #16\n\t"
  136350. "mul r8, r9, r8\n\t"
  136351. "lsr r9, r8, #16\n\t"
  136352. "lsl r8, r8, #16\n\t"
  136353. "adds r5, r5, r8\n\t"
  136354. "adcs r6, r6, r9\n\t"
  136355. "adc r7, r7, #0\n\t"
  136356. #else
  136357. "umull r8, r9, r10, r12\n\t"
  136358. "adds r5, r5, r8\n\t"
  136359. "adcs r6, r6, r9\n\t"
  136360. "adc r7, r7, #0\n\t"
  136361. #endif
  136362. /* A[2] * A[12] */
  136363. "ldr r10, [%[a], #48]\n\t"
  136364. "ldr r12, [%[a], #8]\n\t"
  136365. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136366. "lsl r8, r10, #16\n\t"
  136367. "lsl r9, r12, #16\n\t"
  136368. "lsr r8, r8, #16\n\t"
  136369. "lsr r9, r9, #16\n\t"
  136370. "mul r9, r8, r9\n\t"
  136371. "adds r5, r5, r9\n\t"
  136372. "adcs r6, r6, #0\n\t"
  136373. "adc r7, r7, #0\n\t"
  136374. "lsr r9, r12, #16\n\t"
  136375. "mul r8, r9, r8\n\t"
  136376. "lsr r9, r8, #16\n\t"
  136377. "lsl r8, r8, #16\n\t"
  136378. "adds r5, r5, r8\n\t"
  136379. "adcs r6, r6, r9\n\t"
  136380. "adc r7, r7, #0\n\t"
  136381. "lsr r8, r10, #16\n\t"
  136382. "lsr r9, r12, #16\n\t"
  136383. "mul r9, r8, r9\n\t"
  136384. "adds r6, r6, r9\n\t"
  136385. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  136393. "adc r7, r7, #0\n\t"
  136394. #else
  136395. "umull r8, r9, r10, r12\n\t"
  136396. "adds r5, r5, r8\n\t"
  136397. "adcs r6, r6, r9\n\t"
  136398. "adc r7, r7, #0\n\t"
  136399. #endif
  136400. /* A[3] * A[11] */
  136401. "ldr r10, [%[a], #44]\n\t"
  136402. "ldr r12, [%[a], #12]\n\t"
  136403. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136404. "lsl r8, r10, #16\n\t"
  136405. "lsl r9, r12, #16\n\t"
  136406. "lsr r8, r8, #16\n\t"
  136407. "lsr r9, r9, #16\n\t"
  136408. "mul r9, r8, r9\n\t"
  136409. "adds r5, r5, r9\n\t"
  136410. "adcs r6, r6, #0\n\t"
  136411. "adc r7, r7, #0\n\t"
  136412. "lsr r9, r12, #16\n\t"
  136413. "mul r8, r9, r8\n\t"
  136414. "lsr r9, r8, #16\n\t"
  136415. "lsl r8, r8, #16\n\t"
  136416. "adds r5, r5, r8\n\t"
  136417. "adcs r6, r6, r9\n\t"
  136418. "adc r7, r7, #0\n\t"
  136419. "lsr r8, r10, #16\n\t"
  136420. "lsr r9, r12, #16\n\t"
  136421. "mul r9, r8, r9\n\t"
  136422. "adds r6, r6, r9\n\t"
  136423. "adc r7, r7, #0\n\t"
  136424. "lsl r9, r12, #16\n\t"
  136425. "lsr r9, r9, #16\n\t"
  136426. "mul r8, r9, r8\n\t"
  136427. "lsr r9, r8, #16\n\t"
  136428. "lsl r8, r8, #16\n\t"
  136429. "adds r5, r5, r8\n\t"
  136430. "adcs r6, r6, r9\n\t"
  136431. "adc r7, r7, #0\n\t"
  136432. #else
  136433. "umull r8, r9, r10, r12\n\t"
  136434. "adds r5, r5, r8\n\t"
  136435. "adcs r6, r6, r9\n\t"
  136436. "adc r7, r7, #0\n\t"
  136437. #endif
  136438. /* A[4] * A[10] */
  136439. "ldr r10, [%[a], #40]\n\t"
  136440. "ldr r12, [%[a], #16]\n\t"
  136441. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136442. "lsl r8, r10, #16\n\t"
  136443. "lsl r9, r12, #16\n\t"
  136444. "lsr r8, r8, #16\n\t"
  136445. "lsr r9, r9, #16\n\t"
  136446. "mul r9, r8, r9\n\t"
  136447. "adds r5, r5, r9\n\t"
  136448. "adcs r6, r6, #0\n\t"
  136449. "adc r7, r7, #0\n\t"
  136450. "lsr r9, r12, #16\n\t"
  136451. "mul r8, r9, r8\n\t"
  136452. "lsr r9, r8, #16\n\t"
  136453. "lsl r8, r8, #16\n\t"
  136454. "adds r5, r5, r8\n\t"
  136455. "adcs r6, r6, r9\n\t"
  136456. "adc r7, r7, #0\n\t"
  136457. "lsr r8, r10, #16\n\t"
  136458. "lsr r9, r12, #16\n\t"
  136459. "mul r9, r8, r9\n\t"
  136460. "adds r6, r6, r9\n\t"
  136461. "adc r7, r7, #0\n\t"
  136462. "lsl r9, r12, #16\n\t"
  136463. "lsr r9, r9, #16\n\t"
  136464. "mul r8, r9, r8\n\t"
  136465. "lsr r9, r8, #16\n\t"
  136466. "lsl r8, r8, #16\n\t"
  136467. "adds r5, r5, r8\n\t"
  136468. "adcs r6, r6, r9\n\t"
  136469. "adc r7, r7, #0\n\t"
  136470. #else
  136471. "umull r8, r9, r10, r12\n\t"
  136472. "adds r5, r5, r8\n\t"
  136473. "adcs r6, r6, r9\n\t"
  136474. "adc r7, r7, #0\n\t"
  136475. #endif
  136476. /* A[5] * A[9] */
  136477. "ldr r10, [%[a], #36]\n\t"
  136478. "ldr r12, [%[a], #20]\n\t"
  136479. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136480. "lsl r8, r10, #16\n\t"
  136481. "lsl r9, r12, #16\n\t"
  136482. "lsr r8, r8, #16\n\t"
  136483. "lsr r9, r9, #16\n\t"
  136484. "mul r9, r8, r9\n\t"
  136485. "adds r5, r5, r9\n\t"
  136486. "adcs r6, r6, #0\n\t"
  136487. "adc r7, r7, #0\n\t"
  136488. "lsr r9, r12, #16\n\t"
  136489. "mul r8, r9, r8\n\t"
  136490. "lsr r9, r8, #16\n\t"
  136491. "lsl r8, r8, #16\n\t"
  136492. "adds r5, r5, r8\n\t"
  136493. "adcs r6, r6, r9\n\t"
  136494. "adc r7, r7, #0\n\t"
  136495. "lsr r8, r10, #16\n\t"
  136496. "lsr r9, r12, #16\n\t"
  136497. "mul r9, r8, r9\n\t"
  136498. "adds r6, r6, r9\n\t"
  136499. "adc r7, r7, #0\n\t"
  136500. "lsl r9, r12, #16\n\t"
  136501. "lsr r9, r9, #16\n\t"
  136502. "mul r8, r9, r8\n\t"
  136503. "lsr r9, r8, #16\n\t"
  136504. "lsl r8, r8, #16\n\t"
  136505. "adds r5, r5, r8\n\t"
  136506. "adcs r6, r6, r9\n\t"
  136507. "adc r7, r7, #0\n\t"
  136508. #else
  136509. "umull r8, r9, r10, r12\n\t"
  136510. "adds r5, r5, r8\n\t"
  136511. "adcs r6, r6, r9\n\t"
  136512. "adc r7, r7, #0\n\t"
  136513. #endif
  136514. /* A[6] * A[8] */
  136515. "ldr r10, [%[a], #32]\n\t"
  136516. "ldr r12, [%[a], #24]\n\t"
  136517. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136518. "lsl r8, r10, #16\n\t"
  136519. "lsl r9, r12, #16\n\t"
  136520. "lsr r8, r8, #16\n\t"
  136521. "lsr r9, r9, #16\n\t"
  136522. "mul r9, r8, r9\n\t"
  136523. "adds r5, r5, r9\n\t"
  136524. "adcs r6, r6, #0\n\t"
  136525. "adc r7, r7, #0\n\t"
  136526. "lsr r9, r12, #16\n\t"
  136527. "mul r8, r9, r8\n\t"
  136528. "lsr r9, r8, #16\n\t"
  136529. "lsl r8, r8, #16\n\t"
  136530. "adds r5, r5, r8\n\t"
  136531. "adcs r6, r6, r9\n\t"
  136532. "adc r7, r7, #0\n\t"
  136533. "lsr r8, r10, #16\n\t"
  136534. "lsr r9, r12, #16\n\t"
  136535. "mul r9, r8, r9\n\t"
  136536. "adds r6, r6, r9\n\t"
  136537. "adc r7, r7, #0\n\t"
  136538. "lsl r9, r12, #16\n\t"
  136539. "lsr r9, r9, #16\n\t"
  136540. "mul r8, r9, r8\n\t"
  136541. "lsr r9, r8, #16\n\t"
  136542. "lsl r8, r8, #16\n\t"
  136543. "adds r5, r5, r8\n\t"
  136544. "adcs r6, r6, r9\n\t"
  136545. "adc r7, r7, #0\n\t"
  136546. #else
  136547. "umull r8, r9, r10, r12\n\t"
  136548. "adds r5, r5, r8\n\t"
  136549. "adcs r6, r6, r9\n\t"
  136550. "adc r7, r7, #0\n\t"
  136551. #endif
  136552. /* A[7] * A[7] */
  136553. "ldr r10, [%[a], #28]\n\t"
  136554. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136555. "lsl r8, r10, #16\n\t"
  136556. "lsr r9, r10, #16\n\t"
  136557. "lsr r8, r8, #16\n\t"
  136558. "mov r12, r8\n\t"
  136559. "mul r8, r12, r8\n\t"
  136560. "mov r12, r9\n\t"
  136561. "mul r9, r12, r9\n\t"
  136562. "adds r4, r4, r8\n\t"
  136563. "adcs r2, r2, r9\n\t"
  136564. "adc r3, r3, #0\n\t"
  136565. "lsr r9, r10, #16\n\t"
  136566. "lsl r8, r10, #16\n\t"
  136567. "lsr r8, r8, #16\n\t"
  136568. "mul r8, r9, r8\n\t"
  136569. "lsr r9, r8, #15\n\t"
  136570. "lsl r8, r8, #17\n\t"
  136571. "adds r4, r4, r8\n\t"
  136572. "adcs r2, r2, r9\n\t"
  136573. "adc r3, r3, #0\n\t"
  136574. "adds r5, r5, r5\n\t"
  136575. "adcs r6, r6, r6\n\t"
  136576. "adc r7, r7, r7\n\t"
  136577. #else
  136578. "umull r8, r9, r10, r10\n\t"
  136579. "adds r5, r5, r5\n\t"
  136580. "adcs r6, r6, r6\n\t"
  136581. "adc r7, r7, r7\n\t"
  136582. "adds r4, r4, r8\n\t"
  136583. "adcs r2, r2, r9\n\t"
  136584. "adc r3, r3, #0\n\t"
  136585. #endif
  136586. "adds r4, r4, r5\n\t"
  136587. "adcs r2, r2, r6\n\t"
  136588. "adc r3, r3, r7\n\t"
  136589. "str r4, [sp, #56]\n\t"
  136590. /* A[0] * A[15] */
  136591. "ldr r10, [%[a], #60]\n\t"
  136592. "ldr r12, [%[a]]\n\t"
  136593. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136594. "lsl r8, r10, #16\n\t"
  136595. "lsl r5, r12, #16\n\t"
  136596. "lsr r8, r8, #16\n\t"
  136597. "lsr r5, r5, #16\n\t"
  136598. "mul r5, r8, r5\n\t"
  136599. "lsr r9, r12, #16\n\t"
  136600. "mul r8, r9, r8\n\t"
  136601. "lsr r6, r8, #16\n\t"
  136602. "lsl r8, r8, #16\n\t"
  136603. "adds r5, r5, r8\n\t"
  136604. "adc r6, r6, #0\n\t"
  136605. "lsr r8, r10, #16\n\t"
  136606. "mul r9, r8, r9\n\t"
  136607. "add r6, r6, r9\n\t"
  136608. "lsl r9, r12, #16\n\t"
  136609. "lsr r9, r9, #16\n\t"
  136610. "mul r8, r9, r8\n\t"
  136611. "lsr r9, r8, #16\n\t"
  136612. "lsl r8, r8, #16\n\t"
  136613. "adds r5, r5, r8\n\t"
  136614. "adc r6, r6, r9\n\t"
  136615. #else
  136616. "umull r5, r6, r10, r12\n\t"
  136617. #endif
  136618. "mov r4, #0\n\t"
  136619. "mov r7, #0\n\t"
  136620. /* A[1] * A[14] */
  136621. "ldr r10, [%[a], #56]\n\t"
  136622. "ldr r12, [%[a], #4]\n\t"
  136623. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136624. "lsl r8, r10, #16\n\t"
  136625. "lsl r9, r12, #16\n\t"
  136626. "lsr r8, r8, #16\n\t"
  136627. "lsr r9, r9, #16\n\t"
  136628. "mul r9, r8, r9\n\t"
  136629. "adds r5, r5, r9\n\t"
  136630. "adcs r6, r6, #0\n\t"
  136631. "adc r7, r7, #0\n\t"
  136632. "lsr r9, r12, #16\n\t"
  136633. "mul r8, r9, r8\n\t"
  136634. "lsr r9, r8, #16\n\t"
  136635. "lsl r8, r8, #16\n\t"
  136636. "adds r5, r5, r8\n\t"
  136637. "adcs r6, r6, r9\n\t"
  136638. "adc r7, r7, #0\n\t"
  136639. "lsr r8, r10, #16\n\t"
  136640. "lsr r9, r12, #16\n\t"
  136641. "mul r9, r8, r9\n\t"
  136642. "adds r6, r6, r9\n\t"
  136643. "adc r7, r7, #0\n\t"
  136644. "lsl r9, r12, #16\n\t"
  136645. "lsr r9, r9, #16\n\t"
  136646. "mul r8, r9, r8\n\t"
  136647. "lsr r9, r8, #16\n\t"
  136648. "lsl r8, r8, #16\n\t"
  136649. "adds r5, r5, r8\n\t"
  136650. "adcs r6, r6, r9\n\t"
  136651. "adc r7, r7, #0\n\t"
  136652. #else
  136653. "umull r8, r9, r10, r12\n\t"
  136654. "adds r5, r5, r8\n\t"
  136655. "adcs r6, r6, r9\n\t"
  136656. "adc r7, r7, #0\n\t"
  136657. #endif
  136658. /* A[2] * A[13] */
  136659. "ldr r10, [%[a], #52]\n\t"
  136660. "ldr r12, [%[a], #8]\n\t"
  136661. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136662. "lsl r8, r10, #16\n\t"
  136663. "lsl r9, r12, #16\n\t"
  136664. "lsr r8, r8, #16\n\t"
  136665. "lsr r9, r9, #16\n\t"
  136666. "mul r9, r8, r9\n\t"
  136667. "adds r5, r5, r9\n\t"
  136668. "adcs r6, r6, #0\n\t"
  136669. "adc r7, r7, #0\n\t"
  136670. "lsr r9, r12, #16\n\t"
  136671. "mul r8, r9, r8\n\t"
  136672. "lsr r9, r8, #16\n\t"
  136673. "lsl r8, r8, #16\n\t"
  136674. "adds r5, r5, r8\n\t"
  136675. "adcs r6, r6, r9\n\t"
  136676. "adc r7, r7, #0\n\t"
  136677. "lsr r8, r10, #16\n\t"
  136678. "lsr r9, r12, #16\n\t"
  136679. "mul r9, r8, r9\n\t"
  136680. "adds r6, r6, r9\n\t"
  136681. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  136689. "adc r7, r7, #0\n\t"
  136690. #else
  136691. "umull r8, r9, r10, r12\n\t"
  136692. "adds r5, r5, r8\n\t"
  136693. "adcs r6, r6, r9\n\t"
  136694. "adc r7, r7, #0\n\t"
  136695. #endif
  136696. /* A[3] * A[12] */
  136697. "ldr r10, [%[a], #48]\n\t"
  136698. "ldr r12, [%[a], #12]\n\t"
  136699. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136700. "lsl r8, r10, #16\n\t"
  136701. "lsl r9, r12, #16\n\t"
  136702. "lsr r8, r8, #16\n\t"
  136703. "lsr r9, r9, #16\n\t"
  136704. "mul r9, r8, r9\n\t"
  136705. "adds r5, r5, r9\n\t"
  136706. "adcs r6, r6, #0\n\t"
  136707. "adc r7, r7, #0\n\t"
  136708. "lsr r9, r12, #16\n\t"
  136709. "mul r8, r9, r8\n\t"
  136710. "lsr r9, r8, #16\n\t"
  136711. "lsl r8, r8, #16\n\t"
  136712. "adds r5, r5, r8\n\t"
  136713. "adcs r6, r6, r9\n\t"
  136714. "adc r7, r7, #0\n\t"
  136715. "lsr r8, r10, #16\n\t"
  136716. "lsr r9, r12, #16\n\t"
  136717. "mul r9, r8, r9\n\t"
  136718. "adds r6, r6, r9\n\t"
  136719. "adc r7, r7, #0\n\t"
  136720. "lsl r9, r12, #16\n\t"
  136721. "lsr r9, r9, #16\n\t"
  136722. "mul r8, r9, r8\n\t"
  136723. "lsr r9, r8, #16\n\t"
  136724. "lsl r8, r8, #16\n\t"
  136725. "adds r5, r5, r8\n\t"
  136726. "adcs r6, r6, r9\n\t"
  136727. "adc r7, r7, #0\n\t"
  136728. #else
  136729. "umull r8, r9, r10, r12\n\t"
  136730. "adds r5, r5, r8\n\t"
  136731. "adcs r6, r6, r9\n\t"
  136732. "adc r7, r7, #0\n\t"
  136733. #endif
  136734. /* A[4] * A[11] */
  136735. "ldr r10, [%[a], #44]\n\t"
  136736. "ldr r12, [%[a], #16]\n\t"
  136737. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136738. "lsl r8, r10, #16\n\t"
  136739. "lsl r9, r12, #16\n\t"
  136740. "lsr r8, r8, #16\n\t"
  136741. "lsr r9, r9, #16\n\t"
  136742. "mul r9, r8, r9\n\t"
  136743. "adds r5, r5, r9\n\t"
  136744. "adcs r6, r6, #0\n\t"
  136745. "adc r7, r7, #0\n\t"
  136746. "lsr r9, r12, #16\n\t"
  136747. "mul r8, r9, r8\n\t"
  136748. "lsr r9, r8, #16\n\t"
  136749. "lsl r8, r8, #16\n\t"
  136750. "adds r5, r5, r8\n\t"
  136751. "adcs r6, r6, r9\n\t"
  136752. "adc r7, r7, #0\n\t"
  136753. "lsr r8, r10, #16\n\t"
  136754. "lsr r9, r12, #16\n\t"
  136755. "mul r9, r8, r9\n\t"
  136756. "adds r6, r6, r9\n\t"
  136757. "adc r7, r7, #0\n\t"
  136758. "lsl r9, r12, #16\n\t"
  136759. "lsr r9, r9, #16\n\t"
  136760. "mul r8, r9, r8\n\t"
  136761. "lsr r9, r8, #16\n\t"
  136762. "lsl r8, r8, #16\n\t"
  136763. "adds r5, r5, r8\n\t"
  136764. "adcs r6, r6, r9\n\t"
  136765. "adc r7, r7, #0\n\t"
  136766. #else
  136767. "umull r8, r9, r10, r12\n\t"
  136768. "adds r5, r5, r8\n\t"
  136769. "adcs r6, r6, r9\n\t"
  136770. "adc r7, r7, #0\n\t"
  136771. #endif
  136772. /* A[5] * A[10] */
  136773. "ldr r10, [%[a], #40]\n\t"
  136774. "ldr r12, [%[a], #20]\n\t"
  136775. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136776. "lsl r8, r10, #16\n\t"
  136777. "lsl r9, r12, #16\n\t"
  136778. "lsr r8, r8, #16\n\t"
  136779. "lsr r9, r9, #16\n\t"
  136780. "mul r9, r8, r9\n\t"
  136781. "adds r5, r5, r9\n\t"
  136782. "adcs r6, r6, #0\n\t"
  136783. "adc r7, r7, #0\n\t"
  136784. "lsr r9, r12, #16\n\t"
  136785. "mul r8, r9, r8\n\t"
  136786. "lsr r9, r8, #16\n\t"
  136787. "lsl r8, r8, #16\n\t"
  136788. "adds r5, r5, r8\n\t"
  136789. "adcs r6, r6, r9\n\t"
  136790. "adc r7, r7, #0\n\t"
  136791. "lsr r8, r10, #16\n\t"
  136792. "lsr r9, r12, #16\n\t"
  136793. "mul r9, r8, r9\n\t"
  136794. "adds r6, r6, r9\n\t"
  136795. "adc r7, r7, #0\n\t"
  136796. "lsl r9, r12, #16\n\t"
  136797. "lsr r9, r9, #16\n\t"
  136798. "mul r8, r9, r8\n\t"
  136799. "lsr r9, r8, #16\n\t"
  136800. "lsl r8, r8, #16\n\t"
  136801. "adds r5, r5, r8\n\t"
  136802. "adcs r6, r6, r9\n\t"
  136803. "adc r7, r7, #0\n\t"
  136804. #else
  136805. "umull r8, r9, r10, r12\n\t"
  136806. "adds r5, r5, r8\n\t"
  136807. "adcs r6, r6, r9\n\t"
  136808. "adc r7, r7, #0\n\t"
  136809. #endif
  136810. /* A[6] * A[9] */
  136811. "ldr r10, [%[a], #36]\n\t"
  136812. "ldr r12, [%[a], #24]\n\t"
  136813. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136814. "lsl r8, r10, #16\n\t"
  136815. "lsl r9, r12, #16\n\t"
  136816. "lsr r8, r8, #16\n\t"
  136817. "lsr r9, r9, #16\n\t"
  136818. "mul r9, r8, r9\n\t"
  136819. "adds r5, r5, r9\n\t"
  136820. "adcs r6, r6, #0\n\t"
  136821. "adc r7, r7, #0\n\t"
  136822. "lsr r9, r12, #16\n\t"
  136823. "mul r8, r9, r8\n\t"
  136824. "lsr r9, r8, #16\n\t"
  136825. "lsl r8, r8, #16\n\t"
  136826. "adds r5, r5, r8\n\t"
  136827. "adcs r6, r6, r9\n\t"
  136828. "adc r7, r7, #0\n\t"
  136829. "lsr r8, r10, #16\n\t"
  136830. "lsr r9, r12, #16\n\t"
  136831. "mul r9, r8, r9\n\t"
  136832. "adds r6, r6, r9\n\t"
  136833. "adc r7, r7, #0\n\t"
  136834. "lsl r9, r12, #16\n\t"
  136835. "lsr r9, r9, #16\n\t"
  136836. "mul r8, r9, r8\n\t"
  136837. "lsr r9, r8, #16\n\t"
  136838. "lsl r8, r8, #16\n\t"
  136839. "adds r5, r5, r8\n\t"
  136840. "adcs r6, r6, r9\n\t"
  136841. "adc r7, r7, #0\n\t"
  136842. #else
  136843. "umull r8, r9, r10, r12\n\t"
  136844. "adds r5, r5, r8\n\t"
  136845. "adcs r6, r6, r9\n\t"
  136846. "adc r7, r7, #0\n\t"
  136847. #endif
  136848. /* A[7] * A[8] */
  136849. "ldr r10, [%[a], #32]\n\t"
  136850. "ldr r12, [%[a], #28]\n\t"
  136851. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136852. "lsl r8, r10, #16\n\t"
  136853. "lsl r9, r12, #16\n\t"
  136854. "lsr r8, r8, #16\n\t"
  136855. "lsr r9, r9, #16\n\t"
  136856. "mul r9, r8, r9\n\t"
  136857. "adds r5, r5, r9\n\t"
  136858. "adcs r6, r6, #0\n\t"
  136859. "adc r7, r7, #0\n\t"
  136860. "lsr r9, r12, #16\n\t"
  136861. "mul r8, r9, r8\n\t"
  136862. "lsr r9, r8, #16\n\t"
  136863. "lsl r8, r8, #16\n\t"
  136864. "adds r5, r5, r8\n\t"
  136865. "adcs r6, r6, r9\n\t"
  136866. "adc r7, r7, #0\n\t"
  136867. "lsr r8, r10, #16\n\t"
  136868. "lsr r9, r12, #16\n\t"
  136869. "mul r9, r8, r9\n\t"
  136870. "adds r6, r6, r9\n\t"
  136871. "adc r7, r7, #0\n\t"
  136872. "lsl r9, r12, #16\n\t"
  136873. "lsr r9, r9, #16\n\t"
  136874. "mul r8, r9, r8\n\t"
  136875. "lsr r9, r8, #16\n\t"
  136876. "lsl r8, r8, #16\n\t"
  136877. "adds r5, r5, r8\n\t"
  136878. "adcs r6, r6, r9\n\t"
  136879. "adc r7, r7, #0\n\t"
  136880. #else
  136881. "umull r8, r9, r10, r12\n\t"
  136882. "adds r5, r5, r8\n\t"
  136883. "adcs r6, r6, r9\n\t"
  136884. "adc r7, r7, #0\n\t"
  136885. #endif
  136886. "adds r5, r5, r5\n\t"
  136887. "adcs r6, r6, r6\n\t"
  136888. "adc r7, r7, r7\n\t"
  136889. "adds r2, r2, r5\n\t"
  136890. "adcs r3, r3, r6\n\t"
  136891. "adc r4, r4, r7\n\t"
  136892. "str r2, [sp, #60]\n\t"
  136893. /* A[1] * A[15] */
  136894. "ldr r10, [%[a], #60]\n\t"
  136895. "ldr r12, [%[a], #4]\n\t"
  136896. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136897. "lsl r8, r10, #16\n\t"
  136898. "lsl r5, r12, #16\n\t"
  136899. "lsr r8, r8, #16\n\t"
  136900. "lsr r5, r5, #16\n\t"
  136901. "mul r5, r8, r5\n\t"
  136902. "lsr r9, r12, #16\n\t"
  136903. "mul r8, r9, r8\n\t"
  136904. "lsr r6, r8, #16\n\t"
  136905. "lsl r8, r8, #16\n\t"
  136906. "adds r5, r5, r8\n\t"
  136907. "adc r6, r6, #0\n\t"
  136908. "lsr r8, r10, #16\n\t"
  136909. "mul r9, r8, r9\n\t"
  136910. "add r6, r6, r9\n\t"
  136911. "lsl r9, r12, #16\n\t"
  136912. "lsr r9, r9, #16\n\t"
  136913. "mul r8, r9, r8\n\t"
  136914. "lsr r9, r8, #16\n\t"
  136915. "lsl r8, r8, #16\n\t"
  136916. "adds r5, r5, r8\n\t"
  136917. "adc r6, r6, r9\n\t"
  136918. #else
  136919. "umull r5, r6, r10, r12\n\t"
  136920. #endif
  136921. "mov r2, #0\n\t"
  136922. "mov r7, #0\n\t"
  136923. /* A[2] * A[14] */
  136924. "ldr r10, [%[a], #56]\n\t"
  136925. "ldr r12, [%[a], #8]\n\t"
  136926. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136927. "lsl r8, r10, #16\n\t"
  136928. "lsl r9, r12, #16\n\t"
  136929. "lsr r8, r8, #16\n\t"
  136930. "lsr r9, r9, #16\n\t"
  136931. "mul r9, r8, r9\n\t"
  136932. "adds r5, r5, r9\n\t"
  136933. "adcs r6, r6, #0\n\t"
  136934. "adc r7, r7, #0\n\t"
  136935. "lsr r9, r12, #16\n\t"
  136936. "mul r8, r9, r8\n\t"
  136937. "lsr r9, r8, #16\n\t"
  136938. "lsl r8, r8, #16\n\t"
  136939. "adds r5, r5, r8\n\t"
  136940. "adcs r6, r6, r9\n\t"
  136941. "adc r7, r7, #0\n\t"
  136942. "lsr r8, r10, #16\n\t"
  136943. "lsr r9, r12, #16\n\t"
  136944. "mul r9, r8, r9\n\t"
  136945. "adds r6, r6, r9\n\t"
  136946. "adc r7, r7, #0\n\t"
  136947. "lsl r9, r12, #16\n\t"
  136948. "lsr r9, r9, #16\n\t"
  136949. "mul r8, r9, r8\n\t"
  136950. "lsr r9, r8, #16\n\t"
  136951. "lsl r8, r8, #16\n\t"
  136952. "adds r5, r5, r8\n\t"
  136953. "adcs r6, r6, r9\n\t"
  136954. "adc r7, r7, #0\n\t"
  136955. #else
  136956. "umull r8, r9, r10, r12\n\t"
  136957. "adds r5, r5, r8\n\t"
  136958. "adcs r6, r6, r9\n\t"
  136959. "adc r7, r7, #0\n\t"
  136960. #endif
  136961. /* A[3] * A[13] */
  136962. "ldr r10, [%[a], #52]\n\t"
  136963. "ldr r12, [%[a], #12]\n\t"
  136964. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  136965. "lsl r8, r10, #16\n\t"
  136966. "lsl r9, r12, #16\n\t"
  136967. "lsr r8, r8, #16\n\t"
  136968. "lsr r9, r9, #16\n\t"
  136969. "mul r9, r8, r9\n\t"
  136970. "adds r5, r5, r9\n\t"
  136971. "adcs r6, r6, #0\n\t"
  136972. "adc r7, r7, #0\n\t"
  136973. "lsr r9, r12, #16\n\t"
  136974. "mul r8, r9, r8\n\t"
  136975. "lsr r9, r8, #16\n\t"
  136976. "lsl r8, r8, #16\n\t"
  136977. "adds r5, r5, r8\n\t"
  136978. "adcs r6, r6, r9\n\t"
  136979. "adc r7, r7, #0\n\t"
  136980. "lsr r8, r10, #16\n\t"
  136981. "lsr r9, r12, #16\n\t"
  136982. "mul r9, r8, r9\n\t"
  136983. "adds r6, r6, r9\n\t"
  136984. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  136992. "adc r7, r7, #0\n\t"
  136993. #else
  136994. "umull r8, r9, r10, r12\n\t"
  136995. "adds r5, r5, r8\n\t"
  136996. "adcs r6, r6, r9\n\t"
  136997. "adc r7, r7, #0\n\t"
  136998. #endif
  136999. /* A[4] * A[12] */
  137000. "ldr r10, [%[a], #48]\n\t"
  137001. "ldr r12, [%[a], #16]\n\t"
  137002. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137003. "lsl r8, r10, #16\n\t"
  137004. "lsl r9, r12, #16\n\t"
  137005. "lsr r8, r8, #16\n\t"
  137006. "lsr r9, r9, #16\n\t"
  137007. "mul r9, r8, r9\n\t"
  137008. "adds r5, r5, r9\n\t"
  137009. "adcs r6, r6, #0\n\t"
  137010. "adc r7, r7, #0\n\t"
  137011. "lsr r9, r12, #16\n\t"
  137012. "mul r8, r9, r8\n\t"
  137013. "lsr r9, r8, #16\n\t"
  137014. "lsl r8, r8, #16\n\t"
  137015. "adds r5, r5, r8\n\t"
  137016. "adcs r6, r6, r9\n\t"
  137017. "adc r7, r7, #0\n\t"
  137018. "lsr r8, r10, #16\n\t"
  137019. "lsr r9, r12, #16\n\t"
  137020. "mul r9, r8, r9\n\t"
  137021. "adds r6, r6, r9\n\t"
  137022. "adc r7, r7, #0\n\t"
  137023. "lsl r9, r12, #16\n\t"
  137024. "lsr r9, r9, #16\n\t"
  137025. "mul r8, r9, r8\n\t"
  137026. "lsr r9, r8, #16\n\t"
  137027. "lsl r8, r8, #16\n\t"
  137028. "adds r5, r5, r8\n\t"
  137029. "adcs r6, r6, r9\n\t"
  137030. "adc r7, r7, #0\n\t"
  137031. #else
  137032. "umull r8, r9, r10, r12\n\t"
  137033. "adds r5, r5, r8\n\t"
  137034. "adcs r6, r6, r9\n\t"
  137035. "adc r7, r7, #0\n\t"
  137036. #endif
  137037. /* A[5] * A[11] */
  137038. "ldr r10, [%[a], #44]\n\t"
  137039. "ldr r12, [%[a], #20]\n\t"
  137040. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137041. "lsl r8, r10, #16\n\t"
  137042. "lsl r9, r12, #16\n\t"
  137043. "lsr r8, r8, #16\n\t"
  137044. "lsr r9, r9, #16\n\t"
  137045. "mul r9, r8, r9\n\t"
  137046. "adds r5, r5, r9\n\t"
  137047. "adcs r6, r6, #0\n\t"
  137048. "adc r7, r7, #0\n\t"
  137049. "lsr r9, r12, #16\n\t"
  137050. "mul r8, r9, r8\n\t"
  137051. "lsr r9, r8, #16\n\t"
  137052. "lsl r8, r8, #16\n\t"
  137053. "adds r5, r5, r8\n\t"
  137054. "adcs r6, r6, r9\n\t"
  137055. "adc r7, r7, #0\n\t"
  137056. "lsr r8, r10, #16\n\t"
  137057. "lsr r9, r12, #16\n\t"
  137058. "mul r9, r8, r9\n\t"
  137059. "adds r6, r6, r9\n\t"
  137060. "adc r7, r7, #0\n\t"
  137061. "lsl r9, r12, #16\n\t"
  137062. "lsr r9, r9, #16\n\t"
  137063. "mul r8, r9, r8\n\t"
  137064. "lsr r9, r8, #16\n\t"
  137065. "lsl r8, r8, #16\n\t"
  137066. "adds r5, r5, r8\n\t"
  137067. "adcs r6, r6, r9\n\t"
  137068. "adc r7, r7, #0\n\t"
  137069. #else
  137070. "umull r8, r9, r10, r12\n\t"
  137071. "adds r5, r5, r8\n\t"
  137072. "adcs r6, r6, r9\n\t"
  137073. "adc r7, r7, #0\n\t"
  137074. #endif
  137075. /* A[6] * A[10] */
  137076. "ldr r10, [%[a], #40]\n\t"
  137077. "ldr r12, [%[a], #24]\n\t"
  137078. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137079. "lsl r8, r10, #16\n\t"
  137080. "lsl r9, r12, #16\n\t"
  137081. "lsr r8, r8, #16\n\t"
  137082. "lsr r9, r9, #16\n\t"
  137083. "mul r9, r8, r9\n\t"
  137084. "adds r5, r5, r9\n\t"
  137085. "adcs r6, r6, #0\n\t"
  137086. "adc r7, r7, #0\n\t"
  137087. "lsr r9, r12, #16\n\t"
  137088. "mul r8, r9, r8\n\t"
  137089. "lsr r9, r8, #16\n\t"
  137090. "lsl r8, r8, #16\n\t"
  137091. "adds r5, r5, r8\n\t"
  137092. "adcs r6, r6, r9\n\t"
  137093. "adc r7, r7, #0\n\t"
  137094. "lsr r8, r10, #16\n\t"
  137095. "lsr r9, r12, #16\n\t"
  137096. "mul r9, r8, r9\n\t"
  137097. "adds r6, r6, r9\n\t"
  137098. "adc r7, r7, #0\n\t"
  137099. "lsl r9, r12, #16\n\t"
  137100. "lsr r9, r9, #16\n\t"
  137101. "mul r8, r9, r8\n\t"
  137102. "lsr r9, r8, #16\n\t"
  137103. "lsl r8, r8, #16\n\t"
  137104. "adds r5, r5, r8\n\t"
  137105. "adcs r6, r6, r9\n\t"
  137106. "adc r7, r7, #0\n\t"
  137107. #else
  137108. "umull r8, r9, r10, r12\n\t"
  137109. "adds r5, r5, r8\n\t"
  137110. "adcs r6, r6, r9\n\t"
  137111. "adc r7, r7, #0\n\t"
  137112. #endif
  137113. /* A[7] * A[9] */
  137114. "ldr r10, [%[a], #36]\n\t"
  137115. "ldr r12, [%[a], #28]\n\t"
  137116. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137117. "lsl r8, r10, #16\n\t"
  137118. "lsl r9, r12, #16\n\t"
  137119. "lsr r8, r8, #16\n\t"
  137120. "lsr r9, r9, #16\n\t"
  137121. "mul r9, r8, r9\n\t"
  137122. "adds r5, r5, r9\n\t"
  137123. "adcs r6, r6, #0\n\t"
  137124. "adc r7, r7, #0\n\t"
  137125. "lsr r9, r12, #16\n\t"
  137126. "mul r8, r9, r8\n\t"
  137127. "lsr r9, r8, #16\n\t"
  137128. "lsl r8, r8, #16\n\t"
  137129. "adds r5, r5, r8\n\t"
  137130. "adcs r6, r6, r9\n\t"
  137131. "adc r7, r7, #0\n\t"
  137132. "lsr r8, r10, #16\n\t"
  137133. "lsr r9, r12, #16\n\t"
  137134. "mul r9, r8, r9\n\t"
  137135. "adds r6, r6, r9\n\t"
  137136. "adc r7, r7, #0\n\t"
  137137. "lsl r9, r12, #16\n\t"
  137138. "lsr r9, r9, #16\n\t"
  137139. "mul r8, r9, r8\n\t"
  137140. "lsr r9, r8, #16\n\t"
  137141. "lsl r8, r8, #16\n\t"
  137142. "adds r5, r5, r8\n\t"
  137143. "adcs r6, r6, r9\n\t"
  137144. "adc r7, r7, #0\n\t"
  137145. #else
  137146. "umull r8, r9, r10, r12\n\t"
  137147. "adds r5, r5, r8\n\t"
  137148. "adcs r6, r6, r9\n\t"
  137149. "adc r7, r7, #0\n\t"
  137150. #endif
  137151. /* A[8] * A[8] */
  137152. "ldr r10, [%[a], #32]\n\t"
  137153. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137154. "lsl r8, r10, #16\n\t"
  137155. "lsr r9, r10, #16\n\t"
  137156. "lsr r8, r8, #16\n\t"
  137157. "mov r12, r8\n\t"
  137158. "mul r8, r12, r8\n\t"
  137159. "mov r12, r9\n\t"
  137160. "mul r9, r12, r9\n\t"
  137161. "adds r3, r3, r8\n\t"
  137162. "adcs r4, r4, r9\n\t"
  137163. "adc r2, r2, #0\n\t"
  137164. "lsr r9, r10, #16\n\t"
  137165. "lsl r8, r10, #16\n\t"
  137166. "lsr r8, r8, #16\n\t"
  137167. "mul r8, r9, r8\n\t"
  137168. "lsr r9, r8, #15\n\t"
  137169. "lsl r8, r8, #17\n\t"
  137170. "adds r3, r3, r8\n\t"
  137171. "adcs r4, r4, r9\n\t"
  137172. "adc r2, r2, #0\n\t"
  137173. "adds r5, r5, r5\n\t"
  137174. "adcs r6, r6, r6\n\t"
  137175. "adc r7, r7, r7\n\t"
  137176. #else
  137177. "umull r8, r9, r10, r10\n\t"
  137178. "adds r5, r5, r5\n\t"
  137179. "adcs r6, r6, r6\n\t"
  137180. "adc r7, r7, r7\n\t"
  137181. "adds r3, r3, r8\n\t"
  137182. "adcs r4, r4, r9\n\t"
  137183. "adc r2, r2, #0\n\t"
  137184. #endif
  137185. "adds r3, r3, r5\n\t"
  137186. "adcs r4, r4, r6\n\t"
  137187. "adc r2, r2, r7\n\t"
  137188. "str r3, [%[r], #64]\n\t"
  137189. /* A[2] * A[15] */
  137190. "ldr r10, [%[a], #60]\n\t"
  137191. "ldr r12, [%[a], #8]\n\t"
  137192. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137193. "lsl r8, r10, #16\n\t"
  137194. "lsl r5, r12, #16\n\t"
  137195. "lsr r8, r8, #16\n\t"
  137196. "lsr r5, r5, #16\n\t"
  137197. "mul r5, r8, r5\n\t"
  137198. "lsr r9, r12, #16\n\t"
  137199. "mul r8, r9, r8\n\t"
  137200. "lsr r6, r8, #16\n\t"
  137201. "lsl r8, r8, #16\n\t"
  137202. "adds r5, r5, r8\n\t"
  137203. "adc r6, r6, #0\n\t"
  137204. "lsr r8, r10, #16\n\t"
  137205. "mul r9, r8, r9\n\t"
  137206. "add r6, r6, r9\n\t"
  137207. "lsl r9, r12, #16\n\t"
  137208. "lsr r9, r9, #16\n\t"
  137209. "mul r8, r9, r8\n\t"
  137210. "lsr r9, r8, #16\n\t"
  137211. "lsl r8, r8, #16\n\t"
  137212. "adds r5, r5, r8\n\t"
  137213. "adc r6, r6, r9\n\t"
  137214. #else
  137215. "umull r5, r6, r10, r12\n\t"
  137216. #endif
  137217. "mov r3, #0\n\t"
  137218. "mov r7, #0\n\t"
  137219. /* A[3] * A[14] */
  137220. "ldr r10, [%[a], #56]\n\t"
  137221. "ldr r12, [%[a], #12]\n\t"
  137222. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137223. "lsl r8, r10, #16\n\t"
  137224. "lsl r9, r12, #16\n\t"
  137225. "lsr r8, r8, #16\n\t"
  137226. "lsr r9, r9, #16\n\t"
  137227. "mul r9, r8, r9\n\t"
  137228. "adds r5, r5, r9\n\t"
  137229. "adcs r6, r6, #0\n\t"
  137230. "adc r7, r7, #0\n\t"
  137231. "lsr r9, r12, #16\n\t"
  137232. "mul r8, r9, r8\n\t"
  137233. "lsr r9, r8, #16\n\t"
  137234. "lsl r8, r8, #16\n\t"
  137235. "adds r5, r5, r8\n\t"
  137236. "adcs r6, r6, r9\n\t"
  137237. "adc r7, r7, #0\n\t"
  137238. "lsr r8, r10, #16\n\t"
  137239. "lsr r9, r12, #16\n\t"
  137240. "mul r9, r8, r9\n\t"
  137241. "adds r6, r6, r9\n\t"
  137242. "adc r7, r7, #0\n\t"
  137243. "lsl r9, r12, #16\n\t"
  137244. "lsr r9, r9, #16\n\t"
  137245. "mul r8, r9, r8\n\t"
  137246. "lsr r9, r8, #16\n\t"
  137247. "lsl r8, r8, #16\n\t"
  137248. "adds r5, r5, r8\n\t"
  137249. "adcs r6, r6, r9\n\t"
  137250. "adc r7, r7, #0\n\t"
  137251. #else
  137252. "umull r8, r9, r10, r12\n\t"
  137253. "adds r5, r5, r8\n\t"
  137254. "adcs r6, r6, r9\n\t"
  137255. "adc r7, r7, #0\n\t"
  137256. #endif
  137257. /* A[4] * A[13] */
  137258. "ldr r10, [%[a], #52]\n\t"
  137259. "ldr r12, [%[a], #16]\n\t"
  137260. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137261. "lsl r8, r10, #16\n\t"
  137262. "lsl r9, r12, #16\n\t"
  137263. "lsr r8, r8, #16\n\t"
  137264. "lsr r9, r9, #16\n\t"
  137265. "mul r9, r8, r9\n\t"
  137266. "adds r5, r5, r9\n\t"
  137267. "adcs r6, r6, #0\n\t"
  137268. "adc r7, r7, #0\n\t"
  137269. "lsr r9, r12, #16\n\t"
  137270. "mul r8, r9, r8\n\t"
  137271. "lsr r9, r8, #16\n\t"
  137272. "lsl r8, r8, #16\n\t"
  137273. "adds r5, r5, r8\n\t"
  137274. "adcs r6, r6, r9\n\t"
  137275. "adc r7, r7, #0\n\t"
  137276. "lsr r8, r10, #16\n\t"
  137277. "lsr r9, r12, #16\n\t"
  137278. "mul r9, r8, r9\n\t"
  137279. "adds r6, r6, r9\n\t"
  137280. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  137288. "adc r7, r7, #0\n\t"
  137289. #else
  137290. "umull r8, r9, r10, r12\n\t"
  137291. "adds r5, r5, r8\n\t"
  137292. "adcs r6, r6, r9\n\t"
  137293. "adc r7, r7, #0\n\t"
  137294. #endif
  137295. /* A[5] * A[12] */
  137296. "ldr r10, [%[a], #48]\n\t"
  137297. "ldr r12, [%[a], #20]\n\t"
  137298. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137299. "lsl r8, r10, #16\n\t"
  137300. "lsl r9, r12, #16\n\t"
  137301. "lsr r8, r8, #16\n\t"
  137302. "lsr r9, r9, #16\n\t"
  137303. "mul r9, r8, r9\n\t"
  137304. "adds r5, r5, r9\n\t"
  137305. "adcs r6, r6, #0\n\t"
  137306. "adc r7, r7, #0\n\t"
  137307. "lsr r9, r12, #16\n\t"
  137308. "mul r8, r9, r8\n\t"
  137309. "lsr r9, r8, #16\n\t"
  137310. "lsl r8, r8, #16\n\t"
  137311. "adds r5, r5, r8\n\t"
  137312. "adcs r6, r6, r9\n\t"
  137313. "adc r7, r7, #0\n\t"
  137314. "lsr r8, r10, #16\n\t"
  137315. "lsr r9, r12, #16\n\t"
  137316. "mul r9, r8, r9\n\t"
  137317. "adds r6, r6, r9\n\t"
  137318. "adc r7, r7, #0\n\t"
  137319. "lsl r9, r12, #16\n\t"
  137320. "lsr r9, r9, #16\n\t"
  137321. "mul r8, r9, r8\n\t"
  137322. "lsr r9, r8, #16\n\t"
  137323. "lsl r8, r8, #16\n\t"
  137324. "adds r5, r5, r8\n\t"
  137325. "adcs r6, r6, r9\n\t"
  137326. "adc r7, r7, #0\n\t"
  137327. #else
  137328. "umull r8, r9, r10, r12\n\t"
  137329. "adds r5, r5, r8\n\t"
  137330. "adcs r6, r6, r9\n\t"
  137331. "adc r7, r7, #0\n\t"
  137332. #endif
  137333. /* A[6] * A[11] */
  137334. "ldr r10, [%[a], #44]\n\t"
  137335. "ldr r12, [%[a], #24]\n\t"
  137336. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137337. "lsl r8, r10, #16\n\t"
  137338. "lsl r9, r12, #16\n\t"
  137339. "lsr r8, r8, #16\n\t"
  137340. "lsr r9, r9, #16\n\t"
  137341. "mul r9, r8, r9\n\t"
  137342. "adds r5, r5, r9\n\t"
  137343. "adcs r6, r6, #0\n\t"
  137344. "adc r7, r7, #0\n\t"
  137345. "lsr r9, r12, #16\n\t"
  137346. "mul r8, r9, r8\n\t"
  137347. "lsr r9, r8, #16\n\t"
  137348. "lsl r8, r8, #16\n\t"
  137349. "adds r5, r5, r8\n\t"
  137350. "adcs r6, r6, r9\n\t"
  137351. "adc r7, r7, #0\n\t"
  137352. "lsr r8, r10, #16\n\t"
  137353. "lsr r9, r12, #16\n\t"
  137354. "mul r9, r8, r9\n\t"
  137355. "adds r6, r6, r9\n\t"
  137356. "adc r7, r7, #0\n\t"
  137357. "lsl r9, r12, #16\n\t"
  137358. "lsr r9, r9, #16\n\t"
  137359. "mul r8, r9, r8\n\t"
  137360. "lsr r9, r8, #16\n\t"
  137361. "lsl r8, r8, #16\n\t"
  137362. "adds r5, r5, r8\n\t"
  137363. "adcs r6, r6, r9\n\t"
  137364. "adc r7, r7, #0\n\t"
  137365. #else
  137366. "umull r8, r9, r10, r12\n\t"
  137367. "adds r5, r5, r8\n\t"
  137368. "adcs r6, r6, r9\n\t"
  137369. "adc r7, r7, #0\n\t"
  137370. #endif
  137371. /* A[7] * A[10] */
  137372. "ldr r10, [%[a], #40]\n\t"
  137373. "ldr r12, [%[a], #28]\n\t"
  137374. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137375. "lsl r8, r10, #16\n\t"
  137376. "lsl r9, r12, #16\n\t"
  137377. "lsr r8, r8, #16\n\t"
  137378. "lsr r9, r9, #16\n\t"
  137379. "mul r9, r8, r9\n\t"
  137380. "adds r5, r5, r9\n\t"
  137381. "adcs r6, r6, #0\n\t"
  137382. "adc r7, r7, #0\n\t"
  137383. "lsr r9, r12, #16\n\t"
  137384. "mul r8, r9, r8\n\t"
  137385. "lsr r9, r8, #16\n\t"
  137386. "lsl r8, r8, #16\n\t"
  137387. "adds r5, r5, r8\n\t"
  137388. "adcs r6, r6, r9\n\t"
  137389. "adc r7, r7, #0\n\t"
  137390. "lsr r8, r10, #16\n\t"
  137391. "lsr r9, r12, #16\n\t"
  137392. "mul r9, r8, r9\n\t"
  137393. "adds r6, r6, r9\n\t"
  137394. "adc r7, r7, #0\n\t"
  137395. "lsl r9, r12, #16\n\t"
  137396. "lsr r9, r9, #16\n\t"
  137397. "mul r8, r9, r8\n\t"
  137398. "lsr r9, r8, #16\n\t"
  137399. "lsl r8, r8, #16\n\t"
  137400. "adds r5, r5, r8\n\t"
  137401. "adcs r6, r6, r9\n\t"
  137402. "adc r7, r7, #0\n\t"
  137403. #else
  137404. "umull r8, r9, r10, r12\n\t"
  137405. "adds r5, r5, r8\n\t"
  137406. "adcs r6, r6, r9\n\t"
  137407. "adc r7, r7, #0\n\t"
  137408. #endif
  137409. /* A[8] * A[9] */
  137410. "ldr r10, [%[a], #36]\n\t"
  137411. "ldr r12, [%[a], #32]\n\t"
  137412. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137413. "lsl r8, r10, #16\n\t"
  137414. "lsl r9, r12, #16\n\t"
  137415. "lsr r8, r8, #16\n\t"
  137416. "lsr r9, r9, #16\n\t"
  137417. "mul r9, r8, r9\n\t"
  137418. "adds r5, r5, r9\n\t"
  137419. "adcs r6, r6, #0\n\t"
  137420. "adc r7, r7, #0\n\t"
  137421. "lsr r9, r12, #16\n\t"
  137422. "mul r8, r9, r8\n\t"
  137423. "lsr r9, r8, #16\n\t"
  137424. "lsl r8, r8, #16\n\t"
  137425. "adds r5, r5, r8\n\t"
  137426. "adcs r6, r6, r9\n\t"
  137427. "adc r7, r7, #0\n\t"
  137428. "lsr r8, r10, #16\n\t"
  137429. "lsr r9, r12, #16\n\t"
  137430. "mul r9, r8, r9\n\t"
  137431. "adds r6, r6, r9\n\t"
  137432. "adc r7, r7, #0\n\t"
  137433. "lsl r9, r12, #16\n\t"
  137434. "lsr r9, r9, #16\n\t"
  137435. "mul r8, r9, r8\n\t"
  137436. "lsr r9, r8, #16\n\t"
  137437. "lsl r8, r8, #16\n\t"
  137438. "adds r5, r5, r8\n\t"
  137439. "adcs r6, r6, r9\n\t"
  137440. "adc r7, r7, #0\n\t"
  137441. #else
  137442. "umull r8, r9, r10, r12\n\t"
  137443. "adds r5, r5, r8\n\t"
  137444. "adcs r6, r6, r9\n\t"
  137445. "adc r7, r7, #0\n\t"
  137446. #endif
  137447. "adds r5, r5, r5\n\t"
  137448. "adcs r6, r6, r6\n\t"
  137449. "adc r7, r7, r7\n\t"
  137450. "adds r4, r4, r5\n\t"
  137451. "adcs r2, r2, r6\n\t"
  137452. "adc r3, r3, r7\n\t"
  137453. "str r4, [%[r], #68]\n\t"
  137454. /* A[3] * A[15] */
  137455. "ldr r10, [%[a], #60]\n\t"
  137456. "ldr r12, [%[a], #12]\n\t"
  137457. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137458. "lsl r8, r10, #16\n\t"
  137459. "lsl r5, r12, #16\n\t"
  137460. "lsr r8, r8, #16\n\t"
  137461. "lsr r5, r5, #16\n\t"
  137462. "mul r5, r8, r5\n\t"
  137463. "lsr r9, r12, #16\n\t"
  137464. "mul r8, r9, r8\n\t"
  137465. "lsr r6, r8, #16\n\t"
  137466. "lsl r8, r8, #16\n\t"
  137467. "adds r5, r5, r8\n\t"
  137468. "adc r6, r6, #0\n\t"
  137469. "lsr r8, r10, #16\n\t"
  137470. "mul r9, r8, r9\n\t"
  137471. "add r6, r6, r9\n\t"
  137472. "lsl r9, r12, #16\n\t"
  137473. "lsr r9, r9, #16\n\t"
  137474. "mul r8, r9, r8\n\t"
  137475. "lsr r9, r8, #16\n\t"
  137476. "lsl r8, r8, #16\n\t"
  137477. "adds r5, r5, r8\n\t"
  137478. "adc r6, r6, r9\n\t"
  137479. #else
  137480. "umull r5, r6, r10, r12\n\t"
  137481. #endif
  137482. "mov r4, #0\n\t"
  137483. "mov r7, #0\n\t"
  137484. /* A[4] * A[14] */
  137485. "ldr r10, [%[a], #56]\n\t"
  137486. "ldr r12, [%[a], #16]\n\t"
  137487. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137488. "lsl r8, r10, #16\n\t"
  137489. "lsl r9, r12, #16\n\t"
  137490. "lsr r8, r8, #16\n\t"
  137491. "lsr r9, r9, #16\n\t"
  137492. "mul r9, r8, r9\n\t"
  137493. "adds r5, r5, r9\n\t"
  137494. "adcs r6, r6, #0\n\t"
  137495. "adc r7, r7, #0\n\t"
  137496. "lsr r9, r12, #16\n\t"
  137497. "mul r8, r9, r8\n\t"
  137498. "lsr r9, r8, #16\n\t"
  137499. "lsl r8, r8, #16\n\t"
  137500. "adds r5, r5, r8\n\t"
  137501. "adcs r6, r6, r9\n\t"
  137502. "adc r7, r7, #0\n\t"
  137503. "lsr r8, r10, #16\n\t"
  137504. "lsr r9, r12, #16\n\t"
  137505. "mul r9, r8, r9\n\t"
  137506. "adds r6, r6, r9\n\t"
  137507. "adc r7, r7, #0\n\t"
  137508. "lsl r9, r12, #16\n\t"
  137509. "lsr r9, r9, #16\n\t"
  137510. "mul r8, r9, r8\n\t"
  137511. "lsr r9, r8, #16\n\t"
  137512. "lsl r8, r8, #16\n\t"
  137513. "adds r5, r5, r8\n\t"
  137514. "adcs r6, r6, r9\n\t"
  137515. "adc r7, r7, #0\n\t"
  137516. #else
  137517. "umull r8, r9, r10, r12\n\t"
  137518. "adds r5, r5, r8\n\t"
  137519. "adcs r6, r6, r9\n\t"
  137520. "adc r7, r7, #0\n\t"
  137521. #endif
  137522. /* A[5] * A[13] */
  137523. "ldr r10, [%[a], #52]\n\t"
  137524. "ldr r12, [%[a], #20]\n\t"
  137525. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137526. "lsl r8, r10, #16\n\t"
  137527. "lsl r9, r12, #16\n\t"
  137528. "lsr r8, r8, #16\n\t"
  137529. "lsr r9, r9, #16\n\t"
  137530. "mul r9, r8, r9\n\t"
  137531. "adds r5, r5, r9\n\t"
  137532. "adcs r6, r6, #0\n\t"
  137533. "adc r7, r7, #0\n\t"
  137534. "lsr r9, r12, #16\n\t"
  137535. "mul r8, r9, r8\n\t"
  137536. "lsr r9, r8, #16\n\t"
  137537. "lsl r8, r8, #16\n\t"
  137538. "adds r5, r5, r8\n\t"
  137539. "adcs r6, r6, r9\n\t"
  137540. "adc r7, r7, #0\n\t"
  137541. "lsr r8, r10, #16\n\t"
  137542. "lsr r9, r12, #16\n\t"
  137543. "mul r9, r8, r9\n\t"
  137544. "adds r6, r6, r9\n\t"
  137545. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  137553. "adc r7, r7, #0\n\t"
  137554. #else
  137555. "umull r8, r9, r10, r12\n\t"
  137556. "adds r5, r5, r8\n\t"
  137557. "adcs r6, r6, r9\n\t"
  137558. "adc r7, r7, #0\n\t"
  137559. #endif
  137560. /* A[6] * A[12] */
  137561. "ldr r10, [%[a], #48]\n\t"
  137562. "ldr r12, [%[a], #24]\n\t"
  137563. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137564. "lsl r8, r10, #16\n\t"
  137565. "lsl r9, r12, #16\n\t"
  137566. "lsr r8, r8, #16\n\t"
  137567. "lsr r9, r9, #16\n\t"
  137568. "mul r9, r8, r9\n\t"
  137569. "adds r5, r5, r9\n\t"
  137570. "adcs r6, r6, #0\n\t"
  137571. "adc r7, r7, #0\n\t"
  137572. "lsr r9, r12, #16\n\t"
  137573. "mul r8, r9, r8\n\t"
  137574. "lsr r9, r8, #16\n\t"
  137575. "lsl r8, r8, #16\n\t"
  137576. "adds r5, r5, r8\n\t"
  137577. "adcs r6, r6, r9\n\t"
  137578. "adc r7, r7, #0\n\t"
  137579. "lsr r8, r10, #16\n\t"
  137580. "lsr r9, r12, #16\n\t"
  137581. "mul r9, r8, r9\n\t"
  137582. "adds r6, r6, r9\n\t"
  137583. "adc r7, r7, #0\n\t"
  137584. "lsl r9, r12, #16\n\t"
  137585. "lsr r9, r9, #16\n\t"
  137586. "mul r8, r9, r8\n\t"
  137587. "lsr r9, r8, #16\n\t"
  137588. "lsl r8, r8, #16\n\t"
  137589. "adds r5, r5, r8\n\t"
  137590. "adcs r6, r6, r9\n\t"
  137591. "adc r7, r7, #0\n\t"
  137592. #else
  137593. "umull r8, r9, r10, r12\n\t"
  137594. "adds r5, r5, r8\n\t"
  137595. "adcs r6, r6, r9\n\t"
  137596. "adc r7, r7, #0\n\t"
  137597. #endif
  137598. /* A[7] * A[11] */
  137599. "ldr r10, [%[a], #44]\n\t"
  137600. "ldr r12, [%[a], #28]\n\t"
  137601. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137602. "lsl r8, r10, #16\n\t"
  137603. "lsl r9, r12, #16\n\t"
  137604. "lsr r8, r8, #16\n\t"
  137605. "lsr r9, r9, #16\n\t"
  137606. "mul r9, r8, r9\n\t"
  137607. "adds r5, r5, r9\n\t"
  137608. "adcs r6, r6, #0\n\t"
  137609. "adc r7, r7, #0\n\t"
  137610. "lsr r9, r12, #16\n\t"
  137611. "mul r8, r9, r8\n\t"
  137612. "lsr r9, r8, #16\n\t"
  137613. "lsl r8, r8, #16\n\t"
  137614. "adds r5, r5, r8\n\t"
  137615. "adcs r6, r6, r9\n\t"
  137616. "adc r7, r7, #0\n\t"
  137617. "lsr r8, r10, #16\n\t"
  137618. "lsr r9, r12, #16\n\t"
  137619. "mul r9, r8, r9\n\t"
  137620. "adds r6, r6, r9\n\t"
  137621. "adc r7, r7, #0\n\t"
  137622. "lsl r9, r12, #16\n\t"
  137623. "lsr r9, r9, #16\n\t"
  137624. "mul r8, r9, r8\n\t"
  137625. "lsr r9, r8, #16\n\t"
  137626. "lsl r8, r8, #16\n\t"
  137627. "adds r5, r5, r8\n\t"
  137628. "adcs r6, r6, r9\n\t"
  137629. "adc r7, r7, #0\n\t"
  137630. #else
  137631. "umull r8, r9, r10, r12\n\t"
  137632. "adds r5, r5, r8\n\t"
  137633. "adcs r6, r6, r9\n\t"
  137634. "adc r7, r7, #0\n\t"
  137635. #endif
  137636. /* A[8] * A[10] */
  137637. "ldr r10, [%[a], #40]\n\t"
  137638. "ldr r12, [%[a], #32]\n\t"
  137639. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137640. "lsl r8, r10, #16\n\t"
  137641. "lsl r9, r12, #16\n\t"
  137642. "lsr r8, r8, #16\n\t"
  137643. "lsr r9, r9, #16\n\t"
  137644. "mul r9, r8, r9\n\t"
  137645. "adds r5, r5, r9\n\t"
  137646. "adcs r6, r6, #0\n\t"
  137647. "adc r7, r7, #0\n\t"
  137648. "lsr r9, r12, #16\n\t"
  137649. "mul r8, r9, r8\n\t"
  137650. "lsr r9, r8, #16\n\t"
  137651. "lsl r8, r8, #16\n\t"
  137652. "adds r5, r5, r8\n\t"
  137653. "adcs r6, r6, r9\n\t"
  137654. "adc r7, r7, #0\n\t"
  137655. "lsr r8, r10, #16\n\t"
  137656. "lsr r9, r12, #16\n\t"
  137657. "mul r9, r8, r9\n\t"
  137658. "adds r6, r6, r9\n\t"
  137659. "adc r7, r7, #0\n\t"
  137660. "lsl r9, r12, #16\n\t"
  137661. "lsr r9, r9, #16\n\t"
  137662. "mul r8, r9, r8\n\t"
  137663. "lsr r9, r8, #16\n\t"
  137664. "lsl r8, r8, #16\n\t"
  137665. "adds r5, r5, r8\n\t"
  137666. "adcs r6, r6, r9\n\t"
  137667. "adc r7, r7, #0\n\t"
  137668. #else
  137669. "umull r8, r9, r10, r12\n\t"
  137670. "adds r5, r5, r8\n\t"
  137671. "adcs r6, r6, r9\n\t"
  137672. "adc r7, r7, #0\n\t"
  137673. #endif
  137674. /* A[9] * A[9] */
  137675. "ldr r10, [%[a], #36]\n\t"
  137676. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137677. "lsl r8, r10, #16\n\t"
  137678. "lsr r9, r10, #16\n\t"
  137679. "lsr r8, r8, #16\n\t"
  137680. "mov r12, r8\n\t"
  137681. "mul r8, r12, r8\n\t"
  137682. "mov r12, r9\n\t"
  137683. "mul r9, r12, r9\n\t"
  137684. "adds r2, r2, r8\n\t"
  137685. "adcs r3, r3, r9\n\t"
  137686. "adc r4, r4, #0\n\t"
  137687. "lsr r9, r10, #16\n\t"
  137688. "lsl r8, r10, #16\n\t"
  137689. "lsr r8, r8, #16\n\t"
  137690. "mul r8, r9, r8\n\t"
  137691. "lsr r9, r8, #15\n\t"
  137692. "lsl r8, r8, #17\n\t"
  137693. "adds r2, r2, r8\n\t"
  137694. "adcs r3, r3, r9\n\t"
  137695. "adc r4, r4, #0\n\t"
  137696. "adds r5, r5, r5\n\t"
  137697. "adcs r6, r6, r6\n\t"
  137698. "adc r7, r7, r7\n\t"
  137699. #else
  137700. "umull r8, r9, r10, r10\n\t"
  137701. "adds r5, r5, r5\n\t"
  137702. "adcs r6, r6, r6\n\t"
  137703. "adc r7, r7, r7\n\t"
  137704. "adds r2, r2, r8\n\t"
  137705. "adcs r3, r3, r9\n\t"
  137706. "adc r4, r4, #0\n\t"
  137707. #endif
  137708. "adds r2, r2, r5\n\t"
  137709. "adcs r3, r3, r6\n\t"
  137710. "adc r4, r4, r7\n\t"
  137711. "str r2, [%[r], #72]\n\t"
  137712. /* A[4] * A[15] */
  137713. "ldr r10, [%[a], #60]\n\t"
  137714. "ldr r12, [%[a], #16]\n\t"
  137715. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137716. "lsl r8, r10, #16\n\t"
  137717. "lsl r5, r12, #16\n\t"
  137718. "lsr r8, r8, #16\n\t"
  137719. "lsr r5, r5, #16\n\t"
  137720. "mul r5, r8, r5\n\t"
  137721. "lsr r9, r12, #16\n\t"
  137722. "mul r8, r9, r8\n\t"
  137723. "lsr r6, r8, #16\n\t"
  137724. "lsl r8, r8, #16\n\t"
  137725. "adds r5, r5, r8\n\t"
  137726. "adc r6, r6, #0\n\t"
  137727. "lsr r8, r10, #16\n\t"
  137728. "mul r9, r8, r9\n\t"
  137729. "add r6, r6, r9\n\t"
  137730. "lsl r9, r12, #16\n\t"
  137731. "lsr r9, r9, #16\n\t"
  137732. "mul r8, r9, r8\n\t"
  137733. "lsr r9, r8, #16\n\t"
  137734. "lsl r8, r8, #16\n\t"
  137735. "adds r5, r5, r8\n\t"
  137736. "adc r6, r6, r9\n\t"
  137737. #else
  137738. "umull r5, r6, r10, r12\n\t"
  137739. #endif
  137740. "mov r2, #0\n\t"
  137741. "mov r7, #0\n\t"
  137742. /* A[5] * A[14] */
  137743. "ldr r10, [%[a], #56]\n\t"
  137744. "ldr r12, [%[a], #20]\n\t"
  137745. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137746. "lsl r8, r10, #16\n\t"
  137747. "lsl r9, r12, #16\n\t"
  137748. "lsr r8, r8, #16\n\t"
  137749. "lsr r9, r9, #16\n\t"
  137750. "mul r9, r8, r9\n\t"
  137751. "adds r5, r5, r9\n\t"
  137752. "adcs r6, r6, #0\n\t"
  137753. "adc r7, r7, #0\n\t"
  137754. "lsr r9, r12, #16\n\t"
  137755. "mul r8, r9, r8\n\t"
  137756. "lsr r9, r8, #16\n\t"
  137757. "lsl r8, r8, #16\n\t"
  137758. "adds r5, r5, r8\n\t"
  137759. "adcs r6, r6, r9\n\t"
  137760. "adc r7, r7, #0\n\t"
  137761. "lsr r8, r10, #16\n\t"
  137762. "lsr r9, r12, #16\n\t"
  137763. "mul r9, r8, r9\n\t"
  137764. "adds r6, r6, r9\n\t"
  137765. "adc r7, r7, #0\n\t"
  137766. "lsl r9, r12, #16\n\t"
  137767. "lsr r9, r9, #16\n\t"
  137768. "mul r8, r9, r8\n\t"
  137769. "lsr r9, r8, #16\n\t"
  137770. "lsl r8, r8, #16\n\t"
  137771. "adds r5, r5, r8\n\t"
  137772. "adcs r6, r6, r9\n\t"
  137773. "adc r7, r7, #0\n\t"
  137774. #else
  137775. "umull r8, r9, r10, r12\n\t"
  137776. "adds r5, r5, r8\n\t"
  137777. "adcs r6, r6, r9\n\t"
  137778. "adc r7, r7, #0\n\t"
  137779. #endif
  137780. /* A[6] * A[13] */
  137781. "ldr r10, [%[a], #52]\n\t"
  137782. "ldr r12, [%[a], #24]\n\t"
  137783. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137784. "lsl r8, r10, #16\n\t"
  137785. "lsl r9, r12, #16\n\t"
  137786. "lsr r8, r8, #16\n\t"
  137787. "lsr r9, r9, #16\n\t"
  137788. "mul r9, r8, r9\n\t"
  137789. "adds r5, r5, r9\n\t"
  137790. "adcs r6, r6, #0\n\t"
  137791. "adc r7, r7, #0\n\t"
  137792. "lsr r9, r12, #16\n\t"
  137793. "mul r8, r9, r8\n\t"
  137794. "lsr r9, r8, #16\n\t"
  137795. "lsl r8, r8, #16\n\t"
  137796. "adds r5, r5, r8\n\t"
  137797. "adcs r6, r6, r9\n\t"
  137798. "adc r7, r7, #0\n\t"
  137799. "lsr r8, r10, #16\n\t"
  137800. "lsr r9, r12, #16\n\t"
  137801. "mul r9, r8, r9\n\t"
  137802. "adds r6, r6, r9\n\t"
  137803. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  137811. "adc r7, r7, #0\n\t"
  137812. #else
  137813. "umull r8, r9, r10, r12\n\t"
  137814. "adds r5, r5, r8\n\t"
  137815. "adcs r6, r6, r9\n\t"
  137816. "adc r7, r7, #0\n\t"
  137817. #endif
  137818. /* A[7] * A[12] */
  137819. "ldr r10, [%[a], #48]\n\t"
  137820. "ldr r12, [%[a], #28]\n\t"
  137821. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137822. "lsl r8, r10, #16\n\t"
  137823. "lsl r9, r12, #16\n\t"
  137824. "lsr r8, r8, #16\n\t"
  137825. "lsr r9, r9, #16\n\t"
  137826. "mul r9, r8, r9\n\t"
  137827. "adds r5, r5, r9\n\t"
  137828. "adcs r6, r6, #0\n\t"
  137829. "adc r7, r7, #0\n\t"
  137830. "lsr r9, r12, #16\n\t"
  137831. "mul r8, r9, r8\n\t"
  137832. "lsr r9, r8, #16\n\t"
  137833. "lsl r8, r8, #16\n\t"
  137834. "adds r5, r5, r8\n\t"
  137835. "adcs r6, r6, r9\n\t"
  137836. "adc r7, r7, #0\n\t"
  137837. "lsr r8, r10, #16\n\t"
  137838. "lsr r9, r12, #16\n\t"
  137839. "mul r9, r8, r9\n\t"
  137840. "adds r6, r6, r9\n\t"
  137841. "adc r7, r7, #0\n\t"
  137842. "lsl r9, r12, #16\n\t"
  137843. "lsr r9, r9, #16\n\t"
  137844. "mul r8, r9, r8\n\t"
  137845. "lsr r9, r8, #16\n\t"
  137846. "lsl r8, r8, #16\n\t"
  137847. "adds r5, r5, r8\n\t"
  137848. "adcs r6, r6, r9\n\t"
  137849. "adc r7, r7, #0\n\t"
  137850. #else
  137851. "umull r8, r9, r10, r12\n\t"
  137852. "adds r5, r5, r8\n\t"
  137853. "adcs r6, r6, r9\n\t"
  137854. "adc r7, r7, #0\n\t"
  137855. #endif
  137856. /* A[8] * A[11] */
  137857. "ldr r10, [%[a], #44]\n\t"
  137858. "ldr r12, [%[a], #32]\n\t"
  137859. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137860. "lsl r8, r10, #16\n\t"
  137861. "lsl r9, r12, #16\n\t"
  137862. "lsr r8, r8, #16\n\t"
  137863. "lsr r9, r9, #16\n\t"
  137864. "mul r9, r8, r9\n\t"
  137865. "adds r5, r5, r9\n\t"
  137866. "adcs r6, r6, #0\n\t"
  137867. "adc r7, r7, #0\n\t"
  137868. "lsr r9, r12, #16\n\t"
  137869. "mul r8, r9, r8\n\t"
  137870. "lsr r9, r8, #16\n\t"
  137871. "lsl r8, r8, #16\n\t"
  137872. "adds r5, r5, r8\n\t"
  137873. "adcs r6, r6, r9\n\t"
  137874. "adc r7, r7, #0\n\t"
  137875. "lsr r8, r10, #16\n\t"
  137876. "lsr r9, r12, #16\n\t"
  137877. "mul r9, r8, r9\n\t"
  137878. "adds r6, r6, r9\n\t"
  137879. "adc r7, r7, #0\n\t"
  137880. "lsl r9, r12, #16\n\t"
  137881. "lsr r9, r9, #16\n\t"
  137882. "mul r8, r9, r8\n\t"
  137883. "lsr r9, r8, #16\n\t"
  137884. "lsl r8, r8, #16\n\t"
  137885. "adds r5, r5, r8\n\t"
  137886. "adcs r6, r6, r9\n\t"
  137887. "adc r7, r7, #0\n\t"
  137888. #else
  137889. "umull r8, r9, r10, r12\n\t"
  137890. "adds r5, r5, r8\n\t"
  137891. "adcs r6, r6, r9\n\t"
  137892. "adc r7, r7, #0\n\t"
  137893. #endif
  137894. /* A[9] * A[10] */
  137895. "ldr r10, [%[a], #40]\n\t"
  137896. "ldr r12, [%[a], #36]\n\t"
  137897. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137898. "lsl r8, r10, #16\n\t"
  137899. "lsl r9, r12, #16\n\t"
  137900. "lsr r8, r8, #16\n\t"
  137901. "lsr r9, r9, #16\n\t"
  137902. "mul r9, r8, r9\n\t"
  137903. "adds r5, r5, r9\n\t"
  137904. "adcs r6, r6, #0\n\t"
  137905. "adc r7, r7, #0\n\t"
  137906. "lsr r9, r12, #16\n\t"
  137907. "mul r8, r9, r8\n\t"
  137908. "lsr r9, r8, #16\n\t"
  137909. "lsl r8, r8, #16\n\t"
  137910. "adds r5, r5, r8\n\t"
  137911. "adcs r6, r6, r9\n\t"
  137912. "adc r7, r7, #0\n\t"
  137913. "lsr r8, r10, #16\n\t"
  137914. "lsr r9, r12, #16\n\t"
  137915. "mul r9, r8, r9\n\t"
  137916. "adds r6, r6, r9\n\t"
  137917. "adc r7, r7, #0\n\t"
  137918. "lsl r9, r12, #16\n\t"
  137919. "lsr r9, r9, #16\n\t"
  137920. "mul r8, r9, r8\n\t"
  137921. "lsr r9, r8, #16\n\t"
  137922. "lsl r8, r8, #16\n\t"
  137923. "adds r5, r5, r8\n\t"
  137924. "adcs r6, r6, r9\n\t"
  137925. "adc r7, r7, #0\n\t"
  137926. #else
  137927. "umull r8, r9, r10, r12\n\t"
  137928. "adds r5, r5, r8\n\t"
  137929. "adcs r6, r6, r9\n\t"
  137930. "adc r7, r7, #0\n\t"
  137931. #endif
  137932. "adds r5, r5, r5\n\t"
  137933. "adcs r6, r6, r6\n\t"
  137934. "adc r7, r7, r7\n\t"
  137935. "adds r3, r3, r5\n\t"
  137936. "adcs r4, r4, r6\n\t"
  137937. "adc r2, r2, r7\n\t"
  137938. "str r3, [%[r], #76]\n\t"
  137939. /* A[5] * A[15] */
  137940. "ldr r10, [%[a], #60]\n\t"
  137941. "ldr r12, [%[a], #20]\n\t"
  137942. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137943. "lsl r8, r10, #16\n\t"
  137944. "lsl r5, r12, #16\n\t"
  137945. "lsr r8, r8, #16\n\t"
  137946. "lsr r5, r5, #16\n\t"
  137947. "mul r5, r8, r5\n\t"
  137948. "lsr r9, r12, #16\n\t"
  137949. "mul r8, r9, r8\n\t"
  137950. "lsr r6, r8, #16\n\t"
  137951. "lsl r8, r8, #16\n\t"
  137952. "adds r5, r5, r8\n\t"
  137953. "adc r6, r6, #0\n\t"
  137954. "lsr r8, r10, #16\n\t"
  137955. "mul r9, r8, r9\n\t"
  137956. "add r6, r6, r9\n\t"
  137957. "lsl r9, r12, #16\n\t"
  137958. "lsr r9, r9, #16\n\t"
  137959. "mul r8, r9, r8\n\t"
  137960. "lsr r9, r8, #16\n\t"
  137961. "lsl r8, r8, #16\n\t"
  137962. "adds r5, r5, r8\n\t"
  137963. "adc r6, r6, r9\n\t"
  137964. #else
  137965. "umull r5, r6, r10, r12\n\t"
  137966. #endif
  137967. "mov r3, #0\n\t"
  137968. "mov r7, #0\n\t"
  137969. /* A[6] * A[14] */
  137970. "ldr r10, [%[a], #56]\n\t"
  137971. "ldr r12, [%[a], #24]\n\t"
  137972. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  137973. "lsl r8, r10, #16\n\t"
  137974. "lsl r9, r12, #16\n\t"
  137975. "lsr r8, r8, #16\n\t"
  137976. "lsr r9, r9, #16\n\t"
  137977. "mul r9, r8, r9\n\t"
  137978. "adds r5, r5, r9\n\t"
  137979. "adcs r6, r6, #0\n\t"
  137980. "adc r7, r7, #0\n\t"
  137981. "lsr r9, r12, #16\n\t"
  137982. "mul r8, r9, r8\n\t"
  137983. "lsr r9, r8, #16\n\t"
  137984. "lsl r8, r8, #16\n\t"
  137985. "adds r5, r5, r8\n\t"
  137986. "adcs r6, r6, r9\n\t"
  137987. "adc r7, r7, #0\n\t"
  137988. "lsr r8, r10, #16\n\t"
  137989. "lsr r9, r12, #16\n\t"
  137990. "mul r9, r8, r9\n\t"
  137991. "adds r6, r6, r9\n\t"
  137992. "adc r7, r7, #0\n\t"
  137993. "lsl r9, r12, #16\n\t"
  137994. "lsr r9, r9, #16\n\t"
  137995. "mul r8, r9, r8\n\t"
  137996. "lsr r9, r8, #16\n\t"
  137997. "lsl r8, r8, #16\n\t"
  137998. "adds r5, r5, r8\n\t"
  137999. "adcs r6, r6, r9\n\t"
  138000. "adc r7, r7, #0\n\t"
  138001. #else
  138002. "umull r8, r9, r10, r12\n\t"
  138003. "adds r5, r5, r8\n\t"
  138004. "adcs r6, r6, r9\n\t"
  138005. "adc r7, r7, #0\n\t"
  138006. #endif
  138007. /* A[7] * A[13] */
  138008. "ldr r10, [%[a], #52]\n\t"
  138009. "ldr r12, [%[a], #28]\n\t"
  138010. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138011. "lsl r8, r10, #16\n\t"
  138012. "lsl r9, r12, #16\n\t"
  138013. "lsr r8, r8, #16\n\t"
  138014. "lsr r9, r9, #16\n\t"
  138015. "mul r9, r8, r9\n\t"
  138016. "adds r5, r5, r9\n\t"
  138017. "adcs r6, r6, #0\n\t"
  138018. "adc r7, r7, #0\n\t"
  138019. "lsr r9, r12, #16\n\t"
  138020. "mul r8, r9, r8\n\t"
  138021. "lsr r9, r8, #16\n\t"
  138022. "lsl r8, r8, #16\n\t"
  138023. "adds r5, r5, r8\n\t"
  138024. "adcs r6, r6, r9\n\t"
  138025. "adc r7, r7, #0\n\t"
  138026. "lsr r8, r10, #16\n\t"
  138027. "lsr r9, r12, #16\n\t"
  138028. "mul r9, r8, r9\n\t"
  138029. "adds r6, r6, r9\n\t"
  138030. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  138038. "adc r7, r7, #0\n\t"
  138039. #else
  138040. "umull r8, r9, r10, r12\n\t"
  138041. "adds r5, r5, r8\n\t"
  138042. "adcs r6, r6, r9\n\t"
  138043. "adc r7, r7, #0\n\t"
  138044. #endif
  138045. /* A[8] * A[12] */
  138046. "ldr r10, [%[a], #48]\n\t"
  138047. "ldr r12, [%[a], #32]\n\t"
  138048. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138049. "lsl r8, r10, #16\n\t"
  138050. "lsl r9, r12, #16\n\t"
  138051. "lsr r8, r8, #16\n\t"
  138052. "lsr r9, r9, #16\n\t"
  138053. "mul r9, r8, r9\n\t"
  138054. "adds r5, r5, r9\n\t"
  138055. "adcs r6, r6, #0\n\t"
  138056. "adc r7, r7, #0\n\t"
  138057. "lsr r9, r12, #16\n\t"
  138058. "mul r8, r9, r8\n\t"
  138059. "lsr r9, r8, #16\n\t"
  138060. "lsl r8, r8, #16\n\t"
  138061. "adds r5, r5, r8\n\t"
  138062. "adcs r6, r6, r9\n\t"
  138063. "adc r7, r7, #0\n\t"
  138064. "lsr r8, r10, #16\n\t"
  138065. "lsr r9, r12, #16\n\t"
  138066. "mul r9, r8, r9\n\t"
  138067. "adds r6, r6, r9\n\t"
  138068. "adc r7, r7, #0\n\t"
  138069. "lsl r9, r12, #16\n\t"
  138070. "lsr r9, r9, #16\n\t"
  138071. "mul r8, r9, r8\n\t"
  138072. "lsr r9, r8, #16\n\t"
  138073. "lsl r8, r8, #16\n\t"
  138074. "adds r5, r5, r8\n\t"
  138075. "adcs r6, r6, r9\n\t"
  138076. "adc r7, r7, #0\n\t"
  138077. #else
  138078. "umull r8, r9, r10, r12\n\t"
  138079. "adds r5, r5, r8\n\t"
  138080. "adcs r6, r6, r9\n\t"
  138081. "adc r7, r7, #0\n\t"
  138082. #endif
  138083. /* A[9] * A[11] */
  138084. "ldr r10, [%[a], #44]\n\t"
  138085. "ldr r12, [%[a], #36]\n\t"
  138086. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138087. "lsl r8, r10, #16\n\t"
  138088. "lsl r9, r12, #16\n\t"
  138089. "lsr r8, r8, #16\n\t"
  138090. "lsr r9, r9, #16\n\t"
  138091. "mul r9, r8, r9\n\t"
  138092. "adds r5, r5, r9\n\t"
  138093. "adcs r6, r6, #0\n\t"
  138094. "adc r7, r7, #0\n\t"
  138095. "lsr r9, r12, #16\n\t"
  138096. "mul r8, r9, r8\n\t"
  138097. "lsr r9, r8, #16\n\t"
  138098. "lsl r8, r8, #16\n\t"
  138099. "adds r5, r5, r8\n\t"
  138100. "adcs r6, r6, r9\n\t"
  138101. "adc r7, r7, #0\n\t"
  138102. "lsr r8, r10, #16\n\t"
  138103. "lsr r9, r12, #16\n\t"
  138104. "mul r9, r8, r9\n\t"
  138105. "adds r6, r6, r9\n\t"
  138106. "adc r7, r7, #0\n\t"
  138107. "lsl r9, r12, #16\n\t"
  138108. "lsr r9, r9, #16\n\t"
  138109. "mul r8, r9, r8\n\t"
  138110. "lsr r9, r8, #16\n\t"
  138111. "lsl r8, r8, #16\n\t"
  138112. "adds r5, r5, r8\n\t"
  138113. "adcs r6, r6, r9\n\t"
  138114. "adc r7, r7, #0\n\t"
  138115. #else
  138116. "umull r8, r9, r10, r12\n\t"
  138117. "adds r5, r5, r8\n\t"
  138118. "adcs r6, r6, r9\n\t"
  138119. "adc r7, r7, #0\n\t"
  138120. #endif
  138121. /* A[10] * A[10] */
  138122. "ldr r10, [%[a], #40]\n\t"
  138123. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138124. "lsl r8, r10, #16\n\t"
  138125. "lsr r9, r10, #16\n\t"
  138126. "lsr r8, r8, #16\n\t"
  138127. "mov r12, r8\n\t"
  138128. "mul r8, r12, r8\n\t"
  138129. "mov r12, r9\n\t"
  138130. "mul r9, r12, r9\n\t"
  138131. "adds r4, r4, r8\n\t"
  138132. "adcs r2, r2, r9\n\t"
  138133. "adc r3, r3, #0\n\t"
  138134. "lsr r9, r10, #16\n\t"
  138135. "lsl r8, r10, #16\n\t"
  138136. "lsr r8, r8, #16\n\t"
  138137. "mul r8, r9, r8\n\t"
  138138. "lsr r9, r8, #15\n\t"
  138139. "lsl r8, r8, #17\n\t"
  138140. "adds r4, r4, r8\n\t"
  138141. "adcs r2, r2, r9\n\t"
  138142. "adc r3, r3, #0\n\t"
  138143. "adds r5, r5, r5\n\t"
  138144. "adcs r6, r6, r6\n\t"
  138145. "adc r7, r7, r7\n\t"
  138146. #else
  138147. "umull r8, r9, r10, r10\n\t"
  138148. "adds r5, r5, r5\n\t"
  138149. "adcs r6, r6, r6\n\t"
  138150. "adc r7, r7, r7\n\t"
  138151. "adds r4, r4, r8\n\t"
  138152. "adcs r2, r2, r9\n\t"
  138153. "adc r3, r3, #0\n\t"
  138154. #endif
  138155. "adds r4, r4, r5\n\t"
  138156. "adcs r2, r2, r6\n\t"
  138157. "adc r3, r3, r7\n\t"
  138158. "str r4, [%[r], #80]\n\t"
  138159. /* A[6] * A[15] */
  138160. "ldr r10, [%[a], #60]\n\t"
  138161. "ldr r12, [%[a], #24]\n\t"
  138162. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138163. "lsl r8, r10, #16\n\t"
  138164. "lsl r5, r12, #16\n\t"
  138165. "lsr r8, r8, #16\n\t"
  138166. "lsr r5, r5, #16\n\t"
  138167. "mul r5, r8, r5\n\t"
  138168. "lsr r9, r12, #16\n\t"
  138169. "mul r8, r9, r8\n\t"
  138170. "lsr r6, r8, #16\n\t"
  138171. "lsl r8, r8, #16\n\t"
  138172. "adds r5, r5, r8\n\t"
  138173. "adc r6, r6, #0\n\t"
  138174. "lsr r8, r10, #16\n\t"
  138175. "mul r9, r8, r9\n\t"
  138176. "add r6, r6, r9\n\t"
  138177. "lsl r9, r12, #16\n\t"
  138178. "lsr r9, r9, #16\n\t"
  138179. "mul r8, r9, r8\n\t"
  138180. "lsr r9, r8, #16\n\t"
  138181. "lsl r8, r8, #16\n\t"
  138182. "adds r5, r5, r8\n\t"
  138183. "adc r6, r6, r9\n\t"
  138184. #else
  138185. "umull r5, r6, r10, r12\n\t"
  138186. #endif
  138187. "mov r4, #0\n\t"
  138188. "mov r7, #0\n\t"
  138189. /* A[7] * A[14] */
  138190. "ldr r10, [%[a], #56]\n\t"
  138191. "ldr r12, [%[a], #28]\n\t"
  138192. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138193. "lsl r8, r10, #16\n\t"
  138194. "lsl r9, r12, #16\n\t"
  138195. "lsr r8, r8, #16\n\t"
  138196. "lsr r9, r9, #16\n\t"
  138197. "mul r9, r8, r9\n\t"
  138198. "adds r5, r5, r9\n\t"
  138199. "adcs r6, r6, #0\n\t"
  138200. "adc r7, r7, #0\n\t"
  138201. "lsr r9, r12, #16\n\t"
  138202. "mul r8, r9, r8\n\t"
  138203. "lsr r9, r8, #16\n\t"
  138204. "lsl r8, r8, #16\n\t"
  138205. "adds r5, r5, r8\n\t"
  138206. "adcs r6, r6, r9\n\t"
  138207. "adc r7, r7, #0\n\t"
  138208. "lsr r8, r10, #16\n\t"
  138209. "lsr r9, r12, #16\n\t"
  138210. "mul r9, r8, r9\n\t"
  138211. "adds r6, r6, r9\n\t"
  138212. "adc r7, r7, #0\n\t"
  138213. "lsl r9, r12, #16\n\t"
  138214. "lsr r9, r9, #16\n\t"
  138215. "mul r8, r9, r8\n\t"
  138216. "lsr r9, r8, #16\n\t"
  138217. "lsl r8, r8, #16\n\t"
  138218. "adds r5, r5, r8\n\t"
  138219. "adcs r6, r6, r9\n\t"
  138220. "adc r7, r7, #0\n\t"
  138221. #else
  138222. "umull r8, r9, r10, r12\n\t"
  138223. "adds r5, r5, r8\n\t"
  138224. "adcs r6, r6, r9\n\t"
  138225. "adc r7, r7, #0\n\t"
  138226. #endif
  138227. /* A[8] * A[13] */
  138228. "ldr r10, [%[a], #52]\n\t"
  138229. "ldr r12, [%[a], #32]\n\t"
  138230. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138231. "lsl r8, r10, #16\n\t"
  138232. "lsl r9, r12, #16\n\t"
  138233. "lsr r8, r8, #16\n\t"
  138234. "lsr r9, r9, #16\n\t"
  138235. "mul r9, r8, r9\n\t"
  138236. "adds r5, r5, r9\n\t"
  138237. "adcs r6, r6, #0\n\t"
  138238. "adc r7, r7, #0\n\t"
  138239. "lsr r9, r12, #16\n\t"
  138240. "mul r8, r9, r8\n\t"
  138241. "lsr r9, r8, #16\n\t"
  138242. "lsl r8, r8, #16\n\t"
  138243. "adds r5, r5, r8\n\t"
  138244. "adcs r6, r6, r9\n\t"
  138245. "adc r7, r7, #0\n\t"
  138246. "lsr r8, r10, #16\n\t"
  138247. "lsr r9, r12, #16\n\t"
  138248. "mul r9, r8, r9\n\t"
  138249. "adds r6, r6, r9\n\t"
  138250. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  138258. "adc r7, r7, #0\n\t"
  138259. #else
  138260. "umull r8, r9, r10, r12\n\t"
  138261. "adds r5, r5, r8\n\t"
  138262. "adcs r6, r6, r9\n\t"
  138263. "adc r7, r7, #0\n\t"
  138264. #endif
  138265. /* A[9] * A[12] */
  138266. "ldr r10, [%[a], #48]\n\t"
  138267. "ldr r12, [%[a], #36]\n\t"
  138268. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138269. "lsl r8, r10, #16\n\t"
  138270. "lsl r9, r12, #16\n\t"
  138271. "lsr r8, r8, #16\n\t"
  138272. "lsr r9, r9, #16\n\t"
  138273. "mul r9, r8, r9\n\t"
  138274. "adds r5, r5, r9\n\t"
  138275. "adcs r6, r6, #0\n\t"
  138276. "adc r7, r7, #0\n\t"
  138277. "lsr r9, r12, #16\n\t"
  138278. "mul r8, r9, r8\n\t"
  138279. "lsr r9, r8, #16\n\t"
  138280. "lsl r8, r8, #16\n\t"
  138281. "adds r5, r5, r8\n\t"
  138282. "adcs r6, r6, r9\n\t"
  138283. "adc r7, r7, #0\n\t"
  138284. "lsr r8, r10, #16\n\t"
  138285. "lsr r9, r12, #16\n\t"
  138286. "mul r9, r8, r9\n\t"
  138287. "adds r6, r6, r9\n\t"
  138288. "adc r7, r7, #0\n\t"
  138289. "lsl r9, r12, #16\n\t"
  138290. "lsr r9, r9, #16\n\t"
  138291. "mul r8, r9, r8\n\t"
  138292. "lsr r9, r8, #16\n\t"
  138293. "lsl r8, r8, #16\n\t"
  138294. "adds r5, r5, r8\n\t"
  138295. "adcs r6, r6, r9\n\t"
  138296. "adc r7, r7, #0\n\t"
  138297. #else
  138298. "umull r8, r9, r10, r12\n\t"
  138299. "adds r5, r5, r8\n\t"
  138300. "adcs r6, r6, r9\n\t"
  138301. "adc r7, r7, #0\n\t"
  138302. #endif
  138303. /* A[10] * A[11] */
  138304. "ldr r10, [%[a], #44]\n\t"
  138305. "ldr r12, [%[a], #40]\n\t"
  138306. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138307. "lsl r8, r10, #16\n\t"
  138308. "lsl r9, r12, #16\n\t"
  138309. "lsr r8, r8, #16\n\t"
  138310. "lsr r9, r9, #16\n\t"
  138311. "mul r9, r8, r9\n\t"
  138312. "adds r5, r5, r9\n\t"
  138313. "adcs r6, r6, #0\n\t"
  138314. "adc r7, r7, #0\n\t"
  138315. "lsr r9, r12, #16\n\t"
  138316. "mul r8, r9, r8\n\t"
  138317. "lsr r9, r8, #16\n\t"
  138318. "lsl r8, r8, #16\n\t"
  138319. "adds r5, r5, r8\n\t"
  138320. "adcs r6, r6, r9\n\t"
  138321. "adc r7, r7, #0\n\t"
  138322. "lsr r8, r10, #16\n\t"
  138323. "lsr r9, r12, #16\n\t"
  138324. "mul r9, r8, r9\n\t"
  138325. "adds r6, r6, r9\n\t"
  138326. "adc r7, r7, #0\n\t"
  138327. "lsl r9, r12, #16\n\t"
  138328. "lsr r9, r9, #16\n\t"
  138329. "mul r8, r9, r8\n\t"
  138330. "lsr r9, r8, #16\n\t"
  138331. "lsl r8, r8, #16\n\t"
  138332. "adds r5, r5, r8\n\t"
  138333. "adcs r6, r6, r9\n\t"
  138334. "adc r7, r7, #0\n\t"
  138335. #else
  138336. "umull r8, r9, r10, r12\n\t"
  138337. "adds r5, r5, r8\n\t"
  138338. "adcs r6, r6, r9\n\t"
  138339. "adc r7, r7, #0\n\t"
  138340. #endif
  138341. "adds r5, r5, r5\n\t"
  138342. "adcs r6, r6, r6\n\t"
  138343. "adc r7, r7, r7\n\t"
  138344. "adds r2, r2, r5\n\t"
  138345. "adcs r3, r3, r6\n\t"
  138346. "adc r4, r4, r7\n\t"
  138347. "str r2, [%[r], #84]\n\t"
  138348. /* A[7] * A[15] */
  138349. "ldr r10, [%[a], #60]\n\t"
  138350. "ldr r12, [%[a], #28]\n\t"
  138351. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138352. "lsl r8, r10, #16\n\t"
  138353. "lsl r5, r12, #16\n\t"
  138354. "lsr r8, r8, #16\n\t"
  138355. "lsr r5, r5, #16\n\t"
  138356. "mul r5, r8, r5\n\t"
  138357. "lsr r9, r12, #16\n\t"
  138358. "mul r8, r9, r8\n\t"
  138359. "lsr r6, r8, #16\n\t"
  138360. "lsl r8, r8, #16\n\t"
  138361. "adds r5, r5, r8\n\t"
  138362. "adc r6, r6, #0\n\t"
  138363. "lsr r8, r10, #16\n\t"
  138364. "mul r9, r8, r9\n\t"
  138365. "add r6, r6, r9\n\t"
  138366. "lsl r9, r12, #16\n\t"
  138367. "lsr r9, r9, #16\n\t"
  138368. "mul r8, r9, r8\n\t"
  138369. "lsr r9, r8, #16\n\t"
  138370. "lsl r8, r8, #16\n\t"
  138371. "adds r5, r5, r8\n\t"
  138372. "adc r6, r6, r9\n\t"
  138373. #else
  138374. "umull r5, r6, r10, r12\n\t"
  138375. #endif
  138376. "mov r2, #0\n\t"
  138377. "mov r7, #0\n\t"
  138378. /* A[8] * A[14] */
  138379. "ldr r10, [%[a], #56]\n\t"
  138380. "ldr r12, [%[a], #32]\n\t"
  138381. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138382. "lsl r8, r10, #16\n\t"
  138383. "lsl r9, r12, #16\n\t"
  138384. "lsr r8, r8, #16\n\t"
  138385. "lsr r9, r9, #16\n\t"
  138386. "mul r9, r8, r9\n\t"
  138387. "adds r5, r5, r9\n\t"
  138388. "adcs r6, r6, #0\n\t"
  138389. "adc r7, r7, #0\n\t"
  138390. "lsr r9, r12, #16\n\t"
  138391. "mul r8, r9, r8\n\t"
  138392. "lsr r9, r8, #16\n\t"
  138393. "lsl r8, r8, #16\n\t"
  138394. "adds r5, r5, r8\n\t"
  138395. "adcs r6, r6, r9\n\t"
  138396. "adc r7, r7, #0\n\t"
  138397. "lsr r8, r10, #16\n\t"
  138398. "lsr r9, r12, #16\n\t"
  138399. "mul r9, r8, r9\n\t"
  138400. "adds r6, r6, r9\n\t"
  138401. "adc r7, r7, #0\n\t"
  138402. "lsl r9, r12, #16\n\t"
  138403. "lsr r9, r9, #16\n\t"
  138404. "mul r8, r9, r8\n\t"
  138405. "lsr r9, r8, #16\n\t"
  138406. "lsl r8, r8, #16\n\t"
  138407. "adds r5, r5, r8\n\t"
  138408. "adcs r6, r6, r9\n\t"
  138409. "adc r7, r7, #0\n\t"
  138410. #else
  138411. "umull r8, r9, r10, r12\n\t"
  138412. "adds r5, r5, r8\n\t"
  138413. "adcs r6, r6, r9\n\t"
  138414. "adc r7, r7, #0\n\t"
  138415. #endif
  138416. /* A[9] * A[13] */
  138417. "ldr r10, [%[a], #52]\n\t"
  138418. "ldr r12, [%[a], #36]\n\t"
  138419. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138420. "lsl r8, r10, #16\n\t"
  138421. "lsl r9, r12, #16\n\t"
  138422. "lsr r8, r8, #16\n\t"
  138423. "lsr r9, r9, #16\n\t"
  138424. "mul r9, r8, r9\n\t"
  138425. "adds r5, r5, r9\n\t"
  138426. "adcs r6, r6, #0\n\t"
  138427. "adc r7, r7, #0\n\t"
  138428. "lsr r9, r12, #16\n\t"
  138429. "mul r8, r9, r8\n\t"
  138430. "lsr r9, r8, #16\n\t"
  138431. "lsl r8, r8, #16\n\t"
  138432. "adds r5, r5, r8\n\t"
  138433. "adcs r6, r6, r9\n\t"
  138434. "adc r7, r7, #0\n\t"
  138435. "lsr r8, r10, #16\n\t"
  138436. "lsr r9, r12, #16\n\t"
  138437. "mul r9, r8, r9\n\t"
  138438. "adds r6, r6, r9\n\t"
  138439. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  138447. "adc r7, r7, #0\n\t"
  138448. #else
  138449. "umull r8, r9, r10, r12\n\t"
  138450. "adds r5, r5, r8\n\t"
  138451. "adcs r6, r6, r9\n\t"
  138452. "adc r7, r7, #0\n\t"
  138453. #endif
  138454. /* A[10] * A[12] */
  138455. "ldr r10, [%[a], #48]\n\t"
  138456. "ldr r12, [%[a], #40]\n\t"
  138457. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138458. "lsl r8, r10, #16\n\t"
  138459. "lsl r9, r12, #16\n\t"
  138460. "lsr r8, r8, #16\n\t"
  138461. "lsr r9, r9, #16\n\t"
  138462. "mul r9, r8, r9\n\t"
  138463. "adds r5, r5, r9\n\t"
  138464. "adcs r6, r6, #0\n\t"
  138465. "adc r7, r7, #0\n\t"
  138466. "lsr r9, r12, #16\n\t"
  138467. "mul r8, r9, r8\n\t"
  138468. "lsr r9, r8, #16\n\t"
  138469. "lsl r8, r8, #16\n\t"
  138470. "adds r5, r5, r8\n\t"
  138471. "adcs r6, r6, r9\n\t"
  138472. "adc r7, r7, #0\n\t"
  138473. "lsr r8, r10, #16\n\t"
  138474. "lsr r9, r12, #16\n\t"
  138475. "mul r9, r8, r9\n\t"
  138476. "adds r6, r6, r9\n\t"
  138477. "adc r7, r7, #0\n\t"
  138478. "lsl r9, r12, #16\n\t"
  138479. "lsr r9, r9, #16\n\t"
  138480. "mul r8, r9, r8\n\t"
  138481. "lsr r9, r8, #16\n\t"
  138482. "lsl r8, r8, #16\n\t"
  138483. "adds r5, r5, r8\n\t"
  138484. "adcs r6, r6, r9\n\t"
  138485. "adc r7, r7, #0\n\t"
  138486. #else
  138487. "umull r8, r9, r10, r12\n\t"
  138488. "adds r5, r5, r8\n\t"
  138489. "adcs r6, r6, r9\n\t"
  138490. "adc r7, r7, #0\n\t"
  138491. #endif
  138492. /* A[11] * A[11] */
  138493. "ldr r10, [%[a], #44]\n\t"
  138494. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138495. "lsl r8, r10, #16\n\t"
  138496. "lsr r9, r10, #16\n\t"
  138497. "lsr r8, r8, #16\n\t"
  138498. "mov r12, r8\n\t"
  138499. "mul r8, r12, r8\n\t"
  138500. "mov r12, r9\n\t"
  138501. "mul r9, r12, r9\n\t"
  138502. "adds r3, r3, r8\n\t"
  138503. "adcs r4, r4, r9\n\t"
  138504. "adc r2, r2, #0\n\t"
  138505. "lsr r9, r10, #16\n\t"
  138506. "lsl r8, r10, #16\n\t"
  138507. "lsr r8, r8, #16\n\t"
  138508. "mul r8, r9, r8\n\t"
  138509. "lsr r9, r8, #15\n\t"
  138510. "lsl r8, r8, #17\n\t"
  138511. "adds r3, r3, r8\n\t"
  138512. "adcs r4, r4, r9\n\t"
  138513. "adc r2, r2, #0\n\t"
  138514. "adds r5, r5, r5\n\t"
  138515. "adcs r6, r6, r6\n\t"
  138516. "adc r7, r7, r7\n\t"
  138517. #else
  138518. "umull r8, r9, r10, r10\n\t"
  138519. "adds r5, r5, r5\n\t"
  138520. "adcs r6, r6, r6\n\t"
  138521. "adc r7, r7, r7\n\t"
  138522. "adds r3, r3, r8\n\t"
  138523. "adcs r4, r4, r9\n\t"
  138524. "adc r2, r2, #0\n\t"
  138525. #endif
  138526. "adds r3, r3, r5\n\t"
  138527. "adcs r4, r4, r6\n\t"
  138528. "adc r2, r2, r7\n\t"
  138529. "str r3, [%[r], #88]\n\t"
  138530. /* A[8] * A[15] */
  138531. "ldr r10, [%[a], #60]\n\t"
  138532. "ldr r12, [%[a], #32]\n\t"
  138533. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138534. "lsl r8, r10, #16\n\t"
  138535. "lsl r5, r12, #16\n\t"
  138536. "lsr r8, r8, #16\n\t"
  138537. "lsr r5, r5, #16\n\t"
  138538. "mul r5, r8, r5\n\t"
  138539. "lsr r9, r12, #16\n\t"
  138540. "mul r8, r9, r8\n\t"
  138541. "lsr r6, r8, #16\n\t"
  138542. "lsl r8, r8, #16\n\t"
  138543. "adds r5, r5, r8\n\t"
  138544. "adc r6, r6, #0\n\t"
  138545. "lsr r8, r10, #16\n\t"
  138546. "mul r9, r8, r9\n\t"
  138547. "add r6, r6, r9\n\t"
  138548. "lsl r9, r12, #16\n\t"
  138549. "lsr r9, r9, #16\n\t"
  138550. "mul r8, r9, r8\n\t"
  138551. "lsr r9, r8, #16\n\t"
  138552. "lsl r8, r8, #16\n\t"
  138553. "adds r5, r5, r8\n\t"
  138554. "adc r6, r6, r9\n\t"
  138555. #else
  138556. "umull r5, r6, r10, r12\n\t"
  138557. #endif
  138558. "mov r3, #0\n\t"
  138559. "mov r7, #0\n\t"
  138560. /* A[9] * A[14] */
  138561. "ldr r10, [%[a], #56]\n\t"
  138562. "ldr r12, [%[a], #36]\n\t"
  138563. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138564. "lsl r8, r10, #16\n\t"
  138565. "lsl r9, r12, #16\n\t"
  138566. "lsr r8, r8, #16\n\t"
  138567. "lsr r9, r9, #16\n\t"
  138568. "mul r9, r8, r9\n\t"
  138569. "adds r5, r5, r9\n\t"
  138570. "adcs r6, r6, #0\n\t"
  138571. "adc r7, r7, #0\n\t"
  138572. "lsr r9, r12, #16\n\t"
  138573. "mul r8, r9, r8\n\t"
  138574. "lsr r9, r8, #16\n\t"
  138575. "lsl r8, r8, #16\n\t"
  138576. "adds r5, r5, r8\n\t"
  138577. "adcs r6, r6, r9\n\t"
  138578. "adc r7, r7, #0\n\t"
  138579. "lsr r8, r10, #16\n\t"
  138580. "lsr r9, r12, #16\n\t"
  138581. "mul r9, r8, r9\n\t"
  138582. "adds r6, r6, r9\n\t"
  138583. "adc r7, r7, #0\n\t"
  138584. "lsl r9, r12, #16\n\t"
  138585. "lsr r9, r9, #16\n\t"
  138586. "mul r8, r9, r8\n\t"
  138587. "lsr r9, r8, #16\n\t"
  138588. "lsl r8, r8, #16\n\t"
  138589. "adds r5, r5, r8\n\t"
  138590. "adcs r6, r6, r9\n\t"
  138591. "adc r7, r7, #0\n\t"
  138592. #else
  138593. "umull r8, r9, r10, r12\n\t"
  138594. "adds r5, r5, r8\n\t"
  138595. "adcs r6, r6, r9\n\t"
  138596. "adc r7, r7, #0\n\t"
  138597. #endif
  138598. /* A[10] * A[13] */
  138599. "ldr r10, [%[a], #52]\n\t"
  138600. "ldr r12, [%[a], #40]\n\t"
  138601. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138602. "lsl r8, r10, #16\n\t"
  138603. "lsl r9, r12, #16\n\t"
  138604. "lsr r8, r8, #16\n\t"
  138605. "lsr r9, r9, #16\n\t"
  138606. "mul r9, r8, r9\n\t"
  138607. "adds r5, r5, r9\n\t"
  138608. "adcs r6, r6, #0\n\t"
  138609. "adc r7, r7, #0\n\t"
  138610. "lsr r9, r12, #16\n\t"
  138611. "mul r8, r9, r8\n\t"
  138612. "lsr r9, r8, #16\n\t"
  138613. "lsl r8, r8, #16\n\t"
  138614. "adds r5, r5, r8\n\t"
  138615. "adcs r6, r6, r9\n\t"
  138616. "adc r7, r7, #0\n\t"
  138617. "lsr r8, r10, #16\n\t"
  138618. "lsr r9, r12, #16\n\t"
  138619. "mul r9, r8, r9\n\t"
  138620. "adds r6, r6, r9\n\t"
  138621. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  138629. "adc r7, r7, #0\n\t"
  138630. #else
  138631. "umull r8, r9, r10, r12\n\t"
  138632. "adds r5, r5, r8\n\t"
  138633. "adcs r6, r6, r9\n\t"
  138634. "adc r7, r7, #0\n\t"
  138635. #endif
  138636. /* A[11] * A[12] */
  138637. "ldr r10, [%[a], #48]\n\t"
  138638. "ldr r12, [%[a], #44]\n\t"
  138639. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138640. "lsl r8, r10, #16\n\t"
  138641. "lsl r9, r12, #16\n\t"
  138642. "lsr r8, r8, #16\n\t"
  138643. "lsr r9, r9, #16\n\t"
  138644. "mul r9, r8, r9\n\t"
  138645. "adds r5, r5, r9\n\t"
  138646. "adcs r6, r6, #0\n\t"
  138647. "adc r7, r7, #0\n\t"
  138648. "lsr r9, r12, #16\n\t"
  138649. "mul r8, r9, r8\n\t"
  138650. "lsr r9, r8, #16\n\t"
  138651. "lsl r8, r8, #16\n\t"
  138652. "adds r5, r5, r8\n\t"
  138653. "adcs r6, r6, r9\n\t"
  138654. "adc r7, r7, #0\n\t"
  138655. "lsr r8, r10, #16\n\t"
  138656. "lsr r9, r12, #16\n\t"
  138657. "mul r9, r8, r9\n\t"
  138658. "adds r6, r6, r9\n\t"
  138659. "adc r7, r7, #0\n\t"
  138660. "lsl r9, r12, #16\n\t"
  138661. "lsr r9, r9, #16\n\t"
  138662. "mul r8, r9, r8\n\t"
  138663. "lsr r9, r8, #16\n\t"
  138664. "lsl r8, r8, #16\n\t"
  138665. "adds r5, r5, r8\n\t"
  138666. "adcs r6, r6, r9\n\t"
  138667. "adc r7, r7, #0\n\t"
  138668. #else
  138669. "umull r8, r9, r10, r12\n\t"
  138670. "adds r5, r5, r8\n\t"
  138671. "adcs r6, r6, r9\n\t"
  138672. "adc r7, r7, #0\n\t"
  138673. #endif
  138674. "adds r5, r5, r5\n\t"
  138675. "adcs r6, r6, r6\n\t"
  138676. "adc r7, r7, r7\n\t"
  138677. "adds r4, r4, r5\n\t"
  138678. "adcs r2, r2, r6\n\t"
  138679. "adc r3, r3, r7\n\t"
  138680. "str r4, [%[r], #92]\n\t"
  138681. /* A[9] * A[15] */
  138682. "ldr r10, [%[a], #60]\n\t"
  138683. "ldr r12, [%[a], #36]\n\t"
  138684. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138685. "lsl r8, r10, #16\n\t"
  138686. "lsl r5, r12, #16\n\t"
  138687. "lsr r8, r8, #16\n\t"
  138688. "lsr r5, r5, #16\n\t"
  138689. "mul r5, r8, r5\n\t"
  138690. "lsr r9, r12, #16\n\t"
  138691. "mul r8, r9, r8\n\t"
  138692. "lsr r6, r8, #16\n\t"
  138693. "lsl r8, r8, #16\n\t"
  138694. "adds r5, r5, r8\n\t"
  138695. "adc r6, r6, #0\n\t"
  138696. "lsr r8, r10, #16\n\t"
  138697. "mul r9, r8, r9\n\t"
  138698. "add r6, r6, r9\n\t"
  138699. "lsl r9, r12, #16\n\t"
  138700. "lsr r9, r9, #16\n\t"
  138701. "mul r8, r9, r8\n\t"
  138702. "lsr r9, r8, #16\n\t"
  138703. "lsl r8, r8, #16\n\t"
  138704. "adds r5, r5, r8\n\t"
  138705. "adc r6, r6, r9\n\t"
  138706. #else
  138707. "umull r5, r6, r10, r12\n\t"
  138708. #endif
  138709. "mov r4, #0\n\t"
  138710. "mov r7, #0\n\t"
  138711. /* A[10] * A[14] */
  138712. "ldr r10, [%[a], #56]\n\t"
  138713. "ldr r12, [%[a], #40]\n\t"
  138714. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138715. "lsl r8, r10, #16\n\t"
  138716. "lsl r9, r12, #16\n\t"
  138717. "lsr r8, r8, #16\n\t"
  138718. "lsr r9, r9, #16\n\t"
  138719. "mul r9, r8, r9\n\t"
  138720. "adds r5, r5, r9\n\t"
  138721. "adcs r6, r6, #0\n\t"
  138722. "adc r7, r7, #0\n\t"
  138723. "lsr r9, r12, #16\n\t"
  138724. "mul r8, r9, r8\n\t"
  138725. "lsr r9, r8, #16\n\t"
  138726. "lsl r8, r8, #16\n\t"
  138727. "adds r5, r5, r8\n\t"
  138728. "adcs r6, r6, r9\n\t"
  138729. "adc r7, r7, #0\n\t"
  138730. "lsr r8, r10, #16\n\t"
  138731. "lsr r9, r12, #16\n\t"
  138732. "mul r9, r8, r9\n\t"
  138733. "adds r6, r6, r9\n\t"
  138734. "adc r7, r7, #0\n\t"
  138735. "lsl r9, r12, #16\n\t"
  138736. "lsr r9, r9, #16\n\t"
  138737. "mul r8, r9, r8\n\t"
  138738. "lsr r9, r8, #16\n\t"
  138739. "lsl r8, r8, #16\n\t"
  138740. "adds r5, r5, r8\n\t"
  138741. "adcs r6, r6, r9\n\t"
  138742. "adc r7, r7, #0\n\t"
  138743. #else
  138744. "umull r8, r9, r10, r12\n\t"
  138745. "adds r5, r5, r8\n\t"
  138746. "adcs r6, r6, r9\n\t"
  138747. "adc r7, r7, #0\n\t"
  138748. #endif
  138749. /* A[11] * A[13] */
  138750. "ldr r10, [%[a], #52]\n\t"
  138751. "ldr r12, [%[a], #44]\n\t"
  138752. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138753. "lsl r8, r10, #16\n\t"
  138754. "lsl r9, r12, #16\n\t"
  138755. "lsr r8, r8, #16\n\t"
  138756. "lsr r9, r9, #16\n\t"
  138757. "mul r9, r8, r9\n\t"
  138758. "adds r5, r5, r9\n\t"
  138759. "adcs r6, r6, #0\n\t"
  138760. "adc r7, r7, #0\n\t"
  138761. "lsr r9, r12, #16\n\t"
  138762. "mul r8, r9, r8\n\t"
  138763. "lsr r9, r8, #16\n\t"
  138764. "lsl r8, r8, #16\n\t"
  138765. "adds r5, r5, r8\n\t"
  138766. "adcs r6, r6, r9\n\t"
  138767. "adc r7, r7, #0\n\t"
  138768. "lsr r8, r10, #16\n\t"
  138769. "lsr r9, r12, #16\n\t"
  138770. "mul r9, r8, r9\n\t"
  138771. "adds r6, r6, r9\n\t"
  138772. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  138780. "adc r7, r7, #0\n\t"
  138781. #else
  138782. "umull r8, r9, r10, r12\n\t"
  138783. "adds r5, r5, r8\n\t"
  138784. "adcs r6, r6, r9\n\t"
  138785. "adc r7, r7, #0\n\t"
  138786. #endif
  138787. /* A[12] * A[12] */
  138788. "ldr r10, [%[a], #48]\n\t"
  138789. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138790. "lsl r8, r10, #16\n\t"
  138791. "lsr r9, r10, #16\n\t"
  138792. "lsr r8, r8, #16\n\t"
  138793. "mov r12, r8\n\t"
  138794. "mul r8, r12, r8\n\t"
  138795. "mov r12, r9\n\t"
  138796. "mul r9, r12, r9\n\t"
  138797. "adds r2, r2, r8\n\t"
  138798. "adcs r3, r3, r9\n\t"
  138799. "adc r4, r4, #0\n\t"
  138800. "lsr r9, r10, #16\n\t"
  138801. "lsl r8, r10, #16\n\t"
  138802. "lsr r8, r8, #16\n\t"
  138803. "mul r8, r9, r8\n\t"
  138804. "lsr r9, r8, #15\n\t"
  138805. "lsl r8, r8, #17\n\t"
  138806. "adds r2, r2, r8\n\t"
  138807. "adcs r3, r3, r9\n\t"
  138808. "adc r4, r4, #0\n\t"
  138809. "adds r5, r5, r5\n\t"
  138810. "adcs r6, r6, r6\n\t"
  138811. "adc r7, r7, r7\n\t"
  138812. #else
  138813. "umull r8, r9, r10, r10\n\t"
  138814. "adds r5, r5, r5\n\t"
  138815. "adcs r6, r6, r6\n\t"
  138816. "adc r7, r7, r7\n\t"
  138817. "adds r2, r2, r8\n\t"
  138818. "adcs r3, r3, r9\n\t"
  138819. "adc r4, r4, #0\n\t"
  138820. #endif
  138821. "adds r2, r2, r5\n\t"
  138822. "adcs r3, r3, r6\n\t"
  138823. "adc r4, r4, r7\n\t"
  138824. "str r2, [%[r], #96]\n\t"
  138825. /* A[10] * A[15] */
  138826. "ldr r10, [%[a], #60]\n\t"
  138827. "ldr r12, [%[a], #40]\n\t"
  138828. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138829. "lsl r8, r10, #16\n\t"
  138830. "lsl r5, r12, #16\n\t"
  138831. "lsr r8, r8, #16\n\t"
  138832. "lsr r5, r5, #16\n\t"
  138833. "mul r5, r8, r5\n\t"
  138834. "lsr r9, r12, #16\n\t"
  138835. "mul r8, r9, r8\n\t"
  138836. "lsr r6, r8, #16\n\t"
  138837. "lsl r8, r8, #16\n\t"
  138838. "adds r5, r5, r8\n\t"
  138839. "adc r6, r6, #0\n\t"
  138840. "lsr r8, r10, #16\n\t"
  138841. "mul r9, r8, r9\n\t"
  138842. "add r6, r6, r9\n\t"
  138843. "lsl r9, r12, #16\n\t"
  138844. "lsr r9, r9, #16\n\t"
  138845. "mul r8, r9, r8\n\t"
  138846. "lsr r9, r8, #16\n\t"
  138847. "lsl r8, r8, #16\n\t"
  138848. "adds r5, r5, r8\n\t"
  138849. "adc r6, r6, r9\n\t"
  138850. #else
  138851. "umull r5, r6, r10, r12\n\t"
  138852. #endif
  138853. "mov r2, #0\n\t"
  138854. "mov r7, #0\n\t"
  138855. /* A[11] * A[14] */
  138856. "ldr r10, [%[a], #56]\n\t"
  138857. "ldr r12, [%[a], #44]\n\t"
  138858. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138859. "lsl r8, r10, #16\n\t"
  138860. "lsl r9, r12, #16\n\t"
  138861. "lsr r8, r8, #16\n\t"
  138862. "lsr r9, r9, #16\n\t"
  138863. "mul r9, r8, r9\n\t"
  138864. "adds r5, r5, r9\n\t"
  138865. "adcs r6, r6, #0\n\t"
  138866. "adc r7, r7, #0\n\t"
  138867. "lsr r9, r12, #16\n\t"
  138868. "mul r8, r9, r8\n\t"
  138869. "lsr r9, r8, #16\n\t"
  138870. "lsl r8, r8, #16\n\t"
  138871. "adds r5, r5, r8\n\t"
  138872. "adcs r6, r6, r9\n\t"
  138873. "adc r7, r7, #0\n\t"
  138874. "lsr r8, r10, #16\n\t"
  138875. "lsr r9, r12, #16\n\t"
  138876. "mul r9, r8, r9\n\t"
  138877. "adds r6, r6, r9\n\t"
  138878. "adc r7, r7, #0\n\t"
  138879. "lsl r9, r12, #16\n\t"
  138880. "lsr r9, r9, #16\n\t"
  138881. "mul r8, r9, r8\n\t"
  138882. "lsr r9, r8, #16\n\t"
  138883. "lsl r8, r8, #16\n\t"
  138884. "adds r5, r5, r8\n\t"
  138885. "adcs r6, r6, r9\n\t"
  138886. "adc r7, r7, #0\n\t"
  138887. #else
  138888. "umull r8, r9, r10, r12\n\t"
  138889. "adds r5, r5, r8\n\t"
  138890. "adcs r6, r6, r9\n\t"
  138891. "adc r7, r7, #0\n\t"
  138892. #endif
  138893. /* A[12] * A[13] */
  138894. "ldr r10, [%[a], #52]\n\t"
  138895. "ldr r12, [%[a], #48]\n\t"
  138896. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138897. "lsl r8, r10, #16\n\t"
  138898. "lsl r9, r12, #16\n\t"
  138899. "lsr r8, r8, #16\n\t"
  138900. "lsr r9, r9, #16\n\t"
  138901. "mul r9, r8, r9\n\t"
  138902. "adds r5, r5, r9\n\t"
  138903. "adcs r6, r6, #0\n\t"
  138904. "adc r7, r7, #0\n\t"
  138905. "lsr r9, r12, #16\n\t"
  138906. "mul r8, r9, r8\n\t"
  138907. "lsr r9, r8, #16\n\t"
  138908. "lsl r8, r8, #16\n\t"
  138909. "adds r5, r5, r8\n\t"
  138910. "adcs r6, r6, r9\n\t"
  138911. "adc r7, r7, #0\n\t"
  138912. "lsr r8, r10, #16\n\t"
  138913. "lsr r9, r12, #16\n\t"
  138914. "mul r9, r8, r9\n\t"
  138915. "adds r6, r6, r9\n\t"
  138916. "adc r7, r7, #0\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. "adcs r6, r6, r9\n\t"
  138924. "adc r7, r7, #0\n\t"
  138925. #else
  138926. "umull r8, r9, r10, r12\n\t"
  138927. "adds r5, r5, r8\n\t"
  138928. "adcs r6, r6, r9\n\t"
  138929. "adc r7, r7, #0\n\t"
  138930. #endif
  138931. "adds r5, r5, r5\n\t"
  138932. "adcs r6, r6, r6\n\t"
  138933. "adc r7, r7, r7\n\t"
  138934. "adds r3, r3, r5\n\t"
  138935. "adcs r4, r4, r6\n\t"
  138936. "adc r2, r2, r7\n\t"
  138937. "str r3, [%[r], #100]\n\t"
  138938. /* A[11] * A[15] */
  138939. "ldr r10, [%[a], #60]\n\t"
  138940. "ldr r12, [%[a], #44]\n\t"
  138941. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138942. "lsl r8, r10, #16\n\t"
  138943. "lsl r9, r12, #16\n\t"
  138944. "lsr r8, r8, #16\n\t"
  138945. "lsr r9, r9, #16\n\t"
  138946. "mul r9, r8, r9\n\t"
  138947. "adds r4, r4, r9\n\t"
  138948. "adcs r2, r2, #0\n\t"
  138949. "mov r3, #0\n\t"
  138950. "adc r3, r3, #0\n\t"
  138951. "adds r4, r4, r9\n\t"
  138952. "adcs r2, r2, #0\n\t"
  138953. "adc r3, r3, #0\n\t"
  138954. "lsr r9, r12, #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 r4, r4, r8\n\t"
  138959. "adcs r2, r2, r9\n\t"
  138960. "adc r3, r3, #0\n\t"
  138961. "adds r4, r4, r8\n\t"
  138962. "adcs r2, r2, r9\n\t"
  138963. "adc r3, r3, #0\n\t"
  138964. "lsr r8, r10, #16\n\t"
  138965. "lsr r9, r12, #16\n\t"
  138966. "mul r9, r8, r9\n\t"
  138967. "adds r2, r2, r9\n\t"
  138968. "adc r3, r3, #0\n\t"
  138969. "adds r2, r2, r9\n\t"
  138970. "adc r3, r3, #0\n\t"
  138971. "lsl r9, r12, #16\n\t"
  138972. "lsr r9, r9, #16\n\t"
  138973. "mul r8, r9, r8\n\t"
  138974. "lsr r9, r8, #16\n\t"
  138975. "lsl r8, r8, #16\n\t"
  138976. "adds r4, r4, r8\n\t"
  138977. "adcs r2, r2, r9\n\t"
  138978. "adc r3, r3, #0\n\t"
  138979. "adds r4, r4, r8\n\t"
  138980. "adcs r2, r2, r9\n\t"
  138981. "adc r3, r3, #0\n\t"
  138982. #else
  138983. "umull r8, r9, r10, r12\n\t"
  138984. "adds r4, r4, r8\n\t"
  138985. "adcs r2, r2, r9\n\t"
  138986. "mov r3, #0\n\t"
  138987. "adc r3, r3, #0\n\t"
  138988. "adds r4, r4, r8\n\t"
  138989. "adcs r2, r2, r9\n\t"
  138990. "mov r3, #0\n\t"
  138991. "adc r3, r3, #0\n\t"
  138992. #endif
  138993. /* A[12] * A[14] */
  138994. "ldr r10, [%[a], #56]\n\t"
  138995. "ldr r12, [%[a], #48]\n\t"
  138996. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  138997. "lsl r8, r10, #16\n\t"
  138998. "lsl r9, r12, #16\n\t"
  138999. "lsr r8, r8, #16\n\t"
  139000. "lsr r9, r9, #16\n\t"
  139001. "mul r9, r8, r9\n\t"
  139002. "adds r4, r4, r9\n\t"
  139003. "adcs r2, r2, #0\n\t"
  139004. "adc r3, r3, #0\n\t"
  139005. "adds r4, r4, r9\n\t"
  139006. "adcs r2, r2, #0\n\t"
  139007. "adc r3, r3, #0\n\t"
  139008. "lsr r9, r12, #16\n\t"
  139009. "mul r8, r9, r8\n\t"
  139010. "lsr r9, r8, #16\n\t"
  139011. "lsl r8, r8, #16\n\t"
  139012. "adds r4, r4, r8\n\t"
  139013. "adcs r2, r2, r9\n\t"
  139014. "adc r3, r3, #0\n\t"
  139015. "adds r4, r4, r8\n\t"
  139016. "adcs r2, r2, r9\n\t"
  139017. "adc r3, r3, #0\n\t"
  139018. "lsr r8, r10, #16\n\t"
  139019. "lsr r9, r12, #16\n\t"
  139020. "mul r9, r8, r9\n\t"
  139021. "adds r2, r2, r9\n\t"
  139022. "adc r3, r3, #0\n\t"
  139023. "adds r2, r2, r9\n\t"
  139024. "adc r3, r3, #0\n\t"
  139025. "lsl r9, r12, #16\n\t"
  139026. "lsr r9, r9, #16\n\t"
  139027. "mul r8, r9, r8\n\t"
  139028. "lsr r9, r8, #16\n\t"
  139029. "lsl r8, r8, #16\n\t"
  139030. "adds r4, r4, r8\n\t"
  139031. "adcs r2, r2, r9\n\t"
  139032. "adc r3, r3, #0\n\t"
  139033. "adds r4, r4, r8\n\t"
  139034. "adcs r2, r2, r9\n\t"
  139035. "adc r3, r3, #0\n\t"
  139036. #else
  139037. "umull r8, r9, r10, r12\n\t"
  139038. "adds r4, r4, r8\n\t"
  139039. "adcs r2, r2, r9\n\t"
  139040. "adc r3, r3, #0\n\t"
  139041. "adds r4, r4, r8\n\t"
  139042. "adcs r2, r2, r9\n\t"
  139043. "adc r3, r3, #0\n\t"
  139044. #endif
  139045. /* A[13] * A[13] */
  139046. "ldr r10, [%[a], #52]\n\t"
  139047. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139048. "lsl r8, r10, #16\n\t"
  139049. "lsr r9, r10, #16\n\t"
  139050. "lsr r8, r8, #16\n\t"
  139051. "mov r12, r8\n\t"
  139052. "mul r8, r12, r8\n\t"
  139053. "mov r12, r9\n\t"
  139054. "mul r9, r12, r9\n\t"
  139055. "adds r4, r4, r8\n\t"
  139056. "adcs r2, r2, r9\n\t"
  139057. "adc r3, r3, #0\n\t"
  139058. "lsr r9, r10, #16\n\t"
  139059. "lsl r8, r10, #16\n\t"
  139060. "lsr r8, r8, #16\n\t"
  139061. "mul r8, r9, r8\n\t"
  139062. "lsr r9, r8, #15\n\t"
  139063. "lsl r8, r8, #17\n\t"
  139064. "adds r4, r4, r8\n\t"
  139065. "adcs r2, r2, r9\n\t"
  139066. "adc r3, r3, #0\n\t"
  139067. #else
  139068. "umull r8, r9, r10, r10\n\t"
  139069. "adds r4, r4, r8\n\t"
  139070. "adcs r2, r2, r9\n\t"
  139071. "adc r3, r3, #0\n\t"
  139072. #endif
  139073. "str r4, [%[r], #104]\n\t"
  139074. /* A[12] * A[15] */
  139075. "ldr r10, [%[a], #60]\n\t"
  139076. "ldr r12, [%[a], #48]\n\t"
  139077. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139078. "lsl r8, r10, #16\n\t"
  139079. "lsl r9, r12, #16\n\t"
  139080. "lsr r8, r8, #16\n\t"
  139081. "lsr r9, r9, #16\n\t"
  139082. "mul r9, r8, r9\n\t"
  139083. "adds r2, r2, r9\n\t"
  139084. "adcs r3, r3, #0\n\t"
  139085. "mov r4, #0\n\t"
  139086. "adc r4, r4, #0\n\t"
  139087. "adds r2, r2, r9\n\t"
  139088. "adcs r3, r3, #0\n\t"
  139089. "adc r4, r4, #0\n\t"
  139090. "lsr r9, r12, #16\n\t"
  139091. "mul r8, r9, r8\n\t"
  139092. "lsr r9, r8, #16\n\t"
  139093. "lsl r8, r8, #16\n\t"
  139094. "adds r2, r2, r8\n\t"
  139095. "adcs r3, r3, r9\n\t"
  139096. "adc r4, r4, #0\n\t"
  139097. "adds r2, r2, r8\n\t"
  139098. "adcs r3, r3, r9\n\t"
  139099. "adc r4, r4, #0\n\t"
  139100. "lsr r8, r10, #16\n\t"
  139101. "lsr r9, r12, #16\n\t"
  139102. "mul r9, r8, r9\n\t"
  139103. "adds r3, r3, r9\n\t"
  139104. "adc r4, r4, #0\n\t"
  139105. "adds r3, r3, r9\n\t"
  139106. "adc r4, r4, #0\n\t"
  139107. "lsl r9, r12, #16\n\t"
  139108. "lsr r9, r9, #16\n\t"
  139109. "mul r8, r9, r8\n\t"
  139110. "lsr r9, r8, #16\n\t"
  139111. "lsl r8, r8, #16\n\t"
  139112. "adds r2, r2, r8\n\t"
  139113. "adcs r3, r3, r9\n\t"
  139114. "adc r4, r4, #0\n\t"
  139115. "adds r2, r2, r8\n\t"
  139116. "adcs r3, r3, r9\n\t"
  139117. "adc r4, r4, #0\n\t"
  139118. #else
  139119. "umull r8, r9, r10, r12\n\t"
  139120. "adds r2, r2, r8\n\t"
  139121. "adcs r3, r3, r9\n\t"
  139122. "mov r4, #0\n\t"
  139123. "adc r4, r4, #0\n\t"
  139124. "adds r2, r2, r8\n\t"
  139125. "adcs r3, r3, r9\n\t"
  139126. "mov r4, #0\n\t"
  139127. "adc r4, r4, #0\n\t"
  139128. #endif
  139129. /* A[13] * A[14] */
  139130. "ldr r10, [%[a], #56]\n\t"
  139131. "ldr r12, [%[a], #52]\n\t"
  139132. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139133. "lsl r8, r10, #16\n\t"
  139134. "lsl r9, r12, #16\n\t"
  139135. "lsr r8, r8, #16\n\t"
  139136. "lsr r9, r9, #16\n\t"
  139137. "mul r9, r8, r9\n\t"
  139138. "adds r2, r2, r9\n\t"
  139139. "adcs r3, r3, #0\n\t"
  139140. "adc r4, r4, #0\n\t"
  139141. "adds r2, r2, r9\n\t"
  139142. "adcs r3, r3, #0\n\t"
  139143. "adc r4, r4, #0\n\t"
  139144. "lsr r9, r12, #16\n\t"
  139145. "mul r8, r9, r8\n\t"
  139146. "lsr r9, r8, #16\n\t"
  139147. "lsl r8, r8, #16\n\t"
  139148. "adds r2, r2, r8\n\t"
  139149. "adcs r3, r3, r9\n\t"
  139150. "adc r4, r4, #0\n\t"
  139151. "adds r2, r2, r8\n\t"
  139152. "adcs r3, r3, r9\n\t"
  139153. "adc r4, r4, #0\n\t"
  139154. "lsr r8, r10, #16\n\t"
  139155. "lsr r9, r12, #16\n\t"
  139156. "mul r9, r8, r9\n\t"
  139157. "adds r3, r3, r9\n\t"
  139158. "adc r4, r4, #0\n\t"
  139159. "adds r3, r3, r9\n\t"
  139160. "adc r4, r4, #0\n\t"
  139161. "lsl r9, r12, #16\n\t"
  139162. "lsr r9, r9, #16\n\t"
  139163. "mul r8, r9, r8\n\t"
  139164. "lsr r9, r8, #16\n\t"
  139165. "lsl r8, r8, #16\n\t"
  139166. "adds r2, r2, r8\n\t"
  139167. "adcs r3, r3, r9\n\t"
  139168. "adc r4, r4, #0\n\t"
  139169. "adds r2, r2, r8\n\t"
  139170. "adcs r3, r3, r9\n\t"
  139171. "adc r4, r4, #0\n\t"
  139172. #else
  139173. "umull r8, r9, r10, r12\n\t"
  139174. "adds r2, r2, r8\n\t"
  139175. "adcs r3, r3, r9\n\t"
  139176. "adc r4, r4, #0\n\t"
  139177. "adds r2, r2, r8\n\t"
  139178. "adcs r3, r3, r9\n\t"
  139179. "adc r4, r4, #0\n\t"
  139180. #endif
  139181. "str r2, [%[r], #108]\n\t"
  139182. /* A[13] * A[15] */
  139183. "ldr r10, [%[a], #60]\n\t"
  139184. "ldr r12, [%[a], #52]\n\t"
  139185. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139186. "lsl r8, r10, #16\n\t"
  139187. "lsl r9, r12, #16\n\t"
  139188. "lsr r8, r8, #16\n\t"
  139189. "lsr r9, r9, #16\n\t"
  139190. "mul r9, r8, r9\n\t"
  139191. "adds r3, r3, r9\n\t"
  139192. "adcs r4, r4, #0\n\t"
  139193. "mov r2, #0\n\t"
  139194. "adc r2, r2, #0\n\t"
  139195. "adds r3, r3, r9\n\t"
  139196. "adcs r4, r4, #0\n\t"
  139197. "adc r2, r2, #0\n\t"
  139198. "lsr r9, r12, #16\n\t"
  139199. "mul r8, r9, r8\n\t"
  139200. "lsr r9, r8, #16\n\t"
  139201. "lsl r8, r8, #16\n\t"
  139202. "adds r3, r3, r8\n\t"
  139203. "adcs r4, r4, r9\n\t"
  139204. "adc r2, r2, #0\n\t"
  139205. "adds r3, r3, r8\n\t"
  139206. "adcs r4, r4, r9\n\t"
  139207. "adc r2, r2, #0\n\t"
  139208. "lsr r8, r10, #16\n\t"
  139209. "lsr r9, r12, #16\n\t"
  139210. "mul r9, r8, r9\n\t"
  139211. "adds r4, r4, r9\n\t"
  139212. "adc r2, r2, #0\n\t"
  139213. "adds r4, r4, r9\n\t"
  139214. "adc r2, r2, #0\n\t"
  139215. "lsl r9, r12, #16\n\t"
  139216. "lsr r9, r9, #16\n\t"
  139217. "mul r8, r9, r8\n\t"
  139218. "lsr r9, r8, #16\n\t"
  139219. "lsl r8, r8, #16\n\t"
  139220. "adds r3, r3, r8\n\t"
  139221. "adcs r4, r4, r9\n\t"
  139222. "adc r2, r2, #0\n\t"
  139223. "adds r3, r3, r8\n\t"
  139224. "adcs r4, r4, r9\n\t"
  139225. "adc r2, r2, #0\n\t"
  139226. #else
  139227. "umull r8, r9, r10, r12\n\t"
  139228. "adds r3, r3, r8\n\t"
  139229. "adcs r4, r4, r9\n\t"
  139230. "mov r2, #0\n\t"
  139231. "adc r2, r2, #0\n\t"
  139232. "adds r3, r3, r8\n\t"
  139233. "adcs r4, r4, r9\n\t"
  139234. "mov r2, #0\n\t"
  139235. "adc r2, r2, #0\n\t"
  139236. #endif
  139237. /* A[14] * A[14] */
  139238. "ldr r10, [%[a], #56]\n\t"
  139239. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139240. "lsl r8, r10, #16\n\t"
  139241. "lsr r9, r10, #16\n\t"
  139242. "lsr r8, r8, #16\n\t"
  139243. "mov r12, r8\n\t"
  139244. "mul r8, r12, r8\n\t"
  139245. "mov r12, r9\n\t"
  139246. "mul r9, r12, r9\n\t"
  139247. "adds r3, r3, r8\n\t"
  139248. "adcs r4, r4, r9\n\t"
  139249. "adc r2, r2, #0\n\t"
  139250. "lsr r9, r10, #16\n\t"
  139251. "lsl r8, r10, #16\n\t"
  139252. "lsr r8, r8, #16\n\t"
  139253. "mul r8, r9, r8\n\t"
  139254. "lsr r9, r8, #15\n\t"
  139255. "lsl r8, r8, #17\n\t"
  139256. "adds r3, r3, r8\n\t"
  139257. "adcs r4, r4, r9\n\t"
  139258. "adc r2, r2, #0\n\t"
  139259. #else
  139260. "umull r8, r9, r10, r10\n\t"
  139261. "adds r3, r3, r8\n\t"
  139262. "adcs r4, r4, r9\n\t"
  139263. "adc r2, r2, #0\n\t"
  139264. #endif
  139265. "str r3, [%[r], #112]\n\t"
  139266. /* A[14] * A[15] */
  139267. "ldr r10, [%[a], #60]\n\t"
  139268. "ldr r12, [%[a], #56]\n\t"
  139269. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139270. "lsl r8, r10, #16\n\t"
  139271. "lsl r9, r12, #16\n\t"
  139272. "lsr r8, r8, #16\n\t"
  139273. "lsr r9, r9, #16\n\t"
  139274. "mul r9, r8, r9\n\t"
  139275. "adds r4, r4, r9\n\t"
  139276. "adcs r2, r2, #0\n\t"
  139277. "mov r3, #0\n\t"
  139278. "adc r3, r3, #0\n\t"
  139279. "adds r4, r4, r9\n\t"
  139280. "adcs r2, r2, #0\n\t"
  139281. "adc r3, r3, #0\n\t"
  139282. "lsr r9, r12, #16\n\t"
  139283. "mul r8, r9, r8\n\t"
  139284. "lsr r9, r8, #16\n\t"
  139285. "lsl r8, r8, #16\n\t"
  139286. "adds r4, r4, r8\n\t"
  139287. "adcs r2, r2, r9\n\t"
  139288. "adc r3, r3, #0\n\t"
  139289. "adds r4, r4, r8\n\t"
  139290. "adcs r2, r2, r9\n\t"
  139291. "adc r3, r3, #0\n\t"
  139292. "lsr r8, r10, #16\n\t"
  139293. "lsr r9, r12, #16\n\t"
  139294. "mul r9, r8, r9\n\t"
  139295. "adds r2, r2, r9\n\t"
  139296. "adc r3, r3, #0\n\t"
  139297. "adds r2, r2, r9\n\t"
  139298. "adc r3, r3, #0\n\t"
  139299. "lsl r9, r12, #16\n\t"
  139300. "lsr r9, r9, #16\n\t"
  139301. "mul r8, r9, r8\n\t"
  139302. "lsr r9, r8, #16\n\t"
  139303. "lsl r8, r8, #16\n\t"
  139304. "adds r4, r4, r8\n\t"
  139305. "adcs r2, r2, r9\n\t"
  139306. "adc r3, r3, #0\n\t"
  139307. "adds r4, r4, r8\n\t"
  139308. "adcs r2, r2, r9\n\t"
  139309. "adc r3, r3, #0\n\t"
  139310. #else
  139311. "umull r8, r9, r10, r12\n\t"
  139312. "adds r4, r4, r8\n\t"
  139313. "adcs r2, r2, r9\n\t"
  139314. "mov r3, #0\n\t"
  139315. "adc r3, r3, #0\n\t"
  139316. "adds r4, r4, r8\n\t"
  139317. "adcs r2, r2, r9\n\t"
  139318. "mov r3, #0\n\t"
  139319. "adc r3, r3, #0\n\t"
  139320. #endif
  139321. "str r4, [%[r], #116]\n\t"
  139322. /* A[15] * A[15] */
  139323. "ldr r10, [%[a], #60]\n\t"
  139324. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139325. "lsl r8, r10, #16\n\t"
  139326. "lsr r9, r10, #16\n\t"
  139327. "lsr r8, r8, #16\n\t"
  139328. "mov r12, r8\n\t"
  139329. "mul r8, r12, r8\n\t"
  139330. "mov r12, r9\n\t"
  139331. "mul r9, r12, r9\n\t"
  139332. "adds r2, r2, r8\n\t"
  139333. "adc r3, r3, r9\n\t"
  139334. "lsr r9, r10, #16\n\t"
  139335. "lsl r8, r10, #16\n\t"
  139336. "lsr r8, r8, #16\n\t"
  139337. "mul r8, r9, r8\n\t"
  139338. "lsr r9, r8, #15\n\t"
  139339. "lsl r8, r8, #17\n\t"
  139340. "adds r2, r2, r8\n\t"
  139341. "adc r3, r3, r9\n\t"
  139342. #else
  139343. "umull r8, r9, r10, r10\n\t"
  139344. "adds r2, r2, r8\n\t"
  139345. "adc r3, r3, r9\n\t"
  139346. #endif
  139347. "str r2, [%[r], #120]\n\t"
  139348. "str r3, [%[r], #124]\n\t"
  139349. "ldm sp!, {r2, r3, r4, r8}\n\t"
  139350. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  139351. "ldm sp!, {r2, r3, r4, r8}\n\t"
  139352. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  139353. "ldm sp!, {r2, r3, r4, r8}\n\t"
  139354. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  139355. "ldm sp!, {r2, r3, r4, r8}\n\t"
  139356. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  139357. : [r] "+r" (r), [a] "+r" (a)
  139358. :
  139359. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc"
  139360. );
  139361. }
  139362. /* Add b to a into r. (r = a + b)
  139363. *
  139364. * r A single precision integer.
  139365. * a A single precision integer.
  139366. * b A single precision integer.
  139367. */
  139368. static sp_digit sp_1024_add_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  139369. {
  139370. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  139371. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  139372. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  139373. __asm__ __volatile__ (
  139374. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139375. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139376. "adds r3, r3, r7\n\t"
  139377. "adcs r4, r4, r8\n\t"
  139378. "adcs r5, r5, r9\n\t"
  139379. "adcs r6, r6, r10\n\t"
  139380. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139381. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139382. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139383. "adcs r3, r3, r7\n\t"
  139384. "adcs r4, r4, r8\n\t"
  139385. "adcs r5, r5, r9\n\t"
  139386. "adcs r6, r6, r10\n\t"
  139387. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139388. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139389. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139390. "adcs r3, r3, r7\n\t"
  139391. "adcs r4, r4, r8\n\t"
  139392. "adcs r5, r5, r9\n\t"
  139393. "adcs r6, r6, r10\n\t"
  139394. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139395. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139396. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139397. "adcs r3, r3, r7\n\t"
  139398. "adcs r4, r4, r8\n\t"
  139399. "adcs r5, r5, r9\n\t"
  139400. "adcs r6, r6, r10\n\t"
  139401. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139402. "mov %[r], #0\n\t"
  139403. "adc %[r], %[r], #0\n\t"
  139404. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  139405. :
  139406. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  139407. );
  139408. return (uint32_t)(size_t)r;
  139409. }
  139410. /* Sub b from a into a. (a -= b)
  139411. *
  139412. * a A single precision integer and result.
  139413. * b A single precision integer.
  139414. */
  139415. static sp_digit sp_1024_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p)
  139416. {
  139417. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  139418. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  139419. __asm__ __volatile__ (
  139420. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139421. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139422. "subs r2, r2, r6\n\t"
  139423. "sbcs r3, r3, r7\n\t"
  139424. "sbcs r4, r4, r8\n\t"
  139425. "sbcs r5, r5, r9\n\t"
  139426. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139427. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139428. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139429. "sbcs r2, r2, r6\n\t"
  139430. "sbcs r3, r3, r7\n\t"
  139431. "sbcs r4, r4, r8\n\t"
  139432. "sbcs r5, r5, r9\n\t"
  139433. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139434. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139435. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139436. "sbcs r2, r2, r6\n\t"
  139437. "sbcs r3, r3, r7\n\t"
  139438. "sbcs r4, r4, r8\n\t"
  139439. "sbcs r5, r5, r9\n\t"
  139440. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139441. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139442. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139443. "sbcs r2, r2, r6\n\t"
  139444. "sbcs r3, r3, r7\n\t"
  139445. "sbcs r4, r4, r8\n\t"
  139446. "sbcs r5, r5, r9\n\t"
  139447. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139448. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139449. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139450. "sbcs r2, r2, r6\n\t"
  139451. "sbcs r3, r3, r7\n\t"
  139452. "sbcs r4, r4, r8\n\t"
  139453. "sbcs r5, r5, r9\n\t"
  139454. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139455. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139456. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139457. "sbcs r2, r2, r6\n\t"
  139458. "sbcs r3, r3, r7\n\t"
  139459. "sbcs r4, r4, r8\n\t"
  139460. "sbcs r5, r5, r9\n\t"
  139461. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139462. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139463. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139464. "sbcs r2, r2, r6\n\t"
  139465. "sbcs r3, r3, r7\n\t"
  139466. "sbcs r4, r4, r8\n\t"
  139467. "sbcs r5, r5, r9\n\t"
  139468. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139469. "ldm %[a], {r2, r3, r4, r5}\n\t"
  139470. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  139471. "sbcs r2, r2, r6\n\t"
  139472. "sbcs r3, r3, r7\n\t"
  139473. "sbcs r4, r4, r8\n\t"
  139474. "sbcs r5, r5, r9\n\t"
  139475. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  139476. "sbc %[a], r9, r9\n\t"
  139477. : [a] "+r" (a), [b] "+r" (b)
  139478. :
  139479. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  139480. );
  139481. return (uint32_t)(size_t)a;
  139482. }
  139483. /* Add b to a into r. (r = a + b)
  139484. *
  139485. * r A single precision integer.
  139486. * a A single precision integer.
  139487. * b A single precision integer.
  139488. */
  139489. static sp_digit sp_1024_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  139490. {
  139491. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  139492. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  139493. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  139494. __asm__ __volatile__ (
  139495. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139496. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139497. "adds r3, r3, r7\n\t"
  139498. "adcs r4, r4, r8\n\t"
  139499. "adcs r5, r5, r9\n\t"
  139500. "adcs r6, r6, r10\n\t"
  139501. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139502. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139503. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139504. "adcs r3, r3, r7\n\t"
  139505. "adcs r4, r4, r8\n\t"
  139506. "adcs r5, r5, r9\n\t"
  139507. "adcs r6, r6, r10\n\t"
  139508. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139509. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139510. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139511. "adcs r3, r3, r7\n\t"
  139512. "adcs r4, r4, r8\n\t"
  139513. "adcs r5, r5, r9\n\t"
  139514. "adcs r6, r6, r10\n\t"
  139515. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139516. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139517. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139518. "adcs r3, r3, r7\n\t"
  139519. "adcs r4, r4, r8\n\t"
  139520. "adcs r5, r5, r9\n\t"
  139521. "adcs r6, r6, r10\n\t"
  139522. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139523. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139524. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139525. "adcs r3, r3, r7\n\t"
  139526. "adcs r4, r4, r8\n\t"
  139527. "adcs r5, r5, r9\n\t"
  139528. "adcs r6, r6, r10\n\t"
  139529. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139530. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139531. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139532. "adcs r3, r3, r7\n\t"
  139533. "adcs r4, r4, r8\n\t"
  139534. "adcs r5, r5, r9\n\t"
  139535. "adcs r6, r6, r10\n\t"
  139536. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139537. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139538. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139539. "adcs r3, r3, r7\n\t"
  139540. "adcs r4, r4, r8\n\t"
  139541. "adcs r5, r5, r9\n\t"
  139542. "adcs r6, r6, r10\n\t"
  139543. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139544. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139545. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139546. "adcs r3, r3, r7\n\t"
  139547. "adcs r4, r4, r8\n\t"
  139548. "adcs r5, r5, r9\n\t"
  139549. "adcs r6, r6, r10\n\t"
  139550. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139551. "mov %[r], #0\n\t"
  139552. "adc %[r], %[r], #0\n\t"
  139553. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  139554. :
  139555. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  139556. );
  139557. return (uint32_t)(size_t)r;
  139558. }
  139559. /* AND m into each word of a and store in r.
  139560. *
  139561. * r A single precision integer.
  139562. * a A single precision integer.
  139563. * m Mask to AND against each digit.
  139564. */
  139565. static void sp_1024_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  139566. {
  139567. #ifdef WOLFSSL_SP_SMALL
  139568. int i;
  139569. for (i=0; i<16; i++) {
  139570. r[i] = a[i] & m;
  139571. }
  139572. #else
  139573. int i;
  139574. for (i = 0; i < 16; i += 8) {
  139575. r[i+0] = a[i+0] & m;
  139576. r[i+1] = a[i+1] & m;
  139577. r[i+2] = a[i+2] & m;
  139578. r[i+3] = a[i+3] & m;
  139579. r[i+4] = a[i+4] & m;
  139580. r[i+5] = a[i+5] & m;
  139581. r[i+6] = a[i+6] & m;
  139582. r[i+7] = a[i+7] & m;
  139583. }
  139584. #endif
  139585. }
  139586. /* Multiply a and b into r. (r = a * b)
  139587. *
  139588. * r A single precision integer.
  139589. * a A single precision integer.
  139590. * b A single precision integer.
  139591. */
  139592. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  139593. const sp_digit* b)
  139594. {
  139595. sp_digit* z0 = r;
  139596. sp_digit z1[32];
  139597. sp_digit a1[16];
  139598. sp_digit b1[16];
  139599. sp_digit* z2 = r + 32;
  139600. sp_digit u;
  139601. sp_digit ca;
  139602. sp_digit cb;
  139603. ca = sp_1024_add_16(a1, a, &a[16]);
  139604. cb = sp_1024_add_16(b1, b, &b[16]);
  139605. u = ca & cb;
  139606. sp_1024_mul_16(z2, &a[16], &b[16]);
  139607. sp_1024_mul_16(z0, a, b);
  139608. sp_1024_mul_16(z1, a1, b1);
  139609. u += sp_1024_sub_in_place_32(z1, z0);
  139610. u += sp_1024_sub_in_place_32(z1, z2);
  139611. sp_1024_mask_16(a1, a1, 0 - cb);
  139612. u += sp_1024_add_16(z1 + 16, z1 + 16, a1);
  139613. sp_1024_mask_16(b1, b1, 0 - ca);
  139614. u += sp_1024_add_16(z1 + 16, z1 + 16, b1);
  139615. u += sp_1024_add_32(r + 16, r + 16, z1);
  139616. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (16 - 1));
  139617. a1[0] = u;
  139618. (void)sp_1024_add_16(r + 48, r + 48, a1);
  139619. }
  139620. /* Sub b from a into r. (r = a - b)
  139621. *
  139622. * r A single precision integer.
  139623. * a A single precision integer.
  139624. * b A single precision integer.
  139625. */
  139626. static sp_digit sp_1024_sub_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  139627. {
  139628. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  139629. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  139630. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  139631. __asm__ __volatile__ (
  139632. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139633. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139634. "subs r3, r3, r7\n\t"
  139635. "sbcs r4, r4, r8\n\t"
  139636. "sbcs r5, r5, r9\n\t"
  139637. "sbcs r6, r6, r10\n\t"
  139638. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139639. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139640. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139641. "sbcs r3, r3, r7\n\t"
  139642. "sbcs r4, r4, r8\n\t"
  139643. "sbcs r5, r5, r9\n\t"
  139644. "sbcs r6, r6, r10\n\t"
  139645. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139646. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139647. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139648. "sbcs r3, r3, r7\n\t"
  139649. "sbcs r4, r4, r8\n\t"
  139650. "sbcs r5, r5, r9\n\t"
  139651. "sbcs r6, r6, r10\n\t"
  139652. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139653. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  139654. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  139655. "sbcs r3, r3, r7\n\t"
  139656. "sbcs r4, r4, r8\n\t"
  139657. "sbcs r5, r5, r9\n\t"
  139658. "sbcs r6, r6, r10\n\t"
  139659. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  139660. "sbc %[r], r6, r6\n\t"
  139661. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  139662. :
  139663. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc"
  139664. );
  139665. return (uint32_t)(size_t)r;
  139666. }
  139667. /* Square a and put result in r. (r = a * a)
  139668. *
  139669. * r A single precision integer.
  139670. * a A single precision integer.
  139671. */
  139672. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  139673. {
  139674. sp_digit* z0 = r;
  139675. sp_digit* z2 = r + 32;
  139676. sp_digit z1[32];
  139677. sp_digit* a1 = z1;
  139678. sp_digit zero[16];
  139679. sp_digit u;
  139680. sp_digit mask;
  139681. sp_digit* p1;
  139682. sp_digit* p2;
  139683. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  139684. mask = sp_1024_sub_16(a1, a, &a[16]);
  139685. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  139686. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  139687. (void)sp_1024_sub_16(a1, p1, p2);
  139688. sp_1024_sqr_16(z2, &a[16]);
  139689. sp_1024_sqr_16(z0, a);
  139690. sp_1024_sqr_16(z1, a1);
  139691. u = 0;
  139692. u -= sp_1024_sub_in_place_32(z1, z2);
  139693. u -= sp_1024_sub_in_place_32(z1, z0);
  139694. u += sp_1024_sub_in_place_32(r + 16, z1);
  139695. zero[0] = u;
  139696. (void)sp_1024_add_16(r + 48, r + 48, zero);
  139697. }
  139698. #else
  139699. /* Multiply a and b into r. (r = a * b)
  139700. *
  139701. * r A single precision integer.
  139702. * a A single precision integer.
  139703. * b A single precision integer.
  139704. */
  139705. static void sp_1024_mul_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  139706. {
  139707. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  139708. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  139709. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  139710. __asm__ __volatile__ (
  139711. "sub sp, sp, #0x100\n\t"
  139712. "ldr lr, [%[a]]\n\t"
  139713. "ldr r11, [%[b]]\n\t"
  139714. "umull r8, r6, lr, r11\n\t"
  139715. "str r8, [sp]\n\t"
  139716. "mov r7, #0\n\t"
  139717. "mov r8, #0\n\t"
  139718. "mov r5, #4\n\t"
  139719. "\n"
  139720. "L_sp_1024_mul_32_outer_%=: \n\t"
  139721. "subs r3, r5, #0x7c\n\t"
  139722. "it cc\n\t"
  139723. "movcc r3, #0\n\t"
  139724. "sub r4, r5, r3\n\t"
  139725. "\n"
  139726. "L_sp_1024_mul_32_inner_%=: \n\t"
  139727. "ldr lr, [%[a], r3]\n\t"
  139728. "ldr r11, [%[b], r4]\n\t"
  139729. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139730. "lsl r9, lr, #16\n\t"
  139731. "lsl r10, r11, #16\n\t"
  139732. "lsr r9, r9, #16\n\t"
  139733. "lsr r10, r10, #16\n\t"
  139734. "mul r10, r9, r10\n\t"
  139735. "adds r6, r6, r10\n\t"
  139736. "adcs r7, r7, #0\n\t"
  139737. "adc r8, r8, #0\n\t"
  139738. "lsr r10, r11, #16\n\t"
  139739. "mul r9, r10, r9\n\t"
  139740. "lsr r10, r9, #16\n\t"
  139741. "lsl r9, r9, #16\n\t"
  139742. "adds r6, r6, r9\n\t"
  139743. "adcs r7, r7, r10\n\t"
  139744. "adc r8, r8, #0\n\t"
  139745. "lsr r9, lr, #16\n\t"
  139746. "lsr r10, r11, #16\n\t"
  139747. "mul r10, r9, r10\n\t"
  139748. "adds r7, r7, r10\n\t"
  139749. "adc r8, r8, #0\n\t"
  139750. "lsl r10, r11, #16\n\t"
  139751. "lsr r10, r10, #16\n\t"
  139752. "mul r9, r10, r9\n\t"
  139753. "lsr r10, r9, #16\n\t"
  139754. "lsl r9, r9, #16\n\t"
  139755. "adds r6, r6, r9\n\t"
  139756. "adcs r7, r7, r10\n\t"
  139757. "adc r8, r8, #0\n\t"
  139758. #else
  139759. "umull r9, r10, lr, r11\n\t"
  139760. "adds r6, r6, r9\n\t"
  139761. "adcs r7, r7, r10\n\t"
  139762. "adc r8, r8, #0\n\t"
  139763. #endif
  139764. "ldr lr, [%[a], r4]\n\t"
  139765. "ldr r11, [%[b], r3]\n\t"
  139766. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139767. "lsl r9, lr, #16\n\t"
  139768. "lsl r10, r11, #16\n\t"
  139769. "lsr r9, r9, #16\n\t"
  139770. "lsr r10, r10, #16\n\t"
  139771. "mul r10, r9, r10\n\t"
  139772. "adds r6, r6, r10\n\t"
  139773. "adcs r7, r7, #0\n\t"
  139774. "adc r8, r8, #0\n\t"
  139775. "lsr r10, r11, #16\n\t"
  139776. "mul r9, r10, r9\n\t"
  139777. "lsr r10, r9, #16\n\t"
  139778. "lsl r9, r9, #16\n\t"
  139779. "adds r6, r6, r9\n\t"
  139780. "adcs r7, r7, r10\n\t"
  139781. "adc r8, r8, #0\n\t"
  139782. "lsr r9, lr, #16\n\t"
  139783. "lsr r10, r11, #16\n\t"
  139784. "mul r10, r9, r10\n\t"
  139785. "adds r7, r7, r10\n\t"
  139786. "adc r8, r8, #0\n\t"
  139787. "lsl r10, r11, #16\n\t"
  139788. "lsr r10, r10, #16\n\t"
  139789. "mul r9, r10, r9\n\t"
  139790. "lsr r10, r9, #16\n\t"
  139791. "lsl r9, r9, #16\n\t"
  139792. "adds r6, r6, r9\n\t"
  139793. "adcs r7, r7, r10\n\t"
  139794. "adc r8, r8, #0\n\t"
  139795. #else
  139796. "umull r9, r10, lr, r11\n\t"
  139797. "adds r6, r6, r9\n\t"
  139798. "adcs r7, r7, r10\n\t"
  139799. "adc r8, r8, #0\n\t"
  139800. #endif
  139801. "add r3, r3, #4\n\t"
  139802. "sub r4, r4, #4\n\t"
  139803. "cmp r3, r4\n\t"
  139804. "bgt L_sp_1024_mul_32_inner_done_%=\n\t"
  139805. "blt L_sp_1024_mul_32_inner_%=\n\t"
  139806. "ldr lr, [%[a], r3]\n\t"
  139807. "ldr r11, [%[b], r3]\n\t"
  139808. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139809. "lsl r9, lr, #16\n\t"
  139810. "lsl r10, r11, #16\n\t"
  139811. "lsr r9, r9, #16\n\t"
  139812. "lsr r10, r10, #16\n\t"
  139813. "mul r10, r9, r10\n\t"
  139814. "adds r6, r6, r10\n\t"
  139815. "adcs r7, r7, #0\n\t"
  139816. "adc r8, r8, #0\n\t"
  139817. "lsr r10, r11, #16\n\t"
  139818. "mul r9, r10, r9\n\t"
  139819. "lsr r10, r9, #16\n\t"
  139820. "lsl r9, r9, #16\n\t"
  139821. "adds r6, r6, r9\n\t"
  139822. "adcs r7, r7, r10\n\t"
  139823. "adc r8, r8, #0\n\t"
  139824. "lsr r9, lr, #16\n\t"
  139825. "lsr r10, r11, #16\n\t"
  139826. "mul r10, r9, r10\n\t"
  139827. "adds r7, r7, r10\n\t"
  139828. "adc r8, r8, #0\n\t"
  139829. "lsl r10, r11, #16\n\t"
  139830. "lsr r10, r10, #16\n\t"
  139831. "mul r9, r10, r9\n\t"
  139832. "lsr r10, r9, #16\n\t"
  139833. "lsl r9, r9, #16\n\t"
  139834. "adds r6, r6, r9\n\t"
  139835. "adcs r7, r7, r10\n\t"
  139836. "adc r8, r8, #0\n\t"
  139837. #else
  139838. "umull r9, r10, lr, r11\n\t"
  139839. "adds r6, r6, r9\n\t"
  139840. "adcs r7, r7, r10\n\t"
  139841. "adc r8, r8, #0\n\t"
  139842. #endif
  139843. "\n"
  139844. "L_sp_1024_mul_32_inner_done_%=: \n\t"
  139845. "str r6, [sp, r5]\n\t"
  139846. "mov r6, r7\n\t"
  139847. "mov r7, r8\n\t"
  139848. "mov r8, #0\n\t"
  139849. "add r5, r5, #4\n\t"
  139850. "cmp r5, #0xf4\n\t"
  139851. "ble L_sp_1024_mul_32_outer_%=\n\t"
  139852. "ldr lr, [%[a], #124]\n\t"
  139853. "ldr r11, [%[b], #124]\n\t"
  139854. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139855. "lsl r9, lr, #16\n\t"
  139856. "lsl r10, r11, #16\n\t"
  139857. "lsr r9, r9, #16\n\t"
  139858. "lsr r10, r10, #16\n\t"
  139859. "mul r10, r9, r10\n\t"
  139860. "adds r6, r6, r10\n\t"
  139861. "adc r7, r7, #0\n\t"
  139862. "lsr r10, r11, #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. "adc r7, r7, r10\n\t"
  139868. "lsr r9, lr, #16\n\t"
  139869. "lsr r10, r11, #16\n\t"
  139870. "mul r10, r9, r10\n\t"
  139871. "add r7, r7, r10\n\t"
  139872. "lsl r10, r11, #16\n\t"
  139873. "lsr r10, r10, #16\n\t"
  139874. "mul r9, r10, r9\n\t"
  139875. "lsr r10, r9, #16\n\t"
  139876. "lsl r9, r9, #16\n\t"
  139877. "adds r6, r6, r9\n\t"
  139878. "adc r7, r7, r10\n\t"
  139879. #else
  139880. "umlal r6, r7, lr, r11\n\t"
  139881. #endif
  139882. "str r6, [sp, r5]\n\t"
  139883. "add r5, r5, #4\n\t"
  139884. "str r7, [sp, r5]\n\t"
  139885. "\n"
  139886. "L_sp_1024_mul_32_store_%=: \n\t"
  139887. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  139888. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  139889. "subs r5, r5, #32\n\t"
  139890. "bgt L_sp_1024_mul_32_store_%=\n\t"
  139891. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  139892. :
  139893. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  139894. );
  139895. }
  139896. /* Square a and put result in r. (r = a * a)
  139897. *
  139898. * r A single precision integer.
  139899. * a A single precision integer.
  139900. */
  139901. static void sp_1024_sqr_32(sp_digit* r_p, const sp_digit* a_p)
  139902. {
  139903. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  139904. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  139905. __asm__ __volatile__ (
  139906. "sub sp, sp, #0x100\n\t"
  139907. "ldr lr, [%[a]]\n\t"
  139908. "umull r8, r6, lr, lr\n\t"
  139909. "str r8, [sp]\n\t"
  139910. "mov r7, #0\n\t"
  139911. "mov r8, #0\n\t"
  139912. "mov r5, #4\n\t"
  139913. "\n"
  139914. "L_sp_1024_sqr_32_outer_%=: \n\t"
  139915. "subs r3, r5, #0x7c\n\t"
  139916. "it cc\n\t"
  139917. "movcc r3, #0\n\t"
  139918. "sub r4, r5, r3\n\t"
  139919. "\n"
  139920. "L_sp_1024_sqr_32_inner_%=: \n\t"
  139921. "ldr lr, [%[a], r3]\n\t"
  139922. "ldr r11, [%[a], r4]\n\t"
  139923. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139924. "lsl r9, lr, #16\n\t"
  139925. "lsl r10, r11, #16\n\t"
  139926. "lsr r9, r9, #16\n\t"
  139927. "lsr r10, r10, #16\n\t"
  139928. "mul r10, r9, r10\n\t"
  139929. "adds r6, r6, r10\n\t"
  139930. "adcs r7, r7, #0\n\t"
  139931. "adc r8, r8, #0\n\t"
  139932. "adds r6, r6, r10\n\t"
  139933. "adcs r7, r7, #0\n\t"
  139934. "adc r8, r8, #0\n\t"
  139935. "lsr r10, r11, #16\n\t"
  139936. "mul r9, r10, r9\n\t"
  139937. "lsr r10, r9, #16\n\t"
  139938. "lsl r9, r9, #16\n\t"
  139939. "adds r6, r6, r9\n\t"
  139940. "adcs r7, r7, r10\n\t"
  139941. "adc r8, r8, #0\n\t"
  139942. "adds r6, r6, r9\n\t"
  139943. "adcs r7, r7, r10\n\t"
  139944. "adc r8, r8, #0\n\t"
  139945. "lsr r9, lr, #16\n\t"
  139946. "lsr r10, r11, #16\n\t"
  139947. "mul r10, r9, r10\n\t"
  139948. "adds r7, r7, r10\n\t"
  139949. "adc r8, r8, #0\n\t"
  139950. "adds r7, r7, r10\n\t"
  139951. "adc r8, r8, #0\n\t"
  139952. "lsl r10, r11, #16\n\t"
  139953. "lsr r10, r10, #16\n\t"
  139954. "mul r9, r10, r9\n\t"
  139955. "lsr r10, r9, #16\n\t"
  139956. "lsl r9, r9, #16\n\t"
  139957. "adds r6, r6, r9\n\t"
  139958. "adcs r7, r7, r10\n\t"
  139959. "adc r8, r8, #0\n\t"
  139960. "adds r6, r6, r9\n\t"
  139961. "adcs r7, r7, r10\n\t"
  139962. "adc r8, r8, #0\n\t"
  139963. #else
  139964. "umull r9, r10, lr, r11\n\t"
  139965. "adds r6, r6, r9\n\t"
  139966. "adcs r7, r7, r10\n\t"
  139967. "adc r8, r8, #0\n\t"
  139968. "adds r6, r6, r9\n\t"
  139969. "adcs r7, r7, r10\n\t"
  139970. "adc r8, r8, #0\n\t"
  139971. #endif
  139972. "add r3, r3, #4\n\t"
  139973. "sub r4, r4, #4\n\t"
  139974. "cmp r3, r4\n\t"
  139975. "bgt L_sp_1024_sqr_32_inner_done_%=\n\t"
  139976. "blt L_sp_1024_sqr_32_inner_%=\n\t"
  139977. "ldr lr, [%[a], r3]\n\t"
  139978. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  139979. "lsl r9, lr, #16\n\t"
  139980. "lsr r10, lr, #16\n\t"
  139981. "lsr r9, r9, #16\n\t"
  139982. "mov r11, r9\n\t"
  139983. "mul r9, r11, r9\n\t"
  139984. "mov r11, r10\n\t"
  139985. "mul r10, r11, r10\n\t"
  139986. "adds r6, r6, r9\n\t"
  139987. "adcs r7, r7, r10\n\t"
  139988. "adc r8, r8, #0\n\t"
  139989. "lsr r10, lr, #16\n\t"
  139990. "lsl r9, lr, #16\n\t"
  139991. "lsr r9, r9, #16\n\t"
  139992. "mul r9, r10, r9\n\t"
  139993. "lsr r10, r9, #15\n\t"
  139994. "lsl r9, r9, #17\n\t"
  139995. "adds r6, r6, r9\n\t"
  139996. "adcs r7, r7, r10\n\t"
  139997. "adc r8, r8, #0\n\t"
  139998. #else
  139999. "umull r9, r10, lr, lr\n\t"
  140000. "adds r6, r6, r9\n\t"
  140001. "adcs r7, r7, r10\n\t"
  140002. "adc r8, r8, #0\n\t"
  140003. #endif
  140004. "\n"
  140005. "L_sp_1024_sqr_32_inner_done_%=: \n\t"
  140006. "str r6, [sp, r5]\n\t"
  140007. "mov r6, r7\n\t"
  140008. "mov r7, r8\n\t"
  140009. "mov r8, #0\n\t"
  140010. "add r5, r5, #4\n\t"
  140011. "cmp r5, #0xf4\n\t"
  140012. "ble L_sp_1024_sqr_32_outer_%=\n\t"
  140013. "ldr lr, [%[a], #124]\n\t"
  140014. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140015. "lsl r9, lr, #16\n\t"
  140016. "lsr r10, lr, #16\n\t"
  140017. "lsr r9, r9, #16\n\t"
  140018. "mov r11, r9\n\t"
  140019. "mul r9, r11, r9\n\t"
  140020. "mov r11, r10\n\t"
  140021. "mul r10, r11, r10\n\t"
  140022. "adds r6, r6, r9\n\t"
  140023. "adc r7, r7, r10\n\t"
  140024. "lsr r10, lr, #16\n\t"
  140025. "lsl r9, lr, #16\n\t"
  140026. "lsr r9, r9, #16\n\t"
  140027. "mul r9, r10, r9\n\t"
  140028. "lsr r10, r9, #15\n\t"
  140029. "lsl r9, r9, #17\n\t"
  140030. "adds r6, r6, r9\n\t"
  140031. "adc r7, r7, r10\n\t"
  140032. #else
  140033. "umull r9, r10, lr, lr\n\t"
  140034. "adds r6, r6, r9\n\t"
  140035. "adc r7, r7, r10\n\t"
  140036. #endif
  140037. "str r6, [sp, r5]\n\t"
  140038. "add r5, r5, #4\n\t"
  140039. "str r7, [sp, r5]\n\t"
  140040. "\n"
  140041. "L_sp_1024_sqr_32_store_%=: \n\t"
  140042. "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  140043. "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t"
  140044. "subs r5, r5, #32\n\t"
  140045. "bgt L_sp_1024_sqr_32_store_%=\n\t"
  140046. : [r] "+r" (r), [a] "+r" (a)
  140047. :
  140048. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc"
  140049. );
  140050. }
  140051. #endif /* !WOLFSSL_SP_SMALL */
  140052. /* The modulus (prime) of the curve P1024. */
  140053. static const sp_digit p1024_mod[32] = {
  140054. 0xfea85feb,0x666d807a,0xac7ace87,0x80c5df10,0x89857db0,0xfce3e823,
  140055. 0x56971f1f,0x9f94d6af,0x1c3c09aa,0xa7cf3c52,0x31852a82,0xb6aff4a8,
  140056. 0x65681ce1,0x512ac5cd,0x326b4cd4,0xe26c6487,0xa666a6d0,0x356d27f4,
  140057. 0xf7c88a19,0xe791b39f,0x31a59cb0,0x228730d5,0xe2fc0f1b,0xf40aab27,
  140058. 0xb3e01a2e,0xbe9ae358,0x9cb48261,0x416c0ce1,0xdad0657a,0x65c61198,
  140059. 0x0a563fda,0x997abb1f
  140060. };
  140061. /* The Montgomery normalizer for modulus of the curve P1024. */
  140062. static const sp_digit p1024_norm_mod[32] = {
  140063. 0x0157a015,0x99927f85,0x53853178,0x7f3a20ef,0x767a824f,0x031c17dc,
  140064. 0xa968e0e0,0x606b2950,0xe3c3f655,0x5830c3ad,0xce7ad57d,0x49500b57,
  140065. 0x9a97e31e,0xaed53a32,0xcd94b32b,0x1d939b78,0x5999592f,0xca92d80b,
  140066. 0x083775e6,0x186e4c60,0xce5a634f,0xdd78cf2a,0x1d03f0e4,0x0bf554d8,
  140067. 0x4c1fe5d1,0x41651ca7,0x634b7d9e,0xbe93f31e,0x252f9a85,0x9a39ee67,
  140068. 0xf5a9c025,0x668544e0
  140069. };
  140070. /* The Montgomery multiplier for modulus of the curve P1024. */
  140071. static sp_digit p1024_mp_mod = 0x7c8f2f3d;
  140072. #if defined(WOLFSSL_SP_SMALL) || defined(HAVE_ECC_CHECK_KEY)
  140073. /* The order of the curve P1024. */
  140074. static const sp_digit p1024_order[32] = {
  140075. 0xbfaa17fb,0xd99b601e,0x2b1eb3a1,0x203177c4,0xe2615f6c,0xff38fa08,
  140076. 0xd5a5c7c7,0xa7e535ab,0x870f026a,0xa9f3cf14,0x0c614aa0,0x6dabfd2a,
  140077. 0x595a0738,0x144ab173,0xcc9ad335,0x389b1921,0x2999a9b4,0x4d5b49fd,
  140078. 0xfdf22286,0x39e46ce7,0x4c69672c,0xc8a1cc35,0xf8bf03c6,0xbd02aac9,
  140079. 0x2cf8068b,0x6fa6b8d6,0x672d2098,0x905b0338,0x36b4195e,0x99718466,
  140080. 0xc2958ff6,0x265eaec7
  140081. };
  140082. #endif
  140083. /* The base point of curve P1024. */
  140084. static const sp_point_1024 p1024_base = {
  140085. /* X ordinate */
  140086. {
  140087. 0xeae63895,0x880dc8ab,0x967e0979,0x80ec46c4,0xb63f73ec,0xee9163a5,
  140088. 0x80728d87,0xd5cfb4cc,0xba66910d,0xa7c1514d,0x7a60de74,0xa702c339,
  140089. 0x8b72f2e1,0x337c8654,0x5dd5bccb,0x9760af76,0x406ce890,0x718bd9e7,
  140090. 0xdb9dfa55,0x43d5f22c,0x30b09e10,0xab10db90,0xf6ce2308,0xb5edb6c0,
  140091. 0xb6ff7cbf,0x98b2f204,0x0aec69c6,0x2b1a2fd6,0x3ed9b52a,0x0a799005,
  140092. 0x332c29ad,0x53fc09ee,
  140093. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140094. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140095. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140096. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140097. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140098. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140099. (sp_digit)0, (sp_digit)0
  140100. },
  140101. /* Y ordinate */
  140102. {
  140103. 0x1bef16d7,0x75573fd7,0x6a67dcde,0xadb9b570,0xd5bb4636,0x80bdad5a,
  140104. 0xe9cb99a9,0x13515ad7,0xc5a4d5f2,0x492d979f,0x164aa989,0xac6f1e80,
  140105. 0xb7652fe0,0xcad696b5,0xad547c6c,0x70dae117,0xa9e032b9,0x416cff0c,
  140106. 0x9a140b2e,0x6b598ccf,0xf0de55f6,0xe7f7f5e5,0x654ec2b9,0xf5ea69f4,
  140107. 0x1e141178,0x3d778d82,0x02990696,0xd3e82016,0x3634a135,0xf9f1f053,
  140108. 0x3f6009f1,0x0a824906,
  140109. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140110. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140111. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140112. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140113. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140114. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140115. (sp_digit)0, (sp_digit)0
  140116. },
  140117. /* Z ordinate */
  140118. {
  140119. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  140120. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  140121. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  140122. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  140123. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  140124. 0x00000000,0x00000000,
  140125. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140126. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140127. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140128. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140129. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140130. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  140131. (sp_digit)0, (sp_digit)0
  140132. },
  140133. /* infinity */
  140134. 0
  140135. };
  140136. #ifdef WOLFSSL_SP_SMALL
  140137. /* Sub b from a into a. (a -= b)
  140138. *
  140139. * a A single precision integer.
  140140. * b A single precision integer.
  140141. */
  140142. static sp_digit sp_1024_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p)
  140143. {
  140144. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  140145. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  140146. __asm__ __volatile__ (
  140147. "mov r12, #0\n\t"
  140148. "add lr, %[a], #0x80\n\t"
  140149. "\n"
  140150. "L_sp_1024_sub_in_pkace_32_word_%=: \n\t"
  140151. "rsbs r12, r12, #0\n\t"
  140152. "ldm %[a], {r2, r3, r4, r5}\n\t"
  140153. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  140154. "sbcs r2, r2, r6\n\t"
  140155. "sbcs r3, r3, r7\n\t"
  140156. "sbcs r4, r4, r8\n\t"
  140157. "sbcs r5, r5, r9\n\t"
  140158. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  140159. "sbc r12, r12, r12\n\t"
  140160. "cmp %[a], lr\n\t"
  140161. "bne L_sp_1024_sub_in_pkace_32_word_%=\n\t"
  140162. "mov %[a], r12\n\t"
  140163. : [a] "+r" (a), [b] "+r" (b)
  140164. :
  140165. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc"
  140166. );
  140167. return (uint32_t)(size_t)a;
  140168. }
  140169. #endif /* WOLFSSL_SP_SMALL */
  140170. #ifdef WOLFSSL_SP_SMALL
  140171. /* Conditionally subtract b from a using the mask m.
  140172. * m is -1 to subtract and 0 when not copying.
  140173. *
  140174. * r A single precision number representing condition subtract result.
  140175. * a A single precision number to subtract from.
  140176. * b A single precision number to subtract.
  140177. * m Mask value to apply.
  140178. */
  140179. 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)
  140180. {
  140181. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  140182. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  140183. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  140184. register sp_digit m asm ("r3") = (sp_digit)m_p;
  140185. __asm__ __volatile__ (
  140186. "mov r6, #0\n\t"
  140187. "mov r12, #0\n\t"
  140188. "mov lr, #0\n\t"
  140189. "\n"
  140190. "L_sp_1024_cond_sub_32_words_%=: \n\t"
  140191. "subs r12, r6, r12\n\t"
  140192. "ldr r4, [%[a], lr]\n\t"
  140193. "ldr r5, [%[b], lr]\n\t"
  140194. "and r5, r5, %[m]\n\t"
  140195. "sbcs r4, r4, r5\n\t"
  140196. "sbc r12, r6, r6\n\t"
  140197. "str r4, [%[r], lr]\n\t"
  140198. "add lr, lr, #4\n\t"
  140199. "cmp lr, #0x80\n\t"
  140200. "blt L_sp_1024_cond_sub_32_words_%=\n\t"
  140201. "mov %[r], r12\n\t"
  140202. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  140203. :
  140204. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  140205. );
  140206. return (uint32_t)(size_t)r;
  140207. }
  140208. #else
  140209. /* Conditionally subtract b from a using the mask m.
  140210. * m is -1 to subtract and 0 when not copying.
  140211. *
  140212. * r A single precision number representing condition subtract result.
  140213. * a A single precision number to subtract from.
  140214. * b A single precision number to subtract.
  140215. * m Mask value to apply.
  140216. */
  140217. 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)
  140218. {
  140219. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  140220. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  140221. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  140222. register sp_digit m asm ("r3") = (sp_digit)m_p;
  140223. __asm__ __volatile__ (
  140224. "mov lr, #0\n\t"
  140225. "ldm %[a]!, {r4, r5}\n\t"
  140226. "ldm %[b]!, {r6, r7}\n\t"
  140227. "and r6, r6, %[m]\n\t"
  140228. "and r7, r7, %[m]\n\t"
  140229. "subs r4, r4, r6\n\t"
  140230. "sbcs r5, r5, r7\n\t"
  140231. "stm %[r]!, {r4, r5}\n\t"
  140232. "ldm %[a]!, {r4, r5}\n\t"
  140233. "ldm %[b]!, {r6, r7}\n\t"
  140234. "and r6, r6, %[m]\n\t"
  140235. "and r7, r7, %[m]\n\t"
  140236. "sbcs r4, r4, r6\n\t"
  140237. "sbcs r5, r5, r7\n\t"
  140238. "stm %[r]!, {r4, r5}\n\t"
  140239. "ldm %[a]!, {r4, r5}\n\t"
  140240. "ldm %[b]!, {r6, r7}\n\t"
  140241. "and r6, r6, %[m]\n\t"
  140242. "and r7, r7, %[m]\n\t"
  140243. "sbcs r4, r4, r6\n\t"
  140244. "sbcs r5, r5, r7\n\t"
  140245. "stm %[r]!, {r4, r5}\n\t"
  140246. "ldm %[a]!, {r4, r5}\n\t"
  140247. "ldm %[b]!, {r6, r7}\n\t"
  140248. "and r6, r6, %[m]\n\t"
  140249. "and r7, r7, %[m]\n\t"
  140250. "sbcs r4, r4, r6\n\t"
  140251. "sbcs r5, r5, r7\n\t"
  140252. "stm %[r]!, {r4, r5}\n\t"
  140253. "ldm %[a]!, {r4, r5}\n\t"
  140254. "ldm %[b]!, {r6, r7}\n\t"
  140255. "and r6, r6, %[m]\n\t"
  140256. "and r7, r7, %[m]\n\t"
  140257. "sbcs r4, r4, r6\n\t"
  140258. "sbcs r5, r5, r7\n\t"
  140259. "stm %[r]!, {r4, r5}\n\t"
  140260. "ldm %[a]!, {r4, r5}\n\t"
  140261. "ldm %[b]!, {r6, r7}\n\t"
  140262. "and r6, r6, %[m]\n\t"
  140263. "and r7, r7, %[m]\n\t"
  140264. "sbcs r4, r4, r6\n\t"
  140265. "sbcs r5, r5, r7\n\t"
  140266. "stm %[r]!, {r4, r5}\n\t"
  140267. "ldm %[a]!, {r4, r5}\n\t"
  140268. "ldm %[b]!, {r6, r7}\n\t"
  140269. "and r6, r6, %[m]\n\t"
  140270. "and r7, r7, %[m]\n\t"
  140271. "sbcs r4, r4, r6\n\t"
  140272. "sbcs r5, r5, r7\n\t"
  140273. "stm %[r]!, {r4, r5}\n\t"
  140274. "ldm %[a]!, {r4, r5}\n\t"
  140275. "ldm %[b]!, {r6, r7}\n\t"
  140276. "and r6, r6, %[m]\n\t"
  140277. "and r7, r7, %[m]\n\t"
  140278. "sbcs r4, r4, r6\n\t"
  140279. "sbcs r5, r5, r7\n\t"
  140280. "stm %[r]!, {r4, r5}\n\t"
  140281. "ldm %[a]!, {r4, r5}\n\t"
  140282. "ldm %[b]!, {r6, r7}\n\t"
  140283. "and r6, r6, %[m]\n\t"
  140284. "and r7, r7, %[m]\n\t"
  140285. "sbcs r4, r4, r6\n\t"
  140286. "sbcs r5, r5, r7\n\t"
  140287. "stm %[r]!, {r4, r5}\n\t"
  140288. "ldm %[a]!, {r4, r5}\n\t"
  140289. "ldm %[b]!, {r6, r7}\n\t"
  140290. "and r6, r6, %[m]\n\t"
  140291. "and r7, r7, %[m]\n\t"
  140292. "sbcs r4, r4, r6\n\t"
  140293. "sbcs r5, r5, r7\n\t"
  140294. "stm %[r]!, {r4, r5}\n\t"
  140295. "ldm %[a]!, {r4, r5}\n\t"
  140296. "ldm %[b]!, {r6, r7}\n\t"
  140297. "and r6, r6, %[m]\n\t"
  140298. "and r7, r7, %[m]\n\t"
  140299. "sbcs r4, r4, r6\n\t"
  140300. "sbcs r5, r5, r7\n\t"
  140301. "stm %[r]!, {r4, r5}\n\t"
  140302. "ldm %[a]!, {r4, r5}\n\t"
  140303. "ldm %[b]!, {r6, r7}\n\t"
  140304. "and r6, r6, %[m]\n\t"
  140305. "and r7, r7, %[m]\n\t"
  140306. "sbcs r4, r4, r6\n\t"
  140307. "sbcs r5, r5, r7\n\t"
  140308. "stm %[r]!, {r4, r5}\n\t"
  140309. "ldm %[a]!, {r4, r5}\n\t"
  140310. "ldm %[b]!, {r6, r7}\n\t"
  140311. "and r6, r6, %[m]\n\t"
  140312. "and r7, r7, %[m]\n\t"
  140313. "sbcs r4, r4, r6\n\t"
  140314. "sbcs r5, r5, r7\n\t"
  140315. "stm %[r]!, {r4, r5}\n\t"
  140316. "ldm %[a]!, {r4, r5}\n\t"
  140317. "ldm %[b]!, {r6, r7}\n\t"
  140318. "and r6, r6, %[m]\n\t"
  140319. "and r7, r7, %[m]\n\t"
  140320. "sbcs r4, r4, r6\n\t"
  140321. "sbcs r5, r5, r7\n\t"
  140322. "stm %[r]!, {r4, r5}\n\t"
  140323. "ldm %[a]!, {r4, r5}\n\t"
  140324. "ldm %[b]!, {r6, r7}\n\t"
  140325. "and r6, r6, %[m]\n\t"
  140326. "and r7, r7, %[m]\n\t"
  140327. "sbcs r4, r4, r6\n\t"
  140328. "sbcs r5, r5, r7\n\t"
  140329. "stm %[r]!, {r4, r5}\n\t"
  140330. "ldm %[a]!, {r4, r5}\n\t"
  140331. "ldm %[b]!, {r6, r7}\n\t"
  140332. "and r6, r6, %[m]\n\t"
  140333. "and r7, r7, %[m]\n\t"
  140334. "sbcs r4, r4, r6\n\t"
  140335. "sbcs r5, r5, r7\n\t"
  140336. "stm %[r]!, {r4, r5}\n\t"
  140337. "sbc %[r], lr, lr\n\t"
  140338. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  140339. :
  140340. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc"
  140341. );
  140342. return (uint32_t)(size_t)r;
  140343. }
  140344. #endif /* WOLFSSL_SP_SMALL */
  140345. #ifdef WOLFSSL_SP_SMALL
  140346. /* Add b to a into r. (r = a + b)
  140347. *
  140348. * r A single precision integer.
  140349. * a A single precision integer.
  140350. * b A single precision integer.
  140351. */
  140352. static sp_digit sp_1024_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  140353. {
  140354. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  140355. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  140356. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  140357. __asm__ __volatile__ (
  140358. "mov r3, #0\n\t"
  140359. "add r12, %[a], #0x80\n\t"
  140360. "\n"
  140361. "L_sp_1024_add_32_word_%=: \n\t"
  140362. "adds r3, r3, #-1\n\t"
  140363. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  140364. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  140365. "adcs r4, r4, r8\n\t"
  140366. "adcs r5, r5, r9\n\t"
  140367. "adcs r6, r6, r10\n\t"
  140368. "adcs r7, r7, r11\n\t"
  140369. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  140370. "mov r4, #0\n\t"
  140371. "adc r3, r4, #0\n\t"
  140372. "cmp %[a], r12\n\t"
  140373. "bne L_sp_1024_add_32_word_%=\n\t"
  140374. "mov %[r], r3\n\t"
  140375. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  140376. :
  140377. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc"
  140378. );
  140379. return (uint32_t)(size_t)r;
  140380. }
  140381. #endif /* WOLFSSL_SP_SMALL */
  140382. #ifdef WOLFSSL_SP_SMALL
  140383. /* Mul a by digit b into r. (r = a * b)
  140384. *
  140385. * r A single precision integer.
  140386. * a A single precision integer.
  140387. * b A single precision digit.
  140388. */
  140389. static void sp_1024_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  140390. {
  140391. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  140392. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  140393. register sp_digit b asm ("r2") = (sp_digit)b_p;
  140394. __asm__ __volatile__ (
  140395. /* A[0] * B */
  140396. "ldr r8, [%[a]]\n\t"
  140397. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140398. "lsl r6, %[b], #16\n\t"
  140399. "lsl r5, r8, #16\n\t"
  140400. "lsr r6, r6, #16\n\t"
  140401. "lsr r5, r5, #16\n\t"
  140402. "mul r5, r6, r5\n\t"
  140403. "lsr r7, r8, #16\n\t"
  140404. "mul r6, r7, r6\n\t"
  140405. "lsr r3, r6, #16\n\t"
  140406. "lsl r6, r6, #16\n\t"
  140407. "adds r5, r5, r6\n\t"
  140408. "adc r3, r3, #0\n\t"
  140409. "lsr r6, %[b], #16\n\t"
  140410. "mul r7, r6, r7\n\t"
  140411. "add r3, r3, r7\n\t"
  140412. "lsl r7, r8, #16\n\t"
  140413. "lsr r7, r7, #16\n\t"
  140414. "mul r6, r7, r6\n\t"
  140415. "lsr r7, r6, #16\n\t"
  140416. "lsl r6, r6, #16\n\t"
  140417. "adds r5, r5, r6\n\t"
  140418. "adc r3, r3, r7\n\t"
  140419. #else
  140420. "umull r5, r3, %[b], r8\n\t"
  140421. #endif
  140422. "mov r4, #0\n\t"
  140423. "str r5, [%[r]]\n\t"
  140424. "mov r5, #0\n\t"
  140425. "mov r9, #4\n\t"
  140426. "\n"
  140427. "L_sp_1024_mul_d_32_word_%=: \n\t"
  140428. /* A[i] * B */
  140429. "ldr r8, [%[a], r9]\n\t"
  140430. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140431. "lsl r6, %[b], #16\n\t"
  140432. "lsl r7, r8, #16\n\t"
  140433. "lsr r6, r6, #16\n\t"
  140434. "lsr r7, r7, #16\n\t"
  140435. "mul r7, r6, r7\n\t"
  140436. "adds r3, r3, r7\n\t"
  140437. "adcs r4, r4, #0\n\t"
  140438. "adc r5, r5, #0\n\t"
  140439. "lsr r7, r8, #16\n\t"
  140440. "mul r6, r7, r6\n\t"
  140441. "lsr r7, r6, #16\n\t"
  140442. "lsl r6, r6, #16\n\t"
  140443. "adds r3, r3, r6\n\t"
  140444. "adcs r4, r4, r7\n\t"
  140445. "adc r5, r5, #0\n\t"
  140446. "lsr r6, %[b], #16\n\t"
  140447. "lsr r7, r8, #16\n\t"
  140448. "mul r7, r6, r7\n\t"
  140449. "adds r4, r4, r7\n\t"
  140450. "adc r5, r5, #0\n\t"
  140451. "lsl r7, r8, #16\n\t"
  140452. "lsr r7, r7, #16\n\t"
  140453. "mul r6, r7, r6\n\t"
  140454. "lsr r7, r6, #16\n\t"
  140455. "lsl r6, r6, #16\n\t"
  140456. "adds r3, r3, r6\n\t"
  140457. "adcs r4, r4, r7\n\t"
  140458. "adc r5, r5, #0\n\t"
  140459. #else
  140460. "umull r6, r7, %[b], r8\n\t"
  140461. "adds r3, r3, r6\n\t"
  140462. "adcs r4, r4, r7\n\t"
  140463. "adc r5, r5, #0\n\t"
  140464. #endif
  140465. "str r3, [%[r], r9]\n\t"
  140466. "mov r3, r4\n\t"
  140467. "mov r4, r5\n\t"
  140468. "mov r5, #0\n\t"
  140469. "add r9, r9, #4\n\t"
  140470. "cmp r9, #0x80\n\t"
  140471. "blt L_sp_1024_mul_d_32_word_%=\n\t"
  140472. "str r3, [%[r], #128]\n\t"
  140473. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  140474. :
  140475. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc"
  140476. );
  140477. }
  140478. #else
  140479. /* Mul a by digit b into r. (r = a * b)
  140480. *
  140481. * r A single precision integer.
  140482. * a A single precision integer.
  140483. * b A single precision digit.
  140484. */
  140485. static void sp_1024_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  140486. {
  140487. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  140488. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  140489. register sp_digit b asm ("r2") = (sp_digit)b_p;
  140490. __asm__ __volatile__ (
  140491. /* A[0] * B */
  140492. "ldm %[a]!, {r8}\n\t"
  140493. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140494. "lsl r6, %[b], #16\n\t"
  140495. "lsl r3, r8, #16\n\t"
  140496. "lsr r6, r6, #16\n\t"
  140497. "lsr r3, r3, #16\n\t"
  140498. "mul r3, r6, r3\n\t"
  140499. "lsr r7, r8, #16\n\t"
  140500. "mul r6, r7, r6\n\t"
  140501. "lsr r4, r6, #16\n\t"
  140502. "lsl r6, r6, #16\n\t"
  140503. "adds r3, r3, r6\n\t"
  140504. "adc r4, r4, #0\n\t"
  140505. "lsr r6, %[b], #16\n\t"
  140506. "mul r7, r6, r7\n\t"
  140507. "add r4, r4, r7\n\t"
  140508. "lsl r7, r8, #16\n\t"
  140509. "lsr r7, r7, #16\n\t"
  140510. "mul r6, r7, r6\n\t"
  140511. "lsr r7, r6, #16\n\t"
  140512. "lsl r6, r6, #16\n\t"
  140513. "adds r3, r3, r6\n\t"
  140514. "adc r4, r4, r7\n\t"
  140515. #else
  140516. "umull r3, r4, %[b], r8\n\t"
  140517. #endif
  140518. "stm %[r]!, {r3}\n\t"
  140519. "mov r5, #0\n\t"
  140520. /* A[1] * B */
  140521. "ldm %[a]!, {r8}\n\t"
  140522. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140523. "lsl r6, %[b], #16\n\t"
  140524. "lsl r7, r8, #16\n\t"
  140525. "lsr r6, r6, #16\n\t"
  140526. "lsr r7, r7, #16\n\t"
  140527. "mul r7, r6, r7\n\t"
  140528. "adds r4, r4, r7\n\t"
  140529. "adc r5, r5, #0\n\t"
  140530. "lsr r7, r8, #16\n\t"
  140531. "mul r6, r7, r6\n\t"
  140532. "lsr r7, r6, #16\n\t"
  140533. "lsl r6, r6, #16\n\t"
  140534. "adds r4, r4, r6\n\t"
  140535. "adc r5, r5, r7\n\t"
  140536. "lsr r6, %[b], #16\n\t"
  140537. "lsr r7, r8, #16\n\t"
  140538. "mul r7, r6, r7\n\t"
  140539. "add r5, r5, r7\n\t"
  140540. "lsl r7, r8, #16\n\t"
  140541. "lsr r7, r7, #16\n\t"
  140542. "mul r6, r7, r6\n\t"
  140543. "lsr r7, r6, #16\n\t"
  140544. "lsl r6, r6, #16\n\t"
  140545. "adds r4, r4, r6\n\t"
  140546. "adc r5, r5, r7\n\t"
  140547. #else
  140548. "umlal r4, r5, %[b], r8\n\t"
  140549. #endif
  140550. "stm %[r]!, {r4}\n\t"
  140551. "mov r3, #0\n\t"
  140552. /* A[2] * B */
  140553. "ldm %[a]!, {r8}\n\t"
  140554. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140555. "lsl r6, %[b], #16\n\t"
  140556. "lsl r7, r8, #16\n\t"
  140557. "lsr r6, r6, #16\n\t"
  140558. "lsr r7, r7, #16\n\t"
  140559. "mul r7, r6, r7\n\t"
  140560. "adds r5, r5, r7\n\t"
  140561. "adc r3, r3, #0\n\t"
  140562. "lsr r7, r8, #16\n\t"
  140563. "mul r6, r7, r6\n\t"
  140564. "lsr r7, r6, #16\n\t"
  140565. "lsl r6, r6, #16\n\t"
  140566. "adds r5, r5, r6\n\t"
  140567. "adc r3, r3, r7\n\t"
  140568. "lsr r6, %[b], #16\n\t"
  140569. "lsr r7, r8, #16\n\t"
  140570. "mul r7, r6, r7\n\t"
  140571. "add r3, r3, r7\n\t"
  140572. "lsl r7, r8, #16\n\t"
  140573. "lsr r7, r7, #16\n\t"
  140574. "mul r6, r7, r6\n\t"
  140575. "lsr r7, r6, #16\n\t"
  140576. "lsl r6, r6, #16\n\t"
  140577. "adds r5, r5, r6\n\t"
  140578. "adc r3, r3, r7\n\t"
  140579. #else
  140580. "umlal r5, r3, %[b], r8\n\t"
  140581. #endif
  140582. "stm %[r]!, {r5}\n\t"
  140583. "mov r4, #0\n\t"
  140584. /* A[3] * B */
  140585. "ldm %[a]!, {r8}\n\t"
  140586. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140587. "lsl r6, %[b], #16\n\t"
  140588. "lsl r7, r8, #16\n\t"
  140589. "lsr r6, r6, #16\n\t"
  140590. "lsr r7, r7, #16\n\t"
  140591. "mul r7, r6, r7\n\t"
  140592. "adds r3, r3, r7\n\t"
  140593. "adc r4, r4, #0\n\t"
  140594. "lsr r7, r8, #16\n\t"
  140595. "mul r6, r7, r6\n\t"
  140596. "lsr r7, r6, #16\n\t"
  140597. "lsl r6, r6, #16\n\t"
  140598. "adds r3, r3, r6\n\t"
  140599. "adc r4, r4, r7\n\t"
  140600. "lsr r6, %[b], #16\n\t"
  140601. "lsr r7, r8, #16\n\t"
  140602. "mul r7, r6, r7\n\t"
  140603. "add r4, r4, r7\n\t"
  140604. "lsl r7, r8, #16\n\t"
  140605. "lsr r7, r7, #16\n\t"
  140606. "mul r6, r7, r6\n\t"
  140607. "lsr r7, r6, #16\n\t"
  140608. "lsl r6, r6, #16\n\t"
  140609. "adds r3, r3, r6\n\t"
  140610. "adc r4, r4, r7\n\t"
  140611. #else
  140612. "umlal r3, r4, %[b], r8\n\t"
  140613. #endif
  140614. "stm %[r]!, {r3}\n\t"
  140615. "mov r5, #0\n\t"
  140616. /* A[4] * B */
  140617. "ldm %[a]!, {r8}\n\t"
  140618. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140619. "lsl r6, %[b], #16\n\t"
  140620. "lsl r7, r8, #16\n\t"
  140621. "lsr r6, r6, #16\n\t"
  140622. "lsr r7, r7, #16\n\t"
  140623. "mul r7, r6, r7\n\t"
  140624. "adds r4, r4, r7\n\t"
  140625. "adc r5, r5, #0\n\t"
  140626. "lsr r7, r8, #16\n\t"
  140627. "mul r6, r7, r6\n\t"
  140628. "lsr r7, r6, #16\n\t"
  140629. "lsl r6, r6, #16\n\t"
  140630. "adds r4, r4, r6\n\t"
  140631. "adc r5, r5, r7\n\t"
  140632. "lsr r6, %[b], #16\n\t"
  140633. "lsr r7, r8, #16\n\t"
  140634. "mul r7, r6, r7\n\t"
  140635. "add r5, r5, r7\n\t"
  140636. "lsl r7, r8, #16\n\t"
  140637. "lsr r7, r7, #16\n\t"
  140638. "mul r6, r7, r6\n\t"
  140639. "lsr r7, r6, #16\n\t"
  140640. "lsl r6, r6, #16\n\t"
  140641. "adds r4, r4, r6\n\t"
  140642. "adc r5, r5, r7\n\t"
  140643. #else
  140644. "umlal r4, r5, %[b], r8\n\t"
  140645. #endif
  140646. "stm %[r]!, {r4}\n\t"
  140647. "mov r3, #0\n\t"
  140648. /* A[5] * B */
  140649. "ldm %[a]!, {r8}\n\t"
  140650. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140651. "lsl r6, %[b], #16\n\t"
  140652. "lsl r7, r8, #16\n\t"
  140653. "lsr r6, r6, #16\n\t"
  140654. "lsr r7, r7, #16\n\t"
  140655. "mul r7, r6, r7\n\t"
  140656. "adds r5, r5, r7\n\t"
  140657. "adc r3, r3, #0\n\t"
  140658. "lsr r7, r8, #16\n\t"
  140659. "mul r6, r7, r6\n\t"
  140660. "lsr r7, r6, #16\n\t"
  140661. "lsl r6, r6, #16\n\t"
  140662. "adds r5, r5, r6\n\t"
  140663. "adc r3, r3, r7\n\t"
  140664. "lsr r6, %[b], #16\n\t"
  140665. "lsr r7, r8, #16\n\t"
  140666. "mul r7, r6, r7\n\t"
  140667. "add r3, r3, r7\n\t"
  140668. "lsl r7, r8, #16\n\t"
  140669. "lsr r7, r7, #16\n\t"
  140670. "mul r6, r7, r6\n\t"
  140671. "lsr r7, r6, #16\n\t"
  140672. "lsl r6, r6, #16\n\t"
  140673. "adds r5, r5, r6\n\t"
  140674. "adc r3, r3, r7\n\t"
  140675. #else
  140676. "umlal r5, r3, %[b], r8\n\t"
  140677. #endif
  140678. "stm %[r]!, {r5}\n\t"
  140679. "mov r4, #0\n\t"
  140680. /* A[6] * B */
  140681. "ldm %[a]!, {r8}\n\t"
  140682. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140683. "lsl r6, %[b], #16\n\t"
  140684. "lsl r7, r8, #16\n\t"
  140685. "lsr r6, r6, #16\n\t"
  140686. "lsr r7, r7, #16\n\t"
  140687. "mul r7, r6, r7\n\t"
  140688. "adds r3, r3, r7\n\t"
  140689. "adc r4, r4, #0\n\t"
  140690. "lsr r7, r8, #16\n\t"
  140691. "mul r6, r7, r6\n\t"
  140692. "lsr r7, r6, #16\n\t"
  140693. "lsl r6, r6, #16\n\t"
  140694. "adds r3, r3, r6\n\t"
  140695. "adc r4, r4, r7\n\t"
  140696. "lsr r6, %[b], #16\n\t"
  140697. "lsr r7, r8, #16\n\t"
  140698. "mul r7, r6, r7\n\t"
  140699. "add r4, r4, r7\n\t"
  140700. "lsl r7, r8, #16\n\t"
  140701. "lsr r7, r7, #16\n\t"
  140702. "mul r6, r7, r6\n\t"
  140703. "lsr r7, r6, #16\n\t"
  140704. "lsl r6, r6, #16\n\t"
  140705. "adds r3, r3, r6\n\t"
  140706. "adc r4, r4, r7\n\t"
  140707. #else
  140708. "umlal r3, r4, %[b], r8\n\t"
  140709. #endif
  140710. "stm %[r]!, {r3}\n\t"
  140711. "mov r5, #0\n\t"
  140712. /* A[7] * B */
  140713. "ldm %[a]!, {r8}\n\t"
  140714. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140715. "lsl r6, %[b], #16\n\t"
  140716. "lsl r7, r8, #16\n\t"
  140717. "lsr r6, r6, #16\n\t"
  140718. "lsr r7, r7, #16\n\t"
  140719. "mul r7, r6, r7\n\t"
  140720. "adds r4, r4, r7\n\t"
  140721. "adc r5, r5, #0\n\t"
  140722. "lsr r7, r8, #16\n\t"
  140723. "mul r6, r7, r6\n\t"
  140724. "lsr r7, r6, #16\n\t"
  140725. "lsl r6, r6, #16\n\t"
  140726. "adds r4, r4, r6\n\t"
  140727. "adc r5, r5, r7\n\t"
  140728. "lsr r6, %[b], #16\n\t"
  140729. "lsr r7, r8, #16\n\t"
  140730. "mul r7, r6, r7\n\t"
  140731. "add r5, r5, r7\n\t"
  140732. "lsl r7, r8, #16\n\t"
  140733. "lsr r7, r7, #16\n\t"
  140734. "mul r6, r7, r6\n\t"
  140735. "lsr r7, r6, #16\n\t"
  140736. "lsl r6, r6, #16\n\t"
  140737. "adds r4, r4, r6\n\t"
  140738. "adc r5, r5, r7\n\t"
  140739. #else
  140740. "umlal r4, r5, %[b], r8\n\t"
  140741. #endif
  140742. "stm %[r]!, {r4}\n\t"
  140743. "mov r3, #0\n\t"
  140744. /* A[8] * B */
  140745. "ldm %[a]!, {r8}\n\t"
  140746. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140747. "lsl r6, %[b], #16\n\t"
  140748. "lsl r7, r8, #16\n\t"
  140749. "lsr r6, r6, #16\n\t"
  140750. "lsr r7, r7, #16\n\t"
  140751. "mul r7, r6, r7\n\t"
  140752. "adds r5, r5, r7\n\t"
  140753. "adc r3, r3, #0\n\t"
  140754. "lsr r7, r8, #16\n\t"
  140755. "mul r6, r7, r6\n\t"
  140756. "lsr r7, r6, #16\n\t"
  140757. "lsl r6, r6, #16\n\t"
  140758. "adds r5, r5, r6\n\t"
  140759. "adc r3, r3, r7\n\t"
  140760. "lsr r6, %[b], #16\n\t"
  140761. "lsr r7, r8, #16\n\t"
  140762. "mul r7, r6, r7\n\t"
  140763. "add r3, r3, r7\n\t"
  140764. "lsl r7, r8, #16\n\t"
  140765. "lsr r7, r7, #16\n\t"
  140766. "mul r6, r7, r6\n\t"
  140767. "lsr r7, r6, #16\n\t"
  140768. "lsl r6, r6, #16\n\t"
  140769. "adds r5, r5, r6\n\t"
  140770. "adc r3, r3, r7\n\t"
  140771. #else
  140772. "umlal r5, r3, %[b], r8\n\t"
  140773. #endif
  140774. "stm %[r]!, {r5}\n\t"
  140775. "mov r4, #0\n\t"
  140776. /* A[9] * B */
  140777. "ldm %[a]!, {r8}\n\t"
  140778. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140779. "lsl r6, %[b], #16\n\t"
  140780. "lsl r7, r8, #16\n\t"
  140781. "lsr r6, r6, #16\n\t"
  140782. "lsr r7, r7, #16\n\t"
  140783. "mul r7, r6, r7\n\t"
  140784. "adds r3, r3, r7\n\t"
  140785. "adc r4, r4, #0\n\t"
  140786. "lsr r7, r8, #16\n\t"
  140787. "mul r6, r7, r6\n\t"
  140788. "lsr r7, r6, #16\n\t"
  140789. "lsl r6, r6, #16\n\t"
  140790. "adds r3, r3, r6\n\t"
  140791. "adc r4, r4, r7\n\t"
  140792. "lsr r6, %[b], #16\n\t"
  140793. "lsr r7, r8, #16\n\t"
  140794. "mul r7, r6, r7\n\t"
  140795. "add r4, r4, r7\n\t"
  140796. "lsl r7, r8, #16\n\t"
  140797. "lsr r7, r7, #16\n\t"
  140798. "mul r6, r7, r6\n\t"
  140799. "lsr r7, r6, #16\n\t"
  140800. "lsl r6, r6, #16\n\t"
  140801. "adds r3, r3, r6\n\t"
  140802. "adc r4, r4, r7\n\t"
  140803. #else
  140804. "umlal r3, r4, %[b], r8\n\t"
  140805. #endif
  140806. "stm %[r]!, {r3}\n\t"
  140807. "mov r5, #0\n\t"
  140808. /* A[10] * B */
  140809. "ldm %[a]!, {r8}\n\t"
  140810. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140811. "lsl r6, %[b], #16\n\t"
  140812. "lsl r7, r8, #16\n\t"
  140813. "lsr r6, r6, #16\n\t"
  140814. "lsr r7, r7, #16\n\t"
  140815. "mul r7, r6, r7\n\t"
  140816. "adds r4, r4, r7\n\t"
  140817. "adc r5, r5, #0\n\t"
  140818. "lsr r7, r8, #16\n\t"
  140819. "mul r6, r7, r6\n\t"
  140820. "lsr r7, r6, #16\n\t"
  140821. "lsl r6, r6, #16\n\t"
  140822. "adds r4, r4, r6\n\t"
  140823. "adc r5, r5, r7\n\t"
  140824. "lsr r6, %[b], #16\n\t"
  140825. "lsr r7, r8, #16\n\t"
  140826. "mul r7, r6, r7\n\t"
  140827. "add r5, r5, r7\n\t"
  140828. "lsl r7, r8, #16\n\t"
  140829. "lsr r7, r7, #16\n\t"
  140830. "mul r6, r7, r6\n\t"
  140831. "lsr r7, r6, #16\n\t"
  140832. "lsl r6, r6, #16\n\t"
  140833. "adds r4, r4, r6\n\t"
  140834. "adc r5, r5, r7\n\t"
  140835. #else
  140836. "umlal r4, r5, %[b], r8\n\t"
  140837. #endif
  140838. "stm %[r]!, {r4}\n\t"
  140839. "mov r3, #0\n\t"
  140840. /* A[11] * B */
  140841. "ldm %[a]!, {r8}\n\t"
  140842. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140843. "lsl r6, %[b], #16\n\t"
  140844. "lsl r7, r8, #16\n\t"
  140845. "lsr r6, r6, #16\n\t"
  140846. "lsr r7, r7, #16\n\t"
  140847. "mul r7, r6, r7\n\t"
  140848. "adds r5, r5, r7\n\t"
  140849. "adc r3, r3, #0\n\t"
  140850. "lsr r7, r8, #16\n\t"
  140851. "mul r6, r7, r6\n\t"
  140852. "lsr r7, r6, #16\n\t"
  140853. "lsl r6, r6, #16\n\t"
  140854. "adds r5, r5, r6\n\t"
  140855. "adc r3, r3, r7\n\t"
  140856. "lsr r6, %[b], #16\n\t"
  140857. "lsr r7, r8, #16\n\t"
  140858. "mul r7, r6, r7\n\t"
  140859. "add r3, r3, r7\n\t"
  140860. "lsl r7, r8, #16\n\t"
  140861. "lsr r7, r7, #16\n\t"
  140862. "mul r6, r7, r6\n\t"
  140863. "lsr r7, r6, #16\n\t"
  140864. "lsl r6, r6, #16\n\t"
  140865. "adds r5, r5, r6\n\t"
  140866. "adc r3, r3, r7\n\t"
  140867. #else
  140868. "umlal r5, r3, %[b], r8\n\t"
  140869. #endif
  140870. "stm %[r]!, {r5}\n\t"
  140871. "mov r4, #0\n\t"
  140872. /* A[12] * B */
  140873. "ldm %[a]!, {r8}\n\t"
  140874. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140875. "lsl r6, %[b], #16\n\t"
  140876. "lsl r7, r8, #16\n\t"
  140877. "lsr r6, r6, #16\n\t"
  140878. "lsr r7, r7, #16\n\t"
  140879. "mul r7, r6, r7\n\t"
  140880. "adds r3, r3, r7\n\t"
  140881. "adc r4, r4, #0\n\t"
  140882. "lsr r7, r8, #16\n\t"
  140883. "mul r6, r7, r6\n\t"
  140884. "lsr r7, r6, #16\n\t"
  140885. "lsl r6, r6, #16\n\t"
  140886. "adds r3, r3, r6\n\t"
  140887. "adc r4, r4, r7\n\t"
  140888. "lsr r6, %[b], #16\n\t"
  140889. "lsr r7, r8, #16\n\t"
  140890. "mul r7, r6, r7\n\t"
  140891. "add r4, r4, r7\n\t"
  140892. "lsl r7, r8, #16\n\t"
  140893. "lsr r7, r7, #16\n\t"
  140894. "mul r6, r7, r6\n\t"
  140895. "lsr r7, r6, #16\n\t"
  140896. "lsl r6, r6, #16\n\t"
  140897. "adds r3, r3, r6\n\t"
  140898. "adc r4, r4, r7\n\t"
  140899. #else
  140900. "umlal r3, r4, %[b], r8\n\t"
  140901. #endif
  140902. "stm %[r]!, {r3}\n\t"
  140903. "mov r5, #0\n\t"
  140904. /* A[13] * B */
  140905. "ldm %[a]!, {r8}\n\t"
  140906. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140907. "lsl r6, %[b], #16\n\t"
  140908. "lsl r7, r8, #16\n\t"
  140909. "lsr r6, r6, #16\n\t"
  140910. "lsr r7, r7, #16\n\t"
  140911. "mul r7, r6, r7\n\t"
  140912. "adds r4, r4, r7\n\t"
  140913. "adc r5, r5, #0\n\t"
  140914. "lsr r7, r8, #16\n\t"
  140915. "mul r6, r7, r6\n\t"
  140916. "lsr r7, r6, #16\n\t"
  140917. "lsl r6, r6, #16\n\t"
  140918. "adds r4, r4, r6\n\t"
  140919. "adc r5, r5, r7\n\t"
  140920. "lsr r6, %[b], #16\n\t"
  140921. "lsr r7, r8, #16\n\t"
  140922. "mul r7, r6, r7\n\t"
  140923. "add r5, r5, r7\n\t"
  140924. "lsl r7, r8, #16\n\t"
  140925. "lsr r7, r7, #16\n\t"
  140926. "mul r6, r7, r6\n\t"
  140927. "lsr r7, r6, #16\n\t"
  140928. "lsl r6, r6, #16\n\t"
  140929. "adds r4, r4, r6\n\t"
  140930. "adc r5, r5, r7\n\t"
  140931. #else
  140932. "umlal r4, r5, %[b], r8\n\t"
  140933. #endif
  140934. "stm %[r]!, {r4}\n\t"
  140935. "mov r3, #0\n\t"
  140936. /* A[14] * B */
  140937. "ldm %[a]!, {r8}\n\t"
  140938. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140939. "lsl r6, %[b], #16\n\t"
  140940. "lsl r7, r8, #16\n\t"
  140941. "lsr r6, r6, #16\n\t"
  140942. "lsr r7, r7, #16\n\t"
  140943. "mul r7, r6, r7\n\t"
  140944. "adds r5, r5, r7\n\t"
  140945. "adc r3, r3, #0\n\t"
  140946. "lsr r7, r8, #16\n\t"
  140947. "mul r6, r7, r6\n\t"
  140948. "lsr r7, r6, #16\n\t"
  140949. "lsl r6, r6, #16\n\t"
  140950. "adds r5, r5, r6\n\t"
  140951. "adc r3, r3, r7\n\t"
  140952. "lsr r6, %[b], #16\n\t"
  140953. "lsr r7, r8, #16\n\t"
  140954. "mul r7, r6, r7\n\t"
  140955. "add r3, r3, r7\n\t"
  140956. "lsl r7, r8, #16\n\t"
  140957. "lsr r7, r7, #16\n\t"
  140958. "mul r6, r7, r6\n\t"
  140959. "lsr r7, r6, #16\n\t"
  140960. "lsl r6, r6, #16\n\t"
  140961. "adds r5, r5, r6\n\t"
  140962. "adc r3, r3, r7\n\t"
  140963. #else
  140964. "umlal r5, r3, %[b], r8\n\t"
  140965. #endif
  140966. "stm %[r]!, {r5}\n\t"
  140967. "mov r4, #0\n\t"
  140968. /* A[15] * B */
  140969. "ldm %[a]!, {r8}\n\t"
  140970. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  140971. "lsl r6, %[b], #16\n\t"
  140972. "lsl r7, r8, #16\n\t"
  140973. "lsr r6, r6, #16\n\t"
  140974. "lsr r7, r7, #16\n\t"
  140975. "mul r7, r6, r7\n\t"
  140976. "adds r3, r3, r7\n\t"
  140977. "adc r4, r4, #0\n\t"
  140978. "lsr r7, r8, #16\n\t"
  140979. "mul r6, r7, r6\n\t"
  140980. "lsr r7, r6, #16\n\t"
  140981. "lsl r6, r6, #16\n\t"
  140982. "adds r3, r3, r6\n\t"
  140983. "adc r4, r4, r7\n\t"
  140984. "lsr r6, %[b], #16\n\t"
  140985. "lsr r7, r8, #16\n\t"
  140986. "mul r7, r6, r7\n\t"
  140987. "add r4, r4, r7\n\t"
  140988. "lsl r7, r8, #16\n\t"
  140989. "lsr r7, r7, #16\n\t"
  140990. "mul r6, r7, r6\n\t"
  140991. "lsr r7, r6, #16\n\t"
  140992. "lsl r6, r6, #16\n\t"
  140993. "adds r3, r3, r6\n\t"
  140994. "adc r4, r4, r7\n\t"
  140995. #else
  140996. "umlal r3, r4, %[b], r8\n\t"
  140997. #endif
  140998. "stm %[r]!, {r3}\n\t"
  140999. "mov r5, #0\n\t"
  141000. /* A[16] * B */
  141001. "ldm %[a]!, {r8}\n\t"
  141002. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141003. "lsl r6, %[b], #16\n\t"
  141004. "lsl r7, r8, #16\n\t"
  141005. "lsr r6, r6, #16\n\t"
  141006. "lsr r7, r7, #16\n\t"
  141007. "mul r7, r6, r7\n\t"
  141008. "adds r4, r4, r7\n\t"
  141009. "adc r5, r5, #0\n\t"
  141010. "lsr r7, r8, #16\n\t"
  141011. "mul r6, r7, r6\n\t"
  141012. "lsr r7, r6, #16\n\t"
  141013. "lsl r6, r6, #16\n\t"
  141014. "adds r4, r4, r6\n\t"
  141015. "adc r5, r5, r7\n\t"
  141016. "lsr r6, %[b], #16\n\t"
  141017. "lsr r7, r8, #16\n\t"
  141018. "mul r7, r6, r7\n\t"
  141019. "add r5, r5, r7\n\t"
  141020. "lsl r7, r8, #16\n\t"
  141021. "lsr r7, r7, #16\n\t"
  141022. "mul r6, r7, r6\n\t"
  141023. "lsr r7, r6, #16\n\t"
  141024. "lsl r6, r6, #16\n\t"
  141025. "adds r4, r4, r6\n\t"
  141026. "adc r5, r5, r7\n\t"
  141027. #else
  141028. "umlal r4, r5, %[b], r8\n\t"
  141029. #endif
  141030. "stm %[r]!, {r4}\n\t"
  141031. "mov r3, #0\n\t"
  141032. /* A[17] * B */
  141033. "ldm %[a]!, {r8}\n\t"
  141034. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141035. "lsl r6, %[b], #16\n\t"
  141036. "lsl r7, r8, #16\n\t"
  141037. "lsr r6, r6, #16\n\t"
  141038. "lsr r7, r7, #16\n\t"
  141039. "mul r7, r6, r7\n\t"
  141040. "adds r5, r5, r7\n\t"
  141041. "adc r3, r3, #0\n\t"
  141042. "lsr r7, r8, #16\n\t"
  141043. "mul r6, r7, r6\n\t"
  141044. "lsr r7, r6, #16\n\t"
  141045. "lsl r6, r6, #16\n\t"
  141046. "adds r5, r5, r6\n\t"
  141047. "adc r3, r3, r7\n\t"
  141048. "lsr r6, %[b], #16\n\t"
  141049. "lsr r7, r8, #16\n\t"
  141050. "mul r7, r6, r7\n\t"
  141051. "add r3, r3, r7\n\t"
  141052. "lsl r7, r8, #16\n\t"
  141053. "lsr r7, r7, #16\n\t"
  141054. "mul r6, r7, r6\n\t"
  141055. "lsr r7, r6, #16\n\t"
  141056. "lsl r6, r6, #16\n\t"
  141057. "adds r5, r5, r6\n\t"
  141058. "adc r3, r3, r7\n\t"
  141059. #else
  141060. "umlal r5, r3, %[b], r8\n\t"
  141061. #endif
  141062. "stm %[r]!, {r5}\n\t"
  141063. "mov r4, #0\n\t"
  141064. /* A[18] * B */
  141065. "ldm %[a]!, {r8}\n\t"
  141066. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141067. "lsl r6, %[b], #16\n\t"
  141068. "lsl r7, r8, #16\n\t"
  141069. "lsr r6, r6, #16\n\t"
  141070. "lsr r7, r7, #16\n\t"
  141071. "mul r7, r6, r7\n\t"
  141072. "adds r3, r3, r7\n\t"
  141073. "adc r4, r4, #0\n\t"
  141074. "lsr r7, r8, #16\n\t"
  141075. "mul r6, r7, r6\n\t"
  141076. "lsr r7, r6, #16\n\t"
  141077. "lsl r6, r6, #16\n\t"
  141078. "adds r3, r3, r6\n\t"
  141079. "adc r4, r4, r7\n\t"
  141080. "lsr r6, %[b], #16\n\t"
  141081. "lsr r7, r8, #16\n\t"
  141082. "mul r7, r6, r7\n\t"
  141083. "add r4, r4, r7\n\t"
  141084. "lsl r7, r8, #16\n\t"
  141085. "lsr r7, r7, #16\n\t"
  141086. "mul r6, r7, r6\n\t"
  141087. "lsr r7, r6, #16\n\t"
  141088. "lsl r6, r6, #16\n\t"
  141089. "adds r3, r3, r6\n\t"
  141090. "adc r4, r4, r7\n\t"
  141091. #else
  141092. "umlal r3, r4, %[b], r8\n\t"
  141093. #endif
  141094. "stm %[r]!, {r3}\n\t"
  141095. "mov r5, #0\n\t"
  141096. /* A[19] * B */
  141097. "ldm %[a]!, {r8}\n\t"
  141098. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141099. "lsl r6, %[b], #16\n\t"
  141100. "lsl r7, r8, #16\n\t"
  141101. "lsr r6, r6, #16\n\t"
  141102. "lsr r7, r7, #16\n\t"
  141103. "mul r7, r6, r7\n\t"
  141104. "adds r4, r4, r7\n\t"
  141105. "adc r5, r5, #0\n\t"
  141106. "lsr r7, r8, #16\n\t"
  141107. "mul r6, r7, r6\n\t"
  141108. "lsr r7, r6, #16\n\t"
  141109. "lsl r6, r6, #16\n\t"
  141110. "adds r4, r4, r6\n\t"
  141111. "adc r5, r5, r7\n\t"
  141112. "lsr r6, %[b], #16\n\t"
  141113. "lsr r7, r8, #16\n\t"
  141114. "mul r7, r6, r7\n\t"
  141115. "add r5, r5, r7\n\t"
  141116. "lsl r7, r8, #16\n\t"
  141117. "lsr r7, r7, #16\n\t"
  141118. "mul r6, r7, r6\n\t"
  141119. "lsr r7, r6, #16\n\t"
  141120. "lsl r6, r6, #16\n\t"
  141121. "adds r4, r4, r6\n\t"
  141122. "adc r5, r5, r7\n\t"
  141123. #else
  141124. "umlal r4, r5, %[b], r8\n\t"
  141125. #endif
  141126. "stm %[r]!, {r4}\n\t"
  141127. "mov r3, #0\n\t"
  141128. /* A[20] * B */
  141129. "ldm %[a]!, {r8}\n\t"
  141130. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141131. "lsl r6, %[b], #16\n\t"
  141132. "lsl r7, r8, #16\n\t"
  141133. "lsr r6, r6, #16\n\t"
  141134. "lsr r7, r7, #16\n\t"
  141135. "mul r7, r6, r7\n\t"
  141136. "adds r5, r5, r7\n\t"
  141137. "adc r3, r3, #0\n\t"
  141138. "lsr r7, r8, #16\n\t"
  141139. "mul r6, r7, r6\n\t"
  141140. "lsr r7, r6, #16\n\t"
  141141. "lsl r6, r6, #16\n\t"
  141142. "adds r5, r5, r6\n\t"
  141143. "adc r3, r3, r7\n\t"
  141144. "lsr r6, %[b], #16\n\t"
  141145. "lsr r7, r8, #16\n\t"
  141146. "mul r7, r6, r7\n\t"
  141147. "add r3, r3, r7\n\t"
  141148. "lsl r7, r8, #16\n\t"
  141149. "lsr r7, r7, #16\n\t"
  141150. "mul r6, r7, r6\n\t"
  141151. "lsr r7, r6, #16\n\t"
  141152. "lsl r6, r6, #16\n\t"
  141153. "adds r5, r5, r6\n\t"
  141154. "adc r3, r3, r7\n\t"
  141155. #else
  141156. "umlal r5, r3, %[b], r8\n\t"
  141157. #endif
  141158. "stm %[r]!, {r5}\n\t"
  141159. "mov r4, #0\n\t"
  141160. /* A[21] * B */
  141161. "ldm %[a]!, {r8}\n\t"
  141162. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141163. "lsl r6, %[b], #16\n\t"
  141164. "lsl r7, r8, #16\n\t"
  141165. "lsr r6, r6, #16\n\t"
  141166. "lsr r7, r7, #16\n\t"
  141167. "mul r7, r6, r7\n\t"
  141168. "adds r3, r3, r7\n\t"
  141169. "adc r4, r4, #0\n\t"
  141170. "lsr r7, r8, #16\n\t"
  141171. "mul r6, r7, r6\n\t"
  141172. "lsr r7, r6, #16\n\t"
  141173. "lsl r6, r6, #16\n\t"
  141174. "adds r3, r3, r6\n\t"
  141175. "adc r4, r4, r7\n\t"
  141176. "lsr r6, %[b], #16\n\t"
  141177. "lsr r7, r8, #16\n\t"
  141178. "mul r7, r6, r7\n\t"
  141179. "add r4, r4, r7\n\t"
  141180. "lsl r7, r8, #16\n\t"
  141181. "lsr r7, r7, #16\n\t"
  141182. "mul r6, r7, r6\n\t"
  141183. "lsr r7, r6, #16\n\t"
  141184. "lsl r6, r6, #16\n\t"
  141185. "adds r3, r3, r6\n\t"
  141186. "adc r4, r4, r7\n\t"
  141187. #else
  141188. "umlal r3, r4, %[b], r8\n\t"
  141189. #endif
  141190. "stm %[r]!, {r3}\n\t"
  141191. "mov r5, #0\n\t"
  141192. /* A[22] * B */
  141193. "ldm %[a]!, {r8}\n\t"
  141194. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141195. "lsl r6, %[b], #16\n\t"
  141196. "lsl r7, r8, #16\n\t"
  141197. "lsr r6, r6, #16\n\t"
  141198. "lsr r7, r7, #16\n\t"
  141199. "mul r7, r6, r7\n\t"
  141200. "adds r4, r4, r7\n\t"
  141201. "adc r5, r5, #0\n\t"
  141202. "lsr r7, r8, #16\n\t"
  141203. "mul r6, r7, r6\n\t"
  141204. "lsr r7, r6, #16\n\t"
  141205. "lsl r6, r6, #16\n\t"
  141206. "adds r4, r4, r6\n\t"
  141207. "adc r5, r5, r7\n\t"
  141208. "lsr r6, %[b], #16\n\t"
  141209. "lsr r7, r8, #16\n\t"
  141210. "mul r7, r6, r7\n\t"
  141211. "add r5, r5, r7\n\t"
  141212. "lsl r7, r8, #16\n\t"
  141213. "lsr r7, r7, #16\n\t"
  141214. "mul r6, r7, r6\n\t"
  141215. "lsr r7, r6, #16\n\t"
  141216. "lsl r6, r6, #16\n\t"
  141217. "adds r4, r4, r6\n\t"
  141218. "adc r5, r5, r7\n\t"
  141219. #else
  141220. "umlal r4, r5, %[b], r8\n\t"
  141221. #endif
  141222. "stm %[r]!, {r4}\n\t"
  141223. "mov r3, #0\n\t"
  141224. /* A[23] * B */
  141225. "ldm %[a]!, {r8}\n\t"
  141226. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141227. "lsl r6, %[b], #16\n\t"
  141228. "lsl r7, r8, #16\n\t"
  141229. "lsr r6, r6, #16\n\t"
  141230. "lsr r7, r7, #16\n\t"
  141231. "mul r7, r6, r7\n\t"
  141232. "adds r5, r5, r7\n\t"
  141233. "adc r3, r3, #0\n\t"
  141234. "lsr r7, r8, #16\n\t"
  141235. "mul r6, r7, r6\n\t"
  141236. "lsr r7, r6, #16\n\t"
  141237. "lsl r6, r6, #16\n\t"
  141238. "adds r5, r5, r6\n\t"
  141239. "adc r3, r3, r7\n\t"
  141240. "lsr r6, %[b], #16\n\t"
  141241. "lsr r7, r8, #16\n\t"
  141242. "mul r7, r6, r7\n\t"
  141243. "add r3, r3, r7\n\t"
  141244. "lsl r7, r8, #16\n\t"
  141245. "lsr r7, r7, #16\n\t"
  141246. "mul r6, r7, r6\n\t"
  141247. "lsr r7, r6, #16\n\t"
  141248. "lsl r6, r6, #16\n\t"
  141249. "adds r5, r5, r6\n\t"
  141250. "adc r3, r3, r7\n\t"
  141251. #else
  141252. "umlal r5, r3, %[b], r8\n\t"
  141253. #endif
  141254. "stm %[r]!, {r5}\n\t"
  141255. "mov r4, #0\n\t"
  141256. /* A[24] * B */
  141257. "ldm %[a]!, {r8}\n\t"
  141258. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141259. "lsl r6, %[b], #16\n\t"
  141260. "lsl r7, r8, #16\n\t"
  141261. "lsr r6, r6, #16\n\t"
  141262. "lsr r7, r7, #16\n\t"
  141263. "mul r7, r6, r7\n\t"
  141264. "adds r3, r3, r7\n\t"
  141265. "adc r4, r4, #0\n\t"
  141266. "lsr r7, r8, #16\n\t"
  141267. "mul r6, r7, r6\n\t"
  141268. "lsr r7, r6, #16\n\t"
  141269. "lsl r6, r6, #16\n\t"
  141270. "adds r3, r3, r6\n\t"
  141271. "adc r4, r4, r7\n\t"
  141272. "lsr r6, %[b], #16\n\t"
  141273. "lsr r7, r8, #16\n\t"
  141274. "mul r7, r6, r7\n\t"
  141275. "add r4, r4, r7\n\t"
  141276. "lsl r7, r8, #16\n\t"
  141277. "lsr r7, r7, #16\n\t"
  141278. "mul r6, r7, r6\n\t"
  141279. "lsr r7, r6, #16\n\t"
  141280. "lsl r6, r6, #16\n\t"
  141281. "adds r3, r3, r6\n\t"
  141282. "adc r4, r4, r7\n\t"
  141283. #else
  141284. "umlal r3, r4, %[b], r8\n\t"
  141285. #endif
  141286. "stm %[r]!, {r3}\n\t"
  141287. "mov r5, #0\n\t"
  141288. /* A[25] * B */
  141289. "ldm %[a]!, {r8}\n\t"
  141290. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141291. "lsl r6, %[b], #16\n\t"
  141292. "lsl r7, r8, #16\n\t"
  141293. "lsr r6, r6, #16\n\t"
  141294. "lsr r7, r7, #16\n\t"
  141295. "mul r7, r6, r7\n\t"
  141296. "adds r4, r4, r7\n\t"
  141297. "adc r5, r5, #0\n\t"
  141298. "lsr r7, r8, #16\n\t"
  141299. "mul r6, r7, r6\n\t"
  141300. "lsr r7, r6, #16\n\t"
  141301. "lsl r6, r6, #16\n\t"
  141302. "adds r4, r4, r6\n\t"
  141303. "adc r5, r5, r7\n\t"
  141304. "lsr r6, %[b], #16\n\t"
  141305. "lsr r7, r8, #16\n\t"
  141306. "mul r7, r6, r7\n\t"
  141307. "add r5, r5, r7\n\t"
  141308. "lsl r7, r8, #16\n\t"
  141309. "lsr r7, r7, #16\n\t"
  141310. "mul r6, r7, r6\n\t"
  141311. "lsr r7, r6, #16\n\t"
  141312. "lsl r6, r6, #16\n\t"
  141313. "adds r4, r4, r6\n\t"
  141314. "adc r5, r5, r7\n\t"
  141315. #else
  141316. "umlal r4, r5, %[b], r8\n\t"
  141317. #endif
  141318. "stm %[r]!, {r4}\n\t"
  141319. "mov r3, #0\n\t"
  141320. /* A[26] * B */
  141321. "ldm %[a]!, {r8}\n\t"
  141322. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141323. "lsl r6, %[b], #16\n\t"
  141324. "lsl r7, r8, #16\n\t"
  141325. "lsr r6, r6, #16\n\t"
  141326. "lsr r7, r7, #16\n\t"
  141327. "mul r7, r6, r7\n\t"
  141328. "adds r5, r5, r7\n\t"
  141329. "adc r3, r3, #0\n\t"
  141330. "lsr r7, r8, #16\n\t"
  141331. "mul r6, r7, r6\n\t"
  141332. "lsr r7, r6, #16\n\t"
  141333. "lsl r6, r6, #16\n\t"
  141334. "adds r5, r5, r6\n\t"
  141335. "adc r3, r3, r7\n\t"
  141336. "lsr r6, %[b], #16\n\t"
  141337. "lsr r7, r8, #16\n\t"
  141338. "mul r7, r6, r7\n\t"
  141339. "add r3, r3, r7\n\t"
  141340. "lsl r7, r8, #16\n\t"
  141341. "lsr r7, r7, #16\n\t"
  141342. "mul r6, r7, r6\n\t"
  141343. "lsr r7, r6, #16\n\t"
  141344. "lsl r6, r6, #16\n\t"
  141345. "adds r5, r5, r6\n\t"
  141346. "adc r3, r3, r7\n\t"
  141347. #else
  141348. "umlal r5, r3, %[b], r8\n\t"
  141349. #endif
  141350. "stm %[r]!, {r5}\n\t"
  141351. "mov r4, #0\n\t"
  141352. /* A[27] * B */
  141353. "ldm %[a]!, {r8}\n\t"
  141354. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141355. "lsl r6, %[b], #16\n\t"
  141356. "lsl r7, r8, #16\n\t"
  141357. "lsr r6, r6, #16\n\t"
  141358. "lsr r7, r7, #16\n\t"
  141359. "mul r7, r6, r7\n\t"
  141360. "adds r3, r3, r7\n\t"
  141361. "adc r4, r4, #0\n\t"
  141362. "lsr r7, r8, #16\n\t"
  141363. "mul r6, r7, r6\n\t"
  141364. "lsr r7, r6, #16\n\t"
  141365. "lsl r6, r6, #16\n\t"
  141366. "adds r3, r3, r6\n\t"
  141367. "adc r4, r4, r7\n\t"
  141368. "lsr r6, %[b], #16\n\t"
  141369. "lsr r7, r8, #16\n\t"
  141370. "mul r7, r6, r7\n\t"
  141371. "add r4, r4, r7\n\t"
  141372. "lsl r7, r8, #16\n\t"
  141373. "lsr r7, r7, #16\n\t"
  141374. "mul r6, r7, r6\n\t"
  141375. "lsr r7, r6, #16\n\t"
  141376. "lsl r6, r6, #16\n\t"
  141377. "adds r3, r3, r6\n\t"
  141378. "adc r4, r4, r7\n\t"
  141379. #else
  141380. "umlal r3, r4, %[b], r8\n\t"
  141381. #endif
  141382. "stm %[r]!, {r3}\n\t"
  141383. "mov r5, #0\n\t"
  141384. /* A[28] * B */
  141385. "ldm %[a]!, {r8}\n\t"
  141386. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141387. "lsl r6, %[b], #16\n\t"
  141388. "lsl r7, r8, #16\n\t"
  141389. "lsr r6, r6, #16\n\t"
  141390. "lsr r7, r7, #16\n\t"
  141391. "mul r7, r6, r7\n\t"
  141392. "adds r4, r4, r7\n\t"
  141393. "adc r5, r5, #0\n\t"
  141394. "lsr r7, r8, #16\n\t"
  141395. "mul r6, r7, r6\n\t"
  141396. "lsr r7, r6, #16\n\t"
  141397. "lsl r6, r6, #16\n\t"
  141398. "adds r4, r4, r6\n\t"
  141399. "adc r5, r5, r7\n\t"
  141400. "lsr r6, %[b], #16\n\t"
  141401. "lsr r7, r8, #16\n\t"
  141402. "mul r7, r6, r7\n\t"
  141403. "add r5, r5, r7\n\t"
  141404. "lsl r7, r8, #16\n\t"
  141405. "lsr r7, r7, #16\n\t"
  141406. "mul r6, r7, r6\n\t"
  141407. "lsr r7, r6, #16\n\t"
  141408. "lsl r6, r6, #16\n\t"
  141409. "adds r4, r4, r6\n\t"
  141410. "adc r5, r5, r7\n\t"
  141411. #else
  141412. "umlal r4, r5, %[b], r8\n\t"
  141413. #endif
  141414. "stm %[r]!, {r4}\n\t"
  141415. "mov r3, #0\n\t"
  141416. /* A[29] * B */
  141417. "ldm %[a]!, {r8}\n\t"
  141418. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141419. "lsl r6, %[b], #16\n\t"
  141420. "lsl r7, r8, #16\n\t"
  141421. "lsr r6, r6, #16\n\t"
  141422. "lsr r7, r7, #16\n\t"
  141423. "mul r7, r6, r7\n\t"
  141424. "adds r5, r5, r7\n\t"
  141425. "adc r3, r3, #0\n\t"
  141426. "lsr r7, r8, #16\n\t"
  141427. "mul r6, r7, r6\n\t"
  141428. "lsr r7, r6, #16\n\t"
  141429. "lsl r6, r6, #16\n\t"
  141430. "adds r5, r5, r6\n\t"
  141431. "adc r3, r3, r7\n\t"
  141432. "lsr r6, %[b], #16\n\t"
  141433. "lsr r7, r8, #16\n\t"
  141434. "mul r7, r6, r7\n\t"
  141435. "add r3, r3, r7\n\t"
  141436. "lsl r7, r8, #16\n\t"
  141437. "lsr r7, r7, #16\n\t"
  141438. "mul r6, r7, r6\n\t"
  141439. "lsr r7, r6, #16\n\t"
  141440. "lsl r6, r6, #16\n\t"
  141441. "adds r5, r5, r6\n\t"
  141442. "adc r3, r3, r7\n\t"
  141443. #else
  141444. "umlal r5, r3, %[b], r8\n\t"
  141445. #endif
  141446. "stm %[r]!, {r5}\n\t"
  141447. "mov r4, #0\n\t"
  141448. /* A[30] * B */
  141449. "ldm %[a]!, {r8}\n\t"
  141450. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141451. "lsl r6, %[b], #16\n\t"
  141452. "lsl r7, r8, #16\n\t"
  141453. "lsr r6, r6, #16\n\t"
  141454. "lsr r7, r7, #16\n\t"
  141455. "mul r7, r6, r7\n\t"
  141456. "adds r3, r3, r7\n\t"
  141457. "adc r4, r4, #0\n\t"
  141458. "lsr r7, r8, #16\n\t"
  141459. "mul r6, r7, r6\n\t"
  141460. "lsr r7, r6, #16\n\t"
  141461. "lsl r6, r6, #16\n\t"
  141462. "adds r3, r3, r6\n\t"
  141463. "adc r4, r4, r7\n\t"
  141464. "lsr r6, %[b], #16\n\t"
  141465. "lsr r7, r8, #16\n\t"
  141466. "mul r7, r6, r7\n\t"
  141467. "add r4, r4, r7\n\t"
  141468. "lsl r7, r8, #16\n\t"
  141469. "lsr r7, r7, #16\n\t"
  141470. "mul r6, r7, r6\n\t"
  141471. "lsr r7, r6, #16\n\t"
  141472. "lsl r6, r6, #16\n\t"
  141473. "adds r3, r3, r6\n\t"
  141474. "adc r4, r4, r7\n\t"
  141475. #else
  141476. "umlal r3, r4, %[b], r8\n\t"
  141477. #endif
  141478. "stm %[r]!, {r3}\n\t"
  141479. "mov r5, #0\n\t"
  141480. /* A[31] * B */
  141481. "ldm %[a]!, {r8}\n\t"
  141482. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141483. "lsl r6, %[b], #16\n\t"
  141484. "lsl r7, r8, #16\n\t"
  141485. "lsr r6, r6, #16\n\t"
  141486. "lsr r7, r7, #16\n\t"
  141487. "mul r7, r6, r7\n\t"
  141488. "adds r4, r4, r7\n\t"
  141489. "adc r5, r5, #0\n\t"
  141490. "lsr r7, r8, #16\n\t"
  141491. "mul r6, r7, r6\n\t"
  141492. "lsr r7, r6, #16\n\t"
  141493. "lsl r6, r6, #16\n\t"
  141494. "adds r4, r4, r6\n\t"
  141495. "adc r5, r5, r7\n\t"
  141496. "lsr r6, %[b], #16\n\t"
  141497. "lsr r7, r8, #16\n\t"
  141498. "mul r7, r6, r7\n\t"
  141499. "add r5, r5, r7\n\t"
  141500. "lsl r7, r8, #16\n\t"
  141501. "lsr r7, r7, #16\n\t"
  141502. "mul r6, r7, r6\n\t"
  141503. "lsr r7, r6, #16\n\t"
  141504. "lsl r6, r6, #16\n\t"
  141505. "adds r4, r4, r6\n\t"
  141506. "adc r5, r5, r7\n\t"
  141507. #else
  141508. "umlal r4, r5, %[b], r8\n\t"
  141509. #endif
  141510. "stm %[r]!, {r4}\n\t"
  141511. "str r5, [%[r]]\n\t"
  141512. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  141513. :
  141514. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc"
  141515. );
  141516. }
  141517. #endif /* WOLFSSL_SP_SMALL */
  141518. #ifdef WOLFSSL_SP_USE_UDIV
  141519. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  141520. *
  141521. * d1 The high order half of the number to divide.
  141522. * d0 The low order half of the number to divide.
  141523. * div The divisor.
  141524. * returns the result of the division.
  141525. *
  141526. * Note that this is an approximate div. It may give an answer 1 larger.
  141527. */
  141528. static sp_digit div_1024_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  141529. {
  141530. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  141531. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  141532. register sp_digit div asm ("r2") = (sp_digit)div_p;
  141533. __asm__ __volatile__ (
  141534. "lsr r6, %[div], #16\n\t"
  141535. "add lr, r6, #1\n\t"
  141536. "udiv r4, %[d1], lr\n\t"
  141537. "lsl r5, %[div], #16\n\t"
  141538. "lsl r4, r4, #16\n\t"
  141539. "umull r3, r12, %[div], r4\n\t"
  141540. "subs %[d0], %[d0], r3\n\t"
  141541. "sbc %[d1], %[d1], r12\n\t"
  141542. "subs r3, %[d1], lr\n\t"
  141543. "sbc r7, r7, r7\n\t"
  141544. "add r7, r7, #1\n\t"
  141545. "rsb r8, r7, #0\n\t"
  141546. "lsl r7, r7, #16\n\t"
  141547. "and r5, r5, r8\n\t"
  141548. "and r6, r6, r8\n\t"
  141549. "subs %[d0], %[d0], r5\n\t"
  141550. "add r4, r4, r7\n\t"
  141551. "sbc %[d1], %[d1], r6\n\t"
  141552. "lsl r12, %[d1], #16\n\t"
  141553. "lsr r3, %[d0], #16\n\t"
  141554. "orr r3, r3, r12\n\t"
  141555. "udiv r3, r3, lr\n\t"
  141556. "add r4, r4, r3\n\t"
  141557. "umull r3, r12, %[div], r3\n\t"
  141558. "subs %[d0], %[d0], r3\n\t"
  141559. "sbc %[d1], %[d1], r12\n\t"
  141560. "lsl r12, %[d1], #16\n\t"
  141561. "lsr r3, %[d0], #16\n\t"
  141562. "orr r3, r3, r12\n\t"
  141563. "udiv r3, r3, lr\n\t"
  141564. "add r4, r4, r3\n\t"
  141565. "mul r3, %[div], r3\n\t"
  141566. "sub %[d0], %[d0], r3\n\t"
  141567. "udiv r3, %[d0], %[div]\n\t"
  141568. "add %[d1], r4, r3\n\t"
  141569. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  141570. :
  141571. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  141572. );
  141573. return (uint32_t)(size_t)d1;
  141574. }
  141575. #else
  141576. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  141577. *
  141578. * d1 The high order half of the number to divide.
  141579. * d0 The low order half of the number to divide.
  141580. * div The divisor.
  141581. * returns the result of the division.
  141582. *
  141583. * Note that this is an approximate div. It may give an answer 1 larger.
  141584. */
  141585. static sp_digit div_1024_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  141586. {
  141587. register sp_digit d1 asm ("r0") = (sp_digit)d1_p;
  141588. register sp_digit d0 asm ("r1") = (sp_digit)d0_p;
  141589. register sp_digit div asm ("r2") = (sp_digit)div_p;
  141590. __asm__ __volatile__ (
  141591. "lsr lr, %[div], #1\n\t"
  141592. "add lr, lr, #1\n\t"
  141593. "mov r4, %[d0]\n\t"
  141594. "mov r5, %[d1]\n\t"
  141595. /* Do top 32 */
  141596. "subs r6, lr, r5\n\t"
  141597. "sbc r6, r6, r6\n\t"
  141598. "mov r3, #0\n\t"
  141599. "sub r3, r3, r6\n\t"
  141600. "and r6, r6, lr\n\t"
  141601. "subs r5, r5, r6\n\t"
  141602. /* Next 30 bits */
  141603. "mov r12, #29\n\t"
  141604. "\n"
  141605. "L_div_1024_word_32_bit_%=: \n\t"
  141606. "lsls r4, r4, #1\n\t"
  141607. "adc r5, r5, r5\n\t"
  141608. "subs r6, lr, r5\n\t"
  141609. "sbc r6, r6, r6\n\t"
  141610. "add r3, r3, r3\n\t"
  141611. "sub r3, r3, r6\n\t"
  141612. "and r6, r6, lr\n\t"
  141613. "subs r5, r5, r6\n\t"
  141614. "subs r12, r12, #1\n\t"
  141615. "bpl L_div_1024_word_32_bit_%=\n\t"
  141616. "add r3, r3, r3\n\t"
  141617. "add r3, r3, #1\n\t"
  141618. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141619. "lsl r7, r3, #16\n\t"
  141620. "lsl r4, %[div], #16\n\t"
  141621. "lsr r7, r7, #16\n\t"
  141622. "lsr r4, r4, #16\n\t"
  141623. "mul r4, r7, r4\n\t"
  141624. "lsr r8, %[div], #16\n\t"
  141625. "mul r7, r8, r7\n\t"
  141626. "lsr r5, r7, #16\n\t"
  141627. "lsl r7, r7, #16\n\t"
  141628. "adds r4, r4, r7\n\t"
  141629. "adc r5, r5, #0\n\t"
  141630. "lsr r7, r3, #16\n\t"
  141631. "mul r8, r7, r8\n\t"
  141632. "add r5, r5, r8\n\t"
  141633. "lsl r8, %[div], #16\n\t"
  141634. "lsr r8, r8, #16\n\t"
  141635. "mul r7, r8, r7\n\t"
  141636. "lsr r8, r7, #16\n\t"
  141637. "lsl r7, r7, #16\n\t"
  141638. "adds r4, r4, r7\n\t"
  141639. "adc r5, r5, r8\n\t"
  141640. #else
  141641. "umull r4, r5, r3, %[div]\n\t"
  141642. #endif
  141643. "subs r7, %[d0], r4\n\t"
  141644. "sbc r8, %[d1], r5\n\t"
  141645. "add r3, r3, r8\n\t"
  141646. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141647. "lsl r7, r3, #16\n\t"
  141648. "lsl r4, %[div], #16\n\t"
  141649. "lsr r7, r7, #16\n\t"
  141650. "lsr r4, r4, #16\n\t"
  141651. "mul r4, r7, r4\n\t"
  141652. "lsr r8, %[div], #16\n\t"
  141653. "mul r7, r8, r7\n\t"
  141654. "lsr r5, r7, #16\n\t"
  141655. "lsl r7, r7, #16\n\t"
  141656. "adds r4, r4, r7\n\t"
  141657. "adc r5, r5, #0\n\t"
  141658. "lsr r7, r3, #16\n\t"
  141659. "mul r8, r7, r8\n\t"
  141660. "add r5, r5, r8\n\t"
  141661. "lsl r8, %[div], #16\n\t"
  141662. "lsr r8, r8, #16\n\t"
  141663. "mul r7, r8, r7\n\t"
  141664. "lsr r8, r7, #16\n\t"
  141665. "lsl r7, r7, #16\n\t"
  141666. "adds r4, r4, r7\n\t"
  141667. "adc r5, r5, r8\n\t"
  141668. #else
  141669. "umull r4, r5, r3, %[div]\n\t"
  141670. #endif
  141671. "subs r7, %[d0], r4\n\t"
  141672. "sbc r8, %[d1], r5\n\t"
  141673. "add r3, r3, r8\n\t"
  141674. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  141675. "lsl r7, r3, #16\n\t"
  141676. "lsl r4, %[div], #16\n\t"
  141677. "lsr r7, r7, #16\n\t"
  141678. "lsr r4, r4, #16\n\t"
  141679. "mul r4, r7, r4\n\t"
  141680. "lsr r8, %[div], #16\n\t"
  141681. "mul r7, r8, r7\n\t"
  141682. "lsr r5, r7, #16\n\t"
  141683. "lsl r7, r7, #16\n\t"
  141684. "adds r4, r4, r7\n\t"
  141685. "adc r5, r5, #0\n\t"
  141686. "lsr r7, r3, #16\n\t"
  141687. "mul r8, r7, r8\n\t"
  141688. "add r5, r5, r8\n\t"
  141689. "lsl r8, %[div], #16\n\t"
  141690. "lsr r8, r8, #16\n\t"
  141691. "mul r7, r8, r7\n\t"
  141692. "lsr r8, r7, #16\n\t"
  141693. "lsl r7, r7, #16\n\t"
  141694. "adds r4, r4, r7\n\t"
  141695. "adc r5, r5, r8\n\t"
  141696. #else
  141697. "umull r4, r5, r3, %[div]\n\t"
  141698. #endif
  141699. "subs r7, %[d0], r4\n\t"
  141700. "sbc r8, %[d1], r5\n\t"
  141701. "add r3, r3, r8\n\t"
  141702. "subs r6, %[div], r7\n\t"
  141703. "sbc r6, r6, r6\n\t"
  141704. "sub %[d1], r3, r6\n\t"
  141705. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  141706. :
  141707. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  141708. );
  141709. return (uint32_t)(size_t)d1;
  141710. }
  141711. #endif
  141712. /* AND m into each word of a and store in r.
  141713. *
  141714. * r A single precision integer.
  141715. * a A single precision integer.
  141716. * m Mask to AND against each digit.
  141717. */
  141718. static void sp_1024_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  141719. {
  141720. #ifdef WOLFSSL_SP_SMALL
  141721. int i;
  141722. for (i=0; i<32; i++) {
  141723. r[i] = a[i] & m;
  141724. }
  141725. #else
  141726. int i;
  141727. for (i = 0; i < 32; i += 8) {
  141728. r[i+0] = a[i+0] & m;
  141729. r[i+1] = a[i+1] & m;
  141730. r[i+2] = a[i+2] & m;
  141731. r[i+3] = a[i+3] & m;
  141732. r[i+4] = a[i+4] & m;
  141733. r[i+5] = a[i+5] & m;
  141734. r[i+6] = a[i+6] & m;
  141735. r[i+7] = a[i+7] & m;
  141736. }
  141737. #endif
  141738. }
  141739. /* Compare a with b in constant time.
  141740. *
  141741. * a A single precision integer.
  141742. * b A single precision integer.
  141743. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  141744. * respectively.
  141745. */
  141746. static sp_int32 sp_1024_cmp_32(const sp_digit* a_p, const sp_digit* b_p)
  141747. {
  141748. register const sp_digit* a asm ("r0") = (const sp_digit*)a_p;
  141749. register const sp_digit* b asm ("r1") = (const sp_digit*)b_p;
  141750. __asm__ __volatile__ (
  141751. "mov r2, #-1\n\t"
  141752. "mov r6, #1\n\t"
  141753. "mov r5, #0\n\t"
  141754. "mov r3, #-1\n\t"
  141755. #ifdef WOLFSSL_SP_SMALL
  141756. "mov r4, #0x7c\n\t"
  141757. "\n"
  141758. "L_sp_1024_cmp_32_words_%=: \n\t"
  141759. "ldr r12, [%[a], r4]\n\t"
  141760. "ldr lr, [%[b], r4]\n\t"
  141761. "and r12, r12, r3\n\t"
  141762. "and lr, lr, r3\n\t"
  141763. "subs r12, r12, lr\n\t"
  141764. "it hi\n\t"
  141765. "movhi r2, r6\n\t"
  141766. "it lo\n\t"
  141767. "movlo r2, r3\n\t"
  141768. "it ne\n\t"
  141769. "movne r3, r5\n\t"
  141770. "subs r4, r4, #4\n\t"
  141771. "bcs L_sp_1024_cmp_32_words_%=\n\t"
  141772. "eor r2, r2, r3\n\t"
  141773. #else
  141774. "ldr r12, [%[a], #124]\n\t"
  141775. "ldr lr, [%[b], #124]\n\t"
  141776. "and r12, r12, r3\n\t"
  141777. "and lr, lr, r3\n\t"
  141778. "subs r12, r12, lr\n\t"
  141779. "it hi\n\t"
  141780. "movhi r2, r6\n\t"
  141781. "it lo\n\t"
  141782. "movlo r2, r3\n\t"
  141783. "it ne\n\t"
  141784. "movne r3, r5\n\t"
  141785. "ldr r12, [%[a], #120]\n\t"
  141786. "ldr lr, [%[b], #120]\n\t"
  141787. "and r12, r12, r3\n\t"
  141788. "and lr, lr, r3\n\t"
  141789. "subs r12, r12, lr\n\t"
  141790. "it hi\n\t"
  141791. "movhi r2, r6\n\t"
  141792. "it lo\n\t"
  141793. "movlo r2, r3\n\t"
  141794. "it ne\n\t"
  141795. "movne r3, r5\n\t"
  141796. "ldr r12, [%[a], #116]\n\t"
  141797. "ldr lr, [%[b], #116]\n\t"
  141798. "and r12, r12, r3\n\t"
  141799. "and lr, lr, r3\n\t"
  141800. "subs r12, r12, lr\n\t"
  141801. "it hi\n\t"
  141802. "movhi r2, r6\n\t"
  141803. "it lo\n\t"
  141804. "movlo r2, r3\n\t"
  141805. "it ne\n\t"
  141806. "movne r3, r5\n\t"
  141807. "ldr r12, [%[a], #112]\n\t"
  141808. "ldr lr, [%[b], #112]\n\t"
  141809. "and r12, r12, r3\n\t"
  141810. "and lr, lr, r3\n\t"
  141811. "subs r12, r12, lr\n\t"
  141812. "it hi\n\t"
  141813. "movhi r2, r6\n\t"
  141814. "it lo\n\t"
  141815. "movlo r2, r3\n\t"
  141816. "it ne\n\t"
  141817. "movne r3, r5\n\t"
  141818. "ldr r12, [%[a], #108]\n\t"
  141819. "ldr lr, [%[b], #108]\n\t"
  141820. "and r12, r12, r3\n\t"
  141821. "and lr, lr, r3\n\t"
  141822. "subs r12, r12, lr\n\t"
  141823. "it hi\n\t"
  141824. "movhi r2, r6\n\t"
  141825. "it lo\n\t"
  141826. "movlo r2, r3\n\t"
  141827. "it ne\n\t"
  141828. "movne r3, r5\n\t"
  141829. "ldr r12, [%[a], #104]\n\t"
  141830. "ldr lr, [%[b], #104]\n\t"
  141831. "and r12, r12, r3\n\t"
  141832. "and lr, lr, r3\n\t"
  141833. "subs r12, r12, lr\n\t"
  141834. "it hi\n\t"
  141835. "movhi r2, r6\n\t"
  141836. "it lo\n\t"
  141837. "movlo r2, r3\n\t"
  141838. "it ne\n\t"
  141839. "movne r3, r5\n\t"
  141840. "ldr r12, [%[a], #100]\n\t"
  141841. "ldr lr, [%[b], #100]\n\t"
  141842. "and r12, r12, r3\n\t"
  141843. "and lr, lr, r3\n\t"
  141844. "subs r12, r12, lr\n\t"
  141845. "it hi\n\t"
  141846. "movhi r2, r6\n\t"
  141847. "it lo\n\t"
  141848. "movlo r2, r3\n\t"
  141849. "it ne\n\t"
  141850. "movne r3, r5\n\t"
  141851. "ldr r12, [%[a], #96]\n\t"
  141852. "ldr lr, [%[b], #96]\n\t"
  141853. "and r12, r12, r3\n\t"
  141854. "and lr, lr, r3\n\t"
  141855. "subs r12, r12, lr\n\t"
  141856. "it hi\n\t"
  141857. "movhi r2, r6\n\t"
  141858. "it lo\n\t"
  141859. "movlo r2, r3\n\t"
  141860. "it ne\n\t"
  141861. "movne r3, r5\n\t"
  141862. "ldr r12, [%[a], #92]\n\t"
  141863. "ldr lr, [%[b], #92]\n\t"
  141864. "and r12, r12, r3\n\t"
  141865. "and lr, lr, r3\n\t"
  141866. "subs r12, r12, lr\n\t"
  141867. "it hi\n\t"
  141868. "movhi r2, r6\n\t"
  141869. "it lo\n\t"
  141870. "movlo r2, r3\n\t"
  141871. "it ne\n\t"
  141872. "movne r3, r5\n\t"
  141873. "ldr r12, [%[a], #88]\n\t"
  141874. "ldr lr, [%[b], #88]\n\t"
  141875. "and r12, r12, r3\n\t"
  141876. "and lr, lr, r3\n\t"
  141877. "subs r12, r12, lr\n\t"
  141878. "it hi\n\t"
  141879. "movhi r2, r6\n\t"
  141880. "it lo\n\t"
  141881. "movlo r2, r3\n\t"
  141882. "it ne\n\t"
  141883. "movne r3, r5\n\t"
  141884. "ldr r12, [%[a], #84]\n\t"
  141885. "ldr lr, [%[b], #84]\n\t"
  141886. "and r12, r12, r3\n\t"
  141887. "and lr, lr, r3\n\t"
  141888. "subs r12, r12, lr\n\t"
  141889. "it hi\n\t"
  141890. "movhi r2, r6\n\t"
  141891. "it lo\n\t"
  141892. "movlo r2, r3\n\t"
  141893. "it ne\n\t"
  141894. "movne r3, r5\n\t"
  141895. "ldr r12, [%[a], #80]\n\t"
  141896. "ldr lr, [%[b], #80]\n\t"
  141897. "and r12, r12, r3\n\t"
  141898. "and lr, lr, r3\n\t"
  141899. "subs r12, r12, lr\n\t"
  141900. "it hi\n\t"
  141901. "movhi r2, r6\n\t"
  141902. "it lo\n\t"
  141903. "movlo r2, r3\n\t"
  141904. "it ne\n\t"
  141905. "movne r3, r5\n\t"
  141906. "ldr r12, [%[a], #76]\n\t"
  141907. "ldr lr, [%[b], #76]\n\t"
  141908. "and r12, r12, r3\n\t"
  141909. "and lr, lr, r3\n\t"
  141910. "subs r12, r12, lr\n\t"
  141911. "it hi\n\t"
  141912. "movhi r2, r6\n\t"
  141913. "it lo\n\t"
  141914. "movlo r2, r3\n\t"
  141915. "it ne\n\t"
  141916. "movne r3, r5\n\t"
  141917. "ldr r12, [%[a], #72]\n\t"
  141918. "ldr lr, [%[b], #72]\n\t"
  141919. "and r12, r12, r3\n\t"
  141920. "and lr, lr, r3\n\t"
  141921. "subs r12, r12, lr\n\t"
  141922. "it hi\n\t"
  141923. "movhi r2, r6\n\t"
  141924. "it lo\n\t"
  141925. "movlo r2, r3\n\t"
  141926. "it ne\n\t"
  141927. "movne r3, r5\n\t"
  141928. "ldr r12, [%[a], #68]\n\t"
  141929. "ldr lr, [%[b], #68]\n\t"
  141930. "and r12, r12, r3\n\t"
  141931. "and lr, lr, r3\n\t"
  141932. "subs r12, r12, lr\n\t"
  141933. "it hi\n\t"
  141934. "movhi r2, r6\n\t"
  141935. "it lo\n\t"
  141936. "movlo r2, r3\n\t"
  141937. "it ne\n\t"
  141938. "movne r3, r5\n\t"
  141939. "ldr r12, [%[a], #64]\n\t"
  141940. "ldr lr, [%[b], #64]\n\t"
  141941. "and r12, r12, r3\n\t"
  141942. "and lr, lr, r3\n\t"
  141943. "subs r12, r12, lr\n\t"
  141944. "it hi\n\t"
  141945. "movhi r2, r6\n\t"
  141946. "it lo\n\t"
  141947. "movlo r2, r3\n\t"
  141948. "it ne\n\t"
  141949. "movne r3, r5\n\t"
  141950. "ldr r12, [%[a], #60]\n\t"
  141951. "ldr lr, [%[b], #60]\n\t"
  141952. "and r12, r12, r3\n\t"
  141953. "and lr, lr, r3\n\t"
  141954. "subs r12, r12, lr\n\t"
  141955. "it hi\n\t"
  141956. "movhi r2, r6\n\t"
  141957. "it lo\n\t"
  141958. "movlo r2, r3\n\t"
  141959. "it ne\n\t"
  141960. "movne r3, r5\n\t"
  141961. "ldr r12, [%[a], #56]\n\t"
  141962. "ldr lr, [%[b], #56]\n\t"
  141963. "and r12, r12, r3\n\t"
  141964. "and lr, lr, r3\n\t"
  141965. "subs r12, r12, lr\n\t"
  141966. "it hi\n\t"
  141967. "movhi r2, r6\n\t"
  141968. "it lo\n\t"
  141969. "movlo r2, r3\n\t"
  141970. "it ne\n\t"
  141971. "movne r3, r5\n\t"
  141972. "ldr r12, [%[a], #52]\n\t"
  141973. "ldr lr, [%[b], #52]\n\t"
  141974. "and r12, r12, r3\n\t"
  141975. "and lr, lr, r3\n\t"
  141976. "subs r12, r12, lr\n\t"
  141977. "it hi\n\t"
  141978. "movhi r2, r6\n\t"
  141979. "it lo\n\t"
  141980. "movlo r2, r3\n\t"
  141981. "it ne\n\t"
  141982. "movne r3, r5\n\t"
  141983. "ldr r12, [%[a], #48]\n\t"
  141984. "ldr lr, [%[b], #48]\n\t"
  141985. "and r12, r12, r3\n\t"
  141986. "and lr, lr, r3\n\t"
  141987. "subs r12, r12, lr\n\t"
  141988. "it hi\n\t"
  141989. "movhi r2, r6\n\t"
  141990. "it lo\n\t"
  141991. "movlo r2, r3\n\t"
  141992. "it ne\n\t"
  141993. "movne r3, r5\n\t"
  141994. "ldr r12, [%[a], #44]\n\t"
  141995. "ldr lr, [%[b], #44]\n\t"
  141996. "and r12, r12, r3\n\t"
  141997. "and lr, lr, r3\n\t"
  141998. "subs r12, r12, lr\n\t"
  141999. "it hi\n\t"
  142000. "movhi r2, r6\n\t"
  142001. "it lo\n\t"
  142002. "movlo r2, r3\n\t"
  142003. "it ne\n\t"
  142004. "movne r3, r5\n\t"
  142005. "ldr r12, [%[a], #40]\n\t"
  142006. "ldr lr, [%[b], #40]\n\t"
  142007. "and r12, r12, r3\n\t"
  142008. "and lr, lr, r3\n\t"
  142009. "subs r12, r12, lr\n\t"
  142010. "it hi\n\t"
  142011. "movhi r2, r6\n\t"
  142012. "it lo\n\t"
  142013. "movlo r2, r3\n\t"
  142014. "it ne\n\t"
  142015. "movne r3, r5\n\t"
  142016. "ldr r12, [%[a], #36]\n\t"
  142017. "ldr lr, [%[b], #36]\n\t"
  142018. "and r12, r12, r3\n\t"
  142019. "and lr, lr, r3\n\t"
  142020. "subs r12, r12, lr\n\t"
  142021. "it hi\n\t"
  142022. "movhi r2, r6\n\t"
  142023. "it lo\n\t"
  142024. "movlo r2, r3\n\t"
  142025. "it ne\n\t"
  142026. "movne r3, r5\n\t"
  142027. "ldr r12, [%[a], #32]\n\t"
  142028. "ldr lr, [%[b], #32]\n\t"
  142029. "and r12, r12, r3\n\t"
  142030. "and lr, lr, r3\n\t"
  142031. "subs r12, r12, lr\n\t"
  142032. "it hi\n\t"
  142033. "movhi r2, r6\n\t"
  142034. "it lo\n\t"
  142035. "movlo r2, r3\n\t"
  142036. "it ne\n\t"
  142037. "movne r3, r5\n\t"
  142038. "ldr r12, [%[a], #28]\n\t"
  142039. "ldr lr, [%[b], #28]\n\t"
  142040. "and r12, r12, r3\n\t"
  142041. "and lr, lr, r3\n\t"
  142042. "subs r12, r12, lr\n\t"
  142043. "it hi\n\t"
  142044. "movhi r2, r6\n\t"
  142045. "it lo\n\t"
  142046. "movlo r2, r3\n\t"
  142047. "it ne\n\t"
  142048. "movne r3, r5\n\t"
  142049. "ldr r12, [%[a], #24]\n\t"
  142050. "ldr lr, [%[b], #24]\n\t"
  142051. "and r12, r12, r3\n\t"
  142052. "and lr, lr, r3\n\t"
  142053. "subs r12, r12, lr\n\t"
  142054. "it hi\n\t"
  142055. "movhi r2, r6\n\t"
  142056. "it lo\n\t"
  142057. "movlo r2, r3\n\t"
  142058. "it ne\n\t"
  142059. "movne r3, r5\n\t"
  142060. "ldr r12, [%[a], #20]\n\t"
  142061. "ldr lr, [%[b], #20]\n\t"
  142062. "and r12, r12, r3\n\t"
  142063. "and lr, lr, r3\n\t"
  142064. "subs r12, r12, lr\n\t"
  142065. "it hi\n\t"
  142066. "movhi r2, r6\n\t"
  142067. "it lo\n\t"
  142068. "movlo r2, r3\n\t"
  142069. "it ne\n\t"
  142070. "movne r3, r5\n\t"
  142071. "ldr r12, [%[a], #16]\n\t"
  142072. "ldr lr, [%[b], #16]\n\t"
  142073. "and r12, r12, r3\n\t"
  142074. "and lr, lr, r3\n\t"
  142075. "subs r12, r12, lr\n\t"
  142076. "it hi\n\t"
  142077. "movhi r2, r6\n\t"
  142078. "it lo\n\t"
  142079. "movlo r2, r3\n\t"
  142080. "it ne\n\t"
  142081. "movne r3, r5\n\t"
  142082. "ldr r12, [%[a], #12]\n\t"
  142083. "ldr lr, [%[b], #12]\n\t"
  142084. "and r12, r12, r3\n\t"
  142085. "and lr, lr, r3\n\t"
  142086. "subs r12, r12, lr\n\t"
  142087. "it hi\n\t"
  142088. "movhi r2, r6\n\t"
  142089. "it lo\n\t"
  142090. "movlo r2, r3\n\t"
  142091. "it ne\n\t"
  142092. "movne r3, r5\n\t"
  142093. "ldr r12, [%[a], #8]\n\t"
  142094. "ldr lr, [%[b], #8]\n\t"
  142095. "and r12, r12, r3\n\t"
  142096. "and lr, lr, r3\n\t"
  142097. "subs r12, r12, lr\n\t"
  142098. "it hi\n\t"
  142099. "movhi r2, r6\n\t"
  142100. "it lo\n\t"
  142101. "movlo r2, r3\n\t"
  142102. "it ne\n\t"
  142103. "movne r3, r5\n\t"
  142104. "ldr r12, [%[a], #4]\n\t"
  142105. "ldr lr, [%[b], #4]\n\t"
  142106. "and r12, r12, r3\n\t"
  142107. "and lr, lr, r3\n\t"
  142108. "subs r12, r12, lr\n\t"
  142109. "it hi\n\t"
  142110. "movhi r2, r6\n\t"
  142111. "it lo\n\t"
  142112. "movlo r2, r3\n\t"
  142113. "it ne\n\t"
  142114. "movne r3, r5\n\t"
  142115. "ldr r12, [%[a]]\n\t"
  142116. "ldr lr, [%[b]]\n\t"
  142117. "and r12, r12, r3\n\t"
  142118. "and lr, lr, r3\n\t"
  142119. "subs r12, r12, lr\n\t"
  142120. "it hi\n\t"
  142121. "movhi r2, r6\n\t"
  142122. "it lo\n\t"
  142123. "movlo r2, r3\n\t"
  142124. "it ne\n\t"
  142125. "movne r3, r5\n\t"
  142126. "eor r2, r2, r3\n\t"
  142127. #endif /*WOLFSSL_SP_SMALL */
  142128. "mov %[a], r2\n\t"
  142129. : [a] "+r" (a), [b] "+r" (b)
  142130. :
  142131. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc"
  142132. );
  142133. return (uint32_t)(size_t)a;
  142134. }
  142135. /* Divide d in a and put remainder into r (m*d + r = a)
  142136. * m is not calculated as it is not needed at this time.
  142137. *
  142138. * a Number to be divided.
  142139. * d Number to divide with.
  142140. * m Multiplier result.
  142141. * r Remainder from the division.
  142142. * returns MP_OKAY indicating success.
  142143. */
  142144. static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d,
  142145. sp_digit* m, sp_digit* r)
  142146. {
  142147. sp_digit t1[64], t2[33];
  142148. sp_digit div, r1;
  142149. int i;
  142150. (void)m;
  142151. div = d[31];
  142152. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  142153. r1 = sp_1024_cmp_32(&t1[32], d) >= 0;
  142154. sp_1024_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  142155. for (i = 31; i >= 0; i--) {
  142156. volatile sp_digit mask = (sp_digit)0 - (t1[32 + i] == div);
  142157. sp_digit hi = t1[32 + i] + mask;
  142158. r1 = div_1024_word_32(hi, t1[32 + i - 1], div);
  142159. r1 |= mask;
  142160. sp_1024_mul_d_32(t2, d, r1);
  142161. t1[32 + i] += sp_1024_sub_in_place_32(&t1[i], t2);
  142162. t1[32 + i] -= t2[32];
  142163. sp_1024_mask_32(t2, d, t1[32 + i]);
  142164. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  142165. sp_1024_mask_32(t2, d, t1[32 + i]);
  142166. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  142167. }
  142168. r1 = sp_1024_cmp_32(t1, d) >= 0;
  142169. sp_1024_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  142170. return MP_OKAY;
  142171. }
  142172. /* Reduce a modulo m into r. (r = a mod m)
  142173. *
  142174. * r A single precision number that is the reduced result.
  142175. * a A single precision number that is to be reduced.
  142176. * m A single precision number that is the modulus to reduce with.
  142177. * returns MP_OKAY indicating success.
  142178. */
  142179. static WC_INLINE int sp_1024_mod_32(sp_digit* r, const sp_digit* a,
  142180. const sp_digit* m)
  142181. {
  142182. return sp_1024_div_32(a, m, NULL, r);
  142183. }
  142184. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  142185. *
  142186. * r The resulting Montgomery form number.
  142187. * a The number to convert.
  142188. * m The modulus (prime).
  142189. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  142190. */
  142191. static int sp_1024_mod_mul_norm_32(sp_digit* r, const sp_digit* a,
  142192. const sp_digit* m)
  142193. {
  142194. sp_1024_mul_32(r, a, p1024_norm_mod);
  142195. return sp_1024_mod_32(r, r, m);
  142196. }
  142197. #ifdef WOLFCRYPT_HAVE_SAKKE
  142198. /* Create a new point.
  142199. *
  142200. * heap [in] Buffer to allocate dynamic memory from.
  142201. * sp [in] Data for point - only if not allocating.
  142202. * p [out] New point.
  142203. * returns MEMORY_E when dynamic memory allocation fails and 0 otherwise.
  142204. */
  142205. static int sp_1024_point_new_ex_32(void* heap, sp_point_1024* sp,
  142206. sp_point_1024** p)
  142207. {
  142208. int ret = MP_OKAY;
  142209. (void)heap;
  142210. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  142211. defined(WOLFSSL_SP_SMALL_STACK)
  142212. (void)sp;
  142213. *p = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap, DYNAMIC_TYPE_ECC);
  142214. #else
  142215. *p = sp;
  142216. #endif
  142217. if (*p == NULL) {
  142218. ret = MEMORY_E;
  142219. }
  142220. return ret;
  142221. }
  142222. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  142223. defined(WOLFSSL_SP_SMALL_STACK)
  142224. /* Allocate memory for point and return error. */
  142225. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), NULL, &(p))
  142226. #else
  142227. /* Set pointer to data and return no error. */
  142228. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), &(sp), &(p))
  142229. #endif
  142230. #endif /* WOLFCRYPT_HAVE_SAKKE */
  142231. #ifdef WOLFCRYPT_HAVE_SAKKE
  142232. /* Free the point.
  142233. *
  142234. * p [in,out] Point to free.
  142235. * clear [in] Indicates whether to zeroize point.
  142236. * heap [in] Buffer from which dynamic memory was allocate from.
  142237. */
  142238. static void sp_1024_point_free_32(sp_point_1024* p, int clear, void* heap)
  142239. {
  142240. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  142241. defined(WOLFSSL_SP_SMALL_STACK)
  142242. /* If valid pointer then clear point data if requested and free data. */
  142243. if (p != NULL) {
  142244. if (clear) {
  142245. XMEMSET(p, 0, sizeof(*p));
  142246. }
  142247. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  142248. }
  142249. #else
  142250. /* Clear point data if requested. */
  142251. if ((p != NULL) && clear) {
  142252. XMEMSET(p, 0, sizeof(*p));
  142253. }
  142254. #endif
  142255. (void)heap;
  142256. }
  142257. #endif /* WOLFCRYPT_HAVE_SAKKE */
  142258. /* Convert an mp_int to an array of sp_digit.
  142259. *
  142260. * r A single precision integer.
  142261. * size Maximum number of bytes to convert
  142262. * a A multi-precision integer.
  142263. */
  142264. static void sp_1024_from_mp(sp_digit* r, int size, const mp_int* a)
  142265. {
  142266. #if DIGIT_BIT == 32
  142267. int i;
  142268. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  142269. int o = 0;
  142270. for (i = 0; i < size; i++) {
  142271. sp_digit mask = (sp_digit)0 - (j >> 31);
  142272. r[i] = a->dp[o] & mask;
  142273. j++;
  142274. o += (int)(j >> 31);
  142275. }
  142276. #elif DIGIT_BIT > 32
  142277. unsigned int i;
  142278. int j = 0;
  142279. word32 s = 0;
  142280. r[0] = 0;
  142281. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  142282. r[j] |= ((sp_digit)a->dp[i] << s);
  142283. r[j] &= 0xffffffff;
  142284. s = 32U - s;
  142285. if (j + 1 >= size) {
  142286. break;
  142287. }
  142288. /* lint allow cast of mismatch word32 and mp_digit */
  142289. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  142290. while ((s + 32U) <= (word32)DIGIT_BIT) {
  142291. s += 32U;
  142292. r[j] &= 0xffffffff;
  142293. if (j + 1 >= size) {
  142294. break;
  142295. }
  142296. if (s < (word32)DIGIT_BIT) {
  142297. /* lint allow cast of mismatch word32 and mp_digit */
  142298. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  142299. }
  142300. else {
  142301. r[++j] = (sp_digit)0;
  142302. }
  142303. }
  142304. s = (word32)DIGIT_BIT - s;
  142305. }
  142306. for (j++; j < size; j++) {
  142307. r[j] = 0;
  142308. }
  142309. #else
  142310. unsigned int i;
  142311. int j = 0;
  142312. int s = 0;
  142313. r[0] = 0;
  142314. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  142315. r[j] |= ((sp_digit)a->dp[i]) << s;
  142316. if (s + DIGIT_BIT >= 32) {
  142317. r[j] &= 0xffffffff;
  142318. if (j + 1 >= size) {
  142319. break;
  142320. }
  142321. s = 32 - s;
  142322. if (s == DIGIT_BIT) {
  142323. r[++j] = 0;
  142324. s = 0;
  142325. }
  142326. else {
  142327. r[++j] = a->dp[i] >> s;
  142328. s = DIGIT_BIT - s;
  142329. }
  142330. }
  142331. else {
  142332. s += DIGIT_BIT;
  142333. }
  142334. }
  142335. for (j++; j < size; j++) {
  142336. r[j] = 0;
  142337. }
  142338. #endif
  142339. }
  142340. /* Convert a point of type ecc_point to type sp_point_1024.
  142341. *
  142342. * p Point of type sp_point_1024 (result).
  142343. * pm Point of type ecc_point.
  142344. */
  142345. static void sp_1024_point_from_ecc_point_32(sp_point_1024* p,
  142346. const ecc_point* pm)
  142347. {
  142348. XMEMSET(p->x, 0, sizeof(p->x));
  142349. XMEMSET(p->y, 0, sizeof(p->y));
  142350. XMEMSET(p->z, 0, sizeof(p->z));
  142351. sp_1024_from_mp(p->x, 32, pm->x);
  142352. sp_1024_from_mp(p->y, 32, pm->y);
  142353. sp_1024_from_mp(p->z, 32, pm->z);
  142354. p->infinity = 0;
  142355. }
  142356. /* Convert an array of sp_digit to an mp_int.
  142357. *
  142358. * a A single precision integer.
  142359. * r A multi-precision integer.
  142360. */
  142361. static int sp_1024_to_mp(const sp_digit* a, mp_int* r)
  142362. {
  142363. int err;
  142364. err = mp_grow(r, (1024 + DIGIT_BIT - 1) / DIGIT_BIT);
  142365. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  142366. #if DIGIT_BIT == 32
  142367. XMEMCPY(r->dp, a, sizeof(sp_digit) * 32);
  142368. r->used = 32;
  142369. mp_clamp(r);
  142370. #elif DIGIT_BIT < 32
  142371. int i;
  142372. int j = 0;
  142373. int s = 0;
  142374. r->dp[0] = 0;
  142375. for (i = 0; i < 32; i++) {
  142376. r->dp[j] |= (mp_digit)(a[i] << s);
  142377. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  142378. s = DIGIT_BIT - s;
  142379. r->dp[++j] = (mp_digit)(a[i] >> s);
  142380. while (s + DIGIT_BIT <= 32) {
  142381. s += DIGIT_BIT;
  142382. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  142383. if (s == SP_WORD_SIZE) {
  142384. r->dp[j] = 0;
  142385. }
  142386. else {
  142387. r->dp[j] = (mp_digit)(a[i] >> s);
  142388. }
  142389. }
  142390. s = 32 - s;
  142391. }
  142392. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  142393. mp_clamp(r);
  142394. #else
  142395. int i;
  142396. int j = 0;
  142397. int s = 0;
  142398. r->dp[0] = 0;
  142399. for (i = 0; i < 32; i++) {
  142400. r->dp[j] |= ((mp_digit)a[i]) << s;
  142401. if (s + 32 >= DIGIT_BIT) {
  142402. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  142403. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  142404. #endif
  142405. s = DIGIT_BIT - s;
  142406. r->dp[++j] = a[i] >> s;
  142407. s = 32 - s;
  142408. }
  142409. else {
  142410. s += 32;
  142411. }
  142412. }
  142413. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  142414. mp_clamp(r);
  142415. #endif
  142416. }
  142417. return err;
  142418. }
  142419. /* Convert a point of type sp_point_1024 to type ecc_point.
  142420. *
  142421. * p Point of type sp_point_1024.
  142422. * pm Point of type ecc_point (result).
  142423. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  142424. * MP_OKAY.
  142425. */
  142426. static int sp_1024_point_to_ecc_point_32(const sp_point_1024* p, ecc_point* pm)
  142427. {
  142428. int err;
  142429. err = sp_1024_to_mp(p->x, pm->x);
  142430. if (err == MP_OKAY) {
  142431. err = sp_1024_to_mp(p->y, pm->y);
  142432. }
  142433. if (err == MP_OKAY) {
  142434. err = sp_1024_to_mp(p->z, pm->z);
  142435. }
  142436. return err;
  142437. }
  142438. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  142439. /* Reduce the number back to 1024 bits using Montgomery reduction.
  142440. *
  142441. * a A single precision number to reduce in place.
  142442. * m The single precision number representing the modulus.
  142443. * mp The digit representing the negative inverse of m mod 2^n.
  142444. */
  142445. static SP_NOINLINE void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  142446. {
  142447. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  142448. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  142449. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  142450. __asm__ __volatile__ (
  142451. #if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4))
  142452. "ldr r11, [%[m]]\n\t"
  142453. #endif
  142454. /* i = 0 */
  142455. "mov r9, #0\n\t"
  142456. "mov r3, #0\n\t"
  142457. "ldr r12, [%[a]]\n\t"
  142458. "ldr lr, [%[a], #4]\n\t"
  142459. "\n"
  142460. "L_sp_1024_mont_reduce_32_word_%=: \n\t"
  142461. /* mu = a[i] * mp */
  142462. "mul r8, %[mp], r12\n\t"
  142463. /* a[i+0] += m[0] * mu */
  142464. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  142465. "ldr r11, [%[m]]\n\t"
  142466. #endif
  142467. "lsr r7, r11, #16\n\t"
  142468. "lsr r6, r8, #16\n\t"
  142469. "mul r5, r6, r7\n\t"
  142470. "lsl r7, r11, #16\n\t"
  142471. "lsr r7, r7, #16\n\t"
  142472. "mul r6, r7, r6\n\t"
  142473. "lsr r7, r6, #16\n\t"
  142474. "lsl r6, r6, #16\n\t"
  142475. "adds r12, r12, r6\n\t"
  142476. "adc r5, r5, r7\n\t"
  142477. "lsl r6, r8, #16\n\t"
  142478. "lsl r7, r11, #16\n\t"
  142479. "lsr r6, r6, #16\n\t"
  142480. "lsr r7, r7, #16\n\t"
  142481. "mul r7, r6, r7\n\t"
  142482. "adds r12, r12, r7\n\t"
  142483. "adc r5, r5, #0\n\t"
  142484. "lsr r7, r11, #16\n\t"
  142485. "mul r6, r7, r6\n\t"
  142486. "lsr r7, r6, #16\n\t"
  142487. "lsl r6, r6, #16\n\t"
  142488. "adds r12, r12, r6\n\t"
  142489. "adc r5, r5, r7\n\t"
  142490. /* a[i+1] += m[1] * mu */
  142491. "ldr r7, [%[m], #4]\n\t"
  142492. "lsr r10, r7, #16\n\t"
  142493. "lsr r6, r8, #16\n\t"
  142494. "mul r4, r6, r10\n\t"
  142495. "lsl r10, r7, #16\n\t"
  142496. "lsr r10, r10, #16\n\t"
  142497. "mul r6, r10, r6\n\t"
  142498. "lsr r10, r6, #16\n\t"
  142499. "lsl r6, r6, #16\n\t"
  142500. "adds lr, lr, r6\n\t"
  142501. "adc r4, r4, r10\n\t"
  142502. "lsl r6, r8, #16\n\t"
  142503. "lsl r10, r7, #16\n\t"
  142504. "lsr r6, r6, #16\n\t"
  142505. "lsr r10, r10, #16\n\t"
  142506. "mul r10, r6, r10\n\t"
  142507. "adds lr, lr, r10\n\t"
  142508. "adc r4, r4, #0\n\t"
  142509. "lsr r10, r7, #16\n\t"
  142510. "mul r6, r10, r6\n\t"
  142511. "lsr r10, r6, #16\n\t"
  142512. "lsl r6, r6, #16\n\t"
  142513. "adds lr, lr, r6\n\t"
  142514. "adc r4, r4, r10\n\t"
  142515. "mov r12, lr\n\t"
  142516. "adds r12, r12, r5\n\t"
  142517. "adc r4, r4, #0\n\t"
  142518. /* a[i+2] += m[2] * mu */
  142519. "ldr r7, [%[m], #8]\n\t"
  142520. "ldr lr, [%[a], #8]\n\t"
  142521. "lsr r10, r7, #16\n\t"
  142522. "lsr r6, r8, #16\n\t"
  142523. "mul r5, r6, r10\n\t"
  142524. "lsl r10, r7, #16\n\t"
  142525. "lsr r10, r10, #16\n\t"
  142526. "mul r6, r10, r6\n\t"
  142527. "lsr r10, r6, #16\n\t"
  142528. "lsl r6, r6, #16\n\t"
  142529. "adds lr, lr, r6\n\t"
  142530. "adc r5, r5, r10\n\t"
  142531. "lsl r6, r8, #16\n\t"
  142532. "lsl r10, r7, #16\n\t"
  142533. "lsr r6, r6, #16\n\t"
  142534. "lsr r10, r10, #16\n\t"
  142535. "mul r10, r6, r10\n\t"
  142536. "adds lr, lr, r10\n\t"
  142537. "adc r5, r5, #0\n\t"
  142538. "lsr r10, r7, #16\n\t"
  142539. "mul r6, r10, r6\n\t"
  142540. "lsr r10, r6, #16\n\t"
  142541. "lsl r6, r6, #16\n\t"
  142542. "adds lr, lr, r6\n\t"
  142543. "adc r5, r5, r10\n\t"
  142544. "adds lr, lr, r4\n\t"
  142545. "adc r5, r5, #0\n\t"
  142546. /* a[i+3] += m[3] * mu */
  142547. "ldr r7, [%[m], #12]\n\t"
  142548. "ldr r10, [%[a], #12]\n\t"
  142549. "lsr r11, r7, #16\n\t"
  142550. "lsr r6, r8, #16\n\t"
  142551. "mul r4, r6, r11\n\t"
  142552. "lsl r11, r7, #16\n\t"
  142553. "lsr r11, r11, #16\n\t"
  142554. "mul r6, r11, r6\n\t"
  142555. "lsr r11, r6, #16\n\t"
  142556. "lsl r6, r6, #16\n\t"
  142557. "adds r10, r10, r6\n\t"
  142558. "adc r4, r4, r11\n\t"
  142559. "lsl r6, r8, #16\n\t"
  142560. "lsl r11, r7, #16\n\t"
  142561. "lsr r6, r6, #16\n\t"
  142562. "lsr r11, r11, #16\n\t"
  142563. "mul r11, r6, r11\n\t"
  142564. "adds r10, r10, r11\n\t"
  142565. "adc r4, r4, #0\n\t"
  142566. "lsr r11, r7, #16\n\t"
  142567. "mul r6, r11, r6\n\t"
  142568. "lsr r11, r6, #16\n\t"
  142569. "lsl r6, r6, #16\n\t"
  142570. "adds r10, r10, r6\n\t"
  142571. "adc r4, r4, r11\n\t"
  142572. "adds r10, r10, r5\n\t"
  142573. "str r10, [%[a], #12]\n\t"
  142574. "adc r4, r4, #0\n\t"
  142575. /* a[i+4] += m[4] * mu */
  142576. "ldr r7, [%[m], #16]\n\t"
  142577. "ldr r10, [%[a], #16]\n\t"
  142578. "lsr r11, r7, #16\n\t"
  142579. "lsr r6, r8, #16\n\t"
  142580. "mul r5, r6, r11\n\t"
  142581. "lsl r11, r7, #16\n\t"
  142582. "lsr r11, r11, #16\n\t"
  142583. "mul r6, r11, r6\n\t"
  142584. "lsr r11, r6, #16\n\t"
  142585. "lsl r6, r6, #16\n\t"
  142586. "adds r10, r10, r6\n\t"
  142587. "adc r5, r5, r11\n\t"
  142588. "lsl r6, r8, #16\n\t"
  142589. "lsl r11, r7, #16\n\t"
  142590. "lsr r6, r6, #16\n\t"
  142591. "lsr r11, r11, #16\n\t"
  142592. "mul r11, r6, r11\n\t"
  142593. "adds r10, r10, r11\n\t"
  142594. "adc r5, r5, #0\n\t"
  142595. "lsr r11, r7, #16\n\t"
  142596. "mul r6, r11, r6\n\t"
  142597. "lsr r11, r6, #16\n\t"
  142598. "lsl r6, r6, #16\n\t"
  142599. "adds r10, r10, r6\n\t"
  142600. "adc r5, r5, r11\n\t"
  142601. "adds r10, r10, r4\n\t"
  142602. "str r10, [%[a], #16]\n\t"
  142603. "adc r5, r5, #0\n\t"
  142604. /* a[i+5] += m[5] * mu */
  142605. "ldr r7, [%[m], #20]\n\t"
  142606. "ldr r10, [%[a], #20]\n\t"
  142607. "lsr r11, r7, #16\n\t"
  142608. "lsr r6, r8, #16\n\t"
  142609. "mul r4, r6, r11\n\t"
  142610. "lsl r11, r7, #16\n\t"
  142611. "lsr r11, r11, #16\n\t"
  142612. "mul r6, r11, r6\n\t"
  142613. "lsr r11, r6, #16\n\t"
  142614. "lsl r6, r6, #16\n\t"
  142615. "adds r10, r10, r6\n\t"
  142616. "adc r4, r4, r11\n\t"
  142617. "lsl r6, r8, #16\n\t"
  142618. "lsl r11, r7, #16\n\t"
  142619. "lsr r6, r6, #16\n\t"
  142620. "lsr r11, r11, #16\n\t"
  142621. "mul r11, r6, r11\n\t"
  142622. "adds r10, r10, r11\n\t"
  142623. "adc r4, r4, #0\n\t"
  142624. "lsr r11, r7, #16\n\t"
  142625. "mul r6, r11, r6\n\t"
  142626. "lsr r11, r6, #16\n\t"
  142627. "lsl r6, r6, #16\n\t"
  142628. "adds r10, r10, r6\n\t"
  142629. "adc r4, r4, r11\n\t"
  142630. "adds r10, r10, r5\n\t"
  142631. "str r10, [%[a], #20]\n\t"
  142632. "adc r4, r4, #0\n\t"
  142633. /* a[i+6] += m[6] * mu */
  142634. "ldr r7, [%[m], #24]\n\t"
  142635. "ldr r10, [%[a], #24]\n\t"
  142636. "lsr r11, r7, #16\n\t"
  142637. "lsr r6, r8, #16\n\t"
  142638. "mul r5, r6, r11\n\t"
  142639. "lsl r11, r7, #16\n\t"
  142640. "lsr r11, r11, #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 r5, r5, r11\n\t"
  142646. "lsl r6, r8, #16\n\t"
  142647. "lsl r11, r7, #16\n\t"
  142648. "lsr r6, r6, #16\n\t"
  142649. "lsr r11, r11, #16\n\t"
  142650. "mul r11, r6, r11\n\t"
  142651. "adds r10, r10, r11\n\t"
  142652. "adc r5, r5, #0\n\t"
  142653. "lsr r11, r7, #16\n\t"
  142654. "mul r6, r11, r6\n\t"
  142655. "lsr r11, r6, #16\n\t"
  142656. "lsl r6, r6, #16\n\t"
  142657. "adds r10, r10, r6\n\t"
  142658. "adc r5, r5, r11\n\t"
  142659. "adds r10, r10, r4\n\t"
  142660. "str r10, [%[a], #24]\n\t"
  142661. "adc r5, r5, #0\n\t"
  142662. /* a[i+7] += m[7] * mu */
  142663. "ldr r7, [%[m], #28]\n\t"
  142664. "ldr r10, [%[a], #28]\n\t"
  142665. "lsr r11, r7, #16\n\t"
  142666. "lsr r6, r8, #16\n\t"
  142667. "mul r4, r6, r11\n\t"
  142668. "lsl r11, r7, #16\n\t"
  142669. "lsr r11, r11, #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 r4, r4, r11\n\t"
  142675. "lsl r6, r8, #16\n\t"
  142676. "lsl r11, r7, #16\n\t"
  142677. "lsr r6, r6, #16\n\t"
  142678. "lsr r11, r11, #16\n\t"
  142679. "mul r11, r6, r11\n\t"
  142680. "adds r10, r10, r11\n\t"
  142681. "adc r4, r4, #0\n\t"
  142682. "lsr r11, r7, #16\n\t"
  142683. "mul r6, r11, r6\n\t"
  142684. "lsr r11, r6, #16\n\t"
  142685. "lsl r6, r6, #16\n\t"
  142686. "adds r10, r10, r6\n\t"
  142687. "adc r4, r4, r11\n\t"
  142688. "adds r10, r10, r5\n\t"
  142689. "str r10, [%[a], #28]\n\t"
  142690. "adc r4, r4, #0\n\t"
  142691. /* a[i+8] += m[8] * mu */
  142692. "ldr r7, [%[m], #32]\n\t"
  142693. "ldr r10, [%[a], #32]\n\t"
  142694. "lsr r11, r7, #16\n\t"
  142695. "lsr r6, r8, #16\n\t"
  142696. "mul r5, r6, r11\n\t"
  142697. "lsl r11, r7, #16\n\t"
  142698. "lsr r11, r11, #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 r5, r5, r11\n\t"
  142704. "lsl r6, r8, #16\n\t"
  142705. "lsl r11, r7, #16\n\t"
  142706. "lsr r6, r6, #16\n\t"
  142707. "lsr r11, r11, #16\n\t"
  142708. "mul r11, r6, r11\n\t"
  142709. "adds r10, r10, r11\n\t"
  142710. "adc r5, r5, #0\n\t"
  142711. "lsr r11, r7, #16\n\t"
  142712. "mul r6, r11, r6\n\t"
  142713. "lsr r11, r6, #16\n\t"
  142714. "lsl r6, r6, #16\n\t"
  142715. "adds r10, r10, r6\n\t"
  142716. "adc r5, r5, r11\n\t"
  142717. "adds r10, r10, r4\n\t"
  142718. "str r10, [%[a], #32]\n\t"
  142719. "adc r5, r5, #0\n\t"
  142720. /* a[i+9] += m[9] * mu */
  142721. "ldr r7, [%[m], #36]\n\t"
  142722. "ldr r10, [%[a], #36]\n\t"
  142723. "lsr r11, r7, #16\n\t"
  142724. "lsr r6, r8, #16\n\t"
  142725. "mul r4, r6, r11\n\t"
  142726. "lsl r11, r7, #16\n\t"
  142727. "lsr r11, r11, #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 r4, r4, r11\n\t"
  142733. "lsl r6, r8, #16\n\t"
  142734. "lsl r11, r7, #16\n\t"
  142735. "lsr r6, r6, #16\n\t"
  142736. "lsr r11, r11, #16\n\t"
  142737. "mul r11, r6, r11\n\t"
  142738. "adds r10, r10, r11\n\t"
  142739. "adc r4, r4, #0\n\t"
  142740. "lsr r11, r7, #16\n\t"
  142741. "mul r6, r11, r6\n\t"
  142742. "lsr r11, r6, #16\n\t"
  142743. "lsl r6, r6, #16\n\t"
  142744. "adds r10, r10, r6\n\t"
  142745. "adc r4, r4, r11\n\t"
  142746. "adds r10, r10, r5\n\t"
  142747. "str r10, [%[a], #36]\n\t"
  142748. "adc r4, r4, #0\n\t"
  142749. /* a[i+10] += m[10] * mu */
  142750. "ldr r7, [%[m], #40]\n\t"
  142751. "ldr r10, [%[a], #40]\n\t"
  142752. "lsr r11, r7, #16\n\t"
  142753. "lsr r6, r8, #16\n\t"
  142754. "mul r5, r6, r11\n\t"
  142755. "lsl r11, r7, #16\n\t"
  142756. "lsr r11, r11, #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 r5, r5, r11\n\t"
  142762. "lsl r6, r8, #16\n\t"
  142763. "lsl r11, r7, #16\n\t"
  142764. "lsr r6, r6, #16\n\t"
  142765. "lsr r11, r11, #16\n\t"
  142766. "mul r11, r6, r11\n\t"
  142767. "adds r10, r10, r11\n\t"
  142768. "adc r5, r5, #0\n\t"
  142769. "lsr r11, r7, #16\n\t"
  142770. "mul r6, r11, r6\n\t"
  142771. "lsr r11, r6, #16\n\t"
  142772. "lsl r6, r6, #16\n\t"
  142773. "adds r10, r10, r6\n\t"
  142774. "adc r5, r5, r11\n\t"
  142775. "adds r10, r10, r4\n\t"
  142776. "str r10, [%[a], #40]\n\t"
  142777. "adc r5, r5, #0\n\t"
  142778. /* a[i+11] += m[11] * mu */
  142779. "ldr r7, [%[m], #44]\n\t"
  142780. "ldr r10, [%[a], #44]\n\t"
  142781. "lsr r11, r7, #16\n\t"
  142782. "lsr r6, r8, #16\n\t"
  142783. "mul r4, r6, r11\n\t"
  142784. "lsl r11, r7, #16\n\t"
  142785. "lsr r11, r11, #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 r4, r4, r11\n\t"
  142791. "lsl r6, r8, #16\n\t"
  142792. "lsl r11, r7, #16\n\t"
  142793. "lsr r6, r6, #16\n\t"
  142794. "lsr r11, r11, #16\n\t"
  142795. "mul r11, r6, r11\n\t"
  142796. "adds r10, r10, r11\n\t"
  142797. "adc r4, r4, #0\n\t"
  142798. "lsr r11, r7, #16\n\t"
  142799. "mul r6, r11, r6\n\t"
  142800. "lsr r11, r6, #16\n\t"
  142801. "lsl r6, r6, #16\n\t"
  142802. "adds r10, r10, r6\n\t"
  142803. "adc r4, r4, r11\n\t"
  142804. "adds r10, r10, r5\n\t"
  142805. "str r10, [%[a], #44]\n\t"
  142806. "adc r4, r4, #0\n\t"
  142807. /* a[i+12] += m[12] * mu */
  142808. "ldr r7, [%[m], #48]\n\t"
  142809. "ldr r10, [%[a], #48]\n\t"
  142810. "lsr r11, r7, #16\n\t"
  142811. "lsr r6, r8, #16\n\t"
  142812. "mul r5, r6, r11\n\t"
  142813. "lsl r11, r7, #16\n\t"
  142814. "lsr r11, r11, #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 r5, r5, r11\n\t"
  142820. "lsl r6, r8, #16\n\t"
  142821. "lsl r11, r7, #16\n\t"
  142822. "lsr r6, r6, #16\n\t"
  142823. "lsr r11, r11, #16\n\t"
  142824. "mul r11, r6, r11\n\t"
  142825. "adds r10, r10, r11\n\t"
  142826. "adc r5, r5, #0\n\t"
  142827. "lsr r11, r7, #16\n\t"
  142828. "mul r6, r11, r6\n\t"
  142829. "lsr r11, r6, #16\n\t"
  142830. "lsl r6, r6, #16\n\t"
  142831. "adds r10, r10, r6\n\t"
  142832. "adc r5, r5, r11\n\t"
  142833. "adds r10, r10, r4\n\t"
  142834. "str r10, [%[a], #48]\n\t"
  142835. "adc r5, r5, #0\n\t"
  142836. /* a[i+13] += m[13] * mu */
  142837. "ldr r7, [%[m], #52]\n\t"
  142838. "ldr r10, [%[a], #52]\n\t"
  142839. "lsr r11, r7, #16\n\t"
  142840. "lsr r6, r8, #16\n\t"
  142841. "mul r4, r6, r11\n\t"
  142842. "lsl r11, r7, #16\n\t"
  142843. "lsr r11, r11, #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 r4, r4, r11\n\t"
  142849. "lsl r6, r8, #16\n\t"
  142850. "lsl r11, r7, #16\n\t"
  142851. "lsr r6, r6, #16\n\t"
  142852. "lsr r11, r11, #16\n\t"
  142853. "mul r11, r6, r11\n\t"
  142854. "adds r10, r10, r11\n\t"
  142855. "adc r4, r4, #0\n\t"
  142856. "lsr r11, r7, #16\n\t"
  142857. "mul r6, r11, r6\n\t"
  142858. "lsr r11, r6, #16\n\t"
  142859. "lsl r6, r6, #16\n\t"
  142860. "adds r10, r10, r6\n\t"
  142861. "adc r4, r4, r11\n\t"
  142862. "adds r10, r10, r5\n\t"
  142863. "str r10, [%[a], #52]\n\t"
  142864. "adc r4, r4, #0\n\t"
  142865. /* a[i+14] += m[14] * mu */
  142866. "ldr r7, [%[m], #56]\n\t"
  142867. "ldr r10, [%[a], #56]\n\t"
  142868. "lsr r11, r7, #16\n\t"
  142869. "lsr r6, r8, #16\n\t"
  142870. "mul r5, r6, r11\n\t"
  142871. "lsl r11, r7, #16\n\t"
  142872. "lsr r11, r11, #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 r5, r5, r11\n\t"
  142878. "lsl r6, r8, #16\n\t"
  142879. "lsl r11, r7, #16\n\t"
  142880. "lsr r6, r6, #16\n\t"
  142881. "lsr r11, r11, #16\n\t"
  142882. "mul r11, r6, r11\n\t"
  142883. "adds r10, r10, r11\n\t"
  142884. "adc r5, r5, #0\n\t"
  142885. "lsr r11, r7, #16\n\t"
  142886. "mul r6, r11, r6\n\t"
  142887. "lsr r11, r6, #16\n\t"
  142888. "lsl r6, r6, #16\n\t"
  142889. "adds r10, r10, r6\n\t"
  142890. "adc r5, r5, r11\n\t"
  142891. "adds r10, r10, r4\n\t"
  142892. "str r10, [%[a], #56]\n\t"
  142893. "adc r5, r5, #0\n\t"
  142894. /* a[i+15] += m[15] * mu */
  142895. "ldr r7, [%[m], #60]\n\t"
  142896. "ldr r10, [%[a], #60]\n\t"
  142897. "lsr r11, r7, #16\n\t"
  142898. "lsr r6, r8, #16\n\t"
  142899. "mul r4, r6, r11\n\t"
  142900. "lsl r11, r7, #16\n\t"
  142901. "lsr r11, r11, #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 r4, r4, r11\n\t"
  142907. "lsl r6, r8, #16\n\t"
  142908. "lsl r11, r7, #16\n\t"
  142909. "lsr r6, r6, #16\n\t"
  142910. "lsr r11, r11, #16\n\t"
  142911. "mul r11, r6, r11\n\t"
  142912. "adds r10, r10, r11\n\t"
  142913. "adc r4, r4, #0\n\t"
  142914. "lsr r11, r7, #16\n\t"
  142915. "mul r6, r11, r6\n\t"
  142916. "lsr r11, r6, #16\n\t"
  142917. "lsl r6, r6, #16\n\t"
  142918. "adds r10, r10, r6\n\t"
  142919. "adc r4, r4, r11\n\t"
  142920. "adds r10, r10, r5\n\t"
  142921. "str r10, [%[a], #60]\n\t"
  142922. "adc r4, r4, #0\n\t"
  142923. /* a[i+16] += m[16] * mu */
  142924. "ldr r7, [%[m], #64]\n\t"
  142925. "ldr r10, [%[a], #64]\n\t"
  142926. "lsr r11, r7, #16\n\t"
  142927. "lsr r6, r8, #16\n\t"
  142928. "mul r5, r6, r11\n\t"
  142929. "lsl r11, r7, #16\n\t"
  142930. "lsr r11, r11, #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 r5, r5, r11\n\t"
  142936. "lsl r6, r8, #16\n\t"
  142937. "lsl r11, r7, #16\n\t"
  142938. "lsr r6, r6, #16\n\t"
  142939. "lsr r11, r11, #16\n\t"
  142940. "mul r11, r6, r11\n\t"
  142941. "adds r10, r10, r11\n\t"
  142942. "adc r5, r5, #0\n\t"
  142943. "lsr r11, r7, #16\n\t"
  142944. "mul r6, r11, r6\n\t"
  142945. "lsr r11, r6, #16\n\t"
  142946. "lsl r6, r6, #16\n\t"
  142947. "adds r10, r10, r6\n\t"
  142948. "adc r5, r5, r11\n\t"
  142949. "adds r10, r10, r4\n\t"
  142950. "str r10, [%[a], #64]\n\t"
  142951. "adc r5, r5, #0\n\t"
  142952. /* a[i+17] += m[17] * mu */
  142953. "ldr r7, [%[m], #68]\n\t"
  142954. "ldr r10, [%[a], #68]\n\t"
  142955. "lsr r11, r7, #16\n\t"
  142956. "lsr r6, r8, #16\n\t"
  142957. "mul r4, r6, r11\n\t"
  142958. "lsl r11, r7, #16\n\t"
  142959. "lsr r11, r11, #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 r4, r4, r11\n\t"
  142965. "lsl r6, r8, #16\n\t"
  142966. "lsl r11, r7, #16\n\t"
  142967. "lsr r6, r6, #16\n\t"
  142968. "lsr r11, r11, #16\n\t"
  142969. "mul r11, r6, r11\n\t"
  142970. "adds r10, r10, r11\n\t"
  142971. "adc r4, r4, #0\n\t"
  142972. "lsr r11, r7, #16\n\t"
  142973. "mul r6, r11, r6\n\t"
  142974. "lsr r11, r6, #16\n\t"
  142975. "lsl r6, r6, #16\n\t"
  142976. "adds r10, r10, r6\n\t"
  142977. "adc r4, r4, r11\n\t"
  142978. "adds r10, r10, r5\n\t"
  142979. "str r10, [%[a], #68]\n\t"
  142980. "adc r4, r4, #0\n\t"
  142981. /* a[i+18] += m[18] * mu */
  142982. "ldr r7, [%[m], #72]\n\t"
  142983. "ldr r10, [%[a], #72]\n\t"
  142984. "lsr r11, r7, #16\n\t"
  142985. "lsr r6, r8, #16\n\t"
  142986. "mul r5, r6, r11\n\t"
  142987. "lsl r11, r7, #16\n\t"
  142988. "lsr r11, r11, #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 r5, r5, r11\n\t"
  142994. "lsl r6, r8, #16\n\t"
  142995. "lsl r11, r7, #16\n\t"
  142996. "lsr r6, r6, #16\n\t"
  142997. "lsr r11, r11, #16\n\t"
  142998. "mul r11, r6, r11\n\t"
  142999. "adds r10, r10, r11\n\t"
  143000. "adc r5, r5, #0\n\t"
  143001. "lsr r11, r7, #16\n\t"
  143002. "mul r6, r11, r6\n\t"
  143003. "lsr r11, r6, #16\n\t"
  143004. "lsl r6, r6, #16\n\t"
  143005. "adds r10, r10, r6\n\t"
  143006. "adc r5, r5, r11\n\t"
  143007. "adds r10, r10, r4\n\t"
  143008. "str r10, [%[a], #72]\n\t"
  143009. "adc r5, r5, #0\n\t"
  143010. /* a[i+19] += m[19] * mu */
  143011. "ldr r7, [%[m], #76]\n\t"
  143012. "ldr r10, [%[a], #76]\n\t"
  143013. "lsr r11, r7, #16\n\t"
  143014. "lsr r6, r8, #16\n\t"
  143015. "mul r4, r6, r11\n\t"
  143016. "lsl r11, r7, #16\n\t"
  143017. "lsr r11, r11, #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 r4, r4, r11\n\t"
  143023. "lsl r6, r8, #16\n\t"
  143024. "lsl r11, r7, #16\n\t"
  143025. "lsr r6, r6, #16\n\t"
  143026. "lsr r11, r11, #16\n\t"
  143027. "mul r11, r6, r11\n\t"
  143028. "adds r10, r10, r11\n\t"
  143029. "adc r4, r4, #0\n\t"
  143030. "lsr r11, r7, #16\n\t"
  143031. "mul r6, r11, r6\n\t"
  143032. "lsr r11, r6, #16\n\t"
  143033. "lsl r6, r6, #16\n\t"
  143034. "adds r10, r10, r6\n\t"
  143035. "adc r4, r4, r11\n\t"
  143036. "adds r10, r10, r5\n\t"
  143037. "str r10, [%[a], #76]\n\t"
  143038. "adc r4, r4, #0\n\t"
  143039. /* a[i+20] += m[20] * mu */
  143040. "ldr r7, [%[m], #80]\n\t"
  143041. "ldr r10, [%[a], #80]\n\t"
  143042. "lsr r11, r7, #16\n\t"
  143043. "lsr r6, r8, #16\n\t"
  143044. "mul r5, r6, r11\n\t"
  143045. "lsl r11, r7, #16\n\t"
  143046. "lsr r11, r11, #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 r5, r5, r11\n\t"
  143052. "lsl r6, r8, #16\n\t"
  143053. "lsl r11, r7, #16\n\t"
  143054. "lsr r6, r6, #16\n\t"
  143055. "lsr r11, r11, #16\n\t"
  143056. "mul r11, r6, r11\n\t"
  143057. "adds r10, r10, r11\n\t"
  143058. "adc r5, r5, #0\n\t"
  143059. "lsr r11, r7, #16\n\t"
  143060. "mul r6, r11, r6\n\t"
  143061. "lsr r11, r6, #16\n\t"
  143062. "lsl r6, r6, #16\n\t"
  143063. "adds r10, r10, r6\n\t"
  143064. "adc r5, r5, r11\n\t"
  143065. "adds r10, r10, r4\n\t"
  143066. "str r10, [%[a], #80]\n\t"
  143067. "adc r5, r5, #0\n\t"
  143068. /* a[i+21] += m[21] * mu */
  143069. "ldr r7, [%[m], #84]\n\t"
  143070. "ldr r10, [%[a], #84]\n\t"
  143071. "lsr r11, r7, #16\n\t"
  143072. "lsr r6, r8, #16\n\t"
  143073. "mul r4, r6, r11\n\t"
  143074. "lsl r11, r7, #16\n\t"
  143075. "lsr r11, r11, #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 r4, r4, r11\n\t"
  143081. "lsl r6, r8, #16\n\t"
  143082. "lsl r11, r7, #16\n\t"
  143083. "lsr r6, r6, #16\n\t"
  143084. "lsr r11, r11, #16\n\t"
  143085. "mul r11, r6, r11\n\t"
  143086. "adds r10, r10, r11\n\t"
  143087. "adc r4, r4, #0\n\t"
  143088. "lsr r11, r7, #16\n\t"
  143089. "mul r6, r11, r6\n\t"
  143090. "lsr r11, r6, #16\n\t"
  143091. "lsl r6, r6, #16\n\t"
  143092. "adds r10, r10, r6\n\t"
  143093. "adc r4, r4, r11\n\t"
  143094. "adds r10, r10, r5\n\t"
  143095. "str r10, [%[a], #84]\n\t"
  143096. "adc r4, r4, #0\n\t"
  143097. /* a[i+22] += m[22] * mu */
  143098. "ldr r7, [%[m], #88]\n\t"
  143099. "ldr r10, [%[a], #88]\n\t"
  143100. "lsr r11, r7, #16\n\t"
  143101. "lsr r6, r8, #16\n\t"
  143102. "mul r5, r6, r11\n\t"
  143103. "lsl r11, r7, #16\n\t"
  143104. "lsr r11, r11, #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 r5, r5, r11\n\t"
  143110. "lsl r6, r8, #16\n\t"
  143111. "lsl r11, r7, #16\n\t"
  143112. "lsr r6, r6, #16\n\t"
  143113. "lsr r11, r11, #16\n\t"
  143114. "mul r11, r6, r11\n\t"
  143115. "adds r10, r10, r11\n\t"
  143116. "adc r5, r5, #0\n\t"
  143117. "lsr r11, r7, #16\n\t"
  143118. "mul r6, r11, r6\n\t"
  143119. "lsr r11, r6, #16\n\t"
  143120. "lsl r6, r6, #16\n\t"
  143121. "adds r10, r10, r6\n\t"
  143122. "adc r5, r5, r11\n\t"
  143123. "adds r10, r10, r4\n\t"
  143124. "str r10, [%[a], #88]\n\t"
  143125. "adc r5, r5, #0\n\t"
  143126. /* a[i+23] += m[23] * mu */
  143127. "ldr r7, [%[m], #92]\n\t"
  143128. "ldr r10, [%[a], #92]\n\t"
  143129. "lsr r11, r7, #16\n\t"
  143130. "lsr r6, r8, #16\n\t"
  143131. "mul r4, r6, r11\n\t"
  143132. "lsl r11, r7, #16\n\t"
  143133. "lsr r11, r11, #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 r4, r4, r11\n\t"
  143139. "lsl r6, r8, #16\n\t"
  143140. "lsl r11, r7, #16\n\t"
  143141. "lsr r6, r6, #16\n\t"
  143142. "lsr r11, r11, #16\n\t"
  143143. "mul r11, r6, r11\n\t"
  143144. "adds r10, r10, r11\n\t"
  143145. "adc r4, r4, #0\n\t"
  143146. "lsr r11, r7, #16\n\t"
  143147. "mul r6, r11, r6\n\t"
  143148. "lsr r11, r6, #16\n\t"
  143149. "lsl r6, r6, #16\n\t"
  143150. "adds r10, r10, r6\n\t"
  143151. "adc r4, r4, r11\n\t"
  143152. "adds r10, r10, r5\n\t"
  143153. "str r10, [%[a], #92]\n\t"
  143154. "adc r4, r4, #0\n\t"
  143155. /* a[i+24] += m[24] * mu */
  143156. "ldr r7, [%[m], #96]\n\t"
  143157. "ldr r10, [%[a], #96]\n\t"
  143158. "lsr r11, r7, #16\n\t"
  143159. "lsr r6, r8, #16\n\t"
  143160. "mul r5, r6, r11\n\t"
  143161. "lsl r11, r7, #16\n\t"
  143162. "lsr r11, r11, #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 r5, r5, r11\n\t"
  143168. "lsl r6, r8, #16\n\t"
  143169. "lsl r11, r7, #16\n\t"
  143170. "lsr r6, r6, #16\n\t"
  143171. "lsr r11, r11, #16\n\t"
  143172. "mul r11, r6, r11\n\t"
  143173. "adds r10, r10, r11\n\t"
  143174. "adc r5, r5, #0\n\t"
  143175. "lsr r11, r7, #16\n\t"
  143176. "mul r6, r11, r6\n\t"
  143177. "lsr r11, r6, #16\n\t"
  143178. "lsl r6, r6, #16\n\t"
  143179. "adds r10, r10, r6\n\t"
  143180. "adc r5, r5, r11\n\t"
  143181. "adds r10, r10, r4\n\t"
  143182. "str r10, [%[a], #96]\n\t"
  143183. "adc r5, r5, #0\n\t"
  143184. /* a[i+25] += m[25] * mu */
  143185. "ldr r7, [%[m], #100]\n\t"
  143186. "ldr r10, [%[a], #100]\n\t"
  143187. "lsr r11, r7, #16\n\t"
  143188. "lsr r6, r8, #16\n\t"
  143189. "mul r4, r6, r11\n\t"
  143190. "lsl r11, r7, #16\n\t"
  143191. "lsr r11, r11, #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 r4, r4, r11\n\t"
  143197. "lsl r6, r8, #16\n\t"
  143198. "lsl r11, r7, #16\n\t"
  143199. "lsr r6, r6, #16\n\t"
  143200. "lsr r11, r11, #16\n\t"
  143201. "mul r11, r6, r11\n\t"
  143202. "adds r10, r10, r11\n\t"
  143203. "adc r4, r4, #0\n\t"
  143204. "lsr r11, r7, #16\n\t"
  143205. "mul r6, r11, r6\n\t"
  143206. "lsr r11, r6, #16\n\t"
  143207. "lsl r6, r6, #16\n\t"
  143208. "adds r10, r10, r6\n\t"
  143209. "adc r4, r4, r11\n\t"
  143210. "adds r10, r10, r5\n\t"
  143211. "str r10, [%[a], #100]\n\t"
  143212. "adc r4, r4, #0\n\t"
  143213. /* a[i+26] += m[26] * mu */
  143214. "ldr r7, [%[m], #104]\n\t"
  143215. "ldr r10, [%[a], #104]\n\t"
  143216. "lsr r11, r7, #16\n\t"
  143217. "lsr r6, r8, #16\n\t"
  143218. "mul r5, r6, r11\n\t"
  143219. "lsl r11, r7, #16\n\t"
  143220. "lsr r11, r11, #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 r5, r5, r11\n\t"
  143226. "lsl r6, r8, #16\n\t"
  143227. "lsl r11, r7, #16\n\t"
  143228. "lsr r6, r6, #16\n\t"
  143229. "lsr r11, r11, #16\n\t"
  143230. "mul r11, r6, r11\n\t"
  143231. "adds r10, r10, r11\n\t"
  143232. "adc r5, r5, #0\n\t"
  143233. "lsr r11, r7, #16\n\t"
  143234. "mul r6, r11, r6\n\t"
  143235. "lsr r11, r6, #16\n\t"
  143236. "lsl r6, r6, #16\n\t"
  143237. "adds r10, r10, r6\n\t"
  143238. "adc r5, r5, r11\n\t"
  143239. "adds r10, r10, r4\n\t"
  143240. "str r10, [%[a], #104]\n\t"
  143241. "adc r5, r5, #0\n\t"
  143242. /* a[i+27] += m[27] * mu */
  143243. "ldr r7, [%[m], #108]\n\t"
  143244. "ldr r10, [%[a], #108]\n\t"
  143245. "lsr r11, r7, #16\n\t"
  143246. "lsr r6, r8, #16\n\t"
  143247. "mul r4, r6, r11\n\t"
  143248. "lsl r11, r7, #16\n\t"
  143249. "lsr r11, r11, #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 r4, r4, r11\n\t"
  143255. "lsl r6, r8, #16\n\t"
  143256. "lsl r11, r7, #16\n\t"
  143257. "lsr r6, r6, #16\n\t"
  143258. "lsr r11, r11, #16\n\t"
  143259. "mul r11, r6, r11\n\t"
  143260. "adds r10, r10, r11\n\t"
  143261. "adc r4, r4, #0\n\t"
  143262. "lsr r11, r7, #16\n\t"
  143263. "mul r6, r11, r6\n\t"
  143264. "lsr r11, r6, #16\n\t"
  143265. "lsl r6, r6, #16\n\t"
  143266. "adds r10, r10, r6\n\t"
  143267. "adc r4, r4, r11\n\t"
  143268. "adds r10, r10, r5\n\t"
  143269. "str r10, [%[a], #108]\n\t"
  143270. "adc r4, r4, #0\n\t"
  143271. /* a[i+28] += m[28] * mu */
  143272. "ldr r7, [%[m], #112]\n\t"
  143273. "ldr r10, [%[a], #112]\n\t"
  143274. "lsr r11, r7, #16\n\t"
  143275. "lsr r6, r8, #16\n\t"
  143276. "mul r5, r6, r11\n\t"
  143277. "lsl r11, r7, #16\n\t"
  143278. "lsr r11, r11, #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 r5, r5, r11\n\t"
  143284. "lsl r6, r8, #16\n\t"
  143285. "lsl r11, r7, #16\n\t"
  143286. "lsr r6, r6, #16\n\t"
  143287. "lsr r11, r11, #16\n\t"
  143288. "mul r11, r6, r11\n\t"
  143289. "adds r10, r10, r11\n\t"
  143290. "adc r5, r5, #0\n\t"
  143291. "lsr r11, r7, #16\n\t"
  143292. "mul r6, r11, r6\n\t"
  143293. "lsr r11, r6, #16\n\t"
  143294. "lsl r6, r6, #16\n\t"
  143295. "adds r10, r10, r6\n\t"
  143296. "adc r5, r5, r11\n\t"
  143297. "adds r10, r10, r4\n\t"
  143298. "str r10, [%[a], #112]\n\t"
  143299. "adc r5, r5, #0\n\t"
  143300. /* a[i+29] += m[29] * mu */
  143301. "ldr r7, [%[m], #116]\n\t"
  143302. "ldr r10, [%[a], #116]\n\t"
  143303. "lsr r11, r7, #16\n\t"
  143304. "lsr r6, r8, #16\n\t"
  143305. "mul r4, r6, r11\n\t"
  143306. "lsl r11, r7, #16\n\t"
  143307. "lsr r11, r11, #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 r4, r4, r11\n\t"
  143313. "lsl r6, r8, #16\n\t"
  143314. "lsl r11, r7, #16\n\t"
  143315. "lsr r6, r6, #16\n\t"
  143316. "lsr r11, r11, #16\n\t"
  143317. "mul r11, r6, r11\n\t"
  143318. "adds r10, r10, r11\n\t"
  143319. "adc r4, r4, #0\n\t"
  143320. "lsr r11, r7, #16\n\t"
  143321. "mul r6, r11, r6\n\t"
  143322. "lsr r11, r6, #16\n\t"
  143323. "lsl r6, r6, #16\n\t"
  143324. "adds r10, r10, r6\n\t"
  143325. "adc r4, r4, r11\n\t"
  143326. "adds r10, r10, r5\n\t"
  143327. "str r10, [%[a], #116]\n\t"
  143328. "adc r4, r4, #0\n\t"
  143329. /* a[i+30] += m[30] * mu */
  143330. "ldr r7, [%[m], #120]\n\t"
  143331. "ldr r10, [%[a], #120]\n\t"
  143332. "lsr r11, r7, #16\n\t"
  143333. "lsr r6, r8, #16\n\t"
  143334. "mul r5, r6, r11\n\t"
  143335. "lsl r11, r7, #16\n\t"
  143336. "lsr r11, r11, #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 r5, r5, r11\n\t"
  143342. "lsl r6, r8, #16\n\t"
  143343. "lsl r11, r7, #16\n\t"
  143344. "lsr r6, r6, #16\n\t"
  143345. "lsr r11, r11, #16\n\t"
  143346. "mul r11, r6, r11\n\t"
  143347. "adds r10, r10, r11\n\t"
  143348. "adc r5, r5, #0\n\t"
  143349. "lsr r11, r7, #16\n\t"
  143350. "mul r6, r11, r6\n\t"
  143351. "lsr r11, r6, #16\n\t"
  143352. "lsl r6, r6, #16\n\t"
  143353. "adds r10, r10, r6\n\t"
  143354. "adc r5, r5, r11\n\t"
  143355. "adds r10, r10, r4\n\t"
  143356. "str r10, [%[a], #120]\n\t"
  143357. "adc r5, r5, #0\n\t"
  143358. /* a[i+31] += m[31] * mu */
  143359. #if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)
  143360. "ldr r11, [%[m], #124]\n\t"
  143361. #else
  143362. "ldr r7, [%[m], #124]\n\t"
  143363. #endif
  143364. "ldr r10, [%[a], #124]\n\t"
  143365. "lsl r6, r8, #16\n\t"
  143366. "lsl r7, r11, #16\n\t"
  143367. "lsr r6, r6, #16\n\t"
  143368. "lsr r7, r7, #16\n\t"
  143369. "mul r7, r6, r7\n\t"
  143370. "adds r5, r5, r7\n\t"
  143371. "adcs r4, r3, #0\n\t"
  143372. "mov r3, #0\n\t"
  143373. "adc r3, r3, r3\n\t"
  143374. "lsr r7, r11, #16\n\t"
  143375. "mul r6, r7, r6\n\t"
  143376. "lsr r7, r6, #16\n\t"
  143377. "lsl r6, r6, #16\n\t"
  143378. "adds r5, r5, r6\n\t"
  143379. "adcs r4, r4, r7\n\t"
  143380. "adc r3, r3, #0\n\t"
  143381. "mov r6, r8\n\t"
  143382. "lsr r7, r11, #16\n\t"
  143383. "lsr r6, r6, #16\n\t"
  143384. "mul r7, r6, r7\n\t"
  143385. "adds r4, r4, r7\n\t"
  143386. "lsl r7, r11, #16\n\t"
  143387. "adc r3, r3, #0\n\t"
  143388. "lsr r7, r7, #16\n\t"
  143389. "mul r6, r7, r6\n\t"
  143390. "lsr r7, r6, #16\n\t"
  143391. "lsl r6, r6, #16\n\t"
  143392. "adds r5, r5, r6\n\t"
  143393. "adcs r4, r4, r7\n\t"
  143394. "adc r3, r3, #0\n\t"
  143395. "adds r10, r10, r5\n\t"
  143396. "str r10, [%[a], #124]\n\t"
  143397. "ldr r10, [%[a], #128]\n\t"
  143398. "adcs r10, r10, r4\n\t"
  143399. "str r10, [%[a], #128]\n\t"
  143400. "adc r3, r3, #0\n\t"
  143401. /* i += 1 */
  143402. "add r9, r9, #4\n\t"
  143403. "add %[a], %[a], #4\n\t"
  143404. "cmp r9, #0x80\n\t"
  143405. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  143406. /* Loop Done */
  143407. "str r12, [%[a]]\n\t"
  143408. "str lr, [%[a], #4]\n\t"
  143409. "ldr r6, [%[m], #124]\n\t"
  143410. "subs r10, r6, r10\n\t"
  143411. "neg r3, r3\n\t"
  143412. "sbc r10, r10, r10\n\t"
  143413. "orr r3, r3, r10\n\t"
  143414. "mov %[mp], r3\n\t"
  143415. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  143416. :
  143417. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  143418. );
  143419. sp_1024_cond_sub_32(a - 32, a, m, mp);
  143420. }
  143421. #elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
  143422. /* Reduce the number back to 1024 bits using Montgomery reduction.
  143423. *
  143424. * a A single precision number to reduce in place.
  143425. * m The single precision number representing the modulus.
  143426. * mp The digit representing the negative inverse of m mod 2^n.
  143427. */
  143428. static SP_NOINLINE void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  143429. {
  143430. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  143431. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  143432. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  143433. __asm__ __volatile__ (
  143434. "ldr r11, [%[m]]\n\t"
  143435. /* i = 0 */
  143436. "mov r9, #0\n\t"
  143437. "mov r3, #0\n\t"
  143438. "ldr r12, [%[a]]\n\t"
  143439. "ldr lr, [%[a], #4]\n\t"
  143440. "\n"
  143441. "L_sp_1024_mont_reduce_32_word_%=: \n\t"
  143442. /* mu = a[i] * mp */
  143443. "mul r8, %[mp], r12\n\t"
  143444. /* a[i+0] += m[0] * mu */
  143445. "mov r5, #0\n\t"
  143446. "umlal r12, r5, r8, r11\n\t"
  143447. /* a[i+1] += m[1] * mu */
  143448. "ldr r7, [%[m], #4]\n\t"
  143449. "mov r4, #0\n\t"
  143450. "umlal lr, r4, r8, r7\n\t"
  143451. "mov r12, lr\n\t"
  143452. "adds r12, r12, r5\n\t"
  143453. "adc r4, r4, #0\n\t"
  143454. /* a[i+2] += m[2] * mu */
  143455. "ldr r7, [%[m], #8]\n\t"
  143456. "ldr lr, [%[a], #8]\n\t"
  143457. "mov r5, #0\n\t"
  143458. "umlal lr, r5, r8, r7\n\t"
  143459. "adds lr, lr, r4\n\t"
  143460. "adc r5, r5, #0\n\t"
  143461. /* a[i+3] += m[3] * mu */
  143462. "ldr r7, [%[m], #12]\n\t"
  143463. "ldr r10, [%[a], #12]\n\t"
  143464. "mov r4, #0\n\t"
  143465. "umlal r10, r4, r8, r7\n\t"
  143466. "adds r10, r10, r5\n\t"
  143467. "str r10, [%[a], #12]\n\t"
  143468. "adc r4, r4, #0\n\t"
  143469. /* a[i+4] += m[4] * mu */
  143470. "ldr r7, [%[m], #16]\n\t"
  143471. "ldr r10, [%[a], #16]\n\t"
  143472. "mov r5, #0\n\t"
  143473. "umlal r10, r5, r8, r7\n\t"
  143474. "adds r10, r10, r4\n\t"
  143475. "str r10, [%[a], #16]\n\t"
  143476. "adc r5, r5, #0\n\t"
  143477. /* a[i+5] += m[5] * mu */
  143478. "ldr r7, [%[m], #20]\n\t"
  143479. "ldr r10, [%[a], #20]\n\t"
  143480. "mov r4, #0\n\t"
  143481. "umlal r10, r4, r8, r7\n\t"
  143482. "adds r10, r10, r5\n\t"
  143483. "str r10, [%[a], #20]\n\t"
  143484. "adc r4, r4, #0\n\t"
  143485. /* a[i+6] += m[6] * mu */
  143486. "ldr r7, [%[m], #24]\n\t"
  143487. "ldr r10, [%[a], #24]\n\t"
  143488. "mov r5, #0\n\t"
  143489. "umlal r10, r5, r8, r7\n\t"
  143490. "adds r10, r10, r4\n\t"
  143491. "str r10, [%[a], #24]\n\t"
  143492. "adc r5, r5, #0\n\t"
  143493. /* a[i+7] += m[7] * mu */
  143494. "ldr r7, [%[m], #28]\n\t"
  143495. "ldr r10, [%[a], #28]\n\t"
  143496. "mov r4, #0\n\t"
  143497. "umlal r10, r4, r8, r7\n\t"
  143498. "adds r10, r10, r5\n\t"
  143499. "str r10, [%[a], #28]\n\t"
  143500. "adc r4, r4, #0\n\t"
  143501. /* a[i+8] += m[8] * mu */
  143502. "ldr r7, [%[m], #32]\n\t"
  143503. "ldr r10, [%[a], #32]\n\t"
  143504. "mov r5, #0\n\t"
  143505. "umlal r10, r5, r8, r7\n\t"
  143506. "adds r10, r10, r4\n\t"
  143507. "str r10, [%[a], #32]\n\t"
  143508. "adc r5, r5, #0\n\t"
  143509. /* a[i+9] += m[9] * mu */
  143510. "ldr r7, [%[m], #36]\n\t"
  143511. "ldr r10, [%[a], #36]\n\t"
  143512. "mov r4, #0\n\t"
  143513. "umlal r10, r4, r8, r7\n\t"
  143514. "adds r10, r10, r5\n\t"
  143515. "str r10, [%[a], #36]\n\t"
  143516. "adc r4, r4, #0\n\t"
  143517. /* a[i+10] += m[10] * mu */
  143518. "ldr r7, [%[m], #40]\n\t"
  143519. "ldr r10, [%[a], #40]\n\t"
  143520. "mov r5, #0\n\t"
  143521. "umlal r10, r5, r8, r7\n\t"
  143522. "adds r10, r10, r4\n\t"
  143523. "str r10, [%[a], #40]\n\t"
  143524. "adc r5, r5, #0\n\t"
  143525. /* a[i+11] += m[11] * mu */
  143526. "ldr r7, [%[m], #44]\n\t"
  143527. "ldr r10, [%[a], #44]\n\t"
  143528. "mov r4, #0\n\t"
  143529. "umlal r10, r4, r8, r7\n\t"
  143530. "adds r10, r10, r5\n\t"
  143531. "str r10, [%[a], #44]\n\t"
  143532. "adc r4, r4, #0\n\t"
  143533. /* a[i+12] += m[12] * mu */
  143534. "ldr r7, [%[m], #48]\n\t"
  143535. "ldr r10, [%[a], #48]\n\t"
  143536. "mov r5, #0\n\t"
  143537. "umlal r10, r5, r8, r7\n\t"
  143538. "adds r10, r10, r4\n\t"
  143539. "str r10, [%[a], #48]\n\t"
  143540. "adc r5, r5, #0\n\t"
  143541. /* a[i+13] += m[13] * mu */
  143542. "ldr r7, [%[m], #52]\n\t"
  143543. "ldr r10, [%[a], #52]\n\t"
  143544. "mov r4, #0\n\t"
  143545. "umlal r10, r4, r8, r7\n\t"
  143546. "adds r10, r10, r5\n\t"
  143547. "str r10, [%[a], #52]\n\t"
  143548. "adc r4, r4, #0\n\t"
  143549. /* a[i+14] += m[14] * mu */
  143550. "ldr r7, [%[m], #56]\n\t"
  143551. "ldr r10, [%[a], #56]\n\t"
  143552. "mov r5, #0\n\t"
  143553. "umlal r10, r5, r8, r7\n\t"
  143554. "adds r10, r10, r4\n\t"
  143555. "str r10, [%[a], #56]\n\t"
  143556. "adc r5, r5, #0\n\t"
  143557. /* a[i+15] += m[15] * mu */
  143558. "ldr r7, [%[m], #60]\n\t"
  143559. "ldr r10, [%[a], #60]\n\t"
  143560. "mov r4, #0\n\t"
  143561. "umlal r10, r4, r8, r7\n\t"
  143562. "adds r10, r10, r5\n\t"
  143563. "str r10, [%[a], #60]\n\t"
  143564. "adc r4, r4, #0\n\t"
  143565. /* a[i+16] += m[16] * mu */
  143566. "ldr r7, [%[m], #64]\n\t"
  143567. "ldr r10, [%[a], #64]\n\t"
  143568. "mov r5, #0\n\t"
  143569. "umlal r10, r5, r8, r7\n\t"
  143570. "adds r10, r10, r4\n\t"
  143571. "str r10, [%[a], #64]\n\t"
  143572. "adc r5, r5, #0\n\t"
  143573. /* a[i+17] += m[17] * mu */
  143574. "ldr r7, [%[m], #68]\n\t"
  143575. "ldr r10, [%[a], #68]\n\t"
  143576. "mov r4, #0\n\t"
  143577. "umlal r10, r4, r8, r7\n\t"
  143578. "adds r10, r10, r5\n\t"
  143579. "str r10, [%[a], #68]\n\t"
  143580. "adc r4, r4, #0\n\t"
  143581. /* a[i+18] += m[18] * mu */
  143582. "ldr r7, [%[m], #72]\n\t"
  143583. "ldr r10, [%[a], #72]\n\t"
  143584. "mov r5, #0\n\t"
  143585. "umlal r10, r5, r8, r7\n\t"
  143586. "adds r10, r10, r4\n\t"
  143587. "str r10, [%[a], #72]\n\t"
  143588. "adc r5, r5, #0\n\t"
  143589. /* a[i+19] += m[19] * mu */
  143590. "ldr r7, [%[m], #76]\n\t"
  143591. "ldr r10, [%[a], #76]\n\t"
  143592. "mov r4, #0\n\t"
  143593. "umlal r10, r4, r8, r7\n\t"
  143594. "adds r10, r10, r5\n\t"
  143595. "str r10, [%[a], #76]\n\t"
  143596. "adc r4, r4, #0\n\t"
  143597. /* a[i+20] += m[20] * mu */
  143598. "ldr r7, [%[m], #80]\n\t"
  143599. "ldr r10, [%[a], #80]\n\t"
  143600. "mov r5, #0\n\t"
  143601. "umlal r10, r5, r8, r7\n\t"
  143602. "adds r10, r10, r4\n\t"
  143603. "str r10, [%[a], #80]\n\t"
  143604. "adc r5, r5, #0\n\t"
  143605. /* a[i+21] += m[21] * mu */
  143606. "ldr r7, [%[m], #84]\n\t"
  143607. "ldr r10, [%[a], #84]\n\t"
  143608. "mov r4, #0\n\t"
  143609. "umlal r10, r4, r8, r7\n\t"
  143610. "adds r10, r10, r5\n\t"
  143611. "str r10, [%[a], #84]\n\t"
  143612. "adc r4, r4, #0\n\t"
  143613. /* a[i+22] += m[22] * mu */
  143614. "ldr r7, [%[m], #88]\n\t"
  143615. "ldr r10, [%[a], #88]\n\t"
  143616. "mov r5, #0\n\t"
  143617. "umlal r10, r5, r8, r7\n\t"
  143618. "adds r10, r10, r4\n\t"
  143619. "str r10, [%[a], #88]\n\t"
  143620. "adc r5, r5, #0\n\t"
  143621. /* a[i+23] += m[23] * mu */
  143622. "ldr r7, [%[m], #92]\n\t"
  143623. "ldr r10, [%[a], #92]\n\t"
  143624. "mov r4, #0\n\t"
  143625. "umlal r10, r4, r8, r7\n\t"
  143626. "adds r10, r10, r5\n\t"
  143627. "str r10, [%[a], #92]\n\t"
  143628. "adc r4, r4, #0\n\t"
  143629. /* a[i+24] += m[24] * mu */
  143630. "ldr r7, [%[m], #96]\n\t"
  143631. "ldr r10, [%[a], #96]\n\t"
  143632. "mov r5, #0\n\t"
  143633. "umlal r10, r5, r8, r7\n\t"
  143634. "adds r10, r10, r4\n\t"
  143635. "str r10, [%[a], #96]\n\t"
  143636. "adc r5, r5, #0\n\t"
  143637. /* a[i+25] += m[25] * mu */
  143638. "ldr r7, [%[m], #100]\n\t"
  143639. "ldr r10, [%[a], #100]\n\t"
  143640. "mov r4, #0\n\t"
  143641. "umlal r10, r4, r8, r7\n\t"
  143642. "adds r10, r10, r5\n\t"
  143643. "str r10, [%[a], #100]\n\t"
  143644. "adc r4, r4, #0\n\t"
  143645. /* a[i+26] += m[26] * mu */
  143646. "ldr r7, [%[m], #104]\n\t"
  143647. "ldr r10, [%[a], #104]\n\t"
  143648. "mov r5, #0\n\t"
  143649. "umlal r10, r5, r8, r7\n\t"
  143650. "adds r10, r10, r4\n\t"
  143651. "str r10, [%[a], #104]\n\t"
  143652. "adc r5, r5, #0\n\t"
  143653. /* a[i+27] += m[27] * mu */
  143654. "ldr r7, [%[m], #108]\n\t"
  143655. "ldr r10, [%[a], #108]\n\t"
  143656. "mov r4, #0\n\t"
  143657. "umlal r10, r4, r8, r7\n\t"
  143658. "adds r10, r10, r5\n\t"
  143659. "str r10, [%[a], #108]\n\t"
  143660. "adc r4, r4, #0\n\t"
  143661. /* a[i+28] += m[28] * mu */
  143662. "ldr r7, [%[m], #112]\n\t"
  143663. "ldr r10, [%[a], #112]\n\t"
  143664. "mov r5, #0\n\t"
  143665. "umlal r10, r5, r8, r7\n\t"
  143666. "adds r10, r10, r4\n\t"
  143667. "str r10, [%[a], #112]\n\t"
  143668. "adc r5, r5, #0\n\t"
  143669. /* a[i+29] += m[29] * mu */
  143670. "ldr r7, [%[m], #116]\n\t"
  143671. "ldr r10, [%[a], #116]\n\t"
  143672. "mov r4, #0\n\t"
  143673. "umlal r10, r4, r8, r7\n\t"
  143674. "adds r10, r10, r5\n\t"
  143675. "str r10, [%[a], #116]\n\t"
  143676. "adc r4, r4, #0\n\t"
  143677. /* a[i+30] += m[30] * mu */
  143678. "ldr r7, [%[m], #120]\n\t"
  143679. "ldr r10, [%[a], #120]\n\t"
  143680. "mov r5, #0\n\t"
  143681. "umlal r10, r5, r8, r7\n\t"
  143682. "adds r10, r10, r4\n\t"
  143683. "str r10, [%[a], #120]\n\t"
  143684. "adc r5, r5, #0\n\t"
  143685. /* a[i+31] += m[31] * mu */
  143686. "ldr r7, [%[m], #124]\n\t"
  143687. "ldr r10, [%[a], #124]\n\t"
  143688. "umull r6, r7, r8, r7\n\t"
  143689. "adds r5, r5, r6\n\t"
  143690. "adcs r4, r7, r3\n\t"
  143691. "mov r3, #0\n\t"
  143692. "adc r3, r3, r3\n\t"
  143693. "adds r10, r10, r5\n\t"
  143694. "str r10, [%[a], #124]\n\t"
  143695. "ldr r10, [%[a], #128]\n\t"
  143696. "adcs r10, r10, r4\n\t"
  143697. "str r10, [%[a], #128]\n\t"
  143698. "adc r3, r3, #0\n\t"
  143699. /* i += 1 */
  143700. "add r9, r9, #4\n\t"
  143701. "add %[a], %[a], #4\n\t"
  143702. "cmp r9, #0x80\n\t"
  143703. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  143704. /* Loop Done */
  143705. "str r12, [%[a]]\n\t"
  143706. "str lr, [%[a], #4]\n\t"
  143707. "ldr r6, [%[m], #124]\n\t"
  143708. "subs r10, r6, r10\n\t"
  143709. "neg r3, r3\n\t"
  143710. "sbc r10, r10, r10\n\t"
  143711. "orr r3, r3, r10\n\t"
  143712. "mov %[mp], r3\n\t"
  143713. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  143714. :
  143715. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  143716. );
  143717. sp_1024_cond_sub_32(a - 32, a, m, mp);
  143718. }
  143719. #else
  143720. /* Reduce the number back to 1024 bits using Montgomery reduction.
  143721. *
  143722. * a A single precision number to reduce in place.
  143723. * m The single precision number representing the modulus.
  143724. * mp The digit representing the negative inverse of m mod 2^n.
  143725. */
  143726. static SP_NOINLINE void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  143727. {
  143728. register sp_digit* a asm ("r0") = (sp_digit*)a_p;
  143729. register const sp_digit* m asm ("r1") = (const sp_digit*)m_p;
  143730. register sp_digit mp asm ("r2") = (sp_digit)mp_p;
  143731. __asm__ __volatile__ (
  143732. /* i = 0 */
  143733. "mov r12, #0\n\t"
  143734. "mov lr, #0\n\t"
  143735. "ldr r4, [%[a]]\n\t"
  143736. "ldr r5, [%[a], #4]\n\t"
  143737. "ldr r6, [%[a], #8]\n\t"
  143738. "ldr r7, [%[a], #12]\n\t"
  143739. "ldr r8, [%[a], #16]\n\t"
  143740. "\n"
  143741. "L_sp_1024_mont_reduce_32_word_%=: \n\t"
  143742. /* mu = a[i] * mp */
  143743. "mul r11, %[mp], r4\n\t"
  143744. /* a[i+0] += m[0] * mu */
  143745. "ldr r10, [%[m]]\n\t"
  143746. "mov r3, #0\n\t"
  143747. "umaal r4, r3, r11, r10\n\t"
  143748. /* a[i+1] += m[1] * mu */
  143749. "ldr r10, [%[m], #4]\n\t"
  143750. "mov r4, r5\n\t"
  143751. "umaal r4, r3, r11, r10\n\t"
  143752. /* a[i+2] += m[2] * mu */
  143753. "ldr r10, [%[m], #8]\n\t"
  143754. "mov r5, r6\n\t"
  143755. "umaal r5, r3, r11, r10\n\t"
  143756. /* a[i+3] += m[3] * mu */
  143757. "ldr r10, [%[m], #12]\n\t"
  143758. "mov r6, r7\n\t"
  143759. "umaal r6, r3, r11, r10\n\t"
  143760. /* a[i+4] += m[4] * mu */
  143761. "ldr r10, [%[m], #16]\n\t"
  143762. "mov r7, r8\n\t"
  143763. "umaal r7, r3, r11, r10\n\t"
  143764. /* a[i+5] += m[5] * mu */
  143765. "ldr r10, [%[m], #20]\n\t"
  143766. "ldr r8, [%[a], #20]\n\t"
  143767. "umaal r8, r3, r11, r10\n\t"
  143768. /* a[i+6] += m[6] * mu */
  143769. "ldr r10, [%[m], #24]\n\t"
  143770. "ldr r9, [%[a], #24]\n\t"
  143771. "umaal r9, r3, r11, r10\n\t"
  143772. "str r9, [%[a], #24]\n\t"
  143773. /* a[i+7] += m[7] * mu */
  143774. "ldr r10, [%[m], #28]\n\t"
  143775. "ldr r9, [%[a], #28]\n\t"
  143776. "umaal r9, r3, r11, r10\n\t"
  143777. "str r9, [%[a], #28]\n\t"
  143778. /* a[i+8] += m[8] * mu */
  143779. "ldr r10, [%[m], #32]\n\t"
  143780. "ldr r9, [%[a], #32]\n\t"
  143781. "umaal r9, r3, r11, r10\n\t"
  143782. "str r9, [%[a], #32]\n\t"
  143783. /* a[i+9] += m[9] * mu */
  143784. "ldr r10, [%[m], #36]\n\t"
  143785. "ldr r9, [%[a], #36]\n\t"
  143786. "umaal r9, r3, r11, r10\n\t"
  143787. "str r9, [%[a], #36]\n\t"
  143788. /* a[i+10] += m[10] * mu */
  143789. "ldr r10, [%[m], #40]\n\t"
  143790. "ldr r9, [%[a], #40]\n\t"
  143791. "umaal r9, r3, r11, r10\n\t"
  143792. "str r9, [%[a], #40]\n\t"
  143793. /* a[i+11] += m[11] * mu */
  143794. "ldr r10, [%[m], #44]\n\t"
  143795. "ldr r9, [%[a], #44]\n\t"
  143796. "umaal r9, r3, r11, r10\n\t"
  143797. "str r9, [%[a], #44]\n\t"
  143798. /* a[i+12] += m[12] * mu */
  143799. "ldr r10, [%[m], #48]\n\t"
  143800. "ldr r9, [%[a], #48]\n\t"
  143801. "umaal r9, r3, r11, r10\n\t"
  143802. "str r9, [%[a], #48]\n\t"
  143803. /* a[i+13] += m[13] * mu */
  143804. "ldr r10, [%[m], #52]\n\t"
  143805. "ldr r9, [%[a], #52]\n\t"
  143806. "umaal r9, r3, r11, r10\n\t"
  143807. "str r9, [%[a], #52]\n\t"
  143808. /* a[i+14] += m[14] * mu */
  143809. "ldr r10, [%[m], #56]\n\t"
  143810. "ldr r9, [%[a], #56]\n\t"
  143811. "umaal r9, r3, r11, r10\n\t"
  143812. "str r9, [%[a], #56]\n\t"
  143813. /* a[i+15] += m[15] * mu */
  143814. "ldr r10, [%[m], #60]\n\t"
  143815. "ldr r9, [%[a], #60]\n\t"
  143816. "umaal r9, r3, r11, r10\n\t"
  143817. "str r9, [%[a], #60]\n\t"
  143818. /* a[i+16] += m[16] * mu */
  143819. "ldr r10, [%[m], #64]\n\t"
  143820. "ldr r9, [%[a], #64]\n\t"
  143821. "umaal r9, r3, r11, r10\n\t"
  143822. "str r9, [%[a], #64]\n\t"
  143823. /* a[i+17] += m[17] * mu */
  143824. "ldr r10, [%[m], #68]\n\t"
  143825. "ldr r9, [%[a], #68]\n\t"
  143826. "umaal r9, r3, r11, r10\n\t"
  143827. "str r9, [%[a], #68]\n\t"
  143828. /* a[i+18] += m[18] * mu */
  143829. "ldr r10, [%[m], #72]\n\t"
  143830. "ldr r9, [%[a], #72]\n\t"
  143831. "umaal r9, r3, r11, r10\n\t"
  143832. "str r9, [%[a], #72]\n\t"
  143833. /* a[i+19] += m[19] * mu */
  143834. "ldr r10, [%[m], #76]\n\t"
  143835. "ldr r9, [%[a], #76]\n\t"
  143836. "umaal r9, r3, r11, r10\n\t"
  143837. "str r9, [%[a], #76]\n\t"
  143838. /* a[i+20] += m[20] * mu */
  143839. "ldr r10, [%[m], #80]\n\t"
  143840. "ldr r9, [%[a], #80]\n\t"
  143841. "umaal r9, r3, r11, r10\n\t"
  143842. "str r9, [%[a], #80]\n\t"
  143843. /* a[i+21] += m[21] * mu */
  143844. "ldr r10, [%[m], #84]\n\t"
  143845. "ldr r9, [%[a], #84]\n\t"
  143846. "umaal r9, r3, r11, r10\n\t"
  143847. "str r9, [%[a], #84]\n\t"
  143848. /* a[i+22] += m[22] * mu */
  143849. "ldr r10, [%[m], #88]\n\t"
  143850. "ldr r9, [%[a], #88]\n\t"
  143851. "umaal r9, r3, r11, r10\n\t"
  143852. "str r9, [%[a], #88]\n\t"
  143853. /* a[i+23] += m[23] * mu */
  143854. "ldr r10, [%[m], #92]\n\t"
  143855. "ldr r9, [%[a], #92]\n\t"
  143856. "umaal r9, r3, r11, r10\n\t"
  143857. "str r9, [%[a], #92]\n\t"
  143858. /* a[i+24] += m[24] * mu */
  143859. "ldr r10, [%[m], #96]\n\t"
  143860. "ldr r9, [%[a], #96]\n\t"
  143861. "umaal r9, r3, r11, r10\n\t"
  143862. "str r9, [%[a], #96]\n\t"
  143863. /* a[i+25] += m[25] * mu */
  143864. "ldr r10, [%[m], #100]\n\t"
  143865. "ldr r9, [%[a], #100]\n\t"
  143866. "umaal r9, r3, r11, r10\n\t"
  143867. "str r9, [%[a], #100]\n\t"
  143868. /* a[i+26] += m[26] * mu */
  143869. "ldr r10, [%[m], #104]\n\t"
  143870. "ldr r9, [%[a], #104]\n\t"
  143871. "umaal r9, r3, r11, r10\n\t"
  143872. "str r9, [%[a], #104]\n\t"
  143873. /* a[i+27] += m[27] * mu */
  143874. "ldr r10, [%[m], #108]\n\t"
  143875. "ldr r9, [%[a], #108]\n\t"
  143876. "umaal r9, r3, r11, r10\n\t"
  143877. "str r9, [%[a], #108]\n\t"
  143878. /* a[i+28] += m[28] * mu */
  143879. "ldr r10, [%[m], #112]\n\t"
  143880. "ldr r9, [%[a], #112]\n\t"
  143881. "umaal r9, r3, r11, r10\n\t"
  143882. "str r9, [%[a], #112]\n\t"
  143883. /* a[i+29] += m[29] * mu */
  143884. "ldr r10, [%[m], #116]\n\t"
  143885. "ldr r9, [%[a], #116]\n\t"
  143886. "umaal r9, r3, r11, r10\n\t"
  143887. "str r9, [%[a], #116]\n\t"
  143888. /* a[i+30] += m[30] * mu */
  143889. "ldr r10, [%[m], #120]\n\t"
  143890. "ldr r9, [%[a], #120]\n\t"
  143891. "umaal r9, r3, r11, r10\n\t"
  143892. "str r9, [%[a], #120]\n\t"
  143893. /* a[i+31] += m[31] * mu */
  143894. "ldr r10, [%[m], #124]\n\t"
  143895. "ldr r9, [%[a], #124]\n\t"
  143896. "umaal r9, r3, r11, r10\n\t"
  143897. "ldr r11, [%[a], #128]\n\t"
  143898. "mov r10, #0\n\t"
  143899. "umaal r3, r11, r10, r10\n\t"
  143900. "str r9, [%[a], #124]\n\t"
  143901. "adds r3, r3, lr\n\t"
  143902. "adc lr, r11, #0\n\t"
  143903. "str r3, [%[a], #128]\n\t"
  143904. /* i += 1 */
  143905. "add r12, r12, #4\n\t"
  143906. "add %[a], %[a], #4\n\t"
  143907. "cmp r12, #0x80\n\t"
  143908. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  143909. /* Loop Done */
  143910. "str r4, [%[a]]\n\t"
  143911. "str r5, [%[a], #4]\n\t"
  143912. "str r6, [%[a], #8]\n\t"
  143913. "str r7, [%[a], #12]\n\t"
  143914. "str r8, [%[a], #16]\n\t"
  143915. "ldr r10, [%[m], #124]\n\t"
  143916. "subs r3, r10, r3\n\t"
  143917. "neg lr, lr\n\t"
  143918. "sbc r3, r3, r3\n\t"
  143919. "orr lr, lr, r3\n\t"
  143920. "mov %[mp], lr\n\t"
  143921. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  143922. :
  143923. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc"
  143924. );
  143925. sp_1024_cond_sub_32(a - 32, a, m, mp);
  143926. }
  143927. #endif
  143928. /* Multiply two Montgomery form numbers mod the modulus (prime).
  143929. * (r = a * b mod m)
  143930. *
  143931. * r Result of multiplication.
  143932. * a First number to multiply in Montgomery form.
  143933. * b Second number to multiply in Montgomery form.
  143934. * m Modulus (prime).
  143935. * mp Montgomery multiplier.
  143936. */
  143937. SP_NOINLINE static void sp_1024_mont_mul_32(sp_digit* r, const sp_digit* a,
  143938. const sp_digit* b, const sp_digit* m, sp_digit mp)
  143939. {
  143940. sp_1024_mul_32(r, a, b);
  143941. sp_1024_mont_reduce_32(r, m, mp);
  143942. }
  143943. /* Square the Montgomery form number. (r = a * a mod m)
  143944. *
  143945. * r Result of squaring.
  143946. * a Number to square in Montgomery form.
  143947. * m Modulus (prime).
  143948. * mp Montgomery multiplier.
  143949. */
  143950. SP_NOINLINE static void sp_1024_mont_sqr_32(sp_digit* r, const sp_digit* a,
  143951. const sp_digit* m, sp_digit mp)
  143952. {
  143953. sp_1024_sqr_32(r, a);
  143954. sp_1024_mont_reduce_32(r, m, mp);
  143955. }
  143956. /* Mod-2 for the P1024 curve. */
  143957. static const uint8_t p1024_mod_minus_2[] = {
  143958. 6,0x06, 7,0x0f, 7,0x0b, 6,0x0c, 7,0x1e, 9,0x09, 7,0x0c, 7,0x1f,
  143959. 6,0x16, 6,0x06, 7,0x0e, 8,0x10, 6,0x03, 8,0x11, 6,0x0d, 7,0x14,
  143960. 9,0x12, 6,0x0f, 7,0x04, 9,0x0d, 6,0x00, 7,0x13, 6,0x01, 6,0x07,
  143961. 8,0x0d, 8,0x00, 6,0x06, 9,0x17, 6,0x14, 6,0x15, 6,0x11, 6,0x0b,
  143962. 9,0x0c, 6,0x1e, 13,0x14, 7,0x0e, 6,0x1d, 12,0x0a, 6,0x0b, 8,0x07,
  143963. 6,0x18, 6,0x0f, 6,0x10, 8,0x1c, 7,0x16, 7,0x02, 6,0x01, 6,0x13,
  143964. 10,0x15, 7,0x06, 8,0x14, 6,0x0c, 6,0x19, 7,0x10, 6,0x19, 6,0x19,
  143965. 9,0x16, 7,0x19, 6,0x1f, 6,0x17, 6,0x12, 8,0x02, 6,0x01, 6,0x04,
  143966. 6,0x15, 7,0x16, 6,0x04, 6,0x1f, 6,0x09, 7,0x06, 7,0x13, 7,0x09,
  143967. 6,0x0d, 10,0x18, 6,0x06, 6,0x11, 6,0x04, 6,0x01, 6,0x13, 8,0x06,
  143968. 6,0x0d, 8,0x13, 7,0x08, 6,0x08, 6,0x05, 7,0x0c, 7,0x0e, 7,0x15,
  143969. 6,0x05, 7,0x14, 10,0x19, 6,0x10, 6,0x16, 6,0x15, 7,0x1f, 6,0x14,
  143970. 6,0x0a, 10,0x11, 6,0x01, 7,0x05, 7,0x08, 8,0x0a, 7,0x1e, 7,0x1c,
  143971. 6,0x1c, 7,0x09, 10,0x18, 7,0x1c, 10,0x06, 6,0x0a, 6,0x07, 6,0x19,
  143972. 7,0x06, 6,0x0d, 7,0x0f, 7,0x0b, 7,0x05, 6,0x11, 6,0x1c, 7,0x1f,
  143973. 6,0x1e, 7,0x18, 6,0x1e, 6,0x00, 6,0x03, 6,0x02, 7,0x10, 6,0x0b,
  143974. 6,0x1b, 7,0x10, 6,0x00, 8,0x11, 7,0x1b, 6,0x18, 6,0x01, 7,0x0c,
  143975. 7,0x1d, 7,0x13, 6,0x08, 7,0x1b, 8,0x13, 7,0x16, 13,0x1d, 7,0x1f,
  143976. 6,0x0a, 6,0x01, 7,0x1f, 6,0x14, 1,0x01
  143977. };
  143978. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  143979. * P1024 curve. (r = 1 / a mod m)
  143980. *
  143981. * r Inverse result.
  143982. * a Number to invert.
  143983. * td Temporary data.
  143984. */
  143985. static void sp_1024_mont_inv_32(sp_digit* r, const sp_digit* a,
  143986. sp_digit* td)
  143987. {
  143988. sp_digit* t = &td[32 * 2 * 32];
  143989. int i;
  143990. int j;
  143991. sp_digit* table[32];
  143992. for (i = 0; i < 32; i++) {
  143993. table[i] = &td[2 * 32 * i];
  143994. }
  143995. XMEMCPY(table[0], a, sizeof(sp_digit) * 32);
  143996. for (i = 1; i < 6; i++) {
  143997. sp_1024_mont_sqr_32(table[0], table[0], p1024_mod, p1024_mp_mod);
  143998. }
  143999. for (i = 1; i < 32; i++) {
  144000. sp_1024_mont_mul_32(table[i], table[i-1], a, p1024_mod, p1024_mp_mod);
  144001. }
  144002. XMEMCPY(t, table[p1024_mod_minus_2[1]], sizeof(sp_digit) * 32);
  144003. for (i = 2; i < (int)sizeof(p1024_mod_minus_2) - 2; i += 2) {
  144004. for (j = 0; j < p1024_mod_minus_2[i]; j++) {
  144005. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  144006. }
  144007. sp_1024_mont_mul_32(t, t, table[p1024_mod_minus_2[i+1]], p1024_mod,
  144008. p1024_mp_mod);
  144009. }
  144010. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  144011. sp_1024_mont_mul_32(r, t, a, p1024_mod, p1024_mp_mod);
  144012. }
  144013. /* Normalize the values in each word to 32.
  144014. *
  144015. * a Array of sp_digit to normalize.
  144016. */
  144017. #define sp_1024_norm_32(a)
  144018. /* Map the Montgomery form projective coordinate point to an affine point.
  144019. *
  144020. * r Resulting affine coordinate point.
  144021. * p Montgomery form projective coordinate point.
  144022. * t Temporary ordinate data.
  144023. */
  144024. static void sp_1024_map_32(sp_point_1024* r, const sp_point_1024* p,
  144025. sp_digit* t)
  144026. {
  144027. sp_digit* t1 = t;
  144028. sp_digit* t2 = t + 2*32;
  144029. sp_int32 n;
  144030. sp_1024_mont_inv_32(t1, p->z, t + 2*32);
  144031. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  144032. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  144033. /* x /= z^2 */
  144034. sp_1024_mont_mul_32(r->x, p->x, t2, p1024_mod, p1024_mp_mod);
  144035. XMEMSET(r->x + 32, 0, sizeof(sp_digit) * 32U);
  144036. sp_1024_mont_reduce_32(r->x, p1024_mod, p1024_mp_mod);
  144037. /* Reduce x to less than modulus */
  144038. n = sp_1024_cmp_32(r->x, p1024_mod);
  144039. sp_1024_cond_sub_32(r->x, r->x, p1024_mod, (sp_digit)~(n >> 31));
  144040. sp_1024_norm_32(r->x);
  144041. /* y /= z^3 */
  144042. sp_1024_mont_mul_32(r->y, p->y, t1, p1024_mod, p1024_mp_mod);
  144043. XMEMSET(r->y + 32, 0, sizeof(sp_digit) * 32U);
  144044. sp_1024_mont_reduce_32(r->y, p1024_mod, p1024_mp_mod);
  144045. /* Reduce y to less than modulus */
  144046. n = sp_1024_cmp_32(r->y, p1024_mod);
  144047. sp_1024_cond_sub_32(r->y, r->y, p1024_mod, (sp_digit)~(n >> 31));
  144048. sp_1024_norm_32(r->y);
  144049. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  144050. r->z[0] = 1;
  144051. }
  144052. /* Add two Montgomery form numbers (r = a + b % m).
  144053. *
  144054. * r Result of addition.
  144055. * a First number to add in Montgomery form.
  144056. * b Second number to add in Montgomery form.
  144057. * m Modulus (prime).
  144058. */
  144059. 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)
  144060. {
  144061. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144062. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144063. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  144064. register const sp_digit* m asm ("r3") = (const sp_digit*)m_p;
  144065. __asm__ __volatile__ (
  144066. "mov r12, #0\n\t"
  144067. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144068. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144069. "adds r4, r4, r8\n\t"
  144070. "adcs r5, r5, r9\n\t"
  144071. "adcs r6, r6, r10\n\t"
  144072. "adcs r7, r7, r11\n\t"
  144073. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144074. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144075. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144076. "adcs r4, r4, r8\n\t"
  144077. "adcs r5, r5, r9\n\t"
  144078. "adcs r6, r6, r10\n\t"
  144079. "adcs r7, r7, r11\n\t"
  144080. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144081. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144082. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144083. "adcs r4, r4, r8\n\t"
  144084. "adcs r5, r5, r9\n\t"
  144085. "adcs r6, r6, r10\n\t"
  144086. "adcs r7, r7, r11\n\t"
  144087. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144088. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144089. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144090. "adcs r4, r4, r8\n\t"
  144091. "adcs r5, r5, r9\n\t"
  144092. "adcs r6, r6, r10\n\t"
  144093. "adcs r7, r7, r11\n\t"
  144094. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144095. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144096. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144097. "adcs r4, r4, r8\n\t"
  144098. "adcs r5, r5, r9\n\t"
  144099. "adcs r6, r6, r10\n\t"
  144100. "adcs r7, r7, r11\n\t"
  144101. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144102. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144103. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144104. "adcs r4, r4, r8\n\t"
  144105. "adcs r5, r5, r9\n\t"
  144106. "adcs r6, r6, r10\n\t"
  144107. "adcs r7, r7, r11\n\t"
  144108. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144109. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144110. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144111. "adcs r4, r4, r8\n\t"
  144112. "adcs r5, r5, r9\n\t"
  144113. "adcs r6, r6, r10\n\t"
  144114. "adcs r7, r7, r11\n\t"
  144115. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144116. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144117. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144118. "adcs r4, r4, r8\n\t"
  144119. "adcs r5, r5, r9\n\t"
  144120. "adcs r6, r6, r10\n\t"
  144121. "adcs r7, r7, r11\n\t"
  144122. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144123. "ldr r11, [%[m], #124]\n\t"
  144124. "adc r12, r12, #0\n\t"
  144125. "subs r11, r11, r7\n\t"
  144126. "neg r12, r12\n\t"
  144127. "sbc r11, r11, r11\n\t"
  144128. "sub %[r], %[r], #0x80\n\t"
  144129. "orr r12, r12, r11\n\t"
  144130. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144131. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144132. "and r8, r8, r12\n\t"
  144133. "and r9, r9, r12\n\t"
  144134. "and r10, r10, r12\n\t"
  144135. "and r11, r11, r12\n\t"
  144136. "subs r4, r4, r8\n\t"
  144137. "sbcs r5, r5, r9\n\t"
  144138. "sbcs r6, r6, r10\n\t"
  144139. "sbcs r7, r7, r11\n\t"
  144140. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144141. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144142. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144143. "and r8, r8, r12\n\t"
  144144. "and r9, r9, r12\n\t"
  144145. "and r10, r10, r12\n\t"
  144146. "and r11, r11, r12\n\t"
  144147. "sbcs r4, r4, r8\n\t"
  144148. "sbcs r5, r5, r9\n\t"
  144149. "sbcs r6, r6, r10\n\t"
  144150. "sbcs r7, r7, r11\n\t"
  144151. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144152. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144153. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144154. "and r8, r8, r12\n\t"
  144155. "and r9, r9, r12\n\t"
  144156. "and r10, r10, r12\n\t"
  144157. "and r11, r11, r12\n\t"
  144158. "sbcs r4, r4, r8\n\t"
  144159. "sbcs r5, r5, r9\n\t"
  144160. "sbcs r6, r6, r10\n\t"
  144161. "sbcs r7, r7, r11\n\t"
  144162. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144163. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144164. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144165. "and r8, r8, r12\n\t"
  144166. "and r9, r9, r12\n\t"
  144167. "and r10, r10, r12\n\t"
  144168. "and r11, r11, r12\n\t"
  144169. "sbcs r4, r4, r8\n\t"
  144170. "sbcs r5, r5, r9\n\t"
  144171. "sbcs r6, r6, r10\n\t"
  144172. "sbcs r7, r7, r11\n\t"
  144173. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144174. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144175. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144176. "and r8, r8, r12\n\t"
  144177. "and r9, r9, r12\n\t"
  144178. "and r10, r10, r12\n\t"
  144179. "and r11, r11, r12\n\t"
  144180. "sbcs r4, r4, r8\n\t"
  144181. "sbcs r5, r5, r9\n\t"
  144182. "sbcs r6, r6, r10\n\t"
  144183. "sbcs r7, r7, r11\n\t"
  144184. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144185. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144186. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144187. "and r8, r8, r12\n\t"
  144188. "and r9, r9, r12\n\t"
  144189. "and r10, r10, r12\n\t"
  144190. "and r11, r11, r12\n\t"
  144191. "sbcs r4, r4, r8\n\t"
  144192. "sbcs r5, r5, r9\n\t"
  144193. "sbcs r6, r6, r10\n\t"
  144194. "sbcs r7, r7, r11\n\t"
  144195. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144196. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144197. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144198. "and r8, r8, r12\n\t"
  144199. "and r9, r9, r12\n\t"
  144200. "and r10, r10, r12\n\t"
  144201. "and r11, r11, r12\n\t"
  144202. "sbcs r4, r4, r8\n\t"
  144203. "sbcs r5, r5, r9\n\t"
  144204. "sbcs r6, r6, r10\n\t"
  144205. "sbcs r7, r7, r11\n\t"
  144206. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144207. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144208. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144209. "and r8, r8, r12\n\t"
  144210. "and r9, r9, r12\n\t"
  144211. "and r10, r10, r12\n\t"
  144212. "and r11, r11, r12\n\t"
  144213. "sbcs r4, r4, r8\n\t"
  144214. "sbcs r5, r5, r9\n\t"
  144215. "sbcs r6, r6, r10\n\t"
  144216. "sbc r7, r7, r11\n\t"
  144217. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144218. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  144219. :
  144220. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc"
  144221. );
  144222. }
  144223. /* Double a Montgomery form number (r = a + a % m).
  144224. *
  144225. * r Result of doubling.
  144226. * a Number to double in Montgomery form.
  144227. * m Modulus (prime).
  144228. */
  144229. static void sp_1024_mont_dbl_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  144230. {
  144231. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144232. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144233. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  144234. __asm__ __volatile__ (
  144235. "mov r12, #0\n\t"
  144236. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144237. "adds r4, r4, r4\n\t"
  144238. "adcs r5, r5, r5\n\t"
  144239. "adcs r6, r6, r6\n\t"
  144240. "adcs r7, r7, r7\n\t"
  144241. "adcs r8, r8, r8\n\t"
  144242. "adcs r9, r9, r9\n\t"
  144243. "adcs r10, r10, r10\n\t"
  144244. "adcs r11, r11, r11\n\t"
  144245. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144246. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144247. "adcs r4, r4, r4\n\t"
  144248. "adcs r5, r5, r5\n\t"
  144249. "adcs r6, r6, r6\n\t"
  144250. "adcs r7, r7, r7\n\t"
  144251. "adcs r8, r8, r8\n\t"
  144252. "adcs r9, r9, r9\n\t"
  144253. "adcs r10, r10, r10\n\t"
  144254. "adcs r11, r11, r11\n\t"
  144255. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144256. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144257. "adcs r4, r4, r4\n\t"
  144258. "adcs r5, r5, r5\n\t"
  144259. "adcs r6, r6, r6\n\t"
  144260. "adcs r7, r7, r7\n\t"
  144261. "adcs r8, r8, r8\n\t"
  144262. "adcs r9, r9, r9\n\t"
  144263. "adcs r10, r10, r10\n\t"
  144264. "adcs r11, r11, r11\n\t"
  144265. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144266. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144267. "adcs r4, r4, r4\n\t"
  144268. "adcs r5, r5, r5\n\t"
  144269. "adcs r6, r6, r6\n\t"
  144270. "adcs r7, r7, r7\n\t"
  144271. "adcs r8, r8, r8\n\t"
  144272. "adcs r9, r9, r9\n\t"
  144273. "adcs r10, r10, r10\n\t"
  144274. "adcs r11, r11, r11\n\t"
  144275. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144276. "ldr r4, [%[m], #124]\n\t"
  144277. "adc r12, r12, #0\n\t"
  144278. "subs r4, r4, r11\n\t"
  144279. "neg r12, r12\n\t"
  144280. "sbc r4, r4, r4\n\t"
  144281. "sub %[r], %[r], #0x80\n\t"
  144282. "orr r12, r12, r4\n\t"
  144283. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144284. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144285. "and r8, r8, r12\n\t"
  144286. "and r9, r9, r12\n\t"
  144287. "and r10, r10, r12\n\t"
  144288. "and r11, r11, r12\n\t"
  144289. "subs r4, r4, r8\n\t"
  144290. "sbcs r5, r5, r9\n\t"
  144291. "sbcs r6, r6, r10\n\t"
  144292. "sbcs r7, r7, r11\n\t"
  144293. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144294. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144295. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144296. "and r8, r8, r12\n\t"
  144297. "and r9, r9, r12\n\t"
  144298. "and r10, r10, r12\n\t"
  144299. "and r11, r11, r12\n\t"
  144300. "sbcs r4, r4, r8\n\t"
  144301. "sbcs r5, r5, r9\n\t"
  144302. "sbcs r6, r6, r10\n\t"
  144303. "sbcs r7, r7, r11\n\t"
  144304. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144305. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144306. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144307. "and r8, r8, r12\n\t"
  144308. "and r9, r9, r12\n\t"
  144309. "and r10, r10, r12\n\t"
  144310. "and r11, r11, r12\n\t"
  144311. "sbcs r4, r4, r8\n\t"
  144312. "sbcs r5, r5, r9\n\t"
  144313. "sbcs r6, r6, r10\n\t"
  144314. "sbcs r7, r7, r11\n\t"
  144315. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144316. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144317. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144318. "and r8, r8, r12\n\t"
  144319. "and r9, r9, r12\n\t"
  144320. "and r10, r10, r12\n\t"
  144321. "and r11, r11, r12\n\t"
  144322. "sbcs r4, r4, r8\n\t"
  144323. "sbcs r5, r5, r9\n\t"
  144324. "sbcs r6, r6, r10\n\t"
  144325. "sbcs r7, r7, r11\n\t"
  144326. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144327. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144328. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144329. "and r8, r8, r12\n\t"
  144330. "and r9, r9, r12\n\t"
  144331. "and r10, r10, r12\n\t"
  144332. "and r11, r11, r12\n\t"
  144333. "sbcs r4, r4, r8\n\t"
  144334. "sbcs r5, r5, r9\n\t"
  144335. "sbcs r6, r6, r10\n\t"
  144336. "sbcs r7, r7, r11\n\t"
  144337. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144338. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144339. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144340. "and r8, r8, r12\n\t"
  144341. "and r9, r9, r12\n\t"
  144342. "and r10, r10, r12\n\t"
  144343. "and r11, r11, r12\n\t"
  144344. "sbcs r4, r4, r8\n\t"
  144345. "sbcs r5, r5, r9\n\t"
  144346. "sbcs r6, r6, r10\n\t"
  144347. "sbcs r7, r7, r11\n\t"
  144348. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144349. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144350. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144351. "and r8, r8, r12\n\t"
  144352. "and r9, r9, r12\n\t"
  144353. "and r10, r10, r12\n\t"
  144354. "and r11, r11, r12\n\t"
  144355. "sbcs r4, r4, r8\n\t"
  144356. "sbcs r5, r5, r9\n\t"
  144357. "sbcs r6, r6, r10\n\t"
  144358. "sbcs r7, r7, r11\n\t"
  144359. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144360. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144361. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144362. "and r8, r8, r12\n\t"
  144363. "and r9, r9, r12\n\t"
  144364. "and r10, r10, r12\n\t"
  144365. "and r11, r11, r12\n\t"
  144366. "sbcs r4, r4, r8\n\t"
  144367. "sbcs r5, r5, r9\n\t"
  144368. "sbcs r6, r6, r10\n\t"
  144369. "sbc r7, r7, r11\n\t"
  144370. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144371. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  144372. :
  144373. : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12", "cc"
  144374. );
  144375. }
  144376. /* Triple a Montgomery form number (r = a + a + a % m).
  144377. *
  144378. * r Result of Tripling.
  144379. * a Number to triple in Montgomery form.
  144380. * m Modulus (prime).
  144381. */
  144382. static void sp_1024_mont_tpl_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  144383. {
  144384. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144385. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144386. register const sp_digit* m asm ("r2") = (const sp_digit*)m_p;
  144387. __asm__ __volatile__ (
  144388. "mov r12, #0\n\t"
  144389. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144390. "adds r4, r4, r4\n\t"
  144391. "adcs r5, r5, r5\n\t"
  144392. "adcs r6, r6, r6\n\t"
  144393. "adcs r7, r7, r7\n\t"
  144394. "adcs r8, r8, r8\n\t"
  144395. "adcs r9, r9, r9\n\t"
  144396. "adcs r10, r10, r10\n\t"
  144397. "adcs r11, r11, r11\n\t"
  144398. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144399. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144400. "adcs r4, r4, r4\n\t"
  144401. "adcs r5, r5, r5\n\t"
  144402. "adcs r6, r6, r6\n\t"
  144403. "adcs r7, r7, r7\n\t"
  144404. "adcs r8, r8, r8\n\t"
  144405. "adcs r9, r9, r9\n\t"
  144406. "adcs r10, r10, r10\n\t"
  144407. "adcs r11, r11, r11\n\t"
  144408. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144409. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144410. "adcs r4, r4, r4\n\t"
  144411. "adcs r5, r5, r5\n\t"
  144412. "adcs r6, r6, r6\n\t"
  144413. "adcs r7, r7, r7\n\t"
  144414. "adcs r8, r8, r8\n\t"
  144415. "adcs r9, r9, r9\n\t"
  144416. "adcs r10, r10, r10\n\t"
  144417. "adcs r11, r11, r11\n\t"
  144418. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144419. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144420. "adcs r4, r4, r4\n\t"
  144421. "adcs r5, r5, r5\n\t"
  144422. "adcs r6, r6, r6\n\t"
  144423. "adcs r7, r7, r7\n\t"
  144424. "adcs r8, r8, r8\n\t"
  144425. "adcs r9, r9, r9\n\t"
  144426. "adcs r10, r10, r10\n\t"
  144427. "adcs r11, r11, r11\n\t"
  144428. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  144429. "ldr r4, [%[m], #124]\n\t"
  144430. "adc r12, r12, #0\n\t"
  144431. "subs r4, r4, r11\n\t"
  144432. "neg r12, r12\n\t"
  144433. "sbc r4, r4, r4\n\t"
  144434. "sub %[r], %[r], #0x80\n\t"
  144435. "orr r12, r12, r4\n\t"
  144436. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144437. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144438. "and r8, r8, r12\n\t"
  144439. "and r9, r9, r12\n\t"
  144440. "and r10, r10, r12\n\t"
  144441. "and r11, r11, r12\n\t"
  144442. "subs r4, r4, r8\n\t"
  144443. "sbcs r5, r5, r9\n\t"
  144444. "sbcs r6, r6, r10\n\t"
  144445. "sbcs r7, r7, r11\n\t"
  144446. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144447. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144448. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144449. "and r8, r8, r12\n\t"
  144450. "and r9, r9, r12\n\t"
  144451. "and r10, r10, r12\n\t"
  144452. "and r11, r11, r12\n\t"
  144453. "sbcs r4, r4, r8\n\t"
  144454. "sbcs r5, r5, r9\n\t"
  144455. "sbcs r6, r6, r10\n\t"
  144456. "sbcs r7, r7, r11\n\t"
  144457. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144458. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144459. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144460. "and r8, r8, r12\n\t"
  144461. "and r9, r9, r12\n\t"
  144462. "and r10, r10, r12\n\t"
  144463. "and r11, r11, r12\n\t"
  144464. "sbcs r4, r4, r8\n\t"
  144465. "sbcs r5, r5, r9\n\t"
  144466. "sbcs r6, r6, r10\n\t"
  144467. "sbcs r7, r7, r11\n\t"
  144468. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144469. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144470. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144471. "and r8, r8, r12\n\t"
  144472. "and r9, r9, r12\n\t"
  144473. "and r10, r10, r12\n\t"
  144474. "and r11, r11, r12\n\t"
  144475. "sbcs r4, r4, r8\n\t"
  144476. "sbcs r5, r5, r9\n\t"
  144477. "sbcs r6, r6, r10\n\t"
  144478. "sbcs r7, r7, r11\n\t"
  144479. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144480. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144481. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144482. "and r8, r8, r12\n\t"
  144483. "and r9, r9, r12\n\t"
  144484. "and r10, r10, r12\n\t"
  144485. "and r11, r11, r12\n\t"
  144486. "sbcs r4, r4, r8\n\t"
  144487. "sbcs r5, r5, r9\n\t"
  144488. "sbcs r6, r6, r10\n\t"
  144489. "sbcs r7, r7, r11\n\t"
  144490. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144491. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144492. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144493. "and r8, r8, r12\n\t"
  144494. "and r9, r9, r12\n\t"
  144495. "and r10, r10, r12\n\t"
  144496. "and r11, r11, r12\n\t"
  144497. "sbcs r4, r4, r8\n\t"
  144498. "sbcs r5, r5, r9\n\t"
  144499. "sbcs r6, r6, r10\n\t"
  144500. "sbcs r7, r7, r11\n\t"
  144501. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144502. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144503. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144504. "and r8, r8, r12\n\t"
  144505. "and r9, r9, r12\n\t"
  144506. "and r10, r10, r12\n\t"
  144507. "and r11, r11, r12\n\t"
  144508. "sbcs r4, r4, r8\n\t"
  144509. "sbcs r5, r5, r9\n\t"
  144510. "sbcs r6, r6, r10\n\t"
  144511. "sbcs r7, r7, r11\n\t"
  144512. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144513. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144514. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144515. "and r8, r8, r12\n\t"
  144516. "and r9, r9, r12\n\t"
  144517. "and r10, r10, r12\n\t"
  144518. "and r11, r11, r12\n\t"
  144519. "sbcs r4, r4, r8\n\t"
  144520. "sbcs r5, r5, r9\n\t"
  144521. "sbcs r6, r6, r10\n\t"
  144522. "sbc r7, r7, r11\n\t"
  144523. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144524. "sub %[r], %[r], #0x80\n\t"
  144525. "sub %[m], %[m], #0x80\n\t"
  144526. "sub %[a], %[a], #0x80\n\t"
  144527. "mov r12, #0\n\t"
  144528. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144529. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144530. "adds r8, r8, r4\n\t"
  144531. "adcs r9, r9, r5\n\t"
  144532. "adcs r10, r10, r6\n\t"
  144533. "adcs r11, r11, r7\n\t"
  144534. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144535. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144536. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144537. "adcs r8, r8, r4\n\t"
  144538. "adcs r9, r9, r5\n\t"
  144539. "adcs r10, r10, r6\n\t"
  144540. "adcs r11, r11, r7\n\t"
  144541. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144542. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144543. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144544. "adcs r8, r8, r4\n\t"
  144545. "adcs r9, r9, r5\n\t"
  144546. "adcs r10, r10, r6\n\t"
  144547. "adcs r11, r11, r7\n\t"
  144548. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144549. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144550. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144551. "adcs r8, r8, r4\n\t"
  144552. "adcs r9, r9, r5\n\t"
  144553. "adcs r10, r10, r6\n\t"
  144554. "adcs r11, r11, r7\n\t"
  144555. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144556. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144557. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144558. "adcs r8, r8, r4\n\t"
  144559. "adcs r9, r9, r5\n\t"
  144560. "adcs r10, r10, r6\n\t"
  144561. "adcs r11, r11, r7\n\t"
  144562. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144563. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144564. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144565. "adcs r8, r8, r4\n\t"
  144566. "adcs r9, r9, r5\n\t"
  144567. "adcs r10, r10, r6\n\t"
  144568. "adcs r11, r11, r7\n\t"
  144569. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144570. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144571. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144572. "adcs r8, r8, r4\n\t"
  144573. "adcs r9, r9, r5\n\t"
  144574. "adcs r10, r10, r6\n\t"
  144575. "adcs r11, r11, r7\n\t"
  144576. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144577. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144578. "ldm %[r], {r8, r9, r10, r11}\n\t"
  144579. "adcs r8, r8, r4\n\t"
  144580. "adcs r9, r9, r5\n\t"
  144581. "adcs r10, r10, r6\n\t"
  144582. "adcs r11, r11, r7\n\t"
  144583. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  144584. "ldr r7, [%[m], #124]\n\t"
  144585. "adc r12, r12, #0\n\t"
  144586. "subs r7, r7, r11\n\t"
  144587. "neg r12, r12\n\t"
  144588. "sbc r7, r7, r7\n\t"
  144589. "sub %[r], %[r], #0x80\n\t"
  144590. "orr r12, r12, r7\n\t"
  144591. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144592. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144593. "and r8, r8, r12\n\t"
  144594. "and r9, r9, r12\n\t"
  144595. "and r10, r10, r12\n\t"
  144596. "and r11, r11, r12\n\t"
  144597. "subs r4, r4, r8\n\t"
  144598. "sbcs r5, r5, r9\n\t"
  144599. "sbcs r6, r6, r10\n\t"
  144600. "sbcs r7, r7, r11\n\t"
  144601. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144602. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144603. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144604. "and r8, r8, r12\n\t"
  144605. "and r9, r9, r12\n\t"
  144606. "and r10, r10, r12\n\t"
  144607. "and r11, r11, r12\n\t"
  144608. "sbcs r4, r4, r8\n\t"
  144609. "sbcs r5, r5, r9\n\t"
  144610. "sbcs r6, r6, r10\n\t"
  144611. "sbcs r7, r7, r11\n\t"
  144612. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144613. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144614. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144615. "and r8, r8, r12\n\t"
  144616. "and r9, r9, r12\n\t"
  144617. "and r10, r10, r12\n\t"
  144618. "and r11, r11, r12\n\t"
  144619. "sbcs r4, r4, r8\n\t"
  144620. "sbcs r5, r5, r9\n\t"
  144621. "sbcs r6, r6, r10\n\t"
  144622. "sbcs r7, r7, r11\n\t"
  144623. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144624. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144625. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144626. "and r8, r8, r12\n\t"
  144627. "and r9, r9, r12\n\t"
  144628. "and r10, r10, r12\n\t"
  144629. "and r11, r11, r12\n\t"
  144630. "sbcs r4, r4, r8\n\t"
  144631. "sbcs r5, r5, r9\n\t"
  144632. "sbcs r6, r6, r10\n\t"
  144633. "sbcs r7, r7, r11\n\t"
  144634. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144635. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144636. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144637. "and r8, r8, r12\n\t"
  144638. "and r9, r9, r12\n\t"
  144639. "and r10, r10, r12\n\t"
  144640. "and r11, r11, r12\n\t"
  144641. "sbcs r4, r4, r8\n\t"
  144642. "sbcs r5, r5, r9\n\t"
  144643. "sbcs r6, r6, r10\n\t"
  144644. "sbcs r7, r7, r11\n\t"
  144645. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144646. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144647. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144648. "and r8, r8, r12\n\t"
  144649. "and r9, r9, r12\n\t"
  144650. "and r10, r10, r12\n\t"
  144651. "and r11, r11, r12\n\t"
  144652. "sbcs r4, r4, r8\n\t"
  144653. "sbcs r5, r5, r9\n\t"
  144654. "sbcs r6, r6, r10\n\t"
  144655. "sbcs r7, r7, r11\n\t"
  144656. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144657. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144658. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144659. "and r8, r8, r12\n\t"
  144660. "and r9, r9, r12\n\t"
  144661. "and r10, r10, r12\n\t"
  144662. "and r11, r11, r12\n\t"
  144663. "sbcs r4, r4, r8\n\t"
  144664. "sbcs r5, r5, r9\n\t"
  144665. "sbcs r6, r6, r10\n\t"
  144666. "sbcs r7, r7, r11\n\t"
  144667. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144668. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144669. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144670. "and r8, r8, r12\n\t"
  144671. "and r9, r9, r12\n\t"
  144672. "and r10, r10, r12\n\t"
  144673. "and r11, r11, r12\n\t"
  144674. "sbcs r4, r4, r8\n\t"
  144675. "sbcs r5, r5, r9\n\t"
  144676. "sbcs r6, r6, r10\n\t"
  144677. "sbc r7, r7, r11\n\t"
  144678. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144679. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  144680. :
  144681. : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12", "cc"
  144682. );
  144683. }
  144684. /* Subtract two Montgomery form numbers (r = a - b % m).
  144685. *
  144686. * r Result of subtration.
  144687. * a Number to subtract from in Montgomery form.
  144688. * b Number to subtract with in Montgomery form.
  144689. * m Modulus (prime).
  144690. */
  144691. 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)
  144692. {
  144693. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144694. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144695. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  144696. register const sp_digit* m asm ("r3") = (const sp_digit*)m_p;
  144697. __asm__ __volatile__ (
  144698. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144699. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144700. "subs r4, r4, r8\n\t"
  144701. "sbcs r5, r5, r9\n\t"
  144702. "sbcs r6, r6, r10\n\t"
  144703. "sbcs r7, r7, r11\n\t"
  144704. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144705. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144706. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144707. "sbcs r4, r4, r8\n\t"
  144708. "sbcs r5, r5, r9\n\t"
  144709. "sbcs r6, r6, r10\n\t"
  144710. "sbcs r7, r7, r11\n\t"
  144711. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144712. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144713. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144714. "sbcs r4, r4, r8\n\t"
  144715. "sbcs r5, r5, r9\n\t"
  144716. "sbcs r6, r6, r10\n\t"
  144717. "sbcs r7, r7, r11\n\t"
  144718. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144719. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144720. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144721. "sbcs r4, r4, r8\n\t"
  144722. "sbcs r5, r5, r9\n\t"
  144723. "sbcs r6, r6, r10\n\t"
  144724. "sbcs r7, r7, r11\n\t"
  144725. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144726. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144727. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144728. "sbcs r4, r4, r8\n\t"
  144729. "sbcs r5, r5, r9\n\t"
  144730. "sbcs r6, r6, r10\n\t"
  144731. "sbcs r7, r7, r11\n\t"
  144732. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144733. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144734. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144735. "sbcs r4, r4, r8\n\t"
  144736. "sbcs r5, r5, r9\n\t"
  144737. "sbcs r6, r6, r10\n\t"
  144738. "sbcs r7, r7, r11\n\t"
  144739. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144740. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144741. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144742. "sbcs r4, r4, r8\n\t"
  144743. "sbcs r5, r5, r9\n\t"
  144744. "sbcs r6, r6, r10\n\t"
  144745. "sbcs r7, r7, r11\n\t"
  144746. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144747. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  144748. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  144749. "sbcs r4, r4, r8\n\t"
  144750. "sbcs r5, r5, r9\n\t"
  144751. "sbcs r6, r6, r10\n\t"
  144752. "sbcs r7, r7, r11\n\t"
  144753. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144754. "sbc r12, r12, r12\n\t"
  144755. "sub %[r], %[r], #0x80\n\t"
  144756. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144757. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144758. "and r8, r8, r12\n\t"
  144759. "and r9, r9, r12\n\t"
  144760. "and r10, r10, r12\n\t"
  144761. "and r11, r11, r12\n\t"
  144762. "adds r4, r4, r8\n\t"
  144763. "adcs r5, r5, r9\n\t"
  144764. "adcs r6, r6, r10\n\t"
  144765. "adcs r7, r7, r11\n\t"
  144766. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144767. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144768. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144769. "and r8, r8, r12\n\t"
  144770. "and r9, r9, r12\n\t"
  144771. "and r10, r10, r12\n\t"
  144772. "and r11, r11, r12\n\t"
  144773. "adcs r4, r4, r8\n\t"
  144774. "adcs r5, r5, r9\n\t"
  144775. "adcs r6, r6, r10\n\t"
  144776. "adcs r7, r7, r11\n\t"
  144777. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144778. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144779. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144780. "and r8, r8, r12\n\t"
  144781. "and r9, r9, r12\n\t"
  144782. "and r10, r10, r12\n\t"
  144783. "and r11, r11, r12\n\t"
  144784. "adcs r4, r4, r8\n\t"
  144785. "adcs r5, r5, r9\n\t"
  144786. "adcs r6, r6, r10\n\t"
  144787. "adcs r7, r7, r11\n\t"
  144788. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144789. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144790. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144791. "and r8, r8, r12\n\t"
  144792. "and r9, r9, r12\n\t"
  144793. "and r10, r10, r12\n\t"
  144794. "and r11, r11, r12\n\t"
  144795. "adcs r4, r4, r8\n\t"
  144796. "adcs r5, r5, r9\n\t"
  144797. "adcs r6, r6, r10\n\t"
  144798. "adcs r7, r7, r11\n\t"
  144799. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144800. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144801. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144802. "and r8, r8, r12\n\t"
  144803. "and r9, r9, r12\n\t"
  144804. "and r10, r10, r12\n\t"
  144805. "and r11, r11, r12\n\t"
  144806. "adcs r4, r4, r8\n\t"
  144807. "adcs r5, r5, r9\n\t"
  144808. "adcs r6, r6, r10\n\t"
  144809. "adcs r7, r7, r11\n\t"
  144810. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144811. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144812. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144813. "and r8, r8, r12\n\t"
  144814. "and r9, r9, r12\n\t"
  144815. "and r10, r10, r12\n\t"
  144816. "and r11, r11, r12\n\t"
  144817. "adcs r4, r4, r8\n\t"
  144818. "adcs r5, r5, r9\n\t"
  144819. "adcs r6, r6, r10\n\t"
  144820. "adcs r7, r7, r11\n\t"
  144821. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144822. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144823. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144824. "and r8, r8, r12\n\t"
  144825. "and r9, r9, r12\n\t"
  144826. "and r10, r10, r12\n\t"
  144827. "and r11, r11, r12\n\t"
  144828. "adcs r4, r4, r8\n\t"
  144829. "adcs r5, r5, r9\n\t"
  144830. "adcs r6, r6, r10\n\t"
  144831. "adcs r7, r7, r11\n\t"
  144832. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144833. "ldm %[r], {r4, r5, r6, r7}\n\t"
  144834. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  144835. "and r8, r8, r12\n\t"
  144836. "and r9, r9, r12\n\t"
  144837. "and r10, r10, r12\n\t"
  144838. "and r11, r11, r12\n\t"
  144839. "adcs r4, r4, r8\n\t"
  144840. "adcs r5, r5, r9\n\t"
  144841. "adcs r6, r6, r10\n\t"
  144842. "adc r7, r7, r11\n\t"
  144843. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  144844. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  144845. :
  144846. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc"
  144847. );
  144848. }
  144849. #ifdef WOLFSSL_SP_SMALL
  144850. /* Conditionally add a and b using the mask m.
  144851. * m is -1 to add and 0 when not.
  144852. *
  144853. * r A single precision number representing conditional add result.
  144854. * a A single precision number to add with.
  144855. * b A single precision number to add.
  144856. * m Mask value to apply.
  144857. */
  144858. 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)
  144859. {
  144860. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144861. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144862. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  144863. register sp_digit m asm ("r3") = (sp_digit)m_p;
  144864. __asm__ __volatile__ (
  144865. "mov lr, #0\n\t"
  144866. "mov r6, #0\n\t"
  144867. "mov r12, #0\n\t"
  144868. "\n"
  144869. "L_sp_1024_cond_add_32_words_%=: \n\t"
  144870. "adds lr, lr, #-1\n\t"
  144871. "ldr r4, [%[a], r12]\n\t"
  144872. "ldr r5, [%[b], r12]\n\t"
  144873. "and r5, r5, %[m]\n\t"
  144874. "adcs r4, r4, r5\n\t"
  144875. "adc lr, r6, r6\n\t"
  144876. "str r4, [%[r], r12]\n\t"
  144877. "add r12, r12, #4\n\t"
  144878. "cmp r12, #0x80\n\t"
  144879. "blt L_sp_1024_cond_add_32_words_%=\n\t"
  144880. "mov %[r], lr\n\t"
  144881. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  144882. :
  144883. : "memory", "r12", "lr", "r4", "r5", "r6", "cc"
  144884. );
  144885. return (uint32_t)(size_t)r;
  144886. }
  144887. #else
  144888. /* Conditionally add a and b using the mask m.
  144889. * m is -1 to add and 0 when not.
  144890. *
  144891. * r A single precision number representing conditional add result.
  144892. * a A single precision number to add with.
  144893. * b A single precision number to add.
  144894. * m Mask value to apply.
  144895. */
  144896. 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)
  144897. {
  144898. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  144899. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  144900. register const sp_digit* b asm ("r2") = (const sp_digit*)b_p;
  144901. register sp_digit m asm ("r3") = (sp_digit)m_p;
  144902. __asm__ __volatile__ (
  144903. "mov r8, #0\n\t"
  144904. "ldm %[a]!, {r4, r5}\n\t"
  144905. "ldm %[b]!, {r6, r7}\n\t"
  144906. "and r6, r6, %[m]\n\t"
  144907. "and r7, r7, %[m]\n\t"
  144908. "adds r4, r4, r6\n\t"
  144909. "adcs r5, r5, r7\n\t"
  144910. "stm %[r]!, {r4, r5}\n\t"
  144911. "ldm %[a]!, {r4, r5}\n\t"
  144912. "ldm %[b]!, {r6, r7}\n\t"
  144913. "and r6, r6, %[m]\n\t"
  144914. "and r7, r7, %[m]\n\t"
  144915. "adcs r4, r4, r6\n\t"
  144916. "adcs r5, r5, r7\n\t"
  144917. "stm %[r]!, {r4, r5}\n\t"
  144918. "ldm %[a]!, {r4, r5}\n\t"
  144919. "ldm %[b]!, {r6, r7}\n\t"
  144920. "and r6, r6, %[m]\n\t"
  144921. "and r7, r7, %[m]\n\t"
  144922. "adcs r4, r4, r6\n\t"
  144923. "adcs r5, r5, r7\n\t"
  144924. "stm %[r]!, {r4, r5}\n\t"
  144925. "ldm %[a]!, {r4, r5}\n\t"
  144926. "ldm %[b]!, {r6, r7}\n\t"
  144927. "and r6, r6, %[m]\n\t"
  144928. "and r7, r7, %[m]\n\t"
  144929. "adcs r4, r4, r6\n\t"
  144930. "adcs r5, r5, r7\n\t"
  144931. "stm %[r]!, {r4, r5}\n\t"
  144932. "ldm %[a]!, {r4, r5}\n\t"
  144933. "ldm %[b]!, {r6, r7}\n\t"
  144934. "and r6, r6, %[m]\n\t"
  144935. "and r7, r7, %[m]\n\t"
  144936. "adcs r4, r4, r6\n\t"
  144937. "adcs r5, r5, r7\n\t"
  144938. "stm %[r]!, {r4, r5}\n\t"
  144939. "ldm %[a]!, {r4, r5}\n\t"
  144940. "ldm %[b]!, {r6, r7}\n\t"
  144941. "and r6, r6, %[m]\n\t"
  144942. "and r7, r7, %[m]\n\t"
  144943. "adcs r4, r4, r6\n\t"
  144944. "adcs r5, r5, r7\n\t"
  144945. "stm %[r]!, {r4, r5}\n\t"
  144946. "ldm %[a]!, {r4, r5}\n\t"
  144947. "ldm %[b]!, {r6, r7}\n\t"
  144948. "and r6, r6, %[m]\n\t"
  144949. "and r7, r7, %[m]\n\t"
  144950. "adcs r4, r4, r6\n\t"
  144951. "adcs r5, r5, r7\n\t"
  144952. "stm %[r]!, {r4, r5}\n\t"
  144953. "ldm %[a]!, {r4, r5}\n\t"
  144954. "ldm %[b]!, {r6, r7}\n\t"
  144955. "and r6, r6, %[m]\n\t"
  144956. "and r7, r7, %[m]\n\t"
  144957. "adcs r4, r4, r6\n\t"
  144958. "adcs r5, r5, r7\n\t"
  144959. "stm %[r]!, {r4, r5}\n\t"
  144960. "ldm %[a]!, {r4, r5}\n\t"
  144961. "ldm %[b]!, {r6, r7}\n\t"
  144962. "and r6, r6, %[m]\n\t"
  144963. "and r7, r7, %[m]\n\t"
  144964. "adcs r4, r4, r6\n\t"
  144965. "adcs r5, r5, r7\n\t"
  144966. "stm %[r]!, {r4, r5}\n\t"
  144967. "ldm %[a]!, {r4, r5}\n\t"
  144968. "ldm %[b]!, {r6, r7}\n\t"
  144969. "and r6, r6, %[m]\n\t"
  144970. "and r7, r7, %[m]\n\t"
  144971. "adcs r4, r4, r6\n\t"
  144972. "adcs r5, r5, r7\n\t"
  144973. "stm %[r]!, {r4, r5}\n\t"
  144974. "ldm %[a]!, {r4, r5}\n\t"
  144975. "ldm %[b]!, {r6, r7}\n\t"
  144976. "and r6, r6, %[m]\n\t"
  144977. "and r7, r7, %[m]\n\t"
  144978. "adcs r4, r4, r6\n\t"
  144979. "adcs r5, r5, r7\n\t"
  144980. "stm %[r]!, {r4, r5}\n\t"
  144981. "ldm %[a]!, {r4, r5}\n\t"
  144982. "ldm %[b]!, {r6, r7}\n\t"
  144983. "and r6, r6, %[m]\n\t"
  144984. "and r7, r7, %[m]\n\t"
  144985. "adcs r4, r4, r6\n\t"
  144986. "adcs r5, r5, r7\n\t"
  144987. "stm %[r]!, {r4, r5}\n\t"
  144988. "ldm %[a]!, {r4, r5}\n\t"
  144989. "ldm %[b]!, {r6, r7}\n\t"
  144990. "and r6, r6, %[m]\n\t"
  144991. "and r7, r7, %[m]\n\t"
  144992. "adcs r4, r4, r6\n\t"
  144993. "adcs r5, r5, r7\n\t"
  144994. "stm %[r]!, {r4, r5}\n\t"
  144995. "ldm %[a]!, {r4, r5}\n\t"
  144996. "ldm %[b]!, {r6, r7}\n\t"
  144997. "and r6, r6, %[m]\n\t"
  144998. "and r7, r7, %[m]\n\t"
  144999. "adcs r4, r4, r6\n\t"
  145000. "adcs r5, r5, r7\n\t"
  145001. "stm %[r]!, {r4, r5}\n\t"
  145002. "ldm %[a]!, {r4, r5}\n\t"
  145003. "ldm %[b]!, {r6, r7}\n\t"
  145004. "and r6, r6, %[m]\n\t"
  145005. "and r7, r7, %[m]\n\t"
  145006. "adcs r4, r4, r6\n\t"
  145007. "adcs r5, r5, r7\n\t"
  145008. "stm %[r]!, {r4, r5}\n\t"
  145009. "ldm %[a]!, {r4, r5}\n\t"
  145010. "ldm %[b]!, {r6, r7}\n\t"
  145011. "and r6, r6, %[m]\n\t"
  145012. "and r7, r7, %[m]\n\t"
  145013. "adcs r4, r4, r6\n\t"
  145014. "adcs r5, r5, r7\n\t"
  145015. "stm %[r]!, {r4, r5}\n\t"
  145016. "adc %[r], r8, r8\n\t"
  145017. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  145018. :
  145019. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc"
  145020. );
  145021. return (uint32_t)(size_t)r;
  145022. }
  145023. #endif /* WOLFSSL_SP_SMALL */
  145024. static void sp_1024_rshift1_32(sp_digit* r_p, const sp_digit* a_p)
  145025. {
  145026. register sp_digit* r asm ("r0") = (sp_digit*)r_p;
  145027. register const sp_digit* a asm ("r1") = (const sp_digit*)a_p;
  145028. __asm__ __volatile__ (
  145029. "ldm %[a], {r2, r3}\n\t"
  145030. "lsr r2, r2, #1\n\t"
  145031. "orr r2, r2, r3, lsl #31\n\t"
  145032. "lsr r3, r3, #1\n\t"
  145033. "ldr r4, [%[a], #8]\n\t"
  145034. "str r2, [%[r]]\n\t"
  145035. "orr r3, r3, r4, lsl #31\n\t"
  145036. "lsr r4, r4, #1\n\t"
  145037. "ldr r2, [%[a], #12]\n\t"
  145038. "str r3, [%[r], #4]\n\t"
  145039. "orr r4, r4, r2, lsl #31\n\t"
  145040. "lsr r2, r2, #1\n\t"
  145041. "ldr r3, [%[a], #16]\n\t"
  145042. "str r4, [%[r], #8]\n\t"
  145043. "orr r2, r2, r3, lsl #31\n\t"
  145044. "lsr r3, r3, #1\n\t"
  145045. "ldr r4, [%[a], #20]\n\t"
  145046. "str r2, [%[r], #12]\n\t"
  145047. "orr r3, r3, r4, lsl #31\n\t"
  145048. "lsr r4, r4, #1\n\t"
  145049. "ldr r2, [%[a], #24]\n\t"
  145050. "str r3, [%[r], #16]\n\t"
  145051. "orr r4, r4, r2, lsl #31\n\t"
  145052. "lsr r2, r2, #1\n\t"
  145053. "ldr r3, [%[a], #28]\n\t"
  145054. "str r4, [%[r], #20]\n\t"
  145055. "orr r2, r2, r3, lsl #31\n\t"
  145056. "lsr r3, r3, #1\n\t"
  145057. "ldr r4, [%[a], #32]\n\t"
  145058. "str r2, [%[r], #24]\n\t"
  145059. "orr r3, r3, r4, lsl #31\n\t"
  145060. "lsr r4, r4, #1\n\t"
  145061. "ldr r2, [%[a], #36]\n\t"
  145062. "str r3, [%[r], #28]\n\t"
  145063. "orr r4, r4, r2, lsl #31\n\t"
  145064. "lsr r2, r2, #1\n\t"
  145065. "ldr r3, [%[a], #40]\n\t"
  145066. "str r4, [%[r], #32]\n\t"
  145067. "orr r2, r2, r3, lsl #31\n\t"
  145068. "lsr r3, r3, #1\n\t"
  145069. "ldr r4, [%[a], #44]\n\t"
  145070. "str r2, [%[r], #36]\n\t"
  145071. "orr r3, r3, r4, lsl #31\n\t"
  145072. "lsr r4, r4, #1\n\t"
  145073. "ldr r2, [%[a], #48]\n\t"
  145074. "str r3, [%[r], #40]\n\t"
  145075. "orr r4, r4, r2, lsl #31\n\t"
  145076. "lsr r2, r2, #1\n\t"
  145077. "ldr r3, [%[a], #52]\n\t"
  145078. "str r4, [%[r], #44]\n\t"
  145079. "orr r2, r2, r3, lsl #31\n\t"
  145080. "lsr r3, r3, #1\n\t"
  145081. "ldr r4, [%[a], #56]\n\t"
  145082. "str r2, [%[r], #48]\n\t"
  145083. "orr r3, r3, r4, lsl #31\n\t"
  145084. "lsr r4, r4, #1\n\t"
  145085. "ldr r2, [%[a], #60]\n\t"
  145086. "str r3, [%[r], #52]\n\t"
  145087. "orr r4, r4, r2, lsl #31\n\t"
  145088. "lsr r2, r2, #1\n\t"
  145089. "ldr r3, [%[a], #64]\n\t"
  145090. "str r4, [%[r], #56]\n\t"
  145091. "orr r2, r2, r3, lsl #31\n\t"
  145092. "lsr r3, r3, #1\n\t"
  145093. "ldr r4, [%[a], #68]\n\t"
  145094. "str r2, [%[r], #60]\n\t"
  145095. "orr r3, r3, r4, lsl #31\n\t"
  145096. "lsr r4, r4, #1\n\t"
  145097. "ldr r2, [%[a], #72]\n\t"
  145098. "str r3, [%[r], #64]\n\t"
  145099. "orr r4, r4, r2, lsl #31\n\t"
  145100. "lsr r2, r2, #1\n\t"
  145101. "ldr r3, [%[a], #76]\n\t"
  145102. "str r4, [%[r], #68]\n\t"
  145103. "orr r2, r2, r3, lsl #31\n\t"
  145104. "lsr r3, r3, #1\n\t"
  145105. "ldr r4, [%[a], #80]\n\t"
  145106. "str r2, [%[r], #72]\n\t"
  145107. "orr r3, r3, r4, lsl #31\n\t"
  145108. "lsr r4, r4, #1\n\t"
  145109. "ldr r2, [%[a], #84]\n\t"
  145110. "str r3, [%[r], #76]\n\t"
  145111. "orr r4, r4, r2, lsl #31\n\t"
  145112. "lsr r2, r2, #1\n\t"
  145113. "ldr r3, [%[a], #88]\n\t"
  145114. "str r4, [%[r], #80]\n\t"
  145115. "orr r2, r2, r3, lsl #31\n\t"
  145116. "lsr r3, r3, #1\n\t"
  145117. "ldr r4, [%[a], #92]\n\t"
  145118. "str r2, [%[r], #84]\n\t"
  145119. "orr r3, r3, r4, lsl #31\n\t"
  145120. "lsr r4, r4, #1\n\t"
  145121. "ldr r2, [%[a], #96]\n\t"
  145122. "str r3, [%[r], #88]\n\t"
  145123. "orr r4, r4, r2, lsl #31\n\t"
  145124. "lsr r2, r2, #1\n\t"
  145125. "ldr r3, [%[a], #100]\n\t"
  145126. "str r4, [%[r], #92]\n\t"
  145127. "orr r2, r2, r3, lsl #31\n\t"
  145128. "lsr r3, r3, #1\n\t"
  145129. "ldr r4, [%[a], #104]\n\t"
  145130. "str r2, [%[r], #96]\n\t"
  145131. "orr r3, r3, r4, lsl #31\n\t"
  145132. "lsr r4, r4, #1\n\t"
  145133. "ldr r2, [%[a], #108]\n\t"
  145134. "str r3, [%[r], #100]\n\t"
  145135. "orr r4, r4, r2, lsl #31\n\t"
  145136. "lsr r2, r2, #1\n\t"
  145137. "ldr r3, [%[a], #112]\n\t"
  145138. "str r4, [%[r], #104]\n\t"
  145139. "orr r2, r2, r3, lsl #31\n\t"
  145140. "lsr r3, r3, #1\n\t"
  145141. "ldr r4, [%[a], #116]\n\t"
  145142. "str r2, [%[r], #108]\n\t"
  145143. "orr r3, r3, r4, lsl #31\n\t"
  145144. "lsr r4, r4, #1\n\t"
  145145. "ldr r2, [%[a], #120]\n\t"
  145146. "str r3, [%[r], #112]\n\t"
  145147. "orr r4, r4, r2, lsl #31\n\t"
  145148. "lsr r2, r2, #1\n\t"
  145149. "ldr r3, [%[a], #124]\n\t"
  145150. "str r4, [%[r], #116]\n\t"
  145151. "orr r2, r2, r3, lsl #31\n\t"
  145152. "lsr r3, r3, #1\n\t"
  145153. "str r2, [%[r], #120]\n\t"
  145154. "str r3, [%[r], #124]\n\t"
  145155. : [r] "+r" (r), [a] "+r" (a)
  145156. :
  145157. : "memory", "r2", "r3", "r4", "cc"
  145158. );
  145159. }
  145160. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  145161. *
  145162. * r Result of division by 2.
  145163. * a Number to divide.
  145164. * m Modulus (prime).
  145165. */
  145166. static void sp_1024_mont_div2_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  145167. {
  145168. sp_digit o;
  145169. o = sp_1024_cond_add_32(r, a, m, 0 - (a[0] & 1));
  145170. sp_1024_rshift1_32(r, r);
  145171. r[31] |= o << 31;
  145172. }
  145173. /* Double the Montgomery form projective point p.
  145174. *
  145175. * r Result of doubling point.
  145176. * p Point to double.
  145177. * t Temporary ordinate data.
  145178. */
  145179. static void sp_1024_proj_point_dbl_32(sp_point_1024* r, const sp_point_1024* p,
  145180. sp_digit* t)
  145181. {
  145182. sp_digit* t1 = t;
  145183. sp_digit* t2 = t + 2*32;
  145184. sp_digit* x;
  145185. sp_digit* y;
  145186. sp_digit* z;
  145187. x = r->x;
  145188. y = r->y;
  145189. z = r->z;
  145190. /* Put infinity into result. */
  145191. if (r != p) {
  145192. r->infinity = p->infinity;
  145193. }
  145194. /* T1 = Z * Z */
  145195. sp_1024_mont_sqr_32(t1, p->z, p1024_mod, p1024_mp_mod);
  145196. /* Z = Y * Z */
  145197. sp_1024_mont_mul_32(z, p->y, p->z, p1024_mod, p1024_mp_mod);
  145198. /* Z = 2Z */
  145199. sp_1024_mont_dbl_32(z, z, p1024_mod);
  145200. /* T2 = X - T1 */
  145201. sp_1024_mont_sub_32(t2, p->x, t1, p1024_mod);
  145202. /* T1 = X + T1 */
  145203. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  145204. /* T2 = T1 * T2 */
  145205. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  145206. /* T1 = 3T2 */
  145207. sp_1024_mont_tpl_32(t1, t2, p1024_mod);
  145208. /* Y = 2Y */
  145209. sp_1024_mont_dbl_32(y, p->y, p1024_mod);
  145210. /* Y = Y * Y */
  145211. sp_1024_mont_sqr_32(y, y, p1024_mod, p1024_mp_mod);
  145212. /* T2 = Y * Y */
  145213. sp_1024_mont_sqr_32(t2, y, p1024_mod, p1024_mp_mod);
  145214. /* T2 = T2/2 */
  145215. sp_1024_mont_div2_32(t2, t2, p1024_mod);
  145216. /* Y = Y * X */
  145217. sp_1024_mont_mul_32(y, y, p->x, p1024_mod, p1024_mp_mod);
  145218. /* X = T1 * T1 */
  145219. sp_1024_mont_sqr_32(x, t1, p1024_mod, p1024_mp_mod);
  145220. /* X = X - Y */
  145221. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  145222. /* X = X - Y */
  145223. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  145224. /* Y = Y - X */
  145225. sp_1024_mont_sub_32(y, y, x, p1024_mod);
  145226. /* Y = Y * T1 */
  145227. sp_1024_mont_mul_32(y, y, t1, p1024_mod, p1024_mp_mod);
  145228. /* Y = Y - T2 */
  145229. sp_1024_mont_sub_32(y, y, t2, p1024_mod);
  145230. }
  145231. #ifdef WOLFSSL_SP_NONBLOCK
  145232. typedef struct sp_1024_proj_point_dbl_32_ctx {
  145233. int state;
  145234. sp_digit* t1;
  145235. sp_digit* t2;
  145236. sp_digit* x;
  145237. sp_digit* y;
  145238. sp_digit* z;
  145239. } sp_1024_proj_point_dbl_32_ctx;
  145240. /* Double the Montgomery form projective point p.
  145241. *
  145242. * r Result of doubling point.
  145243. * p Point to double.
  145244. * t Temporary ordinate data.
  145245. */
  145246. static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
  145247. const sp_point_1024* p, sp_digit* t)
  145248. {
  145249. int err = FP_WOULDBLOCK;
  145250. sp_1024_proj_point_dbl_32_ctx* ctx = (sp_1024_proj_point_dbl_32_ctx*)sp_ctx->data;
  145251. typedef char ctx_size_test[sizeof(sp_1024_proj_point_dbl_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  145252. (void)sizeof(ctx_size_test);
  145253. switch (ctx->state) {
  145254. case 0:
  145255. ctx->t1 = t;
  145256. ctx->t2 = t + 2*32;
  145257. ctx->x = r->x;
  145258. ctx->y = r->y;
  145259. ctx->z = r->z;
  145260. /* Put infinity into result. */
  145261. if (r != p) {
  145262. r->infinity = p->infinity;
  145263. }
  145264. ctx->state = 1;
  145265. break;
  145266. case 1:
  145267. /* T1 = Z * Z */
  145268. sp_1024_mont_sqr_32(ctx->t1, p->z, p1024_mod, p1024_mp_mod);
  145269. ctx->state = 2;
  145270. break;
  145271. case 2:
  145272. /* Z = Y * Z */
  145273. sp_1024_mont_mul_32(ctx->z, p->y, p->z, p1024_mod, p1024_mp_mod);
  145274. ctx->state = 3;
  145275. break;
  145276. case 3:
  145277. /* Z = 2Z */
  145278. sp_1024_mont_dbl_32(ctx->z, ctx->z, p1024_mod);
  145279. ctx->state = 4;
  145280. break;
  145281. case 4:
  145282. /* T2 = X - T1 */
  145283. sp_1024_mont_sub_32(ctx->t2, p->x, ctx->t1, p1024_mod);
  145284. ctx->state = 5;
  145285. break;
  145286. case 5:
  145287. /* T1 = X + T1 */
  145288. sp_1024_mont_add_32(ctx->t1, p->x, ctx->t1, p1024_mod);
  145289. ctx->state = 6;
  145290. break;
  145291. case 6:
  145292. /* T2 = T1 * T2 */
  145293. sp_1024_mont_mul_32(ctx->t2, ctx->t1, ctx->t2, p1024_mod, p1024_mp_mod);
  145294. ctx->state = 7;
  145295. break;
  145296. case 7:
  145297. /* T1 = 3T2 */
  145298. sp_1024_mont_tpl_32(ctx->t1, ctx->t2, p1024_mod);
  145299. ctx->state = 8;
  145300. break;
  145301. case 8:
  145302. /* Y = 2Y */
  145303. sp_1024_mont_dbl_32(ctx->y, p->y, p1024_mod);
  145304. ctx->state = 9;
  145305. break;
  145306. case 9:
  145307. /* Y = Y * Y */
  145308. sp_1024_mont_sqr_32(ctx->y, ctx->y, p1024_mod, p1024_mp_mod);
  145309. ctx->state = 10;
  145310. break;
  145311. case 10:
  145312. /* T2 = Y * Y */
  145313. sp_1024_mont_sqr_32(ctx->t2, ctx->y, p1024_mod, p1024_mp_mod);
  145314. ctx->state = 11;
  145315. break;
  145316. case 11:
  145317. /* T2 = T2/2 */
  145318. sp_1024_mont_div2_32(ctx->t2, ctx->t2, p1024_mod);
  145319. ctx->state = 12;
  145320. break;
  145321. case 12:
  145322. /* Y = Y * X */
  145323. sp_1024_mont_mul_32(ctx->y, ctx->y, p->x, p1024_mod, p1024_mp_mod);
  145324. ctx->state = 13;
  145325. break;
  145326. case 13:
  145327. /* X = T1 * T1 */
  145328. sp_1024_mont_sqr_32(ctx->x, ctx->t1, p1024_mod, p1024_mp_mod);
  145329. ctx->state = 14;
  145330. break;
  145331. case 14:
  145332. /* X = X - Y */
  145333. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  145334. ctx->state = 15;
  145335. break;
  145336. case 15:
  145337. /* X = X - Y */
  145338. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  145339. ctx->state = 16;
  145340. break;
  145341. case 16:
  145342. /* Y = Y - X */
  145343. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  145344. ctx->state = 17;
  145345. break;
  145346. case 17:
  145347. /* Y = Y * T1 */
  145348. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t1, p1024_mod, p1024_mp_mod);
  145349. ctx->state = 18;
  145350. break;
  145351. case 18:
  145352. /* Y = Y - T2 */
  145353. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t2, p1024_mod);
  145354. ctx->state = 19;
  145355. /* fall-through */
  145356. case 19:
  145357. err = MP_OKAY;
  145358. break;
  145359. }
  145360. if (err == MP_OKAY && ctx->state != 19) {
  145361. err = FP_WOULDBLOCK;
  145362. }
  145363. return err;
  145364. }
  145365. #endif /* WOLFSSL_SP_NONBLOCK */
  145366. /* Compare two numbers to determine if they are equal.
  145367. * Constant time implementation.
  145368. *
  145369. * a First number to compare.
  145370. * b Second number to compare.
  145371. * returns 1 when equal and 0 otherwise.
  145372. */
  145373. static int sp_1024_cmp_equal_32(const sp_digit* a, const sp_digit* b)
  145374. {
  145375. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  145376. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  145377. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  145378. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  145379. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  145380. (a[15] ^ b[15]) | (a[16] ^ b[16]) | (a[17] ^ b[17]) |
  145381. (a[18] ^ b[18]) | (a[19] ^ b[19]) | (a[20] ^ b[20]) |
  145382. (a[21] ^ b[21]) | (a[22] ^ b[22]) | (a[23] ^ b[23]) |
  145383. (a[24] ^ b[24]) | (a[25] ^ b[25]) | (a[26] ^ b[26]) |
  145384. (a[27] ^ b[27]) | (a[28] ^ b[28]) | (a[29] ^ b[29]) |
  145385. (a[30] ^ b[30]) | (a[31] ^ b[31])) == 0;
  145386. }
  145387. /* Returns 1 if the number of zero.
  145388. * Implementation is constant time.
  145389. *
  145390. * a Number to check.
  145391. * returns 1 if the number is zero and 0 otherwise.
  145392. */
  145393. static int sp_1024_iszero_32(const sp_digit* a)
  145394. {
  145395. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  145396. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  145397. a[16] | a[17] | a[18] | a[19] | a[20] | a[21] | a[22] | a[23] |
  145398. a[24] | a[25] | a[26] | a[27] | a[28] | a[29] | a[30] | a[31]) == 0;
  145399. }
  145400. /* Add two Montgomery form projective points.
  145401. *
  145402. * r Result of addition.
  145403. * p First point to add.
  145404. * q Second point to add.
  145405. * t Temporary ordinate data.
  145406. */
  145407. static void sp_1024_proj_point_add_32(sp_point_1024* r,
  145408. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  145409. {
  145410. sp_digit* t6 = t;
  145411. sp_digit* t1 = t + 2*32;
  145412. sp_digit* t2 = t + 4*32;
  145413. sp_digit* t3 = t + 6*32;
  145414. sp_digit* t4 = t + 8*32;
  145415. sp_digit* t5 = t + 10*32;
  145416. /* U1 = X1*Z2^2 */
  145417. sp_1024_mont_sqr_32(t1, q->z, p1024_mod, p1024_mp_mod);
  145418. sp_1024_mont_mul_32(t3, t1, q->z, p1024_mod, p1024_mp_mod);
  145419. sp_1024_mont_mul_32(t1, t1, p->x, p1024_mod, p1024_mp_mod);
  145420. /* U2 = X2*Z1^2 */
  145421. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  145422. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  145423. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  145424. /* S1 = Y1*Z2^3 */
  145425. sp_1024_mont_mul_32(t3, t3, p->y, p1024_mod, p1024_mp_mod);
  145426. /* S2 = Y2*Z1^3 */
  145427. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  145428. /* Check double */
  145429. if ((~p->infinity) & (~q->infinity) &
  145430. sp_1024_cmp_equal_32(t2, t1) &
  145431. sp_1024_cmp_equal_32(t4, t3)) {
  145432. sp_1024_proj_point_dbl_32(r, p, t);
  145433. }
  145434. else {
  145435. sp_digit* x = t6;
  145436. sp_digit* y = t1;
  145437. sp_digit* z = t2;
  145438. /* H = U2 - U1 */
  145439. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  145440. /* R = S2 - S1 */
  145441. sp_1024_mont_sub_32(t4, t4, t3, p1024_mod);
  145442. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  145443. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  145444. sp_1024_mont_mul_32(y, t1, t5, p1024_mod, p1024_mp_mod);
  145445. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  145446. /* Z3 = H*Z1*Z2 */
  145447. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  145448. sp_1024_mont_mul_32(z, z, q->z, p1024_mod, p1024_mp_mod);
  145449. sp_1024_mont_sqr_32(x, t4, p1024_mod, p1024_mp_mod);
  145450. sp_1024_mont_sub_32(x, x, t5, p1024_mod);
  145451. sp_1024_mont_mul_32(t5, t5, t3, p1024_mod, p1024_mp_mod);
  145452. sp_1024_mont_dbl_32(t3, y, p1024_mod);
  145453. sp_1024_mont_sub_32(x, x, t3, p1024_mod);
  145454. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  145455. sp_1024_mont_sub_32(y, y, x, p1024_mod);
  145456. sp_1024_mont_mul_32(y, y, t4, p1024_mod, p1024_mp_mod);
  145457. sp_1024_mont_sub_32(y, y, t5, p1024_mod);
  145458. {
  145459. int i;
  145460. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  145461. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  145462. sp_digit maskt = ~(maskp | maskq);
  145463. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  145464. for (i = 0; i < 32; i++) {
  145465. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  145466. (x[i] & maskt);
  145467. }
  145468. for (i = 0; i < 32; i++) {
  145469. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  145470. (y[i] & maskt);
  145471. }
  145472. for (i = 0; i < 32; i++) {
  145473. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  145474. (z[i] & maskt);
  145475. }
  145476. r->z[0] |= inf;
  145477. r->infinity = (int)inf;
  145478. }
  145479. }
  145480. }
  145481. #ifdef WOLFSSL_SP_NONBLOCK
  145482. typedef struct sp_1024_proj_point_add_32_ctx {
  145483. int state;
  145484. sp_1024_proj_point_dbl_32_ctx dbl_ctx;
  145485. const sp_point_1024* ap[2];
  145486. sp_point_1024* rp[2];
  145487. sp_digit* t1;
  145488. sp_digit* t2;
  145489. sp_digit* t3;
  145490. sp_digit* t4;
  145491. sp_digit* t5;
  145492. sp_digit* t6;
  145493. sp_digit* x;
  145494. sp_digit* y;
  145495. sp_digit* z;
  145496. } sp_1024_proj_point_add_32_ctx;
  145497. /* Add two Montgomery form projective points.
  145498. *
  145499. * r Result of addition.
  145500. * p First point to add.
  145501. * q Second point to add.
  145502. * t Temporary ordinate data.
  145503. */
  145504. static int sp_1024_proj_point_add_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
  145505. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  145506. {
  145507. int err = FP_WOULDBLOCK;
  145508. sp_1024_proj_point_add_32_ctx* ctx = (sp_1024_proj_point_add_32_ctx*)sp_ctx->data;
  145509. /* Ensure only the first point is the same as the result. */
  145510. if (q == r) {
  145511. const sp_point_1024* a = p;
  145512. p = q;
  145513. q = a;
  145514. }
  145515. typedef char ctx_size_test[sizeof(sp_1024_proj_point_add_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  145516. (void)sizeof(ctx_size_test);
  145517. switch (ctx->state) {
  145518. case 0: /* INIT */
  145519. ctx->t6 = t;
  145520. ctx->t1 = t + 2*32;
  145521. ctx->t2 = t + 4*32;
  145522. ctx->t3 = t + 6*32;
  145523. ctx->t4 = t + 8*32;
  145524. ctx->t5 = t + 10*32;
  145525. ctx->x = ctx->t6;
  145526. ctx->y = ctx->t1;
  145527. ctx->z = ctx->t2;
  145528. ctx->state = 1;
  145529. break;
  145530. case 1:
  145531. /* U1 = X1*Z2^2 */
  145532. sp_1024_mont_sqr_32(ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  145533. ctx->state = 2;
  145534. break;
  145535. case 2:
  145536. sp_1024_mont_mul_32(ctx->t3, ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  145537. ctx->state = 3;
  145538. break;
  145539. case 3:
  145540. sp_1024_mont_mul_32(ctx->t1, ctx->t1, p->x, p1024_mod, p1024_mp_mod);
  145541. ctx->state = 4;
  145542. break;
  145543. case 4:
  145544. /* U2 = X2*Z1^2 */
  145545. sp_1024_mont_sqr_32(ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  145546. ctx->state = 5;
  145547. break;
  145548. case 5:
  145549. sp_1024_mont_mul_32(ctx->t4, ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  145550. ctx->state = 6;
  145551. break;
  145552. case 6:
  145553. sp_1024_mont_mul_32(ctx->t2, ctx->t2, q->x, p1024_mod, p1024_mp_mod);
  145554. ctx->state = 7;
  145555. break;
  145556. case 7:
  145557. /* S1 = Y1*Z2^3 */
  145558. sp_1024_mont_mul_32(ctx->t3, ctx->t3, p->y, p1024_mod, p1024_mp_mod);
  145559. ctx->state = 8;
  145560. break;
  145561. case 8:
  145562. /* S2 = Y2*Z1^3 */
  145563. sp_1024_mont_mul_32(ctx->t4, ctx->t4, q->y, p1024_mod, p1024_mp_mod);
  145564. ctx->state = 9;
  145565. break;
  145566. case 9:
  145567. /* Check double */
  145568. if ((~p->infinity) & (~q->infinity) &
  145569. sp_1024_cmp_equal_32(ctx->t2, ctx->t1) &
  145570. sp_1024_cmp_equal_32(ctx->t4, ctx->t3)) {
  145571. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  145572. sp_1024_proj_point_dbl_32(r, p, t);
  145573. ctx->state = 25;
  145574. }
  145575. else {
  145576. ctx->state = 10;
  145577. }
  145578. break;
  145579. case 10:
  145580. /* H = U2 - U1 */
  145581. sp_1024_mont_sub_32(ctx->t2, ctx->t2, ctx->t1, p1024_mod);
  145582. ctx->state = 11;
  145583. break;
  145584. case 11:
  145585. /* R = S2 - S1 */
  145586. sp_1024_mont_sub_32(ctx->t4, ctx->t4, ctx->t3, p1024_mod);
  145587. ctx->state = 12;
  145588. break;
  145589. case 12:
  145590. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  145591. sp_1024_mont_sqr_32(ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  145592. ctx->state = 13;
  145593. break;
  145594. case 13:
  145595. sp_1024_mont_mul_32(ctx->y, ctx->t1, ctx->t5, p1024_mod, p1024_mp_mod);
  145596. ctx->state = 14;
  145597. break;
  145598. case 14:
  145599. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  145600. ctx->state = 15;
  145601. break;
  145602. case 15:
  145603. /* Z3 = H*Z1*Z2 */
  145604. sp_1024_mont_mul_32(ctx->z, p->z, ctx->t2, p1024_mod, p1024_mp_mod);
  145605. ctx->state = 16;
  145606. break;
  145607. case 16:
  145608. sp_1024_mont_mul_32(ctx->z, ctx->z, q->z, p1024_mod, p1024_mp_mod);
  145609. ctx->state = 17;
  145610. break;
  145611. case 17:
  145612. sp_1024_mont_sqr_32(ctx->x, ctx->t4, p1024_mod, p1024_mp_mod);
  145613. ctx->state = 18;
  145614. break;
  145615. case 18:
  145616. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t5, p1024_mod);
  145617. ctx->state = 19;
  145618. break;
  145619. case 19:
  145620. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t3, p1024_mod, p1024_mp_mod);
  145621. ctx->state = 20;
  145622. break;
  145623. case 20:
  145624. sp_1024_mont_dbl_32(ctx->t3, ctx->y, p1024_mod);
  145625. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t3, p1024_mod);
  145626. ctx->state = 21;
  145627. break;
  145628. case 21:
  145629. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  145630. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  145631. ctx->state = 22;
  145632. break;
  145633. case 22:
  145634. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t4, p1024_mod, p1024_mp_mod);
  145635. ctx->state = 23;
  145636. break;
  145637. case 23:
  145638. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t5, p1024_mod);
  145639. ctx->state = 24;
  145640. break;
  145641. case 24:
  145642. {
  145643. {
  145644. int i;
  145645. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  145646. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  145647. sp_digit maskt = ~(maskp | maskq);
  145648. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  145649. for (i = 0; i < 32; i++) {
  145650. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  145651. (ctx->x[i] & maskt);
  145652. }
  145653. for (i = 0; i < 32; i++) {
  145654. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  145655. (ctx->y[i] & maskt);
  145656. }
  145657. for (i = 0; i < 32; i++) {
  145658. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  145659. (ctx->z[i] & maskt);
  145660. }
  145661. r->z[0] |= inf;
  145662. r->infinity = (int)inf;
  145663. }
  145664. ctx->state = 25;
  145665. break;
  145666. }
  145667. case 25:
  145668. err = MP_OKAY;
  145669. break;
  145670. }
  145671. if (err == MP_OKAY && ctx->state != 25) {
  145672. err = FP_WOULDBLOCK;
  145673. }
  145674. return err;
  145675. }
  145676. #endif /* WOLFSSL_SP_NONBLOCK */
  145677. /* Multiply the point by the scalar and return the result.
  145678. * If map is true then convert result to affine coordinates.
  145679. *
  145680. * Fast implementation that generates a pre-computation table.
  145681. * 4 bits of window (no sliding!).
  145682. * Uses add and double for calculating table.
  145683. * 1024 doubles.
  145684. * 268 adds.
  145685. *
  145686. * r Resulting point.
  145687. * g Point to multiply.
  145688. * k Scalar to multiply by.
  145689. * map Indicates whether to convert result to affine.
  145690. * ct Constant time required.
  145691. * heap Heap to use for allocation.
  145692. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  145693. */
  145694. static int sp_1024_ecc_mulmod_fast_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  145695. int map, int ct, void* heap)
  145696. {
  145697. #ifdef WOLFSSL_SP_SMALL_STACK
  145698. sp_point_1024* t = NULL;
  145699. sp_digit* tmp = NULL;
  145700. #else
  145701. sp_point_1024 t[16 + 1];
  145702. sp_digit tmp[2 * 32 * 37];
  145703. #endif
  145704. sp_point_1024* rt = NULL;
  145705. sp_digit n;
  145706. int i;
  145707. int c;
  145708. int y;
  145709. int err = MP_OKAY;
  145710. /* Constant time used for cache attack resistance implementation. */
  145711. (void)ct;
  145712. (void)heap;
  145713. #ifdef WOLFSSL_SP_SMALL_STACK
  145714. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (16 + 1),
  145715. heap, DYNAMIC_TYPE_ECC);
  145716. if (t == NULL)
  145717. err = MEMORY_E;
  145718. if (err == MP_OKAY) {
  145719. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 37, heap,
  145720. DYNAMIC_TYPE_ECC);
  145721. if (tmp == NULL)
  145722. err = MEMORY_E;
  145723. }
  145724. #endif
  145725. if (err == MP_OKAY) {
  145726. rt = t + 16;
  145727. /* t[0] = {0, 0, 1} * norm */
  145728. XMEMSET(&t[0], 0, sizeof(t[0]));
  145729. t[0].infinity = 1;
  145730. /* t[1] = {g->x, g->y, g->z} * norm */
  145731. (void)sp_1024_mod_mul_norm_32(t[1].x, g->x, p1024_mod);
  145732. (void)sp_1024_mod_mul_norm_32(t[1].y, g->y, p1024_mod);
  145733. (void)sp_1024_mod_mul_norm_32(t[1].z, g->z, p1024_mod);
  145734. t[1].infinity = 0;
  145735. sp_1024_proj_point_dbl_32(&t[ 2], &t[ 1], tmp);
  145736. t[ 2].infinity = 0;
  145737. sp_1024_proj_point_add_32(&t[ 3], &t[ 2], &t[ 1], tmp);
  145738. t[ 3].infinity = 0;
  145739. sp_1024_proj_point_dbl_32(&t[ 4], &t[ 2], tmp);
  145740. t[ 4].infinity = 0;
  145741. sp_1024_proj_point_add_32(&t[ 5], &t[ 3], &t[ 2], tmp);
  145742. t[ 5].infinity = 0;
  145743. sp_1024_proj_point_dbl_32(&t[ 6], &t[ 3], tmp);
  145744. t[ 6].infinity = 0;
  145745. sp_1024_proj_point_add_32(&t[ 7], &t[ 4], &t[ 3], tmp);
  145746. t[ 7].infinity = 0;
  145747. sp_1024_proj_point_dbl_32(&t[ 8], &t[ 4], tmp);
  145748. t[ 8].infinity = 0;
  145749. sp_1024_proj_point_add_32(&t[ 9], &t[ 5], &t[ 4], tmp);
  145750. t[ 9].infinity = 0;
  145751. sp_1024_proj_point_dbl_32(&t[10], &t[ 5], tmp);
  145752. t[10].infinity = 0;
  145753. sp_1024_proj_point_add_32(&t[11], &t[ 6], &t[ 5], tmp);
  145754. t[11].infinity = 0;
  145755. sp_1024_proj_point_dbl_32(&t[12], &t[ 6], tmp);
  145756. t[12].infinity = 0;
  145757. sp_1024_proj_point_add_32(&t[13], &t[ 7], &t[ 6], tmp);
  145758. t[13].infinity = 0;
  145759. sp_1024_proj_point_dbl_32(&t[14], &t[ 7], tmp);
  145760. t[14].infinity = 0;
  145761. sp_1024_proj_point_add_32(&t[15], &t[ 8], &t[ 7], tmp);
  145762. t[15].infinity = 0;
  145763. i = 30;
  145764. n = k[i+1] << 0;
  145765. c = 28;
  145766. y = (int)(n >> 28);
  145767. XMEMCPY(rt, &t[y], sizeof(sp_point_1024));
  145768. n <<= 4;
  145769. for (; i>=0 || c>=4; ) {
  145770. if (c < 4) {
  145771. n |= k[i--];
  145772. c += 32;
  145773. }
  145774. y = (n >> 28) & 0xf;
  145775. n <<= 4;
  145776. c -= 4;
  145777. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  145778. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  145779. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  145780. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  145781. sp_1024_proj_point_add_32(rt, rt, &t[y], tmp);
  145782. }
  145783. if (map != 0) {
  145784. sp_1024_map_32(r, rt, tmp);
  145785. }
  145786. else {
  145787. XMEMCPY(r, rt, sizeof(sp_point_1024));
  145788. }
  145789. }
  145790. #ifdef WOLFSSL_SP_SMALL_STACK
  145791. if (tmp != NULL)
  145792. #endif
  145793. {
  145794. ForceZero(tmp, sizeof(sp_digit) * 2 * 32 * 37);
  145795. #ifdef WOLFSSL_SP_SMALL_STACK
  145796. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  145797. #endif
  145798. }
  145799. #ifdef WOLFSSL_SP_SMALL_STACK
  145800. if (t != NULL)
  145801. #endif
  145802. {
  145803. ForceZero(t, sizeof(sp_point_1024) * 17);
  145804. #ifdef WOLFSSL_SP_SMALL_STACK
  145805. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  145806. #endif
  145807. }
  145808. return err;
  145809. }
  145810. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  145811. /* Double the Montgomery form projective point p a number of times.
  145812. *
  145813. * r Result of repeated doubling of point.
  145814. * p Point to double.
  145815. * n Number of times to double
  145816. * t Temporary ordinate data.
  145817. */
  145818. static void sp_1024_proj_point_dbl_n_32(sp_point_1024* p, int i,
  145819. sp_digit* t)
  145820. {
  145821. sp_digit* w = t;
  145822. sp_digit* a = t + 2*32;
  145823. sp_digit* b = t + 4*32;
  145824. sp_digit* t1 = t + 6*32;
  145825. sp_digit* t2 = t + 8*32;
  145826. sp_digit* x;
  145827. sp_digit* y;
  145828. sp_digit* z;
  145829. volatile int n = i;
  145830. x = p->x;
  145831. y = p->y;
  145832. z = p->z;
  145833. /* Y = 2*Y */
  145834. sp_1024_mont_dbl_32(y, y, p1024_mod);
  145835. /* W = Z^4 */
  145836. sp_1024_mont_sqr_32(w, z, p1024_mod, p1024_mp_mod);
  145837. sp_1024_mont_sqr_32(w, w, p1024_mod, p1024_mp_mod);
  145838. #ifndef WOLFSSL_SP_SMALL
  145839. while (--n > 0)
  145840. #else
  145841. while (--n >= 0)
  145842. #endif
  145843. {
  145844. /* A = 3*(X^2 - W) */
  145845. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  145846. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  145847. sp_1024_mont_tpl_32(a, t1, p1024_mod);
  145848. /* B = X*Y^2 */
  145849. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  145850. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  145851. /* X = A^2 - 2B */
  145852. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  145853. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  145854. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  145855. /* B = 2.(B - X) */
  145856. sp_1024_mont_sub_32(t2, b, x, p1024_mod);
  145857. sp_1024_mont_dbl_32(b, t2, p1024_mod);
  145858. /* Z = Z*Y */
  145859. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  145860. /* t1 = Y^4 */
  145861. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  145862. #ifdef WOLFSSL_SP_SMALL
  145863. if (n != 0)
  145864. #endif
  145865. {
  145866. /* W = W*Y^4 */
  145867. sp_1024_mont_mul_32(w, w, t1, p1024_mod, p1024_mp_mod);
  145868. }
  145869. /* y = 2*A*(B - X) - Y^4 */
  145870. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  145871. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  145872. }
  145873. #ifndef WOLFSSL_SP_SMALL
  145874. /* A = 3*(X^2 - W) */
  145875. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  145876. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  145877. sp_1024_mont_tpl_32(a, t1, p1024_mod);
  145878. /* B = X*Y^2 */
  145879. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  145880. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  145881. /* X = A^2 - 2B */
  145882. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  145883. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  145884. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  145885. /* B = 2.(B - X) */
  145886. sp_1024_mont_sub_32(t2, b, x, p1024_mod);
  145887. sp_1024_mont_dbl_32(b, t2, p1024_mod);
  145888. /* Z = Z*Y */
  145889. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  145890. /* t1 = Y^4 */
  145891. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  145892. /* y = 2*A*(B - X) - Y^4 */
  145893. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  145894. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  145895. #endif /* WOLFSSL_SP_SMALL */
  145896. /* Y = Y/2 */
  145897. sp_1024_mont_div2_32(y, y, p1024_mod);
  145898. }
  145899. /* Convert the projective point to affine.
  145900. * Ordinates are in Montgomery form.
  145901. *
  145902. * a Point to convert.
  145903. * t Temporary data.
  145904. */
  145905. static void sp_1024_proj_to_affine_32(sp_point_1024* a, sp_digit* t)
  145906. {
  145907. sp_digit* t1 = t;
  145908. sp_digit* t2 = t + 2 * 32;
  145909. sp_digit* tmp = t + 4 * 32;
  145910. sp_1024_mont_inv_32(t1, a->z, tmp);
  145911. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  145912. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  145913. sp_1024_mont_mul_32(a->x, a->x, t2, p1024_mod, p1024_mp_mod);
  145914. sp_1024_mont_mul_32(a->y, a->y, t1, p1024_mod, p1024_mp_mod);
  145915. XMEMCPY(a->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  145916. }
  145917. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  145918. /* A table entry for pre-computed points. */
  145919. typedef struct sp_table_entry_1024 {
  145920. sp_digit x[32];
  145921. sp_digit y[32];
  145922. } sp_table_entry_1024;
  145923. #ifdef FP_ECC
  145924. #endif /* FP_ECC */
  145925. /* Add two Montgomery form projective points. The second point has a q value of
  145926. * one.
  145927. * Only the first point can be the same pointer as the result point.
  145928. *
  145929. * r Result of addition.
  145930. * p First point to add.
  145931. * q Second point to add.
  145932. * t Temporary ordinate data.
  145933. */
  145934. static void sp_1024_proj_point_add_qz1_32(sp_point_1024* r,
  145935. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  145936. {
  145937. sp_digit* t2 = t;
  145938. sp_digit* t3 = t + 2*32;
  145939. sp_digit* t6 = t + 4*32;
  145940. sp_digit* t1 = t + 6*32;
  145941. sp_digit* t4 = t + 8*32;
  145942. sp_digit* t5 = t + 10*32;
  145943. /* Calculate values to subtract from P->x and P->y. */
  145944. /* U2 = X2*Z1^2 */
  145945. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  145946. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  145947. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  145948. /* S2 = Y2*Z1^3 */
  145949. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  145950. if ((~p->infinity) & (~q->infinity) &
  145951. sp_1024_cmp_equal_32(p->x, t2) &
  145952. sp_1024_cmp_equal_32(p->y, t4)) {
  145953. sp_1024_proj_point_dbl_32(r, p, t);
  145954. }
  145955. else {
  145956. sp_digit* x = t2;
  145957. sp_digit* y = t3;
  145958. sp_digit* z = t6;
  145959. /* H = U2 - X1 */
  145960. sp_1024_mont_sub_32(t2, t2, p->x, p1024_mod);
  145961. /* R = S2 - Y1 */
  145962. sp_1024_mont_sub_32(t4, t4, p->y, p1024_mod);
  145963. /* Z3 = H*Z1 */
  145964. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  145965. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  145966. sp_1024_mont_sqr_32(t1, t2, p1024_mod, p1024_mp_mod);
  145967. sp_1024_mont_mul_32(t3, p->x, t1, p1024_mod, p1024_mp_mod);
  145968. sp_1024_mont_mul_32(t1, t1, t2, p1024_mod, p1024_mp_mod);
  145969. sp_1024_mont_sqr_32(t2, t4, p1024_mod, p1024_mp_mod);
  145970. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  145971. sp_1024_mont_dbl_32(t5, t3, p1024_mod);
  145972. sp_1024_mont_sub_32(x, t2, t5, p1024_mod);
  145973. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  145974. sp_1024_mont_sub_32(t3, t3, x, p1024_mod);
  145975. sp_1024_mont_mul_32(t3, t3, t4, p1024_mod, p1024_mp_mod);
  145976. sp_1024_mont_mul_32(t1, t1, p->y, p1024_mod, p1024_mp_mod);
  145977. sp_1024_mont_sub_32(y, t3, t1, p1024_mod);
  145978. {
  145979. int i;
  145980. sp_digit maskp = (sp_digit)(0 - (q->infinity & (!p->infinity)));
  145981. sp_digit maskq = (sp_digit)(0 - (p->infinity & (!q->infinity)));
  145982. sp_digit maskt = ~(maskp | maskq);
  145983. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  145984. for (i = 0; i < 32; i++) {
  145985. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  145986. (x[i] & maskt);
  145987. }
  145988. for (i = 0; i < 32; i++) {
  145989. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  145990. (y[i] & maskt);
  145991. }
  145992. for (i = 0; i < 32; i++) {
  145993. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  145994. (z[i] & maskt);
  145995. }
  145996. r->z[0] |= inf;
  145997. r->infinity = (int)inf;
  145998. }
  145999. }
  146000. }
  146001. #ifdef WOLFSSL_SP_SMALL
  146002. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  146003. /* Generate the pre-computed table of points for the base point.
  146004. *
  146005. * width = 4
  146006. * 16 entries
  146007. * 256 bits between
  146008. *
  146009. * a The base point.
  146010. * table Place to store generated point data.
  146011. * tmp Temporary data.
  146012. * heap Heap to use for allocation.
  146013. */
  146014. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  146015. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  146016. {
  146017. #ifdef WOLFSSL_SP_SMALL_STACK
  146018. sp_point_1024* t = NULL;
  146019. #else
  146020. sp_point_1024 t[3];
  146021. #endif
  146022. sp_point_1024* s1 = NULL;
  146023. sp_point_1024* s2 = NULL;
  146024. int i;
  146025. int j;
  146026. int err = MP_OKAY;
  146027. (void)heap;
  146028. #ifdef WOLFSSL_SP_SMALL_STACK
  146029. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  146030. DYNAMIC_TYPE_ECC);
  146031. if (t == NULL)
  146032. err = MEMORY_E;
  146033. #endif
  146034. if (err == MP_OKAY) {
  146035. s1 = t + 1;
  146036. s2 = t + 2;
  146037. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  146038. }
  146039. if (err == MP_OKAY) {
  146040. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  146041. }
  146042. if (err == MP_OKAY) {
  146043. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  146044. }
  146045. if (err == MP_OKAY) {
  146046. t->infinity = 0;
  146047. sp_1024_proj_to_affine_32(t, tmp);
  146048. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146049. s1->infinity = 0;
  146050. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146051. s2->infinity = 0;
  146052. /* table[0] = {0, 0, infinity} */
  146053. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  146054. /* table[1] = Affine version of 'a' in Montgomery form */
  146055. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  146056. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  146057. for (i=1; i<4; i++) {
  146058. sp_1024_proj_point_dbl_n_32(t, 256, tmp);
  146059. sp_1024_proj_to_affine_32(t, tmp);
  146060. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  146061. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  146062. }
  146063. for (i=1; i<4; i++) {
  146064. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  146065. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  146066. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  146067. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  146068. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  146069. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  146070. sp_1024_proj_to_affine_32(t, tmp);
  146071. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  146072. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  146073. }
  146074. }
  146075. }
  146076. #ifdef WOLFSSL_SP_SMALL_STACK
  146077. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  146078. #endif
  146079. return err;
  146080. }
  146081. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  146082. /* Multiply the point by the scalar and return the result.
  146083. * If map is true then convert result to affine coordinates.
  146084. *
  146085. * Stripe implementation.
  146086. * Pre-generated: 2^0, 2^256, ...
  146087. * Pre-generated: products of all combinations of above.
  146088. * 4 doubles and adds (with qz=1)
  146089. *
  146090. * r Resulting point.
  146091. * k Scalar to multiply by.
  146092. * table Pre-computed table.
  146093. * map Indicates whether to convert result to affine.
  146094. * ct Constant time required.
  146095. * heap Heap to use for allocation.
  146096. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146097. */
  146098. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  146099. const sp_table_entry_1024* table, const sp_digit* k, int map,
  146100. int ct, void* heap)
  146101. {
  146102. #ifdef WOLFSSL_SP_SMALL_STACK
  146103. sp_point_1024* rt = NULL;
  146104. sp_digit* t = NULL;
  146105. #else
  146106. sp_point_1024 rt[2];
  146107. sp_digit t[2 * 32 * 37];
  146108. #endif
  146109. sp_point_1024* p = NULL;
  146110. int i;
  146111. int j;
  146112. int y;
  146113. int x;
  146114. int err = MP_OKAY;
  146115. (void)g;
  146116. /* Constant time used for cache attack resistance implementation. */
  146117. (void)ct;
  146118. (void)heap;
  146119. #ifdef WOLFSSL_SP_SMALL_STACK
  146120. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  146121. DYNAMIC_TYPE_ECC);
  146122. if (rt == NULL)
  146123. err = MEMORY_E;
  146124. if (err == MP_OKAY) {
  146125. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 37, heap,
  146126. DYNAMIC_TYPE_ECC);
  146127. if (t == NULL)
  146128. err = MEMORY_E;
  146129. }
  146130. #endif
  146131. if (err == MP_OKAY) {
  146132. p = rt + 1;
  146133. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146134. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146135. y = 0;
  146136. x = 255;
  146137. for (j=0; j<4; j++) {
  146138. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  146139. x += 256;
  146140. }
  146141. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  146142. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  146143. rt->infinity = !y;
  146144. for (i=254; i>=0; i--) {
  146145. y = 0;
  146146. x = i;
  146147. for (j=0; j<4; j++) {
  146148. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  146149. x += 256;
  146150. }
  146151. sp_1024_proj_point_dbl_32(rt, rt, t);
  146152. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  146153. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  146154. p->infinity = !y;
  146155. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  146156. }
  146157. if (map != 0) {
  146158. sp_1024_map_32(r, rt, t);
  146159. }
  146160. else {
  146161. XMEMCPY(r, rt, sizeof(sp_point_1024));
  146162. }
  146163. }
  146164. #ifdef WOLFSSL_SP_SMALL_STACK
  146165. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  146166. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  146167. #endif
  146168. return err;
  146169. }
  146170. #ifdef FP_ECC
  146171. #ifndef FP_ENTRIES
  146172. #define FP_ENTRIES 16
  146173. #endif
  146174. /* Cache entry - holds precomputation tables for a point. */
  146175. typedef struct sp_cache_1024_t {
  146176. /* X ordinate of point that table was generated from. */
  146177. sp_digit x[32];
  146178. /* Y ordinate of point that table was generated from. */
  146179. sp_digit y[32];
  146180. /* Precomputation table for point. */
  146181. sp_table_entry_1024 table[16];
  146182. /* Count of entries in table. */
  146183. uint32_t cnt;
  146184. /* Point and table set in entry. */
  146185. int set;
  146186. } sp_cache_1024_t;
  146187. /* Cache of tables. */
  146188. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  146189. /* Index of last entry in cache. */
  146190. static THREAD_LS_T int sp_cache_1024_last = -1;
  146191. /* Cache has been initialized. */
  146192. static THREAD_LS_T int sp_cache_1024_inited = 0;
  146193. #ifndef HAVE_THREAD_LS
  146194. #ifndef WOLFSSL_MUTEX_INITIALIZER
  146195. static volatile int initCacheMutex_1024 = 0;
  146196. #endif
  146197. static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock);
  146198. #endif
  146199. /* Get the cache entry for the point.
  146200. *
  146201. * g [in] Point scalar multiplying.
  146202. * cache [out] Cache table to use.
  146203. */
  146204. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  146205. {
  146206. int i;
  146207. int j;
  146208. uint32_t least;
  146209. if (sp_cache_1024_inited == 0) {
  146210. for (i=0; i<FP_ENTRIES; i++) {
  146211. sp_cache_1024[i].set = 0;
  146212. }
  146213. sp_cache_1024_inited = 1;
  146214. }
  146215. /* Compare point with those in cache. */
  146216. for (i=0; i<FP_ENTRIES; i++) {
  146217. if (!sp_cache_1024[i].set)
  146218. continue;
  146219. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  146220. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  146221. sp_cache_1024[i].cnt++;
  146222. break;
  146223. }
  146224. }
  146225. /* No match. */
  146226. if (i == FP_ENTRIES) {
  146227. /* Find empty entry. */
  146228. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  146229. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  146230. if (!sp_cache_1024[i].set) {
  146231. break;
  146232. }
  146233. }
  146234. /* Evict least used. */
  146235. if (i == sp_cache_1024_last) {
  146236. least = sp_cache_1024[0].cnt;
  146237. for (j=1; j<FP_ENTRIES; j++) {
  146238. if (sp_cache_1024[j].cnt < least) {
  146239. i = j;
  146240. least = sp_cache_1024[i].cnt;
  146241. }
  146242. }
  146243. }
  146244. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  146245. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  146246. sp_cache_1024[i].set = 1;
  146247. sp_cache_1024[i].cnt = 1;
  146248. }
  146249. *cache = &sp_cache_1024[i];
  146250. sp_cache_1024_last = i;
  146251. }
  146252. #endif /* FP_ECC */
  146253. /* Multiply the base point of P1024 by the scalar and return the result.
  146254. * If map is true then convert result to affine coordinates.
  146255. *
  146256. * r Resulting point.
  146257. * g Point to multiply.
  146258. * k Scalar to multiply by.
  146259. * map Indicates whether to convert result to affine.
  146260. * ct Constant time required.
  146261. * heap Heap to use for allocation.
  146262. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146263. */
  146264. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g,
  146265. const sp_digit* k, int map, int ct, void* heap)
  146266. {
  146267. #ifndef FP_ECC
  146268. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  146269. #else
  146270. #ifdef WOLFSSL_SP_SMALL_STACK
  146271. sp_digit* tmp;
  146272. #else
  146273. sp_digit tmp[2 * 32 * 38];
  146274. #endif
  146275. sp_cache_1024_t* cache;
  146276. int err = MP_OKAY;
  146277. #ifdef WOLFSSL_SP_SMALL_STACK
  146278. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 38, heap, DYNAMIC_TYPE_ECC);
  146279. if (tmp == NULL) {
  146280. err = MEMORY_E;
  146281. }
  146282. #endif
  146283. #ifndef HAVE_THREAD_LS
  146284. if (err == MP_OKAY) {
  146285. #ifndef WOLFSSL_MUTEX_INITIALIZER
  146286. if (initCacheMutex_1024 == 0) {
  146287. wc_InitMutex(&sp_cache_1024_lock);
  146288. initCacheMutex_1024 = 1;
  146289. }
  146290. #endif
  146291. if (wc_LockMutex(&sp_cache_1024_lock) != 0) {
  146292. err = BAD_MUTEX_E;
  146293. }
  146294. }
  146295. #endif /* HAVE_THREAD_LS */
  146296. if (err == MP_OKAY) {
  146297. sp_ecc_get_cache_1024(g, &cache);
  146298. if (cache->cnt == 2)
  146299. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  146300. #ifndef HAVE_THREAD_LS
  146301. wc_UnLockMutex(&sp_cache_1024_lock);
  146302. #endif /* HAVE_THREAD_LS */
  146303. if (cache->cnt < 2) {
  146304. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  146305. }
  146306. else {
  146307. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  146308. map, ct, heap);
  146309. }
  146310. }
  146311. #ifdef WOLFSSL_SP_SMALL_STACK
  146312. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  146313. #endif
  146314. return err;
  146315. #endif
  146316. }
  146317. #else
  146318. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  146319. /* Generate the pre-computed table of points for the base point.
  146320. *
  146321. * width = 8
  146322. * 256 entries
  146323. * 128 bits between
  146324. *
  146325. * a The base point.
  146326. * table Place to store generated point data.
  146327. * tmp Temporary data.
  146328. * heap Heap to use for allocation.
  146329. */
  146330. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  146331. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  146332. {
  146333. #ifdef WOLFSSL_SP_SMALL_STACK
  146334. sp_point_1024* t = NULL;
  146335. #else
  146336. sp_point_1024 t[3];
  146337. #endif
  146338. sp_point_1024* s1 = NULL;
  146339. sp_point_1024* s2 = NULL;
  146340. int i;
  146341. int j;
  146342. int err = MP_OKAY;
  146343. (void)heap;
  146344. #ifdef WOLFSSL_SP_SMALL_STACK
  146345. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  146346. DYNAMIC_TYPE_ECC);
  146347. if (t == NULL)
  146348. err = MEMORY_E;
  146349. #endif
  146350. if (err == MP_OKAY) {
  146351. s1 = t + 1;
  146352. s2 = t + 2;
  146353. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  146354. }
  146355. if (err == MP_OKAY) {
  146356. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  146357. }
  146358. if (err == MP_OKAY) {
  146359. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  146360. }
  146361. if (err == MP_OKAY) {
  146362. t->infinity = 0;
  146363. sp_1024_proj_to_affine_32(t, tmp);
  146364. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146365. s1->infinity = 0;
  146366. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146367. s2->infinity = 0;
  146368. /* table[0] = {0, 0, infinity} */
  146369. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  146370. /* table[1] = Affine version of 'a' in Montgomery form */
  146371. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  146372. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  146373. for (i=1; i<8; i++) {
  146374. sp_1024_proj_point_dbl_n_32(t, 128, tmp);
  146375. sp_1024_proj_to_affine_32(t, tmp);
  146376. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  146377. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  146378. }
  146379. for (i=1; i<8; i++) {
  146380. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  146381. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  146382. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  146383. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  146384. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  146385. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  146386. sp_1024_proj_to_affine_32(t, tmp);
  146387. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  146388. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  146389. }
  146390. }
  146391. }
  146392. #ifdef WOLFSSL_SP_SMALL_STACK
  146393. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  146394. #endif
  146395. return err;
  146396. }
  146397. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  146398. /* Multiply the point by the scalar and return the result.
  146399. * If map is true then convert result to affine coordinates.
  146400. *
  146401. * Stripe implementation.
  146402. * Pre-generated: 2^0, 2^128, ...
  146403. * Pre-generated: products of all combinations of above.
  146404. * 8 doubles and adds (with qz=1)
  146405. *
  146406. * r Resulting point.
  146407. * k Scalar to multiply by.
  146408. * table Pre-computed table.
  146409. * map Indicates whether to convert result to affine.
  146410. * ct Constant time required.
  146411. * heap Heap to use for allocation.
  146412. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146413. */
  146414. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  146415. const sp_table_entry_1024* table, const sp_digit* k, int map,
  146416. int ct, void* heap)
  146417. {
  146418. #ifdef WOLFSSL_SP_SMALL_STACK
  146419. sp_point_1024* rt = NULL;
  146420. sp_digit* t = NULL;
  146421. #else
  146422. sp_point_1024 rt[2];
  146423. sp_digit t[2 * 32 * 37];
  146424. #endif
  146425. sp_point_1024* p = NULL;
  146426. int i;
  146427. int j;
  146428. int y;
  146429. int x;
  146430. int err = MP_OKAY;
  146431. (void)g;
  146432. /* Constant time used for cache attack resistance implementation. */
  146433. (void)ct;
  146434. (void)heap;
  146435. #ifdef WOLFSSL_SP_SMALL_STACK
  146436. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  146437. DYNAMIC_TYPE_ECC);
  146438. if (rt == NULL)
  146439. err = MEMORY_E;
  146440. if (err == MP_OKAY) {
  146441. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 37, heap,
  146442. DYNAMIC_TYPE_ECC);
  146443. if (t == NULL)
  146444. err = MEMORY_E;
  146445. }
  146446. #endif
  146447. if (err == MP_OKAY) {
  146448. p = rt + 1;
  146449. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146450. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  146451. y = 0;
  146452. x = 127;
  146453. for (j=0; j<8; j++) {
  146454. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  146455. x += 128;
  146456. }
  146457. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  146458. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  146459. rt->infinity = !y;
  146460. for (i=126; i>=0; i--) {
  146461. y = 0;
  146462. x = i;
  146463. for (j=0; j<8; j++) {
  146464. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  146465. x += 128;
  146466. }
  146467. sp_1024_proj_point_dbl_32(rt, rt, t);
  146468. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  146469. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  146470. p->infinity = !y;
  146471. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  146472. }
  146473. if (map != 0) {
  146474. sp_1024_map_32(r, rt, t);
  146475. }
  146476. else {
  146477. XMEMCPY(r, rt, sizeof(sp_point_1024));
  146478. }
  146479. }
  146480. #ifdef WOLFSSL_SP_SMALL_STACK
  146481. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  146482. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  146483. #endif
  146484. return err;
  146485. }
  146486. #ifdef FP_ECC
  146487. #ifndef FP_ENTRIES
  146488. #define FP_ENTRIES 16
  146489. #endif
  146490. /* Cache entry - holds precomputation tables for a point. */
  146491. typedef struct sp_cache_1024_t {
  146492. /* X ordinate of point that table was generated from. */
  146493. sp_digit x[32];
  146494. /* Y ordinate of point that table was generated from. */
  146495. sp_digit y[32];
  146496. /* Precomputation table for point. */
  146497. sp_table_entry_1024 table[256];
  146498. /* Count of entries in table. */
  146499. uint32_t cnt;
  146500. /* Point and table set in entry. */
  146501. int set;
  146502. } sp_cache_1024_t;
  146503. /* Cache of tables. */
  146504. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  146505. /* Index of last entry in cache. */
  146506. static THREAD_LS_T int sp_cache_1024_last = -1;
  146507. /* Cache has been initialized. */
  146508. static THREAD_LS_T int sp_cache_1024_inited = 0;
  146509. #ifndef HAVE_THREAD_LS
  146510. #ifndef WOLFSSL_MUTEX_INITIALIZER
  146511. static volatile int initCacheMutex_1024 = 0;
  146512. #endif
  146513. static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock);
  146514. #endif
  146515. /* Get the cache entry for the point.
  146516. *
  146517. * g [in] Point scalar multiplying.
  146518. * cache [out] Cache table to use.
  146519. */
  146520. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  146521. {
  146522. int i;
  146523. int j;
  146524. uint32_t least;
  146525. if (sp_cache_1024_inited == 0) {
  146526. for (i=0; i<FP_ENTRIES; i++) {
  146527. sp_cache_1024[i].set = 0;
  146528. }
  146529. sp_cache_1024_inited = 1;
  146530. }
  146531. /* Compare point with those in cache. */
  146532. for (i=0; i<FP_ENTRIES; i++) {
  146533. if (!sp_cache_1024[i].set)
  146534. continue;
  146535. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  146536. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  146537. sp_cache_1024[i].cnt++;
  146538. break;
  146539. }
  146540. }
  146541. /* No match. */
  146542. if (i == FP_ENTRIES) {
  146543. /* Find empty entry. */
  146544. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  146545. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  146546. if (!sp_cache_1024[i].set) {
  146547. break;
  146548. }
  146549. }
  146550. /* Evict least used. */
  146551. if (i == sp_cache_1024_last) {
  146552. least = sp_cache_1024[0].cnt;
  146553. for (j=1; j<FP_ENTRIES; j++) {
  146554. if (sp_cache_1024[j].cnt < least) {
  146555. i = j;
  146556. least = sp_cache_1024[i].cnt;
  146557. }
  146558. }
  146559. }
  146560. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  146561. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  146562. sp_cache_1024[i].set = 1;
  146563. sp_cache_1024[i].cnt = 1;
  146564. }
  146565. *cache = &sp_cache_1024[i];
  146566. sp_cache_1024_last = i;
  146567. }
  146568. #endif /* FP_ECC */
  146569. /* Multiply the base point of P1024 by the scalar and return the result.
  146570. * If map is true then convert result to affine coordinates.
  146571. *
  146572. * r Resulting point.
  146573. * g Point to multiply.
  146574. * k Scalar to multiply by.
  146575. * map Indicates whether to convert result to affine.
  146576. * ct Constant time required.
  146577. * heap Heap to use for allocation.
  146578. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146579. */
  146580. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g,
  146581. const sp_digit* k, int map, int ct, void* heap)
  146582. {
  146583. #ifndef FP_ECC
  146584. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  146585. #else
  146586. #ifdef WOLFSSL_SP_SMALL_STACK
  146587. sp_digit* tmp;
  146588. #else
  146589. sp_digit tmp[2 * 32 * 38];
  146590. #endif
  146591. sp_cache_1024_t* cache;
  146592. int err = MP_OKAY;
  146593. #ifdef WOLFSSL_SP_SMALL_STACK
  146594. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 38, heap, DYNAMIC_TYPE_ECC);
  146595. if (tmp == NULL) {
  146596. err = MEMORY_E;
  146597. }
  146598. #endif
  146599. #ifndef HAVE_THREAD_LS
  146600. if (err == MP_OKAY) {
  146601. #ifndef WOLFSSL_MUTEX_INITIALIZER
  146602. if (initCacheMutex_1024 == 0) {
  146603. wc_InitMutex(&sp_cache_1024_lock);
  146604. initCacheMutex_1024 = 1;
  146605. }
  146606. #endif
  146607. if (wc_LockMutex(&sp_cache_1024_lock) != 0) {
  146608. err = BAD_MUTEX_E;
  146609. }
  146610. }
  146611. #endif /* HAVE_THREAD_LS */
  146612. if (err == MP_OKAY) {
  146613. sp_ecc_get_cache_1024(g, &cache);
  146614. if (cache->cnt == 2)
  146615. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  146616. #ifndef HAVE_THREAD_LS
  146617. wc_UnLockMutex(&sp_cache_1024_lock);
  146618. #endif /* HAVE_THREAD_LS */
  146619. if (cache->cnt < 2) {
  146620. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  146621. }
  146622. else {
  146623. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  146624. map, ct, heap);
  146625. }
  146626. }
  146627. #ifdef WOLFSSL_SP_SMALL_STACK
  146628. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  146629. #endif
  146630. return err;
  146631. #endif
  146632. }
  146633. #endif /* WOLFSSL_SP_SMALL */
  146634. /* Multiply the point by the scalar and return the result.
  146635. * If map is true then convert result to affine coordinates.
  146636. *
  146637. * km Scalar to multiply by.
  146638. * p Point to multiply.
  146639. * r Resulting point.
  146640. * map Indicates whether to convert result to affine.
  146641. * heap Heap to use for allocation.
  146642. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146643. */
  146644. int sp_ecc_mulmod_1024(const mp_int* km, const ecc_point* gm, ecc_point* r,
  146645. int map, void* heap)
  146646. {
  146647. #ifdef WOLFSSL_SP_SMALL_STACK
  146648. sp_point_1024* point = NULL;
  146649. sp_digit* k = NULL;
  146650. #else
  146651. sp_point_1024 point[1];
  146652. sp_digit k[32];
  146653. #endif
  146654. int err = MP_OKAY;
  146655. #ifdef WOLFSSL_SP_SMALL_STACK
  146656. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  146657. DYNAMIC_TYPE_ECC);
  146658. if (point == NULL)
  146659. err = MEMORY_E;
  146660. if (err == MP_OKAY) {
  146661. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  146662. DYNAMIC_TYPE_ECC);
  146663. if (k == NULL)
  146664. err = MEMORY_E;
  146665. }
  146666. #endif
  146667. if (err == MP_OKAY) {
  146668. sp_1024_from_mp(k, 32, km);
  146669. sp_1024_point_from_ecc_point_32(point, gm);
  146670. err = sp_1024_ecc_mulmod_32(point, point, k, map, 1, heap);
  146671. }
  146672. if (err == MP_OKAY) {
  146673. err = sp_1024_point_to_ecc_point_32(point, r);
  146674. }
  146675. #ifdef WOLFSSL_SP_SMALL_STACK
  146676. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  146677. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  146678. #endif
  146679. return err;
  146680. }
  146681. #ifdef WOLFSSL_SP_SMALL
  146682. /* Striping precomputation table.
  146683. * 4 points combined into a table of 16 points.
  146684. * Distance of 256 between points.
  146685. */
  146686. static const sp_table_entry_1024 p1024_table[16] = {
  146687. /* 0 */
  146688. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146689. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146690. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  146691. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146692. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146693. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  146694. /* 1 */
  146695. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  146696. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  146697. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  146698. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  146699. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  146700. 0x1c49f80b,0x8dfff96a },
  146701. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  146702. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  146703. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  146704. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  146705. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  146706. 0xde3c01f3,0x2aa1207b } },
  146707. /* 2 */
  146708. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  146709. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  146710. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  146711. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  146712. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  146713. 0xdf9398a4,0x40247985 },
  146714. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  146715. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  146716. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  146717. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  146718. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  146719. 0xc8b79d80,0x1a6fd1e6 } },
  146720. /* 3 */
  146721. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  146722. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  146723. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  146724. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  146725. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  146726. 0x15614750,0x29b7d4dc },
  146727. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  146728. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  146729. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  146730. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  146731. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  146732. 0x5382497e,0x5d092802 } },
  146733. /* 4 */
  146734. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  146735. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  146736. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  146737. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  146738. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  146739. 0x0f1fa7d7,0x2ab3bd47 },
  146740. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  146741. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  146742. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  146743. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  146744. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  146745. 0x4c27d229,0x93a4b416 } },
  146746. /* 5 */
  146747. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  146748. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  146749. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  146750. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  146751. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  146752. 0x32ee7763,0x342ce0d7 },
  146753. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  146754. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  146755. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  146756. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  146757. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  146758. 0xe156fd20,0x455f4af3 } },
  146759. /* 6 */
  146760. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  146761. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  146762. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  146763. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  146764. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  146765. 0x5c37c334,0x65713c29 },
  146766. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  146767. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  146768. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  146769. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  146770. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  146771. 0x3bae3c38,0x6b0e996c } },
  146772. /* 7 */
  146773. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  146774. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  146775. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  146776. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  146777. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  146778. 0x678223f8,0x4022a205 },
  146779. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  146780. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  146781. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  146782. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  146783. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  146784. 0x24a6a956,0x312179cb } },
  146785. /* 8 */
  146786. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  146787. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  146788. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  146789. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  146790. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  146791. 0x04ecf056,0x325d2796 },
  146792. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  146793. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  146794. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  146795. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  146796. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  146797. 0xe32a79d3,0x19d48546 } },
  146798. /* 9 */
  146799. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  146800. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  146801. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  146802. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  146803. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  146804. 0xb4e453b0,0x1b3ace6c },
  146805. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  146806. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  146807. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  146808. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  146809. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  146810. 0x192f0a14,0x538ec33e } },
  146811. /* 10 */
  146812. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  146813. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  146814. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  146815. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  146816. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  146817. 0xb6f8aa25,0x13cbee76 },
  146818. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  146819. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  146820. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  146821. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  146822. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  146823. 0xe02e8967,0x4e0a1ada } },
  146824. /* 11 */
  146825. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  146826. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  146827. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  146828. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  146829. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  146830. 0x9f99c999,0x733e30d9 },
  146831. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  146832. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  146833. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  146834. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  146835. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  146836. 0xb79a5c0c,0x56facb39 } },
  146837. /* 12 */
  146838. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  146839. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  146840. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  146841. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  146842. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  146843. 0xf18c2b91,0x57ea2b4b },
  146844. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  146845. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  146846. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  146847. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  146848. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  146849. 0xea7935c9,0x60480b46 } },
  146850. /* 13 */
  146851. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  146852. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  146853. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  146854. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  146855. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  146856. 0x9a8f88cc,0x0774a0d3 },
  146857. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  146858. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  146859. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  146860. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  146861. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  146862. 0x2432014b,0x08151954 } },
  146863. /* 14 */
  146864. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  146865. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  146866. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  146867. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  146868. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  146869. 0xf0860497,0x1fe09f94 },
  146870. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  146871. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  146872. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  146873. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  146874. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  146875. 0xdb62526a,0x4de95786 } },
  146876. /* 15 */
  146877. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  146878. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  146879. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  146880. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  146881. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  146882. 0xe636980c,0x1c94418b },
  146883. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  146884. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  146885. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  146886. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  146887. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  146888. 0xb55235ba,0x611bfbb2 } },
  146889. };
  146890. /* Multiply the base point of P1024 by the scalar and return the result.
  146891. * If map is true then convert result to affine coordinates.
  146892. *
  146893. * Stripe implementation.
  146894. * Pre-generated: 2^0, 2^256, ...
  146895. * Pre-generated: products of all combinations of above.
  146896. * 4 doubles and adds (with qz=1)
  146897. *
  146898. * r Resulting point.
  146899. * k Scalar to multiply by.
  146900. * map Indicates whether to convert result to affine.
  146901. * ct Constant time required.
  146902. * heap Heap to use for allocation.
  146903. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  146904. */
  146905. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  146906. int map, int ct, void* heap)
  146907. {
  146908. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  146909. k, map, ct, heap);
  146910. }
  146911. #else
  146912. /* Striping precomputation table.
  146913. * 8 points combined into a table of 256 points.
  146914. * Distance of 128 between points.
  146915. */
  146916. static const sp_table_entry_1024 p1024_table[256] = {
  146917. /* 0 */
  146918. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146919. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146920. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  146921. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146922. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146923. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  146924. /* 1 */
  146925. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  146926. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  146927. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  146928. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  146929. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  146930. 0x1c49f80b,0x8dfff96a },
  146931. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  146932. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  146933. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  146934. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  146935. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  146936. 0xde3c01f3,0x2aa1207b } },
  146937. /* 2 */
  146938. { { 0x01900955,0xa95b6dae,0xceb4656d,0xa5dc9cc1,0xe72fe95b,0x50c78907,
  146939. 0xa040c334,0xa1ae5447,0x7952ea6e,0x91191370,0x6d097305,0x54ff7343,
  146940. 0xbda4d10f,0xa4db0074,0x91644070,0xfd5306f1,0x8b24522c,0x14b9fe73,
  146941. 0x7849f762,0x1468dad6,0xb0dcd2e4,0x87b29a18,0x5e1ad492,0xadd7f1a1,
  146942. 0xdbba2a1a,0x9ac63a81,0x81223379,0x01379c5b,0xb0e53bc8,0xf402b2f0,
  146943. 0x0bf13b61,0x8c3eb27f },
  146944. { 0xe513696f,0x9a4ad3e1,0x18c81ffa,0x0350ba5c,0x3c033d13,0x1e2fc136,
  146945. 0x17a531bc,0x53da6e71,0x1aed610d,0x42ec6490,0xe99ff567,0xd33e8df7,
  146946. 0x3deed12a,0xe4aad73e,0x180f4deb,0xd983b465,0x502f30b4,0x99365269,
  146947. 0xa8918d7f,0x7e2799ab,0x700fc79a,0x0ffe84b6,0x40bfd8c2,0x7b4400d6,
  146948. 0x5d2641bd,0xc3a21d21,0xc32621cb,0x79839442,0xb1401e83,0xace6500b,
  146949. 0x251c4310,0x7bf4163e } },
  146950. /* 3 */
  146951. { { 0xe3fd589e,0x1c174f88,0xdf974a03,0xdb501790,0x3e70549f,0xd09623e3,
  146952. 0x15924f34,0x8d091eff,0xf9b65ac5,0xeef79cad,0x3f69c2cf,0xd2cc4262,
  146953. 0x52cd82bc,0x817d9032,0xa5f1dddd,0xacf4f4d9,0x5011b6bd,0xd0612635,
  146954. 0x2ed140c9,0x9f74490d,0x4db686d2,0x64092e8c,0x776b0fcc,0x225eef16,
  146955. 0xdf16aeb6,0x0e8c01e9,0x84bbd82a,0x62836741,0x8956e337,0x757574e2,
  146956. 0x705a7f07,0x9871edc6 },
  146957. { 0x776535f7,0xbd0b76d5,0x2635b3b8,0x5214d602,0x9d216f64,0xc0c25ad9,
  146958. 0x5515bf75,0xfd4df3a7,0x5e9f1675,0x24a625bc,0x406873e7,0x3c35efb7,
  146959. 0xbb2e5c4a,0xef5c9a33,0x806b198a,0xa971b35e,0xa3c690ed,0x9f5c0ca5,
  146960. 0x8e1e2341,0xa8d5dd89,0x955ad9e4,0x4cecbcce,0x248d3416,0x2ecf4407,
  146961. 0x45c0af6e,0x1abb3811,0x1c780fff,0x3f4bee82,0xc272ed57,0xd14df768,
  146962. 0x371637ad,0x397ed10a } },
  146963. /* 4 */
  146964. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  146965. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  146966. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  146967. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  146968. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  146969. 0xdf9398a4,0x40247985 },
  146970. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  146971. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  146972. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  146973. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  146974. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  146975. 0xc8b79d80,0x1a6fd1e6 } },
  146976. /* 5 */
  146977. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  146978. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  146979. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  146980. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  146981. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  146982. 0x15614750,0x29b7d4dc },
  146983. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  146984. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  146985. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  146986. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  146987. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  146988. 0x5382497e,0x5d092802 } },
  146989. /* 6 */
  146990. { { 0xff2f780d,0x583a2b7e,0xd7d76b1d,0x34d26820,0x86f74aec,0xe3c32847,
  146991. 0x10823feb,0x0fd42212,0xfb5e7bf4,0x227e417e,0xa568f8cd,0x510d49b6,
  146992. 0x1781bbec,0x53bce7d6,0x2f3718b7,0x9cfe3f22,0xd9de6c1f,0x7f44e89f,
  146993. 0x3fac9b55,0xf1cc553f,0xe6f300bc,0x9d2d0846,0x9f0ae6b1,0x976c82a2,
  146994. 0x24b8bbe0,0xe63dbf5e,0x973a5aa7,0x4cac7f45,0x84dd33c7,0xc6eb6237,
  146995. 0x142fee5d,0x0a26e434 },
  146996. { 0xacaa9a08,0x8081339f,0x5246ece1,0x40f31105,0x61393747,0x892c8170,
  146997. 0x242f02e1,0x8d8d4103,0x3b5de98a,0x482bfd20,0x5abbe952,0x89ef946b,
  146998. 0x37698249,0xb8d218b9,0x66617c7a,0xd5268e89,0x8b7d2b91,0x962e7551,
  146999. 0xfe8d67c3,0x2c5c7973,0x2b017c51,0x42e3150a,0xc1a29469,0x6f4e5ebc,
  147000. 0x531c7083,0xa39910ce,0xb77b9e50,0xaf4f6eb4,0xda120ad0,0x68cbb175,
  147001. 0xb92636ec,0x19497c61 } },
  147002. /* 7 */
  147003. { { 0x417659a8,0x6920b0c6,0x92cb28ff,0xc77ab9c7,0xb687797f,0x55b67180,
  147004. 0xe7759363,0x4caf58c1,0x5561b186,0x5155bdb6,0x780f4946,0x2e64e355,
  147005. 0x229a8b20,0xeb0ac9b7,0x2571bd60,0x88594d78,0xe3fa78f9,0x5dcc0939,
  147006. 0x2ac2d379,0x7b8b4830,0xb90f1444,0x505fbf60,0x3ce4b3c1,0xac610e81,
  147007. 0xd59b5c18,0x39a4f27a,0x7cea0222,0x5fa33973,0x8dff1c7b,0xe578730b,
  147008. 0x517bf7a6,0x96b91b8b },
  147009. { 0x9aac087c,0xc1a991f4,0x6cfdb28d,0xce62f74e,0x5f7600d6,0x08d6ff9a,
  147010. 0xf917f9c9,0xd781cd04,0x3de52dbf,0x7796f5f6,0x2ed72180,0xe7db64e0,
  147011. 0x6fa4137d,0x0f0876f6,0x3ca1f716,0x3271ee64,0x7c4ab8a3,0xcb9b2058,
  147012. 0x39481047,0xcba17107,0x598c5c37,0xdf9a190d,0x6f20e125,0x0cb6e72a,
  147013. 0xf4f2902d,0xa3142204,0x7ce2dcfb,0x42d28cb9,0xa3d3c351,0xdf261b8a,
  147014. 0xcffc249d,0x73f3d315 } },
  147015. /* 8 */
  147016. { { 0xe6fd3673,0x5d86855b,0x9d214b7b,0x309b70af,0xdcc46cd3,0x8d332f90,
  147017. 0x595510de,0xe553c015,0x38c1251c,0x5746a096,0x85cc1bc9,0xcd7cea5b,
  147018. 0x002eba8f,0x4ffa1468,0x22fcd77c,0x10a3cb70,0xc4ea05e3,0xb6999dfb,
  147019. 0x4efa756e,0x3375a0d0,0xdced5fd8,0x4d90279e,0x251fd56e,0x48192403,
  147020. 0x82a4c5f1,0xe87633a4,0x1b34105b,0x3170d130,0x7247e578,0x93998b0f,
  147021. 0x436ba1fa,0x88934f64 },
  147022. { 0x4713eabc,0xf09f43b0,0xaccdc517,0x4ca7dd91,0xef13ca7c,0x27daa63b,
  147023. 0x2588184b,0x8b2e5a7a,0xd95dc269,0x0a8cb612,0xe1f2f14c,0x346975a2,
  147024. 0xe172935c,0x1f29b8ed,0xd40bc1e3,0xc3cbfd6e,0x132623da,0xd3f46b3f,
  147025. 0xfb0b7681,0xc115be6d,0x56da4344,0x5e31c345,0xa8e43d98,0xa7c63f18,
  147026. 0x4bddb4ea,0x55cb2083,0x4a54f58c,0xb16a0c38,0x46fd69d9,0x74eacca2,
  147027. 0x153548e1,0x0d1898bb } },
  147028. /* 9 */
  147029. { { 0xe35ef043,0x4ea73461,0x3496b564,0x107b67d9,0xd0f83a3c,0xd62c173b,
  147030. 0x51d29c35,0xfad4b038,0x71b1c1a4,0x3f42882a,0x54b43b9e,0x5d2bcf66,
  147031. 0x2abdf543,0xc77b15aa,0xdabe3dc1,0x5cb38a80,0xa481673b,0x15fda0ae,
  147032. 0xe7b90ebe,0x86996b4d,0x2bc8f3d8,0x84f87e25,0x37c4e424,0xaded03d6,
  147033. 0xd7a7afd8,0xe5ede666,0xa1ccb93a,0x80dd95a2,0x46fba391,0xa55cfd25,
  147034. 0x46f82e60,0x2bdab1dc },
  147035. { 0xfa6fed61,0x7a4de22b,0xcc8dd94e,0xca458aa5,0x071222f5,0x3e372df1,
  147036. 0xe5aff377,0x06a4b44f,0x4a738e6d,0xbc2d0ba7,0x5f31f136,0x1a470e1d,
  147037. 0xe102a911,0x77ff933a,0x310c7885,0x8b380a50,0x783fc5ac,0x9f3c0228,
  147038. 0x44725d06,0xec668925,0x5ac84221,0x878f0e16,0xcfda6e8a,0x9a3af1af,
  147039. 0x78cd2aba,0x0183ed37,0x826d0eae,0x32cdbd60,0xcbee6415,0xb3234661,
  147040. 0xb9c10120,0x353eb892 } },
  147041. /* 10 */
  147042. { { 0x10b5521e,0xc8fdcad6,0x52e702f0,0x1a11b440,0x8ffda49c,0x6302680d,
  147043. 0xcbf36bad,0xcdb9654a,0x4c10a2d7,0x7b58ce11,0xe630e7e0,0x1e5d1f7d,
  147044. 0x6760a813,0x8cbe3d7d,0x6480d77f,0xeb35866b,0x7f036219,0x58728cf3,
  147045. 0x42a8a757,0xdd5865ed,0x906a2870,0x283f1f1d,0xa51f906b,0x79e23fa4,
  147046. 0x543b20a8,0xf2ac6e83,0xb81e7754,0x4f0b6379,0x840016ee,0x57fbc0d4,
  147047. 0xe621b67d,0x8da20771 },
  147048. { 0xecce65ec,0x3c855004,0xb748185e,0x76d10d1f,0x78797ad2,0x64be7bca,
  147049. 0x77e54aad,0x43444db0,0xbe0df0ff,0x17b6b0c9,0x055086a4,0x8fc4256c,
  147050. 0xfd74d5a3,0xf952c43b,0x01c4edb8,0x501e005a,0x4a57e328,0xd5172dfc,
  147051. 0x535d6ee3,0xdb40ce4e,0x0c650918,0xbaef1e5c,0x857561fc,0xe85145e7,
  147052. 0x34a224c6,0xe468536a,0x0ec0e0a2,0x69a8e227,0x242b03fc,0xb3f52247,
  147053. 0xc3bebd5f,0x862f55e2 } },
  147054. /* 11 */
  147055. { { 0x226049fe,0x2d6a390f,0xdcbbc9fb,0xcc92a578,0x97634fb7,0xa52feca4,
  147056. 0x3dea5893,0x2b340cb6,0x2a49e916,0xa39f338a,0x949e41f3,0x26b2df3d,
  147057. 0x065a7e40,0xc71c7cdb,0x468281a2,0x4a9b84a0,0x731eeeca,0x63eeb503,
  147058. 0x76cbb725,0xe6d09134,0xb94a678c,0x0cf979a9,0x808fd9f1,0xb44d8c3b,
  147059. 0xe0afc5b9,0xe60da613,0x3ea5be69,0x52dce7de,0xdc1ee74f,0x3a5d6864,
  147060. 0x3bc80790,0x71ab2891 },
  147061. { 0x3b5b60ad,0xcf618fc4,0x4a0c3184,0x0afb5e30,0xbc403302,0xd22381cc,
  147062. 0xdb1c0c66,0x33cf8953,0xa6112a8d,0x9c994e4d,0xd1967a86,0xd7aae2c3,
  147063. 0x5b7acd29,0xc28d5493,0x6c9a57fb,0x8075bd13,0x9c8427f9,0xc9c0373e,
  147064. 0x193225f5,0x2cbca18d,0x442c018c,0x73777d13,0xfbb3a727,0xebe5ed47,
  147065. 0x1962dc18,0x70437d49,0x2dc08806,0xf39c1e09,0x15fff35c,0x03e9c6f7,
  147066. 0x5e360a65,0x8d087bb6 } },
  147067. /* 12 */
  147068. { { 0x3fdc1844,0xbe212302,0x105eac56,0x6eca27ef,0xf168a348,0x2183a606,
  147069. 0xe1d7a4cb,0x295f807d,0x7ef5d43e,0x7246a632,0xc77025c7,0xae143205,
  147070. 0xf3484e3e,0x4bdfc7ca,0xdf52c075,0xec939895,0xd7a9cac0,0x82e655f6,
  147071. 0x8baeddb0,0x985dfe20,0x527de731,0x79c817e4,0x313de1ea,0x30ce0fbc,
  147072. 0xcc4f6cbb,0x9df95b89,0xf5bb20cd,0xf2aedf1e,0x1a8cfb01,0xfc1e0a89,
  147073. 0x63edb7ec,0x225ed34a },
  147074. { 0xbabb1a85,0x3e13154d,0x1e6a565a,0xd3d8dae7,0xab4b100f,0xd3217d56,
  147075. 0xebc78e1a,0xd44d934e,0x48e73d37,0x0215321b,0x201e43cb,0xbbc90bfa,
  147076. 0x27500905,0x3c23f1d0,0xc86691a1,0x2a2e5000,0x6065841c,0x08b2bad2,
  147077. 0x30026b60,0x15d41caf,0x5276ce61,0x1712c2f4,0x15932ffb,0x01c4c3e7,
  147078. 0x6a74caf2,0x7894e13d,0x0c0537a4,0x02d6f5df,0xc2b1c97e,0xa8fb7602,
  147079. 0xd0887c7b,0x612b60e5 } },
  147080. /* 13 */
  147081. { { 0xba245d6b,0xefd495cf,0xa2ce3ff6,0x5cf0cbb7,0xdff5feee,0x24da2ac0,
  147082. 0xcf28c6a3,0x90c914f8,0x4308a56b,0x72fdb50d,0x13d72034,0x03dbf779,
  147083. 0x822ac9e9,0xcfa5ec91,0x3aea3e81,0x0dde73c8,0x66289139,0x545ba962,
  147084. 0xca6acbd3,0xa52f648b,0x98a0683a,0xff6f276e,0xa378ed52,0x2536d3ac,
  147085. 0x885ac1d9,0x353c2c54,0x00bc84a7,0xcaff52da,0x37684167,0x3971f81c,
  147086. 0xd2d7986e,0x0f7334e1 },
  147087. { 0x6596067e,0xafbb5c83,0x38c19806,0x33e54e19,0x39cb0dcc,0x8285d967,
  147088. 0x424035f9,0x2b53f43d,0xdfef9095,0x38c531f8,0xdb0f571a,0x90fbe8e4,
  147089. 0xa39ca787,0x9a0c1ed2,0x606f2620,0x2fecc1d6,0x72b7cb4a,0x9dc890b1,
  147090. 0xccbb7868,0xc33ca6fb,0xfe73ee49,0xd1b11082,0xfcb66c48,0x590b7d17,
  147091. 0x86e14573,0x9356b0a6,0x053ead85,0x75d682c4,0xc54d30fb,0xb2ae55fa,
  147092. 0xf8aee949,0x67636a72 } },
  147093. /* 14 */
  147094. { { 0xb91d6bea,0x638063bc,0x923ecb96,0xae263a2e,0xc627aca6,0x9d7b0992,
  147095. 0x77af9e7e,0xc6ed001a,0x24aafebb,0x9214accf,0x78055a90,0xa3564b96,
  147096. 0xe027499d,0x00999b1c,0xe46a06a5,0xe413a4e1,0x2e51efe7,0xa05d13f6,
  147097. 0x9ba843be,0x35e87d34,0x3183159e,0x0a633825,0x54601923,0x6023e8ba,
  147098. 0xb7fd1cf2,0x9b107721,0xfdf2fd53,0x46b5542b,0x1c18af38,0xb314f4f8,
  147099. 0x60ac8965,0x086f9876 },
  147100. { 0x8cbb9850,0x76701954,0xa20d2c8c,0x6210b730,0x5335670c,0x4084d057,
  147101. 0x0324baea,0x3ecdc595,0xc76ee9b4,0x607fc5f2,0x440ffa64,0xf393d00f,
  147102. 0x2dc1463c,0xe0111796,0x9c7725e7,0xf00b8251,0x5bd1d186,0x35e60736,
  147103. 0x2cf72aac,0xf3d8554c,0xefa3497d,0xb4dd0fde,0xf646ad11,0xd712268c,
  147104. 0x9f7b8ead,0x07c20afb,0xfc06dfe5,0x630969d4,0x7245549a,0x76b7df1c,
  147105. 0xe61ae810,0x681f9403 } },
  147106. /* 15 */
  147107. { { 0xc9a0623b,0x7cad5163,0x67fab8d4,0xdbf82957,0x81af7c7c,0x2ccab0ec,
  147108. 0xe966d5c2,0x469e38c8,0xf0d4e41c,0x34430d52,0xa52b359c,0x426075a2,
  147109. 0x33bd0127,0x242dd3e3,0x9fed2341,0xcda3f635,0xd7d52ffa,0x4df33730,
  147110. 0x7640c3ef,0x5fff56f0,0x1bbde57c,0x4783c21c,0xeb8bb336,0xd8784a2a,
  147111. 0xead08405,0x1ec7c533,0xf9b62bd4,0x4b7f1423,0x7075d4af,0x5543145c,
  147112. 0xba60590a,0x0c9de94a },
  147113. { 0x95d5682b,0x8ed72735,0x2ec276ed,0x711c4283,0x8b36a0d2,0xd1f4aed5,
  147114. 0x8498a88f,0x62ab40c4,0x4480f451,0x58c8fc62,0xb79cffe2,0x8bc8ca4b,
  147115. 0x701a359d,0x90ab583c,0x3fd5d15d,0xaee31a73,0xc912333c,0x02a5597b,
  147116. 0xb6c3e3c2,0x1019cae4,0x29938088,0xe513042c,0xf47c8199,0x0e00283d,
  147117. 0xf2a00e92,0x90d68e58,0xa775ae3b,0x69e2df41,0x871c30b2,0xb8d2eca5,
  147118. 0xbb1de396,0x733dca0e } },
  147119. /* 16 */
  147120. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  147121. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  147122. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  147123. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  147124. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  147125. 0x0f1fa7d7,0x2ab3bd47 },
  147126. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  147127. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  147128. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  147129. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  147130. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  147131. 0x4c27d229,0x93a4b416 } },
  147132. /* 17 */
  147133. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  147134. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  147135. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  147136. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  147137. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  147138. 0x32ee7763,0x342ce0d7 },
  147139. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  147140. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  147141. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  147142. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  147143. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  147144. 0xe156fd20,0x455f4af3 } },
  147145. /* 18 */
  147146. { { 0x754ec21c,0xc057f262,0xe3a1ba38,0x3eacd4c9,0x116c1fe9,0x3a0210d1,
  147147. 0xeacc8ab6,0xe4ea4e94,0xea6f32ca,0x31c00c9a,0x86b975ce,0x5cb6239d,
  147148. 0xa14ea1e9,0x654d5d8c,0x5067fc8b,0x230d31f4,0x6355fecb,0x48bb90cb,
  147149. 0xdc172e8e,0x78f81ece,0xcb006737,0x288380a8,0xe162d012,0x19b02e01,
  147150. 0xc5af145c,0x0e087a06,0xb72dc354,0xf04dc8b7,0x8de3c066,0xf70ef214,
  147151. 0x13009fb7,0x4f148243 },
  147152. { 0x6e2055e2,0x5e004fce,0x86c32067,0x89e247ea,0x5f9daaa2,0x4ebcbd95,
  147153. 0xceb7f63b,0xd15f212f,0x863784a0,0x5ecc5c1f,0x75760251,0x53b3800b,
  147154. 0x8a6a2954,0xeb9301c3,0xa13cdd19,0x0f16ba18,0x887c2d24,0x8313d251,
  147155. 0x9a9413f6,0xf9923585,0xfe3fd7c5,0x423405e6,0x16e0ee05,0x678aeb34,
  147156. 0x3fadaab0,0x1f3be7bb,0x82884471,0x7901fa2c,0x4d662ff6,0xc950db30,
  147157. 0x3c01170b,0x74d5d2d4 } },
  147158. /* 19 */
  147159. { { 0x2b5bfe11,0xa3002dc0,0x52d321e7,0x0733410d,0x9679ba89,0x15920f65,
  147160. 0x685b236e,0x0e248c14,0x346f6040,0x8cfab594,0x40c717f0,0x9f57afb7,
  147161. 0x66044576,0x0dbab28c,0x9cdc3247,0x0fa09968,0xc230ed05,0x41e02ae2,
  147162. 0xe45bef74,0x0d961554,0xce4d7b6f,0x9688a982,0x5e62d22e,0xfadefac7,
  147163. 0xbd2cba28,0xaf1512a6,0xbe7c749f,0x78868e62,0xae9f5a6b,0x88048d81,
  147164. 0xc5857a29,0x6b1a5442 },
  147165. { 0x43242066,0x9f5ab9ad,0x2ccca2ae,0x0afef1b5,0x988edc4e,0xb1b43ec7,
  147166. 0x0341b0d5,0x0d0c00f1,0xb50aab37,0x4d68b8f7,0xf3a64a99,0x9a8e4e6f,
  147167. 0x7f1a684e,0x198338fb,0x351a0f5c,0x8bc0e748,0xdac44515,0x2cacf2cd,
  147168. 0x5e9ff76b,0xc14d3999,0x16393055,0x54a01b3f,0x888d8376,0x6ac3eea5,
  147169. 0x723277b1,0xb84d9a9a,0xe11dbbbf,0x99132691,0xabb67178,0x597717ae,
  147170. 0x8bb14ac8,0x4c213526 } },
  147171. /* 20 */
  147172. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  147173. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  147174. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  147175. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  147176. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  147177. 0x5c37c334,0x65713c29 },
  147178. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  147179. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  147180. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  147181. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  147182. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  147183. 0x3bae3c38,0x6b0e996c } },
  147184. /* 21 */
  147185. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  147186. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  147187. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  147188. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  147189. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  147190. 0x678223f8,0x4022a205 },
  147191. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  147192. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  147193. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  147194. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  147195. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  147196. 0x24a6a956,0x312179cb } },
  147197. /* 22 */
  147198. { { 0x07615ac2,0xa94cc3ca,0x121ad581,0x85865e64,0xa7986b79,0xae47616f,
  147199. 0x9d5e0f1d,0x395a40eb,0x3d9457ea,0xa9143264,0xfa2865d9,0x8de6d6a3,
  147200. 0x1014ae8c,0x0771db96,0x976a87cb,0x77a7cce6,0x143a0f60,0xa7de42e1,
  147201. 0xd993d934,0xe203cc09,0x98ec4c3d,0x92018693,0x3a25df4b,0xd77546d8,
  147202. 0x62b02d6b,0x0ad9eb47,0xd05a7189,0xfaaaf208,0x431221bb,0x5238181f,
  147203. 0x733511ea,0x417d6c78 },
  147204. { 0x0e91e9a8,0x3cbd81b7,0xc370d6b3,0x73340418,0x8eaa2373,0x825db10a,
  147205. 0x6c7d6756,0x8f2b09e4,0x94c33ded,0xe288ee9b,0x1695e3fb,0xcd8426bb,
  147206. 0xdce9e888,0xa6176c86,0x6165e362,0x3f4c8922,0x6063fb09,0x514e411f,
  147207. 0xc8f9e04c,0x6907ac20,0xdfd2ad61,0xcef7469c,0x8452199a,0xba30bae4,
  147208. 0x12ac3462,0x30681293,0xc92d482d,0x011be873,0xe8330995,0xff4cbf89,
  147209. 0xd1470a0a,0x02189d52 } },
  147210. /* 23 */
  147211. { { 0x92599c69,0x73e419dd,0x7fec32ca,0x5b94221b,0x09bbfbfd,0xb2bf9bd2,
  147212. 0x63ed895b,0x61ea97a4,0x3f486f79,0x6609146b,0xfd141a39,0xbd1c7a05,
  147213. 0x83d64135,0xc79ec8cf,0x9883507b,0x7f8fd42f,0x17b3d027,0xafcb53b7,
  147214. 0x67ca5a21,0x86658dcd,0xcd149786,0xa6a6c0ac,0x34b95067,0x16f3d70e,
  147215. 0xdf44958c,0x371208e3,0xec280212,0xd2dd64e6,0x30782c71,0x33b2c4ab,
  147216. 0x521176fa,0x7bbf8abd },
  147217. { 0xa78b981a,0xbe9e4aaf,0x304ec828,0x788b4e36,0x3959dea3,0x0c45cf39,
  147218. 0x240b39c7,0x70a9bdd3,0x28383b7d,0x499cd7dd,0x307a1026,0x30690b2e,
  147219. 0xee92f1b3,0x2262d598,0xb4725a48,0xc62d77de,0x7bc3aa0e,0xa16f25bc,
  147220. 0xd15ef7fa,0x62dd8b65,0x0b96d68f,0xd979221d,0xa00f1906,0xb92885c3,
  147221. 0xeb74c740,0xfa476b9b,0xc7576222,0x217ddbb5,0x5788504f,0xc2782c30,
  147222. 0xf812716b,0x860d096c } },
  147223. /* 24 */
  147224. { { 0x4d79bbf9,0xfebc337d,0x69f74f80,0x5d53eab8,0x33104d53,0xff36a095,
  147225. 0x196f8b97,0x2ab820da,0x75ce6909,0x961d3d1f,0x04683754,0xb197ec04,
  147226. 0x93a6cb9b,0xa68ce1bf,0xc5f021a3,0x503456ff,0x8940ffdb,0xb50a2db1,
  147227. 0xef004209,0x77c50f8f,0x04965875,0xd635d177,0x8bb8770a,0x725766d9,
  147228. 0xa078e53e,0x8e19b028,0xf9fc8378,0x364d4cca,0xf0dd39a0,0x1a3df411,
  147229. 0x03adf920,0x7e80e442 },
  147230. { 0x539a1ddf,0x4b5f8a57,0xee486562,0xd248e7ae,0x816021e1,0x1c7b491d,
  147231. 0xfd36d2c4,0x2e7b871b,0x0aec00d9,0xda38b504,0x6193f1b3,0xf2827612,
  147232. 0xfb1f78d6,0x69c3fe86,0xe827ac33,0x56c8b786,0x3487c8f7,0x1687f6c7,
  147233. 0x19dee5bc,0xab8f2217,0xff399418,0x04e8473f,0xa9027c80,0xf384c014,
  147234. 0xaa1d2e28,0x9967be9a,0xe065eef1,0x869686d3,0xc7bd837c,0x737c6b08,
  147235. 0x9e8bd863,0x5dcab5d1 } },
  147236. /* 25 */
  147237. { { 0x9a7d772b,0x0784283a,0xe540959b,0x6b49e525,0x86414ab5,0x546bb008,
  147238. 0x9d74b2a9,0xd4448162,0x203b0b1b,0x267890ad,0xc8d3f86b,0x1e7a82bc,
  147239. 0xd85a83c7,0x1352bfb5,0xfad07ccf,0xf29f16e3,0x41e0c43f,0xc02a63b8,
  147240. 0x6b379fef,0x904f22c5,0xb1244f26,0x19d8a653,0x3a28bdea,0x6635b6df,
  147241. 0xf6d455ce,0x18b68851,0x9cff3735,0x74ac2818,0x8b2cbdab,0xad40f9df,
  147242. 0xadc9d498,0x08cc2d9e },
  147243. { 0xc170c84b,0x2e6a6866,0x5a49a484,0xbb989e8b,0xd04c8992,0x7b0e00e0,
  147244. 0x61b3a423,0x55ad3478,0xb0d01899,0x3c952450,0xe3100cb3,0xe3922155,
  147245. 0xf03276d0,0x19265b6e,0x76d42b53,0x0fe8595a,0xfc6353b6,0x0a96dee0,
  147246. 0x246f893e,0x761e0dc8,0xf0a74cba,0x4ec902be,0x3fdfad9b,0x61008684,
  147247. 0x4fdb6975,0x5d6a60e4,0x7ef7590a,0x3f53aac8,0x12870a37,0xd29e6be0,
  147248. 0x55aa55b0,0x991fadc1 } },
  147249. /* 26 */
  147250. { { 0xb4844ffe,0x82bc4b0f,0x60f8b871,0x73922714,0x4ce3f1f3,0x8ac000e2,
  147251. 0x163519ec,0xf0d548b4,0x88288b5f,0x7aaf842b,0x2bdc9a70,0x9e8b0c4c,
  147252. 0x4ba5fd67,0xa06d5152,0xf93cdec3,0xd0b1afa0,0xdf89f8f0,0x280955ba,
  147253. 0xeea32c92,0x86cbe92d,0x3fe05be4,0x0cae3f99,0xfa6919aa,0xf2607095,
  147254. 0x6e0f1b8b,0x0f54741e,0x30ecf988,0x2aed1f74,0x734991d7,0x9296f76b,
  147255. 0x259f0fe9,0x66cf8d28 },
  147256. { 0x226f5868,0x9b01905b,0x16909e9e,0xc102e88c,0x4a37eb54,0x2bd08916,
  147257. 0xc9816323,0xf72253e8,0x86bac53c,0x37f84e9d,0xafeaaaf7,0x2e352454,
  147258. 0x2ca0046e,0x67c86f77,0x6663372e,0x86bce50e,0xb6950a04,0xf6a3a960,
  147259. 0xfc1aba93,0x61f994d7,0xc1326e6e,0x1957c12b,0x2e56b005,0x9b658fe4,
  147260. 0x8592740c,0x9cd297fc,0x177f26a5,0x7654ce9b,0xa79d2ebb,0xaaa699db,
  147261. 0x0ecb6448,0x5fca0c5a } },
  147262. /* 27 */
  147263. { { 0x569a6663,0xe26e25f3,0xe6aa4ca7,0x09597ee7,0x8d18b80c,0x25a4cda6,
  147264. 0x22926730,0x450602b5,0x07387209,0x9af5f650,0x26733a53,0xfeeedb34,
  147265. 0x86572951,0x0f5ce768,0x8398ae9a,0x872a360b,0x2b30f6c3,0x60347a80,
  147266. 0x1a162158,0xd2113b23,0xee6c6dec,0x6fd9cf92,0x5cbcf9e6,0x85f0a5a8,
  147267. 0x2ba3fe84,0xd7a5a6e4,0x51ecd727,0xaafe6720,0xa2081a10,0xe09c6bb2,
  147268. 0xb973b0b4,0x657acbf0 },
  147269. { 0xc274c8d4,0x3130466f,0x30a994d1,0x42765176,0x7079435f,0x217258ca,
  147270. 0xeb897a06,0x44850406,0x561ee130,0xf38dfeee,0xaa1778bb,0x11f4facf,
  147271. 0xb9abb9e9,0x765c6617,0xd8f10932,0xb135499b,0xa73b9159,0xc0eb6337,
  147272. 0x6f7e8b6a,0xf2c1ccf1,0x187def53,0x5b32c03a,0x830b9c62,0x89ad1d49,
  147273. 0x2f10e538,0x1735eae3,0x9d5f55bc,0xb1cbd9c2,0xe539db0d,0x42428c47,
  147274. 0xc852b3bb,0x3d2da412 } },
  147275. /* 28 */
  147276. { { 0x871f2865,0x97702b6e,0x142920d6,0x56cb639f,0x45b58611,0x328522a0,
  147277. 0xf3b13812,0xf3943ad1,0x712206e8,0xe6c2200a,0xa34d59ea,0xc2890e5a,
  147278. 0xf6b7f759,0xab52fd40,0x180bf567,0xf522c8de,0xaccee396,0x181e97b2,
  147279. 0xc4ea5cbb,0xe0375819,0xab51d3ef,0x0d9985e8,0xbcb50fd8,0xe26c96ca,
  147280. 0x97e1c80d,0xfb9d6b13,0xf796357d,0x582b1814,0x07f4c7fb,0x89a78221,
  147281. 0xc0357e61,0x02aeef2d },
  147282. { 0x2c7ec9be,0x2ba7926f,0x7258b201,0x292f307e,0xc6fa6b4a,0x74e62a10,
  147283. 0xe2bcc5ab,0x80c08549,0x7bb8c073,0xb4160db8,0x329f194d,0xd5ef0529,
  147284. 0x6dda4a9c,0x0eb8da14,0x15ea23d1,0x0b5d43d2,0xfc34bfae,0x6cebef02,
  147285. 0x848757a7,0xacd364d0,0x2d34cca3,0xc1401368,0x1d2d95e2,0x09ca6742,
  147286. 0x786eaa28,0xc3fd1d6e,0xa2965fec,0x9eb1136d,0xc0779203,0x48871baa,
  147287. 0x4b15aeb0,0x6b446c01 } },
  147288. /* 29 */
  147289. { { 0x25e8fe80,0xc819eb2e,0x98238a17,0x2b5f7906,0x81e41849,0xd6f1e996,
  147290. 0x98ea6d45,0x58ad8ad6,0xbfd02e40,0x5bae5ad4,0xa812416d,0x016dc327,
  147291. 0xa3347ca1,0x8b31a985,0x82a65391,0x0b4da610,0xb48c35fb,0x1cb91b2d,
  147292. 0xd2aaf8c4,0x9e96817c,0xcdfdcdc0,0x1a630483,0x12b69254,0x70559361,
  147293. 0xf8a2a097,0x5fdcd712,0x35cc5281,0x59ab623a,0x932b6095,0x30c8ebe0,
  147294. 0xb08e052f,0x8613424b },
  147295. { 0xb2231d8a,0x28902063,0xd9a61667,0xb0f62329,0x071a9f27,0xaafa0fe7,
  147296. 0x603f047e,0x6bcd8960,0xfd92a1c3,0x118cca76,0x71d483b6,0x3414e62b,
  147297. 0xba705262,0xa123ccdd,0xfd9b5c5a,0x1a576437,0x4c8d0fa3,0xa5301bc2,
  147298. 0x102427cd,0x96f0ad44,0xd3aa6c02,0x0e6fb5e0,0x072a3996,0xcd8c4880,
  147299. 0x840d3fad,0x4dafca12,0xde91d541,0x29f4ca3d,0x8441734d,0x0037c598,
  147300. 0x9ccfe57c,0x86333a99 } },
  147301. /* 30 */
  147302. { { 0xecf53b40,0xd213a751,0x2f78a542,0xcff2c6f2,0xf13ae56d,0x0f59f0e2,
  147303. 0x0e61748e,0x91f8ccbf,0xd72c4145,0x0aadecb9,0x4c9cdcb7,0x6b2ed852,
  147304. 0x1eaffc70,0x8e00b72c,0xaa728102,0x89b24285,0xb679cafa,0xaa7ea7e0,
  147305. 0x4f0a6f6f,0x5d2b8c26,0x0e804397,0x7ed7b173,0xc8573049,0x5a93eb45,
  147306. 0x0986e93e,0xc92bf5d4,0x6a20c0af,0x526b5a9c,0xb99dc3af,0x0adf47c9,
  147307. 0xba202cc9,0x12b25fe2 },
  147308. { 0x33eea395,0x09b8d78a,0xf633fc5c,0xc7a93618,0x270eceef,0x7e821629,
  147309. 0xc628ed0c,0x524779b8,0xa1d68939,0x91db5ca1,0x586edc90,0x8626e18e,
  147310. 0xfeb3f3bf,0xfe023e8b,0x0250171c,0x6279fde1,0x55e172de,0xe52ec7dc,
  147311. 0xc6d4ca45,0x445e8695,0xbdbc10f1,0x42de3878,0x6fc3835e,0x2b114de8,
  147312. 0x7e10b652,0x9faba456,0x390e78fe,0x4111d82a,0xaedf0aca,0x576b61c2,
  147313. 0x74accb74,0x216279a9 } },
  147314. /* 31 */
  147315. { { 0x4047f747,0xc14cdabf,0xc1315a1e,0x03ca233d,0x40e5d0a7,0x59e7cbd3,
  147316. 0xbb413869,0x1fd0c4e9,0x0f01fbd8,0x189d08b1,0xa76b823d,0x50449c42,
  147317. 0x398b00a1,0x81c224a1,0x8e8179e4,0x08084e4f,0x698e41e9,0xfd8af994,
  147318. 0x5610bf2e,0x1e30e37c,0xa7d2790f,0x4e6a043f,0xb3195388,0x9d96e60c,
  147319. 0x03799dfd,0xe75f986d,0xf8ff902f,0x3b4a8f11,0x7588416e,0xfa945378,
  147320. 0x9827535e,0x20683e3f },
  147321. { 0xd0378878,0xcb582e26,0xa7945787,0x9e214c23,0x8f6688b3,0x13d000bf,
  147322. 0x40515270,0x7548d4f5,0x40111f5d,0x7113c15d,0xa8bff902,0x3bf5a526,
  147323. 0x9b4945cc,0xbda6b010,0xbc2f3a05,0x83dcc74e,0x43efdfa1,0x2aef6284,
  147324. 0x565c5bf4,0xd2e60ee9,0x592f243a,0x4f0fa10d,0x1bc3bf51,0x6ae58b32,
  147325. 0x60576a74,0x813b0868,0x4d73081a,0x0bc023f8,0x32dcee59,0x9fd03aa0,
  147326. 0x27d6c795,0x5e416bf5 } },
  147327. /* 32 */
  147328. { { 0x026cc23c,0x24313760,0xb5b29058,0xf819aaee,0xc5d2ee17,0xa92272f8,
  147329. 0xee5cc402,0x8048e7cb,0x77def07d,0xdbc7d6ee,0xf6af821e,0x61d69244,
  147330. 0x996cbb89,0x5f7966ed,0x96a155a4,0xf81b17ea,0x03f3ed56,0xb2d9ef70,
  147331. 0xe882a5b2,0x5e6e5906,0xae947180,0x86fa1072,0x658c76f4,0x34d9fc51,
  147332. 0xcb035aa0,0x9f603dc0,0x75be6481,0xb7b39feb,0xcf04a9ef,0xca87554a,
  147333. 0x87b4fde3,0x4ff682ec },
  147334. { 0xd0a10ad5,0x3125627f,0x968e6f45,0x7fd45c72,0x806a1163,0x2981bd6b,
  147335. 0xde5033e3,0xb92de1cd,0xbf4f8988,0x3b44b45e,0xdae7e1dc,0xca1b9896,
  147336. 0x0778d878,0x52166e5a,0xa5116847,0x82d472be,0xf2895445,0xfbdd382a,
  147337. 0x5d6ec4c9,0x22ed1602,0xb6552b02,0x3614eb1c,0xa1e6210f,0x63c5df73,
  147338. 0x021a74a7,0xe9160285,0xc65cbd4d,0xa44ca400,0x0f15e299,0x48cb187e,
  147339. 0x3402507c,0x51eb818e } },
  147340. /* 33 */
  147341. { { 0xb92100ab,0x1fc1d178,0x9605b839,0xdf2e3d60,0xb71e59d0,0x12a7c255,
  147342. 0x14fcbe04,0x3f8b6675,0x59fd06af,0x0e8a3935,0x12020d07,0x56326502,
  147343. 0x528e7be5,0x6696fcd1,0x0c7b7654,0x6588514b,0x5912a5b5,0x0cd80f8c,
  147344. 0xf324cb7f,0x8bafef04,0xc6da3d75,0x6b53eecf,0x31d1df2f,0xedef48d8,
  147345. 0x73812b6d,0xf336b965,0xee626031,0xc82eae4a,0xd244f09b,0x300abd32,
  147346. 0x31d9647f,0x8b0af955 },
  147347. { 0x2e603544,0xb770180a,0x221acd9e,0x2b573ac3,0x62407032,0x3a17f665,
  147348. 0xb89abc3d,0xad3e74ad,0xd793225a,0x8a3d2e3a,0xef02564b,0x457bba04,
  147349. 0xfc2dd2b5,0x8875652f,0xe67143e8,0xd2905d15,0x02e48d70,0x6d884b42,
  147350. 0xc7636a57,0x06f99219,0x35e378df,0xa8dc3421,0x10c64a02,0x95c1d73d,
  147351. 0xcc157a66,0xcd6a4ece,0x8e24a354,0xbadcc1c8,0x9839329d,0x8024f1b2,
  147352. 0x4da48ad0,0x5363e549 } },
  147353. /* 34 */
  147354. { { 0xe23fc641,0x1f5523b7,0x86667063,0xfe54e72f,0x8e009d2f,0x294a15f5,
  147355. 0x8c57f5e1,0xf203997f,0xb16d64dc,0xa229724c,0x4baa2ffb,0x697be4fd,
  147356. 0x0a6e8ed6,0x3f507e46,0x78508536,0x0afe3a5d,0x95408208,0xeeef6cdd,
  147357. 0xf2c4237c,0x701fd889,0x5c385253,0x496d883a,0x72a212f1,0xe25c67ed,
  147358. 0x1ff78fcd,0x4b416783,0xc16f4146,0xe9967004,0xc45b0697,0xfa45c3a1,
  147359. 0x3fbd30c3,0x63334018 },
  147360. { 0xa2fbbbce,0x39c9a0cc,0xaa0cb744,0x876f6e5c,0x3438ece3,0x9ce6010e,
  147361. 0x13802d82,0x0aad148e,0x9cd45a1b,0x9c3e5c60,0x7bcfc1e0,0x875cb859,
  147362. 0xd8584dd0,0xb19ff790,0xd81c2a2b,0x2598b81e,0x02be07e3,0x118bdf2f,
  147363. 0xb9765ce9,0x074fc8ee,0xb24f95ae,0x125e9d88,0x0c98f09d,0x3bb12cdc,
  147364. 0xa0b74b27,0x4a6aee07,0xc08077ce,0x4723d2f9,0xbea8026f,0x959447d6,
  147365. 0x16280b73,0x93a7075c } },
  147366. /* 35 */
  147367. { { 0x715b27f9,0x26bbefe2,0x2a280923,0xa935a5e2,0xfd58a26a,0x5ddf23af,
  147368. 0x7c138694,0x54c83e16,0x892a2153,0x44799bc9,0x9b8d09f5,0x4e6e4710,
  147369. 0xd588ea68,0xc63af616,0x883ab1b6,0x5e896706,0x3d209336,0x3c1393a0,
  147370. 0x92c23dda,0xd02f2921,0xdcf6ea43,0xab70cb7a,0x791559e1,0x12434ea8,
  147371. 0x6d70ff0b,0x040680db,0x2832ba45,0x1a10fe52,0xe5f0cb8f,0xd69f9c08,
  147372. 0x44b141fd,0x1a7422ac },
  147373. { 0x9f40b675,0xc3a9dd2e,0xfcc71f39,0x2a7c6603,0x1948e342,0x18939a61,
  147374. 0xed0ab484,0x8f3b6158,0xee31ca6b,0xa3aa7d97,0xf7a8db63,0xbc1e865e,
  147375. 0x2c7c62e4,0x315f8c09,0x9f5c6d0f,0xa260788f,0x4b6f3ec5,0xb1833129,
  147376. 0x36b4d849,0x73adbcd6,0xbc699a9b,0x66e14890,0x2a1175e7,0xbf3790d8,
  147377. 0xfc53ca4f,0x7f43605a,0x87ff6091,0x577f6c47,0x600c82b6,0x827c7552,
  147378. 0x9d25599c,0x0944d630 } },
  147379. /* 36 */
  147380. { { 0xe6ab9620,0xcfdeb63e,0x786cd808,0xdff4fa6d,0x456320b3,0x145edd82,
  147381. 0xc4943915,0x2ae5f862,0xb73b3f87,0x9508e813,0xe52f97a9,0x3bd805f3,
  147382. 0xc9829b62,0xf71b5c28,0x86e0cefc,0xb394c70e,0x23bdb36e,0x534fb1a9,
  147383. 0xdbe27e5a,0xd64f5862,0x83ab6169,0xbae23df3,0x27c828cb,0xdd6df1b1,
  147384. 0x3a307a8a,0x1901899f,0x811ddf66,0x36cc8659,0x79943b77,0xa3cb7774,
  147385. 0x6fd86576,0x7d89f383 },
  147386. { 0xc9f92b2b,0xf8564242,0xc46e32bd,0x700c6a75,0x7f99a5c5,0x93e768b7,
  147387. 0x03149568,0xb6efe858,0xc2ce6709,0xbbfe8a19,0xee6ec493,0x721a3b1b,
  147388. 0xc371c28d,0x26eeeea9,0x15177e1d,0xd798115e,0xb068a5a5,0xd7bf3bce,
  147389. 0x46d2b4b2,0xdf8da220,0x59be9dfc,0x3df0995b,0x77640b79,0xc96897bc,
  147390. 0x5a2bd3c5,0xce0cf4c2,0x89afe744,0x16f45d6e,0x3a8509bb,0xb53f3acb,
  147391. 0x63f2a6e6,0x449af81f } },
  147392. /* 37 */
  147393. { { 0xa16d9377,0xc2fcf132,0x7e1a2f9e,0x9ab377b3,0x86d19ae5,0x72e1a12e,
  147394. 0xd013bbb1,0xd2b12e66,0xcb5f66ba,0x0972e055,0x399eab50,0xd11de1c0,
  147395. 0xc65f5ec2,0xc1f314fd,0x8a9ff593,0xfc311841,0xe05246e6,0xdf73c1ec,
  147396. 0x1625056d,0xc28d1363,0x6fb25e19,0x30a9dbd7,0x845cd2d7,0x049ed244,
  147397. 0xd36e852d,0xc779b83f,0xf68c8a83,0x85a35fc7,0xc95e8033,0x299bf1e1,
  147398. 0x20891af5,0x0e8617c3 },
  147399. { 0x67c81b5c,0x53720602,0xe737873c,0x2fa89dcd,0xa8144fd0,0x2a7430b0,
  147400. 0x26208c83,0x3006c5a7,0xd8ea40f5,0x4e066660,0x896413a4,0x9dd025f9,
  147401. 0x46b9149f,0xbdf380cc,0x0a125cc2,0x80156619,0x52793c37,0x04d6a3b7,
  147402. 0x6b7a62f2,0xb6001374,0x585d5978,0xa9cfe268,0x8395fe66,0xdcad0cb8,
  147403. 0x46b261f6,0xbab468fc,0x9d9d9218,0xca0ef5ef,0x5e452402,0xc507d4a8,
  147404. 0x326cf687,0x6f4404f1 } },
  147405. /* 38 */
  147406. { { 0x4febd3ff,0xa3e1920b,0xfdfd2bba,0xca6234d8,0xe19a9829,0xb7d1af2a,
  147407. 0xc6f5bc20,0x23de1610,0xdaa39ca9,0xe204dbf3,0x6d8c70ab,0x2a2de9b8,
  147408. 0x7c9d370b,0x272e0c37,0xe565510e,0x80914c06,0x57cbb6b0,0xb611e7a8,
  147409. 0xd8266a6e,0x076fc6ef,0x3095801c,0xdfac34ee,0xb9e24063,0x69ff40a2,
  147410. 0x787aa5c5,0xa7ba31a9,0x33c70cd2,0x0e4d1fdf,0x6895f074,0x903e3132,
  147411. 0x7fb671e2,0x905771f8 },
  147412. { 0xa4062bee,0x5199ba0d,0x94d7d9f9,0x18e7238c,0x1e0922c0,0xf53f29bc,
  147413. 0xb12d855f,0xde9b2a81,0x6d68ca29,0x649f3eed,0xc50c097f,0x64adfc34,
  147414. 0x9db398a0,0x81964ab9,0x7a587224,0x00d59c47,0x74c5903a,0x09fea396,
  147415. 0x15043dd0,0x6aafd8ee,0x5f1ecc20,0xc5721a6e,0x0db9b7b4,0xb6d6a483,
  147416. 0x66c8d52a,0x06ffc617,0xacc82a27,0x3de241d6,0x27f2f7a8,0x0605f052,
  147417. 0x6404decc,0x6a22953b } },
  147418. /* 39 */
  147419. { { 0x74fce389,0x92452d8f,0x2afa5564,0x059634c0,0xf0ed7825,0x9377ccbb,
  147420. 0x37718e0d,0x89f4045b,0x9fa69a4d,0x11074e7d,0x7295b0ba,0x5d70bb07,
  147421. 0xf107ede6,0xb22d54ad,0xa1a29c7b,0x5c39a3d8,0xd795e3ab,0x37236c02,
  147422. 0x2b589951,0xf7282d00,0x5790bee2,0x5e2265be,0xa8e65ea2,0x91e0ea11,
  147423. 0x6001cebd,0x0e71a708,0x2c1c5402,0x16900f5a,0x357f6981,0xc3b2d5c0,
  147424. 0x619e3427,0x528c9ea0 },
  147425. { 0x5f26c577,0x1edc86b4,0x9438bd45,0xf8074708,0x792582a7,0x2dfe1013,
  147426. 0xde1e569f,0xe08eaca0,0x9a55a356,0x5f952efa,0xe4976216,0xa4d80b53,
  147427. 0xcd5d71f2,0xd2b65855,0x66cea3f0,0x246704bf,0x492323ca,0x193f641f,
  147428. 0x9adb1325,0xa681855c,0x2d19d652,0x86d522ce,0x5b82ed7b,0x53609f10,
  147429. 0x8e150d29,0x3b0f0094,0x0b13e891,0x23ad8bfb,0xf794b449,0xcbb1556c,
  147430. 0x738bcf57,0x200f9093 } },
  147431. /* 40 */
  147432. { { 0x8388387f,0xf9b22fc5,0x28e883c5,0xcf26f170,0xd1b7973c,0x447cab90,
  147433. 0xf6ec9171,0x8d5d4ea2,0xc30cdbc0,0x2e16f498,0x48623c2b,0xdc92910c,
  147434. 0x30dbc545,0xeb1491b0,0x14de21b0,0x631deb2e,0x2fe830f4,0x04a21066,
  147435. 0x379c1f3f,0xa4c6979c,0xfb06a795,0x8a732b68,0x1619dfa9,0x3a44327a,
  147436. 0x8dbe2c9b,0x91a307d3,0x03989fea,0x939bc8d2,0x0f4a331f,0x3daabaf2,
  147437. 0xdd0f55dc,0x5c307e98 },
  147438. { 0x35b233da,0xbbc4e0c4,0x22f6f985,0xe3d29085,0xa8b02468,0x99dd2d21,
  147439. 0xa96916e7,0x978f40e9,0x614bcced,0x0327d86c,0xb290762c,0x95e95502,
  147440. 0xa879f2ed,0x0ffd2197,0x50e0bd33,0xc4365137,0x0827c4c4,0x26c3148a,
  147441. 0x3fcfc0b2,0xc79812a8,0x31928589,0xc3d8d17e,0x8830f42d,0x8b572cfe,
  147442. 0x4b07f83f,0x7cd9ff92,0x0a51148f,0x331ca950,0x4c59f9ac,0xd0c53968,
  147443. 0xc1434785,0x1df16dfa } },
  147444. /* 41 */
  147445. { { 0x68bcacc3,0xcc7bb4ac,0x430f58cf,0x06ded34f,0xd461855a,0xc59f9f4f,
  147446. 0x45c9f0bc,0xf5491994,0x4375c892,0xdc5f7ec6,0x3c85983a,0x1b8708f1,
  147447. 0x82fcd087,0xb32a5cc4,0x2d6b4c0f,0xefdcdc35,0x8ac6fb2d,0x4bb24f04,
  147448. 0x33906471,0x5982d4f5,0xb83a3ac4,0x162eb52f,0x2337a223,0x7130df28,
  147449. 0xcbc3dbd3,0xdce7b802,0x2467ac0e,0x8b395959,0x1b56717e,0x21d3d2e8,
  147450. 0x46512617,0x729a7f50 },
  147451. { 0x8420f90a,0x874ed1aa,0x0fe4c855,0x6368e19e,0xb0be74af,0xb62d4aaa,
  147452. 0x8ca60ca9,0x76fcc480,0x7645a867,0xf310b5a5,0xddb1b24c,0x131bac9b,
  147453. 0x2dea5b44,0xef77d71d,0x72fcc64e,0x4706d210,0x673d77f0,0x29b92691,
  147454. 0xe89e0663,0x22e00bf3,0x74077d40,0x472d0cd3,0x829232e2,0x3e21040d,
  147455. 0x38dc8533,0x2f916dfb,0x14b8f667,0x48bbb59b,0xd44be19d,0x19de9f4a,
  147456. 0x232d9d5c,0x7f6d3649 } },
  147457. /* 42 */
  147458. { { 0x6e794819,0x3bd064de,0xf82ebda1,0x5a6b694e,0xb91e2804,0x1f017fe0,
  147459. 0x07a43cd2,0x190d31f3,0x630433e9,0x6c26f226,0x0abfdcb4,0xba488aa7,
  147460. 0xa46411c0,0x418d9085,0xbffb5880,0x1b934fe6,0xe200f849,0x75d1e237,
  147461. 0xa55413db,0xdf04d63f,0xe23b3f77,0xe216ed75,0x0f91bd30,0xa05866cb,
  147462. 0x7729c509,0x84c395d9,0x452ab2d7,0xec97e188,0x0093d686,0x8cb7c1f9,
  147463. 0x628f086c,0x2d032395 },
  147464. { 0x4a44b4c5,0xa81c9407,0xcc702c98,0xb9846879,0xceb0dc97,0xcb502287,
  147465. 0x6e3aa321,0x30301126,0xe4c256c2,0xc0ac8763,0xe55b4845,0x65034d20,
  147466. 0xf240f35b,0xaa96a040,0x7cf7eedc,0x046d26d3,0x3b810656,0x62a5a8e1,
  147467. 0x83d70c2b,0x86044b97,0x59e4da8f,0x2fbaff88,0x5457f5d1,0x929d901a,
  147468. 0xb531b757,0xd29e1eb2,0x9e4e9739,0x214dabdc,0x4eaa9bd9,0x5bd724fc,
  147469. 0x1ef9bb9b,0x734c12b3 } },
  147470. /* 43 */
  147471. { { 0x92f9b086,0x98fe3c2e,0xb3fd4544,0x4641b93e,0x5c02c65c,0x47ce208b,
  147472. 0xc4f03242,0x8a52dca1,0x679d29f6,0xb5ec17d9,0x9406f5f4,0x11d2fed0,
  147473. 0x0d9ba811,0x260f63dc,0x15472a3f,0xde2b056f,0x007290e6,0x1b170d9f,
  147474. 0xb6b5c8f9,0xa2e23e8d,0xcf34c3ee,0x345a2839,0x1b973ee2,0x9bdc5461,
  147475. 0xbb24d1c5,0x65bda6c2,0x3c6141a1,0x97d52ba3,0x9d2eb201,0x47bb1612,
  147476. 0x21fbe49f,0x7c558a87 },
  147477. { 0x3f350fec,0xb9485a52,0x6a38d4c0,0x016678c5,0x0d5aa64d,0x8ef346a2,
  147478. 0xd96da2e4,0xb85daa02,0x4f647b3c,0x845ec4ea,0x0d5e946c,0xc0d1a6ca,
  147479. 0x4fa9f4ab,0x41d8d1c1,0x9c8b1303,0x43972cc5,0x434ffbfb,0x67e1f48d,
  147480. 0x819d2318,0x350ce93a,0x6ddef23f,0x49f53090,0x200cf12c,0x3c2e6cf9,
  147481. 0x640432fc,0x42691cc1,0x72496b52,0xbfff74b4,0x020a97be,0x44527c9f,
  147482. 0x7b3c4348,0x34cd7dca } },
  147483. /* 44 */
  147484. { { 0x59e7fe87,0xf031761a,0x0047cd72,0xb1eae31a,0xfae30f62,0x27902e68,
  147485. 0xb71db143,0xa666f48d,0x0e0038f4,0x75ee6678,0x02bdd76d,0x3b45ac67,
  147486. 0xa0d6cd5c,0x0d2fb828,0x9d8c5b11,0x27ce7f1d,0x120b5e96,0x141fe0e4,
  147487. 0xb9267c37,0x95a1b984,0xd60312cd,0x5206e589,0xda549356,0x1867342e,
  147488. 0x070c74ac,0x374520b9,0x9557b0b3,0x2703cbb5,0xa6ed8c14,0xf621f59c,
  147489. 0xabf7b887,0x7ceb1cc2 },
  147490. { 0xdb7fd65b,0x0647a5bb,0x36c9457c,0xd8d45cc0,0x9e12718a,0xc6da99db,
  147491. 0xe93a7fb1,0xed1dbbf4,0xbd1566a1,0x4512c95c,0xdbc0c919,0x4861ba00,
  147492. 0x9e7f5269,0x3c6cc298,0x0941aaae,0x67196150,0xc8c538e3,0xbfcf5d0f,
  147493. 0xa25a551f,0xad6e9929,0x17ca0f26,0x90710985,0xfa89ef7e,0x743b78ea,
  147494. 0x71ab4549,0x39d5ea31,0xe6d1c36d,0x7442f3f3,0x059d568d,0x25a683e0,
  147495. 0x227ced5c,0x1f629a99 } },
  147496. /* 45 */
  147497. { { 0xe45a1c3e,0x8925ddac,0x41f7545f,0x72d29365,0x37e7f828,0x45622fcb,
  147498. 0x3e4c79d2,0x88234513,0x9c2645d6,0x5dffaf84,0x994802b9,0x3078f4dd,
  147499. 0x9d339fa0,0x566927f0,0x9fd91dcc,0x9a500a1e,0x0ab0abd7,0xce008180,
  147500. 0x8194e5df,0xd97135a3,0x98adf088,0x9e876307,0x9a45a2a7,0x3baf01b8,
  147501. 0x788b4399,0x6fed6154,0xe77a997d,0x980e5722,0x2a378eed,0xaac90ffa,
  147502. 0x8bd805a2,0x4a75fda2 },
  147503. { 0x55e74cbc,0xd09a8fbb,0xfab18f25,0x737738ce,0x9764ec3a,0x0fc23ad6,
  147504. 0xe7e0ad31,0xc5a7d35b,0xe481cc9b,0xe75e068e,0x3d4aec34,0xf0c2ea99,
  147505. 0x0d4a63c4,0xf1324fe8,0x99b0592c,0x5dbb7c16,0xa7e0f46b,0x442d674d,
  147506. 0xa300faea,0x5a5d66c7,0x3333ac83,0xe83dc821,0x8c408496,0x70ef812e,
  147507. 0x99ef5fc1,0x96e1dcb6,0x1734e862,0x6e2b771b,0x583507d8,0x04629cdc,
  147508. 0x23d8179a,0x5819f9ae } },
  147509. /* 46 */
  147510. { { 0x6aa78811,0xd9969121,0x2103e7c3,0xf64ee8f4,0x22b9e698,0xddf01070,
  147511. 0x4f582cde,0xe6001f9e,0x2ecfac1a,0x24a608af,0x06393009,0x6ef4c784,
  147512. 0xebf72911,0x5262eae6,0x8c4ee5a0,0xddbd0af5,0xecd87bc7,0x875aff90,
  147513. 0x6f24f114,0x2fddb34c,0xe865f172,0x48104281,0x886c1b9a,0x95692426,
  147514. 0x9ef4231f,0x6f5f3208,0xd0a7e82e,0xaf587acf,0x9ac395c8,0xd6571917,
  147515. 0x1364a750,0x7459603c },
  147516. { 0xf41ae519,0x1c2475bf,0x4af8f251,0x34401fb1,0xaefb2c3d,0x70ddfcd2,
  147517. 0x51cdaf08,0x9b2d385b,0x8208bb19,0x8531c256,0x4c33f3f6,0x16c89df6,
  147518. 0x24571769,0xc23cfa99,0x86d010ba,0x2339b51e,0x22638313,0x08db0e8d,
  147519. 0x00fedeb7,0xf769e179,0xa3687ef1,0x3fd96dcb,0x91476475,0xcd046b23,
  147520. 0x0c45c8dd,0xf3ff2064,0xb8343d78,0xefd167bd,0x4b77ee90,0x493ccb6d,
  147521. 0xb3cf7b45,0x33025513 } },
  147522. /* 47 */
  147523. { { 0x35eaaca1,0x36f00469,0x89119102,0x0c384b75,0xe6d2954c,0xcb375665,
  147524. 0xb1e9d6d7,0xcb9199b9,0xc29c2757,0x75852349,0xb8e738d0,0x89cbd1ba,
  147525. 0x5923a427,0x9b8dbe90,0x18fe1889,0xa237793e,0xa742e083,0xa4271757,
  147526. 0x4eebd613,0x8c4979d2,0xd4f2cf77,0x40325054,0x958705de,0xa3b8a091,
  147527. 0x33d999ba,0x1b191bd9,0x3b0fee1e,0xbafefba4,0x3facdf14,0xb3bad184,
  147528. 0x4387561c,0x9328adb0 },
  147529. { 0xf906b872,0xabe84e80,0x78262665,0x705523a0,0x3398ccf7,0xd89c6a7e,
  147530. 0xf55b5323,0x2fab551d,0x0554dea8,0xa0578eca,0x375589cd,0xef26523d,
  147531. 0x864ad750,0xd8fd6242,0x178fe1fe,0x93f27fc5,0x9df87422,0x7b3e6f30,
  147532. 0x3750d054,0x2862e49e,0x5dc038a1,0x7d90c6b2,0x84db682b,0xc1a1ae22,
  147533. 0x9881930a,0x47f3dab7,0xbaf3e0a4,0x30e6bd52,0xf62d25c5,0x0680025b,
  147534. 0xadd0d5e7,0x0aa1f3cf } },
  147535. /* 48 */
  147536. { { 0x22a10453,0xa9822190,0x2a03a10b,0xdd1eb91c,0x96646f3b,0xafbb5d95,
  147537. 0xf38b6fc6,0xa58de344,0xb8cfca1d,0xce47c3e5,0x0f70da04,0xfcd8e16d,
  147538. 0xda262ed6,0xac44349b,0xc56e2f8e,0x9320d87b,0x19138e58,0x9ce3ea08,
  147539. 0xa2b236c0,0xa5862dff,0x8e7efb0d,0x6b0f9a5c,0x16ac78eb,0x4b53432b,
  147540. 0x709b51af,0x6ff43105,0x8f519628,0x08e236f8,0xeed403ad,0x1f93f176,
  147541. 0x9636545e,0x559337e0 },
  147542. { 0xd8fd807a,0x30ddf738,0xab131222,0xf4e0ec9d,0x625afbc3,0x14a2f4db,
  147543. 0x9f12f895,0xd5b70604,0xac3044fd,0xb46f3c23,0xf540148f,0x1b232d1f,
  147544. 0x39b4e554,0x61b458f5,0x0dd70b75,0xf694b24a,0x289581d9,0x0fc64299,
  147545. 0xee5fe22d,0xc05d49be,0x6a18bf63,0x7af3447f,0x7f1929d6,0xe96a1dc2,
  147546. 0xc1551e8c,0x6afe6028,0x2b5d4fa2,0x27dacaf3,0x545c2cb4,0x4a1631bc,
  147547. 0xb0c914d3,0x930070f9 } },
  147548. /* 49 */
  147549. { { 0x69a9bc05,0xd2f32c5e,0x589c4b73,0x0a5c19c6,0x94665f9c,0x095c9e5e,
  147550. 0xbcfb4c39,0x8ab0f293,0x1ddb7c31,0xb9070877,0x66b38048,0x894e9658,
  147551. 0x606bd9bd,0xf19a90cf,0xb6fd2d69,0xcc1d58df,0x461d8a69,0x886dcc4e,
  147552. 0xf9ce4831,0xc455c277,0x765f8a82,0x749a5996,0xc3badc8d,0x2ffc668c,
  147553. 0x9112cdab,0x38018396,0xb243c7cb,0xa98795c3,0x010a2224,0x8775f310,
  147554. 0x587b5e14,0x043a2141 },
  147555. { 0x3a873752,0x7bbe9dbc,0x2f442fee,0xee1493f4,0xc18c2181,0x981ca2c8,
  147556. 0xe29769e7,0x00ce3090,0xde768c5f,0xb4626ac8,0x34d7677e,0x33e9ce46,
  147557. 0xe0fa94e6,0xf89c2cad,0x41f5b5bf,0x04f5cc11,0x2228c12c,0x2565f736,
  147558. 0x0c05cce5,0xf1bf706a,0xbe487c4f,0x5d07ffff,0xa499f1a4,0x3ec43c09,
  147559. 0x98d94800,0x4f4e79bb,0x073f12f8,0x8a335a16,0x0f970d6d,0x4bb5eaf7,
  147560. 0xf24d0ae8,0x18d0747b } },
  147561. /* 50 */
  147562. { { 0x84601faf,0x58d3c77c,0xaf1c1f72,0xc9465be2,0xd116d806,0xff626798,
  147563. 0xd5b0d93c,0x3996c0c6,0x5ec6723a,0x2fa1ad75,0x03ba5349,0x966a8144,
  147564. 0x2ac34d8a,0xdc4c9422,0xed675865,0xddf471de,0x953d528f,0xd8aca597,
  147565. 0x24ebf67d,0xb2e463b5,0x7e25b4d3,0x25824871,0x43159daa,0x23c5adba,
  147566. 0x83357540,0x5458f9c6,0xf938b1a6,0xcf685da7,0xcefed231,0x981a4fda,
  147567. 0x08bb5e59,0x711093ed },
  147568. { 0x401f161a,0x12aa3fc6,0x974c5e87,0xf7358560,0x17b5df82,0x4aa252fb,
  147569. 0xa48e6299,0xb0b82b07,0x29dd847d,0x00234157,0x4529c5a6,0xf1e54d00,
  147570. 0x6d98f538,0xcc1c539e,0x28d3abcb,0x36162b53,0x2a84f0cd,0x75a37938,
  147571. 0x4dee7484,0xf717a81b,0x4c23bf1b,0x16cf35fb,0x787e8b3e,0x7fd1c29f,
  147572. 0x59b79ab0,0xb7da7e68,0x85f6c60b,0x072100a0,0xe7ed48b5,0x31840159,
  147573. 0x4d9c97d4,0x17898bda } },
  147574. /* 51 */
  147575. { { 0xae1b8cf8,0xcd8483d8,0xe9a28856,0x323d4b42,0x204a4bc2,0x7633584f,
  147576. 0xca7a69fa,0x4e0b2228,0xf757bab2,0x8afbda8b,0x6cc5f9ca,0x85b24088,
  147577. 0xd41a95c3,0x47fb4813,0xc2aabe6b,0x3f1bc53c,0x1ad1599d,0xf22cda3f,
  147578. 0xc31ea9b1,0x1b2ec081,0x01614ac1,0x048f304b,0xc6afa7ab,0xce31cee9,
  147579. 0x4140dc3d,0x55af7633,0xdce8abba,0x84b7ab37,0xc7cf3efe,0x50de7648,
  147580. 0x15356ab2,0x73a88dcf },
  147581. { 0x06e83b39,0x3f868288,0x9f44037d,0x477a4413,0x17dbc841,0xf9058b0f,
  147582. 0x54d17549,0x2db64f4f,0xf2307ffe,0xa23cea6a,0x4f126261,0x393efd55,
  147583. 0x10f37f26,0x2f4e658a,0xf4ee1e35,0xa4437ce3,0xa93cde8b,0x64ef42a7,
  147584. 0x939aa901,0x1debc9f4,0x3d7b5cd4,0x44223d6a,0xf88a3acc,0x789a6a11,
  147585. 0x2c608a2d,0x56fb9df8,0xbbf56c06,0xe79db8e3,0x668fa300,0x73c56af2,
  147586. 0xae396a1e,0x52f32b17 } },
  147587. /* 52 */
  147588. { { 0xe714f71a,0x56f524c1,0x9add8519,0xc1be1262,0x65cadbe3,0xad9189d8,
  147589. 0x5a0fb649,0xd88bf5c8,0x21d192d9,0x9efa6a92,0x6f724b6f,0xe3fe8389,
  147590. 0xb250119c,0xec3fae24,0x2ae0d3c0,0x4b6af9f6,0xd619624d,0x8fceba0b,
  147591. 0x2fdb6e3a,0x7dc3092b,0x3263cd29,0xc91da376,0xf95c43bd,0x30c0761e,
  147592. 0xcdeb44d9,0x89136400,0x43c0d31d,0xfd7dce84,0x9871899f,0x78fec3b1,
  147593. 0xefdf58c1,0x79e14d28 },
  147594. { 0x9bb40c55,0xe3822235,0x0ed07a42,0x0a27202d,0x4838c1f4,0x48e6c1a9,
  147595. 0xd864a78e,0x2b5f24a7,0x0c6c55c9,0x7e7f140a,0xce12d508,0xe62c104a,
  147596. 0xc11b1e10,0x9b0a1a7e,0xafbb3dd5,0xfd8a275f,0x9a3b6b30,0xdff354fe,
  147597. 0x46602a01,0x5a105d9e,0x93bb65f7,0x3d371b4d,0x0f82fdeb,0xda5cbf0b,
  147598. 0xde468545,0x4601229b,0xc73d517e,0x505e10b9,0x672ff492,0x77cfa541,
  147599. 0x99566ce2,0x0d8ec28a } },
  147600. /* 53 */
  147601. { { 0xcbeee995,0x014cf73e,0xd491e80c,0xb2eb88bc,0xd9aba5d4,0x615a6cad,
  147602. 0x9304c84d,0x2f7d4633,0x8ab03c9a,0xba0501d2,0x91babb94,0xc8f723de,
  147603. 0x50405772,0xc885f977,0xc7fcb094,0xb5e1d2b3,0xdf96c71a,0x61ee7995,
  147604. 0x3464499e,0xb8c8daab,0x5f607932,0xdb425ddd,0xb1243587,0x70251ca1,
  147605. 0x9fc74340,0x26d7d3be,0xc902ac89,0x8c179310,0x4559a74f,0x72522c15,
  147606. 0xc3734afc,0x86001e27 },
  147607. { 0xe7693947,0x13b00ba5,0x012c062b,0x6478641e,0xe85490a8,0xe1a438e0,
  147608. 0xd9574d5e,0x5173dbbf,0x9bd3ba61,0x9532eb8c,0x5f3ea075,0x1f41bcb8,
  147609. 0x8cbb92b9,0xac1cc247,0x1ef901b4,0x0f34648e,0xd2b3b2ee,0xdd929d1e,
  147610. 0xc3d75bfc,0x470f1eab,0x139cf4d2,0x5cdbc6f7,0xf0424953,0xcd86454d,
  147611. 0x47fcb383,0x1e079812,0x17df930c,0xb9f209b4,0x114ebc00,0x4225fc31,
  147612. 0x347946c1,0x020591cb } },
  147613. /* 54 */
  147614. { { 0x275e0af4,0xe3003721,0xe78a4a4b,0x721141ef,0xd1757485,0x666cfcf6,
  147615. 0x168e659e,0x5fa1d737,0x0e2842ee,0x263e3e54,0x948bd5f6,0xadecc3d4,
  147616. 0x246b104a,0x019de03d,0xf343d818,0xf8a9e903,0x5b0c0d31,0xcb57ba4a,
  147617. 0x51e2765f,0x8246c506,0x6519bf67,0x80c5751f,0xf2119a01,0x5f05c200,
  147618. 0x7821d4f4,0x7e6487b8,0x261c3a06,0x262f94aa,0x72146052,0x56cfe489,
  147619. 0xa1df05ef,0x5119985f },
  147620. { 0xb18586c0,0x5819497d,0xc6eeaa62,0x004415d6,0x97cda28b,0x7c6a46b6,
  147621. 0x7c194594,0x9a149b28,0x4ed3a506,0xb56369fa,0x43c94cb4,0x7092aa66,
  147622. 0xa9e9eee2,0x55bce73a,0x77893509,0x34bb2870,0x06eb5326,0x8af95fb0,
  147623. 0x9638f485,0x87cd0323,0x5ba75bf8,0x29376268,0x9d42d581,0xf32d6f3d,
  147624. 0x65c6d64d,0xa4cad574,0xb2cded41,0x985f50fb,0x9006a067,0xcf34ce0e,
  147625. 0x58a57f9a,0x59eaf265 } },
  147626. /* 55 */
  147627. { { 0x6ec3876f,0x7b407efb,0xf0f48648,0x780c6123,0xbf893039,0x2abb56ff,
  147628. 0x45a91ab0,0x9592eaa0,0x78811b82,0xce5b84d7,0x1f9f3fc9,0x86a71a34,
  147629. 0xf0e7e13b,0xc17fdd86,0x655a0880,0x88ed8297,0x81d5e666,0x75d6dc74,
  147630. 0x1d171797,0xeffc9df6,0xe3f79e1f,0x36ad4c8d,0x2046192e,0xdb15317d,
  147631. 0x274fda62,0x78c9fa7a,0x82dd9914,0x04ec924f,0x3a64971c,0x059d1e38,
  147632. 0x2620bbfb,0x3b4450ea },
  147633. { 0xc776dcdb,0x3db7a955,0x81c8ba47,0x35c4a57c,0x505760fb,0xae285003,
  147634. 0xb3aec353,0xe3e80691,0x47117be5,0x380335be,0x056ccf61,0xe1c47e3a,
  147635. 0x33977916,0x253cfdeb,0xf5cb7ee1,0x3decdfba,0x7cf4b704,0xf3c9794f,
  147636. 0x9ff81462,0x2401680c,0xbe3daa9f,0x4e440e11,0x69f91d8a,0xc5d04377,
  147637. 0xcb5e9c5d,0x4106c7a8,0x33b7d24d,0x191909a1,0x3764b4a2,0xe893c838,
  147638. 0xc429b614,0x4a7fe30c } },
  147639. /* 56 */
  147640. { { 0x2455c7c5,0xe78f3a70,0x70157754,0x5b7636e8,0x7623262c,0xf32c4524,
  147641. 0x1bc780c7,0x2c98b11e,0x915ed877,0xd48eaeac,0x199265f4,0xbb04d3c0,
  147642. 0xcfa5200f,0x6b52b19b,0x93ea3fe8,0xc46a0981,0xba758059,0xd82c733d,
  147643. 0x1896aacc,0xd324bbd6,0xce8ecd51,0xac09a2fc,0x02fc44b3,0x529918fd,
  147644. 0xaaa1784b,0xf0c45e4a,0xfe22085c,0x35626340,0xc50c7d61,0x53cbb676,
  147645. 0x65126b23,0x83fa1ea3 },
  147646. { 0x10ccc646,0x60ac86da,0x7b0451e9,0x2ce0637f,0x8a088610,0xbbbcf630,
  147647. 0x20349982,0x23c19019,0xfc0bcda0,0x707fc39c,0x1bd4fd7d,0x7f4d1f15,
  147648. 0x44713bbb,0xd6a64e74,0xc5ac9e60,0x57bdc676,0x37b61169,0x456c5303,
  147649. 0xdcf40a1d,0xd3451396,0x4997d2c7,0xf3edec25,0xc2c4a739,0x534ae9a4,
  147650. 0x6a6ad2e2,0x1401397e,0x23e95f81,0x20769d4d,0xde98fabf,0xcee007c6,
  147651. 0x931c51e0,0x61409779 } },
  147652. /* 57 */
  147653. { { 0x15156623,0x3ddb32db,0xab7a67c2,0x68137fbc,0x6f19e3c2,0x26011f50,
  147654. 0x89924c61,0x34218b02,0xc6804c1c,0x492a0b0f,0xafaae6a7,0xd65be706,
  147655. 0x0d01be61,0x3b13d23e,0xf87f4c69,0x44545b47,0x04dc1aa3,0xd42236e2,
  147656. 0x3c5161ec,0x6135261d,0xbd88bc07,0x1eb46a63,0x1599d720,0x78c6d836,
  147657. 0x69baf0f3,0xf6955fe1,0x17072820,0x467eebd6,0x3e3a340a,0x2f1b8a2a,
  147658. 0x2d0b5f88,0x636dac76 },
  147659. { 0xb4c80af3,0x94280db9,0x4e3892ab,0x9a189cd1,0xd1477ddc,0x26e702e0,
  147660. 0x68f9f14f,0xe91aee38,0x80baa0b2,0x2864f63a,0x8b714a29,0xacd81f73,
  147661. 0xc5fe7cb6,0x30e1b870,0xb10837fd,0x883ea1c3,0x6b20489f,0x2da27953,
  147662. 0x58a2da5f,0x3aeb2a68,0x03a8fa14,0xe2330bf2,0xdc70b1c4,0xb5c488b5,
  147663. 0x299678f4,0x0a78c4d9,0x25df675c,0x233bd098,0x7b67d368,0x37b5c076,
  147664. 0x4d0bef3f,0x2f6dbdfe } },
  147665. /* 58 */
  147666. { { 0x2e4da7c7,0x2f8472fd,0xae677932,0x708cfc91,0x3dc268e2,0x364af08a,
  147667. 0x799a2424,0x0f10dfe0,0x71d58bff,0xef912d58,0x988962e6,0x6bf35dfc,
  147668. 0x5f47ea0a,0x28b96fa9,0xaad308c1,0x734a79ea,0x9f437bba,0x95730337,
  147669. 0x6cf54f75,0x002cbd8e,0xe7632eec,0x47606dcf,0x53193104,0x404b5ecb,
  147670. 0x0acf729d,0x0ae0897c,0x3bddf1de,0x89628b86,0xf87d7448,0xeced154e,
  147671. 0x458d5d4e,0x5cb6e197 },
  147672. { 0x008c75ed,0x98cef197,0xf6eeaaf8,0x7cf49d3e,0x1875e96d,0x1d6f9e02,
  147673. 0xdd9b0d8a,0xfcec2cfe,0xb9576daa,0x38a61cfe,0x36a7dbb8,0x10003f39,
  147674. 0x23b814f4,0xb37c3868,0xb80e3153,0x9fb66dcb,0x059847a8,0x9e7e2eba,
  147675. 0x35a72770,0xa4ec63fd,0xfc9e0ed0,0x311f3d91,0xd515baa4,0x3c1dc094,
  147676. 0xa08cd4e3,0x75a06ebc,0x2ed5eeaa,0xab617238,0xe1f52c1f,0x2e82bbb0,
  147677. 0x5175d6e5,0x2149d630 } },
  147678. /* 59 */
  147679. { { 0x5f9311f6,0xee1a8e6f,0xbabc1f85,0xc97e3c9f,0xb494209a,0x4fa7c52e,
  147680. 0x19774fe1,0x04c2f51c,0x8555844f,0x5cefd122,0xb5873ab3,0xb53862a3,
  147681. 0xcbed19fc,0x768efdd6,0xee58469a,0xcdc12479,0x3d80c09c,0x11237e31,
  147682. 0xc044c28c,0xdd74a290,0xbd47e287,0x9ee6517a,0xad0ffeef,0xc2421228,
  147683. 0x818d281f,0x4273088f,0x43ec0de1,0xebc744bc,0xb415bd73,0x5b26eccf,
  147684. 0xcb07c26c,0x14e2f350 },
  147685. { 0x4216946b,0x548d2a10,0x7a4bd92d,0x6e801f07,0x43695160,0x5996d0a3,
  147686. 0x63a197c9,0x0f1b5c2f,0x061f77c9,0x79da3c4f,0x93ff7b22,0x1c1cd634,
  147687. 0xa234123f,0x5e61b650,0xf284033c,0x826b34c5,0xc2f34214,0x718b90e8,
  147688. 0xae806ec5,0xa5f35620,0xe324a9b4,0xa2fae345,0x8b53cb51,0x8c0bb95e,
  147689. 0xf9965778,0xc94f6ac2,0x6b9def32,0x07ec607d,0xd0ed8f27,0x63bf1dba,
  147690. 0xdcb61e4f,0x58537e02 } },
  147691. /* 60 */
  147692. { { 0x64f80ba2,0x1f64b064,0x0559a45b,0xe8e055e7,0xf1f4b634,0xc3262b34,
  147693. 0xde8c8482,0xef4f7d5f,0xc30c780a,0x9d55dea0,0xcfa1e693,0x1740afb9,
  147694. 0x7460c34b,0x2cfe6a66,0x1187c1ee,0xf6695941,0x5f974d94,0x1382f277,
  147695. 0x004549eb,0x1ca0ace4,0xbabded02,0xf8244b3f,0x4e3653ea,0xc36f4d06,
  147696. 0xc55c5f83,0xeab9f0dc,0xacebce90,0xd93b9cef,0x19061425,0x16658e72,
  147697. 0x82d7970d,0x4857835f },
  147698. { 0xd2576210,0xdcd525bc,0xd51b5443,0x9f378aa7,0x1bd83994,0xfe97bf17,
  147699. 0xf38ac621,0x930d0f63,0x818408cc,0xaf8f2c17,0x260f53f6,0x2692c87e,
  147700. 0xdb0a75e4,0x0ee45407,0xffdb1b37,0x0ec47ae5,0x7aa6a44b,0x769129dc,
  147701. 0x2e40b75d,0xb6f932b2,0x95ef3b77,0xe06764d0,0x68bc63e8,0x28fd47f5,
  147702. 0x9c0014c0,0xd1810494,0xd7995d8e,0x90e2d3fd,0x6c2a85af,0xeb39a05d,
  147703. 0xa21f3128,0x6c0277bd } },
  147704. /* 61 */
  147705. { { 0xb509e7ef,0xe41b7086,0x3d7f9f91,0x8842ec7b,0x5526b88b,0xcd285f94,
  147706. 0x051dd0ab,0x6e44e064,0x774f1ceb,0x90198c10,0x123e661b,0x6ecabe98,
  147707. 0x32f647d9,0x44811136,0x26c52aee,0x1dd82b45,0x939dc9d5,0xd650907f,
  147708. 0xfcd455bf,0xbd5eeef2,0x8d2e5d7c,0x7815a4dd,0x88bc9f2a,0x5ad4ec92,
  147709. 0x57a3b322,0xc6f10d0b,0x20b9cbdb,0xe8d0c1e7,0x9b774ee8,0x5a0b071a,
  147710. 0xf22fcf8f,0x3067bc9a },
  147711. { 0xb7ca9326,0xe0e589f2,0xb1224f63,0x17a106fd,0x747a57bd,0xb2354521,
  147712. 0x62b0882e,0x2614982d,0x4391ffcf,0x7f3af544,0xa84e440d,0x1aaa337b,
  147713. 0x941bb071,0x28ea37b0,0x2e4a7f54,0xa957dcb4,0x1a6ad5fb,0xe7ab662c,
  147714. 0xf7c36a20,0xd135e381,0x9baa0b6b,0x42e7980c,0x94e4671f,0x4237030c,
  147715. 0x8b0922e3,0x24cc63ff,0x445a589f,0xd10d5279,0xa870ff6c,0xbb99d316,
  147716. 0xa996c195,0x390c83ca } },
  147717. /* 62 */
  147718. { { 0xffc4a73f,0x50d3fa82,0x3bd53303,0x2665d635,0x264bb77d,0x80a06f8a,
  147719. 0x22d73d84,0x81c04a6e,0x0323b8aa,0x2409cff5,0x8c4c4d5a,0x31dce217,
  147720. 0x0c0f9c19,0x374aa80e,0x00186bb8,0x0b25a387,0xaaf1487f,0xd0b77a10,
  147721. 0xab498de1,0x15f39ad5,0x1aa0c116,0x92e32da6,0x96e25ce8,0x228e3dbd,
  147722. 0x5e8646d1,0xb57c88dc,0x267b1c68,0x672b1164,0x600bdec5,0x5d0d807f,
  147723. 0x223e573a,0x3ea4007d },
  147724. { 0xa595d0a3,0xd76debd0,0xaff0b3b4,0xa6bd76cb,0x9b1bdb97,0xbf2c154f,
  147725. 0x4c714c71,0x62b19ab4,0x221af663,0xc9bf33b9,0x8c941ef6,0x23d87c49,
  147726. 0xd79f0f6d,0x255804c3,0x2a7acbc1,0x6f1a1005,0x550528af,0x5dab79d9,
  147727. 0xc8d16213,0xfd77a6f0,0xde5e1029,0x40508b6d,0xf95da12b,0xd95ac0f2,
  147728. 0x758a8ba1,0x8860af71,0x7160c8fb,0x0b194c83,0xce004d34,0xa40e6c80,
  147729. 0x6b14aaa0,0x09f82a17 } },
  147730. /* 63 */
  147731. { { 0xc21366dc,0x60abe588,0xaf75daf9,0x729c0a4f,0xacb93ed4,0x70501fd9,
  147732. 0x87a16d70,0xb97e744e,0x98e7361b,0xa42e0a7a,0x28b54cf3,0x1acdaff2,
  147733. 0xb7bd9078,0xf087ccbb,0x663250e7,0xda6f3983,0xbaf07c09,0x66d693ee,
  147734. 0x8cbaf157,0x79baf4c3,0xdfca99d0,0x5a984e07,0xf26d8dab,0xab4d3247,
  147735. 0x7eba36f9,0x4d0be701,0x0e8dd216,0x37bb9e65,0x531c4f03,0x72aa4e24,
  147736. 0xb753d85a,0x77d1e984 },
  147737. { 0xd8e62367,0xd9373239,0xb9820cf1,0x3361848b,0x5a9c97c4,0x00c7e344,
  147738. 0x14f960fc,0x9a0ec9ae,0x740474b5,0xcf41f0cf,0xece065d5,0xa5eede8f,
  147739. 0x9e808610,0xb1de5a4e,0xae0cf75d,0x17c44ae4,0x6b148d0b,0x2fa56323,
  147740. 0xd29ff2dc,0x64fa740f,0x88cb212e,0xc605eb8a,0x6a863016,0xf2c771ad,
  147741. 0x607b4c17,0x6d6112e7,0x40d49785,0xfe90ec07,0xe256e0e5,0x599be18b,
  147742. 0xca54adb0,0x4e6eabec } },
  147743. /* 64 */
  147744. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  147745. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  147746. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  147747. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  147748. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  147749. 0x04ecf056,0x325d2796 },
  147750. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  147751. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  147752. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  147753. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  147754. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  147755. 0xe32a79d3,0x19d48546 } },
  147756. /* 65 */
  147757. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  147758. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  147759. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  147760. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  147761. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  147762. 0xb4e453b0,0x1b3ace6c },
  147763. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  147764. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  147765. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  147766. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  147767. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  147768. 0x192f0a14,0x538ec33e } },
  147769. /* 66 */
  147770. { { 0xa19b56cf,0x193496fe,0x7bb99acd,0x663d77f4,0x57d0a881,0x8f04afa8,
  147771. 0x082835fd,0xcced3da2,0x5d82cec7,0x7e21faed,0xf8009c85,0x6e175b99,
  147772. 0x2d05a307,0xd9c6e31b,0x81487d82,0x96948d4a,0xd46f6655,0x86ebd3f2,
  147773. 0x773ccc49,0x86851aa8,0x8b1640a6,0x3e220f22,0x41a20b75,0x9f06e3a8,
  147774. 0x90ac0a6f,0x2cfffe5e,0x8ebeb3fb,0xf5a9b1da,0x6e08e2c9,0x2587d997,
  147775. 0x03e9f401,0x6fd60298 },
  147776. { 0x8eb7516a,0x54709f8d,0xbdc598ab,0x83058a74,0x87e801ce,0xd234dd98,
  147777. 0xd17b8a96,0xfd0f9d90,0x6e90f6ab,0xaa1e549f,0x5a7ed55b,0x2496ff80,
  147778. 0x6c254c19,0x0d9f657a,0xb8962575,0x3cdea49c,0x2dff27de,0xb685a3f0,
  147779. 0xdb8bc04b,0x3c50e7fd,0x987236b0,0x904ff0ff,0xbb0d5055,0x494298fd,
  147780. 0xe14be8d0,0x34b3386d,0x7c3d30d6,0x7ad34e9c,0xe159fdd9,0x1f2b32bd,
  147781. 0xc761e5c0,0x84cfa23c } },
  147782. /* 67 */
  147783. { { 0x8b99b964,0x13bc11eb,0x58e2fc47,0x8e280c0a,0xd4c9a54b,0x870fbc49,
  147784. 0xbf6e20fa,0x37a334a2,0xd7c88cfa,0xee583d0d,0xef4af1da,0x05e029a8,
  147785. 0x0c2ef8a6,0x6d55e234,0x209e9b62,0x61b6fdfe,0xbb8e080f,0x3b1dad26,
  147786. 0x9392fc1a,0x5adbc162,0x0aae3f4e,0x02ac0fe6,0xc2bf4d5b,0x8d99801a,
  147787. 0xc282fed2,0x2333f93f,0xb52db33f,0x16dcb10c,0xc55752e7,0x09f90f84,
  147788. 0xc84a0d8e,0x287d4c51 },
  147789. { 0x0e9867da,0x5fa58201,0x1a874cda,0x614589b3,0xfbdee22e,0x005e27c5,
  147790. 0xe612bda8,0xe357fef5,0x2d3635f9,0x4e0dbedf,0x6f125a86,0x62be70e4,
  147791. 0x0d94a2e5,0xa09b9884,0x28b5e5d1,0x7eb99a15,0x751028b5,0x21b9416e,
  147792. 0xe06d2cc4,0x1b137fd7,0xfea09845,0x6fa1f517,0xffcecbd7,0x3ba1e966,
  147793. 0x832f453e,0xd4c89a4a,0xeca68fa1,0x07b1e2af,0x4bd395a3,0xd0fb4453,
  147794. 0xd8ef9e13,0x0132a3dc } },
  147795. /* 68 */
  147796. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  147797. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  147798. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  147799. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  147800. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  147801. 0xb6f8aa25,0x13cbee76 },
  147802. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  147803. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  147804. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  147805. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  147806. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  147807. 0xe02e8967,0x4e0a1ada } },
  147808. /* 69 */
  147809. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  147810. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  147811. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  147812. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  147813. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  147814. 0x9f99c999,0x733e30d9 },
  147815. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  147816. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  147817. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  147818. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  147819. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  147820. 0xb79a5c0c,0x56facb39 } },
  147821. /* 70 */
  147822. { { 0xa3018bfa,0x019165a2,0x9ffad984,0x100c6b24,0x55341a9b,0xbbf1b1f6,
  147823. 0x25dc4cc9,0xe6bd1d97,0x2bfffe60,0x52850ed5,0x7e5509ab,0x24e992cc,
  147824. 0x4ceb59f1,0xff6c502e,0x1aa7d148,0x2f0b3573,0xe7e3aa46,0xe90c1ddd,
  147825. 0xd1142880,0xbaec9f45,0x65be5dd5,0x475cfd26,0x1febce13,0x83abb14e,
  147826. 0x80942d30,0x6aba4829,0x297e82c8,0x1e1b235d,0x50d8218d,0xb771cdbe,
  147827. 0xd94d6cbb,0x88599266 },
  147828. { 0x155ccaf2,0x08847290,0x7c5b773e,0x8679ebc7,0xb2dd08ed,0xa88b2dd1,
  147829. 0x87d475db,0x960a180e,0x6694d02a,0x80fdb6b7,0x3f3f9e96,0x3e8758c9,
  147830. 0x4ad836c4,0xbda3f6fa,0x32fb387d,0x9400c581,0x2550200f,0x25a78542,
  147831. 0x776ecf18,0x2a97c351,0x566db59a,0x03ebf46e,0x26545eda,0x4743a280,
  147832. 0xcf74ab44,0xed169d84,0x88cb3f69,0xbaab931d,0xd8257196,0x70ae932c,
  147833. 0xa0c09719,0x797224a6 } },
  147834. /* 71 */
  147835. { { 0x441f3567,0x632923f8,0x2e24bf1d,0xc11c3168,0xb7671fff,0x4b97726b,
  147836. 0x7a5e1a22,0x601746a7,0x3addb417,0x53dddea0,0x7f59b846,0x57867a3c,
  147837. 0x56cd7ff7,0xb012a987,0xf19ba9a8,0x1bd5fec9,0xf8306748,0x750379a2,
  147838. 0xab8c05d1,0x7763445d,0x7903f42a,0x5d7f441b,0xa903e46d,0xc011674d,
  147839. 0xadd126c1,0x1b1d3c4d,0x61455b40,0xa2752aac,0x555c356e,0x4da42a68,
  147840. 0xd820852c,0x3ff09c15 },
  147841. { 0xf9cb7784,0x4c0a1bce,0x2422f305,0xaec539bc,0x0c414aa7,0x5f40f9fd,
  147842. 0xffd42bc4,0xd3aa316c,0x2f358e15,0x42f5a4c3,0xd6e27682,0x00bdcd9e,
  147843. 0xf8a5ecee,0x069f789f,0x05e14f5d,0x8078018e,0x8b40c741,0x2bb3e493,
  147844. 0x7917f72d,0x5dbc8c1d,0xcc57150c,0xe0eea664,0xc3fa8920,0xa25ecc5a,
  147845. 0x1c797164,0x3c21b0f5,0x634ad16b,0x8f09a2f2,0x58391d9a,0x8e730fc5,
  147846. 0x4fdfae4c,0x47ef1805 } },
  147847. /* 72 */
  147848. { { 0x3da285e4,0x9965f3d1,0x3a01e3f4,0xba7d4dba,0x61214ad0,0x4738413a,
  147849. 0x22397549,0xd3b7d535,0x5a730b92,0xa53dbdcf,0x332d165d,0x3130d92b,
  147850. 0x82f97ef4,0x44a28541,0x44dce1b6,0xbf62221c,0x7e2a0ec9,0xbba13858,
  147851. 0xcbfad998,0x33f32c8d,0xb5fed44b,0x409e5f3f,0xc66217bb,0x5c328c65,
  147852. 0xfcdf71a9,0xb00db69f,0xb8920788,0xa23c2a21,0x3ae6464b,0xf8ab28e6,
  147853. 0xb8de0861,0x1a6b6e9c },
  147854. { 0x06af77aa,0xaf6ec2b6,0xa887f065,0x2e60f5cd,0x9f498c56,0x87d21400,
  147855. 0xfcbaaf4b,0xdb595b59,0x271ab855,0x0fb592a1,0xd4349b0c,0xa0ce10e5,
  147856. 0x887d8c9c,0x9d6187d8,0x154bd6db,0x03ee95f9,0x5d06c999,0x8fe53213,
  147857. 0xfb6a64d0,0xf4a7bc30,0x66a4cb60,0x3d22af0d,0x5d37367c,0x16952cef,
  147858. 0x997d8e55,0x6f0ea734,0x731732d0,0xb447c70f,0xa9cb3942,0x00ab3034,
  147859. 0x28510fd0,0x79dd0180 } },
  147860. /* 73 */
  147861. { { 0x3ac7424e,0x04e0033a,0x60fda4d0,0xdb06b688,0xbcb772fb,0x236a9766,
  147862. 0xf297cda4,0x294a8e2b,0xdb013c6e,0x4b0aab85,0x8723a3ad,0x3d2aec98,
  147863. 0x13c84a6b,0x0cae32cd,0x70ec169e,0x21888f5e,0x42a88262,0x739633bd,
  147864. 0x7b60d9b8,0x68ac792e,0x10769fe1,0x89f2b722,0xd24bed34,0x8f3fcfe6,
  147865. 0xa3eb24aa,0xd35efb88,0x484c706b,0xddecfa3f,0x929ece0d,0x7cc119a9,
  147866. 0x8d405436,0x87e5ad45 },
  147867. { 0x7d1000a7,0xba99aa9d,0xae823833,0x8b94affc,0xdfb83dc5,0xc8229628,
  147868. 0x845a418d,0x2f59fe11,0x5d417054,0xa8b970f8,0x72b71581,0x8918c265,
  147869. 0xc0d1dd17,0xe4ef477d,0x3afad7c0,0xb50b4cf3,0x01870a5b,0x21baea79,
  147870. 0xbb3a2868,0xc77087f9,0x124a59cd,0x7857531e,0x57f43239,0xed74c26f,
  147871. 0x0164c94a,0xd5f5ae25,0xf094bf74,0x6608b7e2,0xfdceea32,0xf4cdb5ba,
  147872. 0x990cc045,0x0b712519 } },
  147873. /* 74 */
  147874. { { 0x88d5c64d,0x5a290ca1,0xa7492534,0x0596d749,0x2a00e925,0xa04b0d3d,
  147875. 0xcaf7b66b,0x082cd02c,0xecdded83,0x912b50c2,0xff31646e,0x813ce9de,
  147876. 0xc75fff95,0x62ae70c7,0x7e2a4615,0x6f6852e0,0x03804fd1,0x320fd7d0,
  147877. 0x8218e8d9,0xb1a2a4dd,0xafc645d7,0x4918a6fb,0xe8d9fdbe,0xfb080fa1,
  147878. 0x4470b6ee,0x33d4d08a,0x6d974ef7,0xd2ba2077,0x69dae5d2,0x8ecb95a7,
  147879. 0x7d69596d,0x7a3f423a },
  147880. { 0x9a929387,0x362d2ca6,0xcb1c1fff,0xabdb7581,0x7e51b6cb,0xd892ec9f,
  147881. 0x3a4e131f,0xee8d8632,0x5bd87561,0x4680e3f1,0xd4e7e732,0xe3a597e1,
  147882. 0x5581fefe,0x3cc72b7c,0xca8cae0b,0xf3e77f8a,0x5e2fd4af,0xfcc7d7dc,
  147883. 0x21355b79,0xdd3a4552,0xa2c07177,0x546b24f2,0x0689621f,0x415b532d,
  147884. 0x3f78163e,0x2be9af51,0x33d7ed21,0x27d63b9b,0x96802943,0xab019ef2,
  147885. 0x1623faf4,0x2da5fc55 } },
  147886. /* 75 */
  147887. { { 0xc8a5c600,0x62429cf3,0x3fe33e7c,0xa7a80c22,0x0a57ddcb,0x9ffda740,
  147888. 0x925b0c74,0xd1ae156d,0x6b100eb0,0x097a43f9,0xef943c81,0x169e945c,
  147889. 0x1128cf24,0xa1f734e5,0x419f0133,0x04387c4a,0x01044024,0xc007868b,
  147890. 0x90359cf2,0xe5416abf,0x478d54e3,0xf9c76fee,0x42a2173e,0x66219da6,
  147891. 0x9fe30141,0x61e03156,0x93ef247e,0xa0ff5ce3,0x072b6592,0x811792ba,
  147892. 0x70c854d3,0x855f0219 },
  147893. { 0x847314c4,0x61fbfb6c,0xeb45b96a,0x97906155,0x6ba2afac,0x7102e146,
  147894. 0xab949781,0xed51f975,0xc110c4fe,0x9d2f5b17,0xaff57667,0x7ac8ce70,
  147895. 0x6eb244e7,0xe7366a21,0x551c65c7,0xdd1bbcec,0xe1a859de,0xb525060a,
  147896. 0x8ba7d2e7,0x7a048174,0xab8ea8c4,0xe1a2c541,0x6fdff078,0x6e7824c3,
  147897. 0x14874b04,0x79b49fc7,0x06b1f733,0x22ae337f,0x6f8fe6cf,0x1c352192,
  147898. 0x525d0797,0x292236cf } },
  147899. /* 76 */
  147900. { { 0x7d8b29dc,0xcdb8d80a,0x08ea648a,0xd17a2024,0xae92be91,0x7db12c5e,
  147901. 0xfda72fbc,0x1f347d18,0x9e760c6f,0x11374b40,0xd8e38d91,0x7361e8f1,
  147902. 0x739ac1f4,0x7714be9d,0xb4df5c4e,0xc1f9701c,0x6f72cae1,0xd9138ed8,
  147903. 0x6ad180c4,0x1c7fe1f7,0x9e2dbf9c,0xf8c185be,0x7c70c44d,0x835db269,
  147904. 0xb0d15b5f,0xf997cfea,0x61e6545e,0x5101445a,0x25184e5e,0x16b06884,
  147905. 0x7521e7aa,0x7cfac359 },
  147906. { 0x3c0bc53a,0x81182167,0x7e751367,0x84b5ede3,0xa3657a18,0x3ca255fd,
  147907. 0xba1fdd98,0x096abbf4,0xc5da77d8,0x9ce8369f,0xaab342c5,0xf27b9ae7,
  147908. 0x972059f1,0x06c91bd6,0x914ecfe9,0xee0dab30,0x93f53f12,0xbb647fbb,
  147909. 0xffa57e0e,0x30c38a7a,0x9f2ad607,0x517d06ef,0xbb99dcc9,0x49728d87,
  147910. 0x446080a1,0xb0034af1,0x12b9c17d,0xcc810c3f,0x772a22a0,0x7225f14f,
  147911. 0x1ddf82bd,0x6ce3dc7f } },
  147912. /* 77 */
  147913. { { 0xa4397830,0xc07cd835,0xf4733306,0x4dd9290c,0x29989e8c,0xdd35d3a8,
  147914. 0x563d8152,0x79902559,0xe87de61b,0xf278d911,0x1024e35c,0x9c7340c7,
  147915. 0x4a0d0e59,0x2d444461,0xf32626a1,0x63e7608f,0xc4c9baa9,0x627a37e9,
  147916. 0x76fffd25,0x0c56dc51,0xcef2a1cd,0xcb6defc8,0xefc559d9,0xcbcc0d56,
  147917. 0x041cb692,0xe45f3fc5,0xe5161e09,0xcd05c239,0x5c3b559c,0x2a731ee9,
  147918. 0xa3d0a16d,0x85151122 },
  147919. { 0x86ff19e2,0x782d0335,0x1da28603,0xc2c60daa,0x557c7eed,0xb2e78cfe,
  147920. 0x1bc4e8b0,0xa8f6f984,0x3df35c67,0xcc1f9b4b,0x4764462a,0x96e13603,
  147921. 0x7c7ae0b0,0xbf910b97,0x51435956,0x27c7f305,0xf631eae5,0xc14db15c,
  147922. 0x7e69b34c,0xa51d6142,0x5fc12ff2,0xdec82851,0xfb887162,0xfcceae13,
  147923. 0xde1488bd,0xda332ac1,0x2ee3e74c,0xa20374e2,0xf0ae069c,0x597ea1a1,
  147924. 0x77bdec04,0x8b1159f2 } },
  147925. /* 78 */
  147926. { { 0x2f961d30,0x4af71a44,0x7ac7248f,0xbdf968a8,0xb1a906cd,0xd32df87c,
  147927. 0x04abf925,0x00c10e26,0xb9f04d4c,0xb8711759,0x939705da,0x00d54e60,
  147928. 0xc9f80849,0xf7587433,0x6a7a2375,0x2e9abade,0x94ac17ac,0x5676d478,
  147929. 0xc202d99c,0x4ca0525b,0xabfae73d,0x95b8bcad,0x3405991b,0x2371ed38,
  147930. 0x458a99c3,0x2b69e47a,0x2b78c866,0x7cac0b18,0xe0232c7c,0x6ceaa79b,
  147931. 0x588f7459,0x0bd86433 },
  147932. { 0x7e734189,0xdea1a8b4,0xcfe5fa17,0x52c5ac88,0x11437664,0x444a4d4e,
  147933. 0xaf9e9750,0xc2522308,0xd30c6b3b,0x78b1d0c3,0x4c6df477,0x2edae5f0,
  147934. 0x2ee88dd7,0x53131d9a,0xacc93e34,0xc4e380ee,0xa8db0e8e,0xd499b1ac,
  147935. 0x7f5d49d7,0x77348c16,0x1556ccd7,0xc9663257,0x2611d13d,0x65ce0e8c,
  147936. 0xb5a2fdcc,0x2c95fe66,0x8658faa1,0x26698832,0x31c32c98,0xda87d1f4,
  147937. 0xfcd91907,0x46650598 } },
  147938. /* 79 */
  147939. { { 0x6b4a5efa,0x4c6c13cc,0x1d07b265,0xc481989b,0x8bdc69c0,0x10b966ce,
  147940. 0x2c2531d4,0xf54cfaa2,0xcad0a100,0xcb5f1808,0xee5da449,0xbeb52538,
  147941. 0xbedd83cc,0xa6240085,0xd6255c78,0xe792dacf,0x2062058f,0x88371906,
  147942. 0xed1658c1,0x96615e83,0x7d28d542,0x4b549b27,0x83b75df3,0xeaf127db,
  147943. 0x17fbb942,0x4f60df6d,0xf6f7c930,0xd08631db,0x6018789f,0x17c38f98,
  147944. 0xb9a9280c,0x0c43574a },
  147945. { 0x1d20cad0,0x76eb324c,0x8c61108a,0x90decb09,0x6f06d36d,0xa6e9d39c,
  147946. 0xbc0da197,0x6cd978ba,0x507ac5ce,0x5948b1c0,0xc5497eb5,0x2bd47164,
  147947. 0x4d5914e3,0x2a9c4c0f,0xa759f03c,0x772c5046,0x69ac847e,0xe7d7328a,
  147948. 0x3048b330,0xa8d57d0c,0x40f7bace,0xe60034e0,0xa85f1790,0x823d9193,
  147949. 0x5c859736,0xa6e9b66c,0x679e1022,0x22ca2c7a,0x09023fa4,0x00e7a19c,
  147950. 0x2726d5b9,0x324999f1 } },
  147951. /* 80 */
  147952. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  147953. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  147954. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  147955. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  147956. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  147957. 0xf18c2b91,0x57ea2b4b },
  147958. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  147959. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  147960. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  147961. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  147962. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  147963. 0xea7935c9,0x60480b46 } },
  147964. /* 81 */
  147965. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  147966. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  147967. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  147968. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  147969. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  147970. 0x9a8f88cc,0x0774a0d3 },
  147971. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  147972. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  147973. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  147974. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  147975. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  147976. 0x2432014b,0x08151954 } },
  147977. /* 82 */
  147978. { { 0xfb7b2108,0xf9236d89,0xad75f9aa,0x3ecc83cc,0xb4e1da11,0xf7c72b15,
  147979. 0x0315c362,0x552aeaef,0xf272fe3f,0x11e140ed,0x87843ee8,0x99d79bf6,
  147980. 0x1d9bb25b,0xce6b54fd,0x5b1bad74,0xb20b0e21,0x5b84c90d,0x54a0214f,
  147981. 0xfca6cec9,0x459bbf52,0x9e4df76f,0xe363c48d,0xd64cf17e,0x3045f84e,
  147982. 0xf62ada48,0x8402a167,0x6a74ca01,0x2c9e1bf3,0xf691c42d,0xe8cf9d41,
  147983. 0xc2c4b874,0x5abf2178 },
  147984. { 0xf3b3bccd,0x4777966b,0xbe3e0caa,0x0047e0f0,0x8c7d5043,0xcb8383b3,
  147985. 0x946fd5fc,0xe77e3baf,0xe9ec0e87,0x79baa785,0xc8a18d25,0xd83c557c,
  147986. 0x25befcfe,0x9b96e5af,0x98c71b61,0x4f05d15e,0x77e62da1,0x081f991a,
  147987. 0xcbaa3821,0x1c6ec781,0xe54d9bfb,0x7522f65d,0x44ed1430,0xf5d05573,
  147988. 0x95cafdda,0x3035b31f,0x6378f5bf,0x47e67f43,0x5270b9d9,0x029f7cad,
  147989. 0x4d916a48,0x15ad1587 } },
  147990. /* 83 */
  147991. { { 0xaa588ae4,0x00de2ece,0xa371a232,0x552ebc58,0x71230444,0xd00ea934,
  147992. 0xe4b1832d,0xafbfa67d,0xb689e843,0x29216341,0x61f4e2e8,0x1f96bbbd,
  147993. 0x04c29dc5,0x95420684,0x42317fd1,0xc7fe3827,0x63483162,0xe0a0aec6,
  147994. 0x0700184f,0xfc2b94d1,0xfe1fbd85,0x07219973,0xfb074352,0x648b6ab1,
  147995. 0xc46e5392,0x23bbdaad,0x00fa56ff,0x0db8dd1f,0x866725f6,0x104815eb,
  147996. 0x52e81963,0x3f9c4cca },
  147997. { 0x32ce637e,0xff36b297,0xf5d25cdd,0x81a15f2d,0x8b02ad97,0x1a1d052d,
  147998. 0xcfbab3e9,0x2e5f3bbc,0x614eeb75,0x60d2cbd7,0xcd5a793a,0xd4491843,
  147999. 0xcdba2144,0x2242cf75,0x88b99766,0xa20705e7,0xec77e132,0x64e12cc0,
  148000. 0xb61a9b05,0xb1c14df6,0x74825b5a,0x8fd97f04,0x3da31223,0x95604821,
  148001. 0x4d30c70d,0xde486727,0x1c12ee69,0xbcab8f15,0x668d893d,0x5dc638b4,
  148002. 0x223f574b,0x6479dad6 } },
  148003. /* 84 */
  148004. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  148005. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  148006. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  148007. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  148008. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  148009. 0xf0860497,0x1fe09f94 },
  148010. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  148011. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  148012. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  148013. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  148014. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  148015. 0xdb62526a,0x4de95786 } },
  148016. /* 85 */
  148017. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  148018. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  148019. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  148020. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  148021. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  148022. 0xe636980c,0x1c94418b },
  148023. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  148024. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  148025. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  148026. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  148027. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  148028. 0xb55235ba,0x611bfbb2 } },
  148029. /* 86 */
  148030. { { 0xf00ad2a1,0xbdbaa55e,0x14a290d7,0x29efa85e,0xe92b1694,0x3b4a4768,
  148031. 0x11ec8130,0x67111bcd,0x88bd27b2,0x0e425702,0xd9a03c06,0xf28cf2a3,
  148032. 0xf318884a,0xbb7c8d2d,0xe3aaeb20,0xe2ea1462,0x43b85d77,0x33535804,
  148033. 0x554ee9bd,0x81ee4482,0xe6aa198f,0xeb2eee9e,0xc26c5944,0x7a5aa804,
  148034. 0x82ab167c,0xa0ef2da5,0x02fe21a5,0x5a2ab476,0x3370298e,0x169cb3b8,
  148035. 0x0eb3aa8d,0x86e6c544 },
  148036. { 0x0b793d9b,0xede03321,0x1ddb5ece,0xf79fade1,0x68930b64,0xf73fda92,
  148037. 0xfe4fd1b2,0x06aad97d,0x92a4dc88,0x073a5b1d,0xbc976d75,0x8af8cbd8,
  148038. 0x63ce26c0,0x60b4abb1,0xdcb1fb06,0x9c8300a9,0xda95b3d3,0x335a594c,
  148039. 0xb37eac87,0x1f97d7d4,0x20eefaab,0xa3d2eba2,0xf3e828c8,0x3258c906,
  148040. 0x85ab7781,0xc832616f,0x8c28b617,0x72597192,0x3233b82d,0xcd7196bc,
  148041. 0x19fa126d,0x83867eb9 } },
  148042. /* 87 */
  148043. { { 0x22474edb,0x774fe73e,0x1a84e1ae,0x2a766394,0x9c6dd6e3,0x270329ad,
  148044. 0x14f8bf5d,0x00c4a415,0xd2267b90,0x3ce2ea37,0x11d24fae,0x12753015,
  148045. 0x263a1b78,0x7c14d854,0x1ae0b206,0x20c8401b,0x081f49fc,0xf32a011b,
  148046. 0x959c6df8,0x1e8123fb,0x800e1d06,0xa328dc7c,0x24259a9a,0x5876a378,
  148047. 0xb7ef6c37,0x23ada8b5,0xa93d4c9f,0x023f6b6e,0xffb6389f,0x89f5414d,
  148048. 0xe628b39e,0x4b26bba2 },
  148049. { 0x5d318454,0xd30b1cb4,0xd7436cb6,0x123b749f,0x568a7461,0x3110c726,
  148050. 0x1c84fd1e,0xc85de123,0x08403d55,0xa5f8d6e6,0x9b1fabf8,0x395b6e13,
  148051. 0x3cfedce0,0xfe6d68c3,0x94b91110,0x1d90381f,0x2dcc6eb7,0xf0a8ea81,
  148052. 0x7e90ca2b,0x59e80413,0xc8a25c5a,0xbeb5fc07,0x5d84663c,0x009c253a,
  148053. 0x910b6a7c,0x00b15073,0x4108f8d5,0x8607da4c,0xcb901e65,0x02c3d9c3,
  148054. 0x2c9615c6,0x4d697bc5 } },
  148055. /* 88 */
  148056. { { 0xefa8fb40,0xe0db1ef0,0x5ba3989c,0x29021c5b,0x809d19df,0xa8d6fb15,
  148057. 0x4c1219e1,0x6b787b73,0x14ef05e2,0x6417e168,0x8f9796e2,0x449342db,
  148058. 0xbf84421b,0x2f878a5e,0xe94a4536,0xe71916d7,0xae119693,0x9818bba3,
  148059. 0x5768804e,0xec674be9,0xf8424f8a,0x0a26074c,0x466ce6ab,0xdbc93b9d,
  148060. 0xc920078b,0xb3f15a98,0x3870f1a3,0x9d10fd0d,0xe4e785a7,0xa61241d9,
  148061. 0xe6c8cd80,0x76ca87a1 },
  148062. { 0xe02e48b7,0x4357fb56,0xcc09e9c6,0xfbd14b13,0x24069cf0,0xdb5f2435,
  148063. 0x2c3b01a9,0xf878165c,0xe6956dad,0xe549e7c4,0xbbd60b68,0xf2fe9538,
  148064. 0x059dc653,0x952f856b,0xb377fe9b,0xd3f60225,0xbfe908c4,0x6a0c7328,
  148065. 0xbc8f5f2d,0xce6aa2d3,0x24425050,0xf7213443,0x3d3b3ce5,0x17e1266a,
  148066. 0xc1677512,0x75b5e43f,0x37fb894a,0x15927062,0x2be3e375,0x15260753,
  148067. 0x6da3b7be,0x27e7f2c6 } },
  148068. /* 89 */
  148069. { { 0xe6a15883,0x638f65ad,0x66afdb33,0xd4a7e68c,0xd3f12de5,0x6207b6ab,
  148070. 0x37b87810,0x1c6ff950,0x64acf6d3,0xc0d44cb2,0xf2be78c2,0x163ac601,
  148071. 0x1636980e,0x1c63cc5a,0x95c9349b,0x3e92cfe8,0x41ec7220,0x7738e0d8,
  148072. 0x2d5fa961,0x6169d764,0xc3e028e9,0x2aa776c1,0xb16d5409,0x93dc5646,
  148073. 0x706df4d9,0xa0b27fb5,0xce9c6b97,0x9e991170,0x53c85f40,0xea8e42be,
  148074. 0x83246528,0x02e96437 },
  148075. { 0xae78ea1f,0x91540add,0x7b670e96,0x51a1b74d,0xf7006826,0xf9936441,
  148076. 0x7d7520c7,0x8f97d6ea,0x69ce12e1,0x0faa6a02,0x79208342,0x2590aca8,
  148077. 0x75614436,0x7a483863,0xf381408f,0x07c6149e,0xd7853406,0x733bf584,
  148078. 0x9abbb6f7,0x8761b010,0xf528a09a,0xe4eb249f,0x2e00ae3c,0x08781ed8,
  148079. 0x2178effa,0x864c1b25,0x9d513a7e,0xcc1e62a2,0x1919062f,0xedb8b94e,
  148080. 0x4f16527d,0x739f53da } },
  148081. /* 90 */
  148082. { { 0x924adc5f,0x7a5f4a88,0xa818f56d,0x95646c16,0x7795f954,0x0ec49129,
  148083. 0xd19c5400,0x2b48753d,0x205912b4,0x16fa236b,0xe87a4946,0x6b3d65f3,
  148084. 0x045fd066,0xa7174a01,0x12a5e140,0xb6350313,0xa96b8623,0xa79c4b44,
  148085. 0x9ab003d5,0x7a339d65,0x3826f31a,0xc72f30c6,0x6f7090cd,0xb4e7390c,
  148086. 0x906ebe24,0x59ac6c36,0xbba4505a,0x39a7f06d,0xc58c413a,0x839991e1,
  148087. 0xa20e0e84,0x020c23ff },
  148088. { 0xafc74661,0x120e4ada,0x277fc065,0x37bbcf63,0xb6dce799,0x41049cf6,
  148089. 0x7b161ba1,0x5b8d6b53,0xa9610fb2,0x22218431,0xdfdde769,0xde9ec9d1,
  148090. 0x42d80630,0xd32bfa4d,0x6244df4b,0x3885702a,0x45592dfb,0xcdedd1ed,
  148091. 0xfb4e01b8,0x0e1df45b,0x86e215b0,0x8f4bded2,0x6a937e6a,0x80935487,
  148092. 0x8130f723,0x415278ba,0x38a821f8,0xc6dc4692,0xfd8b4f8a,0x2207b119,
  148093. 0xf9269cef,0x76e7bf53 } },
  148094. /* 91 */
  148095. { { 0x27ebd187,0x5f128428,0xb65aadbb,0x8d3320ab,0x72258695,0xb042765a,
  148096. 0x8f0986ab,0xda3f33f9,0xaebff503,0x411807a7,0x825f71a5,0x25c776ca,
  148097. 0xff7df24b,0xc0de7bed,0x165f1fb4,0xda8b0f42,0x731f3ae3,0x5f3ff737,
  148098. 0x193e0a52,0x4cd1d7e7,0xb6b3ba46,0x8df84aa3,0xaa1f3782,0xba84b897,
  148099. 0xe7733ac7,0x6e7960cc,0x50981a21,0x4d46d6ab,0x7cbb80ed,0x1ec12c25,
  148100. 0x2b96ef09,0x79e7ad27 },
  148101. { 0x8f30caae,0x3cd970dc,0x0a6ebef4,0x85cabcf1,0xc714616d,0x63c1863e,
  148102. 0x519e3a98,0x1c50db0b,0x64cb13d6,0xf39b8963,0x22547b69,0xdf67d81f,
  148103. 0xd67db0cc,0x7157abb9,0x889491b7,0xccca25ba,0x7a27e0dc,0xf689207c,
  148104. 0x0fd43281,0x34ae8fbe,0x5720ec09,0xa5d91f73,0xcdfd7bed,0xb2f61909,
  148105. 0x4a039e32,0x1ec10232,0xdb0d8fdc,0xd3c3d65e,0x4fe5005d,0x32c916c8,
  148106. 0x4c0bea94,0x7f8c37ac } },
  148107. /* 92 */
  148108. { { 0x43ac05e5,0x33ec1e54,0xcd8d3825,0xda4a4da4,0x88bf9e2b,0x86d88c0b,
  148109. 0xb53811dc,0x34d71dd0,0xa3c3aba4,0x655040d2,0xb61611be,0x2bc40949,
  148110. 0x279a4fa0,0x1c2d426e,0x3b065ac3,0x535a5aa2,0xc52ea890,0xdaa8a32f,
  148111. 0x9fddad22,0x5a5deca7,0x2ab3b26f,0x911f05fd,0xf37cd81e,0x5dace7db,
  148112. 0x90d16b8c,0x0e0e44e7,0xe4f5894e,0x15e68aed,0xfc92a74f,0xafe04999,
  148113. 0x970e7c2f,0x1d7703aa },
  148114. { 0x3f0062a9,0xa8a4c81d,0xd96a20ba,0xe31eb2b8,0x864bd101,0x66dd98df,
  148115. 0x4413b614,0xba05f592,0xe9a555f8,0x51a67a0d,0x2e4b52d1,0xacc2f097,
  148116. 0x7184ab23,0xab5daaec,0x7c7f691b,0xce08b43e,0x76c427f4,0x520e530b,
  148117. 0xe423ebdc,0x7d352069,0x34df14ce,0x6b5e39e8,0x446305ac,0x3dcbf295,
  148118. 0xfe34cdc1,0x682cb2e1,0x111f5afb,0xd4ac45d1,0x47f296f9,0xc5ef63cd,
  148119. 0x93c20871,0x0a2c40ec } },
  148120. /* 93 */
  148121. { { 0xaf5747db,0x09bc384f,0xc06ab86b,0x3bad6086,0x9e7c1547,0xa406882e,
  148122. 0x55977abf,0x2d5326d1,0xda81deb0,0x063a9a05,0x524b6111,0x9a86e4a7,
  148123. 0x4ab2eb90,0x1402f87a,0xd5c600ba,0x7d0721d4,0xf289fdbf,0x1a2fd9a9,
  148124. 0xecde6f07,0xf5dce66d,0xdab9fa73,0x62171277,0x6c474bab,0x6d2dc49f,
  148125. 0x76eed033,0xdc017e1f,0x4da825d3,0xb97175c0,0x54b05e43,0x6c297e3d,
  148126. 0x56c9c87e,0x2efb4546 },
  148127. { 0x8b21c064,0xa4712b00,0x4a70629e,0xd186fe42,0x9b74f0af,0x6435b340,
  148128. 0x7ec9e629,0x6965aa43,0xc4c60d08,0xdda14673,0xbf3057aa,0x0b656670,
  148129. 0x3ce86f60,0x7f05e840,0x04401a16,0xc05073a9,0x294e607e,0x16b1e638,
  148130. 0x69cf7046,0x20783252,0xe8ce7d3a,0x2941141b,0x7577053d,0xd38ad8d3,
  148131. 0xcaa6630d,0xdba68fb3,0xe9504350,0xecbeaff1,0x1d2d760b,0x9f5166d5,
  148132. 0x462891e4,0x337532ce } },
  148133. /* 94 */
  148134. { { 0x3a00bb9b,0x3f111853,0x45f66685,0x2d2ffbae,0xd4aee24d,0x9ae11a85,
  148135. 0x0341856e,0x18ba1e1b,0x2731349f,0xa9ac8178,0x545715b5,0xc13dfd4a,
  148136. 0x5daad2ea,0xa5f7423c,0x535b76a7,0x30a483b9,0xff873e9b,0x92e9ada4,
  148137. 0x723a1055,0x15662d84,0x8edac4e0,0xb935497b,0x39d8fa70,0x61b6441a,
  148138. 0x40d1589f,0x1541d756,0xf0a05f0a,0x62994237,0x6bb28908,0xfd8b0034,
  148139. 0xd4cd32bf,0x192a2b5d },
  148140. { 0x365ced07,0x63576628,0x05de1d1f,0x029f32fb,0xbf40a7aa,0x6d17b9bc,
  148141. 0x9bb50a47,0x1b1b2a08,0x795a6278,0x9389abbb,0xb34fc19b,0x52cff60f,
  148142. 0x387d8739,0xf3ab9492,0x6920ccd6,0xa8f053e6,0x63a9b4f0,0x3ef2dd4b,
  148143. 0x51e82129,0x9ab0ede1,0x0838bfa1,0xafba0c0b,0x9ffc11be,0x2bd5a7ac,
  148144. 0x95cc0878,0x058bfd95,0xf8c2f0c6,0x686d48a3,0x1d9b31ba,0xc33abaaf,
  148145. 0x3bc0c268,0x632e2289 } },
  148146. /* 95 */
  148147. { { 0x15a1ccca,0x1c851d20,0x7e522bc3,0x4efe290c,0x18eab053,0x0b741d55,
  148148. 0xbc85e217,0xae656197,0x01cf8b29,0xae13141e,0x66948478,0x2e2cb593,
  148149. 0xc31bd8ae,0xeb57bb0f,0xc264e788,0xdecef5d6,0x9cb96d86,0x6fa856cc,
  148150. 0x279183da,0x2db16813,0x383d796a,0xf03f3820,0x1d0c6fed,0x58a456ff,
  148151. 0x8a6abd9b,0x25589805,0x83f96f19,0x339f52c5,0xda7e9ea7,0xcf6ded8f,
  148152. 0x5d1ccd45,0x68c3d9c1 },
  148153. { 0xe6b392b7,0x67e26265,0x775d9509,0xcec1d9bf,0xd76514f7,0xe16abcd4,
  148154. 0x0de72e1c,0xd86f59b2,0x1adfb033,0xa66e43cd,0x05e457cc,0xdb344340,
  148155. 0x5681daa2,0xb67a7916,0xf0114731,0xc32e7bab,0xd3b1e961,0x066fe16e,
  148156. 0xf63d26e6,0x924e298e,0x541add6d,0x9bea0dd8,0x9982f971,0xef9500df,
  148157. 0xc5f076ac,0x5c876e63,0xb23d396b,0x55e12ae5,0x2ec6747a,0x09efbb36,
  148158. 0x233286a5,0x8f2055ee } },
  148159. /* 96 */
  148160. { { 0xb82c1af0,0x4a4ab9e3,0xf2cae264,0xfc65e9e7,0x60187d46,0x4feaac0a,
  148161. 0xe393b363,0x27d3f335,0x819bacce,0x9c9f7c00,0xb8aa6611,0x3f7418b5,
  148162. 0x372aae95,0xffa94557,0x8db38589,0x937d7804,0x6f1fbc1c,0xd10c86df,
  148163. 0xa2f0a0ce,0x48aebd89,0x367439eb,0xae5d5fa2,0x3f17d2d8,0x103a6a0b,
  148164. 0x411d9894,0xf233f68a,0x218b67a2,0x7fece8b3,0x2319bf06,0x0422540f,
  148165. 0x340d322e,0x1292c8c9 },
  148166. { 0x0386463d,0xf5eb5587,0x0371d97f,0xd4bbc2b2,0x0b819c5a,0x1b364571,
  148167. 0xcf04ad41,0x0cbb42d6,0x66939ec1,0x5d819c76,0xa01847e7,0x8745ac13,
  148168. 0x1c7232e4,0x4f704b02,0xacb05780,0x2c9e58a0,0xb561e295,0x9523b8b3,
  148169. 0x79f9ba35,0x3384df00,0x1eaa9628,0x78231fc2,0x8aea2b90,0xa2eac54f,
  148170. 0x30d1c263,0x8075ed77,0xfb339000,0xacb44ed5,0xf011293a,0x92546ac2,
  148171. 0xeb821764,0x7c78762b } },
  148172. /* 97 */
  148173. { { 0x067902b6,0xb8f7d6fb,0xd1735980,0xb2823a43,0x59741ddd,0x062cfb12,
  148174. 0x4033f95c,0x6e391b07,0x68589b8c,0x3831d0a3,0x522290f2,0xe3474d49,
  148175. 0x222e1f3a,0x4dab14d6,0x53f08d39,0x8f00fcde,0x707f28f5,0x559917ae,
  148176. 0x068e607c,0x166aa0ba,0xd7e1f824,0x602713e7,0x4d6a328f,0x7c255540,
  148177. 0x9890cd2a,0x0d2e3264,0xeca0b20a,0xf2207944,0x52f4e09c,0x5c98dc07,
  148178. 0xd84de81d,0x69403504 },
  148179. { 0xe5407206,0xf8b7b366,0x0d88fa8c,0x1ecf54cf,0xf7272e6f,0x6fefe548,
  148180. 0x81ab4468,0xd6531372,0x4e474408,0x52cb5f0e,0x6490737f,0x9e426b3a,
  148181. 0x4980d071,0x2576c19b,0x0f272caf,0x91f34628,0x468f31c9,0x78e60a4f,
  148182. 0x90844d89,0x8776a329,0xb951582b,0x8a55700c,0x14b1adbf,0xab1af365,
  148183. 0xfbd343ef,0x22ebff92,0xb7d81f34,0x32f9fb01,0xba6b30e1,0xad850e06,
  148184. 0xbc5f9546,0x6da9e027 } },
  148185. /* 98 */
  148186. { { 0x5c9490ce,0x21eee4c2,0x0df68381,0xa96ec4a3,0xa4a9368e,0xe6c607e0,
  148187. 0x4bc262f3,0xd8b0492a,0x460c34ff,0x0846a210,0x28df33cd,0xf7ff7a64,
  148188. 0x21827612,0x10c55044,0x149bcd01,0x9d25fce9,0xcfc613dc,0x725611cd,
  148189. 0x97f51ce5,0x159f7e88,0x4e8c08b5,0x3fa3bf31,0x75e7538f,0xea156115,
  148190. 0x91c84020,0xd1e0a951,0xcf02ad0a,0x0d2268ba,0x058b8e5f,0xa04c6ac4,
  148191. 0xb3515912,0x773b40b9 },
  148192. { 0x3631cfd2,0x00ff2cdc,0x807737bc,0x14c4c2d3,0x338a5270,0xd600616a,
  148193. 0xb32cabde,0xd0e3306d,0xa70b17ca,0x336738ea,0x79f353ee,0xf2f4aa8d,
  148194. 0x576f3ad3,0x712f6ad9,0x89b2bce0,0xe4279852,0xda92ca30,0x05d8f94d,
  148195. 0xd8492dd9,0x9891d475,0x4d15e4bd,0x3e06a5ca,0x254eabbd,0x4725d4eb,
  148196. 0xc0ed513c,0x31394ace,0xbbfaae6c,0x7e0f9859,0x833fd137,0xdc125546,
  148197. 0xc56c4f75,0x12b46385 } },
  148198. /* 99 */
  148199. { { 0x932951de,0x810dbebd,0x5aa69c94,0x96959d42,0xecb2f08d,0x5fc49c04,
  148200. 0x2250b82c,0xac74f0cc,0x3aec4e1d,0x96a439a5,0x90499acd,0xc33cab9a,
  148201. 0x54d9b3af,0x2fccde66,0x3863ae8b,0xf4af285c,0x46febf88,0x2373373e,
  148202. 0x3c9ab7ed,0x751d672c,0xfe12020c,0xc1c51130,0x52f3e56e,0xad82402f,
  148203. 0xa4a64a81,0x3489ab7a,0xd9f163f2,0x0a1fb661,0x0e553317,0x17c69be1,
  148204. 0x7d88d417,0x61c1935e },
  148205. { 0x3492ae43,0x2e722d9b,0x0538f05a,0x1ef89d95,0x200aab63,0xae77e588,
  148206. 0xeba4b117,0x2872c120,0x3a461cb8,0x5c2432c8,0xcb938f26,0x315b3434,
  148207. 0x8c4c7dc0,0x05bf2ac5,0x596b378d,0xd2e501dd,0xcb890c30,0xa8506c9f,
  148208. 0x7c361f0c,0x3d0af461,0x5a35cbae,0x21f7b718,0xf3fc0138,0xbd1035f1,
  148209. 0x8b248edf,0x74628af5,0x48c9cae0,0x8d6421d0,0x2ca18773,0x75e3da39,
  148210. 0x71d3db94,0x27ad0df2 } },
  148211. /* 100 */
  148212. { { 0x305b5aed,0x9e3bda79,0x5998d6a7,0x2c67d4a4,0x0f7eb700,0xc855e1d3,
  148213. 0x147d1c44,0xc18a7e9e,0xc89540ed,0x3ea99618,0x7e6bfd20,0xa53be20a,
  148214. 0xecc14437,0xc9487e64,0x34ef85c6,0x72979207,0xd5e1ebd5,0xfa0d4e71,
  148215. 0x4d48d6b6,0xfda2b1e6,0x66e200d4,0x782a1e05,0x5a5366a1,0x2a3c70da,
  148216. 0x1a473738,0xfe3fbd2b,0x7fe020e8,0xd7ef8c06,0xeacfb665,0xec686fde,
  148217. 0x6dd1542f,0x5d9b5e27 },
  148218. { 0xcb3e472e,0x3637c5a5,0x30a1405e,0x2153d927,0xb4498558,0x009992e5,
  148219. 0xf39a0851,0x18f00ccd,0xb5c6c560,0x26237c11,0x1343540e,0x418ed408,
  148220. 0x7e7f3184,0xfef7cbf0,0xbf48576b,0xecd92366,0xbc94c91a,0x1b75be1a,
  148221. 0x4a162276,0x8e1778de,0xc5c6bcb8,0xc52e57d3,0x5ab71858,0x5cc382c7,
  148222. 0x3f6e39f9,0xe12c2c28,0xd62735fc,0x4c7e0ef2,0x835a5996,0xe071deb1,
  148223. 0xcbb8c766,0x24f891cd } },
  148224. /* 101 */
  148225. { { 0x6778c1e2,0x24ef60bf,0x00d5be5c,0xff49c03d,0x2f01a09f,0xec11986e,
  148226. 0xae096e58,0x59a728a4,0x7077984c,0xaabbcedb,0x870ca5a5,0xfb473bd2,
  148227. 0x4de30e3d,0x8c928c61,0x4f67abca,0x3fae7f9a,0xec21a9cf,0x83c2b2eb,
  148228. 0x9cd9b5de,0xafa70d62,0xc60b18df,0xadeaea59,0x4049b54c,0xd5fef7be,
  148229. 0x6dd310e3,0xfceebc76,0x8f6321cc,0x7748efe3,0x18ee8af5,0xfe9c32b1,
  148230. 0xd42df612,0x863ac3cf },
  148231. { 0xb85a2fe2,0x0a36fca7,0xee429dc6,0xf3e70d08,0x141c3944,0x8c9ba209,
  148232. 0x67272a0a,0x306a8106,0xf968bd06,0xe69a1555,0x153c603d,0xb86f7e47,
  148233. 0xef56e4fa,0x9706614a,0x98780b4c,0xc0dc36b8,0x3a1d3263,0x43657fe2,
  148234. 0x435522c9,0x01f97a86,0xedfef679,0xd91897f6,0x6daa17a0,0xebbe31d4,
  148235. 0x85accfbd,0x6f179100,0x8f9fc1de,0xe0da6e32,0xe1e7142c,0x1c9d53db,
  148236. 0x8b86725a,0x3e3f1b1e } },
  148237. /* 102 */
  148238. { { 0x7b7fbf05,0xb7ea15c0,0x1f1a3882,0x992f11b6,0xd1dcd1bc,0xc9ddd95a,
  148239. 0xad0f7e8b,0x31f5b7fa,0xfca7ab79,0x2936e5eb,0x19a55be6,0x30f417dc,
  148240. 0x43cde554,0x1f6f4e43,0x82f044bf,0x971f5e65,0x4288c408,0x73c3b8e4,
  148241. 0xb807f575,0x61aac59f,0x818b58f0,0xa64ee2dd,0x97a3b0d3,0x6f7a0a60,
  148242. 0x0394b058,0x8b85ecc8,0xbfb3517d,0x9a059474,0xa79c3f06,0x89ad5977,
  148243. 0x700a8025,0x81208ed8 },
  148244. { 0x14c4ce37,0x10935099,0xa1aa48a6,0xf34bb843,0x580d58e8,0x86007024,
  148245. 0xb375b8ba,0x6db42c49,0xed3bde83,0xac365524,0x649233b6,0x5521e1b4,
  148246. 0x64dd946f,0xbc7cc5d5,0xbfb5b6ae,0x9c14b035,0x0146c1a3,0x7f22ba18,
  148247. 0x872214f5,0x0b62fbbc,0xb4921764,0x3acfd7f7,0xcb4d6df1,0x5ff10da1,
  148248. 0x62600a91,0x660e2620,0x81d9167f,0x7ac7da9d,0xb6e7a199,0x6e8e260c,
  148249. 0x80deb3c2,0x44383fb8 } },
  148250. /* 103 */
  148251. { { 0xe44f9af6,0xe107f01d,0x8cb1fa1c,0x36381a4d,0xfb7dd493,0xe65be3ec,
  148252. 0x26a8839f,0xd0b8435a,0x3ec789d8,0xee60f915,0x2bcc5e1f,0xe25fea50,
  148253. 0x7e44a81c,0x0477c0c5,0x230ba5b8,0x349e9f83,0xde180dd9,0xdd42f32f,
  148254. 0x64a3d11c,0x8b039eaf,0xbeb7083a,0x80ef884e,0xf12742cb,0x288e60c4,
  148255. 0x720a0262,0x44156cc5,0x7253b77f,0xcd547de6,0xa6013a59,0x9829a6ec,
  148256. 0x0d548445,0x8aee708f },
  148257. { 0x32c54409,0x18f22d9c,0x75ebaac4,0xa9ebfa46,0x86284981,0x90e2e928,
  148258. 0x6b3a8e0c,0xd0201f6f,0xbd77641e,0xc973016c,0x70170575,0xf926f2f0,
  148259. 0xfec0ce01,0x4984048f,0xf319d304,0xbf696211,0xc91a88c4,0x74b5c844,
  148260. 0xe0030a82,0x4c40fbce,0xe4f6d521,0xbed67525,0x29d67d1e,0xaf7e47cc,
  148261. 0xc21d3536,0xfa307db8,0xbbb29405,0x56b6c46a,0x033e805f,0xf059a7e3,
  148262. 0x6096a5a0,0x970f61fe } },
  148263. /* 104 */
  148264. { { 0x1bec8e4a,0x1bc53d23,0x35a6034c,0x8809ac14,0x509e464d,0x4ee081da,
  148265. 0x8a488235,0x496ae1fd,0x325864b6,0xa1ae9863,0x74cd069f,0xbaca13e9,
  148266. 0xb1d8a6b4,0x3738cc58,0xe76b9da4,0x5fa71f58,0xc7eb16fb,0xc919be88,
  148267. 0xad4e429d,0xf5c8f13f,0x2499f9ed,0x4583b671,0xa10d8bd7,0xbce20115,
  148268. 0x5790bb7e,0xf66d7605,0x482b78dd,0x9316aede,0x75f855fa,0xe0d8fb2d,
  148269. 0x5a7dcca7,0x404b5b94 },
  148270. { 0x517a15c7,0xf9ee682a,0xef880202,0xaae4cfbc,0x5106a354,0xcee2c139,
  148271. 0x170febe7,0x5de60192,0x73d0c54b,0x589e39fd,0x8c9092b7,0x195c7135,
  148272. 0x0a7bfe5f,0xcb7ed53f,0xf61cc979,0x2bd9242a,0x5395f7d9,0x8d2ef16c,
  148273. 0x70b32f09,0x0d4ac1ca,0x52d185c1,0xa587526d,0x942d6195,0x2932b04a,
  148274. 0xa500b0ac,0xfe25a979,0x562fd230,0x5fa1f4ae,0x20da253c,0x60f55af2,
  148275. 0x83146002,0x7faa11b5 } },
  148276. /* 105 */
  148277. { { 0x6e402149,0xb0ba4f0c,0x963cc119,0x3584cc1d,0xa6527476,0x7740dc1a,
  148278. 0xc95715f2,0x3f77ff75,0x3f89fb0e,0xb2f234ad,0xef9be3ff,0x55159032,
  148279. 0x04237e82,0xfc9fb21d,0xa153ed93,0xeb2eff38,0x10041d13,0x89d53ae0,
  148280. 0x7f1bd828,0xcf2e545b,0x43953ea5,0xdd4a27ce,0xd85e75c8,0x00d2e5d4,
  148281. 0x241be1c3,0xeb93ed62,0x0242032d,0x1e53f25f,0xc3a4e701,0xb9957636,
  148282. 0xed98febf,0x14b63a52 },
  148283. { 0x71c43336,0x7610b553,0x23a4824b,0x19dfd4a6,0x0286051b,0x7b97a2e0,
  148284. 0x8f5f1edb,0x86abbb9c,0x9b67daad,0x67a57d77,0xcd5ffafb,0x8ace506d,
  148285. 0x89ac3c63,0x85da9f95,0x75a3d150,0x081cbaa8,0xe9346ed2,0x03353d8f,
  148286. 0xa1f9a02d,0xb2ab61f1,0x3a659c71,0xb0cb0937,0x4f5df8a1,0xb7e0e30b,
  148287. 0xeb7d5a1d,0x77c4c741,0x728e5cf0,0x8f046c9c,0xf7c171ac,0x32dd0bc7,
  148288. 0x836d2655,0x02485873 } },
  148289. /* 106 */
  148290. { { 0x75a4cd8d,0xcd40dd23,0x97bcba78,0x132ca433,0x258d61f5,0x30c5cd84,
  148291. 0xda1e8e68,0x0a7ec059,0x1d65d40a,0x07a8f171,0xf4350d76,0x869e655e,
  148292. 0x5983ae42,0xb98ce6f0,0x9d8bebd0,0x7b61391d,0xb1ba5d49,0x3a529e25,
  148293. 0x1f6b2cf6,0x46f732e9,0x3fa3b629,0xbd66ec6a,0xc3ef0ed2,0x397950ec,
  148294. 0x5f08b476,0xee9008cb,0x965a0e2e,0xfd6be425,0x1177bc87,0x78ed513c,
  148295. 0xfe512dae,0x6798cedf },
  148296. { 0x1b97c5c6,0x49e3f8fd,0x78c3b33f,0x39fbab3e,0x40f595ba,0x44274412,
  148297. 0x5d7d4376,0x174225b9,0x79c44777,0x880b3fcc,0x3296b245,0xdc3aca83,
  148298. 0x1734e184,0x55913df7,0x9c934472,0xa4db23d3,0xd1420a11,0xcebb3733,
  148299. 0xf3608bdc,0xb9d20cf9,0x30cfe13f,0xa618acf6,0x5f30874c,0x75f06b31,
  148300. 0x9f0005a5,0x506efe7f,0x01bfc9db,0x8aaea78c,0xf78e7c41,0xf9179255,
  148301. 0x52e96395,0x3ea7aed2 } },
  148302. /* 107 */
  148303. { { 0x5b06ae25,0x98617e04,0xcb5750ef,0xbcac148d,0x604c2ba2,0x91ea2f0e,
  148304. 0x76b78975,0x00c19f6b,0x651da181,0x79b9b6d0,0xc945705b,0xf3225beb,
  148305. 0x5c005bf1,0x30b435f3,0xbc24d86d,0x440b4482,0xd6373777,0x2b8f0996,
  148306. 0x1c44b4dc,0x65fd6c56,0x30906999,0xe9405ee6,0x08aa1ec1,0x19ff0924,
  148307. 0x3d2f2895,0xeef3246a,0xbc746797,0x016c3765,0xd0705f7e,0x62d2569f,
  148308. 0x05250044,0x6a8ad39c },
  148309. { 0x46be7282,0xe45f020d,0x21380f12,0x9405afed,0xd5da6ad0,0x4cdca5bd,
  148310. 0x7f8be61e,0xc2d6f184,0x596b8178,0x20132953,0x7a8df954,0x8d3b1e7b,
  148311. 0x39572b4d,0x757c61bb,0x80cc3b56,0xd749b57b,0x37b3ffec,0x9590ff93,
  148312. 0x145dc94d,0x39bbb653,0x2335e573,0x70c1c606,0xf763feba,0x9c2e72d7,
  148313. 0xcc61b732,0x4768e424,0xaa73f2ca,0x777d2fa6,0xc5cb58cd,0xdee4dbaa,
  148314. 0x9cfae1aa,0x1a181179 } },
  148315. /* 108 */
  148316. { { 0x77575ed0,0x6f6ff62f,0x7d1da99b,0x18f14fa9,0x69efd7f6,0x2e72aefb,
  148317. 0xddc28633,0xc45ab4cb,0x586c5834,0xb0e20d48,0x39775dd8,0xd397011a,
  148318. 0xf4134498,0x0130c808,0xf5115ed8,0x2d408eba,0x0260ded9,0xc506a05c,
  148319. 0x19cab911,0x9e5b7362,0xe8693a86,0x4cf508c6,0xcc773617,0x4e71245f,
  148320. 0x95d89ca3,0x2f71aa1f,0x607bbc98,0x4bba7c6a,0x212b7fd2,0xf3a515e7,
  148321. 0x9230f5a8,0x7d2ddc75 },
  148322. { 0x4ed2cae8,0x3d05816d,0xb9c00377,0x4cf6bc7d,0x646b08d4,0xc23e98e6,
  148323. 0x4b9c0180,0xf9ee6c61,0xef9179c1,0xe11c9a13,0x8ed9688a,0xa5b6147e,
  148324. 0xd06670a7,0x7afeb648,0x17685275,0xd670333c,0x75f9e8f2,0xa89dd969,
  148325. 0x37a68ade,0xbb57228d,0x454cb186,0x21a05d5e,0x063dd550,0x4810158f,
  148326. 0x4cb6caf3,0x92dd4f08,0x7854abe7,0x70c4d852,0x6e729d76,0x845969dc,
  148327. 0xb1bf40ba,0x5a52f87a } },
  148328. /* 109 */
  148329. { { 0x09ecacbd,0xed019e91,0x7b89bdea,0x6544023d,0x5707371e,0x7cc51f0b,
  148330. 0x16c8e217,0x14832b04,0x81259ab5,0xb1aa6682,0x23e361d4,0x6e100f92,
  148331. 0xe3a95c2a,0xe593eee9,0x16c10e26,0x699b6bbd,0x9473a13f,0xad487873,
  148332. 0xb274987c,0xf1c14dc5,0x2559e2e9,0x57dc0075,0xc3d47ad2,0x8449849d,
  148333. 0xdd527793,0x83df278a,0xeefd5b99,0x770e3ec8,0x76bd02a0,0x2ae58446,
  148334. 0x3e705ffe,0x17f02764 },
  148335. { 0x29abea1f,0xdda4010d,0x2407ac4c,0x636b9695,0x0433218b,0x96a60129,
  148336. 0x163d534a,0xf221fc3b,0xccc20565,0x05ba15be,0x96285577,0x1238e54d,
  148337. 0x878804d3,0x1b144257,0xa89a9fe4,0x96fbf304,0x4be642b1,0xc8a7f06c,
  148338. 0x6e2b085e,0xdd1a20e8,0xff4a591d,0x8f7f27c2,0xa4a343b8,0xc17b0753,
  148339. 0xbb173d4d,0x684b1e88,0x3dc07bbe,0x3accea44,0x4c441d77,0xdb15c88d,
  148340. 0x53e5957e,0x0ef0309a } },
  148341. /* 110 */
  148342. { { 0xfa8e5b60,0x4fc25721,0x691c0bb2,0x646938ad,0x0b0a2248,0xe46d4b76,
  148343. 0x7de16877,0x863f9ac2,0x2721c630,0x503bb6ef,0x0b67fb02,0xf8c199df,
  148344. 0xe07abd39,0x78c1ed72,0xb32f0dda,0xcf9deb7b,0x6c3c89f3,0xaff726f0,
  148345. 0x1972225a,0xb7008b2d,0x4f145f5c,0x8f5a6117,0x457c4f37,0x4e0e6f8c,
  148346. 0x1c453c64,0x8bbdaa44,0xa6e92c80,0x57be326d,0x5d773561,0xa9bc3fd9,
  148347. 0xbb37b72a,0x3d3b6cc6 },
  148348. { 0x9722c880,0x6e6f12cc,0x286b6889,0x3a1b6ae7,0xad2fafec,0xba1cc09b,
  148349. 0x43bb8bef,0xad64ad7a,0x97c3f4c3,0xa5af6a00,0xc353a91b,0x2afcb0d9,
  148350. 0x69ccbf6b,0xca13fcab,0xf2abc190,0x699a1391,0x23a247e5,0x2dbd5542,
  148351. 0x95488d9a,0xe206180f,0x1244cc3c,0xba9e7bff,0x87d3a365,0x29297abe,
  148352. 0xfa4ca5e2,0x4054fa38,0x67be1b6c,0xb390623d,0x78f41a44,0x1fa67c57,
  148353. 0xc7b544e7,0x2e946e43 } },
  148354. /* 111 */
  148355. { { 0xc60934ae,0x2980fddf,0x164206d1,0x2c3e7eff,0x416ed75a,0xf75e7f96,
  148356. 0x5cd0b2dc,0xfac60cf3,0x1faad87b,0xddc4bece,0x9849e5dd,0x753fa87c,
  148357. 0x2c1bf1ae,0xc5d516a3,0x14732b4b,0x565dbea8,0xce48696b,0x007ebe3a,
  148358. 0xcdb97694,0x40ca74d6,0x65e4e7be,0x3f5cd270,0x3aac4ebc,0x74847c01,
  148359. 0x43d6c3a1,0x6762e034,0x467a076a,0x690d8c95,0x1eda677d,0x768d78d6,
  148360. 0x0181d8c2,0x0997ce55 },
  148361. { 0x965a0b81,0x9297746c,0xe5e12dfa,0x48b58be6,0x715f437f,0x5573b3c4,
  148362. 0xb565c459,0xe425e907,0x1582797c,0x4f43f512,0x8ea5474f,0xe5dafa6f,
  148363. 0x13de04ac,0x2aeb8fbe,0xe8a07c83,0xed7f95f0,0x662c09fe,0x3e012a6e,
  148364. 0xc742cf17,0xbf96e9b8,0xe28a1c45,0x8ea5759a,0x5cf4e2f3,0x475941b4,
  148365. 0xf901a019,0x7dd3c02d,0x70916b2e,0xe7a4deea,0x2fa9b988,0x50b272b5,
  148366. 0xd0917fe6,0x96f9f09f } },
  148367. /* 112 */
  148368. { { 0x2c310a96,0x78e8aac4,0xf7a2a734,0x32a98303,0x23962207,0xc46ca83d,
  148369. 0xd9541280,0xad131e6e,0x2cabe911,0x5791fc5e,0x841b6c68,0x50cb77eb,
  148370. 0x3d3c8878,0xaff93dea,0xf1007bce,0x06541f1d,0x55cdf1fd,0x4ee729c2,
  148371. 0x323e3972,0xe0f71317,0xad4d08c1,0xa2de7a41,0xa35e22bf,0xa9912abf,
  148372. 0x89b03325,0xa050122b,0x06514d4e,0x8b9e51f4,0x79d3e0ab,0x423c7aad,
  148373. 0x40b8fea5,0x71998e26 },
  148374. { 0xceb6ed78,0x40140fcd,0x18534516,0x653cf377,0xe8d60dcc,0x0450b65a,
  148375. 0x9dac55f8,0xce6c1a76,0xae05686c,0x8a96a92d,0x12712562,0x2fe44762,
  148376. 0xa4f39425,0x747bcb50,0xfc531fc2,0xf0ec6ff2,0x10fe9ff0,0xc97c3447,
  148377. 0x9c792cff,0xfb488783,0x026fb019,0x552c5248,0xd804c290,0x4001a29c,
  148378. 0x35c8ca73,0x742b5ad8,0x6ee5dfa0,0xc3781f17,0x3dfa4ab1,0xca6b85f0,
  148379. 0x0b0d32ac,0x8389941a } },
  148380. /* 113 */
  148381. { { 0xde067dff,0xc0f062a2,0xbcb80162,0xd4f32690,0x0707a2bd,0x98cd990d,
  148382. 0xfae4a391,0x5afc63b8,0xb32ad814,0x684f1b7b,0xf199dfb1,0xb0a2dce2,
  148383. 0x48f25848,0x2260e17f,0xc2d5e862,0x7393db00,0x338cf171,0x9e88f854,
  148384. 0x02acf522,0x00679429,0x6835af3d,0x19157cb8,0xb8a2614c,0x2faa6f92,
  148385. 0x134ec46c,0x04ff95f5,0xfb7a8135,0xcf00626e,0xb37a4704,0x454b3d05,
  148386. 0x2694ec25,0x1fbfda31 },
  148387. { 0xc8f69c77,0xfdebb657,0xa3df88fa,0x92a8278b,0xc1fb78b4,0x463b5571,
  148388. 0x11c71a33,0xd2066a1a,0x089958b0,0x10c88143,0xcf9d67a6,0xb975c7e0,
  148389. 0x73037b8f,0xdaa5d208,0x40bf5861,0x5ee5005d,0x7dba69a9,0x300e6ce7,
  148390. 0xc962cc74,0x893c3cb3,0x4cf84055,0x0ac98629,0x225c9d70,0x0a7ef63a,
  148391. 0xb91e47e8,0xfe184869,0x8c2f84be,0x1b9d7deb,0xc0e278bf,0x67788915,
  148392. 0xc426f19e,0x4f9488ca } },
  148393. /* 114 */
  148394. { { 0xdd51b8ce,0x610dfcd4,0x36230e80,0x08579278,0x36599562,0xedc7ff1c,
  148395. 0xe2cae877,0x905ead4b,0xe7967608,0xa1c325d9,0xbd38926c,0x3e39eddd,
  148396. 0x5f6f0a4e,0xda92c868,0xf47a0fa4,0xe16f800a,0xe5f60aab,0x50b4db5b,
  148397. 0x983853d3,0x3665412f,0x9b79789c,0x64b62250,0x4e0e72b2,0xea560058,
  148398. 0xe555c2bb,0xabbd4901,0x17292e11,0x378419a7,0xe174218f,0x6e0b5aaa,
  148399. 0x8f796b92,0x688e0684 },
  148400. { 0x313b8f64,0xcdfef641,0x942c7462,0xaef11b7b,0x5c0d8abd,0x067cfb77,
  148401. 0xaf4041a9,0x608ea5f0,0x6935210f,0x23d5bd82,0x27917a08,0x5ab904fc,
  148402. 0x45d22d21,0x85dbb1fe,0x4d36159f,0xc3d5e509,0x1d39b8f2,0xaebb528e,
  148403. 0xf44acef0,0xdd5ca828,0x20c57a54,0x24209adf,0x78f95f44,0x5742b433,
  148404. 0xa9337d37,0xd11fa7d9,0xc64cfdb7,0xd66a0c09,0x9bb817ec,0x56e55b8f,
  148405. 0xe4c41265,0x1723c7e3 } },
  148406. /* 115 */
  148407. { { 0xdc8b43f3,0x9a6486d8,0x26409e68,0xfc3e0e61,0xd9b46003,0x1889c437,
  148408. 0x6284ec7b,0x3a850335,0x6a9dbaea,0x5a3665c4,0xe978933c,0x7bf6941d,
  148409. 0x69341490,0x1ed5a510,0x8cb8002d,0x664a7b7a,0x60ed0a59,0x603f76e4,
  148410. 0x1f4ebf27,0xc3e06ba3,0xf2c38a7f,0x296ced41,0xcf1db08a,0x2ac18f79,
  148411. 0xcde7a3b6,0xc919e882,0xdbf68b06,0x15e77d29,0x4e947cb5,0x21978baa,
  148412. 0x7630993a,0x84bf542b },
  148413. { 0xe364f21e,0xc1decda9,0x012e557e,0x0d6cf345,0x588f90e1,0xba246848,
  148414. 0xe3b104b8,0x9f6dda4b,0xe3aef57a,0x6bf7a346,0xe8327ea9,0x210299fe,
  148415. 0xda95e6c7,0xaa99f487,0xd2cdf645,0x24ff813e,0x8bd414b8,0xd1dbb2d2,
  148416. 0xcafa1a61,0x065101af,0x9cdebda4,0x7d9f4b9a,0xe41039e4,0xaf41b395,
  148417. 0xc50adf42,0xe3e9e6ba,0x341e9e49,0x4f2133ae,0xcb157f23,0x4968c0f3,
  148418. 0xda068153,0x383f827b } },
  148419. /* 116 */
  148420. { { 0x6583ff4c,0x2ec46a21,0x4ad709e7,0x4e645a29,0xc04ca12a,0xdc66e9cf,
  148421. 0x9160a7e5,0x82f128f4,0x569c762e,0xbfb227b1,0xc2edb8e7,0xf80c7963,
  148422. 0x49a0f688,0xa7dafe06,0x2d14b8cc,0xb7e41754,0x86de40be,0x3a0c5c53,
  148423. 0x1db79331,0xf0d05286,0xfbfe071b,0xb902ce69,0x210e9903,0x61e46956,
  148424. 0xf703ebb8,0xfaef874e,0xdd5f78b6,0xf668947e,0x5af5ea3a,0x6fe86547,
  148425. 0x43f94625,0x3b121f15 },
  148426. { 0x659275e9,0x5b26e847,0x6d0fce50,0x47581cfd,0x8aa3f1ef,0x55f5cbfd,
  148427. 0xe484e60e,0x1e7be315,0xfe9698e4,0xd8f1a20f,0x7ab04784,0x25d46da9,
  148428. 0x834cdb3e,0xa526db75,0x8d08a009,0x1fd408d9,0x5b5ca816,0xfc004b20,
  148429. 0x65e4bbe8,0x5b3e3bb3,0x759bb6ef,0xf50cc125,0xc2fac737,0xf05fa817,
  148430. 0xd273951a,0x9ee102d2,0xfecb3367,0x2a8e540b,0x2a6a515f,0x673446fb,
  148431. 0x37290c83,0x5505e1d1 } },
  148432. /* 117 */
  148433. { { 0xd15e68a6,0x0c3014a1,0x64dd35e5,0x6f9f0b26,0x03ad67f9,0x18c3742d,
  148434. 0xd2c14484,0x74818c0e,0x0d41a3cb,0xc5181169,0xc49f3e9e,0x65c8c83f,
  148435. 0x2c279386,0x9b260c61,0xced04e9c,0xf6086fae,0xfd7c4758,0xa7b2cceb,
  148436. 0x90297fd8,0x4b3c3133,0x09701ac8,0xca8264e8,0x508b3762,0x9f976a87,
  148437. 0x983a8dfe,0x5d582714,0xd9d598e9,0x350d2669,0x0f6fd348,0x85cb89cb,
  148438. 0xa574317c,0x617d80d4 },
  148439. { 0x70022b67,0x4cef267e,0x3768b94a,0x80536bb5,0xd2784462,0x3153a566,
  148440. 0x38243919,0x49054d44,0x5df78c4a,0x8d11e172,0xd5a1e35a,0x9b252a71,
  148441. 0x8171e31d,0x07866c80,0x1b38a00e,0x0a8501db,0xce770236,0x2ed932b8,
  148442. 0x8edaf7d0,0xa2d77609,0xb93006e9,0x3aee5dab,0xbbfeb036,0xfaffc8c4,
  148443. 0x4e21b38b,0x077b9678,0xdca8e069,0x491fc59f,0x0e938471,0x3f624f55,
  148444. 0x7cd1780b,0x5156f508 } },
  148445. /* 118 */
  148446. { { 0x0206e8d0,0x58234e22,0x7f15af32,0xf5f6f5d4,0xd638950f,0xafab7289,
  148447. 0x7d4495f4,0x66ec4d09,0x68da80a9,0xad890c5d,0x64f8a36b,0xe4aa0920,
  148448. 0x0f4d5c5f,0x799e257e,0x24495e31,0x44c677ae,0xa5b8e352,0x720387b3,
  148449. 0x75a287b9,0x703790f4,0xc3c1f2f7,0x54895cc5,0x41a7fa41,0xb8680f9b,
  148450. 0xb00b008b,0xfcd47458,0xba6473cb,0x149cc838,0xac9be19a,0x78ed5f7a,
  148451. 0xb33765ba,0x5254599c },
  148452. { 0xa21b54c4,0x08739679,0xb6497d9d,0x029ece2a,0xc8488640,0xf14f1a92,
  148453. 0xe9fa79d9,0xae48dcff,0x46c208db,0x14b911c2,0xdae3f69e,0x5ab0fbf2,
  148454. 0xd1edb838,0x180ac87e,0x188586bb,0x146fd718,0x5467cbd0,0x210eb654,
  148455. 0x1667cfee,0xaa239408,0xb73d1a60,0xdb125c1a,0x881c1cbe,0xde685300,
  148456. 0x37c30232,0xfe34c713,0x6f3c8d18,0xc6c6070e,0xb4af4e83,0x07e365ba,
  148457. 0xdcf82b45,0x22f0a7ed } },
  148458. /* 119 */
  148459. { { 0xea7f1b7f,0xe262791f,0xdcff09d4,0x9c3d8c5d,0x39c7dc58,0x86c2a9c3,
  148460. 0x4276e8c0,0x4dad4017,0xe9fe1d56,0x0a918f59,0x2aa810c9,0xb8d79670,
  148461. 0x4aa5cdc4,0xeb7a8836,0xe7afa72e,0xfc4c23bb,0x4ac86908,0x4dbb5c9e,
  148462. 0x6a0c7e6f,0x37e39013,0x49c218d2,0x855d7001,0x94b324a2,0xe475bc67,
  148463. 0x6287a071,0xc98a8dc6,0x5fb4323c,0x395a299b,0x0c0389e9,0xe186c3ee,
  148464. 0x16734c46,0x79f81e6f },
  148465. { 0x364f3c4e,0x83f2c1f3,0x1367e14b,0x536b2ac5,0x5933e43d,0x44a6dcfc,
  148466. 0x10d961fe,0x34e59475,0x7e3f2aae,0x08234ece,0xbdea7f25,0xcb92e00a,
  148467. 0xa791a124,0x1efba4f0,0x1192d53a,0xc2086fd2,0xb51c8af6,0xfec0d0fc,
  148468. 0xdc0f1b5f,0x48d1b2ca,0x812dbe19,0xb07a388f,0xdedbdd45,0x40873a6a,
  148469. 0xd702589a,0xbc2a1268,0x17e27b64,0xbbf6e3a8,0x6d386e85,0x73ee5663,
  148470. 0x9de7c000,0x442ecd37 } },
  148471. /* 120 */
  148472. { { 0x8a2f90a6,0xb4cd1ae6,0x6f5ad0cc,0xf277d41d,0x401d4b8e,0x6a3828c4,
  148473. 0xd8376631,0xe817a134,0xf5e1124b,0x142b758d,0xfd6b95e4,0x25fbc69d,
  148474. 0xd74a9e3e,0xa30c9f5f,0xd89663ce,0x5ac0f163,0x0ce6386d,0x32a9eef7,
  148475. 0xd8ed5544,0x7a690ea5,0x9889427a,0x5de23ff0,0xeaaced58,0x75ad36a5,
  148476. 0xd3e18465,0x3514a6c1,0x7f093910,0x3d9162c3,0xe33d56e8,0x5c10add9,
  148477. 0x06aa691e,0x85176b73 },
  148478. { 0x28a21e38,0xa32110fa,0x5773d538,0x97b6379d,0x2d020dc4,0xd3697bbf,
  148479. 0x961833cd,0x59177593,0xe5fa8516,0x6d7045fa,0x786ab5d2,0x3390f29a,
  148480. 0xdc4f5b70,0xac0bda30,0xdcc615c6,0xcca0240a,0xc5146d91,0x8e1f1702,
  148481. 0xa72cef87,0xceb472d0,0x0b669ba1,0x84840708,0x7e61aa0a,0x79b08f9d,
  148482. 0x4669560b,0x388160be,0x948eb71e,0x23935c2d,0x9431590c,0xd7fd83c0,
  148483. 0x6e5768b3,0x8ab154bb } },
  148484. /* 121 */
  148485. { { 0x353c4a96,0x28686003,0x905cd835,0x4e5c60e8,0x8f66f8cc,0xbd591364,
  148486. 0x9faccf9e,0xb6b80b98,0xe32639e5,0xbc1c1fae,0x278aadeb,0x2f6396d2,
  148487. 0x1898202d,0x00a796d0,0x3a474835,0x18ab548f,0xb31b0e3e,0xacd056c3,
  148488. 0x0164512d,0x15ba68dd,0x4b03f3bc,0x203836d9,0xd8f206c5,0xd64eca6b,
  148489. 0x9f1779b6,0x931a361e,0x52ab34a8,0xd82690fc,0x92922e22,0x342bb8e0,
  148490. 0xe00b02a9,0x1bfcdd84 },
  148491. { 0x75a365d9,0x310b9a43,0x08d8fb03,0xd4ade15e,0xd742df83,0x9c9753d7,
  148492. 0xde318742,0xcf7309d4,0x3360ace0,0x1228e212,0xf7669643,0x1043d238,
  148493. 0xf90f5a53,0xfc2adbed,0x7b5f9397,0x41d64cb7,0xc446d010,0x5200b30a,
  148494. 0x231720fe,0xc3c8642d,0xb9aa2075,0xfcc0122d,0x041eae47,0x856e3b12,
  148495. 0x68c876a4,0x45864455,0x233606b1,0x1a1c7842,0x227757bf,0x9b766d1f,
  148496. 0xf7b9d4f1,0x25b78a3b } },
  148497. /* 122 */
  148498. { { 0x156707ce,0x90835718,0x4314f90a,0x9bdc2398,0x8be57dbd,0x017c885a,
  148499. 0xad63a4b8,0xd4bba225,0x15aacffd,0x5ce71b86,0x72954722,0x5f266475,
  148500. 0x4f0ad3dd,0x0a80f1f7,0xfc352ed7,0x010538a3,0x4203c6ca,0xf8a64045,
  148501. 0x330c73b4,0x2b2c7a88,0x02dcac1b,0xb3433ee6,0xed2b17c7,0x2e0499cf,
  148502. 0xbd6329c7,0x9f8681a4,0x36fadc37,0x38979946,0x92b7895b,0xdc5650c8,
  148503. 0x65a51cf0,0x70ab9570 },
  148504. { 0x7b585d93,0x46778ec4,0xa633fe4e,0xca6d3610,0x4ea0311a,0x21da154e,
  148505. 0xbd64002f,0xaf22190b,0xd91cb7a9,0x9e633ac7,0xee6837d7,0xed13c31f,
  148506. 0x1616ee8a,0xda4a07d7,0x3afcd616,0xd78a2732,0xba14d694,0xc06696e5,
  148507. 0x4df58420,0x733754d7,0x2778e3c9,0xe85e504e,0x55b5a5c2,0x3055aa0c,
  148508. 0x8a3acb5c,0x313df538,0x2a088eda,0x5896acb5,0x84c85dde,0xfc8842a0,
  148509. 0x51dde6be,0x5fec9f79 } },
  148510. /* 123 */
  148511. { { 0xfe519f99,0x5ebc2c7c,0xe5410353,0xe396bd80,0x8a3988f3,0xaded9402,
  148512. 0xd601bda1,0x1c03b735,0x14ce64ac,0xfd302036,0x01240290,0x5837ebe9,
  148513. 0xa554097d,0xcaaea1a3,0xb0b88139,0xdce73d25,0xecb090b9,0x35ed412b,
  148514. 0xd63dab3c,0x99029ff7,0x062db071,0x555437d9,0x42a4c11d,0x277d2f56,
  148515. 0x24fc9109,0x477fa645,0x2799254d,0x7b12e9b7,0xd84c618c,0x7ad2ae22,
  148516. 0xce8ed195,0x0a8d5663 },
  148517. { 0x0a21fde1,0x43ac5163,0x6903d849,0xcfcf5dd6,0x5fdd6281,0x6d2499ee,
  148518. 0x77a49a34,0x4dedc6f0,0x2875c06f,0x46bda2c0,0x347b8046,0xd0e0e0f6,
  148519. 0x5e67836f,0x1058169b,0xde8a8042,0xc961912a,0xa93b3d32,0xdf3fea0a,
  148520. 0x0c576bc5,0x9f138edb,0xd8d37e47,0x7971ad6e,0xcce5e7cb,0xeab85739,
  148521. 0x1d202b40,0x88a4b434,0xe3a1fd26,0x5d842557,0xb3a86f91,0x872fabd5,
  148522. 0x6aa4629f,0x95b93493 } },
  148523. /* 124 */
  148524. { { 0x99f951de,0x9998a701,0xf058db45,0x8fade596,0xf3d03dd3,0x4d479c1e,
  148525. 0x33b141d3,0x6e928d5d,0xacfe8a40,0x9a465800,0xc1cefa3d,0xd108ad2f,
  148526. 0xe013726e,0x64b96921,0x8e83bb9f,0xb9b6a6b6,0x1242e544,0x29f1e6dc,
  148527. 0x2f65966b,0xd3f8f676,0x5e105b41,0xa34dd096,0x16011e1c,0xd4e9139a,
  148528. 0x2515541b,0xeea4dc68,0xc822166d,0x6f8030ac,0x31d16124,0xbdc7ae1d,
  148529. 0x621afa7d,0x2e25ef51 },
  148530. { 0xdd8e7357,0x2533cf8f,0xeaceddb8,0x333ba218,0x0784d2ac,0x68e3e31d,
  148531. 0xf2804ae2,0x1c927f36,0x77e7ad7e,0x01433d22,0x587f78a0,0x0b401cf0,
  148532. 0xaa0027ae,0x9dfcf036,0x1d9a46b5,0xc9e46c8b,0x1f288d32,0xaa6de486,
  148533. 0x1b8a043d,0xdd56da2f,0xf2d0bb56,0x346230e5,0x19defb56,0x19f0b6e4,
  148534. 0x21d2c874,0x55ec37cd,0xb70e45b3,0x3dbf0397,0xac7ce852,0xf0862a8d,
  148535. 0xe141f3d6,0x87979ea7 } },
  148536. /* 125 */
  148537. { { 0x7f1c747f,0x9b7e7b3f,0xc6e63369,0x151a4c1d,0xb372dba0,0x4273ff70,
  148538. 0xd3ee54fe,0xca6d2234,0xd33cae0f,0x12fc8e0c,0x5dd6f10c,0x27328538,
  148539. 0xf01a9cf9,0xc86f3fbd,0xe36cae91,0x5322677f,0x2fefea44,0x39a70033,
  148540. 0xce8af217,0x2c9ca328,0xf6a731f4,0xc0256776,0x66a96813,0xc687b3df,
  148541. 0x8db2eda8,0x194aab12,0xeec4febd,0xde30dc5a,0x979241b2,0xc052236a,
  148542. 0xc23d4c16,0x3ec98802 },
  148543. { 0x4072f74d,0x0f9e760c,0xab594059,0xe78eb0de,0xc9b009c2,0xdb3dea40,
  148544. 0x38b59ae5,0x47e875f0,0x2b4daa06,0xf40eb436,0x090f3788,0x9a6a4f92,
  148545. 0xedbfaf8b,0xefebe9af,0x9867e256,0xf87f96a5,0x75ab6aeb,0x1e6fed23,
  148546. 0x3fdb13cb,0x17f2782a,0x70fa2621,0x5102c71e,0xfd4c0dbe,0x5d2b06ec,
  148547. 0x30347297,0x537cc268,0x2b67e780,0x8dbf5e2b,0xba25da32,0x2f633f3a,
  148548. 0xefaec914,0x3e9315e8 } },
  148549. /* 126 */
  148550. { { 0x239a9ea9,0x9255cfa5,0x0be33a62,0x20f3c690,0x9cb642bd,0x759eeb4b,
  148551. 0x00bae718,0x3316c546,0xf3410f84,0x874a76d5,0x90f129b6,0x123b502e,
  148552. 0x12851f1c,0xadc8f9a8,0x1b62408c,0xf57b764a,0x1a80777b,0x116ec01f,
  148553. 0x1f0ddc5c,0x746ecef2,0xe5a6a5a7,0x3c49d47c,0x06e955ba,0x1e15dbe7,
  148554. 0xb45d79b0,0x629c0c79,0x778d1087,0x11278308,0x8c6a22d7,0x22585dc7,
  148555. 0x0a682791,0x2ed02a0d },
  148556. { 0x4daa2682,0x53043416,0x01359625,0x0e26d32b,0xbd867097,0x449c834a,
  148557. 0xee77ae2e,0x11a19d2b,0x3af6c169,0x39bd529a,0x5cd61054,0x36cca5c0,
  148558. 0xdc6c0fe1,0x6370a59b,0xb93d5135,0xca420d27,0x554c451a,0xd8730d45,
  148559. 0x96cdebf2,0xebd258c9,0xa50f9a05,0x0cb1b990,0x7b0f0151,0x69a8c97a,
  148560. 0x11d217e1,0x2cc36d34,0x752f75e8,0xf117688a,0xa09b2a61,0x1db01394,
  148561. 0xa9efd7dd,0x14627844 } },
  148562. /* 127 */
  148563. { { 0x232803cf,0x6bca3aed,0x9a96ff34,0xc1e4398b,0x74ab788b,0xcaf6757f,
  148564. 0x7e68c04d,0xc3a53e00,0x5cb7cd20,0x5f969c19,0xdc068bca,0xf28b65a6,
  148565. 0x1d863032,0xe3ca01d3,0x87808e14,0x9b733b81,0xefe618be,0xb5d704d9,
  148566. 0xb01b946d,0x276f3542,0xfbedddbf,0xe057e19e,0x903275ce,0x7d182f2b,
  148567. 0x880f7bc6,0x3cdc5f77,0x78476c14,0xd6f03d3f,0xa9ba5072,0x035f5557,
  148568. 0xb4029628,0x7acb57b6 },
  148569. { 0x44e6b07c,0xd2413569,0xe1c7345d,0x451c4cc9,0xe273b9fb,0x407444d8,
  148570. 0xb88e34fc,0xfe496079,0xf152776d,0x77d184cf,0xc742299c,0x6d1033b9,
  148571. 0x77bf2897,0x29a0a684,0xee8f0420,0x59ffdf10,0x44bb56d6,0x4e17146c,
  148572. 0xfb9ae855,0x831d06c2,0xd93e7cd5,0xb2cb82db,0x3c96b607,0x83381c46,
  148573. 0x7549e2a8,0x06aed251,0x774a21d4,0xef97891c,0x8675fbdd,0xae9807c7,
  148574. 0x6363516c,0x6a5a05b9 } },
  148575. /* 128 */
  148576. { { 0x6a8f4f33,0x92e71ea6,0x4dea8f4a,0xf2fc6fc6,0xfee88461,0xd356252c,
  148577. 0x08954d08,0x59b0a83e,0x468ab766,0x5bd68c23,0x900f8d04,0x40281357,
  148578. 0x52b867ae,0x181c19c0,0x18764c41,0x986a5169,0x13575d24,0xcb01dfae,
  148579. 0x593677b7,0x17269ae5,0x46dc9b19,0xf6d17025,0xc40097c8,0x8de68499,
  148580. 0x259c407b,0x76df0032,0x17d29d8b,0x4091aad9,0x4a7ab5f6,0xa7f46d21,
  148581. 0x70ece48c,0x688054b4 },
  148582. { 0x51a5b86c,0xf0d168aa,0x95777247,0x2437e4d8,0xf1720329,0xae844076,
  148583. 0x9647a54e,0x0a7ac87d,0x0405622c,0x1e597a4b,0xf0a79f2f,0xedefe5c6,
  148584. 0x4d55156d,0xaf3ef0c2,0xef047cf6,0x917fb04e,0x54b62137,0x3792799f,
  148585. 0x314be0b8,0x875ea32f,0x0c466b0c,0xe157c65b,0x7e218978,0xd28c90ce,
  148586. 0xcde587af,0xb90fc3ba,0x8b877bed,0xdd32d71c,0xca8e10cd,0x3b432200,
  148587. 0xd94f6e53,0x0021f419 } },
  148588. /* 129 */
  148589. { { 0x43519d26,0x2191122c,0x40a51845,0xbdafac1d,0x548bb89f,0xcc6f71e9,
  148590. 0x16844bf9,0x9ef3375c,0x178e8d55,0xe7789f79,0x1f8be1c5,0x04f599b6,
  148591. 0x2cbbde40,0x8088c99a,0x893206c9,0x8939a260,0xfcd30851,0xa1ae4bff,
  148592. 0xe08feafe,0x664cb3fe,0xff14aabc,0x61f38099,0x2a841ef9,0x0d8394cc,
  148593. 0x17f01db6,0x75fad8ad,0x6debb773,0x6fc34576,0xa4252512,0x1e716b05,
  148594. 0x29e1ed9f,0x79855880 },
  148595. { 0x95106473,0xa2cb3aaa,0x5a61da04,0x95fafa41,0x539563c0,0xfd3c9362,
  148596. 0x95312b87,0xbaa48091,0xbf885c76,0x6c7e7582,0x230c78d5,0x70f6dab6,
  148597. 0x7747440d,0x8ce3051c,0xffdb6186,0x6dbebd14,0x190e4096,0xb0e041fa,
  148598. 0x6ee62e2a,0xba10c466,0x74f333d6,0x93d57e2a,0xfe7b9b66,0x006aadc4,
  148599. 0x06d2837d,0xfaf72f6c,0x910741ea,0x318cc5e6,0x65692477,0x9c502609,
  148600. 0x1d0fb08d,0x95d823c3 } },
  148601. /* 130 */
  148602. { { 0x140528a5,0x6aeebd86,0x53979bc8,0xf268c2ba,0x4ec144ab,0xb1bc9b8a,
  148603. 0x82a7d7ed,0x1efabb0d,0x4e0118d8,0xf12c70d1,0xa1c1558e,0x31607168,
  148604. 0xe4b7e73e,0x33e428b7,0x83aec9dd,0x63176637,0xe12ac35c,0x5172ffbe,
  148605. 0xbc17b2a4,0x37df0bfb,0x741f812a,0x4212f870,0xe2888f9c,0x3dcecbdb,
  148606. 0x756ca55d,0xa9dc15aa,0xb9028e41,0xf31918ec,0x6aeadb03,0x7ede0285,
  148607. 0x78654f54,0x0e2708d5 },
  148608. { 0xcde20f88,0x2270cc53,0x5f5b1039,0x9338272c,0x5dcb1dbf,0x5042e19e,
  148609. 0xb72d74c1,0x4b3de219,0x2aaaaa55,0x16c49a8b,0xbba86ba6,0x008443e5,
  148610. 0x20cf1695,0xee6bcd72,0xa89abd11,0x59ffac6b,0xf115639d,0x2831217b,
  148611. 0xf34cba52,0xe4d28af2,0x0727a906,0xf27f03e7,0x69017766,0x6842c79f,
  148612. 0x7a81123e,0xcb3469bd,0xa42973b8,0x48c0f346,0x23990dbd,0xfc5784a6,
  148613. 0xfb299678,0x0d3dab3b } },
  148614. /* 131 */
  148615. { { 0xce29c3cc,0x8f8376e6,0xf016cbc6,0xcb0507ec,0x5e394ce1,0xdebff996,
  148616. 0x73c50d41,0x24fc526f,0x2d16ce3d,0x4edd5a54,0x91c13141,0xbb37bdd9,
  148617. 0xe33a8606,0xe3442ef2,0xc0629da8,0x2ae90337,0x592ab331,0x57faec64,
  148618. 0xd82b857b,0x1a938997,0xa3373176,0xad6c8cb9,0x9086751f,0x82595de2,
  148619. 0x18c17196,0xa81e97fb,0xbf697357,0xe4f48a13,0x5cb89f69,0xa1387c2e,
  148620. 0x5874b426,0x530b4eeb },
  148621. { 0xbab7b5ae,0xe9f275a1,0x03a57bf4,0xbb69dc4d,0xa45c505b,0xc974dc4a,
  148622. 0x416ac402,0x726369f3,0xaed985dc,0x735e4e78,0xcdd446a1,0x0548d879,
  148623. 0x9e16b02a,0x84ceb069,0x789b11a6,0xf73f6fa4,0xb2a4e784,0x6aa0c41f,
  148624. 0x93a9b697,0xb1f76902,0xf03a8ab2,0x814cce00,0x844d66c1,0x64cb255b,
  148625. 0x30952201,0xb794e7d6,0x3da32271,0xe052d4e4,0x08b6a4d9,0x5278b2e7,
  148626. 0x80c6577f,0x90942552 } },
  148627. /* 132 */
  148628. { { 0x0d5b4c2f,0xd269a14d,0x5c8a649c,0x2b8fc59b,0xb0e37d4a,0x95becb3a,
  148629. 0x9111037e,0xfda1a768,0x94e35322,0x5810e05a,0xa178fafc,0xa24dcc12,
  148630. 0x8e3dce62,0x5c2c63b2,0x9452c444,0x995c3f17,0x42d45161,0x35330ec3,
  148631. 0xb4ef8129,0xa025a60a,0x8bae9c13,0x85493252,0xe2e3caf8,0x25d1a606,
  148632. 0x3649bf47,0xd44091ab,0x704ec5f1,0xc7d0afbf,0xbd8b3333,0x27bd1d62,
  148633. 0xcfe616f5,0x50570111 },
  148634. { 0xf534356b,0xd0084ace,0x4b4b0fbc,0x9df1de05,0xcee04dc1,0x021afe05,
  148635. 0x361b78e1,0x64bde688,0xef78d38b,0xa324fcc7,0xeb0a5e4e,0xfeb372ce,
  148636. 0x65811996,0xef04fcb3,0x5eb0ab4e,0x7dce5d50,0x238c586e,0x1e29b588,
  148637. 0xbcd80037,0xde5e3197,0x4806b9cf,0x8bf5e451,0xd18e67ab,0x4330968b,
  148638. 0xf9f63fad,0x26a7d04e,0xb5c18bb4,0xa1c7f123,0x25dce22c,0x485b8482,
  148639. 0xd540e79f,0x8ff0b36f } },
  148640. /* 133 */
  148641. { { 0x3ff42cff,0x99f2e2f4,0x1c35317c,0xa3c19f9d,0xaba1b545,0xdb749392,
  148642. 0x4afa9a32,0x84232b05,0xd7dcd436,0x0b855d46,0x45cf9915,0x8ac35e20,
  148643. 0xf001a218,0xd7cf22c7,0xed408305,0x057d35ae,0x553ccfcd,0x25a4a519,
  148644. 0x93e2b939,0x5e565793,0x3422ec27,0xa20332b0,0x3ac53958,0x9b09005e,
  148645. 0x79e9b163,0x628051a3,0xfc6618d6,0xb4a0dc09,0x6748e7af,0x9e0e857f,
  148646. 0xc577d63e,0x71b28eee },
  148647. { 0x99726bf8,0x4942b0cd,0x1c208f3c,0x1290a3b9,0xb0598eaa,0xfd7290e7,
  148648. 0xa25a9128,0xc6a7791f,0xc037d7da,0x2d33db24,0x70e2837b,0xc21efeb0,
  148649. 0xe3dae2a0,0xbf70d96e,0x85076027,0x43ed8191,0x4d4ad7e3,0x4aeb0aa8,
  148650. 0xe8c5b74c,0xbc75101f,0xad26ebdd,0xdbfb2a6e,0x6b78aa4e,0xba812068,
  148651. 0xe1159848,0xc94aa8f2,0x3eba5c4e,0x0d10d9db,0x6318295a,0xce7fec47,
  148652. 0x330d925a,0x7294711a } },
  148653. /* 134 */
  148654. { { 0x32bbd495,0xfce45904,0xbe54973f,0x330f4dd1,0x5d9c3f4e,0x006bee1d,
  148655. 0x59ba7204,0x40ee6078,0x42c2c768,0xc194fd3f,0xe9fe88be,0xa0e76b12,
  148656. 0xec2b0210,0x17cddddb,0x00811ec7,0x689d436b,0x284be9e4,0xa6a6ba37,
  148657. 0x007d4114,0xabc395b2,0x0f11e744,0xf8cdf9f3,0xe9396402,0xc5febec8,
  148658. 0xeeb46285,0x8a751743,0xc6e0d137,0x99bf8782,0xbeb292e3,0x3965e170,
  148659. 0x5801fd5f,0x001c39d8 },
  148660. { 0xda4a0912,0xf4805cb9,0x4410bca4,0xd27cb76a,0xec71d65b,0xef3dcb8e,
  148661. 0x4816849a,0x780fbb2b,0xa8b24635,0xef6a7026,0x12c44e68,0x15625c88,
  148662. 0x4d7a74a8,0x624c232c,0x4b1631e4,0x81a77037,0xdb917c2e,0x04e4f7f1,
  148663. 0x1f61ed95,0x1d0465fd,0xcbde6e3d,0xb1048049,0xd7131fcf,0x637ce0c1,
  148664. 0x8ada4715,0x22e4dbc2,0xace99726,0xf7530c5c,0xee287450,0xa0160dcc,
  148665. 0xbb91af13,0x9132e670 } },
  148666. /* 135 */
  148667. { { 0x7996099d,0x8057efe2,0xa06e608c,0xb72344db,0xd0958588,0xeb4a8740,
  148668. 0x79e5aee9,0xe53daf06,0x908a2fad,0xc9560a9a,0x107e706a,0x7f4be131,
  148669. 0x2830246a,0x6d5f3d9b,0x27cca3e6,0xa5f8e8da,0x4c28f292,0xeb51dca6,
  148670. 0xf31dfd78,0x4cfa310e,0x2ca073e5,0x92e0c7c2,0xa40da683,0x102f1694,
  148671. 0x750d38fc,0x16bb07cc,0xbadae035,0x703e83e2,0xb4d3c9dd,0xea93c066,
  148672. 0x79940ed1,0x7d0b03e5 },
  148673. { 0x4dd94c63,0x5fe7ea30,0x738b0b3a,0x57ef01c5,0xa14e6b4b,0x9534a78c,
  148674. 0xa5353276,0x07622cde,0x7c22d006,0xaf696a07,0x7d46b209,0x733c1886,
  148675. 0x626c2b4a,0x9654ccbb,0xa84f3c4c,0xa098d3a1,0x2d734b74,0x3596f9ed,
  148676. 0x5d551c90,0xdfd3021a,0x1ec5123f,0xe2ba7d2f,0xb2c1aa39,0xf9726925,
  148677. 0xf8eb2927,0xd2e75d0e,0x19192a6f,0xfaba712e,0x9b83e50e,0xa606b43a,
  148678. 0xdab5de60,0x31b1782f } },
  148679. /* 136 */
  148680. { { 0x4034db92,0x878dba45,0x8f34dc4d,0xa3977901,0xdf754c33,0x8d004f2e,
  148681. 0xcd563a88,0xeaa5954a,0xbb5ffad1,0xa29d6c89,0xb0d8bdb8,0xa8adf655,
  148682. 0x8cdbdb47,0xf7fb842d,0x80d3205b,0xb72e3a03,0x7cac7ca9,0xc335b0b2,
  148683. 0xd8a5475d,0xffc60bcb,0xeba4d25f,0x736f7719,0x0c50fca6,0x3d901c38,
  148684. 0x80c01900,0x1fdacf7b,0x5681f84d,0x75cf658f,0x5cefbbc1,0x57a7e634,
  148685. 0x3e07ed1f,0x6fc0fbe5 },
  148686. { 0xb81b0e5f,0x496d116b,0x2ac853b8,0xd82dd2a5,0x327387f0,0x357e22d4,
  148687. 0xba912c59,0x3e332a84,0x49d5dcc1,0x8b71c643,0x438d85d3,0x0c982ee9,
  148688. 0xbf7fcd4e,0x90b9553c,0x38fed5e3,0x2cb39bbc,0x5ac42903,0xa2c67c9c,
  148689. 0xbf07da55,0xebf21217,0xa0b9e4ee,0x55ac05ad,0x8ee9e0c6,0x10bb12c2,
  148690. 0x48bb6e3f,0x5cf3aee5,0x8b046e91,0x4ae7269c,0xaa0e553f,0xcb266012,
  148691. 0xa94c8fc8,0x701935a1 } },
  148692. /* 137 */
  148693. { { 0xa4626dea,0xde58d41d,0x15b9039f,0x25ef66ca,0x3164e65b,0x99a810a4,
  148694. 0x748cfccf,0x9fe6daad,0x2f142fa9,0x7ab9a6bd,0x5d471796,0xa4cba168,
  148695. 0x6bc3a39b,0x12d30b36,0x8bf45076,0x1f46a5dc,0x1421ac0e,0xb868e529,
  148696. 0x59bba1c4,0x7a686206,0xda698b90,0x2b4b552e,0xe5453707,0x5039dcd4,
  148697. 0x9e90165f,0x42a07a9e,0xd7d45dfc,0xa838fff3,0x3b5ceb30,0x41991e5a,
  148698. 0x969ca600,0x6c961ec8 },
  148699. { 0xc4e7eb46,0x703bdc1b,0x596c7b48,0xd6bac557,0x66afd74d,0x4f9917cd,
  148700. 0x656ce6f3,0x56355105,0x32497175,0x3d1fb50c,0x63effb2d,0xfda6783e,
  148701. 0xeefaa2bd,0xbd79f1f3,0x17af9ef7,0xa4efbe54,0x5a55b7a4,0x6cef6462,
  148702. 0x1a713304,0x116f3238,0xb95625a3,0xdb2a2a7f,0x0b027e96,0x6a0aa43a,
  148703. 0x4832b3bc,0x458fe5d2,0x5adfaac0,0x523418df,0xc49e7f9a,0xc05a89cb,
  148704. 0x69e24b53,0x830883d8 } },
  148705. /* 138 */
  148706. { { 0x02557389,0x959b1c62,0xadefc0bc,0x5fe5ce97,0x8330f383,0x893bbe7f,
  148707. 0x16cfb81e,0x27e0c6af,0xd04428fd,0x6f64e65b,0xb79e6182,0x53de9245,
  148708. 0x487e11ca,0x08a313c1,0x445bce93,0x65cec3b9,0xd67ed49e,0x33bc0314,
  148709. 0x30782352,0x69f36b24,0x93ad31d2,0xd78e5daf,0xc780890c,0xf2682b70,
  148710. 0x9e45efe9,0x7015c34f,0xe6cbafea,0x135d4ba4,0x7e3fcc6c,0x43a378a4,
  148711. 0x96638f8c,0x2376f97f },
  148712. { 0xae575b99,0x0a6e1ec0,0x81b970dc,0x7e14cb4f,0xd3a73947,0xf00a3824,
  148713. 0xfb235a9d,0x0b4b9c81,0x5bf62944,0x8d15115f,0x1e165d7a,0xcfd35b43,
  148714. 0xb2ee3e3b,0x5d12fea2,0xf5182e7b,0x629984a6,0xc365d08e,0x4e43e2f3,
  148715. 0x30f36e72,0x99327091,0xfd345401,0x698b4a00,0xbaf96dce,0x23c4fd0e,
  148716. 0x23675554,0xa60ba0ae,0xb0325784,0x51bdac2d,0x215464a1,0x8ab4190a,
  148717. 0x6bf10296,0x8c461661 } },
  148718. /* 139 */
  148719. { { 0x2d1f36a5,0xeffca258,0x894c5f2d,0x0eded2b2,0x43ced84f,0x35a5cdb8,
  148720. 0xdb0e3b9b,0x290f8982,0x0719a112,0xcce0eaf0,0x39a362d6,0xd0e657e4,
  148721. 0x62697e47,0x5516a55d,0x8e636514,0x269e1f77,0xd50269bc,0x5e3dedcb,
  148722. 0x441c57c5,0xecec2300,0xc705578d,0xdb83f31c,0x1e489eab,0x1bdefb73,
  148723. 0x395fcdb4,0x20b678cf,0xff9db001,0x908cf91c,0x55f52cc8,0xcbebc6f4,
  148724. 0xb4c61162,0x155ea622 },
  148725. { 0x876fa42e,0x94be2f1f,0x7fadeee7,0xab5e8749,0x38c865af,0x692e70f5,
  148726. 0xdf8059b0,0x16e99b84,0x8b5a7ac9,0x0ceb606e,0x2d463d2b,0xced23357,
  148727. 0x2a9a09a0,0x2d0f2623,0x3861fbdf,0x2529998c,0xc1be310b,0x711888a7,
  148728. 0x0d8aade3,0x9b1229c5,0x3b13533d,0xdbcf9b78,0xff029708,0x3ca746f8,
  148729. 0xda83ef88,0xa5a013a1,0x4ab28444,0x8e904d18,0xbcbd4aba,0x2fe84b3d,
  148730. 0x259058c3,0x8f570f24 } },
  148731. /* 140 */
  148732. { { 0x2ca9c508,0xdeb66c8a,0x69d6b780,0x2dc5bec2,0x88ead600,0x16d61266,
  148733. 0x49d72614,0x61841b97,0xce472e6f,0x41e40e6c,0x1fa7a876,0xada24264,
  148734. 0xcc3997a0,0x45b9fd33,0x7c15dcf4,0xb25e8fa9,0x12e9629d,0x0124ceb2,
  148735. 0x7db3d956,0x3a8c72c6,0x7c1a7844,0x8e2ded2b,0x6dd027ff,0x94ab09c6,
  148736. 0x7e7a2bc6,0xf89a057d,0xcf70c763,0xad8bf226,0xc8a26212,0x4cb268e7,
  148737. 0xb2c44c1d,0x3d171e87 },
  148738. { 0x8ce49820,0x382ac16e,0xc0c44dc9,0x24ee45e2,0x73e858c4,0x0ec67912,
  148739. 0x46327cf9,0x918cb25c,0xc6159c1f,0x43e3876b,0x37545cb3,0xb6b6e0e0,
  148740. 0x5d12347e,0x64b839ab,0xa300d541,0x72e09274,0x881c1169,0x26ab28e6,
  148741. 0xeb75a843,0x4a580fff,0x359120df,0x0a5802ca,0x3209f4a3,0x7fee82d0,
  148742. 0x8e6a9380,0xb518016b,0xc2ee11ca,0xb99c6c70,0xab9d4ec7,0x16105af1,
  148743. 0x34cd9004,0x234e98f8 } },
  148744. /* 141 */
  148745. { { 0x14db9cda,0xff435208,0x96adec90,0x99cfdc47,0xaf458b6d,0x843aaa6f,
  148746. 0x743eaa31,0x3f1f7415,0x61735d81,0x915e192e,0x0ac595d5,0x3441a22d,
  148747. 0xc044bc8d,0x704bbf67,0xbe23a236,0x2f960471,0x15d1d557,0xcc326388,
  148748. 0x76b1dd94,0x9410230b,0x0c1c8a67,0xf2e5439f,0x833c910d,0x56b141ac,
  148749. 0x865b84df,0x467c999f,0x21f02b7b,0x1b0251fa,0x96216950,0xde5b5260,
  148750. 0xce3a1e93,0x6a2130e3 },
  148751. { 0x4b3ca1a7,0xd21b67a0,0x00c0ce80,0xaf42ed53,0x932cf07a,0x22ccd368,
  148752. 0x5c25c35a,0x36523a81,0x8dd04d06,0xecdd3958,0xb2f93a3b,0x73da3502,
  148753. 0xd5e5b530,0x4c5e0c3c,0x13268777,0xef9f5486,0x1e742292,0xed87fefc,
  148754. 0xa24e5ede,0x6d9ac29e,0x33849f1a,0x08abc9f0,0x40f23905,0xb09b2292,
  148755. 0x7f934353,0x6791072c,0xe6aeb550,0x102a6381,0x96feb870,0x3ee07409,
  148756. 0x9c4d2830,0x34f06faa } },
  148757. /* 142 */
  148758. { { 0x2348f005,0x869dc79f,0xdf4920b1,0x9b5c5d71,0x6dee64a4,0xfd1b57ca,
  148759. 0xe82a4fb4,0x21b7f734,0xb9578366,0x637cb834,0x7d287d96,0xc934101b,
  148760. 0x0392ecab,0x1590f8ac,0x7f75f4e3,0x280dc373,0x6a61ac62,0x8b36f50f,
  148761. 0xa65568da,0x74f58304,0xd930870a,0x80d792a9,0xfc8895cc,0x6d17b192,
  148762. 0x4914939f,0x498392fa,0xd41d5b9e,0xaf36027d,0x5caa82b5,0x452d79e2,
  148763. 0xf4115d1a,0x764d47b1 },
  148764. { 0xa2ee8b9c,0x5df22303,0x85dfcd48,0x1b9f72d3,0x10813a37,0x6b42b983,
  148765. 0x3de741f5,0xe28c523b,0xf303bb5b,0x0857625a,0xac9bf9af,0x926f299a,
  148766. 0x0d445b34,0x21beac08,0xd6ba2c0e,0x6a523a02,0x7fce2864,0xe302a1b1,
  148767. 0xe300c1ea,0x4516a235,0x7b4a9311,0x4543736a,0xc0cc89f7,0xd3c0b9e8,
  148768. 0x40ed88de,0x0481904f,0x3cb7fc70,0x4f269b56,0x321b9738,0x09a1d53a,
  148769. 0x230a3810,0x1c0dd9c3 } },
  148770. /* 143 */
  148771. { { 0xc46a7d9a,0xffaa1f67,0xbedf91cc,0x64743334,0x47a42f2e,0x45833a74,
  148772. 0x241ffaa9,0x67980051,0x335efe6b,0x70979a84,0xf08b2403,0x5f0613f5,
  148773. 0x64f211dc,0x6bb22fcd,0xa0572cfc,0xe1b8b2a3,0x7950a14a,0x19e0eb41,
  148774. 0x3eb6cd4c,0xe634bb29,0x470a25ff,0x31a04b25,0xa3d15a0a,0xa41f7ac9,
  148775. 0xbf2fede9,0xefed85ec,0x81b94a00,0x1f581f5f,0x9ef4a15c,0xaa3996b0,
  148776. 0xb06041bc,0x52d8be39 },
  148777. { 0xfd631a2f,0xbd1536f6,0xb351a8dc,0x91fae7f0,0x9b126212,0xd1a590c7,
  148778. 0x2bd0f435,0x52d4875f,0x92b0ea70,0x9aedb6d3,0xb83ab89e,0x0bd0abdc,
  148779. 0x89fe192c,0x827a1062,0x102a0bda,0x6566a960,0xce036814,0xda083037,
  148780. 0x58639405,0x30bed79f,0xdbca8df9,0x972019b6,0xefdaa3f5,0x89201286,
  148781. 0x5236b892,0xb337b996,0x28fc2e73,0x11d3e38e,0x880e8da3,0x70787f41,
  148782. 0xdae4a45d,0x6cff6367 } },
  148783. /* 144 */
  148784. { { 0xf89a8bb4,0xbd3d0433,0x93b98f71,0x42144c33,0x03470a2d,0x82b616c8,
  148785. 0xe5da089e,0x98fcc757,0x7bf5fda6,0x542354ef,0x9ebd34cc,0x1885c253,
  148786. 0xbec5dd0d,0x2e20b285,0x782a1bca,0xe71bbbe1,0x9b854ef0,0x959ded30,
  148787. 0x8997fa6a,0x17249979,0xd81f3c45,0x50cf8fa8,0x60c11152,0xa9a3b517,
  148788. 0xecf845ea,0xc9b0ef7d,0xb9fed11b,0xc9339e23,0x28256080,0xc93e9c5c,
  148789. 0x613ec1e7,0x1d2c8217 },
  148790. { 0x987cfc93,0x7381347d,0xf187f810,0x047603bb,0x1250ca31,0x3fa6bc9d,
  148791. 0xbb055bf3,0x480091e0,0x3a3af87c,0xbdf95f1a,0x140540ab,0xe2687770,
  148792. 0xd7fe045b,0x998df730,0xb723bc2d,0xb398135f,0x15ebec46,0xac230f8c,
  148793. 0x5f5561c0,0xe08e1830,0xda60a47f,0x7c0fbf4c,0xe16d4bfc,0x06e95c24,
  148794. 0x74617e92,0x74163495,0x4ae0c20e,0x39719869,0x2131e2b6,0xfe269312,
  148795. 0x0a537722,0x25486e36 } },
  148796. /* 145 */
  148797. { { 0x53572806,0x618795ca,0x656968e1,0xb2c89449,0x3fb323ae,0x149c2c97,
  148798. 0x409bc7d6,0xfb15de26,0xc79121b3,0xa90cda72,0x204cabbb,0x6d2fa14e,
  148799. 0x91604125,0xcbcda6f7,0xb435f947,0x25086261,0xc282eb10,0xdb686c38,
  148800. 0xf1a791cb,0x51016d62,0x61a2266c,0x6b1c7ed1,0x271d74a6,0x26780666,
  148801. 0x824287a4,0xb5ffeda1,0xbbe4f0f3,0xcbe503ff,0xb9482a74,0xd7f7f0be,
  148802. 0x088493f1,0x751b2358 },
  148803. { 0xe9c9be68,0xd597b9d6,0x67d10c6c,0x1794b5c4,0x7762b2f4,0xa88cdc3d,
  148804. 0xa1b44e11,0x6d94a63a,0xaaa8eca8,0xfb0bbbb9,0xc963d87f,0xf4b0f2d0,
  148805. 0x5dc7075d,0xb753062c,0x49933989,0xfed726ac,0x57f9ccde,0x5da60638,
  148806. 0x75f8c766,0x221c392a,0x5dc672ca,0xcd264d95,0xb66ecc8d,0x7004ff22,
  148807. 0x18a458ba,0xfb1aa9ae,0x8babd653,0xea9644df,0x2ba0de7c,0xa9378e80,
  148808. 0xca2c6c75,0x144cc12d } },
  148809. /* 146 */
  148810. { { 0x2989aa3a,0x593a0a1d,0x59e6e64d,0xd83f2283,0xd32e732e,0xe938b0cb,
  148811. 0x3c3cb249,0xf4c464c5,0xf89ea6ac,0x9750a5f8,0x346cfc32,0x467e5bbf,
  148812. 0x37b2b809,0xc9bfab9d,0x3b339c6d,0xf8eb7453,0x3b766dee,0x3fe01fbe,
  148813. 0xef6aea27,0xb3154254,0x7be61b10,0x555c3df2,0xdd818488,0x70fb6d81,
  148814. 0xbbe714f9,0xda1af3a4,0x9d18f693,0x575f2017,0x2465b839,0xdc08fc6b,
  148815. 0x6b84a951,0x874ecf33 },
  148816. { 0xbbb3f6be,0x624af83e,0x08bb423d,0xf578fbb9,0xd7873527,0x5623b0ba,
  148817. 0xa62e0442,0xc3659bd8,0xfe236f79,0x2903b167,0xe53f26a6,0x55a430c6,
  148818. 0x3ad712cf,0x222547ae,0x76eb272b,0xb73890d7,0x3d628df9,0x95b4f70b,
  148819. 0x53eae4ac,0x9f0e13b0,0xe7f2174e,0x5b4f5138,0x98dbae17,0x75482cf9,
  148820. 0x44518480,0x2b69bbde,0xcafef15c,0x4f279652,0xb6bcaf19,0xa0a3ef2b,
  148821. 0xce4c634f,0x31fb8581 } },
  148822. /* 147 */
  148823. { { 0x615cd607,0x398306d1,0xaa32c3a6,0x680c9faa,0x7779131d,0xe87a705b,
  148824. 0x36708b00,0x1031013a,0x9445297f,0x814fa0e1,0xa6a79b56,0x70c5583a,
  148825. 0x4b16bed4,0x03039cbf,0xaaaaf8d3,0x18a7ca8d,0x5cdb68a5,0xf33159e7,
  148826. 0xd23814fa,0xdea0e738,0x8d0f4f9f,0xeb352718,0xdcdff032,0xb0b76609,
  148827. 0x3d48338b,0x65ba8ea9,0x55dd507a,0x18044d82,0x4a4a50b4,0x844a223e,
  148828. 0x18e19e54,0x98323000 },
  148829. { 0x57f3d5a6,0x28a21027,0x6e8cadcd,0xffce5648,0x02551f3b,0x9590381b,
  148830. 0x935ebdf1,0xb26cc64f,0xc083aa6e,0x60611291,0x88e4cf41,0xcd988a66,
  148831. 0xdd53b1b5,0x581c3f73,0x77fc621d,0x78c804a9,0xfadca2fa,0x31874330,
  148832. 0xc83ccf02,0xf7008da4,0xa79a4707,0xc4122a1d,0x4a915eb5,0x9a8e0d3f,
  148833. 0xd0123660,0xa2de157d,0x65ead2a0,0x45ef43b2,0x188db285,0xd0a22ade,
  148834. 0x922e0caa,0x8abbe39e } },
  148835. /* 148 */
  148836. { { 0x3a2d2f01,0xb4446905,0x5dc6685c,0xd27c3193,0x1d74a027,0x6a908bbf,
  148837. 0x5b50ec1d,0x01da350f,0x3f3c2e26,0x1d3dd45e,0xb836ee92,0xf66e11d0,
  148838. 0x474b979c,0x7e03908f,0x98b87834,0x19e7c5b9,0xbd3d1de9,0xa741d3fe,
  148839. 0x1ef6059b,0x63c68e8d,0x3674e247,0x9b9ff939,0x3e7e67f6,0x1d7d53e7,
  148840. 0xaee9e248,0x698dc326,0xb3bd984c,0x52f23eda,0x6f8fe8a7,0xf95e31b0,
  148841. 0xc3d0ba95,0x0f15b4d0 },
  148842. { 0x790a8d85,0x8f2f6635,0xe2595af1,0x51bffbae,0x24b51287,0xd15b7ec6,
  148843. 0x3234715d,0x7639b6ab,0x2bc5441d,0x0cdd5299,0xf6d05833,0x54800ea4,
  148844. 0xf6d6e360,0x21efd752,0x19290613,0xc0b7ffe5,0xeea898cd,0xb68a5825,
  148845. 0x22982266,0xecedba92,0xbbd06bb2,0x678a91b0,0x4bb6b0cb,0xb2436dc0,
  148846. 0xcaf8ea98,0xcf7a99e7,0x71aa05bb,0xb92d0e6e,0xf5993eb1,0xbf8d0471,
  148847. 0x20385ddb,0x515db378 } },
  148848. /* 149 */
  148849. { { 0x6f5bef22,0xee43eaaa,0x20348712,0x952d2698,0x7a3af6c6,0x1e4c484e,
  148850. 0x9a8c9403,0x18d434c6,0x5001899a,0x63e5d741,0xfe8ea40c,0x5238dbbc,
  148851. 0x96798721,0xca6cc8d2,0x04acbde8,0x73db6aee,0xb7f993ce,0xbf69328d,
  148852. 0xad45e334,0xa3f79bbf,0x7c1f1630,0x8c51ec93,0x9b00a6de,0x4907325f,
  148853. 0x12d82bc3,0x49e6acb4,0x0ec59fc9,0x5901b36d,0x9cf34e3b,0xcb09b710,
  148854. 0x1abf4c02,0x2de0487e },
  148855. { 0x8dd9d484,0x18b722f3,0x7c77bacc,0x83349393,0x93d92b8a,0x58dbb8f1,
  148856. 0x8e3fac25,0x80d78d50,0x745f4a7d,0xf0500981,0x877cc29d,0xd072bfed,
  148857. 0xc30a89f8,0x67abf8f2,0x9a0820d7,0x92c567ea,0x8a3a5738,0x425ab12e,
  148858. 0xf055521b,0xc162faeb,0xb94ea5e9,0xee1c4f26,0x3d71e546,0x1e414994,
  148859. 0x43e8be1d,0x258183b8,0xef9eae0b,0x44917c82,0x73874a30,0x6813a457,
  148860. 0xcc42f86e,0x6f6ac071 } },
  148861. /* 150 */
  148862. { { 0x4dd6e3b1,0xd38822ad,0xad620869,0xfc78e1cc,0x2cacde80,0xe7843845,
  148863. 0xa8469fe3,0x121cc14a,0xe67e8ef2,0x8e8f3da7,0x4d347448,0xdb83d16e,
  148864. 0x798631f4,0x3ba1dd98,0x0a4c4c17,0xdfab5977,0x3edc701f,0x1f0a1306,
  148865. 0x6cd8ff28,0x4649d601,0xbcc55bc9,0x2267230b,0x5760412a,0x02a19c60,
  148866. 0x328faef6,0xc719d5f1,0xf67eaad9,0x27cb969e,0x719bafb5,0xf342530e,
  148867. 0xff5a82cb,0x6e2c24cc },
  148868. { 0xadaf8793,0x6313024b,0x035c948e,0x944bccf1,0x953500bf,0xe9a066b7,
  148869. 0x1d116765,0x7991a946,0x9fd93c78,0x95addb2e,0xe92e5495,0x05d2c037,
  148870. 0x9f03e5cf,0xcb145b18,0x95aa1f72,0x81ae48ca,0x135a6e4f,0x203f2702,
  148871. 0x49b2a7d5,0x2bcef5a2,0x02d7f2a3,0x0687a900,0x6c6745b0,0x2f7d3228,
  148872. 0x86507305,0x3da8a875,0x2e8dc58f,0xbe38b884,0xdbf11185,0x6b48bf34,
  148873. 0x97c08f91,0x5af7fd0d } },
  148874. /* 151 */
  148875. { { 0xf4a224a5,0x55f9b950,0xcc50273a,0x41904574,0x643f1fd5,0x34f81330,
  148876. 0x0e50f783,0x996801bb,0x89581712,0x866d7403,0xa4091d36,0xdb9a405d,
  148877. 0x16a46fe7,0xf1e379df,0x83bf9168,0x8d04a93f,0x32b20bca,0xae4c8335,
  148878. 0xf72a1c10,0x99d334b1,0xd8195db4,0x8fbc9977,0xfba14b5d,0xcaeb3dff,
  148879. 0x76daf476,0x60fef022,0xdb5b72f4,0x4b948dfe,0xb6dfb062,0x5185c925,
  148880. 0x9609d4ae,0x27a9c381 },
  148881. { 0xf12a93af,0x73c37346,0x5536634d,0x028b707c,0x498193d1,0x8efa58d5,
  148882. 0xef21b69d,0x4f83a5cc,0xa788a0e2,0x05cbb0a3,0x65b13c98,0x01031781,
  148883. 0x2b73784c,0xfea20e58,0xe50361f2,0xdf9713a0,0xd0cc22d9,0x31449a0f,
  148884. 0x7c5e2e1b,0x183752e7,0xb67044cf,0x6e44d6bd,0x733e177a,0x012dde95,
  148885. 0x08ee2c23,0x68b49669,0x1f5f1949,0xd9bb0541,0x6acd886f,0x95182c71,
  148886. 0xfbde9244,0x1c690694 } },
  148887. /* 152 */
  148888. { { 0x3a880026,0x5db67d17,0x125d95f2,0x89c4f0a0,0x3f6cb7a4,0x29050551,
  148889. 0x5cbbdca5,0x3eb231d1,0x972bcbd3,0xf8cffc99,0xad55a03a,0xcb4ef4d4,
  148890. 0x22867c2f,0x944d47ca,0x0ead1aa5,0x96d88548,0xcbc8b045,0x76a57cf8,
  148891. 0x005e55a0,0xdfe5844b,0x1d18a097,0x5e9e7e19,0x52923c74,0x957a26e8,
  148892. 0x7f5db339,0xd0867b79,0x63bed0c8,0x2553408e,0x689ad23c,0x1596e5d5,
  148893. 0xa504c339,0x7b8c13d6 },
  148894. { 0x52fb6901,0x2fc43aad,0x16ca253b,0x1c0313f9,0x515aadc6,0x1475830a,
  148895. 0x7f577dc2,0xc93d1926,0xf723c0dd,0x26e52e8e,0x3eb9f6da,0x2f1e0eb8,
  148896. 0xf180376d,0x9979de82,0xb0834939,0x43e28ecb,0xa39c38e7,0x9a2d51dc,
  148897. 0xa8e3f6b5,0x6e6063a9,0x4b9b3270,0x4cf1da3a,0xd2f8915d,0x6e5348a2,
  148898. 0x50507912,0x5e75e3e0,0x20d383fa,0xaeffce57,0x8fd2fb29,0x1d6d53cc,
  148899. 0x696f4cd0,0x0e3c3ef6 } },
  148900. /* 153 */
  148901. { { 0x21ee1d83,0x3bc337c1,0x787b7788,0x97e08f6d,0x138fa4ce,0xbf709fcc,
  148902. 0xa0348e58,0xbaf77647,0xa55e672d,0x04f8babc,0x7d5ec5dd,0x0ed2919d,
  148903. 0x33e99218,0x8ce64bff,0x24b059af,0xac09fc57,0xdc5e32ba,0x506831f9,
  148904. 0x465af6a9,0x26a22677,0xc97f1ff8,0x3c5efe66,0xbc6087fd,0x1515e0d6,
  148905. 0xaa8edc6b,0xb1a39c5e,0x0e79ed29,0x3dd816bb,0xbc3788b8,0x6cc13769,
  148906. 0xc092a51c,0x463098e3 },
  148907. { 0xc8bd0fa7,0x3a6408c7,0xce6bde49,0xd1764311,0x283ef7be,0xe315e108,
  148908. 0x99b5d938,0x8213cc77,0x45a49a6b,0xaf7f1581,0xe529e4d1,0xd00fdb0f,
  148909. 0xce66c9d6,0x55d38f77,0x1bd4b952,0xb4f7ccc0,0xaf71f986,0x8d975b49,
  148910. 0xcd64d00a,0x12b59fcb,0xa5a3bad7,0x1860e504,0x2b5c89f1,0x6d976044,
  148911. 0x7a3e231f,0xfed0c659,0x178cba92,0x58114c33,0x6698e11e,0xe2e74c06,
  148912. 0xa348b85a,0x7f8fd093 } },
  148913. /* 154 */
  148914. { { 0xc19428af,0xf24592ca,0x3a308665,0x192a1c81,0xe30bbd7f,0x42589812,
  148915. 0x836c6bb9,0x10db0723,0x598e4987,0x9c7a41e9,0x6ead6f4b,0x8aff179e,
  148916. 0x75862c44,0x70f8f9b9,0x6f21983e,0x6b3b0237,0x98e65152,0x25d83e9b,
  148917. 0xd751218a,0x3b2d26a8,0x9d6f1da6,0x9508281a,0xa5a81f74,0x8df78d05,
  148918. 0xe4687471,0xd79ee559,0x6787d8cc,0x2060ca57,0xa8476c95,0x427a84ff,
  148919. 0xe6435131,0x87b64c51 },
  148920. { 0x4b30d3c4,0x87f46f65,0x23b4ef14,0xcdec4c5c,0x63ca4d68,0xb3b74766,
  148921. 0xcf3fb56d,0x1df34269,0x0fd7d46a,0xd4f139c4,0x6a69a8bd,0xa3b7c7c7,
  148922. 0xcbadd7d2,0xee56b4c9,0xac942334,0xb28ff342,0x786f1da3,0x0046fdfa,
  148923. 0xb700c82e,0xce5d149c,0x50966597,0xca30ef81,0xfcff4bdd,0x44a20609,
  148924. 0x44925268,0x0f2f65e7,0xd4021f38,0xe5b6552c,0x042dbbd0,0x77ea9c2a,
  148925. 0xd9c062f5,0x8c95267c } },
  148926. /* 155 */
  148927. { { 0x5fc1abb1,0x6655032e,0x12fe4743,0x2215af54,0x29f05ef5,0xfd657560,
  148928. 0xdc191be9,0xb0e73325,0xc08639b0,0x7ab3c65e,0x1c3e6673,0x67507f51,
  148929. 0xc8615555,0x638befc3,0x42f0c4ad,0x5d0188cf,0xd896186d,0x843a301c,
  148930. 0xb2c6741e,0x045603f7,0xfa3cd1d0,0xf7545c0c,0x4a40672e,0xf612affd,
  148931. 0x45b9e8dd,0x56197c9f,0x87922d74,0xb453237d,0x4b2d59bf,0xbf132e3a,
  148932. 0xb84a6a16,0x8afa1b73 },
  148933. { 0xe793ac70,0x6b3596ea,0xeef6dd10,0x4c94ef8e,0x70422e40,0x926b4fa2,
  148934. 0xe9e5d763,0xc8c71dce,0xf512aadf,0x352fcb70,0xa883975f,0x1b7ba138,
  148935. 0x058c3b13,0x57991390,0x97740fd1,0x9692092a,0x160b0697,0x19ad945b,
  148936. 0x10837ab2,0xbc634388,0xf174bb71,0x76ee11c4,0xab1b80eb,0x6111bfc1,
  148937. 0x70ec458a,0xbc82bac8,0x312d3325,0xeee60127,0xb240adc8,0xb4118b1a,
  148938. 0x2b5a093c,0x67211191 } },
  148939. /* 156 */
  148940. { { 0xf55cf9bf,0x91e99306,0xa46b96d9,0x9b045308,0x9e7a65df,0xae3c1e1d,
  148941. 0xc731bcbb,0x453cb151,0xa4d58a61,0x14be5227,0x97c74cc2,0x39dac922,
  148942. 0x822e00d6,0x4d0f7a45,0xc62b03df,0xafeb1d51,0xbaa18b2d,0xbb1dc3a4,
  148943. 0xdf2b74f0,0x7f3c7178,0x896b6a33,0xfcd328a6,0x1dce055f,0xe95ed454,
  148944. 0x6a4e2b87,0x97fbc76b,0xfa59dce9,0xe5ec67f1,0xcc0367c1,0x052368ac,
  148945. 0x54e4a3fe,0x7c863916 },
  148946. { 0xca7388cf,0x55e94b5e,0xc0335d38,0x17cc0a60,0x616f85ba,0x9b69b78b,
  148947. 0x10122980,0x705d02ef,0x1cfd0a79,0x565a6e80,0x7d1ee352,0xeb74a96d,
  148948. 0x427b9dad,0x5c8832ed,0xe6d5330f,0x96ea8528,0x18d24ee8,0x30d8862b,
  148949. 0x9ff939f7,0x9cd38ed5,0x01060252,0x690fc9a2,0x2303b3ff,0xc62d88b8,
  148950. 0xdd52b469,0xfc42d7a4,0x8cad2d93,0x06f8dfa2,0x60920438,0x50236090,
  148951. 0xfce855ad,0x32582758 } },
  148952. /* 157 */
  148953. { { 0x359e8c60,0xeb20e45f,0x364ca186,0xc71bb8a5,0xdff8e110,0x02b15071,
  148954. 0x4c93e578,0x074e91d3,0xb829d0d8,0xc0326e00,0x626a83fa,0x3c192258,
  148955. 0xfb29a09e,0x387a64d5,0xe5ac5c82,0xcaaa3d34,0xada2da29,0x8ed685e5,
  148956. 0xeb29650e,0x92720267,0x763802f3,0xf7184b19,0xdf6b1aea,0x23f5dd0e,
  148957. 0x25e6125d,0xbe1fa347,0x0c872a1a,0xd6287f9d,0xac57c3af,0x49aa93d2,
  148958. 0x5bda7656,0x1a4e6a71 },
  148959. { 0x554d1267,0x1a126ede,0x1cd02b48,0x37f94533,0xce31fb1d,0xd70af04c,
  148960. 0x097dc012,0xcf410b0b,0x36c7b6c5,0x930e1d17,0xc6891085,0x902fee41,
  148961. 0x79fb638f,0x349ba4a7,0xacd6f8df,0xa16c5821,0x2e076ace,0xfb3b83c1,
  148962. 0xe501d14d,0x6b8d033b,0x20f2d2da,0x0593d452,0x99df1880,0x3752526d,
  148963. 0x9feb33a6,0xca32351c,0x1f6ef456,0xd91343bc,0x35b9dc8a,0xc74857db,
  148964. 0x85b4e832,0x856a7c93 } },
  148965. /* 158 */
  148966. { { 0x0d0a5583,0xa007d002,0xeda4658a,0x2f1301dd,0x34d939be,0x91c07964,
  148967. 0xa70c0836,0xa0cb6780,0xbe81e540,0xc0b4df95,0x5d4ac8b8,0x6cbbcd34,
  148968. 0x54756239,0x57c52ed0,0x1805ceb6,0xcac2dca4,0x79344255,0x915ee6ab,
  148969. 0x24c9a2a6,0x366def31,0x8c12c674,0xbd3b962f,0x7dbb7c3b,0xaab64f1b,
  148970. 0xe22bb95b,0x3c0e4553,0xc4c63b74,0x2408feba,0x2a4da631,0x3ca77312,
  148971. 0xc636da40,0x62889084 },
  148972. { 0x8cb8d208,0xa457fd53,0x543f06d4,0x7a8f8009,0xf2eff2ab,0xb66de154,
  148973. 0xf72517e7,0xfddb28eb,0xf9389d2c,0x0149fe66,0xd85b88ce,0x79e8773f,
  148974. 0x0ba543f7,0x452e090b,0xb0b03fc0,0xdeb9b5cf,0x6c5ed77b,0x3113448a,
  148975. 0x8ffc0372,0x3609f3cf,0x5c1b4c4a,0x2bc9c46d,0x8fa59be9,0xe66f3bf3,
  148976. 0xcdb02691,0x1396bf5f,0x009f88f9,0xf1ec59d4,0x2ad9dfe3,0xc2903456,
  148977. 0x5ada4d58,0x79d8122c } },
  148978. /* 159 */
  148979. { { 0xaa529507,0x14d4e4ce,0x74655d00,0x056a0814,0x4f0fc474,0xc0d30a38,
  148980. 0x3443cb8e,0x8a8203ea,0x97f1728d,0x33c62fb0,0xb520ef52,0x8a38dcfd,
  148981. 0x7cac9d3e,0xa0f90d5d,0x873cea50,0x28a7b0bf,0x6c6c41cb,0xd115ae3a,
  148982. 0xa13812c1,0xa35171da,0x624d507e,0x25d4bba5,0x7e98f42f,0x91dad289,
  148983. 0x96a41371,0xffd6b1e9,0xb69e5b77,0xd46c2125,0x20c4f707,0xc7d2b424,
  148984. 0x8142557a,0x2ab3af95 },
  148985. { 0x6a5372a6,0x86ca074c,0x56292ba7,0x728fb83e,0x77741cf5,0x745596dc,
  148986. 0x520ef49d,0x70b4cea1,0x61e46472,0x1472fe34,0x3fb8ac5d,0xf4d6bd66,
  148987. 0xc10bc071,0x46e52cc9,0x371a3461,0x28794efe,0x276fe877,0xa4850718,
  148988. 0x9bef5ab4,0xedad5773,0x3f15c815,0x24c2d9ff,0x8f8395c3,0x188950e5,
  148989. 0x80b6a855,0xbae40996,0x8a8803e1,0x4f53e22c,0x039d25ee,0xaf233f61,
  148990. 0x250409ca,0x07db2c35 } },
  148991. /* 160 */
  148992. { { 0x037d4703,0xc7f3b8db,0xc5f488b9,0xe83708df,0x8471d402,0x1fba830f,
  148993. 0x5a2faae9,0xa55ee8d2,0x5404fc1e,0xc2e5bf10,0xaa2d5651,0x647d5027,
  148994. 0x7ebaf5f9,0x37a53c0c,0x95b30abf,0x7adf0bb2,0xd64c93ba,0x5a62e1fe,
  148995. 0xe2ef4a78,0x7ffc18c0,0x4d2cd04f,0x139dd9d9,0x5ea0af02,0x253fbab7,
  148996. 0x0fef9acf,0x7c8100ea,0xc8615aa7,0x74c5384d,0x9fe52069,0xcb28682d,
  148997. 0xcf7dd759,0x08b6ca8f },
  148998. { 0x036c3b5a,0xe04e5bea,0x7f9f2b4b,0x38726102,0x29797c0f,0xa9fca570,
  148999. 0x82879ea3,0x1656180b,0x607f0ddf,0x153389bb,0x67b0e087,0x99a1223c,
  149000. 0x9d897fc7,0x0d1808ec,0x916edf19,0x9470711a,0x07217118,0xf8f52f2b,
  149001. 0xd18888b6,0x5d8b29ff,0x4cc6f900,0xef1e22c5,0xeb24877f,0xc4036165,
  149002. 0x35479525,0xfda95233,0x6861468a,0xd622a421,0x74faba08,0x5d043b07,
  149003. 0x0d31a7d2,0x2c337b02 } },
  149004. /* 161 */
  149005. { { 0xea22fa65,0x7b2305bc,0xd159f63a,0xbe183ef4,0x3f35923f,0x3473d87d,
  149006. 0xc11d7753,0xb27fb306,0x2a054cff,0x702e7e6b,0xaf185619,0x3ce9f97c,
  149007. 0x4e7d51c5,0x83550243,0xf356ac5b,0xa63e3d82,0xd7645131,0x867b7caa,
  149008. 0xa671fc9d,0xee85e6af,0x2b07cd77,0x3b985ede,0xffda5193,0x07d598b0,
  149009. 0xa942dc36,0xb10eca39,0x506218a9,0x17f3dcee,0x06b7d5ca,0x3d94e8d1,
  149010. 0xed8831c9,0x509b2634 },
  149011. { 0x48caed54,0xb1b9414e,0xcbf51e97,0x77a78c6c,0x4de9b258,0xa4688c8d,
  149012. 0x91ee3d78,0x0024137c,0xe30ee64c,0xa68f9234,0x88190d78,0x573255bc,
  149013. 0xba80690b,0x41e8e05f,0xec354f4c,0x50038d84,0xdfa52816,0xb18f02d6,
  149014. 0xccb63fda,0xc47f9007,0xe98ae455,0x29d480fb,0x5d0e319d,0x4ac45d22,
  149015. 0x026db719,0xd06f3575,0x2c3587b9,0x733b9e20,0x2c317727,0x22483992,
  149016. 0x54bb8752,0x1592d5a7 } },
  149017. /* 162 */
  149018. { { 0xcf7453f0,0x5778d9a2,0xed83c1f0,0xaffb899a,0xe0a82ba7,0xae6506d3,
  149019. 0xea3d5081,0x32c84e1a,0x810aa38b,0x9ad528c0,0xbd37d041,0xb1fdb020,
  149020. 0xd06ce41f,0x78d6cbe1,0x2e74b7f6,0xd287f0f0,0xc43bb022,0xf5cd2575,
  149021. 0xf81a71b3,0x6d28f2f3,0xc633e7f4,0xe65bb1f5,0xc4fc580e,0x32e5fc1c,
  149022. 0xbb7b07a5,0xcd55539f,0xc3caaf3a,0xb5a94471,0x4cc22d2d,0xb958bdf4,
  149023. 0x77a2777c,0x1614bdbd },
  149024. { 0xed0ab04d,0x4c1f0230,0x6e2082ea,0xae347b00,0xc42c5b5f,0x9f10bc63,
  149025. 0xde019935,0xb0539e6f,0x65dd0825,0xd89bd4e7,0xbbceda16,0x92260fef,
  149026. 0xe62aca32,0x8aaa755c,0x5ec82c5f,0xed762fa9,0x18650768,0x99e64c01,
  149027. 0xc92e348c,0x57dd6245,0x31ea6d68,0x0db88a77,0x07b44736,0xef0012ab,
  149028. 0x171d70fe,0xb9356b94,0x03f891b0,0xe68b0628,0xb79c20a2,0x3a54a53a,
  149029. 0xb00b0728,0x489656c7 } },
  149030. /* 163 */
  149031. { { 0x71353c25,0xe43649ba,0x13f67e24,0x517f27a1,0x1c1eb9e3,0x10bd333a,
  149032. 0x78e29bf9,0x94e1c05c,0x4743f15d,0x84fe7d97,0x90da2df0,0x9c874908,
  149033. 0x53673be1,0x82403fa7,0x1baea1b1,0x7ebf5db4,0x24180ead,0xcfe0ae35,
  149034. 0xc2f50c3f,0x1d15873f,0x70661cd9,0x16851ad6,0xa51e8c2c,0x802968d9,
  149035. 0xe0161099,0xe7d1a9cd,0xa8a7ea56,0x2b153c89,0x06e3c498,0x6d41b789,
  149036. 0xd6769dcb,0x082bb2e9 },
  149037. { 0xc4d6615f,0x6180ef46,0x01b9829c,0xfc629dc1,0x0fb264ca,0xde222ec0,
  149038. 0x10ecc2c4,0xc5457e06,0x1eea2c4d,0x95ce599f,0x8f9c5b2c,0x0433fa72,
  149039. 0xcd6310f9,0xee035462,0xce2e2253,0x84c57c3b,0x96d87e44,0x6c8ec31a,
  149040. 0xa452c5a7,0x30bfe393,0xa047b235,0xc592b140,0xc018545e,0x7bd8be18,
  149041. 0x5c178c46,0x794e0107,0x2e23005b,0x48471946,0x622a54f3,0x2665e237,
  149042. 0x901c9042,0x36451a46 } },
  149043. /* 164 */
  149044. { { 0x19893e71,0x17802d18,0x539a2082,0xa1765d8b,0x2302ecfc,0xfc6aea01,
  149045. 0x365bf59d,0x8d4cf51b,0x0d232a80,0x87741d72,0x18e80427,0xac343eb3,
  149046. 0xe74739ec,0x553ecb2f,0x1a8b07ca,0xaeca79a8,0x56f4ab3a,0x089ff322,
  149047. 0x3fa1d1f7,0x5e95d729,0xf62a9a16,0x260569ae,0xaa08ddc2,0x5e776232,
  149048. 0x1b7bb54a,0x93fabec3,0x743d56e7,0x48a20956,0xeb0ebeff,0x749cdb12,
  149049. 0x69b8fcf1,0x705307a4 },
  149050. { 0xe488310b,0x7a8e4c04,0x5325cd7b,0x12726e32,0x4983efac,0x5d0fd8b0,
  149051. 0x02ddb913,0x796e552c,0x77b9685c,0x0eeca3f7,0xb15f24a3,0x9b766e89,
  149052. 0x48efc979,0x7c2736d6,0xa8021c6c,0x3d619685,0xa0b2f1ea,0xfe33e278,
  149053. 0xb676d6b0,0x95c69879,0x1af4e0be,0xa0747319,0x36c4ee55,0xa2fab5f1,
  149054. 0x59e5f3b9,0x6938b8ff,0x39cafe6e,0x1e114da4,0x6a6ad120,0xc9595ec3,
  149055. 0x57e62aec,0x80f79bd0 } },
  149056. /* 165 */
  149057. { { 0x60af09b3,0x3cef42a7,0x933dfe14,0x3c016ebd,0xed85eaa8,0x720cf1e0,
  149058. 0xceaa3bc9,0xd4f5e99f,0xb7106f97,0x7216b9d2,0xc9668ad2,0x65f34c36,
  149059. 0x5b0c651f,0xa8fb82bc,0xf2fda4de,0x20f42f1c,0xd21f659e,0xeb31ab2c,
  149060. 0xa13d1618,0xb7a776c7,0x38662be5,0xec441022,0xcad08e0b,0xc825da70,
  149061. 0x022c0180,0x99299079,0x2aef9ffd,0x7623bda0,0xf5c58b50,0xde84f4f3,
  149062. 0xd824ff19,0x5f5a5da4 },
  149063. { 0x7e8311dc,0x5737257e,0x466cf136,0xdef94f51,0xb05ca21a,0xa73e1645,
  149064. 0x02e4ab37,0x38ea9b3c,0x8579165b,0x7760eac9,0xc24b01a4,0xdffdd047,
  149065. 0x3fb95584,0x188d4fd1,0x25548bda,0xfaac38b8,0x59e9dcac,0x1a79a6f0,
  149066. 0x09a2700f,0x983f720f,0xfb8a7e48,0x8cbba554,0x47a1fad5,0x38a19968,
  149067. 0x5abd6b5e,0x11856547,0xf3716ec2,0x75113d31,0x4212907b,0x1391e781,
  149068. 0x0dc15889,0x5319c801 } },
  149069. /* 166 */
  149070. { { 0x6b61c3af,0x2320136e,0x07b4bb68,0x1d40f2de,0x380c97f0,0x651dee7f,
  149071. 0x6a8c313a,0xa978ba70,0x2011ca10,0x22c587d6,0xab1f445b,0x48bba218,
  149072. 0xe50444e6,0x8c5eaf07,0x442fccf9,0x5549f02a,0x3d80493d,0x2564746f,
  149073. 0x79c04591,0x42d24f61,0xabdc8887,0x1600fa18,0xded38f8f,0x5cb8600a,
  149074. 0x923aeb46,0xa4bf9b90,0x1e1c578a,0xd63fee35,0xebb9ea14,0xf3c9c5ac,
  149075. 0xf11a4ff0,0x3d13314d },
  149076. { 0xb4513d1e,0xe5cc662d,0xd55952bd,0xde78a8c5,0xe7f86d0a,0xe8a37a3f,
  149077. 0x7a04f0c5,0xca2d12a4,0x2e25d06c,0x4c6696e4,0xb2136071,0x52614698,
  149078. 0x89f6e1cb,0xf4d2701b,0x80efd95e,0xaafd6177,0xc5bb6907,0xe6d73ac4,
  149079. 0x420db35a,0x49e874ac,0xf2751fa0,0x11631de4,0xa1fa2edd,0xb29f7336,
  149080. 0xb7fd794d,0x4c406864,0xe22f92a6,0x73cb21d3,0x2043cc76,0xeae904e6,
  149081. 0xb322c6ad,0x67f28a9f } },
  149082. /* 167 */
  149083. { { 0xca148ab5,0x7c17b258,0xb3c60051,0xb9a1976f,0xc8f28df9,0xea260698,
  149084. 0xe8d45017,0x87b2cc74,0x0578a422,0x37257329,0x17bec732,0x81d5ee25,
  149085. 0x1d48bbc4,0xd7411fcf,0x487f5cfe,0x46217e6b,0x41eb8e1b,0xcb007ac5,
  149086. 0xe05a00c8,0xc41c57a6,0xd2f9fa99,0x1f954d2b,0x40941cad,0x370bd5db,
  149087. 0x3829509d,0xe487879c,0x5ceca5ee,0x4c137552,0xfd3efb9e,0xe8ef7fa4,
  149088. 0x1bd1bdb2,0x5ff09174 },
  149089. { 0x579c6632,0x791912a4,0xb8a20815,0xbb19a44f,0x535639d3,0xf4f97b84,
  149090. 0xbc3c9bce,0xe57e2bcb,0xf19e6410,0x122b3f2b,0x1357d9ad,0x1f0189da,
  149091. 0x79e5ff66,0x675573bb,0xef2f3c4c,0x444e5c98,0x04d10731,0xd6f61e20,
  149092. 0xac75d635,0x0dfa366f,0x2c854f23,0x9fc47c86,0x0ad0850b,0xc04ae43e,
  149093. 0x2f720c32,0x5ce94f64,0xa753bc9d,0x67efae65,0xb0373a63,0xc27d30d3,
  149094. 0x29721646,0x6681013a } },
  149095. /* 168 */
  149096. { { 0xe84509df,0x1385d913,0xcf339376,0xe978bedd,0x3423a148,0x2df425d3,
  149097. 0xee8cb579,0x43fa0ae3,0x31c4553c,0xf015369d,0xdfbf1d48,0x05cf08bb,
  149098. 0x9444244a,0xadff4be6,0xa35dda33,0x01635f81,0xe76fab7c,0x085c8949,
  149099. 0x16737783,0x4bd7fcde,0xa254f8d2,0xfd8cb52c,0x413ec985,0x62168a66,
  149100. 0x7a9026cc,0xf2db9741,0x50e1e1b7,0x3962ee56,0xd3beffde,0xbee0a346,
  149101. 0x0bdfab1f,0x3b35b72f },
  149102. { 0x535c3749,0xbff8de9f,0x8add9c48,0x23c1f20f,0xc8f8f663,0xa975b37b,
  149103. 0xe8f3ae49,0x2529e475,0x1d5e2628,0xc32f10d5,0x67862f1d,0x5ac0d297,
  149104. 0x854cbe36,0x13c79338,0x4b67e462,0x48f004ef,0xe5d10ee1,0xfa37a150,
  149105. 0xd28288a0,0x4974778d,0xcfb73f4d,0x96830a66,0x07804952,0x9f444013,
  149106. 0x9760b694,0x8233c709,0x25b75c99,0x8340cca5,0xc771f99c,0x3f62e40b,
  149107. 0xcd95c685,0x47d0a1eb } },
  149108. /* 169 */
  149109. { { 0x652811f1,0x266f4fff,0x62ef3002,0xeaacaa93,0x50cba0ca,0x6c387a55,
  149110. 0x007f5467,0xa350142a,0x202f2673,0xc7fd102a,0x33dc6e65,0x5daee570,
  149111. 0x064a63d9,0x60682ec3,0x462b251e,0x46cf0bb0,0x5da936e7,0x0e030ca5,
  149112. 0x434265b5,0xc87a60f2,0x69b4e8f5,0x9637b2bb,0x7ad7770a,0x601fb58c,
  149113. 0xed3a15a6,0x1f2147f6,0x2995e961,0x05b47d5e,0x83213a16,0xcb0ca9b3,
  149114. 0x4995a85c,0x8f4b614a },
  149115. { 0x4b4eb3c1,0x5aa8ec19,0x20323a70,0x8c549ac4,0x4f6cc6aa,0x00d49322,
  149116. 0x45f9a5a3,0x0e53b9bb,0x0897abbb,0xe46ef110,0xd7acd7d0,0xfe873e57,
  149117. 0x0f7cb588,0x7cfccfe5,0xc85557d1,0x0ea53d65,0x7288f2e2,0xfdd9eb44,
  149118. 0xc0eb68a8,0xab2dedfa,0x08603a0c,0x58221470,0x00feb06c,0x69464689,
  149119. 0x25e5caac,0x804cf5bf,0x9fc91ae9,0xd8559858,0x73c45eae,0xed9378b1,
  149120. 0x524c9801,0x8f942d02 } },
  149121. /* 170 */
  149122. { { 0x8e845808,0x1f1ec302,0xb77abfc5,0xc302bffa,0xf8d97dc7,0x26afd4b9,
  149123. 0x3aac594b,0x3d3a83c4,0x674d94dc,0xe3b74bd1,0xcaa5911c,0x4464b737,
  149124. 0x871c2cd2,0x62925773,0x3b4440fe,0x419f2485,0xe052ad7d,0xdda6a0f3,
  149125. 0x846c86c0,0x645280d6,0xf8324f42,0xa25689fa,0x07cf117a,0xc74ad1e8,
  149126. 0x8ddc9db7,0x5626dea0,0x966fc85d,0x52620373,0xf3b1eb53,0xe0ad57c3,
  149127. 0x949c1acb,0x38300252 },
  149128. { 0x5e744723,0xa0ef5a40,0x1ae08481,0xdb5bcf75,0xfec1f76f,0xabfad8cc,
  149129. 0xfab37fc6,0xfba5d831,0xc8fedb78,0xbe39e248,0xad93f310,0xa5cfad5f,
  149130. 0x913d5c24,0x747fdb1e,0x4518b7f5,0x052a47c9,0x7cfb4327,0x9e208d6c,
  149131. 0x70e538be,0xb135cb9c,0x5bb17916,0x36352759,0x5b3106c7,0xa2c07880,
  149132. 0xc209bb06,0xd2d42a06,0xd3c504ad,0xb525b471,0x822ce034,0xc9f4b368,
  149133. 0xeb4185a5,0x15f18796 } },
  149134. /* 171 */
  149135. { { 0x0aee4684,0x094dea06,0x7cdbdbc8,0x42b21f06,0xb1931319,0xa439e149,
  149136. 0x81a7dba6,0xea4bdd41,0x3c2ae80f,0xc6213706,0x12823dc2,0xb58b0967,
  149137. 0x832611b1,0x7443d515,0x13c20384,0x2e16f831,0x2bd992d2,0x0ce204d6,
  149138. 0xf419388b,0x499dbcd6,0x1d3778c7,0x492ded1d,0xc5ddae73,0x9d5bd74f,
  149139. 0x994b6259,0xd4813d52,0x0e86ca68,0x191d9cf6,0xf3e9c2ac,0x562179ea,
  149140. 0x9fee1238,0x6146f1f3 },
  149141. { 0x078e2aa6,0xbd06d33e,0x9dee9265,0x693af7f7,0xdaa40e84,0xd56e0f81,
  149142. 0x9b9a407e,0x05fbbb88,0xede99519,0xdcf44adc,0x092dba39,0x7f71f8d3,
  149143. 0x4231774b,0x675b5da5,0xa5f605eb,0x7456a251,0x87a39a9e,0x9031d4af,
  149144. 0x05b474bd,0xdb430006,0xb665aa91,0xbda5dbf2,0x6631eeb4,0x5d1a3df5,
  149145. 0x62377c58,0x028149ef,0x685d0bff,0x2e1af4e9,0x82a465de,0xe0ea0875,
  149146. 0x06bd0050,0x95543f9e } },
  149147. /* 172 */
  149148. { { 0x85d7c6ef,0xf7cbc6f4,0x63b1bc24,0xcad8084d,0xbf8cba62,0xdf90ce88,
  149149. 0xb455c192,0x98e4b686,0x774fc6ed,0x6146b8d5,0x7ae20077,0x70e2389e,
  149150. 0x61c22529,0x5241c479,0x3884e5f5,0x7d221510,0x17e28273,0xd6d20ce2,
  149151. 0x4f2674f8,0xe3119f51,0x70c011db,0x85459055,0xfcfb760e,0xdfab75d9,
  149152. 0x9e8c2a19,0x9546362a,0x4a7d4b27,0x4b6d3f8a,0xee5d698c,0xa5c87104,
  149153. 0x2ba296ff,0x6db43478 },
  149154. { 0x5c3f0d95,0x06486493,0x4e748895,0x8917db82,0x6b2f3e44,0xf73fdf62,
  149155. 0x2b7f574b,0xc60edc54,0xaf732723,0xbe1c09a2,0x7cad114c,0x7d34669d,
  149156. 0x321aaff9,0x9646600a,0xed0cd61c,0xb94e2bba,0xdec4750e,0x866e1a41,
  149157. 0xb1a89f58,0xa1be990d,0xf2759693,0xc39e4d6c,0xc0e0dddf,0x11cfb780,
  149158. 0xd99c8a41,0xf0afcd7f,0x6e1c3050,0xcebffadb,0x96d2c6e4,0x4f3981b0,
  149159. 0x2ae27a94,0x07a791e7 } },
  149160. /* 173 */
  149161. { { 0x1e9f0300,0xe70e9047,0xbccdf904,0xe0253ad9,0xff053078,0x51c0289d,
  149162. 0xae893462,0xf1ef092e,0xa4846845,0x2c90a91a,0xf1dad4b4,0x1946eda0,
  149163. 0x33df67b2,0xf07650f3,0x0b15a014,0xc6e988db,0xb542f0f9,0x72e0c66e,
  149164. 0xe0c0378f,0x5d4b6311,0xae86950d,0x548badaa,0xb35f1c8f,0x6801638d,
  149165. 0x944d1ad4,0x129e3216,0x40471d32,0x9951bac8,0x85e94dde,0x03cc29f3,
  149166. 0x4543ecac,0x6d6acc2e },
  149167. { 0x57b2d299,0xeb999e95,0xe3d721cd,0x3a2bcd9b,0xbb4cb444,0x2e60384f,
  149168. 0xdc060faa,0xae177709,0x8c987cde,0x74f0e6d3,0x1076fbed,0x9a237cf8,
  149169. 0x7983fbff,0x69af1513,0x323f9584,0x6c3f7a1d,0x6db64398,0x3e21cacf,
  149170. 0x96703d92,0x7cd8134f,0xb8393f76,0x0755898f,0x2e825222,0x1b5b28bc,
  149171. 0x7924aa7c,0xb78799c1,0x81427a8a,0x1db378f2,0xff289492,0xd5a451b1,
  149172. 0x3d3c46ee,0x79d18212 } },
  149173. /* 174 */
  149174. { { 0x109d5589,0x1a3edff9,0x029b4499,0xded52eb4,0xb4b54adf,0x13eb9d30,
  149175. 0xa27bff67,0x4f9214c1,0x67f0f460,0x4c817ee7,0xc3a50e28,0xbadf8d83,
  149176. 0x94026237,0xc5dc03c9,0x966647c1,0x5f29581b,0x8a0687f3,0x10b6a089,
  149177. 0x31634517,0xae787cec,0x62e75188,0x2001dba5,0x45e2c3fb,0x55d4e1a7,
  149178. 0xb67d3395,0xbfcacdeb,0xbc6842ee,0xa1a0af9c,0x3e88580b,0x50590a2b,
  149179. 0xa784cdc8,0x73104491 },
  149180. { 0x2648d676,0x44ca2cdf,0x4f1b12b1,0x9a85eca5,0x2980e1eb,0x1b9dac94,
  149181. 0x1ac8aa89,0xf30d3709,0xc719e195,0x73072ab7,0x2f703797,0xba518c82,
  149182. 0xac0067f6,0xac090e14,0x8dcd2927,0x0e6cfc70,0x21e7da63,0x4f5889e2,
  149183. 0x8371c7c6,0xb4aaa40b,0x8f7878c9,0x1f9dabe2,0xd84caf3f,0xf78aed6b,
  149184. 0x9e0e1d92,0x3c39dd07,0x122424dc,0x680be5fb,0x0bdc0099,0xf41b214d,
  149185. 0x5180c54f,0x6a8f8fc9 } },
  149186. /* 175 */
  149187. { { 0x53235132,0x62a1ed63,0x59dba88b,0x1db233f1,0x291efdd8,0x85625452,
  149188. 0xb25111ae,0xc7505297,0x1d701bd8,0xb5921af9,0x9774f45d,0xb4d05d72,
  149189. 0xf18e73ff,0x6e3d4c5e,0x899b3038,0x897d985f,0xc89b1558,0x8a9c30fb,
  149190. 0x4d13181c,0x3c92d1a3,0x2223320e,0x292e86ba,0x01ceed02,0xcf2454c2,
  149191. 0x583f309f,0x27a45f74,0xad0fd1a3,0x75a6102c,0xcb9c7538,0xdb4f45d2,
  149192. 0xdb283fd7,0x4752d8c1 },
  149193. { 0xd5dff4d5,0x514d6cea,0x45a827f4,0x74cd5fdb,0x4fc7135e,0x1070a60c,
  149194. 0x1be5778e,0xdec0bb78,0x58dc6b08,0x271e12cd,0x54bc2496,0xb765089b,
  149195. 0x619098ac,0x6ddf2c63,0x67528832,0xfd6ebac6,0xc2508af1,0xeaa2d025,
  149196. 0x4dcfc1f0,0x13c2cda8,0x45510be0,0x1c7836a8,0x1a886801,0x3904688d,
  149197. 0xafaf2545,0x643132aa,0x2830a88d,0x49685577,0x8744b470,0x569491ca,
  149198. 0x75fb8552,0x3a6518f3 } },
  149199. /* 176 */
  149200. { { 0x224042a0,0xaaa8ed50,0x2452f1e6,0x6cb4e3b0,0x768211d8,0xedca5f4c,
  149201. 0xef4d5d3f,0x4e0fe3f9,0x522d46e5,0x33a8e2a4,0xf1446775,0x5998e21f,
  149202. 0xf592d01b,0x1496c50e,0x83a67739,0x69104c2f,0x472bbf00,0x28670bcb,
  149203. 0x503177bd,0x8ea883b2,0x7d2712a2,0xc5d8bc05,0xb439c994,0x41ef9317,
  149204. 0xdcda1aff,0x9801d3a8,0x7038f6fb,0xd686eeb5,0xfbfbf820,0xe80c5cd0,
  149205. 0xedc25817,0x540ac363 },
  149206. { 0xfe7f43df,0xa71969a9,0x2c1b9e4c,0xe6653808,0x859c2917,0xad9677d8,
  149207. 0x96aa4404,0xbaca9545,0xff1297da,0x0e9d855f,0x22aea7de,0x1f61897b,
  149208. 0x36f13f8e,0x96edccfd,0x16e200df,0x627d3070,0xc98988a4,0x729f0736,
  149209. 0x97f231d2,0x95e25e60,0xf6048752,0xaf7f221b,0x4019b299,0xd6682609,
  149210. 0x26b4b1d9,0x1d99de09,0x1acdd7a3,0xec47cf66,0x6ebe15e9,0x4de9f2b3,
  149211. 0xfa16974f,0x17db32ec } },
  149212. /* 177 */
  149213. { { 0x6cf40599,0x75ef6919,0x00c020ea,0x7ea10dfb,0xfcaaf679,0x3da5ae7b,
  149214. 0x88ddd678,0x0d663ca3,0x255bcfcd,0x5a21f8fe,0xe344bc7e,0xe9c3f538,
  149215. 0x548e0632,0x35f62b1d,0x43c6e64d,0x654f2425,0x26993627,0xc755a7a6,
  149216. 0xb0f41324,0xa3b7c5f7,0x3a2180f3,0x05697f79,0x1e81675b,0x6cf85fb1,
  149217. 0xe53428f5,0x6d3cdb35,0x52d28b02,0xe3aa1591,0xf7a3fb78,0xa8470255,
  149218. 0xa194445d,0x460bd01b },
  149219. { 0xc24d8077,0xbc34dc23,0x4c720d2c,0x82f4b580,0x6f5d1ffe,0xa29da911,
  149220. 0x92783ce2,0x578af520,0xb5904af3,0xe29f51ab,0xf7aa1190,0x46c570d7,
  149221. 0x571bddf0,0x4a522fba,0xae89bb51,0xbf4e2a06,0x59f3444d,0x799b35cc,
  149222. 0x26cc2557,0xc3028367,0xafcec177,0x94a4e985,0x7c36cbd0,0xadaf7dcb,
  149223. 0x75d39077,0xed31b787,0x2d3e24bc,0x52d6904f,0x1f95421b,0xc5ca2669,
  149224. 0x1734878d,0x7d342c3c } },
  149225. /* 178 */
  149226. { { 0x11fd127f,0xe5cf2c0a,0x119e4c5e,0x66d36bb8,0x6ef56ac3,0x621ab252,
  149227. 0xe5430675,0x30cfeaee,0xac3e9619,0x2ede27d2,0xf8fce671,0x6413513a,
  149228. 0x075f4c3d,0x6159c61b,0x59069d98,0xd447efe9,0xea76aea9,0xaf8d6f68,
  149229. 0x0f5bd164,0xac5dc61b,0x1e88bb98,0xdbab446e,0x1ba92320,0x618b8b16,
  149230. 0x78989865,0xa0eafb3c,0xc08b7e82,0x0c7abcc2,0x20d160bb,0x10f09b6e,
  149231. 0x8e4c63a7,0x5be0afa6 },
  149232. { 0x1bbbf49c,0x82ab6d38,0x8c0703fe,0x3e09ce49,0xe10f4263,0xeca58b5d,
  149233. 0xda5a4532,0xd9cc6581,0xf618f7b7,0x07e18876,0x250f7fe7,0x0419a5e3,
  149234. 0xde6b86be,0xbb1a9e90,0x37359169,0x584a7deb,0x5149db2c,0x38eb3489,
  149235. 0xb0ebabb8,0x14546a33,0xc2f88a92,0x0067f0b0,0x0a2db019,0xbde0dfe7,
  149236. 0xc63e6f3e,0xba51b06c,0xe9206fad,0xa19127b9,0xfe80dc0a,0xe4eb5e87,
  149237. 0xd4de30ae,0x1e6fccf5 } },
  149238. /* 179 */
  149239. { { 0xaa8ac924,0xb57dff66,0xc298b3e8,0x06e9ad31,0x65fb080c,0xd140e329,
  149240. 0x1d95c93f,0x7dab211d,0x8a180caa,0x6d68d842,0xa20ded69,0x1a929408,
  149241. 0x38df461f,0xa8151753,0x60eae932,0xff5604ae,0x7dae4c0b,0x901b9e49,
  149242. 0xde262e89,0x4573a97f,0xf1084983,0xed69d9a4,0x64724f1d,0x8ffa022f,
  149243. 0xea85a15f,0xd5f1c2e4,0x01453794,0x4c626ce9,0xbf0907dd,0x80440cd6,
  149244. 0x5ddaa837,0x4522d461 },
  149245. { 0xebfbe7c5,0x8895f079,0x84ef3446,0x30ea1ded,0xd4a1ab96,0x716a9eb6,
  149246. 0x50a30c68,0x1a4a5d22,0x0043bbaa,0x5a16631c,0x5010e5f5,0xbd107502,
  149247. 0x3d8c0556,0xbffe3e9d,0x07772419,0x31b30b18,0x84b82297,0x90ff7ef0,
  149248. 0xf21a18c3,0x00c37d75,0x565bb8f8,0x18d0a635,0x45e3bceb,0xbac1da2a,
  149249. 0x23f0b08d,0x1c38e90c,0x5fbc5ac5,0xf1ba1aa2,0xdda71fc6,0x09d5256b,
  149250. 0x6d7e40ba,0x346501a9 } },
  149251. /* 180 */
  149252. { { 0xcc2b0f1d,0x86be448c,0xac4c3703,0xe3eb45c9,0x9fc96bbf,0x5387f65d,
  149253. 0x5ae27fda,0xcef3c4e9,0x1bc18089,0xa008f776,0x22ca18a1,0xf374a084,
  149254. 0x53b73371,0xee882842,0x7cc09354,0xcb6fc6d8,0x61496d6b,0x8489ec1b,
  149255. 0x49e325c4,0xa92c29b9,0x7bdec166,0x15c6ca52,0xdcea2813,0x95444eee,
  149256. 0x3a21154f,0x34683eb3,0xd39061cf,0x8fb26f98,0x06c940bb,0xc3b08aa8,
  149257. 0xe554c96d,0x7c1d42cf },
  149258. { 0xdc110aa7,0x766e703f,0xf362e378,0xab7b79d7,0x5aadca3c,0xd259c75d,
  149259. 0x60be3373,0x2a6eca79,0x06c4e8ff,0xf4744a4b,0xf3b705bf,0xb2842cce,
  149260. 0xae304b53,0x1a3af5aa,0x1b2d31b8,0x7bbfa201,0x4bee88d9,0xc4ba6eba,
  149261. 0x565cb839,0x2d3565ce,0xdaf7ece8,0x24808696,0xe6959745,0x2c7ccce7,
  149262. 0xe94f9837,0xefd6eb3c,0x3811a326,0x0a33b4cf,0xfffa93a6,0x14203f43,
  149263. 0x73c31d90,0x031e9828 } },
  149264. /* 181 */
  149265. { { 0x765a17ff,0x4fefecfc,0xd1290a65,0xa09f3888,0x938da038,0xbf265c46,
  149266. 0xa169ad46,0x4bb6145d,0x23a62fe8,0x33cf8214,0xabc860a5,0x562df571,
  149267. 0x815c38c4,0xbf2a90fa,0x17eda875,0x45ba1d6e,0x946fa5e1,0x799d881a,
  149268. 0xb90f5a3b,0x6c1be784,0xb10ff52a,0x0910a37c,0xa4f4fd36,0xc38c1fe4,
  149269. 0x8e2d3ba0,0xc3180fc5,0xb17a6187,0x3e2ff050,0x943a35c2,0x3a00059b,
  149270. 0xa28cc51c,0x494d3645 },
  149271. { 0x4ba021f8,0x398426b6,0x796deb6c,0xd14c9083,0x7e36c762,0x6d2e5395,
  149272. 0x751cf216,0x8f556eca,0x19b24a19,0xdaca1e00,0x4b20c2ae,0x47887da4,
  149273. 0xff41a733,0x93ed4ccd,0x5c7c0cd7,0x8d717c44,0x91bf7009,0xcc48634a,
  149274. 0x3b59bbaf,0xa1f146f9,0xe5624f15,0xdd38bb39,0x303f8443,0x96d41aad,
  149275. 0x4bf104fc,0x6b670f03,0x29706582,0x0503f9ed,0xb34200f5,0x768e1f47,
  149276. 0xbbd4c6f3,0x3cfdcc5e } },
  149277. /* 182 */
  149278. { { 0xb523e13d,0x536c2a86,0x2920d0a0,0x1014a458,0xe7571296,0x3d52b478,
  149279. 0x7eb51bea,0x05746066,0x87b0e919,0x709f7861,0x686888e8,0x028aed88,
  149280. 0xd94afcd4,0x79a809d7,0xe2129af3,0x50c6032f,0x983c4082,0x75e4be72,
  149281. 0x7ab3be8e,0x98331bbb,0xb618c728,0xd31a032c,0x3f59c4a4,0x36dd85a1,
  149282. 0xed4f61e2,0xdbece345,0x1e571715,0xba7aaccd,0x64a1ebd7,0x138c58da,
  149283. 0x3d1aeea1,0x89296d0f },
  149284. { 0xcca82c97,0xb165288f,0x1427e8dc,0x26c6c12d,0x4c3edda9,0x66a94f07,
  149285. 0xeaa01ebe,0x94600e1e,0x30f5e86d,0x14abce7c,0xcb456a31,0x741d7020,
  149286. 0x279f42c2,0xab05aa13,0xd4238468,0x70b60faf,0x318d39e6,0xa18efec1,
  149287. 0x8920b318,0xeb07f1ac,0xd8399e03,0x01e3cba8,0x3c81a301,0x65f8932e,
  149288. 0xccc667d8,0xae8bca7d,0xa268607c,0xcee1ae79,0xcac0a12c,0x3182e64c,
  149289. 0x2b1a4c54,0x9233a2f7 } },
  149290. /* 183 */
  149291. { { 0x0acbee17,0x717e8df6,0x5c24fcdc,0x0f0959c2,0xe54ffcb0,0x46f09887,
  149292. 0xd285116b,0xb993deca,0xbba1fa51,0x0bfaa4f8,0xd0f2183e,0x9c9249ef,
  149293. 0x96847779,0xf93cb358,0x2322d421,0x284bfb7f,0xd42af009,0x40cc709a,
  149294. 0x9bb1d615,0xc69f2274,0x717c3c6a,0x76f50b3a,0xbb9c5eeb,0x8b21e985,
  149295. 0xa4783b5f,0x58fb19ae,0x52e1c3e7,0x04c86b9b,0xf2971ac8,0xaca59092,
  149296. 0x21ed8291,0x2bb26a69 },
  149297. { 0x15f81416,0x98a34435,0xaaff5bb4,0x086e72e7,0x0317261c,0x3d1f64de,
  149298. 0x5c0a1cfe,0x31c0786c,0xb3683401,0x542ea4d8,0x1a39b4cd,0x2f77273a,
  149299. 0xcbef27f1,0x14fe7ee1,0x16bb27dc,0xee7fc09e,0x410e5dc7,0xc0dccc17,
  149300. 0x1943b3dd,0xa3466742,0x3f31c1b7,0x92934b60,0xc22c1070,0x0186ded9,
  149301. 0x799f966b,0xa37ee8ba,0x249b0893,0x0f3bfcb4,0x2e92d4de,0xbae61447,
  149302. 0xe196eb08,0x937cb3f8 } },
  149303. /* 184 */
  149304. { { 0x16fbfdce,0x57c0e77c,0xc98d4cc0,0xea034cc9,0x42572d20,0xe7606d72,
  149305. 0x0019a83c,0x9861b55c,0xf1597162,0x80ba2803,0x05a0fd7b,0x0f4141dd,
  149306. 0x4b0daaa2,0x8865913b,0xaa3848ec,0xe6685746,0x3e0485d2,0x16d15a5a,
  149307. 0x3b6905dd,0x81c0c774,0x818af2ba,0xcec31b7d,0xd2b74b78,0x80d8f194,
  149308. 0x543e2f28,0xca659db2,0x9fb07c1c,0x31b83a7d,0x1f1048c0,0x86537fdc,
  149309. 0x78586a11,0x4d57bb07 },
  149310. { 0x53b396b6,0xbc4b768a,0x93b51dac,0xbc8b24c4,0xa30ae1b3,0x33e511eb,
  149311. 0x945147c5,0x893bbd95,0x179fe3ce,0x6cc86031,0x3f920bd4,0x34b0a167,
  149312. 0x6b256160,0xb32912eb,0x9d168d83,0xbc69a2a4,0xef0dd128,0xb4949e7a,
  149313. 0x872699e1,0x2613419a,0xbf21376b,0x06c58477,0xa4f97147,0xe55b1909,
  149314. 0x7b9b745f,0x63d6eb75,0x08df3c85,0xb5365b29,0x55fcfae3,0x0e257e43,
  149315. 0x979f2aa8,0x1067c118 } },
  149316. /* 185 */
  149317. { { 0x32bf8883,0xc8455084,0x6fd06667,0x4755286a,0x77c2335d,0xd70b0f8f,
  149318. 0x2f4a2c94,0x678e60da,0xd118acf5,0xa468d8ac,0xbf5b90d9,0xce93830b,
  149319. 0xed4e9104,0xea4b1c74,0x27776ea4,0xac67316d,0x361bab12,0xb98ad75c,
  149320. 0x99122451,0xc323d482,0x530a43ae,0x26440220,0x3292d5a5,0x3a44532e,
  149321. 0x5fecf1bc,0xdb48694b,0xc667b8b8,0xe4e0516e,0xa4306ade,0xb3aa595f,
  149322. 0xf34e9725,0x7e4f7091 },
  149323. { 0xb7f70919,0x3f3816e9,0x16b003f5,0x765216ed,0x778c99e5,0x46c6cff4,
  149324. 0x30a51810,0xe6a5abe8,0x45e728db,0xef6f49e6,0xcaccefd6,0x6fdd73ea,
  149325. 0x8c37f3f7,0xec394e6f,0xb6407fc3,0x73320802,0x96625cbd,0x988e8f7a,
  149326. 0x7cabfb00,0x83292363,0x407f359a,0x258ba9df,0xccbfae50,0xff01aee5,
  149327. 0xfe251813,0xfbeaeace,0x83f1cba1,0x9c69f161,0x9eadcdb5,0x512c58ad,
  149328. 0x6ccce8bd,0x2ae49cd4 } },
  149329. /* 186 */
  149330. { { 0xc40849f2,0x1239b0e3,0xa441098c,0x5136a4cd,0xe547f649,0x61535a99,
  149331. 0x7a9bbac6,0x92e4bdc4,0x53547af6,0x195a1646,0x8b47a74a,0x85ecb319,
  149332. 0x9de6a2b2,0x278553fc,0x0e2ba52d,0x471c038a,0x35bcba93,0x12ba1b88,
  149333. 0x6f31eca2,0xd4bf50da,0x802b32c6,0xd146e3f6,0x3c64c8c4,0x0c9c0131,
  149334. 0xeed21297,0xad30f12d,0x9c68530f,0x9b75bffb,0x8918de51,0x23c0ad3e,
  149335. 0xa73771b7,0x180e9d52 },
  149336. { 0x29ab77b0,0xc316542f,0xf7aee628,0xdd411d9c,0x353c2f40,0x044c0685,
  149337. 0x4b0ae4cf,0x638dc7e4,0x95fc266f,0xa0924185,0xfd2feb7d,0x639da671,
  149338. 0x5ea39798,0x56858ed5,0x58f3832a,0x7a694f31,0xd316d831,0xa94233c6,
  149339. 0x30a35a7b,0x2fcacb26,0xf1ff713b,0xfef8f7dd,0x59eee2f3,0x8b9b4525,
  149340. 0x156d064a,0xd1b4f91b,0x2f5cfcfc,0x177866c2,0x3777eb41,0x12bc2566,
  149341. 0xd8ab85b4,0x21ca6f3c } },
  149342. /* 187 */
  149343. { { 0xa3e66635,0x0e162b13,0x2a9f76af,0x1ef20a2b,0x46db3356,0xab473a30,
  149344. 0x7802bb8d,0x0840bd77,0xa699b44c,0x5b6baf5e,0x1b2207f1,0xc6e11900,
  149345. 0x790b0105,0xe5de16a9,0xdb67f004,0x22b12f15,0x8a025d25,0x185fad45,
  149346. 0xdf0a1142,0xbccf6953,0xf45034c0,0x4c42129b,0x1c277bff,0x0f740400,
  149347. 0x280a9e18,0x6e440b4c,0x842aa2b4,0x767de8f5,0x05e8d94f,0x3de20ab8,
  149348. 0x20227635,0x5aff5859 },
  149349. { 0xa8458e40,0x805acd20,0x149732bd,0x5a5557d8,0x5f1ca72d,0xc7074131,
  149350. 0x952b5323,0x7f2e269c,0x6494fadf,0x5c592556,0x1a7d2666,0x153b7acd,
  149351. 0x86fe2865,0xa6df063d,0x57d53b6b,0x1e91db13,0xe93ead01,0x9195bb89,
  149352. 0x2963bfe6,0x3d71e1af,0x88278886,0xfab2b9c2,0x3b859b6f,0x77836692,
  149353. 0xf7029dd1,0x6e695174,0x7b984561,0xc7987876,0x5907d849,0x64fb4f1d,
  149354. 0x88d8a977,0x3eab7e1c } },
  149355. /* 188 */
  149356. { { 0x52e5718b,0xc73a94b6,0xf4cee1e9,0xe3aefa54,0x553eedea,0x654e9e63,
  149357. 0x5f3aca1a,0xf2541e1b,0x0d083316,0xd7129489,0xfb7f950e,0x7965af63,
  149358. 0xc74e3e4a,0xd8fc9e0d,0xeaf79ebc,0xb4ee48d2,0x8b7787e6,0xa458a86a,
  149359. 0xf7cceaf0,0xd8c7621f,0xdf67980d,0x8228eeff,0xf9106727,0x210d4742,
  149360. 0xb07e3629,0x91f63501,0x7971e29d,0x441761c6,0x03a3b8a5,0xc0ccc65f,
  149361. 0x38e09544,0x3491da4f },
  149362. { 0xcb062eae,0x6706d046,0x5d08776d,0xee7db735,0x292315d2,0x80de8052,
  149363. 0xc402bbdb,0x40785662,0x26ed3337,0x5f93525c,0x7d568ed3,0x6cea14d6,
  149364. 0x66888b1e,0x916a1189,0x5dc71675,0x0fbd5205,0xe4575df2,0x833d1077,
  149365. 0xec092335,0x4e93100a,0x6cd85389,0x2f9e1d01,0x43226368,0xeebd3725,
  149366. 0x1ba4cfd7,0x401d172b,0x574c5838,0x377dab9d,0x80d517de,0xaeaa6958,
  149367. 0x6ad15a18,0x0c843dfd } },
  149368. /* 189 */
  149369. { { 0xc9373300,0x455811ff,0x99fdc300,0x1c39332a,0x353cb655,0xe19bb81c,
  149370. 0x96a83d27,0x774b924a,0xb2ee3f1a,0xcbfc8fcb,0x010d56c7,0xaf278ec4,
  149371. 0xe0abaf79,0x6fde682f,0x7339aebf,0x7566d072,0x71205db6,0xbd35ad5d,
  149372. 0x7051c9d0,0xb5bbe694,0xd3a3067c,0x577db480,0x572d7530,0x2c70ff54,
  149373. 0xe06d853d,0xe8615aec,0x05abfb5d,0x71999ccb,0xea0a8ed7,0xeeefc96b,
  149374. 0x35f6df69,0x2dcc469d },
  149375. { 0xc65f0e77,0xcca6cd06,0xbd71b14a,0xddcc7980,0x3c93cc00,0xb6221f8b,
  149376. 0xae8cbf57,0xddfcd5b3,0x76f8e63f,0xbc92973f,0x06e132b7,0xe9848a34,
  149377. 0xd51ec9e2,0x4cc59a03,0x3a33081a,0x9c9d32bb,0x80e8466b,0x00121052,
  149378. 0x1bbe7295,0xc2b0032a,0x24938448,0xdbfc6572,0xb6bba0ff,0xe972a0ce,
  149379. 0xc0a94802,0xf60c0a4f,0x599d8bc7,0xf62c41cc,0x312da0b8,0x820c96ee,
  149380. 0xcdbdf9fc,0x5a1a65db } },
  149381. /* 190 */
  149382. { { 0x42485684,0xbfba691a,0x29c470c9,0x613116b9,0xe62a0519,0xb4b01971,
  149383. 0x5ff499da,0xf3245aa6,0xa5238eff,0xc2ef87f4,0xcc9d5515,0xc16dc6ba,
  149384. 0x2dbdacac,0x5a7f227e,0xa9bbaecb,0x8dedaac4,0x2e7c9885,0xff308a6d,
  149385. 0xe6895593,0x4c6f2fc2,0x177e0611,0x3655f285,0x300b1bee,0xa63e8d06,
  149386. 0x13c17b54,0xbed0ce79,0xc4974262,0xca4abe35,0xbc4e4037,0xf4b44a17,
  149387. 0xefe5fbd9,0x5ae95099 },
  149388. { 0x804f7455,0x122e5ee7,0x22066682,0x341a4997,0x7795e333,0x97d24c31,
  149389. 0xe48efced,0x12f4123c,0x19fbc21c,0xe8738d92,0x0663a3ae,0xbb3bdc61,
  149390. 0x8593a6db,0x3603d8c2,0xe3c1ac75,0x926227f2,0x5eaae519,0xfea92ac0,
  149391. 0xfd6812ac,0x5b596f0b,0xfc2a82dc,0x3ce7e844,0x63522b27,0x3840481a,
  149392. 0x52867895,0x836088b1,0x26588688,0x21ffb7cc,0x2f4a7cac,0x0ca33161,
  149393. 0xa3edd298,0x4110667e } },
  149394. /* 191 */
  149395. { { 0xc2d04b63,0x81830357,0xf4929a18,0x3fc5a34d,0x22d195df,0xc73bf6da,
  149396. 0xcb432473,0x14df2f89,0xe997f138,0x345afe5c,0x8b9604f4,0xd8e3f5f9,
  149397. 0x50c10ae5,0xad7942e9,0xeed25ff3,0xcefd5447,0x0e73c0cc,0xbf68e51e,
  149398. 0xab54fa4c,0x5b1ad591,0x12b61c8c,0x8bbc1105,0xb5abf760,0xbb932913,
  149399. 0x01e79649,0xdb1231be,0x040ccbe7,0xd0a83e91,0x90a96db9,0x3dde426f,
  149400. 0x34df11ea,0x1cceb645 },
  149401. { 0x0c6d0f55,0x2d210c4f,0x9c673c9d,0x6cadf61b,0xa9ce3fbb,0xdd7f9919,
  149402. 0x93b063e4,0x135f494c,0x145a93be,0x580bdb3c,0x0f52ef7c,0x4d872332,
  149403. 0x8814bb6a,0x74d876e8,0xc7a97dee,0x4f6f723a,0x3e3cd833,0x7de2b8f0,
  149404. 0xae720270,0x6162f082,0xddfa486e,0xe88ec2d4,0x8d3a17c6,0xd965c859,
  149405. 0x3980171a,0x62e59e54,0xbbef6b22,0x0ab6285d,0x4d48b203,0x3cf45195,
  149406. 0x4ea25ea3,0x1f175233 } },
  149407. /* 192 */
  149408. { { 0x3467ea91,0x808a765b,0xfd2d9c45,0x3f4632ee,0x9cf2bc6f,0x7b75dc6d,
  149409. 0x359813ae,0xefc8d240,0xe44cbd8d,0x23ecb209,0x21525622,0x59ba10e3,
  149410. 0x3f1ee19a,0xfa14d934,0xfb0c48f7,0xdf97c21b,0xea30d437,0xc4e62890,
  149411. 0x651475c2,0xb286e2a4,0x126672a5,0x291f01e4,0x31aab3b8,0x9c6fda5c,
  149412. 0xe17d22ec,0xb7277a5a,0x914f0bad,0xbd88ed83,0x6a2392e1,0xd0b05d1b,
  149413. 0x65893c2b,0x4cb8af90 },
  149414. { 0xbb4b1953,0xa2b02057,0xf597f6ee,0x4ce08b44,0x5e6412c8,0x854f5d9b,
  149415. 0xb3cd4919,0x1913262d,0x6e42bb5d,0x902762e4,0xd78e7f60,0x8355c8e6,
  149416. 0x38b6c16c,0x8efaa824,0xe550f618,0xd0173790,0xe57d778e,0x118af462,
  149417. 0x715b4714,0xa16ad5e8,0x41dea4f9,0x900596c3,0x280ca610,0x2a957c32,
  149418. 0x374c65a1,0x2faee800,0x50080414,0xdb105127,0xff080fa1,0x8c1db931,
  149419. 0xd79878fc,0x486a5c25 } },
  149420. /* 193 */
  149421. { { 0x941b4f36,0x0521e213,0xf803b4f9,0xbaacfb14,0x52a54ba8,0xfdf1e22e,
  149422. 0x8fe4796c,0xacfabbba,0x58dbacb6,0xae0788db,0xc19dfa51,0xdf98d736,
  149423. 0x35a716ee,0x155c286a,0x9c86461b,0xbe7d4676,0x63a64a5e,0x50b6380f,
  149424. 0x9f609262,0x14b41914,0xa2dfc5b3,0x0919a7d0,0xcef466ac,0xc454da55,
  149425. 0x6986aaec,0x93fa4a24,0x71a49ced,0x5090b171,0xc1fa75ad,0x602f1d6c,
  149426. 0x78e4c054,0x5d269f89 },
  149427. { 0x14920419,0x3a74030c,0x90968739,0x0845d868,0xeeb70fa6,0x81b994c4,
  149428. 0xd9fc5bcb,0xabcaa06d,0xf58f8f2d,0x06539427,0xb1dc52aa,0x35c85f67,
  149429. 0x2c911baa,0x5a7d8d72,0xaec2d834,0x4041005c,0x7a8e5347,0xb5868a44,
  149430. 0x8de512c3,0x04ee180b,0x211168eb,0x4daa66e5,0x2317cd8a,0xc0bd5dab,
  149431. 0x61164df6,0xa1d4185d,0x1dbad7c9,0xacedca26,0x09b02683,0x0fe4b5ac,
  149432. 0x26d9550f,0x8ac9995a } },
  149433. /* 194 */
  149434. { { 0x2640a39d,0xb2c8dc9b,0xede0c9f9,0x21ff0b38,0xa1ecba0a,0x74f469bd,
  149435. 0x080d0417,0x8a902ccd,0xf4994604,0xe956fa32,0x9776ab15,0x348f85cf,
  149436. 0x0066f492,0xc21fc6ee,0xfeeef367,0x35b1ebfe,0x4613e5ed,0x7804581c,
  149437. 0xea6ba071,0xcbdfe8e6,0x950d73ed,0xddfcaa32,0x1da48889,0xc9747936,
  149438. 0xdbaffbd1,0xce867c8c,0x1cbaeae7,0xd267431f,0x897912c8,0x68255045,
  149439. 0xd7ea1e4d,0x0c7c1ddc },
  149440. { 0x1ce963a7,0x53aa30cc,0xc4c5fade,0x7352f64c,0x2828afbf,0x2b9aa2f8,
  149441. 0xca212107,0x64273c56,0x85a576dc,0xaadd7654,0x90b5c77c,0x6196ac3e,
  149442. 0xd1aaf39b,0x20d43e9f,0xcd05cbc4,0xfc392062,0x4c0ff2fd,0x14163872,
  149443. 0x2ae821e6,0xcf32b8d8,0x3fa7a3f0,0x5f58f943,0xf644ca92,0xaebf1d2d,
  149444. 0x1918a75f,0x0c061563,0x6b876118,0x7989b5ed,0xad412441,0xbf342445,
  149445. 0x1df633ab,0x24ffc9ae } },
  149446. /* 195 */
  149447. { { 0x93c7cb2b,0x89fcdc05,0x590053fb,0xc1243b95,0x6182343c,0x601debcf,
  149448. 0x66c18a63,0x364546ef,0xec913287,0xa5290701,0xf9788c31,0xc35b8026,
  149449. 0x92d1f7d7,0x852b862a,0x0aa79728,0x1809cb05,0xa3cb2005,0x897d467c,
  149450. 0x9ef5b946,0xf20c77c0,0xf2241984,0xc3372c42,0xf35bb206,0xda053e0d,
  149451. 0xa9c140b5,0xbc26c6d0,0xcb56fb33,0x61cfcc0c,0x299b3968,0x1c3cf9ef,
  149452. 0x40621ba4,0x89e4d3d1 },
  149453. { 0xa45a9be3,0xd35e80e7,0x07356fbd,0xc4daa578,0xb967bc2f,0x0186d62e,
  149454. 0x47cd16e3,0xa702679e,0x5f30ce9b,0xca2f1c02,0x1f864f50,0xf1205b46,
  149455. 0x85061d66,0x7fd6d797,0x8a08809e,0x47edc4f6,0x9a4d3ae2,0x5dac0449,
  149456. 0x6d1f9da8,0xf844664a,0xd7a83a71,0x9f30ce84,0xeaac33f1,0xe9382bac,
  149457. 0x948622ab,0x1f033831,0xf7681eb2,0xb037a4ba,0x99a1b5c7,0xd156a908,
  149458. 0xe6f1d0fb,0x675d3e6f } },
  149459. /* 196 */
  149460. { { 0x707193e5,0xd9767ffd,0x810358e5,0xe478aa91,0x328d8ef7,0x5634f9ff,
  149461. 0x6dbbd9a7,0x913a0ee8,0x7e215686,0x379b2968,0x89d9da38,0x903f410a,
  149462. 0x1b1334d2,0xd9f8d7b9,0xbd82efb5,0x9fe74229,0x3803c778,0xdb568b62,
  149463. 0xd3d25344,0x93e9a350,0x724497e8,0x559c35b0,0xa169e23b,0xc472d436,
  149464. 0xcc5b4c69,0x09864632,0x83c7f531,0x9f6d759d,0x1e497888,0xa91cf1db,
  149465. 0x60af1a4b,0x5f7f92fe },
  149466. { 0x0545167e,0xf18a1cc6,0xaffa88e0,0x55ee2e02,0x432a7bcf,0x24cdff51,
  149467. 0xa7510866,0x7382da42,0x40511af7,0xe894c11f,0x2aaf1423,0xaa4e4e31,
  149468. 0xf63dd2ae,0x8c3d36f0,0xd7660635,0xfc5c9550,0x37ea7eab,0x01253731,
  149469. 0x39b950f6,0x2a5cd598,0x40e63442,0x95a0f601,0xf2ac7045,0x905e238e,
  149470. 0x446b0f73,0x44bacc0e,0xc448578a,0x4cd4206e,0xa5bd7803,0x367b1aaa,
  149471. 0x0a2b458d,0x25beced9 } },
  149472. /* 197 */
  149473. { { 0x0c33a8fb,0x079a7382,0x0f25dc1d,0xcfbf6cd1,0xc6d482b6,0x4ffc73f8,
  149474. 0x07bf844a,0x3e51f18c,0x599162f0,0xa7651236,0x14013811,0xac59a74e,
  149475. 0xe55018a0,0x957a6865,0xe3ca09b1,0xe1ec51bd,0xa960253f,0xbc0c7eb3,
  149476. 0x7de03f84,0xe83bfd14,0x52fbdb09,0xc0540ed1,0xcea15ec1,0x6ba52edd,
  149477. 0x4b261307,0xf3d30ed5,0xe8397206,0x9bd7bae8,0x096373aa,0xf20d8692,
  149478. 0xc3b0bf63,0x0a616a4b },
  149479. { 0x6e1339c9,0x2075f3ed,0xbf8b00a6,0x7afaa072,0xbccd9b47,0xdfafec82,
  149480. 0x00ca54c7,0x4713158f,0x38bc31ae,0x449102f1,0x310dfc8a,0xaf98f158,
  149481. 0x59e954d4,0xc9ef2075,0xc527a0c4,0xe8021af9,0x7a192023,0x6e801277,
  149482. 0x7fb02377,0x635f538c,0xe8c9e951,0x5df1974f,0x15cc9097,0x0287faed,
  149483. 0xf7a5115c,0xfa0728f0,0x0fac623d,0x90dbfbe6,0x0311ba09,0xa8d40fd4,
  149484. 0x07c6464c,0x876d154e } },
  149485. /* 198 */
  149486. { { 0xc2d3ea8a,0xd3a4d6d2,0xa842600e,0x36be681b,0xe4070672,0xc53f100d,
  149487. 0x6a7d7a7b,0xe3e5b6fe,0x5d5e1a83,0x6e6994f9,0x76097c2a,0x07cacd22,
  149488. 0xa6791011,0x12d98dba,0x102e0e24,0xddfc4461,0xd493272a,0x4815dbc2,
  149489. 0xa9436696,0x7e38e64b,0x32b2bf90,0x4960eb1a,0xd928e28b,0xda457525,
  149490. 0x2a077c9e,0x72f75b39,0x7fd61d00,0x27760cbb,0x0f4b1456,0xaf235d1b,
  149491. 0xe76d1700,0x3040c23b },
  149492. { 0x4efa9a70,0xb10dc55b,0x53e86610,0xd4de414f,0x09f8a27f,0x3d95c113,
  149493. 0x06661d3c,0x505109a5,0x60eb513e,0xcaa2994a,0x1e7d338b,0x3ee41537,
  149494. 0x4651e71f,0x4fd145fc,0xcbc313b4,0x51bbf838,0x1eb92150,0xb039e078,
  149495. 0x14bf5ac7,0xe8696b44,0x8be0d48c,0x2d667188,0xdd8f2b6f,0xbe93b2f5,
  149496. 0xeb8a7f8a,0xc1dfd1e7,0x90f751c5,0x862b3dd9,0xa32a74be,0x1eb1ad58,
  149497. 0x1ebbc9a2,0x5486d79a } },
  149498. /* 199 */
  149499. { { 0xa1359e13,0xcb2e34ff,0x28196051,0x202d8dbf,0x23564b5e,0xe95e023d,
  149500. 0x42f6ac12,0xfb1340b6,0xb653725d,0x543ba852,0x8d2466ad,0x81aedcd6,
  149501. 0x547c728b,0xbf780224,0x9569fb65,0x559f8a11,0xdfb22ec9,0x505b7a62,
  149502. 0x9eed5e52,0x07107540,0x299f6f11,0x9c899288,0x3db6f8c7,0xa7d69261,
  149503. 0xb3ca79a9,0x30eb7fb3,0xfb2160b0,0xcab99bb8,0xd28b409a,0xd2012568,
  149504. 0x5ac45f8b,0x380f1b0f },
  149505. { 0xe6a0068f,0xc0b99e6b,0xc8a73753,0x4b67cf2a,0xb2faeb7c,0xa6c9a548,
  149506. 0x340260c3,0x7f417f99,0xcc0f739e,0x8ee56855,0x780949da,0xf08b510f,
  149507. 0x8d5c6eff,0xb1770fc2,0xfd96a7bb,0xb4f5abee,0xf2665a2a,0xa07b1136,
  149508. 0xb601dcf9,0x2fb380a4,0x162becc6,0xcc803614,0xee6b83b3,0x3498fb96,
  149509. 0xa8c17eeb,0xea9b0fd6,0xa177efc2,0x5834b5ba,0x5b110b3e,0x929044f5,
  149510. 0xebd7285e,0x4abedded } },
  149511. /* 200 */
  149512. { { 0x700ef376,0x3355e1b9,0x66cdabff,0xd56e5d9a,0x47e87646,0xb3dc2575,
  149513. 0x00f79369,0x28f44b8a,0xa0c52e29,0x08c32b1e,0x3729b392,0x5a78de12,
  149514. 0xb26d239d,0x4184519a,0xe0ce4a6b,0x23f6b4b7,0xacb2a9f9,0x235f6f8a,
  149515. 0xe2064a59,0xbb8bc454,0x1bf3062e,0x37efd034,0x94dff6f9,0x6bac683b,
  149516. 0x8aa7fa06,0xc3364b1e,0xce0b3745,0x0616772a,0xd1e3fb0f,0x46f08d08,
  149517. 0x18e132d3,0x6a20abb3 },
  149518. { 0x6a85cbc7,0xea831016,0x934f9aa7,0xd0990946,0xe778f1b3,0xc2211088,
  149519. 0x2247b799,0x7ea4ff8f,0x454484ce,0xb3171d71,0x4f98c364,0x29403949,
  149520. 0x97df1458,0x5da911f3,0x09439116,0xa6b58093,0x174238bc,0x75f9509a,
  149521. 0x8209758d,0xfeb51821,0xa47925d0,0xae0c6021,0xaf8a315e,0x0e946694,
  149522. 0x6bad04b7,0xae7af8a3,0xf072447d,0x44c15e7f,0xa5456ffe,0x5184668a,
  149523. 0xbf36b977,0x45e353a7 } },
  149524. /* 201 */
  149525. { { 0x93092f71,0x76056764,0xf5b92d71,0xeb66b6c2,0xe2c8b6c5,0x9db3149b,
  149526. 0x20c0363e,0xf62f583a,0x03cd7097,0x688acd33,0xebb916ac,0x85d0c0f8,
  149527. 0x84c19b0e,0x1bf7462c,0x7c4a6ad1,0xc76ed5f9,0xd119f369,0xec8b88ba,
  149528. 0xebe50b83,0x59b8371b,0x866706a6,0x0cc69508,0xf8373d2c,0x531c75a3,
  149529. 0x2a5a02fb,0x4e1cd3a3,0xda39a1d0,0xe8274778,0x75da333e,0xedfc5bbb,
  149530. 0xca79bd36,0x15941f24 },
  149531. { 0xa77dd512,0x42e8c0f8,0x1dc365f6,0xa91b59a7,0x08753862,0xe80d14cd,
  149532. 0xd272faca,0x1624230d,0x4027cb5a,0xeea3ec16,0xc1ef9f03,0xc1700b59,
  149533. 0x0da3148d,0xd411c127,0xc4181af1,0x801ee448,0x9e3a900b,0xedf28559,
  149534. 0x0d09affd,0x5d67b0bd,0x8b370024,0xd839df96,0xe6f836b8,0x3b6307e0,
  149535. 0xbd3201c9,0x5382e588,0x7a1d02bb,0x636d8a6b,0x968641e9,0x70b7db76,
  149536. 0x118fad03,0x6d17c34a } },
  149537. /* 202 */
  149538. { { 0xc181c99b,0xcf608841,0xc87bdcaf,0xb65dc901,0x3720dabe,0xb460b447,
  149539. 0x5377515b,0x4c79c396,0x0a96c277,0xd447f22e,0x2ac0f440,0x0d952130,
  149540. 0xc90583ad,0x8330b26b,0x928904a0,0xe25e977a,0x85c50b18,0x1deaffd9,
  149541. 0xa5ad5f6a,0xcf4dbcb7,0xc8a37ed5,0xcbcd0019,0x1e9850b6,0x7846dd90,
  149542. 0xb0b8e605,0x1ac8194a,0x34132f90,0xb9728571,0xf56ee28b,0x4ce9f149,
  149543. 0x3e9e1d4e,0x1ab9b5a4 },
  149544. { 0x314fa7a3,0x206dab92,0x478ff963,0xcc4af0f0,0x904d9fdb,0x4cce1713,
  149545. 0x12c045fe,0xac20a2eb,0xfd8f6d7d,0x44fc5478,0xca7b6ffa,0x886e72c5,
  149546. 0x6fd6f758,0x7fa4529b,0x92a820d5,0x4df1d1b1,0x2789f149,0x3d812f9f,
  149547. 0xaabb53d2,0x9842f083,0x2a03ab32,0x2648539b,0xb1512502,0x631ce090,
  149548. 0x731f6bd5,0xe1294d15,0x9436e634,0xb229361d,0x3ca966af,0x8c4281c4,
  149549. 0xc21ab3ed,0x24b34956 } },
  149550. /* 203 */
  149551. { { 0x659824e2,0x49bdcb86,0x4e13e74c,0x6dc4ce48,0x6bbe1eea,0xa4c01a26,
  149552. 0x1e3ec457,0x47b2b8e7,0x2f5a8e4b,0x7e8b15e0,0xe333530d,0xe81eb6e6,
  149553. 0x17a45202,0xacba369e,0xd70e4c9f,0x81241431,0x3e12beb8,0xc190af4b,
  149554. 0x11f486fd,0x53270523,0x29fb2bce,0x9f6c41e1,0xb70f6c08,0xbe6287eb,
  149555. 0x3feb4477,0x1479850a,0x9bcf18bb,0xfcfdfb11,0xda80d040,0x925c292f,
  149556. 0x7e3c5bf9,0x212d65e5 },
  149557. { 0xca15cf08,0x23adb386,0x81e172eb,0x4dfa4ac4,0x4d42d0c0,0x9d1dbf93,
  149558. 0x74404dc7,0xd9cf6073,0xe932bfcd,0x60508441,0x1c682a98,0x9ae910ca,
  149559. 0x41ac1cc0,0x9528fc18,0xdbbed630,0xe6a120ae,0x30ccf250,0x94e0e1ec,
  149560. 0xe58bbf2f,0xfe84ba54,0x9faa4415,0xc66d0b4f,0xecee7ce5,0x0c58f1e7,
  149561. 0x6fa6873a,0x7a1d43eb,0x399f1348,0x96c6c5a0,0xe6727ab7,0xe6ef9aaa,
  149562. 0x9a5c2447,0x66afa554 } },
  149563. /* 204 */
  149564. { { 0xc980e91d,0xda5aaba8,0x6ac98efa,0xa93cf509,0x8da32662,0xb0990e0a,
  149565. 0x0081453e,0x01d21530,0x3d71de84,0x2bb0d33e,0x3e19a012,0x465f6d80,
  149566. 0x78a838e7,0x5902ff4c,0x1931348c,0x74e2afb7,0x9cfb057b,0xa4932757,
  149567. 0x3ad03f8f,0x761ea642,0x58ffa40a,0xb7d4c245,0x77a87e30,0xb5e9c0d9,
  149568. 0xc9c84d26,0xd1c5edba,0x3d1963a0,0xeca8839a,0xebf6bf0d,0xbc6f2f35,
  149569. 0x0d58abdf,0x01ef0631 },
  149570. { 0x3ecdcbb0,0x2bf90316,0x27c1c955,0x19e2d728,0x9575c930,0x9e527030,
  149571. 0x96983930,0x0dc1c5a9,0x7cd082df,0xef9f80ff,0xdf97e051,0xcd915075,
  149572. 0x9cc61b55,0xf286fffe,0x80f24cc4,0x352db38f,0x36523ae3,0xed9b99ec,
  149573. 0x10b104a9,0x109a8ca8,0x305203ad,0xc2700fe7,0x769400f5,0x2a2ee24e,
  149574. 0xee0c452c,0xd595d399,0xf7f02a41,0x0ab75d6a,0x0db730b7,0x34108099,
  149575. 0x5e8d1202,0x0e4f5ffd } },
  149576. /* 205 */
  149577. { { 0x0ff14c38,0xbd1c6444,0xaece11f2,0x9a5b59fa,0x22af6330,0xaa4605a7,
  149578. 0x82af24ee,0xddc9f65a,0xeb9a1159,0xf4ee4bfe,0x74e84eaf,0x2463d076,
  149579. 0x0e0baace,0x88cbe1e0,0xd5fabdcb,0x7ca568ea,0xc57eb99d,0xbd80d524,
  149580. 0xe9be9873,0x9c46572c,0x7300b85e,0x918a1dcd,0x40f54176,0x49221312,
  149581. 0xb5b14236,0xf7e324ff,0x2434f16a,0x40dda501,0xa133d97c,0x08833421,
  149582. 0x0876f020,0x33d41161 },
  149583. { 0x9878e5ec,0x7531a36b,0x46918232,0x5de3e321,0xd0a30464,0xd15f9a33,
  149584. 0xaa173659,0x734c1b87,0xf925d4fe,0xac2094a2,0xc262b0f4,0x43c965a1,
  149585. 0x447d5cbc,0x759c903e,0x05239300,0x92af215e,0x1f593f34,0xfffb6d5f,
  149586. 0xc3cddb5f,0x65943b4b,0xbfdd5408,0x9d03a29c,0x198d76c0,0x8f7cda6b,
  149587. 0xc0f27b59,0xc0790a22,0x8cb58ccf,0xba557a84,0x76c54fdc,0x5922052d,
  149588. 0x47b6b466,0x2d3de7aa } },
  149589. /* 206 */
  149590. { { 0x65add3b7,0xaade7462,0xabf24c2a,0xe5888f35,0xe1a57d93,0xd41549ca,
  149591. 0x2c76f7bf,0x0e22e18e,0xbe3202b3,0x67f288ea,0x1d1d0f0a,0xb79a66ba,
  149592. 0x2881ad18,0x0e0ab749,0xc7adb0e9,0x7d424086,0x2842132f,0x870c32c5,
  149593. 0x58f9a09e,0x858477f1,0xec025589,0x422a9372,0xa5098777,0xbe428c5c,
  149594. 0x57660058,0x45b79564,0x957f37cf,0x6c7fc631,0xd6316289,0x8b7023dd,
  149595. 0x5b1c12a6,0x47003bb6 },
  149596. { 0xc91c1c96,0xd99401c1,0x27a12970,0xaa5dcdf9,0xc3c29107,0x3ab92e17,
  149597. 0xa3fe4710,0x26fce8f7,0x4ee998ee,0xb0d09d5e,0x8e3a41f8,0xafa62204,
  149598. 0xa26ca506,0xb1c012a5,0x99b57252,0x2c6f734c,0x512f7fe1,0x1093d79f,
  149599. 0xacee19a6,0x2f30906e,0x056d1ea6,0x6bff8381,0xeff35f21,0x61c75856,
  149600. 0xc1ad2224,0x6e07e978,0x6b20fde8,0x2cca6ca1,0x633fe81b,0xab4d6d2d,
  149601. 0xb06a2ce6,0x73dff504 } },
  149602. /* 207 */
  149603. { { 0xd8e20fb8,0x8b615805,0x82b533f0,0x7c6873e4,0x56a854ca,0x5205f001,
  149604. 0xcb369211,0x87fec6ac,0xc7f092b7,0x1fa3c0ec,0xe845fe4c,0x5b36647e,
  149605. 0xf8b1f112,0xd4781e85,0x8b0f1a6f,0xc6526839,0xdcb8eb92,0xceeb8c6c,
  149606. 0x8e5f6d52,0x133f0ead,0xc8d934dc,0x31883e23,0x428ac45a,0x214ed5bd,
  149607. 0xdbbfca85,0xf77ca492,0x07e5ae13,0xdf4113fe,0x72ab05fb,0x63e4a0d2,
  149608. 0x7148f535,0x7544d0b7 },
  149609. { 0x80797ace,0x4fe8d134,0xaf86d97e,0x216d6aa0,0xef5a68fc,0xdbf0a688,
  149610. 0x9f9b2684,0x18b26f45,0x8999d2fc,0x52fefcfa,0x62423955,0xd5af8d82,
  149611. 0xf63a3780,0x8f123469,0xdcd4feaf,0x2933454f,0xa73b5d09,0xba8018b7,
  149612. 0xe5552c18,0x9af1f276,0xff26bb1c,0xc5d4773d,0x06dd4f44,0x9ef49410,
  149613. 0x5f39ba49,0xad8f12f9,0xf66ca4f2,0x5767f6dc,0x7922f59a,0xba8773f1,
  149614. 0xc1e42d49,0x220081ea } },
  149615. /* 208 */
  149616. { { 0xba37a0ba,0x3043d573,0xdd176df6,0x05a431bc,0xc42070f7,0x03322cfc,
  149617. 0x67c2d109,0x5cabd30e,0xcbf8bcfa,0x362c95de,0x7787b10b,0xd767d277,
  149618. 0x6ec05e64,0x612c915e,0xce69c30e,0x9e669631,0x682e2635,0x27c9dd8f,
  149619. 0x95ffcc38,0x79021f12,0x8a2adca2,0x06a8ee79,0x4b5d500a,0x8e00e784,
  149620. 0x8d80d6c5,0x87746fc7,0x915f10cc,0x246053be,0x219f6fd8,0x844e328b,
  149621. 0x11bd3733,0x620541ac },
  149622. { 0x509e5a29,0x0f7fd382,0xb432531e,0x8748d7d0,0xcd3883b9,0x8f749354,
  149623. 0x8bfbb17a,0xc6b8ac74,0x05f2d2c5,0xa4616a66,0x1bcb1b83,0xb3d96625,
  149624. 0x2fee265a,0xcf753104,0xdb225058,0xc70d73fb,0xf0c2d556,0x1211d434,
  149625. 0x54b259b3,0x862061d8,0xc42b3f7d,0xffe4606d,0xe86a4949,0x4c5c8585,
  149626. 0x160eedac,0x04ddcc8b,0x568e2420,0x1804ce67,0x42141656,0x91f3855a,
  149627. 0xf932be97,0x7f378198 } },
  149628. /* 209 */
  149629. { { 0xdfa6639a,0x9a374bda,0x02ab7391,0x0cbd48d4,0x47031e2d,0x5c5ef236,
  149630. 0xd0599d1f,0xb49ee2bc,0xe0d38443,0xd285eb60,0x269392e8,0xdbbea92f,
  149631. 0xb8bc538f,0x91455fbf,0xe469b768,0xae259ff1,0x41de5682,0xc1cecb1f,
  149632. 0x9952d1ae,0xc876f071,0xe7bf7446,0x1ce25181,0x282ad2f1,0xcb93ad86,
  149633. 0x6ba4ef67,0x8fa3cd31,0xe507aa3e,0xfce68a04,0xa61bb608,0xced74170,
  149634. 0xf6ac10d0,0x6de716b3 },
  149635. { 0x172d6dc5,0xd4e58d04,0x6397c65c,0xbed2cde6,0x0c9eb4e8,0x7ae77e18,
  149636. 0x75fa2edb,0x56275468,0xa91e6738,0x4b30324e,0x235c8b2e,0x6023a856,
  149637. 0xa8f92887,0x9df6d6c2,0xf6f5e8b5,0xec2c185f,0x3ad5748a,0x7892e12b,
  149638. 0xd54aefbc,0x7aebb4f2,0xee868821,0x14915448,0xb1d9bd5b,0xa26c5f71,
  149639. 0x2ff00df7,0xe5ccd166,0xb95b1dee,0xebc99f17,0x3fe1f774,0x90983616,
  149640. 0xbb3d25b0,0x51f90830 } },
  149641. /* 210 */
  149642. { { 0xf2922461,0x49376fa1,0x1650d0d1,0xdbb1b1c3,0x0dd8608d,0x92b91c33,
  149643. 0x36b89906,0x3e612c4b,0xdf560052,0xe1977b0b,0x636a2545,0xf8afff70,
  149644. 0x11723d8e,0xcda7d278,0x81bde7ba,0x0b0bc4bb,0xed2a578e,0x3cb080b2,
  149645. 0x171b2e02,0x5bda0d0d,0x941bb9ae,0xf6df38cf,0xc14a65c5,0x85dd81db,
  149646. 0xc19dd98e,0x7f98c82d,0x52206f93,0xc613747f,0x5f5bbe78,0x9e13a2c2,
  149647. 0x0aa34be7,0x5eed218e },
  149648. { 0x01d4dc0b,0xe1565754,0xf566bb07,0xa1ae5f27,0xb82225d5,0xe985ebeb,
  149649. 0x1189ec6b,0x5f3ad21c,0xecce4d9d,0x17da518c,0xd6b65b59,0xc84a2d3e,
  149650. 0x8ffa771c,0x7f988175,0x2ac69a7a,0x50d6ae12,0xc6e6846d,0xcb7f30b1,
  149651. 0x5bd0bb13,0x8c023a60,0xd73f2407,0x9a10fecd,0xe5f0a996,0x8c5158cc,
  149652. 0xbd8f5806,0xd26bf615,0x915a46e1,0xaf32ea87,0x0287d308,0xeaf74e81,
  149653. 0xa6264254,0x8c14ba06 } },
  149654. /* 211 */
  149655. { { 0xb17ee201,0x0c877895,0x88e57a77,0xc05aa471,0x97822456,0x19c3e763,
  149656. 0xc9c3ba1d,0x0be6f8c0,0xb4389ebe,0xfe85f4ff,0x0ce7fbb6,0x538bccce,
  149657. 0x65266c64,0x876eab2a,0xcf9a3842,0x5c9ac690,0xccc8f981,0x9f5cf3b1,
  149658. 0x9cf687de,0xfa17be6a,0x83835c15,0xfcfc10fc,0x150ef2eb,0x086b0fdb,
  149659. 0x884a52e6,0x9f97ecd9,0xb0cd1eb8,0x416e6fa2,0x3ecc03ba,0xe2bd1599,
  149660. 0xeabb165e,0x645c0a5d },
  149661. { 0x50aa7e31,0xd94c4205,0x2f851da5,0xaec8df0c,0x3c726e6a,0x99646909,
  149662. 0x2619bf9a,0x72dbdc36,0xe253fbd5,0x1b4260e0,0x8c709e06,0x97c259fb,
  149663. 0xcddaec5b,0xfabf7cbb,0xe4b703e9,0xb4d5e8b1,0x0734efdd,0x1b06e56e,
  149664. 0x1f55f8a5,0x02d4a4f9,0x3f565c8d,0x7f8608ba,0x816d1d94,0x822f47d2,
  149665. 0x5ce7b136,0x0cc36156,0x31d04242,0xe46ee5ef,0x683567f6,0xb2a65f70,
  149666. 0xd2fa6c91,0x27e9ff40 } },
  149667. /* 212 */
  149668. { { 0xd7e952e7,0x75251893,0xc735bf18,0x15b30583,0x96fe0491,0x732b5992,
  149669. 0x806d2fca,0x27451858,0x1b885ed9,0x71ab76a0,0x6d9f55ec,0xbdce9d97,
  149670. 0x48f2ba9c,0x3da60b20,0x592b132b,0x6977c086,0x099051d7,0xb6dca9cb,
  149671. 0xd188ae25,0xd9c2ab23,0xe20aaf3d,0x9f469f3f,0x5aad74d0,0xdbd1f7cf,
  149672. 0x22a9eb3b,0x3d5efe5c,0x137010c4,0x8c5edfa2,0x57870260,0xada2217b,
  149673. 0x3dac9776,0x4feee567 },
  149674. { 0xb5d3d780,0x30e18d52,0x07166744,0x4dadb5d3,0x5a742156,0x320d386e,
  149675. 0x8d6bbb86,0x5d8c290e,0x2d263dd1,0x981a4323,0x98984636,0x33d0e7ca,
  149676. 0xa519acb1,0x5138784d,0xdddc81ff,0x832e3fab,0x3199a43a,0xfc278594,
  149677. 0x32743163,0x5b4cabcf,0x74f94fa7,0x9fa010bd,0x5694a627,0xc28a743d,
  149678. 0xcb657a24,0xc1d2a888,0xe86a25ea,0x7eef2503,0x04c561ff,0xed11a5d3,
  149679. 0x9c9ede0e,0x4fe818e7 } },
  149680. /* 213 */
  149681. { { 0x7fc1c7ff,0x00252c9d,0x9fa89ad1,0xa9bd419d,0x4064e9cc,0xc93a124a,
  149682. 0x43942ecc,0x384cbcb8,0x8749695b,0x004c21fd,0x421165bf,0x69c81d9f,
  149683. 0xdde01102,0xe2325628,0x5a9b004d,0xec937457,0xf6dcfc21,0xfb3346bf,
  149684. 0x4d372c7d,0xac4da64b,0xf20494e2,0xcecb7ad3,0xe867c150,0x562c41b5,
  149685. 0xc2b723d8,0x299395ce,0x7ee53231,0xc91adfc5,0xf10b6597,0xe06f1161,
  149686. 0xb74d3ffc,0x81915529 },
  149687. { 0x6ed9d4ee,0x8ec12431,0x689aff01,0x3dffa154,0x2a89a3f4,0x4aba349f,
  149688. 0xd467efb2,0x2db1e8e2,0x039102e2,0x18dea354,0xe52f082b,0x422ab853,
  149689. 0xed36dd47,0x7130a2c1,0x0295d1ee,0xca60e86d,0x7c7f5ad3,0xe6ac6808,
  149690. 0xde864658,0x0f83cecf,0x461d1265,0x72e66c21,0xbd385099,0xfeef4150,
  149691. 0xa6632289,0x0f183f3a,0x792dc795,0x275454be,0x11367702,0x2744c11b,
  149692. 0xe8ea6ef3,0x7d06bcc7 } },
  149693. /* 214 */
  149694. { { 0x7090212f,0x89285942,0x5521e844,0x691b7d4c,0xbe2dbb92,0x4c038422,
  149695. 0xbd81f880,0x317721ed,0xac89bc36,0xc136cbee,0x7b8f004d,0x4f71b60b,
  149696. 0x4e218ab8,0x269132d0,0xe6cc814d,0xb0e2496e,0x75fadc15,0x0b2ce317,
  149697. 0x66d223c5,0x82e3c084,0x4c612f8b,0x9721caa6,0xa4b65355,0x59a751eb,
  149698. 0xc7d3d9d1,0x3433aad5,0xe80d4246,0x1e61b9d2,0xfc673caa,0x149f655f,
  149699. 0xd0f9cb92,0x48b52b99 },
  149700. { 0xefdc05be,0xa3915399,0x13e095e9,0xde70db18,0xcddb3fda,0x447862e9,
  149701. 0x1a009451,0xa2b03162,0x23920ea3,0x4b27980c,0xa23b8feb,0xac5394f1,
  149702. 0x3e5616d4,0x163f7256,0xb714219a,0xaa0ff93f,0x93d62474,0xd26f96d2,
  149703. 0x7dcfe276,0xdd212ea8,0x47038d15,0xab27bf2f,0xf418168e,0xe58c8325,
  149704. 0xb32a989a,0xe3704222,0xbfc9f13b,0xa3694390,0x0d0684ad,0xf16e2606,
  149705. 0x9d8c76ec,0x17c0de87 } },
  149706. /* 215 */
  149707. { { 0xdcc01958,0xbca5f453,0x1ce88393,0x7d945954,0x561f5b6d,0x5e6350a1,
  149708. 0x7e2d36bc,0x291c3c86,0xa5ac3a6c,0xf6c7ed84,0xd98006cd,0x7913c40b,
  149709. 0x5671ec3b,0xf78bb087,0xb43e89a9,0x1c928f6e,0xae1ea1ed,0xfdf28df3,
  149710. 0xb924b2b5,0x62bba5b1,0x1a116e05,0x491d2705,0x167ed3e3,0x08ec02b7,
  149711. 0x5bc0b046,0xe291cf7b,0x8c5d7f59,0x30e50169,0xf5c799b7,0x0c7c350d,
  149712. 0x0ac6e1d7,0x6862b9e2 },
  149713. { 0x9ffa1f64,0x56c6f4e7,0xa1e24349,0xfed6a91a,0xcdb75232,0xe9a0ee0c,
  149714. 0x0322d607,0xbfc90b37,0x462fef87,0x29480ad2,0xc2bfcf34,0xfc214969,
  149715. 0xa539e38f,0x6e5211e0,0x12a5149c,0x2a59ec26,0xd706b532,0x195fe212,
  149716. 0xe99c8429,0xf77fb108,0x5dc80482,0x74ceaea3,0xbd92d298,0xa5a6030b,
  149717. 0xaaea15ee,0xad42dca5,0x4987109c,0xd6ac3bc7,0x290af649,0xc64e1c40,
  149718. 0x51f8de6c,0x5093fa2d } },
  149719. /* 216 */
  149720. { { 0x4c2d553b,0xc4cf3280,0x3b966c29,0xdc1abe22,0x2296914a,0x556a549c,
  149721. 0x999976c9,0xd8c9f8b5,0x776e83f3,0xc22c57bd,0x7c85ec57,0x4f2942ab,
  149722. 0x6e2c61f5,0xef3407e5,0xf213db48,0xf005e8ca,0xf32698c7,0x470c853d,
  149723. 0xcac0a54b,0xe6f488d7,0x60b7501e,0xb6bd6bed,0x714a4bd9,0xf0103106,
  149724. 0x6e098894,0x5285bc3b,0xf5f92a00,0xec06741a,0xef7ef24a,0x32f16426,
  149725. 0x6c77a438,0x12f9c44d },
  149726. { 0x83313a1c,0x1951e964,0x33c58b37,0x98edd3da,0xc7ac4044,0x4edbbf52,
  149727. 0x0dcb5ee8,0x866ca6f7,0x6dd422f8,0xec0ae8f5,0x0661ec2e,0x1077bc54,
  149728. 0xd422523c,0x6d39913a,0x58e7cb3e,0xd105e1e8,0xc979bb45,0x47c9397f,
  149729. 0x0997b592,0x3221d4a9,0xe8952fe7,0x0ef628a3,0x4e946241,0xd08d5827,
  149730. 0x59780f40,0x64cbed0f,0x08e110ec,0x13d7c227,0x7679b1a3,0xd186d866,
  149731. 0x26ae1d18,0x02f75e4e } },
  149732. /* 217 */
  149733. { { 0x47f307d7,0x1b637ebf,0xd0141477,0x6b644a6a,0x2e05a80c,0x82a33d65,
  149734. 0xfed07b31,0xc8f1a0f3,0x3696e597,0xc09ee7f9,0xc7ffc01e,0xcdaa7ec3,
  149735. 0xf8f373b9,0x549f88fe,0xc3bb8989,0xc88d1961,0xdfcaa7b7,0xd92a4fe9,
  149736. 0x3ae4ab20,0x12ff9ee2,0xf5ecb1a5,0xf5aea641,0xe32fb47d,0xe769237f,
  149737. 0x25d085c0,0x96a5c420,0x26c755a2,0xdc912558,0x9bce9723,0x580b985f,
  149738. 0x63961941,0x72b1b566 },
  149739. { 0x790e5558,0x9d708a08,0x0689af80,0x98536041,0x42313b5f,0xe85e7b8a,
  149740. 0x55a49d1a,0xe6ba1292,0xac371b0b,0x5e76c4b0,0x938e6e19,0x58504f39,
  149741. 0x60ae9a21,0x8dd41422,0x968485ce,0xd8b04e9b,0x887efe43,0xf94c4ba5,
  149742. 0xf11c5e73,0x11268e67,0xcf6b99c4,0x92623e28,0x7a0a9662,0xf2d0aaa8,
  149743. 0x4ca02ed3,0xb266772a,0x2d63b551,0x68ee8e4e,0x2e78b5b5,0xcdebb299,
  149744. 0xe17225ad,0x5df19216 } },
  149745. /* 218 */
  149746. { { 0x8df2e7e3,0x20027e1e,0xd8da07de,0xb183cc68,0x4b4ae694,0xce35ba69,
  149747. 0x3ca62e88,0x896d97df,0x52efed2c,0x3de4713b,0x26bd084f,0xd006c40e,
  149748. 0xfc81923b,0x1e9b71bb,0x1aacc6b0,0x9991c7b6,0x8f656840,0x650c9364,
  149749. 0x87f47524,0x138561d1,0xbffd3ca2,0x610f2b11,0xfa191418,0x96915faf,
  149750. 0x955e5309,0x8f1236de,0xa1872d79,0x613cbeea,0x66a2a48b,0x7f7b44ea,
  149751. 0xe0a89c32,0x452265c2 },
  149752. { 0x25430010,0x4ad5ec79,0xebd090c0,0xcac786ff,0x20a9d3f5,0xa5f9f4ff,
  149753. 0xa3edc65f,0xfcbf4112,0x0cf3eb11,0x8824839c,0x8aa5b700,0xb8dd6d4e,
  149754. 0xb7568ab8,0xe2271dfd,0xb744560e,0xe43ec373,0x1cf75296,0x78eaf926,
  149755. 0x3fa96d9b,0x1809ae0e,0xdc25dfd5,0x0b312d2d,0x6bab7711,0x6b8f78b4,
  149756. 0xb5ecf1e4,0x069efc8d,0x609fecaa,0xc1952bae,0x5f4dbde1,0x43e302ed,
  149757. 0x1e078555,0x14b02bf9 } },
  149758. /* 219 */
  149759. { { 0xb87e5b57,0x2c71c768,0xf531a557,0x0bcc78f7,0xf7597dc8,0x4ff93f8b,
  149760. 0x139e175f,0xb28e026d,0xcb94ca6c,0x6b83b727,0x0079f7fc,0x2eafe3b2,
  149761. 0xcf3bd170,0x2aca54de,0x6af0dc6c,0x17c4133c,0xccf5e35e,0xbea1e665,
  149762. 0x345505c6,0xa6691a48,0xe6100b89,0x2633abd0,0xc17d0388,0x966c6706,
  149763. 0x1a0cf90c,0x7aefffbe,0xd0add64c,0x4d847be7,0xaea2aa46,0xd49bcdfb,
  149764. 0x2cc7d0a5,0x85e07e74 },
  149765. { 0x0bc25bca,0x23aae0a6,0xe44f64ec,0x6e8e55f1,0xb607b773,0xe1e696d8,
  149766. 0xd3005909,0xaa90a746,0x2cbc4990,0x072b1ccd,0xc68e2f5d,0x0d0fe6c6,
  149767. 0x53e28ec9,0x920ec5f0,0xf0040cc1,0x79b21fb4,0xfcc4a2c7,0xa7375bd3,
  149768. 0xe1bac7dd,0xf5f5def9,0x35c0f8d3,0xdc315d79,0x2cacd318,0x7117c170,
  149769. 0xe926f71c,0x6f2823c4,0xed02f39a,0x38db58bb,0x7db69323,0xe5b49231,
  149770. 0x8d49f430,0x0964039f } },
  149771. /* 220 */
  149772. { { 0x56999eba,0x21774f16,0xb1de6305,0x3d8ee287,0xde0b2669,0xd81af726,
  149773. 0x3f8942a1,0x37446939,0xea03e13c,0xbcf6b615,0x94e273cf,0xd30c0c35,
  149774. 0xc6725c56,0x4fd33a56,0xa8be97a2,0xa57534ad,0x7c22a251,0x799242a6,
  149775. 0x9d0c5c49,0x4e51bdb5,0xc6a42768,0xd7cd76cc,0xd426bf59,0x914097ac,
  149776. 0x66e9beb2,0x59404a2c,0x5c96e3e9,0x4738fe98,0xaad666d0,0xbcbb3e0e,
  149777. 0x63bc5e56,0x626b0fd2 },
  149778. { 0xe1a1ec42,0x47217dba,0xab5acc50,0xaa6ae7db,0x865331d1,0xb7e1ab1e,
  149779. 0x3d30126f,0xb8453070,0xdee61851,0x280649e0,0xea689544,0x8806f4a3,
  149780. 0xcb56f632,0x4bbe43ad,0xbcaff94f,0x036b9bda,0xbd0637be,0x0d941e65,
  149781. 0x686f3abb,0x82179d44,0xaad6afd6,0x1486912c,0xff7e1534,0x9a3b891e,
  149782. 0xeb86fd96,0x88c426ce,0x117928c3,0xb56e6a81,0x96399e00,0x933e7135,
  149783. 0xa17b6ac1,0x09bbddd9 } },
  149784. /* 221 */
  149785. { { 0xe4fd3673,0x75e39c1d,0xa65c8e07,0xf880d9d1,0x7289c7fe,0x4725c1dc,
  149786. 0x3529d200,0x5b6735ee,0x3c747af3,0xc1f8f2ed,0x912efdf5,0x5cf3998f,
  149787. 0x49859c39,0xed722618,0x0e69795d,0x23793a2f,0x86b1d2a7,0x8a6ab8d6,
  149788. 0x22a882e4,0x00c815de,0xf9db8d7e,0xbe77d6fc,0x02267547,0x0886fb32,
  149789. 0x49c10edc,0xb62687d4,0x7c83ed4c,0x9f1c3e17,0x5af366ea,0xe6d5d7f0,
  149790. 0xd1efad24,0x2eaa01b8 },
  149791. { 0x1f357c74,0x5e47fb70,0xa9e3b794,0x93085c4a,0x6e85a905,0x4f098733,
  149792. 0xbe0244c9,0xf53808ff,0xa3b5660d,0x91dddf93,0xf3b95ed6,0x8b76377b,
  149793. 0xbb3920d4,0x91b911b7,0x86a13cf3,0x7ccf08bf,0xea018e58,0x53ed8f97,
  149794. 0x78c55194,0xb1ea4343,0xe0d2d5a6,0x8e6adde9,0x9b96259a,0xfc2b248f,
  149795. 0xeef17ddd,0x96ebceae,0x557f9c85,0xf694b443,0x07d5bba8,0x48cd150f,
  149796. 0xb4c1986b,0x02d31de9 } },
  149797. /* 222 */
  149798. { { 0xde79499d,0xa6bb9e1e,0xfd0fc2ad,0xf6ca8ff8,0x1a7d9356,0xbec0f8e8,
  149799. 0xe8f06327,0xbc3d1c9f,0x3b300beb,0x805c7217,0x413c181b,0x00420a08,
  149800. 0xf0ca9d01,0x9e9a167e,0x1aeeddd6,0x076c909d,0x8e3a8a72,0x64a1997f,
  149801. 0xa77b429e,0x3ce7f7a7,0x5c94d3e9,0xaac0fbf4,0xe6d48407,0xf37694a7,
  149802. 0xa91921e7,0xf56679e2,0xee1dbbd6,0xf23fe0f3,0xcbf9fa99,0xc7917566,
  149803. 0xe0f4d765,0x965860f2 },
  149804. { 0x7fa5f79c,0xe734702b,0x5af2d26d,0x930bd426,0x6c73e0ce,0x45bd8b98,
  149805. 0x4ee44a2d,0x7dbe7bed,0x956c8a1a,0xc129e024,0x77cdf80e,0x6fdc05ac,
  149806. 0x589ca59b,0x70a6ba2b,0x999825af,0xfc484021,0x7a23f0b6,0x1d284b54,
  149807. 0x28a0a8af,0xb1da10a4,0x2b2af6d8,0xb1eb1b31,0x33935ee3,0xf051443a,
  149808. 0x8effa6ec,0x7a07eb26,0xd662654c,0x16ee4086,0x4549ee4c,0x7a7bc501,
  149809. 0x1fa98a52,0x65081032 } },
  149810. /* 223 */
  149811. { { 0xb67ed9b2,0x49f0e460,0xc36d93d2,0x0cda0fd0,0x88c75e1c,0xbb5963e9,
  149812. 0x614bc0c9,0x757bbe93,0x9a768605,0x9a9b8801,0x48edc544,0xa8b7e2af,
  149813. 0xb51a5985,0x9e77ed9e,0xebbf024c,0xdd025274,0x1545c636,0x598b6288,
  149814. 0x4800dba0,0x39bdaed0,0x81e2a23a,0x7fc20139,0x550cb4f2,0xdc66fd5c,
  149815. 0xb52068c7,0xad27032f,0x8169fa15,0xc9a0bcae,0x3a7ca8a2,0x60606f21,
  149816. 0x9862652f,0x98295046 },
  149817. { 0x2e11c128,0x3e374600,0x0e6dca7e,0x80dfae5d,0xd9552264,0xe44016e2,
  149818. 0x880b7143,0xf65f88f2,0x526b881c,0xca3d28d4,0xdfb86afe,0xf9c59dd1,
  149819. 0x4c74f958,0x548860c2,0x9cb69f4f,0xd06ea43c,0x7334ecec,0x5343c9ae,
  149820. 0x35329713,0x5cc2ccd6,0x5f3a6c0c,0xa95ff403,0xb372653b,0x2e01a1cc,
  149821. 0xa250523d,0x31510fdf,0xa6227eb2,0xeee538e2,0xca23cd10,0xeadfc8a0,
  149822. 0x3e78f54b,0x4b7e6e1b } },
  149823. /* 224 */
  149824. { { 0xdb5f928b,0x79c9076f,0xb7347cec,0xe6250bb6,0xac00ec41,0x54b67798,
  149825. 0x9d9619c7,0x900d20ba,0x59e4343f,0xed42c0d0,0x451935d7,0x3df39e85,
  149826. 0x64f701ce,0x26391182,0xe1f87aac,0xce8f2554,0x65f91aaa,0xfddd6789,
  149827. 0xa324539f,0x96cd163f,0x4bace995,0x5c815f2c,0xa94f9ea5,0xd78c8c2a,
  149828. 0xef24e455,0x7ab2aff4,0x1cddc26a,0xf0ed6409,0x00ca2822,0x954a420b,
  149829. 0xd3297658,0x0611c4c5 },
  149830. { 0xa9e81829,0xf192001c,0x08a282cc,0xded33320,0x8f9ded9b,0x0bfd7de1,
  149831. 0xb7889003,0x6793ac0d,0x3577a5dd,0xbb00d91d,0x802d3c2b,0xe17a23a7,
  149832. 0xfb549014,0xff95f88c,0xc71b6e07,0x7cd1bf4b,0x23588c8b,0x2e3b24a0,
  149833. 0xa4112076,0x9b5335b8,0xc4056d30,0x2481c05e,0xe916a1b5,0x55c7410c,
  149834. 0x850179f4,0xbbe03271,0xb3cd1208,0x15e6c177,0x90cbfe50,0x509a24c0,
  149835. 0x1c108566,0x82079529 } },
  149836. /* 225 */
  149837. { { 0x1c7d353e,0x5d2d3cff,0x7de0ce3b,0xd5e7eccd,0x6ca87635,0xb4b1075f,
  149838. 0x25f9ad3e,0xda8404e0,0x205cb5ae,0x6b963e89,0x09f221a1,0x9e5ee0d8,
  149839. 0xea41aca4,0xd64c85d9,0x34442a34,0x6a46c4e9,0x3cf655a4,0xac6ff97e,
  149840. 0xe5417d7c,0x76565c1e,0xeebf9c4c,0x681009a9,0x88da6388,0x95b61d39,
  149841. 0xf6b472c6,0x6402b46a,0x0b7f1171,0x1fde5165,0xbe0c05e3,0x94f8f273,
  149842. 0xa88344a7,0x7487b036 },
  149843. { 0x9c3e2370,0xa860e575,0xf8048719,0x19d58193,0xa6e2f9aa,0x3a0dbf3c,
  149844. 0x6144719b,0xb6c7e959,0xdeffec21,0xa9049c74,0x3f50cebf,0x8ba064b2,
  149845. 0x49a1de15,0xb12822c0,0xb1d527f2,0xb654b7d9,0x0ffd0430,0xc470859d,
  149846. 0x4f05446b,0x37c74a67,0xa3add995,0xe553251b,0xe33533b5,0x4a3ed6cb,
  149847. 0x27e419ce,0x2f2f44d0,0xa5d1b979,0x2d84ee82,0xdb6fa69f,0xcc76b123,
  149848. 0x21fa3bdd,0x834f85c5 } },
  149849. /* 226 */
  149850. { { 0x2ce9b31a,0x329347c1,0xfe3fb3b7,0x1d88522a,0x52ff90fd,0x4bcefb4d,
  149851. 0x2b1a081d,0x53b17386,0x2a411f08,0x538c11ba,0x141b603a,0x7895b93c,
  149852. 0xb10bd741,0x2993b9aa,0x09912986,0xccbbd046,0xeea0aba5,0x669fafb0,
  149853. 0x35661897,0xd4844622,0x367ffa54,0x4a63b89c,0x1c3478da,0xcbad5d1d,
  149854. 0xaa6034f7,0xc5339227,0xe61b1391,0x0e6d705f,0xf74ff515,0xdd14b660,
  149855. 0x5332b54c,0x639d8b0a },
  149856. { 0x162217cd,0xfa423162,0x811c28e6,0x2e0e4a2a,0x21766dc0,0x68d9ce18,
  149857. 0x046a06ef,0x51263739,0xdde92101,0x44eea231,0x114298d3,0x0607c8f2,
  149858. 0x63d957e9,0x27f272ba,0xa5e8cae1,0xe7ce80cc,0x24f7a63f,0x5816ebe2,
  149859. 0x89673e34,0x4dece5a7,0x536babd4,0x13756a22,0xe3bf77af,0x644d61ae,
  149860. 0x2bcf98bc,0x60b2bf6e,0x29fa962c,0x3b0b59f3,0xabb50023,0xb0769a1a,
  149861. 0x0c75402c,0x40903136 } },
  149862. /* 227 */
  149863. { { 0x1670433f,0x84d2873a,0x25493dfc,0xc9394df6,0x80fcf89e,0xeb05a19a,
  149864. 0xdb297616,0xe39e4310,0xd9e63046,0x50742dc9,0x1de9ca9e,0xf31ad8c8,
  149865. 0xfb7b1d0d,0x86aabf94,0x1b3c82d1,0x36cda27a,0x39702d84,0xfb1a2ef4,
  149866. 0x46081299,0x280bfddc,0xd2396238,0xe4b2b48d,0x7b3c9353,0x2db2c2f3,
  149867. 0x12fb8a69,0xd5b5b317,0x08180474,0xf9b87a3b,0x1e952578,0xd8590986,
  149868. 0xf37a2bc8,0x80668eed },
  149869. { 0xb39a0249,0xe2edcd35,0xb2f8aeae,0xaf230cd4,0x7223df05,0x295b15e4,
  149870. 0xe0e937f4,0xbb66982a,0x8cbc9162,0x019d2b72,0xcf49dca1,0x5c512ae9,
  149871. 0x630f07b4,0x11b491a7,0xa03874e9,0x48d4f34c,0x44cb7433,0xc1fd0ea6,
  149872. 0xf95b30c3,0x13f79ae1,0xed8b60ac,0x40362d4d,0x61ead81c,0x9e8314ff,
  149873. 0x498c3d28,0xed600dd4,0xc2521702,0x5fcb1c19,0x3a9c1f33,0x592329fc,
  149874. 0x1bde6ce9,0x04677548 } },
  149875. /* 228 */
  149876. { { 0x39233c96,0xee3de56e,0x80737eaf,0x868c409c,0x201abc68,0xacae11bd,
  149877. 0x2b486205,0x0f2cea9b,0x6f19056c,0xe32387e1,0xa5dc2a41,0xea75365a,
  149878. 0x12b4be86,0x76c29acc,0x8d63294d,0xa01fcab7,0x0cab9f24,0x81dbe88b,
  149879. 0xf414c054,0x76646e5b,0xcb96b7aa,0xfe111893,0x7664e097,0xb649f5b1,
  149880. 0x53fcf5a9,0xa196422e,0x0b7ff634,0x5978c9bd,0x3c229895,0xb5feb38e,
  149881. 0x0833c456,0x038a49fb },
  149882. { 0x13e93257,0x35e3818c,0xa612741b,0x14cebc9d,0x7caac06b,0x4f6e9249,
  149883. 0x3daa1116,0x82278e33,0x4de2034a,0xe7cc565e,0x0a1ba630,0xbb7dc95f,
  149884. 0x66956fbd,0x81dd9f23,0xbb132dd6,0xc63e6319,0xfc241337,0x6e22b022,
  149885. 0x7e8beb1c,0x23848193,0xd8c938ac,0x83b1994d,0xa6bb5644,0xb54cfaca,
  149886. 0x06f91807,0x1a7cd44e,0xa8f8d9f3,0x1dd439bb,0x7f74a8e6,0x660c2a78,
  149887. 0x121b5660,0x4bb76e22 } },
  149888. /* 229 */
  149889. { { 0xe6354817,0x7a151e8a,0xf038b438,0x33d494ea,0x85958986,0x4c86c688,
  149890. 0x1dcbac12,0x72153827,0xc0edad06,0xf487af8c,0xe500e5d6,0xad33051f,
  149891. 0xd6e47f55,0x0a711b1b,0x8c746ad5,0xa68709a7,0x6402f35e,0x27f17262,
  149892. 0xfb30c130,0xc6d08efa,0xc06c7497,0x9ef1c041,0xdcc3e2da,0xd0c74ece,
  149893. 0x092e1073,0x30c5f96e,0x2aa12b74,0x0f1393cf,0x2107eb02,0x24584016,
  149894. 0x7b76f98b,0x8843d25f },
  149895. { 0xedb2a83e,0x4e1501dc,0x2bb8d724,0xbcfe8fb0,0xd925df62,0x09020659,
  149896. 0x42ab6fc3,0x3c715dcf,0xa0f09dfd,0x73c05055,0xe3590aea,0x126745d8,
  149897. 0x76ff749e,0x5382f4d8,0xa920c663,0xfc69feef,0x9fd711ca,0xde160211,
  149898. 0x9075c4d5,0x4219c3bd,0x3ded6bf2,0x3800cbd1,0x6263a116,0x8c7ea0eb,
  149899. 0x7d264c37,0x35bd7958,0x7159c98c,0x56e22e45,0xfa7373b5,0x71bf2a2d,
  149900. 0x8935c949,0x0503f939 } },
  149901. /* 230 */
  149902. { { 0x71dad4f6,0x65addc66,0x024bea1b,0x238e4889,0xf605d3dd,0xfb76c8e2,
  149903. 0xb0d96b89,0x13d5f5de,0x6601b2cb,0xe0b5ba35,0x83e3d254,0xe37d491d,
  149904. 0x240c8ea7,0xe8860423,0xe91c99ba,0x374182f3,0xa87ad919,0x26c2caf9,
  149905. 0xf574f295,0x4b13040a,0x944000a3,0x5b9bced1,0x06df42e7,0x4ccc57be,
  149906. 0x4bd1089d,0x22e8ec50,0xdddbb500,0x0c53177a,0x9ecfeadb,0x690d31d2,
  149907. 0x176668f9,0x735778fe },
  149908. { 0x843c1137,0x0f86ee3e,0x3f0b73cd,0x3c1c42fa,0x8ab20e3a,0x0e75679d,
  149909. 0x16242fae,0x6f95f1f4,0x39b092e4,0x7b88e11c,0x4c236ac0,0x1629403e,
  149910. 0x2dac02e6,0x66105f41,0x862e0632,0x74dc28a7,0xf3b23c8d,0x2118ffb2,
  149911. 0x0745ffbf,0x1182417c,0x4c05711e,0x49b55a04,0xcefbe4de,0x2c665b74,
  149912. 0x97bf7107,0x1cc4c01d,0xc54f0676,0xb2ca06da,0x7450d0f8,0xfc599daa,
  149913. 0x1a3182a1,0x52e637a6 } },
  149914. /* 231 */
  149915. { { 0x6bebc6db,0x481700f1,0xf9503d92,0x4a6b45db,0x5d153919,0xc715cd3c,
  149916. 0xe5ad2abc,0x942a1c05,0xab7b466f,0x36a82433,0xba13918b,0xba413bed,
  149917. 0x90f4e6ce,0x698a5624,0xf3f1f3ca,0xbb720da6,0x63471ab3,0x2116d41d,
  149918. 0x303d3609,0xe00d2227,0x463ba69e,0x7fd4cc00,0x62845fd1,0xac609e4d,
  149919. 0x80adc9c7,0x63603b2c,0x45fafbca,0xbf16fc9a,0xc4bc94ab,0x41007f7f,
  149920. 0xa74b1698,0x7c916b4f },
  149921. { 0x78bac2d4,0xc1026f91,0x2601a875,0x8a2e8098,0x0073d640,0xad2f276e,
  149922. 0xfcc1fb88,0x443610c4,0xca6b291f,0x5727b822,0x88ec60fc,0x0645532c,
  149923. 0xed9ad48b,0x51e48899,0xf543f103,0x841b48b5,0xd591ceeb,0xa6ccb1be,
  149924. 0x9dcf5a8b,0xfc4adf0f,0xb347ddb4,0x3a7ca020,0xcb44c521,0xaa1accc2,
  149925. 0x0527c0c4,0x773b6828,0x7023cf50,0xaa374c10,0x6b74c926,0x733d1000,
  149926. 0x77a8d07c,0x1ff3916f } },
  149927. /* 232 */
  149928. { { 0xf997939d,0xaa218fe4,0x791583b3,0x3d4dfbbb,0x87f7560b,0xb3a7b5da,
  149929. 0x5da92c98,0xa9c02801,0x46666f4a,0xe1eb4aad,0x14ce9dd7,0x2eb17a51,
  149930. 0xef8f3076,0xf46a66a4,0x810e546e,0x900b45c6,0x4baf04dd,0xf7af2258,
  149931. 0x5c84d42f,0x3cc1c872,0x8e4c83de,0x3093f225,0x170d88b2,0x62fade41,
  149932. 0xac076e44,0xe19612e4,0x32dd141b,0xf48d7346,0x925e34da,0xc1b1f759,
  149933. 0x072b90c9,0x19ed1a56 },
  149934. { 0x6c735473,0x9cf7fcde,0x6003bc3e,0xaab88e67,0xfb199bb8,0x12187cbc,
  149935. 0x9accccbd,0xbb730441,0xb0f65459,0x214aff3c,0x6f926282,0x6aec81a3,
  149936. 0x9f9d20b8,0xaa82cb32,0x5773cc90,0x82f3f90f,0xf62257e1,0x4af60e6b,
  149937. 0xbd4762df,0xf18b44bf,0xdb970753,0x3948b129,0x7c22c18e,0xc6e920e9,
  149938. 0x57be97ad,0x393d6208,0x46b637f9,0xe8d7382c,0xf1fed1d5,0xf6625ccb,
  149939. 0x68681599,0x6f31e0f9 } },
  149940. /* 233 */
  149941. { { 0x82b8f204,0xc45afe55,0xd358b54a,0xac0441b6,0xacd5f5ed,0x7213e7bf,
  149942. 0x139bcd93,0x1914c70b,0x96dbcbb0,0x714b4581,0x1ed35d21,0xe9297d35,
  149943. 0x6a3e1f20,0x8f640837,0x2f3cd705,0x150a8a9d,0xdcdd9f6d,0xfb36e801,
  149944. 0x5cf56d82,0x5a54eb65,0x92aa5a21,0x7610500c,0x3b089f03,0xd10d0ae2,
  149945. 0xc42b66e8,0x491b2079,0x0eee8d48,0x4af1ae3d,0x41556f45,0x137e4c28,
  149946. 0x63d8a7e6,0x875e3308 },
  149947. { 0xaf6c0acc,0xdc80fddc,0xbb1e7c08,0xd5ad1e66,0x828585ad,0xdc717ae1,
  149948. 0x275c7da6,0xbdc54340,0xd26b9e15,0xf4b4c852,0x6a05fa50,0x5f0a1fbf,
  149949. 0x817bcb32,0xc6f81e47,0x70ff2e1d,0x2cbd4328,0x67c7f7fc,0x8a249016,
  149950. 0xb585a6c4,0xd045acb7,0x4666c057,0x2e972ad4,0xe6d7d63d,0xc74d87cf,
  149951. 0x0e274144,0xf7067d87,0x8b2584ae,0xb2ca157a,0x75f0fdeb,0x495c5bfb,
  149952. 0xf386e009,0x5abb0581 } },
  149953. /* 234 */
  149954. { { 0xf0c97f57,0x8be62d2b,0x962f28c7,0x0fe04871,0x47b50abb,0xc548a467,
  149955. 0x44fa09ed,0xf6b26e03,0xab05a96e,0xfd44c6e3,0x70e6ae82,0xedb0032c,
  149956. 0xd7e4899d,0x28bd402b,0x9b7c11c2,0x43f2e963,0xce913716,0x0ec3fc0e,
  149957. 0x02fd0f8c,0x769b8bc9,0x7cabc3ac,0x9d9cb3aa,0x06924cc9,0xe88a8892,
  149958. 0x42609014,0xa51461aa,0x962e79e0,0xc7f4aa8b,0x8b1b3e80,0x4ef0210a,
  149959. 0x1bfee4bc,0x70544680 },
  149960. { 0x121901c1,0xfab3d713,0xfead54aa,0xe90a2627,0xbc08ba23,0x64f6d285,
  149961. 0x36ec227e,0x8d993015,0x06c191ab,0x99a16ab9,0xf649ce2c,0x86b1cf5b,
  149962. 0x66be3a80,0x59206759,0xccba2cf0,0x18836279,0xeff53486,0x2c157b87,
  149963. 0x4b223af2,0xbfac9896,0x0aae7a57,0xcd0fd4f0,0x63218a80,0xdaddb940,
  149964. 0xdf88f14e,0x3844bb79,0xb71ed9fd,0xc1b3e3d4,0xd6205036,0x6c634a13,
  149965. 0xb8680a6b,0x6f56aecf } },
  149966. /* 235 */
  149967. { { 0xd9205c5d,0xb01dc803,0x67123929,0x68955f7d,0x9d9b6565,0x3debbffd,
  149968. 0xd3b1acfe,0xb844395e,0x6094eeff,0x04328b21,0x22991feb,0x6631ffa8,
  149969. 0x190dd075,0x0dde66e6,0xe8577c05,0x75b03c55,0x91722407,0x6c91ce5f,
  149970. 0x8ebb3a3f,0x9a288a40,0x058a1396,0x1d376f8a,0x9a6e0676,0xf3a59457,
  149971. 0x7b71d288,0x103029c5,0xb44c30c0,0x0843f428,0x730e0b9c,0xd8e6aff8,
  149972. 0x4ed644ad,0x7b6be811 },
  149973. { 0x3d3aa54e,0x3ec38e4a,0xd83d509a,0x10233943,0x243955e2,0xf84aa621,
  149974. 0xf51d3d44,0x29104717,0x7eca4e37,0x62d2442c,0x85fa55de,0x8c5a523d,
  149975. 0x851da1b5,0xc6f5ccda,0x20001468,0x044bcaa8,0xe01702e0,0xf7501e68,
  149976. 0xe6a0acec,0xf0819359,0xac0ef0b2,0x33dda6ad,0xfd964f01,0x97aeedc8,
  149977. 0x530b90d8,0x48dacd0e,0xb84122eb,0x4c5fad6f,0xd700a1de,0x2284ec1e,
  149978. 0xdbca5474,0x86f9a835 } },
  149979. /* 236 */
  149980. { { 0x450cc69f,0x0e1d9055,0xc9edf98f,0x50eb14bc,0xee7eba01,0x1bb94e77,
  149981. 0x998f8e53,0x5f7a6737,0x1b16eef0,0x588384e3,0xd85c5e15,0xbb928723,
  149982. 0xcbd952aa,0xfe51e345,0x7e241674,0xc5d0ee28,0x100182f0,0xfdc146ef,
  149983. 0xe7f5be2c,0x0f739e92,0xb656bd3e,0x501ab3af,0x5168e289,0xb1552dde,
  149984. 0xb8ee104a,0x940dfe31,0xc4304475,0x42923603,0xc460a913,0x9306f114,
  149985. 0x03b51f86,0x5bfa9faf },
  149986. { 0x107b258e,0x2a23f52c,0xd66341dc,0x989e82bb,0x823cff1a,0x54a3ced8,
  149987. 0x719b491f,0xf45b7794,0x2433dfb8,0x898c2218,0xc49250ee,0x0f9dd91c,
  149988. 0x4fa17655,0x50c2a2ae,0x2c327f45,0xf7aa1ce4,0x583b1e41,0x13a15ad6,
  149989. 0xa1bfad9e,0x9aa0d5a5,0x8e1fbdcd,0x9b1caa28,0x915f7f87,0xaf9283b6,
  149990. 0x87e81a1e,0xc10e4e0c,0x1080d296,0x04fdca56,0x12755bd8,0x6acc9616,
  149991. 0x828feeda,0x1b1266aa } },
  149992. /* 237 */
  149993. { { 0x774ee49c,0x4ebc0a00,0xcb6237d7,0x776f6852,0x5df938a3,0xfc0544ac,
  149994. 0xb6fbfbbd,0xc3388ec8,0x745f2eae,0x84ac8bcd,0xb1ece937,0xa9c56609,
  149995. 0x7de8fa13,0x656fb6ac,0xa532b871,0x5f8ded74,0xaa889f09,0xab0d428b,
  149996. 0x10b7aec2,0x43b27f28,0xfeecb34c,0x26426e1e,0x9e89c2db,0x44431b6b,
  149997. 0x39211090,0xaac4bc5d,0x4fd81058,0x926f7368,0x471ef60e,0x452fa691,
  149998. 0x218d7a23,0x33517fdb },
  149999. { 0x593c4a36,0xa9c33f46,0x36b1a9ee,0xac69d718,0x4277beec,0x55a20c1d,
  150000. 0x7e4f179c,0x3e8ca24e,0xd46d88a2,0x57373369,0x730702f8,0x71ceb1cc,
  150001. 0x35eed574,0x8b184d97,0x0704cec2,0x7f4517a2,0xd7062a53,0x7f129d18,
  150002. 0xb1d77e1c,0x07a4571b,0x8350d8b2,0x774ac309,0x61fab8ef,0x27b2919f,
  150003. 0xb5dd801b,0xa7c4cc13,0x1434591f,0xe7e6255b,0x5a3592b3,0x349937b8,
  150004. 0x30c77549,0x31fac63d } },
  150005. /* 238 */
  150006. { { 0x04913fb6,0x2ee8cf1b,0x1769a6b3,0x7e401350,0x783e61f0,0x790ebb71,
  150007. 0xe27f2ffe,0x1e5107f9,0xedaf89bf,0x124ba67f,0xe58de68d,0x189200e1,
  150008. 0x6df5abee,0x962732a3,0xacbeb4aa,0x72cc37cf,0xe93c5a76,0xb0c5fa96,
  150009. 0xde63393b,0x4c2a317c,0x830b2d6c,0x97f65e67,0x1be5b96a,0x4afc3504,
  150010. 0x730ce66d,0x0bf40a60,0x9340d84f,0x96a1ba79,0x07626b08,0x3ee18254,
  150011. 0x7ab0cbf5,0x01db35db },
  150012. { 0xac0efee2,0x6e0fbc2d,0xd71dbb45,0x8406ebcd,0x19b69abe,0xe72bde3e,
  150013. 0x37e01822,0x49cb7e61,0x11458b4c,0xcbb8c01c,0x687c5d63,0x420b4847,
  150014. 0x454c6776,0x1847dfa1,0xd1839d18,0xbede911d,0x278df046,0x1b9dc9c9,
  150015. 0x881a336c,0x294bd62b,0x93e77adc,0x7f096879,0x43ce3ba7,0x7ac90665,
  150016. 0x7764eefc,0x148695fd,0x9ac465cf,0xe0c20f0b,0xa6e2cdb1,0x636e8d28,
  150017. 0xd755341d,0x7b6ba98c } },
  150018. /* 239 */
  150019. { { 0xc1881ab4,0xcb1d9e03,0xb3168c88,0x19c25d55,0x282364ce,0xa82d3d47,
  150020. 0xf161aa24,0x95994390,0xe1ebb2c9,0x7838bc00,0xbdec7a75,0x8fd5dfcc,
  150021. 0x4ff7220a,0x4dd203c2,0x0efeff48,0x5ec173b3,0x16428b35,0x99f1d2b3,
  150022. 0x056e813f,0xc06bd9e5,0xc0b319f1,0x929172ba,0xfd223b15,0x6ae0e384,
  150023. 0x98d091ed,0xbd01059e,0xa654648e,0x6b3168e4,0x3375e798,0x2211447f,
  150024. 0x71eb4508,0x47e81019 },
  150025. { 0xbc8c290d,0x7045d45a,0x810fb33a,0xa33d1355,0x46fbbf2f,0x2baf0092,
  150026. 0x385c7cd9,0xacff3f1b,0xe161985c,0xc5b150ec,0x2a888748,0xc6ee0a7f,
  150027. 0x5e88dcc8,0x9d888c8e,0xccb86443,0x4dd735f2,0x3c40f6f2,0xcc1e13b7,
  150028. 0xf3fed691,0xfc3a25ff,0x257ee5c7,0x4cb43b17,0xf32db135,0xaa654f93,
  150029. 0x02dff2d3,0x44f58d0a,0xa8ca6394,0x78e3f188,0xf3e86697,0x39646cce,
  150030. 0xe0dce87b,0x785b1902 } },
  150031. /* 240 */
  150032. { { 0xa92f9a20,0xfcce2361,0x9d64540e,0xb7bdca87,0x1d00d7c5,0xd4739a85,
  150033. 0x2e97c926,0x067ac8dc,0x78da6a8b,0x2aea3ffe,0x63c51b69,0x6828bf54,
  150034. 0x7155141a,0x76f1c479,0x3977d810,0xf4bcbef6,0x541bce7a,0x75bc4949,
  150035. 0xd17041a5,0xe01f4066,0x87755eaf,0xd282d5bd,0x59e7ae80,0x6e2107dd,
  150036. 0x382ab36f,0xaa56e166,0xb9d1d634,0x65ee8ef6,0xce4ed844,0x99a2160a,
  150037. 0xb7712c27,0x6557c367 },
  150038. { 0xd75b6e52,0x561b0268,0x118d0e89,0xb0813640,0x6a2eb1ae,0xcff53330,
  150039. 0x6d090894,0x4e462226,0xb5fc1d48,0xbb351227,0x57a3062d,0x9365ea07,
  150040. 0xd66e2dc5,0x4caca37b,0xb9095887,0x220d7d23,0x8c4473bf,0x9c0fd393,
  150041. 0x6787da4f,0xadff370a,0xd057f4b8,0xef0aebcc,0x1173f33a,0x205e744c,
  150042. 0x925a26b4,0xb8d1f0a5,0x722fbbfd,0xa9364f49,0x8227d284,0xc891ae77,
  150043. 0xa0e08ab4,0x15c40d04 } },
  150044. /* 241 */
  150045. { { 0x2a0e18d1,0x9baf169a,0x4c0327c2,0x9971c017,0x7bc262ce,0xd81a323f,
  150046. 0x818ff379,0x2099db8d,0x4cd3c330,0x663f663d,0x011a0553,0xef5325c3,
  150047. 0xf980a470,0x9cd70bdc,0x1c9ed070,0xe64452d1,0xac676e13,0xafbf43f4,
  150048. 0xae85c2a5,0x97bec0a6,0x470490c4,0x2faae550,0x491e6ba9,0x0ab97a87,
  150049. 0xaafa9914,0x4055f537,0x36726557,0xfc95adbb,0xd119d6bf,0x646343b9,
  150050. 0x9d341e37,0x788e94a0 },
  150051. { 0x9c53461a,0x053a6fe5,0x08e3b6ed,0x75ec897e,0x0768d939,0xa8f5d2f3,
  150052. 0xcc213d4f,0x9bd6bff6,0x05b0147c,0x590c7b41,0x7c7b8169,0x20a3628b,
  150053. 0x5bce78e9,0xc66a086e,0x4dec1d8f,0x3dd4d282,0xc19dcce9,0x890acf44,
  150054. 0xd8435a7e,0x6632d875,0xea6381b2,0x590167c1,0xf0dcc128,0xb2259797,
  150055. 0x46f8d463,0x91a612b4,0xc15efa39,0x42185d78,0x119f6788,0xdf55ec37,
  150056. 0x780dea93,0x91b19cc6 } },
  150057. /* 242 */
  150058. { { 0xcb5d8b80,0xebf2709d,0xfc35660e,0x03b96182,0x055ef969,0xb873d991,
  150059. 0xe47c4342,0xd1ea4b4d,0xd54f8867,0xcc4b9244,0xfd8d77ef,0x93b1a2ca,
  150060. 0xe8c1f563,0x068d24e7,0x49973056,0x5f5fabb6,0x0542374f,0x83248c50,
  150061. 0x3f38e913,0xc36de2b5,0x7bb680be,0xed07e8eb,0xd8f313b5,0x964813d7,
  150062. 0xafd2d392,0x7bb6a069,0x0848a31a,0xc06d848e,0xe4f0c325,0x6867fb2f,
  150063. 0x067343af,0x3c2ba834 },
  150064. { 0x9d3ad63b,0xab62d775,0x59e0eb1f,0x3f9cab97,0x3885e117,0x70332a63,
  150065. 0xe20b2f9e,0xf22cafce,0x49eca947,0xb529ba7e,0x6228d88d,0x24954216,
  150066. 0x39239561,0x80ea23ec,0xd4370644,0x1b8907e7,0x563e4e44,0x4b7fa455,
  150067. 0xb2a4b0fa,0xcca9829e,0x48060792,0xd0a720a4,0x246991ce,0x8ccdda0c,
  150068. 0x348d086b,0x37a2325b,0xf60aee13,0x566ed509,0x147f253f,0x3d30e091,
  150069. 0xc1073bd8,0x1fa627a5 } },
  150070. /* 243 */
  150071. { { 0x42478fd4,0xa11222a2,0x670b2000,0xacf4c6f1,0x8359c6de,0xf71bb04f,
  150072. 0x7b93cdbc,0x618e2829,0x230db60b,0x96e1bae3,0x965b3b29,0xf17fd3b4,
  150073. 0xbc7055dd,0xa58639c6,0x4b817d7f,0xc3ea92ed,0xd23b08a4,0x9082b2a6,
  150074. 0xdc17010e,0x8471228a,0x20e89d97,0x753b9e46,0x03ff77c9,0xcf7e4f97,
  150075. 0x2bbe60e5,0x6c3f8245,0xb80e017d,0x9e432cbc,0xc0a45edb,0x150a5acd,
  150076. 0x4798743e,0x67b8bd05 },
  150077. { 0xf4797cf7,0xe66079b4,0xd03fde02,0xe31c998a,0x54caaef1,0x5aa3763a,
  150078. 0xf7649711,0x64d9a1fe,0xaf29b1a7,0x7ce0dc73,0xfb66ca93,0x6661b083,
  150079. 0x32fb6a78,0xbf4d74fe,0xdf00a561,0x25f6ef09,0x831d1159,0x2bc4383f,
  150080. 0x536bde37,0x6d5cc10c,0x882cc65b,0xd4945f9f,0x451a99b8,0x81f48f13,
  150081. 0x6bac11a4,0x140161cd,0xf18a4a0a,0x9d94d4ed,0xa467a824,0x65363165,
  150082. 0xa4c9aedf,0x74297aa9 } },
  150083. /* 244 */
  150084. { { 0xe21124ba,0xc49758a4,0xa87ffbd2,0x99bd8198,0x3d6638a8,0x45fbcdd1,
  150085. 0x15f7bf76,0x94645ff8,0xc4e6d57e,0x5fa6736f,0x92e61db9,0x1eae6475,
  150086. 0xcbdf944a,0x79575c0c,0x25b31d74,0xa3d13047,0x4cab5ae6,0x7881df22,
  150087. 0x1a2887f2,0x8dbfd299,0xa26ac459,0x23d07590,0xd8661d4a,0x2e589852,
  150088. 0x8a0140f7,0x37b5c13b,0x3fb3782a,0x0f94199e,0x1bc14e90,0x722aa059,
  150089. 0xd55bbb12,0x89aab7ba },
  150090. { 0xd656bdc7,0x8b345a96,0xe176cd3b,0x43bdc8af,0x32d64c43,0xd69518b6,
  150091. 0x79b82b41,0xfcf364a7,0xffb0cf82,0x907b344e,0x5101287b,0xf3d0c83c,
  150092. 0x34cd90ef,0xe9f26a59,0x07082b5c,0xe5f5aaf2,0xece7c165,0x4eb72c75,
  150093. 0xbe986cd6,0xe9590a81,0xff1536aa,0xfeef498f,0xa8263d5e,0x04560243,
  150094. 0x54ae872b,0x940be14f,0xe3207686,0xbee7bcc9,0xc1bc4d7a,0xd496a27d,
  150095. 0x5940ab46,0x002dc297 } },
  150096. /* 245 */
  150097. { { 0xb69d60c3,0xee533937,0xfe972755,0x260be552,0xc0c725a6,0xb11fb78d,
  150098. 0xcab2e7c2,0x6982c27e,0xee2322cb,0x4bceedd9,0x122704f7,0x952b19ed,
  150099. 0x854a6165,0x2df4c285,0x7b192485,0xba40b5bf,0x0119f52a,0xfcbca950,
  150100. 0xe5add86f,0x7467d1cb,0xd9d0f2c1,0x9bf536fb,0xb8d4ebc9,0x3c296e34,
  150101. 0x05a81317,0x0495f8f4,0x73335f76,0x8c59e8d6,0xe0542122,0x0b53d324,
  150102. 0x3c3bda73,0x4d564535 },
  150103. { 0x7e5c0877,0x7322f800,0x0ca9a764,0x481b43e6,0xa2c12716,0x231f4f4b,
  150104. 0xed3136c2,0x09596857,0x38db30de,0xae826322,0x99908ebc,0x652fad40,
  150105. 0xaf0d231e,0x0b8d1814,0x09cbc349,0x2680c54b,0x4bf3bf8e,0xfd4562f3,
  150106. 0x092b595f,0x2985090b,0x5e15fc34,0xe6f39ca4,0xbc378168,0x70175191,
  150107. 0x845a4a87,0x906944b3,0x82a1541a,0xacc6d74a,0xb155c8b4,0xadc9bab3,
  150108. 0x77306c62,0x1f2f89ce } },
  150109. /* 246 */
  150110. { { 0x9affefdf,0x8253ef41,0x4cf9256b,0x05d7ece5,0xb444e483,0x377002f2,
  150111. 0xcba5471f,0xb189755f,0xd5cbe015,0xc88483cb,0x6a0b8429,0x254f7c69,
  150112. 0x61f3f61d,0x18850bd4,0x0a247157,0x7ba21089,0xd92eeb0d,0x35abbc2e,
  150113. 0x965dec89,0xfb56cabe,0xbc55684a,0x9da23724,0x6a7a7492,0xd8ba396f,
  150114. 0x2ef4ba46,0xfcb90db7,0x9909b27a,0xdd234fe0,0x76f4366e,0xbdf3c164,
  150115. 0x17e50d47,0x09c8097f },
  150116. { 0x60050c07,0x6a04b140,0x43a8e37e,0xc29e8318,0xbb55e41f,0xcb9429b2,
  150117. 0x2ce60e3a,0xed2fea5a,0xdb9d82f4,0xdc7b1ff3,0x687d37fa,0x48ebecc3,
  150118. 0xecb07539,0x79153e32,0x57075692,0x6a60054f,0x800759ba,0x3871cd0c,
  150119. 0x30922df1,0x17a7386f,0x83357b7c,0x4e9fc59e,0x39415186,0x1d26b3a9,
  150120. 0xd34db889,0x912a0222,0x59fcdb71,0x6672fcf4,0x44ff3036,0x5a3f268d,
  150121. 0x6911e16c,0x6f113ed3 } },
  150122. /* 247 */
  150123. { { 0x1836f1c9,0x52a9df59,0x4232307d,0xfa6519f5,0x5ded285a,0x8406c701,
  150124. 0xaf627f75,0x0a1545ca,0xace0417d,0xae1111ee,0xa6113443,0xfb28bdf6,
  150125. 0x52dbcbcb,0xde9ef0ab,0x7813e658,0xe9dc181b,0x99127225,0x0b1dabdb,
  150126. 0x22814c59,0x5f0598e3,0xd934ee7e,0x5c3b966e,0xb99ba4bf,0x4eb84eda,
  150127. 0x3c1b55e7,0xb2919a34,0x94aa860f,0xa9addb49,0xf6811ff6,0x1b7220df,
  150128. 0xd1a183e2,0x6636a23b },
  150129. { 0x20587283,0xdf5d5a2d,0xef07fc5d,0x0b3822c9,0x0ef6de38,0x1786bd55,
  150130. 0x25d1671d,0x163cf907,0x1cdb1def,0x74bf971f,0x0842fc4a,0x5749e830,
  150131. 0x27f854f7,0x0e2edbc7,0xbce24acb,0xbb27bbda,0x05bed08d,0xc1b19cec,
  150132. 0xf7c904bc,0xaada123e,0xd89982db,0x02429f1b,0x65f6e632,0x49d3616e,
  150133. 0xee59fd32,0xa3789fa8,0xfe9f29f5,0x160ba3ba,0xaf5378a0,0x0f2d3b61,
  150134. 0x73c2a6f8,0x7aeecc76 } },
  150135. /* 248 */
  150136. { { 0xdc43b0db,0xf3a4757c,0x98119cad,0x3d8a4e85,0x4616c156,0xf8095bf6,
  150137. 0x4f533e97,0x3e2a07bc,0x39cfc5ad,0xa9824367,0xcd68052c,0x18a6ba3a,
  150138. 0x8a1cec66,0xbd60e590,0x02b1b695,0xae3841a5,0x190a195b,0x986dff12,
  150139. 0xad31fd9b,0x2df2beac,0xcc728f7b,0x7d893224,0x0cf0a992,0xc38ea738,
  150140. 0x586a44ea,0xa8439a80,0x1615f03c,0xede7f7f0,0x27a1f885,0x48249908,
  150141. 0xb78a7645,0x28ec4006 },
  150142. { 0xa2fe0009,0xe1820c2e,0xf13874e9,0xe11ba5d2,0xc524db52,0x97522454,
  150143. 0x7fede529,0x4d477426,0x9b2500d4,0x01d3419a,0x1869244b,0xce08a492,
  150144. 0xdd1be1b9,0xba169023,0x32a301e0,0x242c3e54,0x70906788,0x9b56f7ba,
  150145. 0xc74a8cc4,0xf0ad2a09,0xd76f9439,0x99cd1841,0x621fb60e,0xeddafe0b,
  150146. 0xbc397634,0x056bee54,0xff7f0a84,0x4653f860,0x2011c0af,0x6bd4876f,
  150147. 0x0c9525c3,0x134f4cc7 } },
  150148. /* 249 */
  150149. { { 0xe938dff4,0x9621a3ec,0x486a79a3,0x7d101a7b,0xde950537,0xf2c4ef97,
  150150. 0xe65d87db,0xf3184099,0x373b8cfa,0xb89c7ffb,0xe842916e,0x68baa505,
  150151. 0x4ebea764,0xa790fd09,0xe592892b,0x679df6d4,0xfcfed741,0x2023331c,
  150152. 0x9880ff21,0x0bf4efd2,0xd0344501,0x7ca78ddd,0x342858c8,0x2cb09ecb,
  150153. 0x2575487a,0x9e5eb6dc,0xebcb0491,0x50675a15,0x7381d471,0x09d2e74f,
  150154. 0x83d3d6f4,0x6ea37829 },
  150155. { 0x4e5cc40a,0xc65c094b,0x1af37dfb,0x7a2e3f6a,0xf9026e44,0xef677e9d,
  150156. 0x93880f53,0xb7878c95,0x7f644aa9,0x4aa30b07,0x2f208c3c,0xa0c51683,
  150157. 0x658d663b,0x7c0277ae,0xae1d9130,0xef0b3c38,0x695c3ea4,0x302f37a7,
  150158. 0x6a0c5e0d,0xe004c1c5,0x20cbcf9f,0x9fd495c4,0x568a0e7c,0x706d5b9d,
  150159. 0x59286454,0x8b225dff,0x8d9a709c,0x527d4465,0x87c08d68,0x47c558da,
  150160. 0xbb4ef07d,0x606ee6e6 } },
  150161. /* 250 */
  150162. { { 0x57c621f6,0x02d99fc7,0x7fe83d48,0x292e40c1,0x9ef199b0,0x1bdfc7a1,
  150163. 0xe62c7666,0x78a04102,0xe6738753,0x16cda370,0x1e3a65af,0xbc81974d,
  150164. 0xf78fe209,0x19742048,0xbf5981c6,0xc83a058a,0x9c89702d,0xf26b2434,
  150165. 0x9d1a678a,0x988b2f1e,0xff29ae29,0x472bf9b0,0x1d7cf5ec,0xa143e398,
  150166. 0xb268ddd8,0x9c9d7e45,0x5fc4ff76,0x166cda55,0xa4aa7673,0x6044cdf0,
  150167. 0xe9148707,0x49dba6f7 },
  150168. { 0xa758e37a,0x20e47fb2,0x2d8eaf66,0xaf6b31d7,0x6f9c2210,0x352ad5f9,
  150169. 0x90efc32b,0x0093f727,0x41e4b264,0x435c99dc,0x05b15795,0xbfa878e0,
  150170. 0x0e673575,0x99c520a4,0x87eea759,0xca682594,0xf12a348b,0x029f7b81,
  150171. 0x2aa2ce35,0xa547cc18,0xead5e2c5,0xa11d874b,0x55682cdf,0x9af0349b,
  150172. 0x8bbe8e66,0xf86ebfea,0xf55394ab,0x3dab8782,0xebc8eb8f,0x458bf797,
  150173. 0x9b7de78c,0x4890a7a4 } },
  150174. /* 251 */
  150175. { { 0x8da995f6,0xd7299689,0xec6156ef,0xd39eaae7,0x356a82d5,0x6959040c,
  150176. 0xc135bcfe,0xb2046b21,0x0f595c78,0xea720b64,0xe7c5fb40,0x02824efa,
  150177. 0x0edb3bfc,0x97d8fd4c,0x79f24ebe,0x12f02905,0x187ea6b9,0x16fc47cf,
  150178. 0x789d5c23,0xc219fd27,0x89263ecc,0x233a6b6c,0x8b6d30a6,0x823634b2,
  150179. 0xc9b33680,0xca352e25,0x40c77456,0x9388d6ca,0x3c92065b,0xf8e55b0b,
  150180. 0x02439a76,0x5c17474b },
  150181. { 0x8aaccab5,0xd888e7c2,0xaaced05b,0x18027836,0xccec0f65,0x185b877d,
  150182. 0x125c2882,0x93cadc1c,0x67fdc54c,0x45df540a,0xc2788a33,0x4f3c86e2,
  150183. 0xe3a0fa2c,0x3e874469,0x273983cf,0xc59daa47,0x4a96d8a5,0x3063c48b,
  150184. 0xc2e58915,0xc38d2bcf,0x84e428c3,0x90e78b87,0xf0c4fd53,0x900a292c,
  150185. 0x941e6005,0xb7f92db7,0x6ca53a1c,0x95679241,0xb1ab0fa7,0x35f6f31d,
  150186. 0x7b58408c,0x5d675eb4 } },
  150187. /* 252 */
  150188. { { 0x870c6025,0xaeee1a77,0x91a2dfca,0xfc4a23b7,0x386b64c4,0x7b0e60c4,
  150189. 0xe5ae72b1,0xd5d5b17d,0x9eefa212,0x6dfc88ac,0xd4038b96,0x4feaefbe,
  150190. 0x8e2d2ecc,0x099ac356,0x012af207,0x548ea612,0x89c31218,0x4ffed9db,
  150191. 0xe0e67331,0x1c1e91c4,0xaf8300e0,0x009bb64f,0x6773c3be,0x8780501c,
  150192. 0xc08219fa,0xe0cd6ede,0xf81b06ff,0x7c055e07,0xe080b36f,0x82b63f9c,
  150193. 0x0a9feca3,0x02fccbaf },
  150194. { 0xb47cac61,0x9991d4d1,0xab86e12c,0x2e9d1687,0x2b94f042,0x8c6855ec,
  150195. 0x48e648e5,0xca400519,0xef89ac57,0x9ba91fb2,0x1be792cd,0x4f419206,
  150196. 0xbd0f1e15,0x82d221cb,0xfc444019,0x062eb13b,0x99790fdc,0xf3a97c32,
  150197. 0x6067a64b,0x4e796d94,0x6d23775a,0xc46dd300,0xed7f0f23,0x8672c4d5,
  150198. 0x3b4f63d7,0x821851dc,0xd26273f2,0x50a3ae0c,0xeac60f6f,0x800e58fc,
  150199. 0x13845545,0x56f1e456 } },
  150200. /* 253 */
  150201. { { 0x32c24f3b,0x01ccb3f6,0x06d817e6,0x99eb1c7f,0x6aa26776,0x8dc640bb,
  150202. 0x0845d5e0,0x7838affe,0xf81a79a8,0xf34fecb1,0x3e6819b0,0x6a2e282d,
  150203. 0x8237a4b8,0xc4b977ce,0x87636439,0x0f46b3db,0x97970497,0xa465f540,
  150204. 0x8791be43,0xd7e08762,0x34198ec6,0x00220b6c,0x093d94bb,0x57b38637,
  150205. 0x29d690b2,0x84012e16,0x20aad1a4,0x02ec9db5,0x85dc34e3,0xafee2fc6,
  150206. 0x25500cf8,0x911d1936 },
  150207. { 0xf5e5af5b,0x13b1bd58,0x7b6a22a7,0xa7ca263b,0xf3af2adc,0xab6bec4d,
  150208. 0xa04420bd,0x16651e59,0x4ba36c11,0x3b448b3b,0xff424310,0x3c62bfcd,
  150209. 0xf1a96cbb,0xde15c4a5,0xe4d1f980,0xbe0ad8a1,0x36673a3a,0x812bd14e,
  150210. 0x9212acdd,0x40303af6,0x576095ce,0x8f6dab9c,0x107f5ca5,0x7df1882a,
  150211. 0x8896a3b0,0xb903e63c,0xd863b3f0,0xf5048544,0xc09887de,0x5e5019b9,
  150212. 0xa0f53865,0x2be744fe } },
  150213. /* 254 */
  150214. { { 0x5b50f324,0x054cd05f,0x1ea3c7a2,0xb9b1eb24,0x7ff8e6b7,0x4a858a5c,
  150215. 0xec040882,0xd83902fe,0xd0cba9bd,0x72b26494,0xb29c9e1e,0xd0176f90,
  150216. 0xcebadb81,0x05d4eb02,0x372b8bfc,0x874405b1,0x79ead190,0x5c412881,
  150217. 0xec2b48cd,0xd44a3dd3,0x3f4d5033,0x84499a77,0x564c3a09,0xb37b38cd,
  150218. 0xf42e803b,0x80e99497,0xb8f518b2,0xc07b47a0,0x3568fde4,0xc710e3c5,
  150219. 0xcead0e7a,0x735f542f },
  150220. { 0x38380039,0xcaa9a171,0xf74d19c8,0xadfafe17,0xccbc1a8b,0x92d4393e,
  150221. 0xfe029705,0x3c5dbf39,0x930e9b36,0x4552b5ab,0x2afd494a,0x7ee63032,
  150222. 0x3f02ac43,0x826a9ad7,0x99356298,0x98c53562,0x7342bb39,0x0c869f87,
  150223. 0xe4f9b79a,0xd7510020,0xd34789a9,0x6361d1a4,0xcfa85637,0xf0ded5ba,
  150224. 0x88ac07e4,0x407ee73f,0x09ef1cbd,0xfac7d03f,0x4d475bad,0x25d697cb,
  150225. 0x14bd399e,0x1e984c9d } },
  150226. /* 255 */
  150227. { { 0x4850c817,0xc76d0561,0x3489812d,0xb08a5b19,0x5e58cbbe,0x7273d154,
  150228. 0x4be61e5a,0x8900b5fa,0xd7aeb8e1,0xaa088691,0xd35a3d4b,0xe66666af,
  150229. 0x57ec7d3d,0x38a2c199,0x668d6f5c,0xa0648e8f,0x7adc1746,0x1f9fc92c,
  150230. 0x843065c3,0x23a116c0,0x61e6ae69,0x36370a20,0x2aa47e73,0x626c3736,
  150231. 0xdeff6d84,0x540c25f2,0xcdbed2d4,0x9804824c,0x039a9492,0x4b5bfce0,
  150232. 0x76942e01,0x6c474a56 },
  150233. { 0x7d88e3a1,0x3aeb9a41,0xc484742a,0x105d3c88,0x3fe61131,0xe59de8d1,
  150234. 0x1a869e8b,0x148f5b6b,0xaa75d90a,0x7a8abc59,0x62146013,0x2f0c9bc7,
  150235. 0xc3824cd9,0x43faa747,0x6a5d0b92,0x81763a18,0x9bcbaebc,0xbbc341bc,
  150236. 0xf745d1dd,0xe1813160,0xb75ce5f4,0xa53ce52d,0xd50de4c2,0x15eae66c,
  150237. 0x75d7656d,0x5ed8996c,0xc4ca552a,0xe4ff5711,0x3c5305b4,0x215e985a,
  150238. 0xfa1ba2ce,0x6b258954 } },
  150239. };
  150240. /* Multiply the base point of P1024 by the scalar and return the result.
  150241. * If map is true then convert result to affine coordinates.
  150242. *
  150243. * Stripe implementation.
  150244. * Pre-generated: 2^0, 2^128, ...
  150245. * Pre-generated: products of all combinations of above.
  150246. * 8 doubles and adds (with qz=1)
  150247. *
  150248. * r Resulting point.
  150249. * k Scalar to multiply by.
  150250. * map Indicates whether to convert result to affine.
  150251. * ct Constant time required.
  150252. * heap Heap to use for allocation.
  150253. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  150254. */
  150255. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  150256. int map, int ct, void* heap)
  150257. {
  150258. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  150259. k, map, ct, heap);
  150260. }
  150261. #endif
  150262. /* Multiply the base point of P1024 by the scalar and return the result.
  150263. * If map is true then convert result to affine coordinates.
  150264. *
  150265. * km Scalar to multiply by.
  150266. * r Resulting point.
  150267. * map Indicates whether to convert result to affine.
  150268. * heap Heap to use for allocation.
  150269. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  150270. */
  150271. int sp_ecc_mulmod_base_1024(const mp_int* km, ecc_point* r, int map, void* heap)
  150272. {
  150273. #ifdef WOLFSSL_SP_SMALL_STACK
  150274. sp_point_1024* point = NULL;
  150275. sp_digit* k = NULL;
  150276. #else
  150277. sp_point_1024 point[1];
  150278. sp_digit k[32];
  150279. #endif
  150280. int err = MP_OKAY;
  150281. #ifdef WOLFSSL_SP_SMALL_STACK
  150282. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  150283. DYNAMIC_TYPE_ECC);
  150284. if (point == NULL)
  150285. err = MEMORY_E;
  150286. if (err == MP_OKAY) {
  150287. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  150288. DYNAMIC_TYPE_ECC);
  150289. if (k == NULL)
  150290. err = MEMORY_E;
  150291. }
  150292. #endif
  150293. if (err == MP_OKAY) {
  150294. sp_1024_from_mp(k, 32, km);
  150295. err = sp_1024_ecc_mulmod_base_32(point, k, map, 1, heap);
  150296. }
  150297. if (err == MP_OKAY) {
  150298. err = sp_1024_point_to_ecc_point_32(point, r);
  150299. }
  150300. #ifdef WOLFSSL_SP_SMALL_STACK
  150301. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  150302. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  150303. #endif
  150304. return err;
  150305. }
  150306. /* Multiply the base point of P1024 by the scalar, add point a and return
  150307. * the result. If map is true then convert result to affine coordinates.
  150308. *
  150309. * km Scalar to multiply by.
  150310. * am Point to add to scalar multiply result.
  150311. * inMont Point to add is in montgomery form.
  150312. * r Resulting point.
  150313. * map Indicates whether to convert result to affine.
  150314. * heap Heap to use for allocation.
  150315. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  150316. */
  150317. int sp_ecc_mulmod_base_add_1024(const mp_int* km, const ecc_point* am,
  150318. int inMont, ecc_point* r, int map, void* heap)
  150319. {
  150320. #ifdef WOLFSSL_SP_SMALL_STACK
  150321. sp_point_1024* point = NULL;
  150322. sp_digit* k = NULL;
  150323. #else
  150324. sp_point_1024 point[2];
  150325. sp_digit k[32 + 32 * 2 * 37];
  150326. #endif
  150327. sp_point_1024* addP = NULL;
  150328. sp_digit* tmp = NULL;
  150329. int err = MP_OKAY;
  150330. #ifdef WOLFSSL_SP_SMALL_STACK
  150331. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  150332. DYNAMIC_TYPE_ECC);
  150333. if (point == NULL)
  150334. err = MEMORY_E;
  150335. if (err == MP_OKAY) {
  150336. k = (sp_digit*)XMALLOC(
  150337. sizeof(sp_digit) * (32 + 32 * 2 * 37),
  150338. heap, DYNAMIC_TYPE_ECC);
  150339. if (k == NULL)
  150340. err = MEMORY_E;
  150341. }
  150342. #endif
  150343. if (err == MP_OKAY) {
  150344. addP = point + 1;
  150345. tmp = k + 32;
  150346. sp_1024_from_mp(k, 32, km);
  150347. sp_1024_point_from_ecc_point_32(addP, am);
  150348. }
  150349. if ((err == MP_OKAY) && (!inMont)) {
  150350. err = sp_1024_mod_mul_norm_32(addP->x, addP->x, p1024_mod);
  150351. }
  150352. if ((err == MP_OKAY) && (!inMont)) {
  150353. err = sp_1024_mod_mul_norm_32(addP->y, addP->y, p1024_mod);
  150354. }
  150355. if ((err == MP_OKAY) && (!inMont)) {
  150356. err = sp_1024_mod_mul_norm_32(addP->z, addP->z, p1024_mod);
  150357. }
  150358. if (err == MP_OKAY) {
  150359. err = sp_1024_ecc_mulmod_base_32(point, k, 0, 0, heap);
  150360. }
  150361. if (err == MP_OKAY) {
  150362. sp_1024_proj_point_add_32(point, point, addP, tmp);
  150363. if (map) {
  150364. sp_1024_map_32(point, point, tmp);
  150365. }
  150366. err = sp_1024_point_to_ecc_point_32(point, r);
  150367. }
  150368. #ifdef WOLFSSL_SP_SMALL_STACK
  150369. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  150370. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  150371. #endif
  150372. return err;
  150373. }
  150374. #ifndef WOLFSSL_SP_SMALL
  150375. /* Generate a pre-computation table for the point.
  150376. *
  150377. * gm Point to generate table for.
  150378. * table Buffer to hold pre-computed points table.
  150379. * len Length of table.
  150380. * heap Heap to use for allocation.
  150381. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  150382. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  150383. */
  150384. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  150385. void* heap)
  150386. {
  150387. #ifdef WOLFSSL_SP_SMALL_STACK
  150388. sp_point_1024* point = NULL;
  150389. sp_digit* t = NULL;
  150390. #else
  150391. sp_point_1024 point[1];
  150392. sp_digit t[38 * 2 * 32];
  150393. #endif
  150394. int err = MP_OKAY;
  150395. if ((gm == NULL) || (len == NULL)) {
  150396. err = BAD_FUNC_ARG;
  150397. }
  150398. if ((err == MP_OKAY) && (table == NULL)) {
  150399. *len = sizeof(sp_table_entry_1024) * 256;
  150400. err = WC_NO_ERR_TRACE(LENGTH_ONLY_E);
  150401. }
  150402. if ((err == MP_OKAY) && (*len < (int)(sizeof(sp_table_entry_1024) * 256))) {
  150403. err = BUFFER_E;
  150404. }
  150405. #ifdef WOLFSSL_SP_SMALL_STACK
  150406. if (err == MP_OKAY) {
  150407. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  150408. DYNAMIC_TYPE_ECC);
  150409. if (point == NULL)
  150410. err = MEMORY_E;
  150411. }
  150412. if (err == MP_OKAY) {
  150413. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 38 * 2 * 32, heap,
  150414. DYNAMIC_TYPE_ECC);
  150415. if (t == NULL)
  150416. err = MEMORY_E;
  150417. }
  150418. #endif
  150419. if (err == MP_OKAY) {
  150420. sp_1024_point_from_ecc_point_32(point, gm);
  150421. err = sp_1024_gen_stripe_table_32(point,
  150422. (sp_table_entry_1024*)table, t, heap);
  150423. }
  150424. if (err == 0) {
  150425. *len = sizeof(sp_table_entry_1024) * 256;
  150426. }
  150427. #ifdef WOLFSSL_SP_SMALL_STACK
  150428. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  150429. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  150430. #endif
  150431. return err;
  150432. }
  150433. #else
  150434. /* Generate a pre-computation table for the point.
  150435. *
  150436. * gm Point to generate table for.
  150437. * table Buffer to hold pre-computed points table.
  150438. * len Length of table.
  150439. * heap Heap to use for allocation.
  150440. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  150441. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  150442. */
  150443. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  150444. void* heap)
  150445. {
  150446. int err = 0;
  150447. if ((gm == NULL) || (len == NULL)) {
  150448. err = BAD_FUNC_ARG;
  150449. }
  150450. if ((err == 0) && (table == NULL)) {
  150451. *len = 0;
  150452. err = WC_NO_ERR_TRACE(LENGTH_ONLY_E);
  150453. }
  150454. if ((err == 0) && (*len != 0)) {
  150455. err = BUFFER_E;
  150456. }
  150457. if (err == 0) {
  150458. *len = 0;
  150459. }
  150460. (void)heap;
  150461. return err;
  150462. }
  150463. #endif
  150464. /* Multiply the point by the scalar and return the result.
  150465. * If map is true then convert result to affine coordinates.
  150466. *
  150467. * km Scalar to multiply by.
  150468. * gm Point to multiply.
  150469. * table Pre-computed points.
  150470. * r Resulting point.
  150471. * map Indicates whether to convert result to affine.
  150472. * heap Heap to use for allocation.
  150473. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  150474. */
  150475. int sp_ecc_mulmod_table_1024(const mp_int* km, const ecc_point* gm, byte* table,
  150476. ecc_point* r, int map, void* heap)
  150477. {
  150478. #ifdef WOLFSSL_SP_SMALL_STACK
  150479. sp_point_1024* point = NULL;
  150480. sp_digit* k = NULL;
  150481. #else
  150482. sp_point_1024 point[1];
  150483. sp_digit k[32];
  150484. #endif
  150485. int err = MP_OKAY;
  150486. #ifdef WOLFSSL_SP_SMALL_STACK
  150487. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  150488. DYNAMIC_TYPE_ECC);
  150489. if (point == NULL) {
  150490. err = MEMORY_E;
  150491. }
  150492. if (err == MP_OKAY) {
  150493. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap, DYNAMIC_TYPE_ECC);
  150494. if (k == NULL)
  150495. err = MEMORY_E;
  150496. }
  150497. #endif
  150498. if (err == MP_OKAY) {
  150499. sp_1024_from_mp(k, 32, km);
  150500. sp_1024_point_from_ecc_point_32(point, gm);
  150501. #ifndef WOLFSSL_SP_SMALL
  150502. err = sp_1024_ecc_mulmod_stripe_32(point, point,
  150503. (const sp_table_entry_1024*)table, k, map, 0, heap);
  150504. #else
  150505. (void)table;
  150506. err = sp_1024_ecc_mulmod_32(point, point, k, map, 0, heap);
  150507. #endif
  150508. }
  150509. if (err == MP_OKAY) {
  150510. err = sp_1024_point_to_ecc_point_32(point, r);
  150511. }
  150512. #ifdef WOLFSSL_SP_SMALL_STACK
  150513. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  150514. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  150515. #endif
  150516. return err;
  150517. }
  150518. /* Multiply p* in projective coordinates by q*.
  150519. *
  150520. * r.x = p.x - (p.y * q.y)
  150521. * r.y = (p.x * q.y) + p.y
  150522. *
  150523. * px [in,out] A single precision integer - X ordinate of number to multiply.
  150524. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  150525. * q [in] A single precision integer - multiplier.
  150526. * t [in] Two single precision integers - temps.
  150527. */
  150528. static void sp_1024_proj_mul_qx1_32(sp_digit* px, sp_digit* py,
  150529. const sp_digit* q, sp_digit* t)
  150530. {
  150531. sp_digit* t1 = t;
  150532. sp_digit* t2 = t + 2 * 32;
  150533. /* t1 = p.x * q.y */
  150534. sp_1024_mont_mul_32(t1, px, q, p1024_mod, p1024_mp_mod);
  150535. /* t2 = p.y * q.y */
  150536. sp_1024_mont_mul_32(t2, py, q, p1024_mod, p1024_mp_mod);
  150537. /* r.x = p.x - (p.y * q.y) */
  150538. sp_1024_mont_sub_32(px, px, t2, p1024_mod);
  150539. /* r.y = (p.x * q.y) + p.y */
  150540. sp_1024_mont_add_32(py, t1, py, p1024_mod);
  150541. }
  150542. /* Square p* in projective coordinates.
  150543. *
  150544. * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2
  150545. * py' = 2 * p.x * p.y
  150546. *
  150547. * px [in,out] A single precision integer - X ordinate of number to square.
  150548. * py [in,out] A single precision integer - Y ordinate of number to square.
  150549. * t [in] Two single precision integers - temps.
  150550. */
  150551. static void sp_1024_proj_sqr_32(sp_digit* px, sp_digit* py, sp_digit* t)
  150552. {
  150553. sp_digit* t1 = t;
  150554. sp_digit* t2 = t + 2 * 32;
  150555. /* t1 = p.x + p.y */
  150556. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  150557. /* t2 = p.x - p.y */
  150558. sp_1024_mont_sub_32(t2, px, py, p1024_mod);
  150559. /* r.y = p.x * p.y */
  150560. sp_1024_mont_mul_32(py, px, py, p1024_mod, p1024_mp_mod);
  150561. /* r.x = (p.x + p.y) * (p.x - p.y) */
  150562. sp_1024_mont_mul_32(px, t1, t2, p1024_mod, p1024_mp_mod);
  150563. /* r.y = (p.x * p.y) * 2 */
  150564. sp_1024_mont_dbl_32(py, py, p1024_mod);
  150565. }
  150566. #ifdef WOLFSSL_SP_SMALL
  150567. /* Perform the modular exponentiation in Fp* for SAKKE.
  150568. *
  150569. * Simple square and multiply when expontent bit is one algorithm.
  150570. * Square and multiply performed in Fp*.
  150571. *
  150572. * base [in] Base. MP integer.
  150573. * exp [in] Exponent. MP integer.
  150574. * res [out] Result. MP integer.
  150575. * returns 0 on success and MEMORY_E if memory allocation fails.
  150576. */
  150577. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  150578. {
  150579. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  150580. defined(WOLFSSL_SP_SMALL_STACK)
  150581. sp_digit* td;
  150582. sp_digit* t;
  150583. sp_digit* tx;
  150584. sp_digit* ty;
  150585. sp_digit* b;
  150586. sp_digit* e;
  150587. #else
  150588. sp_digit t[36 * 2 * 32];
  150589. sp_digit tx[2 * 32];
  150590. sp_digit ty[2 * 32];
  150591. sp_digit b[2 * 32];
  150592. sp_digit e[2 * 32];
  150593. #endif
  150594. sp_digit* r;
  150595. int err = MP_OKAY;
  150596. int bits;
  150597. int i;
  150598. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  150599. defined(WOLFSSL_SP_SMALL_STACK)
  150600. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 40 * 32 * 2, NULL,
  150601. DYNAMIC_TYPE_TMP_BUFFER);
  150602. if (td == NULL) {
  150603. err = MEMORY_E;
  150604. }
  150605. #endif
  150606. if (err == MP_OKAY) {
  150607. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  150608. defined(WOLFSSL_SP_SMALL_STACK)
  150609. t = td;
  150610. tx = td + 36 * 32 * 2;
  150611. ty = td + 37 * 32 * 2;
  150612. b = td + 38 * 32 * 2;
  150613. e = td + 39 * 32 * 2;
  150614. #endif
  150615. r = ty;
  150616. bits = mp_count_bits(exp);
  150617. sp_1024_from_mp(b, 32, base);
  150618. sp_1024_from_mp(e, 32, exp);
  150619. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  150620. sp_1024_mul_32(b, b, p1024_norm_mod);
  150621. err = sp_1024_mod_32(b, b, p1024_mod);
  150622. }
  150623. if (err == MP_OKAY) {
  150624. XMEMCPY(ty, b, sizeof(sp_digit) * 32);
  150625. for (i = bits - 2; i >= 0; i--) {
  150626. sp_1024_proj_sqr_32(tx, ty, t);
  150627. if ((e[i / 32] >> (i % 32)) & 1) {
  150628. sp_1024_proj_mul_qx1_32(tx, ty, b, t);
  150629. }
  150630. }
  150631. }
  150632. if (err == MP_OKAY) {
  150633. sp_1024_mont_inv_32(tx, tx, t);
  150634. XMEMSET(tx + 32, 0, sizeof(sp_digit) * 32);
  150635. sp_1024_mont_reduce_32(tx, p1024_mod, p1024_mp_mod);
  150636. XMEMSET(ty + 32, 0, sizeof(sp_digit) * 32);
  150637. sp_1024_mont_reduce_32(ty, p1024_mod, p1024_mp_mod);
  150638. sp_1024_mul_32(r, tx, ty);
  150639. err = sp_1024_mod_32(r, r, p1024_mod);
  150640. }
  150641. if (err == MP_OKAY) {
  150642. err = sp_1024_to_mp(r, res);
  150643. }
  150644. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  150645. defined(WOLFSSL_SP_SMALL_STACK)
  150646. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  150647. #endif
  150648. return err;
  150649. }
  150650. #else
  150651. /* Pre-computed table for exponentiating g.
  150652. * Striping: 8 points at a distance of (128 combined for
  150653. * a total of 256 points.
  150654. */
  150655. static const sp_digit sp_1024_g_table[256][32] = {
  150656. { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150657. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150658. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150659. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150660. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150661. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  150662. 0x00000000, 0x00000000 },
  150663. { 0x335c1685, 0x170a46d2, 0xe1007a58, 0xeac9e971, 0x43ca4a73,
  150664. 0x40e8f3df, 0x82642475, 0x2646f815, 0xb36576d1, 0x3af49bb4,
  150665. 0x72bf1afb, 0xd89e2d14, 0x2fd151e6, 0x27be882c, 0x8f88717c,
  150666. 0xaddedc85, 0x16ac6c6f, 0xd6d859bf, 0x2d8eae58, 0x0e741a1b,
  150667. 0x61c1f30d, 0x6faf7a00, 0x9b67e096, 0x66dbd09a, 0x7d3b4f7d,
  150668. 0x21f11c06, 0xc727c98e, 0x6152ba02, 0xe86cb221, 0xafd58891,
  150669. 0x6bd3baf4, 0x59e93c6a },
  150670. { 0x71dd4594, 0xe54dd36f, 0x00aef1e6, 0xbbc9cc9f, 0xa19f6530,
  150671. 0x9ea5a44e, 0x3f520928, 0x8588aa99, 0x8f5c1418, 0x9753794c,
  150672. 0xc11399fa, 0x118bd792, 0xf5cb6ab5, 0xb9bd3afd, 0x2ecb9652,
  150673. 0x813d1cb2, 0x40389813, 0xfd456267, 0x4ac8431c, 0x51f7119b,
  150674. 0x0a180eb6, 0xdd9f6a91, 0x9f7bfa2e, 0x13946d17, 0x50a9d0d9,
  150675. 0x16f18631, 0x6f8373d3, 0x5f19c20d, 0x9b6a52b9, 0xbe85ac6a,
  150676. 0x74f62e03, 0x63ef187b },
  150677. { 0x016f45e7, 0x7c376b7f, 0x2bec82f8, 0x1c1bdb57, 0xce429b60,
  150678. 0x7392f741, 0xc7afd81d, 0x6fdbf0a2, 0x7241098b, 0xbda41b1f,
  150679. 0xbb60f8cf, 0x5b407474, 0xb330bc4d, 0x933e0d41, 0x733fa3be,
  150680. 0xae182830, 0x0f5c6cd1, 0xa0ed299b, 0x3f9860c8, 0x7ff3354e,
  150681. 0x15559c41, 0xb1360986, 0x129f85cb, 0xab0cb63c, 0x47685fbe,
  150682. 0x682ecc49, 0xeb199633, 0x505e8ec2, 0xddac2cda, 0x90dcc794,
  150683. 0xf192da23, 0x4fe6791c },
  150684. { 0x05e8733c, 0x94a423d5, 0x1d5717c1, 0xcc845e65, 0xe961b322,
  150685. 0x237c7e88, 0xdb4181cc, 0x0c4471c6, 0x713bd721, 0x00c875e2,
  150686. 0xb2c17b09, 0x9dfde9ed, 0xe88ceaf6, 0x430a6de5, 0x7b81cea6,
  150687. 0xaaa7a61a, 0x233f98d5, 0xea52d026, 0x60689a9a, 0xb55efdd0,
  150688. 0x5cac4aab, 0x30cfa7ce, 0x8e950761, 0xfa4db114, 0x4e9a1e52,
  150689. 0x309570c4, 0x1a040170, 0x18c21f61, 0xbe78d9d2, 0x555d1ffe,
  150690. 0x561db297, 0x04482a18 },
  150691. { 0x73d486d8, 0xe7758ac2, 0x61cdc1e7, 0x8169f946, 0x2188ab4f,
  150692. 0x723c99fc, 0xf3373630, 0xa0e54f02, 0xbd8c2260, 0x560bee25,
  150693. 0x4531bc60, 0x28fc307c, 0x7e44feb5, 0xd6f21f1a, 0x57128d37,
  150694. 0xc8e4499c, 0xd7b2ea45, 0x963b053e, 0x32a3d222, 0x40c27a04,
  150695. 0x35459668, 0x5b51854d, 0xd73557e9, 0x66e1a49f, 0x8692077a,
  150696. 0x0d267fd9, 0xe7342702, 0xfa1350d3, 0x68ccdb44, 0x1a9c3f25,
  150697. 0xdedbf89f, 0x833a0ff8 },
  150698. { 0xab376b76, 0xa8c419c7, 0x27d0f0cc, 0x3b7294f3, 0xa90c514d,
  150699. 0xe56bb9e2, 0xa62575a6, 0x931ba51e, 0x098c0a88, 0x56fee07b,
  150700. 0xb4c16a2a, 0x04be5aee, 0xe6eb260b, 0xe513350b, 0xa1d5c270,
  150701. 0x339edad6, 0xe9dbadd1, 0xf366ed59, 0x2dd06ec0, 0x4213be88,
  150702. 0xcb1187db, 0x22d639c8, 0xd8a1058a, 0x1fec95e1, 0xa2b744f1,
  150703. 0x03f73ea6, 0xf4f05c0c, 0x741fd51a, 0x85f811a0, 0x2e2df95a,
  150704. 0xeb24965f, 0x692b3ce3 },
  150705. { 0xd2a127b4, 0x0ce6cb72, 0x8f92816f, 0x66a46ea5, 0x47a37616,
  150706. 0x43ecf463, 0xe0ab96ee, 0x163d9a01, 0xb2edbe8c, 0xc8145c6d,
  150707. 0x4de4e665, 0x2f426cae, 0x74e252f9, 0x174d0b40, 0x7d2af831,
  150708. 0x54c240d7, 0x3d652936, 0x581fa397, 0xa09d4695, 0x05b9491c,
  150709. 0x5452643c, 0x8c4e8533, 0xd4128327, 0x32d64331, 0x70361f25,
  150710. 0x64479038, 0x89ef09f2, 0x774191b1, 0x81de5fe0, 0xc0cf0aaf,
  150711. 0xf40042d6, 0x333e430a },
  150712. { 0xcf26d3b7, 0x5df04de4, 0xb53f79be, 0x57a77306, 0x1808b664,
  150713. 0xa4013c5f, 0x85037360, 0xef291ea4, 0x0b061037, 0x1ffc9d7d,
  150714. 0x65c913bb, 0xd9d04dd9, 0xf13b8587, 0x948a37af, 0xfe3ee755,
  150715. 0xb5443483, 0x04631386, 0x3fc21e74, 0xcddeb58c, 0xb3a104e5,
  150716. 0x6572cd52, 0x94fe1862, 0x15aaa408, 0xeb9a71a1, 0x459ea462,
  150717. 0x8adc6fe5, 0x4aeb02a3, 0xbb18d175, 0x2f7791d1, 0xae127636,
  150718. 0xd6bbd708, 0x10e8b31d },
  150719. { 0x3ed9f1af, 0xb87f03e5, 0x56676166, 0x03ad2477, 0x74ce15b8,
  150720. 0x38dcd630, 0x26b1e85b, 0x1877e2b0, 0x1af99c15, 0xb1654d17,
  150721. 0x9382547a, 0x9782e9e4, 0x26d55ef5, 0x6dc7fc7c, 0x2fbeb54c,
  150722. 0x9038f95d, 0x036c0357, 0xfe590dfe, 0x4fdc3f7f, 0xcfcb6eae,
  150723. 0xf35e1a88, 0xcb1fbc54, 0xda0a5568, 0x3c8e1db2, 0x5b6f5557,
  150724. 0x9a87393f, 0xe7ac0a06, 0x38646b32, 0x2a8495ab, 0xfd261c83,
  150725. 0x0cdcc4bc, 0x6485524c },
  150726. { 0xc4a6ff2a, 0x1abfb3e2, 0x35a6428a, 0x2aa03fba, 0x89aff742,
  150727. 0x884227f0, 0xba5dbd93, 0x2337883a, 0xd2a182cb, 0x38186ae9,
  150728. 0x49a01f05, 0xb9f0764d, 0x917b1e7a, 0x92411feb, 0x570cbb5b,
  150729. 0x700b1903, 0xb914be7c, 0x5d5181d5, 0x1981182d, 0x135c4437,
  150730. 0x574b9997, 0x32758d24, 0x632d28b2, 0xa650a8f5, 0xfa383f09,
  150731. 0x24078bac, 0x00a33d80, 0x6546a60c, 0x2df8b449, 0xa4061c7a,
  150732. 0xf234563c, 0x1f76f3f2 },
  150733. { 0x44c436b0, 0x9aa2c143, 0x1f69c87a, 0x79070556, 0x5f6db2df,
  150734. 0x35f3117b, 0xed56ba82, 0x85761f41, 0x7d0afa48, 0xf831464f,
  150735. 0x3adce71e, 0xa99f2915, 0x116b7488, 0xb27bf693, 0x9bb9443a,
  150736. 0xa98a5a8c, 0x2ee5fde8, 0x7f878026, 0x1812acb7, 0x3a6f93dd,
  150737. 0xdc84bc92, 0xaf92a4cc, 0xf1d4995a, 0x3c2562af, 0x04ed899d,
  150738. 0xfd9fc33c, 0x4ed2a538, 0xc028ca94, 0x049ea726, 0xd0f367bb,
  150739. 0x3d108e05, 0x04924ffb },
  150740. { 0xc673562f, 0x06548e3d, 0xe2eae48c, 0xd3b33025, 0x5e1c6977,
  150741. 0xe61fd32b, 0x6ebe557b, 0x424e2064, 0x41d6e18e, 0x767391c0,
  150742. 0x14d7e95b, 0x4b8ebb8e, 0x20991b8c, 0x4ae8b7d4, 0xe01290d3,
  150743. 0xf8a0df66, 0x925e5f4e, 0xc97e24a3, 0x1508272a, 0x79a7b2cb,
  150744. 0x25072661, 0xb40b072e, 0x9062fa49, 0xdad9e182, 0xf3c53bce,
  150745. 0x8780a784, 0x9f142799, 0x58a82b76, 0xc1468426, 0x08cd849c,
  150746. 0xc380ae35, 0x4dfce809 },
  150747. { 0xd527b780, 0x45069cb2, 0x977930dd, 0xd52da015, 0xe27d0263,
  150748. 0x10cc600b, 0xbb2d1b2b, 0x34102c26, 0x554adf3c, 0x4c652623,
  150749. 0x45f0ff47, 0xd6891382, 0xca916e7c, 0x83fa8cc5, 0xd15c8d8a,
  150750. 0x1e10f139, 0x81dc56b3, 0xf173dc2e, 0x5c4ed9ba, 0x7fcecb04,
  150751. 0x47d01228, 0x307fd7d8, 0x9f3a532f, 0x24a57153, 0xe2153c22,
  150752. 0x59e9e81d, 0xe428a408, 0xc562595d, 0x9339bd23, 0xdc7daff8,
  150753. 0xb8a06802, 0x0d075908 },
  150754. { 0xde085f2a, 0x870af2a7, 0xbe99b2e5, 0x88fcd24f, 0x59ca413b,
  150755. 0x88c0d261, 0x8559f851, 0x1f02a2e4, 0xf622da0d, 0x83b96021,
  150756. 0x6dca3615, 0x5c05c2f5, 0x7910c682, 0x0148cf1c, 0x272695be,
  150757. 0x392f2896, 0xa8d64ef6, 0x883d0bb5, 0x1cfcbc52, 0xef0d2244,
  150758. 0x526117e5, 0xf5dafcec, 0xf04928e9, 0xb68612b9, 0x393f2e2a,
  150759. 0x283f744d, 0x700c1151, 0xfbeed7ed, 0xa4360dfe, 0xf2cde215,
  150760. 0x2f08535a, 0x24fa961c },
  150761. { 0x616df7f6, 0x0767db3f, 0xfbd90326, 0x643057d8, 0x6e82d544,
  150762. 0x174daa90, 0x689643db, 0x2284f345, 0xcc89a060, 0x18b191df,
  150763. 0xd6c27d12, 0xbab46af4, 0xc9895145, 0x5a57f486, 0xcc942f9e,
  150764. 0xc03214e9, 0x41950158, 0x273e1c8f, 0x39ad43ab, 0x8ceb759f,
  150765. 0xe50ee173, 0x5e1b8b7f, 0x8f4d7d4e, 0xf635b1fc, 0x755603f3,
  150766. 0x8eff77e3, 0x7752fa60, 0x201f61d1, 0x4a6fb6e1, 0x94d7a03d,
  150767. 0xfc4f0114, 0x371cc23d },
  150768. { 0xda90c351, 0x289b115d, 0x364d9c06, 0x6d196ebf, 0xf650b31b,
  150769. 0x77a89202, 0x6f57642f, 0xcc28c164, 0x08100127, 0xdc4f7e36,
  150770. 0xdc4c807b, 0x8836cd08, 0xe00240f2, 0x1280f156, 0x99cb3953,
  150771. 0x3f9a6d78, 0x3a802038, 0x40a494d3, 0xe87d3474, 0x45697e91,
  150772. 0x26dde24a, 0x70d97d07, 0x7640c30e, 0x06f6a58d, 0x5ba6e6c6,
  150773. 0x03c2c0e8, 0xf1bc13e8, 0x330f6a7a, 0xc9f4d78f, 0x3e602e4f,
  150774. 0x0c80fb7f, 0x92b6bca0 },
  150775. { 0x5f00822e, 0x2e3d5c83, 0xb8b16f12, 0x0e825712, 0x92b0a330,
  150776. 0x81c329c4, 0xa7cc1954, 0x6b4e32ad, 0x1bb1413f, 0x0bee9cee,
  150777. 0x4a92ca27, 0xedfb7baa, 0xea3b9153, 0xcd472afa, 0x00f0c0f9,
  150778. 0xe8f09e7e, 0x5cdebb70, 0xa4e1d872, 0x4a9b63b6, 0xfe2bae08,
  150779. 0x3fd58f65, 0xf40141b8, 0xa3b62759, 0xd7ec5eda, 0x790e3088,
  150780. 0x9aaf6e67, 0x1f277e31, 0x215ad830, 0xcf33871c, 0xe7db4b98,
  150781. 0x4f02f89d, 0x71ff62c9 },
  150782. { 0x2a4a84d9, 0xaa4c7102, 0x5ebc71e6, 0xe2ee4acd, 0xf1cd6578,
  150783. 0x3b11a8a5, 0xfff120a5, 0x83f5ef9f, 0x09e65033, 0xa4c598e1,
  150784. 0xca044180, 0xe1e9f990, 0xf59828c1, 0x8b832d46, 0x33af536b,
  150785. 0x753f28a0, 0xb6d4f68a, 0x92edc4b1, 0x72ccd1f0, 0xedde692a,
  150786. 0xd2226432, 0xd3aa0f7d, 0xa3d2661c, 0x38dbb63e, 0xfdc37dda,
  150787. 0xf1e19fc6, 0x84ef6b4c, 0x6c18b350, 0xdf1bba69, 0xe6a83fe9,
  150788. 0x5f958273, 0x40fd47e7 },
  150789. { 0x267140a4, 0x5b88b746, 0xeab6f2fb, 0x6dbbfc1e, 0x69862548,
  150790. 0xdd9ec88e, 0x2eb6efc2, 0x69beeba1, 0x8ac8ff88, 0xcfc2214a,
  150791. 0xb5a21950, 0x95d5c96e, 0x4171fb69, 0x93389c05, 0x1b468337,
  150792. 0x2d85d452, 0x4113425c, 0x14d68a08, 0xec6c2174, 0xe52c0139,
  150793. 0xf730084d, 0x20cf0b97, 0x1f578aa3, 0x1ac16a26, 0xf9b6ae43,
  150794. 0x18b9fab3, 0xd854a695, 0x68d82111, 0xdffbe286, 0x0b334d98,
  150795. 0xe639338c, 0x5b1c1157 },
  150796. { 0x72b6bb8f, 0x90edaab1, 0x02fc92c2, 0x8dc64ed2, 0xfe694c73,
  150797. 0xf42ba3c5, 0xcb54dce4, 0x316dc65f, 0x632420dc, 0xcb2d66a3,
  150798. 0x056dcf94, 0x16e706e7, 0xa4f32c9d, 0x2809c764, 0xea6edca8,
  150799. 0xab18d830, 0x81c65f57, 0x4fd1ace6, 0x7da12c10, 0x1f91651c,
  150800. 0xc7791a48, 0x0ac3bd66, 0x785e67a3, 0xb6ad1cf4, 0xda0fd591,
  150801. 0xe4d3fc44, 0x6e1c6344, 0xce164801, 0x33e50ab3, 0x84de9cb8,
  150802. 0xa756eef4, 0x963ab83a },
  150803. { 0xdf4ea5a3, 0x944b47d8, 0x5cfe45fe, 0x96568815, 0x8a3c3564,
  150804. 0xd16e7d58, 0xe7c99e15, 0x84e55b3e, 0xf55071bc, 0x3fee204d,
  150805. 0x04057dce, 0x71006f29, 0xbba75570, 0xfe8c390d, 0x3319adac,
  150806. 0x3645bcb6, 0x7c20bfd8, 0x8189e8b0, 0x7d7d9578, 0x8e550969,
  150807. 0xb99f4e3b, 0x037d1321, 0xa60cfb6a, 0x011b2521, 0x837382da,
  150808. 0x66594aaa, 0x83c1dc07, 0xc89b91fd, 0x076b9884, 0x6b82b899,
  150809. 0xbe45c558, 0x443480fc },
  150810. { 0x9114221a, 0xf8ffffb4, 0x3e857a7a, 0x4aec4f2e, 0x0fa54787,
  150811. 0x42e2d0e4, 0xd6f96152, 0xef3e6b31, 0xfbfe9b77, 0xb2296537,
  150812. 0xfb43a86a, 0xc2a9d0f2, 0x24572ac6, 0x241284ed, 0xe721ba7b,
  150813. 0xa3868917, 0xc117a78d, 0xdbef7c00, 0xd31605ac, 0x38149071,
  150814. 0x065a8ee9, 0xc2dada9e, 0xc442be82, 0xd5b138d8, 0xf6d72b58,
  150815. 0x9b6c224b, 0x8eb03e6d, 0xb9d355cf, 0xa1700371, 0xab6d1eb0,
  150816. 0xcffaa7eb, 0x97118a88 },
  150817. { 0xcdecb5d8, 0xbf9c59a2, 0xa93a6866, 0x8083c81b, 0x04774fbf,
  150818. 0x24e0dd81, 0xa02070b4, 0xe779a3ca, 0x0fbfb781, 0x9d352fbb,
  150819. 0x3ef2a1c4, 0xa8b0d820, 0x14b3e501, 0xb858637b, 0x8a882ff2,
  150820. 0x5ba70a49, 0x3b06efa5, 0xa2730083, 0x102fee2a, 0xa42c02f4,
  150821. 0x8a0223a5, 0xe4e76299, 0x85c3fc72, 0xdba2ba26, 0xfe52eae7,
  150822. 0x554fe763, 0x270f45f6, 0x30b5405a, 0xa573387c, 0xd56a177a,
  150823. 0x4b71fa82, 0x17c0778d },
  150824. { 0x2735e37b, 0x0e6dff1d, 0x656ec572, 0xc9884e56, 0x9ebba978,
  150825. 0xa2f5ac9d, 0xba09f3c4, 0x40fa4518, 0xf5b04377, 0x8c3fa177,
  150826. 0x967a2eca, 0xa1a1decd, 0x0528bd40, 0x768bca70, 0x18691c4a,
  150827. 0xf224952b, 0xe86d5fd5, 0x16e12c45, 0x37859a6a, 0x7a0d9157,
  150828. 0xa0ffce0e, 0x723f4309, 0xa96cc9a3, 0x5a8db79b, 0x1ad23a38,
  150829. 0x6dd12ae0, 0xe2bf5d84, 0x9ffec3a1, 0xa452ed66, 0xd6ce84e1,
  150830. 0x571fe4c6, 0x1219d5c8 },
  150831. { 0x262969eb, 0x43eaa67f, 0x2f03e773, 0x3a3ab39d, 0x57bb0909,
  150832. 0xe6127e51, 0x8d150274, 0x0f82b0ed, 0xe580bdbd, 0xffffcad8,
  150833. 0xa9743e6b, 0x51d3d075, 0x8bac11d6, 0x1484bdb1, 0xeb24c388,
  150834. 0x95cd9990, 0x7fac67c6, 0x216a61d0, 0xa04e6b87, 0x4308f762,
  150835. 0xcba57cc8, 0x2865dd61, 0xd234a07a, 0x3c296b0d, 0x3a0793f9,
  150836. 0x76f92839, 0x0be29ece, 0x70b57e1f, 0x7e626f42, 0x1314a82f,
  150837. 0xd657f230, 0x2c8d7ab2 },
  150838. { 0x0825e4d6, 0x67cf5892, 0x6ef83b44, 0xdf51eaa5, 0x1310108d,
  150839. 0x63e665d8, 0x8dd0963f, 0x229f89f5, 0x9df6436a, 0x8c4b14dd,
  150840. 0xd45ebba7, 0x99dae469, 0x5a4df381, 0x118aab77, 0x29e37feb,
  150841. 0xda8978bd, 0xaca2d7ef, 0x69ced5aa, 0xc67d6a8a, 0x6c98d05d,
  150842. 0x77f84a34, 0x7474bf0d, 0xed8cd59a, 0xd4428b2e, 0xd1d398fb,
  150843. 0xb0fd1cd5, 0x94a20b11, 0x596013db, 0x1b404c44, 0x96eb705a,
  150844. 0x4b09d958, 0x2299d277 },
  150845. { 0xc64397e6, 0x5b9cd58d, 0xbf6dd31e, 0xac198f1e, 0x3e9f1db2,
  150846. 0x5866d8e1, 0x8fcdc68c, 0x405ae287, 0xe53c01fd, 0xa4b280cd,
  150847. 0x411db5f6, 0xdc963f2d, 0xbec4f8a0, 0xed5d5189, 0x916ee98b,
  150848. 0x336fd13d, 0x042df48e, 0x6925b1b3, 0xace0074e, 0x0cf56291,
  150849. 0x25317e95, 0xe8d38b48, 0x821c446b, 0xc7ad1d2b, 0xf0b65934,
  150850. 0x71c44135, 0x52ca0d50, 0x971b736f, 0x27b46c26, 0xaf9ffa57,
  150851. 0x1936618e, 0x21ac6779 },
  150852. { 0x2d7fbcd2, 0xab420e3f, 0x97bdfc18, 0x12722473, 0x4df5d4b4,
  150853. 0x492033f8, 0x3807b7d3, 0x6fcd4236, 0xb33c3625, 0xdfc19b09,
  150854. 0xa0f22814, 0x13d6f375, 0x037c19b8, 0x70978a59, 0x0ff27b9c,
  150855. 0x4f398997, 0x615a4389, 0xfc0e1a45, 0x3e602f74, 0xffa3496a,
  150856. 0xb261ca1c, 0xc3f1c431, 0xee0164cd, 0x612211db, 0xe7f7be9f,
  150857. 0x30463ee4, 0x92c2e1bb, 0x015f7e78, 0x24483a56, 0x663d88d6,
  150858. 0x0e62d9d8, 0x0e8ec1e7 },
  150859. { 0x8a0878dd, 0xa88ccc29, 0x6640071a, 0x99ac175d, 0xa5173617,
  150860. 0x90344820, 0xdd58a315, 0x316d023e, 0x88d221a1, 0x30785bd4,
  150861. 0x959c48e3, 0xb74b3de7, 0x4c67a771, 0x42ee0382, 0xe0b91453,
  150862. 0x59ef6cdd, 0x9b237e91, 0x7830ae28, 0x495d8325, 0xe1847a4c,
  150863. 0xd0773666, 0x67b1217e, 0xa294a325, 0x58192c86, 0x864d8326,
  150864. 0x76aa0f56, 0xf4b13e5b, 0xe2a2bd12, 0x1b6b73fd, 0xd850c1c0,
  150865. 0x5d103635, 0x653a795f },
  150866. { 0x50dcb199, 0xcfe28985, 0x7fa02b60, 0xb35b8e5e, 0xc97603d0,
  150867. 0xbca7d7c3, 0x27f131b5, 0xb0e5288d, 0xe2b12d52, 0x3aa704de,
  150868. 0x1db725c7, 0xe206b1d8, 0xc5d1b113, 0x0b12839a, 0xdb45d763,
  150869. 0x14f970cb, 0xb2125e8e, 0xc997f93e, 0xee7daa26, 0xbd75739c,
  150870. 0x1fef20e9, 0x46ecbd3f, 0x7c6a42b1, 0xf994a114, 0x27fb0fd1,
  150871. 0xd289eb4f, 0x9a40da4b, 0x11186d31, 0xfb9d7976, 0x083f65a5,
  150872. 0xd444675e, 0x30dfc47b },
  150873. { 0x9eaadfe8, 0xbcfc5ae2, 0xb4d4e812, 0x25027e54, 0x8b533561,
  150874. 0xab0702df, 0x56a6a214, 0xa2b9c204, 0x3059068e, 0xb1a3df7a,
  150875. 0x9883110f, 0xa3514b21, 0xc4b78e1c, 0xb7be2336, 0x3e2f6984,
  150876. 0x17073ce6, 0x2ddf7ac6, 0x86e114a6, 0x07d7c3c8, 0x276192bf,
  150877. 0xeb1ae289, 0x5da69e0b, 0x25184939, 0x983af175, 0x407a3aa0,
  150878. 0x9ac52a4d, 0xae0fe218, 0x1535c7da, 0x397f2501, 0xe16fe872,
  150879. 0x54c212cf, 0x572a591f },
  150880. { 0x09a5553a, 0x49668419, 0x327733bc, 0x3f054318, 0x3eefd690,
  150881. 0xf9ceb4b2, 0xf22126d4, 0xbd3cbf9b, 0x2fed9578, 0x6d9671c0,
  150882. 0xca0306d8, 0xbba597ce, 0x3d674fe5, 0xb705ed61, 0x67f33f76,
  150883. 0xf1d3622b, 0x11cb8c31, 0x15bcf3c6, 0xe53d1aa9, 0xa38467dc,
  150884. 0xf908ab43, 0x902fe929, 0x8d15767a, 0x6e3e499d, 0x90afd07b,
  150885. 0x8142db5c, 0x6c8b190e, 0x120c6fbc, 0x24919a4e, 0x80c86553,
  150886. 0xd8c82c3c, 0x65c2cbe1 },
  150887. { 0xa660bb63, 0x684cda20, 0x86e86245, 0x27dc3b0a, 0x6ba0eed7,
  150888. 0x76472cf6, 0x679dd158, 0x79c162e5, 0x08452d44, 0xb6884277,
  150889. 0x413f579e, 0x829bc6b3, 0x95011770, 0x92ea15ec, 0x47738183,
  150890. 0x5e34e300, 0x73e1d2f1, 0x8c3ca349, 0x229bd3de, 0xa5c4f1dc,
  150891. 0x94ef7ed3, 0x783eff1b, 0xdfae7a1a, 0x46db738d, 0x1a099852,
  150892. 0x4353d72e, 0xa0dcf4ab, 0x2533ad58, 0x0e7888b9, 0xd8055016,
  150893. 0x3ba77f66, 0x831440d5 },
  150894. { 0xf611b2da, 0xf43e2e32, 0xd0fa46ac, 0x5d066e29, 0x820b3c0d,
  150895. 0xe897f3e8, 0x1d3e44f0, 0xc45c28e6, 0xdfd27a66, 0x929d7f66,
  150896. 0x101e8517, 0x735b860a, 0x3de078dd, 0xea3fce98, 0x638ce11a,
  150897. 0xc9977db5, 0x48536b3b, 0x0488382f, 0x64cadfc6, 0x7e0c7a3c,
  150898. 0x82147b71, 0x3cd17f7f, 0x1b411e3e, 0xe95663cc, 0x985fb46d,
  150899. 0x5739ac8f, 0xbcf119ca, 0x385399cd, 0xe15a2815, 0x4a985a70,
  150900. 0x6d5f4566, 0x504c3a8a },
  150901. { 0xb8fa53c7, 0x00b55283, 0x509474e3, 0x985cff38, 0x437ce25f,
  150902. 0x234d241c, 0xe5a129ed, 0x29832430, 0xaabcc674, 0x6ad38956,
  150903. 0x7ee81ee1, 0xa2dc001d, 0x670b2702, 0x4c23c6b6, 0xa6e8a3bb,
  150904. 0xb35e567e, 0xa69673ea, 0xbc70b3ce, 0xe6e28eac, 0x85a7a9c3,
  150905. 0x5537b7da, 0x2ae684de, 0x6de937dc, 0x5ecac3e5, 0xf8430422,
  150906. 0xbf2ea6c9, 0x77fdc520, 0x38caf7d0, 0x69f56add, 0xc27af0b1,
  150907. 0xc71d21d2, 0x496e4699 },
  150908. { 0x9fa93467, 0xba14fc82, 0x0eb2a614, 0xc2e37684, 0x4833e09b,
  150909. 0x659bcfaf, 0x3686bdcc, 0xbc859752, 0x81f3216a, 0x40bfd080,
  150910. 0x17c081b8, 0xc463bda6, 0xbb04793b, 0xbd01fa86, 0x2cd640c5,
  150911. 0x5a21ece6, 0x2203d5c4, 0x97bf6a54, 0x951167b7, 0xceb40edc,
  150912. 0x765ba268, 0xd67aacaf, 0xaeab51f9, 0x8ba0d9e9, 0xb0d6863a,
  150913. 0xc14b215e, 0xe5f06952, 0x354cdcdb, 0xcb3744b5, 0x4f2b5ccf,
  150914. 0x13037fe8, 0x13389173 },
  150915. { 0x45003cd1, 0xee680640, 0x44ae2ac6, 0xfdac17bc, 0xde8e5314,
  150916. 0x4bcd419f, 0xc7cea95c, 0x81e34eb9, 0x38f37e01, 0xbb57762d,
  150917. 0x260990c8, 0xecc4cfb0, 0x50a34a7b, 0x0bc493f9, 0x543304ef,
  150918. 0x68074172, 0x6bc8aa2a, 0xaec0fcb2, 0x3b45fea5, 0x9e7a9b46,
  150919. 0x55fbdbac, 0x4bb2952e, 0x0485dff4, 0x50f0c0a6, 0x4dea4796,
  150920. 0x02c5104d, 0x695e3a02, 0xd2cefa09, 0x6da1f345, 0x4c8102b4,
  150921. 0xf3833fbd, 0x422eb573 },
  150922. { 0xa6ad3f47, 0xac592eb6, 0x9714ba0e, 0xb0861f6d, 0x07281459,
  150923. 0x57c1e919, 0x64ea5803, 0xcf7c94e2, 0x54b12723, 0x725376ac,
  150924. 0xdafb736a, 0xf2a6ba41, 0xcba03cdc, 0xc89e8920, 0x5b0fd3ad,
  150925. 0xf2e20cb4, 0xd66059fe, 0x26ea5a54, 0x889df8bc, 0xee63fa8b,
  150926. 0x66a3f2bf, 0x40f1c7e1, 0x747312e1, 0x09febc9c, 0x727999ff,
  150927. 0x7d19b9c2, 0xb7fd2b05, 0xa9fbbb4c, 0xa0da2dc6, 0xcfba27d7,
  150928. 0x2c252582, 0x368541cf },
  150929. { 0x22799d37, 0x510d3c9e, 0xacfa333a, 0x1b677de5, 0x080f795b,
  150930. 0x4e6ae18f, 0xafc8dfc2, 0x69b53c2a, 0x0e842dc2, 0x797541b6,
  150931. 0xac067fe8, 0xd5a6f2af, 0xbd07d877, 0xd0208a03, 0x654be2f2,
  150932. 0x34b473f0, 0xf515e23e, 0xe67c102a, 0x2ac1af48, 0xb00dbf9d,
  150933. 0xb6a13d00, 0xe264fa41, 0x97e94c11, 0x1669786a, 0x86a586f4,
  150934. 0x09d8cf2d, 0xc7f927e9, 0x073bf869, 0x2241a566, 0xb8977880,
  150935. 0x22261334, 0x59a5bf59 },
  150936. { 0x81347191, 0xe9d1c91e, 0xeb969972, 0x186c1abc, 0xa9d46a7f,
  150937. 0x07888767, 0xdaa7d397, 0xda93cfcc, 0xd91b9aa0, 0x08bee9f1,
  150938. 0xf8dd3c6c, 0x8267fd78, 0x94228100, 0xf93860d0, 0xdadb47fb,
  150939. 0x6a6a71aa, 0xa6156f8a, 0x9caa06b7, 0x39848bc9, 0xaa1b05e0,
  150940. 0x2aaa9135, 0x36ddc237, 0xb13f3bd1, 0x77e7e079, 0x4acc5f4d,
  150941. 0x8d0b5cbe, 0x984cfd36, 0x04da45f8, 0xd3d3e0f8, 0xf14ef618,
  150942. 0x43eb799c, 0x467564c1 },
  150943. { 0xb6fff5d7, 0x8d725904, 0x92dc4752, 0x037f33af, 0x6d20b8aa,
  150944. 0x9095d575, 0x43baec39, 0x32235fc1, 0x68a2b9b0, 0xa2feb4af,
  150945. 0x94d35c61, 0x61c50318, 0xea877486, 0xac92b6a2, 0x011bc6f3,
  150946. 0x8eb48b15, 0xc79edcb2, 0xa28fe128, 0xa5d2a006, 0x9f71bc0c,
  150947. 0x2f15b850, 0xf3167732, 0x7a036218, 0xfe8d728c, 0x4f81e09e,
  150948. 0x068f39cb, 0x7b7c50d9, 0x1773f016, 0xed6a1e03, 0x0d0f7adb,
  150949. 0x4ee984d5, 0x8a0dee16 },
  150950. { 0x47366e6f, 0x504991bf, 0xe86c3005, 0xb8084d9f, 0xa40cce36,
  150951. 0x14c4c751, 0x3f1961e2, 0xbbb46aa6, 0x40445e43, 0x56a785f9,
  150952. 0xc91e215f, 0xdb8d1b57, 0xc7ee808d, 0x6a8e453e, 0xbbaa1e8c,
  150953. 0xc0367ef8, 0xe3e18109, 0x310d91f1, 0x7e20a2c3, 0xf97cfd0e,
  150954. 0x554cc277, 0xf1e80c84, 0x7b628403, 0xe89bbc1d, 0x3fe0a17c,
  150955. 0x7778a966, 0xc1f00073, 0x9e9db19f, 0xb6f6bed2, 0x2ce7fe7d,
  150956. 0xee97ce23, 0x7b04b5d2 },
  150957. { 0x82c5faf8, 0x5b546bc7, 0x8eb81097, 0x1a734c5e, 0xe77851e0,
  150958. 0x3d566861, 0xe956d51f, 0x833a1013, 0xc3c3c37c, 0xc7351731,
  150959. 0xe0c148ec, 0x607738fb, 0xe1bbef41, 0x2ec6f0bb, 0xcfa51857,
  150960. 0x0aa2ac6e, 0x66e3adf0, 0x072902d7, 0xc622d6e3, 0xcd4d5089,
  150961. 0xa6dd802f, 0x3ae21b23, 0x33886372, 0xe5465a55, 0xa8d81822,
  150962. 0xd85119a0, 0x3786977a, 0x4f14d032, 0x9c7b272c, 0x515b081c,
  150963. 0xc99be31c, 0x1c6a95a4 },
  150964. { 0xc2821363, 0xa6b14ad5, 0x4d17de1c, 0x829c1823, 0xccade848,
  150965. 0xaef5d2c4, 0x82489e27, 0xf412ab39, 0xf081d927, 0x92c9c098,
  150966. 0x75cbad1f, 0x6f87bdf4, 0x1a1d9fb1, 0xf4aadab8, 0xb75f3b76,
  150967. 0x475a7923, 0xdbbba8fe, 0x99dd0ad6, 0x4b70ab45, 0x836f6164,
  150968. 0x34bd9af1, 0x2a464881, 0xba9abda3, 0x5c91226e, 0xe65625fb,
  150969. 0x4cec8709, 0x0818e4be, 0xd4b3919e, 0x14f6879c, 0xa5c09c84,
  150970. 0x30a864c9, 0x72708a02 },
  150971. { 0xf34a466c, 0x4f33c0b1, 0x7f9d45ba, 0xa1bae09c, 0x0e28785c,
  150972. 0xd70f0fee, 0x90880881, 0x824c7146, 0xbb043da3, 0xe2416c2a,
  150973. 0xcec6f432, 0x733da713, 0xc9793e1c, 0x2b590649, 0xb35c9365,
  150974. 0xdb62d5b0, 0x3e5c1b2a, 0x355eb6e2, 0xbb16b515, 0xcfe8b5ce,
  150975. 0xf709691c, 0x9e081869, 0x61a85bd5, 0xc865f9fb, 0xfae103f7,
  150976. 0xf169d3cc, 0x73467e9d, 0x9525c473, 0x43695113, 0x7db55c0b,
  150977. 0x73265d21, 0x7491c74c },
  150978. { 0x80d2b94d, 0x312ed5bf, 0xba4b260b, 0x1b8ac633, 0xd62219a1,
  150979. 0xac86c58c, 0xaeb82c8e, 0x317ccf6b, 0x59ef9ced, 0x2dfb29ee,
  150980. 0xe42bcd5a, 0xdaa7d898, 0x5974b201, 0x93e295c8, 0xd9fc5adc,
  150981. 0x69e75784, 0x012aa3ba, 0xd6c4709f, 0xc85d3cb9, 0x1fda9f37,
  150982. 0xd3dd4abd, 0xe5487e25, 0x0b3ba22e, 0x00fd4b01, 0xc6e8dcbb,
  150983. 0xcb591493, 0xbce68664, 0xb7329fab, 0x68906b76, 0x6829d1c2,
  150984. 0x74176841, 0x8bcfd3e5 },
  150985. { 0xd3c8c314, 0x06882734, 0x11870833, 0x95f0b2f1, 0xc068ba16,
  150986. 0xb937f7c3, 0x77924787, 0x5365e0d8, 0x1f992227, 0x15527e5e,
  150987. 0x27dffd4f, 0x0a069648, 0x2f586389, 0xd58b3df2, 0x6af20ead,
  150988. 0x83446b89, 0x50746257, 0x09d7970b, 0x4022a691, 0xd9e8d206,
  150989. 0x671ec379, 0xd1e5f8af, 0x057fe91e, 0x6f542509, 0x52890418,
  150990. 0xf14dda81, 0x1db932ad, 0xbd78010e, 0x905a9378, 0x3e18d1e4,
  150991. 0xbd37ab49, 0x53cadcf7 },
  150992. { 0x5e53d0ff, 0x1bb5edf7, 0x888abf67, 0xd886606c, 0x12206d15,
  150993. 0x6491b0f8, 0xe22b6a33, 0xb3018345, 0xb173b317, 0xaba6794b,
  150994. 0x7dc9e595, 0x8c1e5867, 0x239624d1, 0x4e106482, 0xda55dd53,
  150995. 0x61752e59, 0x9e42879c, 0x018b4eab, 0x491f2bed, 0xcaf6784b,
  150996. 0x1e79429e, 0x3dcdb9d2, 0x10f26224, 0x36941485, 0xa650ec5c,
  150997. 0x106f190a, 0xb69a9760, 0x7542a5ae, 0xc32d1046, 0x69bd75e9,
  150998. 0xbf8c62b1, 0x90849964 },
  150999. { 0x5a93c661, 0xb1390cf6, 0x9db5f056, 0x18486264, 0xa51a1788,
  151000. 0x92a93a9d, 0x6772de9a, 0x1b0cbb8f, 0x7c71487c, 0x6e67febd,
  151001. 0x4e62423e, 0xf9b4382d, 0xbb5a42f8, 0x96fda50e, 0x6089a4f2,
  151002. 0xc921b337, 0x875ec516, 0x49d32d7b, 0xc410124b, 0xbd86d2ca,
  151003. 0xc421fb7a, 0xf6862209, 0xf6b7de33, 0x3e1949ab, 0xe93c9268,
  151004. 0xcdee18f0, 0x08dc4cc0, 0xd4edbd5e, 0x73580d22, 0xc2b75be4,
  151005. 0x468cd7e8, 0x3d7f6ffa },
  151006. { 0xdffbd5d1, 0xea7b290c, 0x970338df, 0x9d759da6, 0x90feedc9,
  151007. 0x56680b08, 0x42dce68e, 0xbc690af5, 0xb2ae4d82, 0x8519df2b,
  151008. 0x7f195b60, 0x5612467f, 0xd83c21f4, 0x659a342c, 0x55651633,
  151009. 0x55771bf5, 0x548ba562, 0x5fc68935, 0x9492f23a, 0xb5419203,
  151010. 0x9c9c6017, 0x567528e3, 0x511e6019, 0x3f064ed4, 0x1d16a555,
  151011. 0x303f9eb9, 0x2254abee, 0x3e18c4fd, 0xfd434e7c, 0x40994d6f,
  151012. 0x6dde74e6, 0x8fb12d3f },
  151013. { 0x293cb7a4, 0x6c6381a2, 0xb87b7e4d, 0x453e09f0, 0x078ac3ef,
  151014. 0x4f212823, 0x578cae91, 0xe89ffad0, 0x716ba4dd, 0x4a2b696a,
  151015. 0xf6f580a0, 0x14681a14, 0x4c2f1307, 0x1358f97b, 0x2932fb89,
  151016. 0x87896996, 0x268a5af7, 0x29dd850a, 0xfe239f83, 0xaf771f6d,
  151017. 0x4f47499d, 0x5f20fd2e, 0x867ca0e9, 0x9b643e77, 0x375981ec,
  151018. 0xe7858ecd, 0x19ab1c97, 0xbe946a59, 0x06ff3453, 0x4f9303a2,
  151019. 0x75d237b1, 0x3fcc6731 },
  151020. { 0xdf21f920, 0x509debd5, 0xc1401b90, 0xfaf70e1f, 0x95a64aaf,
  151021. 0x2429cbfd, 0x2c37a122, 0xf2120855, 0x7deb926b, 0x1d4c93f4,
  151022. 0x9fb3f1dc, 0x12f3e4c0, 0x5b51bc46, 0x56085a59, 0xf10fdbd2,
  151023. 0x2a2f5d62, 0xdf0cb3c2, 0x60dd62cf, 0x6b0f254b, 0x154424a3,
  151024. 0x564612b7, 0xc3a5a05d, 0xa1f5249c, 0xbebe30cf, 0x7e62a188,
  151025. 0x24ec6903, 0xaf429939, 0x75f0fbac, 0xb3fa8685, 0xd41345dc,
  151026. 0xc7151c34, 0x645146fd },
  151027. { 0xba1924f9, 0xecec633a, 0x006326e1, 0xbba6f136, 0x7e50fc17,
  151028. 0x203757ac, 0xef3d8e00, 0xca531919, 0x51dc5a74, 0x9545a6aa,
  151029. 0xd31412b8, 0x6e21d58f, 0x7bb1d000, 0x01bc3005, 0x6ed1a9c3,
  151030. 0xf1789c69, 0x9858fa48, 0x7af2d35f, 0x8197be85, 0x434d09b9,
  151031. 0x29aa265d, 0x1dc07755, 0xc058fa80, 0xcad03be7, 0x54ba14ce,
  151032. 0x92d70a9f, 0x6c050a74, 0x6dc78505, 0x4d005dda, 0x2a7ca4a9,
  151033. 0xabfb9f2e, 0x448d3d72 },
  151034. { 0x29b33989, 0xdc56f145, 0xa9ae815a, 0x868351bc, 0x4b074414,
  151035. 0xb3f45613, 0x3cd9f33b, 0x955ce42a, 0x5ff6e4a3, 0x13ade4ec,
  151036. 0xa50eaa91, 0xd3aac715, 0x5666efdf, 0x0c61ec99, 0xf6a4470a,
  151037. 0x108a28b8, 0xe54844c9, 0x402ef584, 0xd0e2f337, 0xb825b162,
  151038. 0xb46f7cbc, 0x3dcd131f, 0x96f2fd89, 0x208178ec, 0x25928c78,
  151039. 0x4d8c5d67, 0x9963c459, 0x285a33df, 0xd92a309f, 0x72497175,
  151040. 0xcb7019a5, 0x76881479 },
  151041. { 0x91767eed, 0xba43a114, 0x92bf65db, 0x5e11b9ad, 0x03a5e21a,
  151042. 0xe8a22ce0, 0x2a335415, 0x63604421, 0x4a9ead62, 0xc2c563b4,
  151043. 0xa0b2aee5, 0x4bc06264, 0x8bf2e1d7, 0x75b8d575, 0xd08a265d,
  151044. 0x1cff0ee7, 0xb0b712a7, 0x17914e1d, 0x4b18692d, 0xc35925d0,
  151045. 0x56cce815, 0xde253f4c, 0x9fff0e3a, 0xa479241c, 0xddabed19,
  151046. 0x50b9d06e, 0x59fae506, 0x67135260, 0x532ce180, 0xf37600fb,
  151047. 0x5e5a8626, 0x670eb01c },
  151048. { 0x73cdbb43, 0xdf73c0af, 0x7f2431ad, 0xcf08ecc5, 0x2a1a3845,
  151049. 0x91780541, 0x9224ddf1, 0x69a104f2, 0xbeac7eff, 0x4352f38d,
  151050. 0x7c2d1322, 0xfc3b3b4e, 0xb5e4b476, 0xa69e9430, 0x975a46f0,
  151051. 0x7d932340, 0x5d64eece, 0x8093899e, 0xdb2345e9, 0x7b821250,
  151052. 0x7f4b796b, 0x23552932, 0x4bb90b1f, 0x2ee9cc15, 0x9112f7d6,
  151053. 0x1fa9c8f5, 0x1cbaae32, 0x2d0f2f98, 0x0075166a, 0xb77f0366,
  151054. 0x635dff27, 0x504852e7 },
  151055. { 0xa2f392fa, 0x2f0f3ce5, 0xec6c9078, 0x326c076a, 0x84baaaf6,
  151056. 0xad01de92, 0xcbe8e993, 0xb01b16d3, 0x2d950908, 0x71305c24,
  151057. 0x3853af38, 0xc66fd617, 0xd3c429a0, 0x7735140e, 0x1fabf027,
  151058. 0x8a31b12a, 0x058b3177, 0xa0530002, 0xa9c7deb9, 0xabffd9fc,
  151059. 0xe8667d30, 0xd05ef69b, 0xe9a9e13f, 0x2f3a7308, 0xb91eae9c,
  151060. 0x3f4c9a19, 0x618ce6c4, 0x50d0cee7, 0x5240f8b0, 0xfb24dc40,
  151061. 0xf7e90cc4, 0x992fe151 },
  151062. { 0x38f197aa, 0x4454db31, 0x87872f98, 0xa4ded69d, 0x44f0a828,
  151063. 0x97b427b0, 0xa31e48c6, 0x9821e1ae, 0xdd98efec, 0xe38cb09f,
  151064. 0x480cb3ae, 0x20b84fa8, 0x47475573, 0xba5bb4a8, 0xcd50e96b,
  151065. 0xa9be080a, 0xef103550, 0xc4451e9c, 0xc441325c, 0x626ee75f,
  151066. 0x38a5e33d, 0x6eea5e98, 0xa2b0abd2, 0x7321beb9, 0x9b6082a9,
  151067. 0xca92e484, 0x992bcc2a, 0x1dc8168a, 0x9c8eb9fb, 0x134ecf4b,
  151068. 0x4c5b71e0, 0x5a68bfa8 },
  151069. { 0xff0a2bfb, 0xb4ff3b45, 0x5502f8b0, 0xd105fff9, 0x5b1c0c26,
  151070. 0x14de5885, 0x0d3b9d04, 0xed16865b, 0x026d3917, 0x2f5a2453,
  151071. 0xf4db3c0e, 0x6a22f493, 0xe2418f2e, 0x4871548a, 0x509bef61,
  151072. 0x6ab363a8, 0xb8cbbbec, 0x91ca1e3a, 0x4011a396, 0x71e0dc98,
  151073. 0x0d5ca577, 0xff982e0a, 0x81897bc1, 0xeb40b045, 0x085ad5e7,
  151074. 0x4bc24a46, 0xa6337b7c, 0xd15c8fa0, 0xbef1628f, 0x56ce6ef7,
  151075. 0x9f5ef439, 0x78acfdf9 },
  151076. { 0xf8520189, 0x45bf7f15, 0xc77f61c4, 0x954202a0, 0xdfa22e1b,
  151077. 0x39edc6b9, 0x1f4a3487, 0xd2d60267, 0x4814cc52, 0xcd933929,
  151078. 0x05e9f123, 0xde76a124, 0xae36b6f7, 0xe2306ea0, 0xb83a58e0,
  151079. 0x53815218, 0xa041231a, 0x9862bb76, 0xbf31be71, 0xe8da253c,
  151080. 0x37de861f, 0x2dfc5332, 0x90ae4890, 0xf25c93f6, 0x8baa6ed2,
  151081. 0x66bcb8f0, 0x908b4a29, 0x6f10ae0f, 0xb061c949, 0x8cb4b48c,
  151082. 0xd075a366, 0x0ad92d73 },
  151083. { 0xc2ca548a, 0xbfb95fed, 0x80cd89ab, 0x4778c620, 0x3466c280,
  151084. 0xbe99154b, 0xd4be8902, 0xea3be093, 0x13e681ed, 0x847b7995,
  151085. 0x02f40161, 0xf22a8f4b, 0x4aeb7fe8, 0x3ef2cb4d, 0xb3aed5f6,
  151086. 0x9adc5151, 0x98c31163, 0xec1ccfd1, 0xa3d7d88f, 0xdc2ac17b,
  151087. 0x46421097, 0x08fa64d3, 0x94b90bcf, 0x5ebf80b7, 0x0b50a9eb,
  151088. 0x1b78b4ba, 0x279aa66b, 0x1a4fe934, 0x075b3ced, 0x8ef4dcaf,
  151089. 0x70a6e9ae, 0x95bbd8a0 },
  151090. { 0xe614bbd0, 0x59f92495, 0xb823e363, 0x7567a887, 0xfc1bd6a7,
  151091. 0xe247c9ec, 0x8e835c42, 0x2bfaaf47, 0xaade066a, 0x314ef4e0,
  151092. 0x5c16d336, 0x072baa63, 0xe2f0e389, 0xfa429c71, 0xbd07d90f,
  151093. 0xcac1e5d0, 0x514f5c04, 0x69ff35ea, 0xc0554ec1, 0x893053fc,
  151094. 0x2a35947f, 0xab1d86b7, 0x2aebe487, 0xe29fb060, 0xdfb9cf21,
  151095. 0xa0a10d6d, 0xf20dfcf5, 0xad147059, 0xb8867a2a, 0x480dc66f,
  151096. 0xc125a919, 0x375a884f },
  151097. { 0x1217f7ea, 0x178cbe2e, 0x875c6dab, 0x1a161e2a, 0x1bdb1a54,
  151098. 0xf7707ec0, 0xe4fd73ca, 0x678864a0, 0xd13a0d86, 0xbaebc664,
  151099. 0xc8d30668, 0x40325f99, 0x2f1c5950, 0xb93ed9c9, 0x541e0667,
  151100. 0xfdf36763, 0xb91a6763, 0xfd97fbb0, 0x6079c9a0, 0x26aa69ea,
  151101. 0x1eaa8c47, 0xc7303c80, 0xafa63c55, 0xdec75c81, 0x4fd12adb,
  151102. 0x01cdcde2, 0x1968838a, 0x9fe0dda7, 0x38415379, 0x66bb093b,
  151103. 0x08cb84ec, 0x268d818b },
  151104. { 0x41580555, 0x73dae358, 0x473d103b, 0x4fc32e67, 0xbeccc1ab,
  151105. 0x240c1013, 0xb24ee9de, 0xda4099f2, 0x9fa8e066, 0x37b0cb5b,
  151106. 0x6438d7ee, 0xb5ae04e4, 0x2b720140, 0x7f7d3164, 0x339e4a78,
  151107. 0x86ef4edb, 0x3a7d8375, 0xa5e77eed, 0xbd707c2e, 0x883fad37,
  151108. 0x0f979189, 0x816b633a, 0x2e7a208e, 0xe24c028a, 0x4435516a,
  151109. 0x1171fe3c, 0x4f5f2bf5, 0x3eb93b33, 0x01b53a56, 0x8419ed4b,
  151110. 0x056ca44b, 0x8b02735c },
  151111. { 0xe1019195, 0xb89bb464, 0xf3fc28c1, 0x1de4c026, 0x2bfc3b21,
  151112. 0xac120e6e, 0x91bdf92f, 0xec71bc5a, 0x0d995bc9, 0x485d7ab4,
  151113. 0xe6491ffe, 0x97c6768e, 0xafbce265, 0xd9552d19, 0x8e1b76c2,
  151114. 0xbae6c7fe, 0xd7e3ad1b, 0x167d8281, 0x5e989734, 0x3e149af9,
  151115. 0x8a0c8182, 0xd1f0024c, 0xc3006c0d, 0xf571ffdb, 0x58773d4c,
  151116. 0xb32ecf7e, 0xfd3540d8, 0x5822a782, 0x04365042, 0x5ab45c3f,
  151117. 0x4b4d85fe, 0x400e3aa0 },
  151118. { 0x5e46e4a2, 0x47321649, 0x24136074, 0x37a2ed64, 0xc60ec77d,
  151119. 0x659223b1, 0xe5e0ac2e, 0x5e13aac3, 0xc5107ab7, 0xda17c41b,
  151120. 0x73c253db, 0x65b22ec9, 0xa5012296, 0xff3867b8, 0x0621a99b,
  151121. 0xfed660d5, 0xc89fc3f5, 0xa3c28506, 0xf16451a7, 0x3ed350b9,
  151122. 0x67cb586f, 0x27c3e032, 0x967185b1, 0xc807c779, 0x4a13009b,
  151123. 0x09c157d4, 0xadaf1f4d, 0x362f7647, 0xf3a6a198, 0x4a42b9ac,
  151124. 0x8da6e039, 0x131c3da2 },
  151125. { 0xa7da83ba, 0x4a785ff1, 0xd04f4436, 0xf415b425, 0xec03f812,
  151126. 0x7c0899bd, 0x80f5f4a2, 0xc58d411a, 0xfda251b9, 0x3d32d610,
  151127. 0xcd3b2f32, 0x99bb4504, 0xf4c2083c, 0x198c444b, 0x730e83fd,
  151128. 0x60c261af, 0xcb02db90, 0x060ca4df, 0x9df1e7c8, 0x0ff7838b,
  151129. 0xc4c690c9, 0x6b79cf97, 0x5d75f154, 0x131514d7, 0x1cb0e8ff,
  151130. 0xa7c074f1, 0xb2c17615, 0xb920aac1, 0x44aa0ff0, 0xde8098ad,
  151131. 0x34545ce9, 0x71d1a46a },
  151132. { 0xfa1b382e, 0x76178f76, 0x772dda0d, 0xa0d8ecc3, 0xc5d4d130,
  151133. 0xaa5aab2a, 0x8d72622c, 0x27d38ba4, 0xca3bed06, 0xc5410db6,
  151134. 0x793ceccf, 0xf637a588, 0x6e65e3d7, 0x1f65dafd, 0x60a45641,
  151135. 0xc3b44a85, 0x4f78540b, 0x0f47b3a8, 0x5e4d60f6, 0x824fdadd,
  151136. 0x17d3b6d5, 0xd8ccf90c, 0x325fc13a, 0x008eabdf, 0x3648fab9,
  151137. 0x3e90d716, 0x24c52d4b, 0x3964ff3a, 0x533d0acb, 0xb95cc416,
  151138. 0x1167f521, 0x6cd2699f },
  151139. { 0x12f4f3ac, 0x2d8c0b3b, 0x99d1bdfb, 0xb03dcfe2, 0x30f37326,
  151140. 0x540034f8, 0x7c5a8c82, 0x22dd6893, 0xcd8f1442, 0xeb7093d0,
  151141. 0x585742f2, 0x892795a7, 0x087adadd, 0xe15f282c, 0x16ab7b5e,
  151142. 0x7bbdc749, 0xa58acbb4, 0xd30fe40b, 0xe2bac39b, 0x0de417eb,
  151143. 0xc61a04bc, 0x4b4b19a6, 0xf2735569, 0x9338c34d, 0x30ab196f,
  151144. 0xe8f03742, 0x6c88c965, 0xfa2efcb8, 0xc7eeb826, 0x19eee274,
  151145. 0xda345dc2, 0x327c063f },
  151146. { 0x5b47cd53, 0xab399eff, 0x1943aefe, 0xbbe9869d, 0x1402a866,
  151147. 0xe64ecc7b, 0xb1c25a16, 0xc3e7c2aa, 0x022de271, 0xc4216b79,
  151148. 0x366d6a5f, 0xe58dfcc8, 0xda813336, 0xd159509e, 0x130bfb7c,
  151149. 0x370400f2, 0x93b48780, 0x1be4e059, 0x39f3cd22, 0x0623a1fe,
  151150. 0xeecb4f87, 0x72aa22b2, 0x6c27b83b, 0x1af4c496, 0xda5fa5bf,
  151151. 0x7a42a94b, 0x48b01af2, 0x9afba822, 0x3670112c, 0xeb6b9d2a,
  151152. 0xc0df6856, 0x020f19d1 },
  151153. { 0xa4dbba20, 0x37051a86, 0xdb1de5c5, 0xb618ebc6, 0xe6525840,
  151154. 0x9a780a19, 0xd2bccc4d, 0x9440302d, 0x10285a24, 0xe9ff023d,
  151155. 0x3a486268, 0x3b937ee3, 0x4cd61147, 0xe37ee2f2, 0xa3d057cf,
  151156. 0x79fbbfd3, 0xccddefce, 0x5fba16d3, 0x5b231727, 0x916058ec,
  151157. 0x720c3adb, 0x47699ebe, 0x8b4f6bba, 0x26274386, 0xf18a0770,
  151158. 0x54b0092a, 0xacca1160, 0x99d090eb, 0x0c888f60, 0xf757e1ff,
  151159. 0xb0050544, 0x79e72720 },
  151160. { 0x2820a239, 0x632acf25, 0xaae6b310, 0xb1a3974e, 0x48c0a1df,
  151161. 0xd61fd6ba, 0x5a3ee7aa, 0xd2453c39, 0xb980446d, 0x548455a0,
  151162. 0xde16676f, 0x9f29d97b, 0x789375a1, 0xf252ca0c, 0x7743a985,
  151163. 0xe961af3e, 0x66cdbd8d, 0x70c79c56, 0xcbc538f9, 0x14a3854e,
  151164. 0xa126851c, 0x58daa73a, 0x2a9f558c, 0xe9b5bb45, 0xfbd15e05,
  151165. 0x37af7f83, 0x38a1939d, 0xa4487927, 0x9511a056, 0xe428b2b5,
  151166. 0x7015846d, 0x001d3ce3 },
  151167. { 0xe145b1d7, 0xd6be36b9, 0x009c5664, 0xf3e3938a, 0xe7c0f6db,
  151168. 0x2e562e7d, 0xc343f539, 0x951044e6, 0xd90897b1, 0xa5ab62b8,
  151169. 0x512f797c, 0xb1a1f70b, 0x750f28e4, 0x91cdd754, 0xffb8165d,
  151170. 0xb4c80e2f, 0x594d02b3, 0x65ed39c7, 0x56833edc, 0xcc12a49d,
  151171. 0xf3693a18, 0xe73694bc, 0xfcd2c404, 0x34cc134a, 0x11d40194,
  151172. 0x071bd5fc, 0xfc585e46, 0x05759047, 0x790b7a04, 0xb3280360,
  151173. 0x40afc684, 0x4bb8c6fc },
  151174. { 0xfd0f8796, 0x3120e2dd, 0xb133c9de, 0x6968a40d, 0xa9369c6e,
  151175. 0xfea366c0, 0x6007273b, 0x37e5b6d6, 0x8cb81439, 0x39e4ecf0,
  151176. 0x9febc005, 0x487fe9cd, 0x0199b53c, 0xeb8af444, 0x293519eb,
  151177. 0x2f124e3b, 0xc82c9c16, 0x860c218a, 0x709dc590, 0xacd1d6f2,
  151178. 0x36d50529, 0x5696d545, 0x59120bfc, 0xc03f5df9, 0x10ffa690,
  151179. 0x99a3e88d, 0x6c432827, 0xd4f9cfa5, 0x9a135d89, 0x2e8fea9e,
  151180. 0xb6a77e78, 0x3699a881 },
  151181. { 0x1eb1c64d, 0x5bca3372, 0xf1d28154, 0xe9cf3a2d, 0x6537106f,
  151182. 0xb7e2e9b3, 0x4f7cbf4d, 0x06c17151, 0x2058b37f, 0xcbde416e,
  151183. 0x8834e9c5, 0x82c53a7e, 0xe9ac3a75, 0x94dbdfe2, 0xc5e67c02,
  151184. 0x795ec6cb, 0x1426a80d, 0x8c23c25f, 0x6a8d4f9f, 0xee2cd20d,
  151185. 0xd3b7c235, 0x838daa54, 0x3d7a4d52, 0xb9e08ec0, 0x781cb473,
  151186. 0xca9475e9, 0x5ec31caa, 0x7271f39e, 0x82535187, 0x1df08e9f,
  151187. 0x208aff8b, 0x4f3a4b03 },
  151188. { 0x1ed095f8, 0x0f7b8107, 0xda226d4e, 0x23e37fa6, 0xafb36d1d,
  151189. 0x8b0f9852, 0x07d8e311, 0xb114634e, 0xe3e0f16e, 0xb9634a97,
  151190. 0x421eec37, 0x2454bb9c, 0xd72b21c1, 0xb4ecd5db, 0x6df20d7c,
  151191. 0xf9603868, 0xdf86e0a2, 0x9f5359fd, 0x5ac488aa, 0xc43d54fa,
  151192. 0xd1049df4, 0x56d714ab, 0xb020607a, 0x13152b3e, 0x7a02325e,
  151193. 0x49be1c18, 0x52ae84db, 0x44f24f4a, 0x0b5a7b80, 0x9e525c03,
  151194. 0xa6d179fd, 0x6d874446 },
  151195. { 0xbe9a42f5, 0xd29d07aa, 0x3781ccc8, 0x1fd5316c, 0x9dc69ea1,
  151196. 0x71a75a6d, 0x88fee91a, 0x4e19e0df, 0xf8d44f12, 0x99c2b4dc,
  151197. 0x31ae94e4, 0x05f6df92, 0xcf28ccc2, 0x27fba876, 0xf57f7ceb,
  151198. 0x6e1a0f01, 0xf3fd3b74, 0xe03f1f34, 0x42c1d213, 0xa0edc4a7,
  151199. 0x7deb8580, 0x5caac270, 0xaf0848bc, 0x0f5d791f, 0x07ac759d,
  151200. 0x17f514ad, 0x904fc531, 0x95a39734, 0x7bb70f3d, 0x95a4aca9,
  151201. 0xff9c5609, 0x3cf384c9 },
  151202. { 0xce1fc9e3, 0x700506ba, 0x676b0399, 0x49721742, 0xe72bf7b3,
  151203. 0x2b4a1b8d, 0x79b209f7, 0xca8602a8, 0xce26a8e1, 0x90580b90,
  151204. 0xfe24f39a, 0x1ef339b7, 0x629362e1, 0xb6c5d991, 0x577b24f4,
  151205. 0x51174e1a, 0x05e451e9, 0xf380fcb5, 0x148321bd, 0xf4d97afb,
  151206. 0x747e5d2a, 0x099806bb, 0xbe99a608, 0x85525d65, 0xd455e820,
  151207. 0x264828d9, 0xd8560a65, 0x8c8c5405, 0x71030770, 0x3c67e73c,
  151208. 0xee73df26, 0x2b248850 },
  151209. { 0x8541159f, 0x2173cde6, 0x4fb410b2, 0x78224c18, 0x1f2ca1c7,
  151210. 0x07a28619, 0xa8b23e40, 0x52c207d6, 0xa6b2344a, 0x071a0210,
  151211. 0xb5ed2945, 0xdb0e587c, 0x810fcc6c, 0x6c56b8ef, 0x62d843b9,
  151212. 0x1248c58f, 0x74c66975, 0x4b90363d, 0xe66c66f6, 0x6348f7f2,
  151213. 0xc126bcbe, 0xb2f9d441, 0x73ce49e8, 0xac07f2a3, 0xe81b0df0,
  151214. 0x52486758, 0x1d4621d1, 0xa108b54d, 0x74414a1c, 0x17261ece,
  151215. 0x6a3ac215, 0x938b3bcc },
  151216. { 0xe4ded340, 0xa9e4a16b, 0x80e88036, 0x8e65fb2a, 0xdcd73acb,
  151217. 0x97089606, 0xaaa657a9, 0x1c3a0434, 0x49101b06, 0xf304fc58,
  151218. 0xda0bb64c, 0xe60fb61a, 0xf5542df5, 0x818c2aec, 0x56f76d5f,
  151219. 0x74020576, 0x92533d97, 0xb566b790, 0x74d6eb5f, 0xae4655e5,
  151220. 0xa55b44b7, 0x60f7a1b5, 0x93747ea5, 0x7970179b, 0xf2dace56,
  151221. 0x8ae7e0e8, 0x84e83c06, 0x98474607, 0x15307341, 0x24e8c9ed,
  151222. 0xd9e89d6b, 0x6cff58a5 },
  151223. { 0x03e51f68, 0x508c01b0, 0x1d2fe7d6, 0xe1d1f225, 0x09bd8805,
  151224. 0xf7998d0b, 0x03e415b7, 0x255e907a, 0x607d9798, 0xd148467d,
  151225. 0x9b453896, 0x055c3b1e, 0x809f50f4, 0x35001013, 0xd0233fdc,
  151226. 0xfbbb2fa6, 0xff1820b8, 0x0b680b0a, 0x38d317e0, 0xb1d404dc,
  151227. 0xccc8c7df, 0x133d5444, 0x6ec13f84, 0x7fa847e6, 0x046e2e48,
  151228. 0xc33f83d8, 0x4863b3ac, 0x3c627fc5, 0xeb936af7, 0x5f67f8aa,
  151229. 0x31b79327, 0x5fe4ac8f },
  151230. { 0x8b6f401e, 0x581aa4bf, 0xad5c7ed4, 0x05db12a3, 0x6fb07b4a,
  151231. 0x7b018726, 0x9c22bcd4, 0xfdd11f04, 0x69371c95, 0x5454a7d4,
  151232. 0x99a46eaf, 0x066c55fb, 0x7fef96d0, 0x18637c7c, 0x6b83e95c,
  151233. 0xbafc1d34, 0x00bb42dc, 0x55c38593, 0x34e7e712, 0xdd8dec2b,
  151234. 0xb184cee8, 0x69c9cfb0, 0x49a27864, 0x8dcc0c42, 0x2010f2e7,
  151235. 0x290d95f2, 0x6977a420, 0x86e254c9, 0xeb2abdad, 0x20931c89,
  151236. 0x121c0548, 0x81377164 },
  151237. { 0x9c5a8edf, 0x6266b25e, 0x1078a7ad, 0x6e1388c2, 0x4876eedf,
  151238. 0x5f02737d, 0x62744617, 0x242fa7f9, 0xb385382a, 0x3e2cfbd9,
  151239. 0x02f71bef, 0xbadad7b1, 0x677d0a92, 0x562abcfa, 0x51fdff34,
  151240. 0x573ebd17, 0x7c250c78, 0xd7f65852, 0xc47ca896, 0xe0cf16ee,
  151241. 0x67622c9e, 0x8ccd79b0, 0xf8f2c075, 0x31fc5882, 0xa6008515,
  151242. 0x9232b37e, 0x82e8c5ba, 0x4d7bb361, 0xd2f146fe, 0xbf24735c,
  151243. 0x9cd2db98, 0x79c280ee },
  151244. { 0xf2b48122, 0xbdcc8203, 0xb04ac48e, 0xa8c04916, 0x9fc4885e,
  151245. 0xacf064dc, 0x82c1001c, 0xab838997, 0x676de250, 0x7339e721,
  151246. 0x8e1ab820, 0x17aa5aea, 0x6bc14b2e, 0x24d28ca0, 0x816b6230,
  151247. 0x570c5bb7, 0xcee6b606, 0x6c51235c, 0x183eae42, 0x1b2bf89f,
  151248. 0x9c66274b, 0x3e3af3c6, 0xb51e38bc, 0xe0b04426, 0x73e40e3b,
  151249. 0x26dbc58e, 0xb5be5be4, 0x3f9dd578, 0x52c8f408, 0x9fd9f791,
  151250. 0xa9e3ff4f, 0x758073a4 },
  151251. { 0x8691ca22, 0x7d27b057, 0x13a2a1b6, 0xf206bfd6, 0xac795413,
  151252. 0xe84bd385, 0x75536607, 0xc5d18a2a, 0xc8a0e24c, 0x2e166de7,
  151253. 0x3c474dbd, 0x56d5750c, 0x1366843a, 0xdef444c1, 0xcf4b8432,
  151254. 0x14646e53, 0xa9fd9783, 0x4bc0d030, 0x297ee203, 0xbda4c824,
  151255. 0xfd7be6c7, 0x3d0b10bf, 0x08c7f3ff, 0x2d216476, 0xb4fd4c45,
  151256. 0x06e52599, 0x49e9e104, 0xfbab9fa1, 0x8661d32d, 0x9342a7fa,
  151257. 0xfaf66aa8, 0x3f3e3458 },
  151258. { 0x951597aa, 0x51ec35af, 0x49df64eb, 0xb677d4ac, 0x9bf4eff5,
  151259. 0x0276cd9c, 0x515a2935, 0x423eca49, 0xfd9bb9c3, 0x8a696553,
  151260. 0xede1f09c, 0xf99ee9df, 0x199e5f98, 0xb8fa2956, 0x35292c32,
  151261. 0xb7638758, 0xfc40e81b, 0x8734eddc, 0x65457d95, 0xd82d5e9f,
  151262. 0x30c78d2b, 0xc8ee323e, 0xc1433d67, 0xe77b2e4c, 0x3c8314ae,
  151263. 0x56d9f807, 0x2a0e2f63, 0x441eede2, 0x6c48295e, 0x1e9e17ed,
  151264. 0x34c294ef, 0x640d20c4 },
  151265. { 0x3284d513, 0x4e9a0b8e, 0xf315053a, 0x074c3545, 0x45acd52a,
  151266. 0xb36e7407, 0x1de50db7, 0xd80bdcfc, 0x2549fc46, 0x8d9d47dc,
  151267. 0x303f07a8, 0x29b6ef13, 0x6d4ad4c2, 0x4e461aca, 0xfc9f1b73,
  151268. 0xca8e351d, 0x57460e65, 0x8bc4094d, 0x0f32d367, 0xb6302b33,
  151269. 0x285742e8, 0x69a074b6, 0x876c29c3, 0xdfe52b11, 0x912bd17a,
  151270. 0xf39e4609, 0x349aa639, 0x8ee40d66, 0xc72e05c1, 0xb968902a,
  151271. 0xc0d92816, 0x0f9c1ca8 },
  151272. { 0x67433df3, 0x1ebbaab3, 0x15d3628c, 0xb6aa5347, 0x97f0c5cc,
  151273. 0x13a320d8, 0x65e408f9, 0x72c918cb, 0xd5373451, 0x4b638854,
  151274. 0x0b4dca09, 0x731399a3, 0x0a3b1326, 0xcf256730, 0x6608b388,
  151275. 0x5ea60dfa, 0x7b290dfd, 0x58ad74b0, 0xd7694f9b, 0x83202789,
  151276. 0xb6630fb1, 0x48593db8, 0xc65e3eaf, 0x3db47f70, 0x3e7263f8,
  151277. 0x63949c91, 0xe6e6ff33, 0x9b9acec6, 0x098a8240, 0x34bd9ba7,
  151278. 0x45d36ec5, 0x7e31c12f },
  151279. { 0x0dfd2dd7, 0xbe281d68, 0x24ab61d8, 0x1efacb00, 0x94431f97,
  151280. 0xb9c3005f, 0x959cb3bc, 0x660c8dfa, 0xcffbb406, 0xfdd5fc30,
  151281. 0x7969a10d, 0x7a4631be, 0xde13fd1b, 0x336e309e, 0xfc947076,
  151282. 0x76b3bfad, 0xdcc72223, 0xfa91925d, 0x156c4ee1, 0x741f0d73,
  151283. 0x0e2b3747, 0x4f64ee41, 0xefc4d93c, 0x86be92d3, 0xfc4fbb2e,
  151284. 0xc53b7e03, 0x337ca1bb, 0xac196cf5, 0x7e23ba60, 0x4de41a30,
  151285. 0x326d5357, 0x1a219c45 },
  151286. { 0xaa4db0bc, 0xfdcf7ef8, 0x7b6c9963, 0x2e231806, 0x3d8a192f,
  151287. 0xc2639067, 0xffdc7771, 0xc0cec2e2, 0xa2fc0edb, 0x997c8e35,
  151288. 0x82cc6043, 0x78e10ec1, 0x2b0c8120, 0xfd0de2cb, 0x69e57f8e,
  151289. 0x4d6c457f, 0x5b53f1c3, 0x953e69b2, 0xc4f89cb8, 0x422a330a,
  151290. 0x95566be6, 0x92ff2329, 0x437442d1, 0x73cd502d, 0xbea69403,
  151291. 0xf04ce590, 0xf8030662, 0x6ac1537e, 0xb6d0bf93, 0xe02bcf77,
  151292. 0xbc90192f, 0x17aaa999 },
  151293. { 0x8e55db2e, 0x0d3d5643, 0x3b946851, 0x835dee43, 0x5b88462f,
  151294. 0x1a1440e5, 0xea17e27c, 0xa6ff3b35, 0xdd95f7a9, 0x23f99c36,
  151295. 0xbdd672cf, 0x7217fdd9, 0xdd2045c0, 0xf400ac1e, 0x4ff06b25,
  151296. 0x94b55c87, 0x0e4a49be, 0x0a44a0e5, 0xb43b6813, 0xe8925e91,
  151297. 0x214f96c5, 0x78bedde1, 0x0f97fa97, 0x0f456a4c, 0xa5bfd267,
  151298. 0xa28fd86b, 0xbe7608ef, 0x3b4b2d8f, 0x226474bc, 0xfbd5ff8c,
  151299. 0xa5f3b24a, 0x6b282af0 },
  151300. { 0x6341a595, 0x78fc025f, 0xa445e28c, 0x591c38d6, 0xeb446842,
  151301. 0x72bd6e3d, 0x75547833, 0x3f9466d3, 0x083e16c4, 0x911414d3,
  151302. 0x95a7acb4, 0x145d9466, 0x8fd2fb64, 0x102ddf09, 0x0bfd87b1,
  151303. 0x2a2b2d2d, 0x59455088, 0x69e9be5c, 0xa80245de, 0xee378bf4,
  151304. 0xb2306b0e, 0x80b0bd68, 0xc2be9f3d, 0x76a545c6, 0x4802c245,
  151305. 0x429d167b, 0x2b412dfb, 0x13e64427, 0xee8d9762, 0xb664f529,
  151306. 0x54706ebf, 0x6d4f5d23 },
  151307. { 0x00ba9f88, 0x35c8f2b6, 0x7bb6d0bf, 0xfdc807e0, 0xb3b81e5b,
  151308. 0x0a126d42, 0xa7ac781e, 0x335ce6ce, 0xf37dcba6, 0x3e308e6f,
  151309. 0x63c96487, 0x028dca62, 0x8818434d, 0x72eba57e, 0x79b78a26,
  151310. 0xa9e3d59f, 0x2f07aea3, 0xd2f0a7dd, 0x24d05f74, 0xe0fe4678,
  151311. 0x0116deb6, 0xb2085170, 0x58f37580, 0x9c2a5e92, 0x74070bb3,
  151312. 0xe78bd7a5, 0xb9977d90, 0x551fc872, 0x40db81b4, 0x6eda93c4,
  151313. 0xd65d34ad, 0x4aaf0b4f },
  151314. { 0x3514c7af, 0x9bef2506, 0xbc181ead, 0xb09e7dad, 0x8fa3ec58,
  151315. 0xef3cae87, 0x173b8685, 0xd8dbfab5, 0x921d32dd, 0xb2490fc0,
  151316. 0x8bd9c466, 0x4eef386b, 0xa061dbdb, 0xc1cdd52f, 0x25bc04db,
  151317. 0x64de989a, 0x85728636, 0x06f9836b, 0x8be44aa0, 0x11a5a804,
  151318. 0x097018c7, 0x16dede4e, 0xb2c11fb1, 0x72aec577, 0xa721ecd9,
  151319. 0x144dade1, 0xd6ebf3a9, 0xf99c526b, 0x1c2e14d7, 0xa1d4165b,
  151320. 0x82bc6337, 0x8b2cbd39 },
  151321. { 0x8a52e991, 0x28ec1bf2, 0xcf9d42ec, 0x0ba202f6, 0xc634ea45,
  151322. 0x8307d130, 0xc5762b9c, 0x3fc257b3, 0x487c2a2d, 0xbd3298d1,
  151323. 0xa319488a, 0xca14f1a7, 0x06ba06d2, 0xc70ca93b, 0xee405e89,
  151324. 0x9aa3f4b3, 0x35deeae7, 0xcc64eeb3, 0x03bf1d4c, 0xd155f578,
  151325. 0x45616bfd, 0x041ec0b5, 0x086e33f6, 0x23df80e6, 0xf0243cf5,
  151326. 0x399a79c8, 0x874ccd58, 0x86c2824e, 0x8fc5c831, 0x220eeaec,
  151327. 0x7dbe3670, 0x57e28304 },
  151328. { 0xfbcdf666, 0x6e60b698, 0x8bebb1d2, 0xbdd06a99, 0x80498436,
  151329. 0x4044adba, 0x522bc88d, 0xd76bf75e, 0x28423b20, 0x655c4b9b,
  151330. 0x53398a72, 0x65c0f492, 0x0ca37601, 0x76d4f2b7, 0x2030fa5a,
  151331. 0x46989925, 0xb6054705, 0x96b37e87, 0x53de1b2f, 0xef96f731,
  151332. 0xad54ef05, 0x5ecbbc8c, 0xa93617b0, 0xeb289d0a, 0x7cba217d,
  151333. 0x3ac0fbd5, 0x19d4a2d7, 0xd0d3cb56, 0xc91d6063, 0xe8bee9d4,
  151334. 0x696ffda6, 0x4f12e037 },
  151335. { 0x15f1a610, 0x4ccfa422, 0x3786519a, 0x804a5c55, 0x73838134,
  151336. 0x1246a454, 0x4b284e2a, 0xfa15b484, 0x146d1320, 0x36464c65,
  151337. 0x70a8a0fa, 0xfb6ba88c, 0x93c4804e, 0x74e7cee7, 0xb95ae16a,
  151338. 0x8c34d22c, 0xf9c1d4dd, 0x9d9ed89f, 0x32025371, 0x61a0866d,
  151339. 0x9bd6444a, 0x45b232b2, 0xf277bab1, 0xf888e92c, 0xa9448b02,
  151340. 0x73e69c6e, 0x5b521ecb, 0x1a496ea9, 0x5858afb2, 0xa8f78ea7,
  151341. 0xb1266f91, 0x83d2333e },
  151342. { 0x67b478d7, 0x1c633288, 0x50a2fc9c, 0xa1ee1ae1, 0x18d2241b,
  151343. 0x05b6ab30, 0x893cd696, 0x69f1f288, 0xa8117a87, 0x159d6660,
  151344. 0x70e73d77, 0xe8120119, 0x93f55f0a, 0x528fef00, 0xd854dfb2,
  151345. 0xb3978db8, 0xf45d9fbb, 0xd6b43ef6, 0xd5bee397, 0x17de4bfe,
  151346. 0x6bf76dad, 0xa01e0f59, 0x3d40754c, 0x28b2280e, 0xf8e86ef3,
  151347. 0x8edb6122, 0xb7d1e586, 0x8226b6af, 0x2f40a55b, 0x46353215,
  151348. 0xc5a31621, 0x7362f13e },
  151349. { 0x73c0c430, 0x792eb27c, 0xa51c3657, 0x8cc0a65f, 0xd2194f1b,
  151350. 0x50a5cece, 0x814b4947, 0x18945688, 0x4b6fbbf4, 0xbbf0a81a,
  151351. 0xf0aa8608, 0x376f4f58, 0x3987795e, 0xd9361d68, 0xe3a8d0d5,
  151352. 0xb6510cd8, 0xb6c1a455, 0x63e2fdbf, 0xaec891f9, 0x2c91154e,
  151353. 0xff568f64, 0x0eb1e715, 0x2f2b399e, 0xe7af9cd7, 0x89f0bf0b,
  151354. 0x1fc39bac, 0x90983695, 0xf0861d92, 0xda0a20a8, 0xd9b16f02,
  151355. 0xa38c0ead, 0x2f10693f },
  151356. { 0x0c06ded2, 0x07a6ce91, 0x2fd9087b, 0xf974842f, 0xa9f635a6,
  151357. 0xe468bfd6, 0x1ed60626, 0x04b61891, 0x369ee548, 0x1fb2f89f,
  151358. 0xdc96a201, 0x9cbd1113, 0x10d633ac, 0x6759acfe, 0x8faa629e,
  151359. 0x64ba66fc, 0x47f38283, 0xa686ae49, 0xd59cda99, 0x828c3a05,
  151360. 0x08ea2f6e, 0x7c7afb14, 0xaf3953c8, 0x2551c8e4, 0x9daa9e4f,
  151361. 0x5b53d279, 0xad6f1940, 0x1eff68d4, 0x96437cdb, 0x2775dbdd,
  151362. 0x4fe7a043, 0x985f83e4 },
  151363. { 0xeaf45294, 0x89603c16, 0xc24b5751, 0x70131160, 0x39d6b52d,
  151364. 0x4c112018, 0xed943340, 0x7079cf02, 0x74f41b68, 0x0c5b028b,
  151365. 0x9c8ac1e1, 0x3dc3f076, 0xf8b24f0e, 0x5ac5eea3, 0xe34c5c22,
  151366. 0xee6684ba, 0x9abc452a, 0xa5259e63, 0xe9df45cc, 0xb07d2cd1,
  151367. 0x1a443cfa, 0x07019c93, 0x92c003b3, 0x68fddaa9, 0x0d8cbc2e,
  151368. 0x2d9f179c, 0x1e781ca7, 0xbbf15a6f, 0x50dcc799, 0x54d779d5,
  151369. 0x0fe962f1, 0x0c88e540 },
  151370. { 0xe8f44357, 0x84f71a6a, 0x3a3cab6a, 0xf75b4bf6, 0x5aebc680,
  151371. 0x334c9d9e, 0x8a753ef2, 0xcecaf084, 0x075e3c8e, 0xe28014c1,
  151372. 0xf74f8d3a, 0xbb9d5a38, 0xb80e32ae, 0x75988464, 0xf2bc3792,
  151373. 0x7b328e6f, 0xeed0e197, 0xebbb1faf, 0x5a33065a, 0x674eac95,
  151374. 0x922dbce8, 0x8c19fd8f, 0x987b907a, 0x8c17ae85, 0x3b3a2cd7,
  151375. 0x89f33627, 0xfa87772f, 0xebaea019, 0x3a25ced6, 0x4e5de499,
  151376. 0xaf110715, 0x8e2560b8 },
  151377. { 0x3141aba6, 0x56d3746c, 0xbab2cf9e, 0x45a1079f, 0x9cdd27c7,
  151378. 0xb6382831, 0x9dfd950e, 0x22237632, 0x3a9408ff, 0x1e0b15cd,
  151379. 0xb1160118, 0x49a80200, 0xa383bba7, 0x2719db5d, 0x651046d5,
  151380. 0x6078340a, 0x97523b1f, 0x8929d4de, 0x8e0a28ab, 0x4040345c,
  151381. 0x0adf09c7, 0x61275ac2, 0x2331d611, 0xb41ab265, 0x5391ca50,
  151382. 0x230cc77c, 0x8f922315, 0x88be0c92, 0x92fd9a29, 0xfef3d92b,
  151383. 0x8324f2e5, 0x59005f22 },
  151384. { 0x3c4c1c74, 0x6bb1750c, 0xe966fb79, 0xbe73aac0, 0x66c5973f,
  151385. 0x85a75d92, 0x3a8656b6, 0x8c97f932, 0x50446cde, 0x2b7043b1,
  151386. 0x3ff3897f, 0x548916f7, 0xb18b72b2, 0x913dd01c, 0x488c0de6,
  151387. 0xd0a751f1, 0x8558ca58, 0x19175714, 0x44a663da, 0x97714301,
  151388. 0xb0e08618, 0x2df190ac, 0xf39ead9c, 0x0080fc0c, 0x17382da1,
  151389. 0x0085ac6e, 0x3262a338, 0xe9791851, 0xb43bae8d, 0xe4495936,
  151390. 0xd783df6e, 0x57a78e26 },
  151391. { 0x40dbddd8, 0x161b346f, 0x9410c3ac, 0x2b49a927, 0x1886cf3b,
  151392. 0x8c542783, 0x33b93deb, 0x72df3232, 0x40df579d, 0x9c8d59f5,
  151393. 0xc20ef500, 0xe5d7a67d, 0x67f08643, 0xc46b3918, 0xad96adc3,
  151394. 0xecfa2445, 0x0c4544d0, 0x658f589b, 0xe08417d7, 0xe6ec9301,
  151395. 0xc454e288, 0x6ca5ef6a, 0xac0f462d, 0x4191048f, 0x08d8a036,
  151396. 0x852407d8, 0xf6d35b7e, 0xb4c533a7, 0x8f6ada87, 0x3251e412,
  151397. 0x81c472e8, 0x1ca370c5 },
  151398. { 0xa801b68a, 0x94bd5171, 0xfd1998b3, 0x7312879c, 0x41163202,
  151399. 0x4905aabf, 0xf5b01fdb, 0xb5fe87f4, 0x9cda128b, 0x78de523a,
  151400. 0xc7bd31f7, 0x0bf161a1, 0x23904c35, 0xb5decfd0, 0xe188f12d,
  151401. 0x224b2882, 0xf99dae74, 0x0dd2801d, 0x08cd1cd2, 0xcad467b5,
  151402. 0xc0867e39, 0x6c311c3d, 0x2b425072, 0x71a11720, 0x2efd9003,
  151403. 0x83bf464e, 0x1dbd3b03, 0x53d0448a, 0xe6265baa, 0x32db52f4,
  151404. 0x4c33ac79, 0x2584b34c },
  151405. { 0x2aeec688, 0x3cb86389, 0x45fbe523, 0xa5e740ba, 0xfd60b5f8,
  151406. 0x422e71f7, 0x4874913d, 0x455d185c, 0xfa17d80d, 0x04c2bb36,
  151407. 0xac054524, 0x3f271854, 0xa8b9a657, 0x76dd3045, 0x62ee7cc8,
  151408. 0x2e42c3e1, 0x4df6c7d0, 0x00266706, 0xdc7cb488, 0x5927dd51,
  151409. 0x187897e0, 0x6b3faabe, 0xf2d5737c, 0xfe6ad22e, 0xff51a9ff,
  151410. 0xafb60269, 0x69807baa, 0xe1c83545, 0x951ca49a, 0xacddb6ff,
  151411. 0x3f9ab085, 0x7e811374 },
  151412. { 0x830a88b1, 0xad722a8b, 0xce1117e1, 0x91918ea8, 0x0409b47d,
  151413. 0x3e02d0b8, 0x6c46d1d3, 0xb53812d3, 0xe589669c, 0x2fd09db0,
  151414. 0x15b0cd5e, 0x9845cd06, 0x2386c453, 0x0c1c155a, 0xf5ff43cb,
  151415. 0xda774de5, 0xe391c0cd, 0xbb076b98, 0x5004f286, 0x97d71eff,
  151416. 0xaeec0bfe, 0x23e0b46c, 0x32a1ad94, 0xe4538667, 0x396da422,
  151417. 0xfe0c9f81, 0x63db2bfe, 0x6376c1a2, 0xba56fa91, 0x001c7918,
  151418. 0xdf8485a6, 0x436b8c64 },
  151419. { 0x8ab764bc, 0x88117e9d, 0xa077df84, 0xdfa61e94, 0x0c18eebd,
  151420. 0x5a7765d3, 0xfc9451dc, 0x548916af, 0x071a347a, 0x01a52e33,
  151421. 0xb23b41df, 0x633b95de, 0x43c8c286, 0xdd7d68c9, 0x18d97068,
  151422. 0xe4f9d41e, 0x8c92799d, 0x79908b90, 0xd47394a3, 0xe614148e,
  151423. 0xcd51e53f, 0xe5018517, 0x0243dcb6, 0x5060075e, 0x17954405,
  151424. 0xe5dcde62, 0x537da5ff, 0x6f7c90e1, 0x0768cb66, 0x1df7aae4,
  151425. 0x6dbe95e1, 0x5266ca9e },
  151426. { 0x1386b3db, 0x84ddee6d, 0x7c38e540, 0xf9e4af5a, 0xeb04f49d,
  151427. 0xb3418440, 0xfde5a4fd, 0x2138a1e8, 0x30257cfc, 0x3e6e6924,
  151428. 0x19fd70c1, 0x3519c6e3, 0x86c31ff0, 0x8f34e174, 0x940ce1e8,
  151429. 0xf1e298fd, 0x14960d7c, 0x6fb8cb1d, 0x2b2f3bff, 0x207c1347,
  151430. 0x146ef8ff, 0x899a20b4, 0x7bd3e220, 0x7dec362b, 0x626bea27,
  151431. 0xa975044e, 0x4fb4cb67, 0x0f32b449, 0x1fc6703a, 0xc17a0920,
  151432. 0x9cd84a2b, 0x41f325b9 },
  151433. { 0xce2843a4, 0x312ed513, 0x00728afc, 0xe748498e, 0x4d864ce5,
  151434. 0xa8ef2822, 0xa620083b, 0x34064704, 0x4bed338d, 0x5905e1d9,
  151435. 0x063e7b38, 0x2a578cb5, 0x289e7bb9, 0x98276d96, 0xf17b7341,
  151436. 0xdfe2dc47, 0x1dac8944, 0x5923521f, 0x23400aa7, 0x3db6d28d,
  151437. 0xa761ba43, 0xc647705e, 0x9bfd07dd, 0x8947ba6d, 0x242ca8fd,
  151438. 0x00f2e3ac, 0xeb8c3468, 0x49ef4670, 0xd9aa18fd, 0x7db3d37b,
  151439. 0xe58cea9e, 0x56b30fb6 },
  151440. { 0xcd80a428, 0x07ecdcaa, 0x8732c891, 0x7af922dc, 0x3ada441f,
  151441. 0x20d88798, 0x924b008a, 0x3bed9a44, 0xb2e81c3a, 0x2123533c,
  151442. 0x65f807d3, 0xc34e4075, 0x1f2faecb, 0x0bfaefa5, 0xade8a88d,
  151443. 0x78b634a5, 0x94392a91, 0xc4e0b7f8, 0x90bb1cd8, 0x30922377,
  151444. 0xf87204ae, 0xdea9b4fa, 0x85d3cd83, 0x3edf81f5, 0xc6523a79,
  151445. 0x58f88c51, 0x17c0d969, 0xe472fb8b, 0xdccf7f07, 0x899081e5,
  151446. 0x58bdd146, 0x1353cc57 },
  151447. { 0x39bf6e18, 0x28a56497, 0x649b89c7, 0x59e8b5a2, 0xdce8b8e7,
  151448. 0x8d9434a0, 0x2047040c, 0xd935bf51, 0x6a7b8e82, 0x2ab3a164,
  151449. 0x27f81294, 0xf1583ed6, 0x72d67297, 0x8416a7e0, 0xcd39e42b,
  151450. 0x49685d86, 0x958ddbad, 0x8a797fc7, 0x155ce6de, 0xa558f928,
  151451. 0xf8a36235, 0x75f4e570, 0x52877ae5, 0xbc69cfc0, 0xa6b16ebd,
  151452. 0x8f4193a9, 0xbb1cc1f1, 0x8d1df43c, 0x5a21e789, 0x723a830e,
  151453. 0xf451df58, 0x3ec2185d },
  151454. { 0x1f0bc2d7, 0xb9d4c7d7, 0x6e51d412, 0x6982c6cc, 0xa09f80f6,
  151455. 0x92e02d93, 0x047ae09c, 0xb7dd2d25, 0x37f351f9, 0x3503149f,
  151456. 0xc77850be, 0x69d49ce1, 0x12f0d2c8, 0x60242acb, 0x7bc28b9d,
  151457. 0xba188c56, 0x06bc0550, 0x8e406121, 0x8d7d4329, 0xb0d84b1f,
  151458. 0xd38951e0, 0xb4a67ae7, 0x8bc97607, 0xb527c57b, 0x5497aa72,
  151459. 0xbc93c5f3, 0x39bdd666, 0x5f1de8cc, 0xe9d447a3, 0x3087dc5c,
  151460. 0xa211abe5, 0x89b356b6 },
  151461. { 0xdfdcc837, 0xed6db0af, 0xa871b7a9, 0x0fb80baa, 0x1c1d4b72,
  151462. 0x413abfc9, 0xadac9e5c, 0xf5b56bf7, 0x8b8657a3, 0x5664a2da,
  151463. 0x0e41d94e, 0x11b04f72, 0x37433658, 0x63e11d26, 0xf426daea,
  151464. 0xee628ece, 0xcb162dc2, 0x011619c9, 0x87648643, 0x9cf5817f,
  151465. 0x5584bc86, 0xe1bb9702, 0x00bf7928, 0x2cc27cef, 0xdc60eee5,
  151466. 0x4ef3a80e, 0x87adc2f9, 0x7e1202be, 0x8a0d4f52, 0x656f18e0,
  151467. 0x57c5d126, 0x39c4f10d },
  151468. { 0xe88aecd3, 0xb3a9b68c, 0xa518aa9d, 0x555b0918, 0x4bd4ee54,
  151469. 0xedc1cdad, 0x02068d84, 0x79b68b67, 0x811ac72d, 0x7dac80d0,
  151470. 0xa81a0a78, 0x6d1e6d35, 0x3bd16283, 0xc841e9ea, 0x894c4444,
  151471. 0xa7bc1775, 0xf1aa1202, 0xf2b63725, 0xc7d4c556, 0xbec7767e,
  151472. 0xd46ff51b, 0x2817ebb3, 0x73f7e339, 0xfde5be8d, 0x5aed24c4,
  151473. 0x44c6c977, 0xb6e579cf, 0x0b9a1707, 0x9069fbcc, 0xcff16478,
  151474. 0x49152b00, 0x414b542d },
  151475. { 0x606e173b, 0x33c31e58, 0x90e6713a, 0x5b7f4e1b, 0xdebb20af,
  151476. 0x425fb512, 0x05120e70, 0xc788c617, 0x9013e4ec, 0x3ef05602,
  151477. 0x81c6e6d7, 0x9f9d35ac, 0x9450690a, 0xe131e88f, 0x44af082e,
  151478. 0x708f9b32, 0x1ba2aea9, 0xb2e4d66c, 0x740db29c, 0xaf1f4a6e,
  151479. 0xd1843007, 0x74ab9248, 0xed556a6c, 0x13338ef8, 0x270d17a6,
  151480. 0xf48e623e, 0x9608f5bf, 0x3c7362fa, 0x444e8515, 0x43977874,
  151481. 0xe00b8b2a, 0x52678d6a },
  151482. { 0xdf36aeb4, 0x5dff1c59, 0xa92bc0ab, 0x52d6653c, 0x927a5f81,
  151483. 0x0e03f496, 0x2dfd491f, 0x8509d414, 0xa571f89b, 0x258c2c52,
  151484. 0x93334485, 0x2bd61804, 0x3f7d9e09, 0x1a33e94f, 0x2c1bf906,
  151485. 0xfab418d3, 0x5aa5695c, 0xf39c490e, 0xf6d2d7ff, 0x0e41196e,
  151486. 0x0f7948a9, 0x3ecd4075, 0xd3053b4f, 0x4b58f9b2, 0x5d9974c9,
  151487. 0xb8ee842a, 0xbf22f682, 0x23a59c1d, 0xc8efcea6, 0x045ac614,
  151488. 0xc10ceedd, 0x7040ba5b },
  151489. { 0x515a1a96, 0x2c364f81, 0x184327e0, 0x31a63503, 0x1ad93d4f,
  151490. 0x0a096650, 0x273b6173, 0x9d7694f1, 0xd2cda9d2, 0x8886d876,
  151491. 0x2814c177, 0x1e01a742, 0x8667696b, 0x3492276b, 0x5b25f006,
  151492. 0x2fd4f0c6, 0xfb294c4a, 0x6527349f, 0xde1d336f, 0xc1fe0d8a,
  151493. 0xe7e3860e, 0xaf9a23e8, 0xb774c31e, 0x97d2b721, 0x4365784a,
  151494. 0xfac3e582, 0x70f4eaa3, 0xff2dff4e, 0xfe873248, 0x3d281e1a,
  151495. 0x0bd1c9c1, 0x9043a6d6 },
  151496. { 0x766c7937, 0x1511a0fe, 0xabbc3be3, 0x1b2ded5c, 0xe00888ac,
  151497. 0x2ac160cc, 0x616200f3, 0x928754bd, 0x34a2ea06, 0xb801c83d,
  151498. 0x9cbe106f, 0x8ad7a03a, 0xcedfcd94, 0x996b0822, 0xe4069880,
  151499. 0xc3c3463a, 0xf597f663, 0xfb12ea4d, 0x40c92af9, 0x2c8d3834,
  151500. 0x4e8da154, 0x79bc85c6, 0xdb4e801a, 0x95771fa2, 0x1e3579b2,
  151501. 0x7bd2c138, 0xffaad078, 0xe45c75df, 0xb73eac46, 0xb0760a3c,
  151502. 0x3a125f35, 0x26362b48 },
  151503. { 0xeefc3e89, 0x25c68d28, 0x69e9ee71, 0x2d0ee877, 0xaf5e4b75,
  151504. 0x8b07bb86, 0xcb86b333, 0xdb709072, 0xff552bac, 0xfd3d20ea,
  151505. 0x4c0da1e9, 0xa5eeb2b1, 0x44f97145, 0x391f688a, 0x1e06d485,
  151506. 0x21fbd310, 0xbea9cd49, 0x45e4f2a5, 0xa7bf21da, 0x7b60d464,
  151507. 0x054d5471, 0x193f88c8, 0xbee0f2e9, 0x5ace53d1, 0xc1439273,
  151508. 0x92c26563, 0x96c6b5ee, 0x9c86e0b2, 0x09ff59ba, 0x452fe231,
  151509. 0x555c935e, 0x2e952b20 },
  151510. { 0xd75f886e, 0x2a846bca, 0xd43dfc58, 0xe68a5dbe, 0x007b1b86,
  151511. 0x103e45b6, 0x355ff2b5, 0x580e2ec9, 0xa263ecc9, 0xbc702f26,
  151512. 0x181e5e33, 0x2835b386, 0x6c122076, 0x025113ec, 0x7fbd856d,
  151513. 0xa5c26e3a, 0x9d6ebcb1, 0x8ef83fb3, 0xa44d2fa8, 0x7aaa53f2,
  151514. 0x53b1fa97, 0x7c14ef33, 0x17559a30, 0xff604a11, 0xb09377e0,
  151515. 0x2bcd96b0, 0xdb2f0273, 0xa5c14896, 0xeb53ef06, 0x1c0a84c9,
  151516. 0x30378e4b, 0x1236d017 },
  151517. { 0xc084373b, 0xd7481c8f, 0x646097ae, 0x29ae4768, 0x613bc34b,
  151518. 0x1300dfa0, 0x934bc2b0, 0x3712714c, 0x0e2be7e2, 0x86524629,
  151519. 0xed010800, 0x554fbb9f, 0x42314576, 0xf0ec0b38, 0x330a3282,
  151520. 0x65baf594, 0x706ef817, 0x3bdde1a8, 0xba7530e9, 0x7d2c727d,
  151521. 0x74cc95cb, 0xbb0c5d66, 0x2438906d, 0xb3fcd365, 0xd14658f3,
  151522. 0x19881941, 0x6c97f0e9, 0xe616f555, 0x4b9ec7ea, 0x353c2d85,
  151523. 0x620cb56e, 0x02a48014 },
  151524. { 0x506ccd38, 0x11d6d23d, 0x9059baa6, 0x229a1c54, 0x69d011c5,
  151525. 0x717c9c27, 0xd828937d, 0xe87e1b46, 0x83835083, 0xf5d63bbb,
  151526. 0xaadac258, 0xf0a7b427, 0x9f154d1f, 0x99ab26bd, 0x8ec955fd,
  151527. 0xdec0ffbf, 0x49fcb880, 0xee957c67, 0x1e0114de, 0x32395dee,
  151528. 0x369f46c7, 0x192a64b7, 0x91eb2599, 0x43044660, 0xa2e8c3da,
  151529. 0xbe2da887, 0xc3556d18, 0xa44e2c25, 0xb55f75f3, 0x31390414,
  151530. 0x8f217fe0, 0x1d8bde6f },
  151531. { 0xa2028924, 0x03cd39f8, 0xb06ecb9f, 0x6e54f19c, 0xd6f05846,
  151532. 0x862bbcb7, 0x5a060776, 0xdbe06716, 0xb10fec10, 0x9397c97a,
  151533. 0x6f1bb65c, 0xf4213826, 0xa672ba38, 0x414deccb, 0xf88b05e6,
  151534. 0x594d4d43, 0xac94d4d1, 0x7993f57a, 0xbfb17638, 0x74fc2a6a,
  151535. 0xb6fc655a, 0xd8196b5b, 0xee8d2139, 0xdc375c84, 0x360d3a26,
  151536. 0xb9b00a02, 0xdeb93b87, 0xb36ed35c, 0xcc83209e, 0xf565b28b,
  151537. 0xc61013c1, 0x349c6943 },
  151538. { 0x4de6c88a, 0xd1b39444, 0x4700207e, 0xd5c2c471, 0x21c2b780,
  151539. 0xb6f458a2, 0x0850993e, 0x749f7564, 0xbaef0c18, 0x400ba579,
  151540. 0x737c70f0, 0x2d742938, 0x21467ebf, 0xc5a8e2ec, 0x5337f453,
  151541. 0x243a666e, 0xed0bd50a, 0xc991f1c7, 0xf4bd1f91, 0x3a7f3e90,
  151542. 0x5f0e129b, 0x96089e8a, 0x07389635, 0xd0d3a177, 0x27182ac9,
  151543. 0x9cf842d5, 0x0817c5c2, 0x21195299, 0x87255769, 0xa32f327e,
  151544. 0x89c2d8fa, 0x056587ab },
  151545. { 0x1ce4733d, 0x008562ed, 0x98e51444, 0x5faff7cb, 0xa9ab46b9,
  151546. 0x5f03021f, 0xb61a8c13, 0x89494c5e, 0x36b35976, 0x57c95036,
  151547. 0x2ac2d2f6, 0x6be84c8f, 0x9bd2703e, 0x0e5b34d8, 0x7e872abb,
  151548. 0xc4ad918f, 0xc4052ee1, 0xc2a89e9f, 0x3190b51e, 0xc2caee3f,
  151549. 0x6fff254f, 0x58fd1437, 0x883e0972, 0x6f3c0d68, 0x0fb15438,
  151550. 0x63d0a0e9, 0xf6caae00, 0xc438764b, 0x3f1d0f6c, 0x815f1565,
  151551. 0xb86cdbde, 0x1b87f2ed },
  151552. { 0x2b0b15b1, 0x35792bbb, 0xce6ba779, 0xa3e4b5a7, 0xdd8f3779,
  151553. 0xfbacffd9, 0xc298d1ef, 0x005450bd, 0xc47031c6, 0x0e3f5556,
  151554. 0x95d68066, 0x0770f07a, 0x2d1052c2, 0xce3e84e0, 0x7aa8cc54,
  151555. 0xb050791e, 0xba3223a3, 0x4d621e73, 0x39632990, 0x87b9b94d,
  151556. 0x7eb8056d, 0x8df9cb47, 0xedfca0cc, 0xe2430de8, 0x9712a0ca,
  151557. 0x374bf416, 0x88848a99, 0xbe3f3c77, 0xc4a3e59e, 0xb22b87b1,
  151558. 0x3e95bc23, 0x8e0227c4 },
  151559. { 0x3210964d, 0x000e22a8, 0xff056eeb, 0xdccd5df5, 0xdaf1ead7,
  151560. 0x02173a1f, 0x67cdcae3, 0xd02833e0, 0x8bdcc90c, 0x1cc574cb,
  151561. 0x3224b4f5, 0x86eca714, 0xbb3f8298, 0xd00e603a, 0x0c1a8deb,
  151562. 0xb98ece1b, 0x378c261d, 0x228a46e4, 0xa6165e5d, 0xc6f9dd0d,
  151563. 0x4b7ef0e2, 0xb3ae3899, 0xbda9f306, 0x3a3c16b3, 0x38a084db,
  151564. 0x5e9a26d3, 0x5394e950, 0x528e5993, 0x4ea206bc, 0x848ecb11,
  151565. 0x40545d6e, 0x14b15ab5 },
  151566. { 0x664c59a2, 0x0f6d86c9, 0x60fd7aa5, 0x3dfe2be1, 0x9072cb8e,
  151567. 0x33f9b569, 0x8176a7e0, 0x5f2325d9, 0x4587080b, 0x79a0d4e7,
  151568. 0x0d5d4e05, 0xa4ee0def, 0xc87b28e1, 0xc0ad9ffa, 0x3f09b4ee,
  151569. 0xd6f18d2f, 0x292e9d87, 0xcc896ae7, 0x6094763c, 0xca88953d,
  151570. 0x18fbf9fa, 0xdbee97a8, 0x4b63d701, 0xdf20e0e9, 0x47ea722f,
  151571. 0xcbba6e30, 0x612b571f, 0xce57e1ca, 0x009a55f5, 0x1e16ac76,
  151572. 0xc4389e2e, 0x742bbed8 },
  151573. { 0xc1dc2c73, 0x23ea86dc, 0xc1643abf, 0x4bbbfd5b, 0x24d8ca1f,
  151574. 0x07f8fa1f, 0x8cb5cac7, 0xde68a6e0, 0x54e66a7d, 0x7d54c64b,
  151575. 0xa9b7ad78, 0x789dba22, 0xe364ab94, 0x4d88d540, 0x1f72e011,
  151576. 0xc8c2e02d, 0x46e2a278, 0x4c826057, 0x4b187c7d, 0xe6c35bb3,
  151577. 0xeb8fe0c9, 0xed8b3dfe, 0x7d11e415, 0xb6bc34e8, 0xb865c7f9,
  151578. 0xb3908bbf, 0xe1ecc17c, 0x717d1ce6, 0xf7cdd69b, 0x151e3308,
  151579. 0xb5c94124, 0x97bd5a14 },
  151580. { 0x81e82861, 0xe01c62fe, 0xdd42c40e, 0x703d4b6d, 0xe65e91e5,
  151581. 0x7e52e55b, 0x5abbbfdd, 0xb8b49374, 0xc72a45f4, 0xb4f15f52,
  151582. 0x550f29d8, 0xce8435a8, 0x582de75f, 0x9df76b9b, 0xa20c8b96,
  151583. 0x52e84c5f, 0x0a8a0af4, 0xaf77d2d1, 0xca6013c3, 0x0389bbd8,
  151584. 0x26f8305f, 0xb0d9b9ba, 0x0cec8b9a, 0xf053e848, 0xffabda18,
  151585. 0x4d63367a, 0xa6424c2a, 0x50f53be4, 0x864fba2e, 0xf892c58c,
  151586. 0x48cc5469, 0x317c6d31 },
  151587. { 0x2cb7d42b, 0x0c3525b0, 0x310facae, 0x55240bc9, 0xff20408f,
  151588. 0x8d5d2022, 0xe0c10ea0, 0x6b01402f, 0x718eb23d, 0x7fbef68a,
  151589. 0x41252a19, 0xa0146b5a, 0x110e0d6e, 0x59afce48, 0x022de181,
  151590. 0xe9a1d27f, 0xdc3f49da, 0x6db96d16, 0xefbe4008, 0xfc1ae3f5,
  151591. 0xeccbc11c, 0xf9d70641, 0x525f8636, 0x49022279, 0xc2763c30,
  151592. 0x3769796a, 0x1d90630b, 0x9cc3483c, 0xee3d3f17, 0x451651f0,
  151593. 0x9da0b8fd, 0x6ae59739 },
  151594. { 0xbff4d2ee, 0x57b13bc7, 0x30b173d8, 0x20754229, 0x0794936c,
  151595. 0xb6254bd5, 0x5efd55be, 0x1d5f232a, 0x4e0c3389, 0xc06f4a85,
  151596. 0x8e61f944, 0xcf2c5b59, 0xfd5f87b7, 0xc564861f, 0x5a2afa4c,
  151597. 0xee261fb1, 0x2d97a774, 0xb0ff7226, 0xd6cf007a, 0x1a89ae22,
  151598. 0xd346f214, 0x28880534, 0x97b6497e, 0x8fe73bff, 0xfa2afffc,
  151599. 0x8a8595b2, 0xf151a726, 0x9ef9cf3e, 0xe744b82b, 0xa84ee5f1,
  151600. 0xbc63fe72, 0x6649048d },
  151601. { 0x1e8b760d, 0x91b7bb78, 0x25aadaa0, 0xd47b0bd8, 0xfab5226f,
  151602. 0x81493d9f, 0xbffc148e, 0x4a6dd226, 0xa29be3db, 0x5a032f8a,
  151603. 0x34b0ab0b, 0x318dbc70, 0x7d654868, 0xdcccbfb5, 0x9c581e46,
  151604. 0x8506ab37, 0x2830ece2, 0x09136a6e, 0xcf6c80c7, 0x48b79356,
  151605. 0xef6b1e86, 0xfa176377, 0x83f0f1c9, 0x2c9c1cc1, 0x16abeddd,
  151606. 0x96f0526d, 0xa93b0de4, 0x3e0e98e2, 0x0f13873a, 0x6f2d7ada,
  151607. 0xf3fa49ec, 0x4eb93b5c },
  151608. { 0xe11fae32, 0xbd89f7e5, 0xc4023f51, 0xd13d74f5, 0x491c3f6f,
  151609. 0x1b0014df, 0x555279b7, 0x1d849a57, 0x05ba0068, 0xbb9e8897,
  151610. 0xc13ca2ca, 0x82222419, 0xfd33676f, 0xafbbb685, 0x75878a2a,
  151611. 0x931c3f52, 0xef3d5173, 0x12aeefef, 0xbd8a6878, 0x189a5cc8,
  151612. 0xd99f0c16, 0x82cffdb3, 0xa19d48b6, 0xbf565406, 0xe9c6c4e0,
  151613. 0x5605e223, 0x86804172, 0x53e781de, 0xc7001cc8, 0xcdf5c90b,
  151614. 0x7c043f68, 0x2b582d93 },
  151615. { 0x81abc2ae, 0xa1165c82, 0xe2b69eca, 0xa73380f5, 0x07fff66f,
  151616. 0xc097b3d2, 0x54776506, 0x5d603826, 0xb57fa21c, 0xdcbac9f3,
  151617. 0xc98dbdd5, 0x78750db4, 0xd9eff32a, 0x85e21103, 0x2f11c41c,
  151618. 0xceed172c, 0x9e348c09, 0xa8e39264, 0x831eddfb, 0x71cb936b,
  151619. 0xf50864a3, 0x915c3d06, 0xe93acfcd, 0xfe8e33cd, 0xb3f2f7aa,
  151620. 0x4bee10d7, 0xeb7cee9a, 0xc1d8eb48, 0xfa574afd, 0x4fa49ce3,
  151621. 0x862db4c0, 0x78615109 },
  151622. { 0x7ae72c21, 0x3fe3f480, 0xfd0f0da5, 0x631aa144, 0xf8c3a454,
  151623. 0xc76ee1e8, 0x51b4f1ab, 0x379ae094, 0xd7cdbb24, 0x2a3a4397,
  151624. 0x82bd5fcd, 0x7a14cffe, 0xf427ef5a, 0xbbe4ed12, 0x284d3ccf,
  151625. 0x9b0a43ee, 0x8eec6e1e, 0x57b78b93, 0x67b8e87b, 0x18d404e4,
  151626. 0x34374c20, 0x0c8adc05, 0x5428deb5, 0x64373605, 0xc3afa2cf,
  151627. 0xb4d80ec0, 0x3aa956f9, 0x6d51f93c, 0x84161c68, 0x9f9a28ab,
  151628. 0x6bc9c025, 0x540b6bb7 },
  151629. { 0x321d315d, 0x04e1734c, 0xd86e05d0, 0x4ef56612, 0xbba8cd81,
  151630. 0xeafae145, 0xacdc789a, 0x1fb07a49, 0x5877570f, 0x6a21e9ad,
  151631. 0xb9bc53de, 0x2e4a837e, 0x1d6298eb, 0x436db293, 0xea362f45,
  151632. 0x43afbc78, 0xaabf6585, 0x2a973d97, 0x0c924d60, 0xdce7dabe,
  151633. 0x7cadf0e9, 0xf69d98f0, 0x75020538, 0xe0b505a1, 0x4461cd29,
  151634. 0x3db7d1a3, 0x5e20e818, 0xe1c28776, 0x52dd50f6, 0x2ca25867,
  151635. 0x92e0388c, 0x897cab14 },
  151636. { 0x0d8bab8a, 0x59ed3813, 0xa438200a, 0xc11d364c, 0x40581415,
  151637. 0x0687bf2c, 0x7ac89674, 0x86ad0d3a, 0xb97411a0, 0x44928105,
  151638. 0xf383371c, 0x74984b11, 0x0d1a831e, 0x70d2ed84, 0x6c912fe0,
  151639. 0xd883628b, 0x14fa88d2, 0x44f8f7fb, 0xcf0ac93e, 0x564f2a4d,
  151640. 0xa6c24fa6, 0x82f629aa, 0xbf6cd949, 0xab906ba3, 0x20a5182d,
  151641. 0x2c822e67, 0x30eb93a5, 0x2ff47dac, 0xfff673aa, 0xdc62c4a4,
  151642. 0x476b0ec5, 0x64b00763 },
  151643. { 0xb3c9a404, 0x1e3f533e, 0xb7ef9952, 0xb1db7f73, 0x6c253693,
  151644. 0xc7f13e29, 0x0738eed4, 0x7ce7f4c4, 0xce26cad0, 0xccfd3b33,
  151645. 0x01ec5cf1, 0xd8784935, 0xdc084e01, 0x3f8fc09d, 0xc39b5acf,
  151646. 0x217cab32, 0x9ef5551c, 0x42daf0bb, 0xe1217a95, 0xfbc76f56,
  151647. 0xc237002a, 0x80178b12, 0xb070a293, 0x0b52c39f, 0x576ca964,
  151648. 0xe3925153, 0x19d68e36, 0x25559424, 0x09e50e84, 0x291fb82c,
  151649. 0x6618ed8c, 0x7dd22ea6 },
  151650. { 0x49cbb3bf, 0x7ffe844b, 0x5562fb25, 0xde0cc704, 0x9f5a845a,
  151651. 0x1e6ee537, 0xe51277fc, 0x956d7f26, 0x30635718, 0x2c75d4b9,
  151652. 0x96957f34, 0x39a14892, 0x82e5742b, 0x8cf4eb32, 0x83247b72,
  151653. 0x6b0d3ddd, 0x201a4237, 0x67a9f633, 0x1414a485, 0x416403c1,
  151654. 0xb6f6a916, 0x60afd447, 0xdac6f790, 0x95f94930, 0xbd3b9d82,
  151655. 0x685ff94b, 0x51cadf0f, 0x5c8f98fc, 0xb13b7489, 0x9559c88a,
  151656. 0x5f18fcc8, 0x31377c66 },
  151657. { 0x7dcfb35f, 0x35c5de09, 0x01cc36f8, 0x2dccca9f, 0x7576cb63,
  151658. 0x7e93e85d, 0xf7b4b375, 0x0c2dd48a, 0xb09a19b5, 0x9d95cd4f,
  151659. 0x71bfe607, 0x752ed159, 0x2596dad2, 0x439880cf, 0x69e90a6f,
  151660. 0xe52efb53, 0x03d3e60a, 0x44097663, 0xa95070e0, 0xfcf364fa,
  151661. 0x05624dd2, 0xd8f993b6, 0x00d5e467, 0xb35a9824, 0x0c8f4524,
  151662. 0xe289d024, 0x648a0179, 0xef45423c, 0x587edabd, 0x3a5fd695,
  151663. 0xa11e5271, 0x3dacc50c },
  151664. { 0x6499ae4c, 0xcb3e4f94, 0x7053c527, 0xa46dcbe1, 0xbe782e8a,
  151665. 0x807f5ce9, 0xd8481e45, 0xb6c64d28, 0xaa286fd0, 0xf35e4518,
  151666. 0xdf1cdb49, 0xf7b7b9ba, 0xaec23eaf, 0xf3fb6210, 0xb9bfd2fb,
  151667. 0x0a9ba385, 0x8807f3a0, 0xe51a0d53, 0xb17b2842, 0x7ab24404,
  151668. 0xf9dd9f0a, 0x6fd57687, 0xf3e9df64, 0xcd1efdb4, 0x60df194d,
  151669. 0x5dd2df7a, 0xe069df05, 0xbed3f2c3, 0x23248a31, 0x469b7561,
  151670. 0x694744f7, 0x866949e1 },
  151671. { 0x3f4ab07a, 0x3a9a0da5, 0xf54a6fbf, 0x2cd6f333, 0xb23cf290,
  151672. 0x0c92e921, 0x848e3d58, 0xc9581c3e, 0xd3b218ab, 0x93af1fbd,
  151673. 0x066cb4d7, 0x38598ea1, 0x990c03a0, 0x5001394e, 0x7d0877b5,
  151674. 0x3b664b1e, 0xd74c7091, 0xd79db1bb, 0x4e2d5dd0, 0x852d4435,
  151675. 0x3329db82, 0x0d2b841b, 0x7b96d480, 0xfa844eb0, 0xc295dc46,
  151676. 0x37a50569, 0x94f7ec4e, 0xc2d38373, 0x5b083177, 0xdc3884ff,
  151677. 0x8b1fa598, 0x574352b8 },
  151678. { 0x0d5d7ce9, 0xed2193f7, 0x0b487eaf, 0x3c19fd26, 0x7be65fd0,
  151679. 0x7c44ab59, 0x78270d56, 0xdd9da860, 0xbaa70198, 0x8a84ec00,
  151680. 0x285985df, 0x2ec27e49, 0xde2028d8, 0x996ccaf0, 0x61c2201d,
  151681. 0x4e7648c7, 0x091c19eb, 0xa96335bc, 0xf0d6782b, 0x253a3a69,
  151682. 0xd2946493, 0x3f204340, 0x099f6873, 0x444521a1, 0x6996011a,
  151683. 0x5fcbcc09, 0xf853a94e, 0x3884d5d8, 0xd3b6a3a1, 0x2418c624,
  151684. 0x06ae3c4f, 0x3e431af2 },
  151685. { 0x83d381f1, 0xf967d939, 0xd0c033c3, 0x36501aae, 0x54410768,
  151686. 0xbf3af4d0, 0x5093a6d3, 0xa86d1598, 0xd92f2900, 0x43ae0741,
  151687. 0x36f0b755, 0xfeb2afa6, 0xaa456d6f, 0xd090a6a3, 0xaefdb646,
  151688. 0x336a4fda, 0x1a942f7d, 0xfd1bfe44, 0x851ee41e, 0x7fc2a3ed,
  151689. 0x11e935c5, 0x4f1c9686, 0x53bbb343, 0xcd577666, 0xad896c2a,
  151690. 0xf26931ba, 0x86bbfa41, 0x8a0fbbd1, 0xa203cef1, 0x1c3d7d82,
  151691. 0xe2664d35, 0x6dad3f15 },
  151692. { 0x12ec35a1, 0xd1940b7d, 0xe7dfb128, 0x6219c5b6, 0xf13321d5,
  151693. 0x2cc278c6, 0x33c58eb6, 0x5e76904a, 0xd9903c43, 0x15090f55,
  151694. 0xc3d96a19, 0x061bc926, 0x8c0acba7, 0x974a9f03, 0x7198b21b,
  151695. 0x7a414021, 0xf8958c6f, 0xb069599d, 0xbebd0129, 0x517f2f1d,
  151696. 0xdf3a8dc3, 0x1109a613, 0x672375c5, 0x08e58448, 0x9383d2d3,
  151697. 0x56590ba4, 0x0bff837c, 0xfc3ee7c6, 0x27d2d55f, 0xc87a5390,
  151698. 0x5f517a3f, 0x2438e9d4 },
  151699. { 0x8815af3c, 0xc4a45308, 0xf3c9bed5, 0xe55f1a32, 0x97b65ddf,
  151700. 0xaef1cdc9, 0x12e51eb5, 0x61c61d94, 0xe63f2490, 0xbd0dac54,
  151701. 0xd0b3e231, 0x6f14429c, 0xf1da6010, 0xf737c3c2, 0x6bbc4fb1,
  151702. 0x7150e04b, 0x1be281cb, 0x205b4c89, 0xd7701f5b, 0xf1b4633c,
  151703. 0x2a513490, 0x8b33ef46, 0x68f1f7f2, 0xddb47c73, 0xbd416b67,
  151704. 0xf4ada511, 0xff795bb3, 0x9d2a97cd, 0x96200e67, 0x00a8b7b2,
  151705. 0xafe30e01, 0x13f39011 },
  151706. { 0x7bd0c827, 0x3dd296ef, 0x4a29ff46, 0x506110f3, 0x1c9a515a,
  151707. 0xf8793068, 0x268bca77, 0xde8d8045, 0x998045df, 0xcbb83024,
  151708. 0x68c0e584, 0x3f90d710, 0x263b6062, 0x2a838ca8, 0x535c5d0b,
  151709. 0x293bb5e7, 0x56415110, 0xceea99d5, 0x1bbda005, 0xfe311ad0,
  151710. 0xa4d8d018, 0x2497e0bf, 0x1cf2b866, 0x33dd77a0, 0xd8c4ba8b,
  151711. 0xbc075b73, 0x722b7bc9, 0x298466d4, 0xcbda1b0b, 0x17a7ce24,
  151712. 0x680703b6, 0x458d4b6b },
  151713. { 0x4d54d8b2, 0x8a26a20e, 0x4d320a0d, 0x05a5696e, 0xf994f700,
  151714. 0x698b5858, 0x2f6549a8, 0x7a4adc3c, 0x3694d00d, 0x1812e819,
  151715. 0x730402bd, 0x46b9b000, 0xa1b36410, 0xe10a1449, 0x99230220,
  151716. 0xeae95ea5, 0x1b4820c3, 0x3efc2e9b, 0x85c9eb8a, 0xfe5b5cb5,
  151717. 0x97847064, 0x21ae0319, 0x8f27d49f, 0x68ef0b70, 0x2f72556b,
  151718. 0x3259ef18, 0x624db01a, 0x00ae0457, 0x5668f95c, 0x628e3b06,
  151719. 0xb6fbbf91, 0x5f13f5fa },
  151720. { 0x3a9b0dc6, 0x7c6ed9ae, 0x6f883ec8, 0xaea1bde9, 0xea8b3677,
  151721. 0xea66bf88, 0x9a66e3ab, 0xdefa6abc, 0x68217ffd, 0xc4d3317b,
  151722. 0x290df05c, 0xf741c8f2, 0x7d11674e, 0x1f0fdf17, 0xc35989ca,
  151723. 0xfdf0ece7, 0x6b9c482d, 0x0eed92df, 0x55bf1ca7, 0x73713e66,
  151724. 0x25cec99c, 0x90acb290, 0xe803e69c, 0x37c9e3a2, 0x17713a1a,
  151725. 0x7c0a3c53, 0x6f5a174d, 0x350dc565, 0x05f802f6, 0x11625a44,
  151726. 0xa37ba4a2, 0x2196495d },
  151727. { 0x13142680, 0x00cb2fd3, 0x65d14cf4, 0xab9e91d7, 0xdfe2669e,
  151728. 0xc6a0ceab, 0x0ae22bc5, 0xbeefce58, 0xcb6ec250, 0x3c2b7986,
  151729. 0xd738f1ff, 0x84adb1a2, 0x516ec8ec, 0x9709bc28, 0x8e8f7db5,
  151730. 0xf3693129, 0x95b197f9, 0xc48efc6b, 0x9aaaa404, 0x9ff10952,
  151731. 0x144154b0, 0x2c3c8cbd, 0x427f3435, 0x33ef7bc3, 0xd21897c1,
  151732. 0x04a17940, 0x6ce548a0, 0x5aa0c47d, 0x3d56fa62, 0x2971cea7,
  151733. 0x04475f08, 0x93ad0eb0 },
  151734. { 0x988a9963, 0x7a0b6967, 0x6515e8dd, 0x61e477f7, 0x3b6b50f2,
  151735. 0x6274e386, 0xd33922de, 0x63a9b8d5, 0x687a5b3d, 0x3c38d3fb,
  151736. 0x1302e323, 0x18f6f09c, 0xe02fcccf, 0x254c05c3, 0x26e662f7,
  151737. 0xc04ed0b7, 0x143fe079, 0x1d5646b8, 0xc9016c8c, 0xef8a9448,
  151738. 0xf823d797, 0xe5674c4b, 0xbccde451, 0x0586f72f, 0x4417eade,
  151739. 0xc5fc88d5, 0x576e588d, 0x2b952209, 0x5844d1f9, 0x4408dd42,
  151740. 0xea41c034, 0x73f8c3f0 },
  151741. { 0x5df763dd, 0x89534fc8, 0x3ac71836, 0x3b1427f3, 0x6e8f15a0,
  151742. 0x0db5be17, 0xcb20888e, 0x1d390944, 0x857caea6, 0x7804c9ad,
  151743. 0x519f7bf3, 0xaa584428, 0x293aa8cf, 0x626eecf1, 0xea36a015,
  151744. 0x749e0d98, 0x3321edcd, 0xefff6dae, 0x28b791cc, 0x963deea6,
  151745. 0x2d16e361, 0xa14e0552, 0xb15ae206, 0xa2e058fc, 0xfca325e4,
  151746. 0x0f268745, 0x21341a8a, 0x7cf9d407, 0x7caa51b8, 0xdfed25d9,
  151747. 0xadbedd75, 0x0108ae39 },
  151748. { 0xa9e88f63, 0x54d178f3, 0xab0c7325, 0xaa05b11e, 0xe261d8a6,
  151749. 0x773a53e6, 0x8d0b91c8, 0x24db7dae, 0xe9bb004d, 0xde10b073,
  151750. 0x54e3090b, 0xfc8befe7, 0x0cc69c89, 0x16af0599, 0x9d59511a,
  151751. 0xddc83803, 0x46c5dafc, 0xc3f65b99, 0x1ee0a599, 0xfbbe4be8,
  151752. 0xfb3a9b17, 0x88891e36, 0x445dad00, 0x0c9aad75, 0xd5097e1f,
  151753. 0xdffc46ab, 0xac85a4e1, 0x8848089b, 0xa0c45233, 0x348bb42f,
  151754. 0xeb13c1df, 0x807c06d8 },
  151755. { 0x98ee0ef6, 0x00a969ec, 0x8bb7b7af, 0xba9d5483, 0xa02f8fdb,
  151756. 0x24484c92, 0x8b70557c, 0x7bdb201a, 0x60ad1af2, 0xe59343e4,
  151757. 0x998c95fb, 0x53a9a942, 0xda861d3b, 0x974db3de, 0xed399c0e,
  151758. 0xce1525c9, 0xf72109bd, 0x89b56881, 0x998211a4, 0x08ff7d15,
  151759. 0xef0f275a, 0x5df76b3a, 0xfa2f358b, 0x93f180f7, 0xc39b0634,
  151760. 0xaac4ffcf, 0x17583b53, 0x2692c626, 0xb55399fc, 0xb2fdfa36,
  151761. 0x99607a61, 0x16424c6c },
  151762. { 0xdd2744a9, 0x5dd65c55, 0xfe3af418, 0x2544c1c2, 0xefe8b089,
  151763. 0x32c82e99, 0xa9df691a, 0x30b7ab25, 0x9be99674, 0x98384550,
  151764. 0xcaf2d122, 0xbcecd258, 0xbcc77272, 0x88ae4098, 0x4b8efa0c,
  151765. 0xd4396141, 0xed64d12c, 0x44ff67b9, 0x2e7f3404, 0xa9e655e4,
  151766. 0x45b0e9eb, 0x3d16fc45, 0xf03ded28, 0x474a3e14, 0xacccb85c,
  151767. 0xa3c9adff, 0x7253a51b, 0x3dfe6bc1, 0xfb5831b1, 0xdddaf4b9,
  151768. 0xa4f4478a, 0x5544e602 },
  151769. { 0xbaa80b4f, 0x897c5313, 0x63bdc8ef, 0x0122716f, 0x7b42c5a8,
  151770. 0xae2742db, 0x0883308c, 0xe9d9e1e9, 0x2d341ab1, 0x352c8c3f,
  151771. 0xed945870, 0x163d0500, 0xc290d9d8, 0x8349dd73, 0x1f6c7d29,
  151772. 0x2053c5e0, 0xcb42033c, 0x83107446, 0x09d09af1, 0x76c88bd2,
  151773. 0xb2794681, 0xd0f70e6e, 0x19b1b540, 0x720b59de, 0x22994b43,
  151774. 0x80b7ecdc, 0x2dec53cf, 0xc1a4cdce, 0x1ed60f42, 0xdd7d3edd,
  151775. 0xe241d261, 0x5735995c },
  151776. { 0xa0237056, 0xdc4ba3fb, 0x33ab3388, 0x6856c164, 0x271ec612,
  151777. 0xc01eebbd, 0xe3031bec, 0xabdeb033, 0x6118a1f5, 0x4eee4419,
  151778. 0x5b600f33, 0xec497421, 0x08868773, 0x1b7185cf, 0x7c1b7dfd,
  151779. 0x7b0c46cd, 0x4a4c5e89, 0xd143b2da, 0xbb1ff94d, 0xdb9a5984,
  151780. 0xc9cf3465, 0xac3904e4, 0xeace64c9, 0xf8729bc0, 0x768ad99a,
  151781. 0x5cc22821, 0x8a9540c2, 0xbbd3b081, 0x049a6917, 0xe468ed5f,
  151782. 0x3ec45ef0, 0x885486df },
  151783. { 0x4bdff464, 0x6a942c93, 0x25a7b451, 0x3db2719f, 0x325be324,
  151784. 0xccb0070b, 0x19fe3339, 0x2055a31b, 0x241ee8ff, 0xaca69ae8,
  151785. 0x55ef8def, 0x7607dd08, 0x1a1b73c6, 0x9e24960f, 0x71d36810,
  151786. 0xbcb0e8a2, 0x6885e6b9, 0x29e11aa2, 0x185eae19, 0x98b5d0ab,
  151787. 0x0f81f91c, 0x1a0b96e4, 0x994fc503, 0x4d0e8bcf, 0xf119d6e0,
  151788. 0x33d81697, 0xaaa4ce0c, 0x29083287, 0xc91ff9d7, 0xc5dd4d3e,
  151789. 0xd4ab962d, 0x31cecfe8 },
  151790. { 0xfc8b21e8, 0x437bfd9a, 0xb19436df, 0xe5dd32b3, 0x921c36a0,
  151791. 0xfe5902d4, 0xa3d0fa90, 0x8e9de84d, 0x5bb523bd, 0x9663e6ad,
  151792. 0xaecd6975, 0x9800a23f, 0xb4fbb59c, 0x1009c0d9, 0xc9d20ff1,
  151793. 0x839aa7bd, 0xecd6fa3d, 0xf502f66d, 0xc5516ca9, 0x480ed4fb,
  151794. 0x6c742ac4, 0x65ffa5f6, 0xff3252f8, 0x2b7c7945, 0x75d9cb3d,
  151795. 0x72fefc05, 0xd6d6f1d2, 0x11b0863b, 0x9a6a4ec3, 0x5d8f3cf0,
  151796. 0xda2547b3, 0x6961b46a },
  151797. { 0xcb35e2ac, 0xd07b587e, 0x57af14d9, 0x1ed5546b, 0xdb28a04c,
  151798. 0xeca17a5b, 0x709d54f0, 0xa1f91d44, 0x9c6f400e, 0xa6e719fd,
  151799. 0xfb8ce190, 0x4e4b88ed, 0x246e3fd2, 0xf9781edd, 0xb655af5d,
  151800. 0xd67120e6, 0x93413ca7, 0xda782d1d, 0x9707fa21, 0x697e20a2,
  151801. 0x54e84123, 0x1eb51f32, 0x36051f9f, 0x2e254d9e, 0x73ce5be9,
  151802. 0xddaec42b, 0xcd3f794f, 0x89a9a32e, 0x0781aad9, 0x1964e22f,
  151803. 0x53755212, 0x6a63a90c },
  151804. { 0x3d7acbbb, 0x76554e00, 0xb74f6108, 0x2c01668a, 0x388c519b,
  151805. 0xe4a29672, 0x3eb94d4f, 0x01667714, 0x0cd6d2f6, 0x086a3cdf,
  151806. 0x7b370f7f, 0xf8658021, 0x5a4d3e7c, 0x658880c1, 0x5ba3f4a1,
  151807. 0xd6ed5816, 0x5ca471dd, 0xabcc7813, 0xe844a576, 0x809bf074,
  151808. 0x6ea502ea, 0xa53a81b3, 0x0e021ed3, 0xc20b9307, 0x8617f165,
  151809. 0x8c27f892, 0x8235cd0b, 0xa5476446, 0x82552961, 0xffc89ffd,
  151810. 0xd151d90e, 0x51ed4a22 },
  151811. { 0x449701b4, 0x37d6963a, 0xbb27caf2, 0xea8d91a3, 0xb572965f,
  151812. 0x3ef9be15, 0xdb50bf7d, 0x75a7a055, 0xce643b9b, 0xfd67480e,
  151813. 0x6ceb5d5e, 0xf2a60d2d, 0x5ed7c897, 0x68fc320c, 0x28ce685f,
  151814. 0x41c53cf6, 0x7106615e, 0x0e29711f, 0x23500ecc, 0x7a872138,
  151815. 0x6c29fe48, 0xaf0a9260, 0xe1ef9712, 0x93df3f2a, 0xd2d169bf,
  151816. 0x0d5f6fb1, 0x74a9793c, 0xeb7afe26, 0xe9f49256, 0x4173d94a,
  151817. 0x2b8b5ce5, 0x2d6951bc },
  151818. { 0x904e222e, 0xdd007d9f, 0x86f4e109, 0x333f248f, 0x8f429eee,
  151819. 0xd4994e8b, 0xcfc77518, 0x29573415, 0x0b0f42f1, 0x6e7fea3a,
  151820. 0xc2743519, 0xc795cb7d, 0x711e71a0, 0x820a8f66, 0x2b874f55,
  151821. 0x83d95d9c, 0xe70e1627, 0xd4b64d78, 0x8b92a742, 0x924353f5,
  151822. 0x447b5e6d, 0x322048b1, 0xbcf931a0, 0x0bad730c, 0xa7af2268,
  151823. 0x75c4d089, 0xb83b93f9, 0x464904c1, 0x165b3aee, 0xa24eba02,
  151824. 0xe08cc5f0, 0x65c48e78 },
  151825. { 0xde222c22, 0x1a1c73ce, 0xfcea23b4, 0x5683d8cd, 0xb2143b06,
  151826. 0x0301cb14, 0x59fcec77, 0x284adf8f, 0x31204cef, 0xfb1c581c,
  151827. 0x94735107, 0xf54d3eee, 0x4d3188c0, 0xdbf67f0b, 0x10f18d12,
  151828. 0x76a3f2d1, 0x07d3e013, 0x3809fa28, 0x25e7ece0, 0xf06f0a46,
  151829. 0xb2895d2e, 0xd82867ed, 0x08b0553a, 0xe106f489, 0xef245445,
  151830. 0xe2280fa6, 0xa8d9a3cb, 0x402d5785, 0xd438ba2d, 0xf63dd9ff,
  151831. 0x7a6b226f, 0x36b5cd2c },
  151832. { 0x545679a7, 0x87ff4e20, 0x4520c750, 0x64d80b41, 0x9b459cd8,
  151833. 0x90a357fa, 0xc85af1a3, 0xa19eaf39, 0x8d935a5e, 0x0d475d79,
  151834. 0x781a678a, 0x74501983, 0x0cc2e810, 0x74839779, 0x2f412244,
  151835. 0xc6a21d11, 0x36a51a37, 0x8d0e85f9, 0xeaa74df8, 0xff50151e,
  151836. 0x93cf99c4, 0x14e182a7, 0x376a9ab6, 0x45593df1, 0x522389ff,
  151837. 0x18f73caf, 0xf7445e8a, 0xd27cc960, 0x39a51dc8, 0x0692f4c5,
  151838. 0xdb39bfd8, 0x08d7c144 },
  151839. { 0x3ecca773, 0x809c0d96, 0xd48c2156, 0x87ea9192, 0xdb6bd641,
  151840. 0xf0eccd74, 0x2a678cdf, 0x77312374, 0xd1587b7e, 0x7a966d8b,
  151841. 0x6130a4c6, 0xf3c1a101, 0x5fce17bd, 0x7cc6e838, 0xa8de7aa4,
  151842. 0x95e95bb8, 0x898308e3, 0x3fe1e8b5, 0xe347694a, 0x0197243e,
  151843. 0xbb0cd2bf, 0xf3fe9c42, 0x0f9b2b49, 0xb5905264, 0xc7367d1f,
  151844. 0x4c385e8b, 0xb5ee147b, 0x1d3050ae, 0x04004ad9, 0x8e2c3879,
  151845. 0xbab70202, 0x5f2aa8ee },
  151846. { 0x1266524b, 0xe208d464, 0xd0a19f66, 0xb7bf3880, 0xda106ebf,
  151847. 0xa5aa685e, 0xe642dd46, 0x0a69e8d3, 0xc682e4d6, 0xef349c61,
  151848. 0x0fcb534c, 0x26f6ee3b, 0x05eb67b8, 0x7daba127, 0x18be05f6,
  151849. 0x2babb27e, 0x8e2d85d1, 0x959afcba, 0xe2d9d386, 0xedcf2d1a,
  151850. 0x1ea6f06e, 0x59dc52e6, 0x866e5ae8, 0xc28278b4, 0x02bcd3c7,
  151851. 0xd9ff0340, 0x784be82f, 0xe884ac76, 0x83c9f224, 0xa3164980,
  151852. 0xb46ff949, 0x62501a98 },
  151853. { 0xad264086, 0x563f7d9a, 0xa5e0e4bd, 0xca6a33db, 0x8c8d3d67,
  151854. 0xe8253002, 0x46e64b19, 0xa288dac8, 0x20aa4536, 0xfa3c9197,
  151855. 0xed553eac, 0x8130c9b0, 0x2ea8abd3, 0x622806e0, 0xceccfe77,
  151856. 0x52fbf54d, 0x4f0d1b70, 0xbd9a8e31, 0xd59b1741, 0x519d2133,
  151857. 0x9a6fea8a, 0xfd74101c, 0xb5c4eb10, 0xd1acf7a0, 0x91f9da5e,
  151858. 0x78499b73, 0xc0dea586, 0xabaa4c49, 0xa1f3531a, 0xcc9c5f73,
  151859. 0xfd3fc665, 0x497b15fe },
  151860. { 0xf45568e9, 0x8a56cbaa, 0xc7192a6f, 0xf491a0fe, 0x9ab2539a,
  151861. 0xdbb03dd3, 0x4ac37da9, 0xc86522f8, 0x02a0f5b4, 0x8c8cdba2,
  151862. 0xa29c539f, 0x8109fc75, 0xca90f02e, 0x9cd06d31, 0x3e216dbf,
  151863. 0x8f31f044, 0xba3ebd91, 0x99aa68ac, 0x42c007f4, 0x2a80d0d2,
  151864. 0x86a9b7ce, 0xdd8dffbf, 0xd6308edc, 0x405d3e84, 0x068012ca,
  151865. 0xdafa33fe, 0xedea1071, 0xc2eebd13, 0x2ff637e6, 0xb7ae7e5c,
  151866. 0x9e514cb7, 0x18d46a6c },
  151867. { 0xa78b7802, 0x868cbb22, 0x497cbaf4, 0x0745ddb2, 0x42ae8add,
  151868. 0xc4eb2f3e, 0xb4ceb4e4, 0xac0abcda, 0xa325fd40, 0x2e0d8325,
  151869. 0x13ac7345, 0x6cfe0571, 0xb14171b9, 0x7407a788, 0x6da7a52b,
  151870. 0x70eb0603, 0xd85176ac, 0xab0b36f9, 0x7c2954f3, 0x14109d29,
  151871. 0xdcd705ad, 0x370de9c8, 0x7bb5e751, 0x3f0db5cd, 0xa06e708c,
  151872. 0x45f93d41, 0x7e93050d, 0x10d54f8a, 0x5a38fef9, 0x69e6f8e4,
  151873. 0xd3f62e40, 0x55044601 },
  151874. { 0x06cb9cc9, 0xd1c5c910, 0x41d00014, 0x542074d7, 0x11236fb8,
  151875. 0x7cd8663e, 0x29ad5f82, 0x39721ffe, 0x2951fc83, 0x1d21fbfa,
  151876. 0x400d144f, 0x1cde06e7, 0x91792e6b, 0x9042596b, 0x29ad5166,
  151877. 0x3365c8e5, 0x9aeefe98, 0xe2220e85, 0x70c2aee3, 0xbcb53189,
  151878. 0x9ff100bc, 0x477ca3db, 0xf532973f, 0x27074176, 0x9a2bd01b,
  151879. 0xa12118ac, 0x3dd79f93, 0xf3425209, 0xc6f5d7db, 0x563a8ff7,
  151880. 0xd7b0ec4f, 0x0da313fc },
  151881. { 0x15aa2557, 0x37125a8c, 0x00893e9c, 0xca21d70c, 0x67b8a823,
  151882. 0x48713994, 0x7cb0042a, 0x0d3e9a74, 0xc9e2ce18, 0x2d2bf4ff,
  151883. 0x049aeac2, 0xd5531a0d, 0xf03d0660, 0x4d29a616, 0x1f1b7f00,
  151884. 0x473d50d6, 0xca3de50c, 0x3af0ecbb, 0x09c28f27, 0xe2959bea,
  151885. 0xf8704664, 0x6d7c2ea0, 0x731083ef, 0xadfae4e1, 0x941c2554,
  151886. 0x50940c26, 0xa1162d03, 0x44167410, 0x1e82290e, 0x620230d8,
  151887. 0xdb414acc, 0x63630be8 },
  151888. { 0x8a7d2e41, 0xbf8d5222, 0xeb62f879, 0x49e75823, 0x6c402d89,
  151889. 0x1b4d33dd, 0xde2c59ad, 0x883e04d6, 0x49b9dc38, 0xbf3f38f4,
  151890. 0xb4b70c4c, 0x9d997d18, 0x13cea045, 0x1f69b20c, 0x58e2606d,
  151891. 0xca3d7025, 0x261d1b79, 0x3d4fd977, 0x5a1436fa, 0x56aeafa8,
  151892. 0xbb443c07, 0x369b3e98, 0xe558f6be, 0xfce5186c, 0xf8ac8f89,
  151893. 0xeb0cd478, 0xd5e5aa72, 0x68074f37, 0x68544eb0, 0x295845c0,
  151894. 0xf16688ed, 0x306a9871 },
  151895. { 0x634ec136, 0xbc451e9d, 0x0e6f658f, 0x1edf27ca, 0xc0db4120,
  151896. 0xa9be0152, 0xc5bfee67, 0x87b6ef20, 0x9a2d6023, 0x35283238,
  151897. 0xc7afb899, 0x60e564d8, 0x0ac9c2de, 0x4af22bc0, 0x82a9d22b,
  151898. 0x28e6f631, 0xf532701b, 0xc075c701, 0x82075f91, 0xf6d418f8,
  151899. 0x1beaa511, 0xf9fa628d, 0x6e72a13d, 0x551e7a17, 0x77f4c01c,
  151900. 0x9306215b, 0x93c9d588, 0x71aba731, 0x58e57cd4, 0x6443ebe0,
  151901. 0xe8103e37, 0x2833ac41 },
  151902. { 0x8da5ec5c, 0x7e564b86, 0x1c08db24, 0xac3d9da8, 0x8c57a728,
  151903. 0x9d7c1f0b, 0x9d343dc2, 0x3512afe7, 0xfdc60339, 0xb438e4cf,
  151904. 0xdcfa1941, 0x7d5a2700, 0x27320449, 0xd5f323f8, 0x1393c6e6,
  151905. 0x1b87a58e, 0x04baa431, 0xecb68bd1, 0x4722b4d7, 0xc09c1c5a,
  151906. 0x206b5faa, 0xf42faa97, 0x9976327e, 0xe1dcbcd6, 0x087787d9,
  151907. 0x655ba9e4, 0xde5c0191, 0xbd59c757, 0x0bcf3538, 0x673020ed,
  151908. 0xa49d6303, 0x120cd454 },
  151909. { 0xcab0f9ee, 0xebfdb8f4, 0x2cce58ee, 0xbc003ef0, 0x5a8d0665,
  151910. 0x9b6a6841, 0x9b957774, 0x642ed3a6, 0x4721ab5c, 0x3de487f0,
  151911. 0x21a4f0d3, 0xef2ff380, 0x29dbddcd, 0xbd16f558, 0x0e93dff2,
  151912. 0x2ef05b4b, 0x0bc9aec1, 0xde1faa12, 0xd467fa92, 0x66dae2c2,
  151913. 0x5eb33e34, 0x758daf64, 0x8f0103cb, 0xa67ad9f6, 0x9be02430,
  151914. 0x151f693a, 0xeb4054bc, 0xd5698496, 0x7019336e, 0x8ef1677e,
  151915. 0x7fdeea3e, 0x021cfd16 },
  151916. { 0xdf5c36f3, 0x5c73715f, 0xd64ad254, 0x703bde37, 0xf2cf7713,
  151917. 0x55368d10, 0x0f3993c8, 0x1e5ec7b7, 0x304ae4ca, 0xfdb16776,
  151918. 0x3d3bb18b, 0x0d8f717e, 0x66343d5a, 0x5267073f, 0x156008b5,
  151919. 0xfaeb52ef, 0x224a470f, 0xb97ad5f9, 0xed2ab51a, 0xaf86e391,
  151920. 0x9974302c, 0xdc0c7e57, 0xfd0ae28a, 0xc88fa817, 0xbf8ed59c,
  151921. 0x807c22df, 0xeb128bb6, 0x5dedc231, 0xa20595a3, 0x71edcd9c,
  151922. 0xc73cf78e, 0x07265b46 },
  151923. { 0xbd66232f, 0x73dd99f0, 0xc4027716, 0xc59aaf89, 0x5b860fc4,
  151924. 0xaf826dfa, 0x7a943f3b, 0x239ea8aa, 0x523c428d, 0x0e0e1b1a,
  151925. 0x6973b95a, 0x55ea0e3a, 0x2557753b, 0xea399caa, 0x06957b1f,
  151926. 0xf8adf72f, 0x3bd34302, 0x0389f341, 0xf8a43a97, 0x333f27d0,
  151927. 0xadaf796f, 0xcd9c0c08, 0x49c12aa2, 0x6dcca49b, 0x7a0ac6e9,
  151928. 0xdd88deee, 0x0644080e, 0x8f47575d, 0x0cc2f4bd, 0x6e9d667d,
  151929. 0x31d1496c, 0x36c5754b },
  151930. { 0xf323d84b, 0x9120046e, 0x7e789c4f, 0xa6991122, 0x921b8055,
  151931. 0x4b0eaf4e, 0x8079974e, 0x6339844a, 0x740f8c79, 0xc905466a,
  151932. 0xcd6def49, 0x1c18d0f7, 0x4b23e4ba, 0x5297da6b, 0xc41800c5,
  151933. 0x1c09dff3, 0x37ef6777, 0x6c49075b, 0x50513ded, 0xa94c3a40,
  151934. 0x6b0b1705, 0x3d6742e9, 0xc48af5ae, 0xc0784494, 0xc95822de,
  151935. 0x40c01532, 0xc164d94f, 0xa2ddade5, 0xa2975eb5, 0xfc8a8ac9,
  151936. 0x1946944e, 0x06fbf861 },
  151937. { 0x3f45aa97, 0x2d65338e, 0x1d040feb, 0xd83b58c8, 0x0fdef8b9,
  151938. 0x05fef59b, 0xe4d7417c, 0x7beb071a, 0xb30a1a23, 0x982b61f5,
  151939. 0xfb65bd03, 0x4c5f2a2a, 0x5cbf6bf3, 0xe40abc9d, 0xf06612a5,
  151940. 0x422c326d, 0x9571ae28, 0xc921e69d, 0x23d3434e, 0x7c88b10b,
  151941. 0x9da07933, 0x96d2e957, 0x3619cf4d, 0x833d46a1, 0xd95eefa1,
  151942. 0xd9d19653, 0xa03e8f0e, 0x2a7d8411, 0x04bb5ab1, 0x5e642953,
  151943. 0x1f0fa9ea, 0x5e9ca0fd },
  151944. { 0x197c5dc4, 0x5bd54571, 0xe78a95a2, 0xe2da40bf, 0xffdb0eb2,
  151945. 0x65fb9efc, 0x0d17467c, 0xe952dc2c, 0xc758c6a3, 0xc1fc9c7b,
  151946. 0xd4034a9a, 0xfc79562c, 0x61f64b56, 0x26e36fbe, 0x1e84728b,
  151947. 0x6adc4b9e, 0xa8f9ac8a, 0x7f165fd3, 0x03e3e013, 0x7bc93a45,
  151948. 0x656478e3, 0xeacc5513, 0x064ddc77, 0xd3391717, 0x76936914,
  151949. 0x75b318dc, 0x362424a6, 0x69b1f1c7, 0x49955f34, 0x8cc2045b,
  151950. 0xc6836af8, 0x940622b3 },
  151951. { 0x0d997973, 0x4710ccb7, 0xd3f8f115, 0x3b29625d, 0x5b97abd5,
  151952. 0x8cf0c4d5, 0x673e14a5, 0xc6321e0a, 0x3d262246, 0x0541af9d,
  151953. 0x6fc83b11, 0xde6d8754, 0xf01652a4, 0x47e97da8, 0xad9802b6,
  151954. 0x0f82b3a6, 0xae9c44b2, 0x69aa4075, 0xced2bf77, 0xaf3f5de2,
  151955. 0x497a40da, 0x1ef1ea8a, 0x3c23ba9c, 0x2e0f8608, 0xf190a2c8,
  151956. 0xd8a998a4, 0xcfde3368, 0xe2b49c8c, 0xbde6bd71, 0xb9f49824,
  151957. 0x785bedb6, 0x80bb1664 },
  151958. { 0xfd145cb5, 0x05e575fe, 0xac5e6883, 0x155ee561, 0x8793b273,
  151959. 0x461e70cf, 0x133b2338, 0x9f1553de, 0xa2a7ba07, 0x2fb9e0c3,
  151960. 0x3e7086fa, 0xc3bfd6a8, 0x8bb4cb93, 0xb6ba8500, 0x76f82dbd,
  151961. 0x0b66d789, 0x54eb49ff, 0x7d5a6ff6, 0x1f20b322, 0xcd65d237,
  151962. 0x54e29cdc, 0x79ea49c2, 0xcb118ff9, 0x64975963, 0xcc58000b,
  151963. 0x969598dd, 0x110c779c, 0x95107918, 0x63b85a35, 0xedfc1548,
  151964. 0x41212350, 0x077ba5ea },
  151965. { 0xcdd86f61, 0x0b3a38d3, 0x0502a0ab, 0x43121445, 0x806d0272,
  151966. 0x1912edc5, 0x8a32f10f, 0x01dc1f98, 0x0e80c760, 0xbb1d31d1,
  151967. 0xf464e8b3, 0xd46ec7e5, 0x9abf49ee, 0xd569af36, 0x2cdade77,
  151968. 0x9d286ea7, 0x45ad5920, 0x2be7020d, 0x6299ae7f, 0xabe5236e,
  151969. 0xd3f55c07, 0xc93179bd, 0x52350e80, 0x8138995a, 0xaff07586,
  151970. 0x0901265c, 0xf4739653, 0x5b3c81b2, 0x9bc77d21, 0xbaf7581d,
  151971. 0x4591a2e2, 0x6b2006df },
  151972. { 0x965b1bc1, 0xb2fe50a8, 0x962bb4fd, 0x931f536a, 0x000e7f99,
  151973. 0xd5718d33, 0x53d5125e, 0x84728f25, 0xd2125caf, 0x4f8a6184,
  151974. 0x357f679e, 0x54f1a701, 0x1531c05a, 0x70a9f40c, 0x6fa8b775,
  151975. 0x10d0cb97, 0x9dc12ce9, 0xb476f41e, 0x2755f894, 0x5c8d7a75,
  151976. 0x625741a4, 0xd6c12e10, 0xc917b16c, 0x262a6fb8, 0x38d6b0a0,
  151977. 0x24d116e6, 0x32c38e83, 0x849540c0, 0x66868afc, 0x855b911c,
  151978. 0xbd26b550, 0x53217ea6 },
  151979. { 0x259f52b4, 0xfc840473, 0xe621146c, 0x968da9cb, 0xcacbd26e,
  151980. 0x964eb85e, 0xe4a54344, 0xab7daa2d, 0x381a4ff7, 0x6dc3b848,
  151981. 0x41c815ef, 0xa07a96b3, 0xc3d4b1e1, 0xc4fae9e8, 0x42ce9ea8,
  151982. 0x0f938d1e, 0x35cc052f, 0xa727dacc, 0xe9a06f07, 0xc81e01c9,
  151983. 0x4a6d65a1, 0xa9e08dcb, 0x6044a9a6, 0xf8e2d173, 0xf2bd295b,
  151984. 0x99893dd0, 0xf9781b12, 0xa08d3379, 0x61830ac2, 0x64bd6001,
  151985. 0xd9adbeef, 0x0386931e },
  151986. { 0xd09885a5, 0xd0d7abb3, 0xe355bb07, 0xed9d2b67, 0x536ebaed,
  151987. 0x3bc238cf, 0x699ce4d6, 0x61ca2e78, 0x111594cd, 0x354ff447,
  151988. 0x03316ad2, 0x55cbe709, 0x49fff5c4, 0x418679fd, 0x0f9c6c40,
  151989. 0x75bacd75, 0x2972721a, 0x677edc88, 0xe5ef502f, 0x82596887,
  151990. 0xbf320e0e, 0x459e9367, 0x8bbdccb2, 0x81ce36ef, 0xb766863d,
  151991. 0x1ba097fc, 0xd58c6db8, 0xcd3a21d6, 0xb4a8748b, 0x0e4967cd,
  151992. 0x15041c20, 0x2caaf749 },
  151993. { 0x6ed20424, 0x44f98006, 0x22471545, 0xb3e4ea23, 0x781a8c86,
  151994. 0x268ed1a5, 0x7ae5b70b, 0x48d0ab75, 0x356d3982, 0x6ca8b320,
  151995. 0x2df31fa4, 0x9ce8e681, 0xd925dcf2, 0xb909d232, 0xf56723de,
  151996. 0x302c8f78, 0xabac96f9, 0x11725d69, 0x57d1a170, 0x656a47ca,
  151997. 0xc18a2be7, 0x6bb5d511, 0xad50d9d9, 0xb56e45f1, 0x70b05518,
  151998. 0x36e886e2, 0x09d8ff91, 0xc7c71f3d, 0x9350361e, 0x65a1bbe2,
  151999. 0x45fe3bd8, 0x86d7f532 },
  152000. { 0xb0bf719a, 0x99f16eb6, 0x8bc3d913, 0xb6975098, 0x26cd01b4,
  152001. 0xfae50e52, 0x90898d1c, 0xd3e3ac54, 0x887ec666, 0x4da3b9db,
  152002. 0xfbea45b8, 0x58300644, 0x8355b058, 0x369f3bd9, 0x579bcc13,
  152003. 0x0fb239a8, 0x6e2bd811, 0x4f5b4539, 0x24198fd2, 0x007f3baf,
  152004. 0x8837d51d, 0x68a676db, 0xeae75b16, 0x68eeea62, 0x3db6083c,
  152005. 0x5ffe5f94, 0x7d836c5a, 0x52c94d0f, 0xcbc1ff85, 0x5a4c3c6f,
  152006. 0x86c0b4dd, 0x682a55e3 },
  152007. { 0x587495aa, 0xc8f235a4, 0x34c7245d, 0x2276026c, 0xb75a46e3,
  152008. 0xd6ae0cc5, 0xecc3e5e7, 0x890d3965, 0x14296629, 0x1b13342f,
  152009. 0x8a877227, 0xc89927e6, 0x2324a68b, 0x1543f27e, 0x49cdc21a,
  152010. 0x6c447684, 0x1452d0ac, 0x9bc7fd4f, 0xff4b045c, 0x2cc30a31,
  152011. 0x852f7611, 0x415d46a0, 0xc6fdd7a6, 0xad737052, 0x7b4c7c91,
  152012. 0xdcecc3ab, 0x7688d70c, 0xd2cdf01b, 0xe40d3905, 0x054f2542,
  152013. 0xfefe4dcd, 0x02227fa6 },
  152014. { 0xb751948b, 0x1805efd9, 0xfdfd225d, 0x8efeed46, 0x4f2c8b22,
  152015. 0xcb128e09, 0x96f7c5e5, 0x9d1090bf, 0xb4cbeca0, 0x0959d044,
  152016. 0x8e08cb04, 0x21c955f9, 0x68fa4fce, 0xbc1f279d, 0x0710ae9a,
  152017. 0xb021e14e, 0x881167f4, 0x64d16e9f, 0xbbc9f1a5, 0xf5a5c22e,
  152018. 0xe3420eea, 0x5f3716df, 0xd5c4e843, 0x971eb915, 0x28ffba81,
  152019. 0x64fc55fc, 0x7dd37578, 0x3427e54d, 0x15ebc7d0, 0x446e6a62,
  152020. 0x29269778, 0x547e249a },
  152021. { 0xa1ffda27, 0x4706868a, 0x7955cf50, 0xb4e6cdcc, 0x0a63f3d8,
  152022. 0xf65151e1, 0x9de5e70a, 0x5b4127ea, 0xf9342823, 0x3d2c09ba,
  152023. 0xaa2f7d51, 0x18c99d83, 0xddeec025, 0xa0c5bb1d, 0x03dcf1ce,
  152024. 0x7ffddf84, 0x616fdeda, 0xe57e4d29, 0x7932a1f0, 0xd2456569,
  152025. 0x3191d4e3, 0x7475e0e8, 0xc220218b, 0x3479bea1, 0x8bcb2505,
  152026. 0xfceb5c90, 0x3c6132e6, 0x1c685cea, 0xbfe6c1eb, 0xc42dc745,
  152027. 0xd2b08eea, 0x45a41cc0 },
  152028. { 0x4dbbf0e1, 0x3ea9b2c7, 0xa17cf70e, 0x41ff962f, 0x5eeb4c66,
  152029. 0xdc1ea758, 0xa9beb17e, 0x4f5412d2, 0xa285741a, 0x2c9e4f52,
  152030. 0x984fd11f, 0x93df7da4, 0x0df3184e, 0xb2afbddc, 0x2421e375,
  152031. 0x96323d25, 0x49df781e, 0xc87be1e4, 0x3d589bea, 0x145601ed,
  152032. 0x28fff6dd, 0x0f0bd9bd, 0x8a0f298c, 0x2d3259d4, 0xd88e6944,
  152033. 0x362d7a77, 0xb6ac2af6, 0xa84c06b6, 0xd087da02, 0xba850ac9,
  152034. 0x42ee40c8, 0x128763c9 },
  152035. { 0xacbac178, 0x29a80f07, 0x34b08f6e, 0x7cc20044, 0x70feded2,
  152036. 0xe9631d14, 0x86615767, 0xb2115da3, 0xcb088548, 0x7c75f5c4,
  152037. 0x9a2e8e03, 0x5b29d213, 0x8b881752, 0xfe9fda66, 0xc1de7ebc,
  152038. 0x3f1d8d88, 0x03218123, 0xb476565e, 0xb1c995f3, 0x07365561,
  152039. 0xb13eb71b, 0x2160cb18, 0x99b3a0eb, 0x7e8da513, 0xb20fcd74,
  152040. 0x5e8ca1f9, 0xb4126d72, 0x6a7e0067, 0x68bb637f, 0x1e8204b7,
  152041. 0xfc4f74d2, 0x75e96bcc },
  152042. { 0x0d19716e, 0x189d1fdc, 0x7c384525, 0xdf585058, 0xea987d2a,
  152043. 0x64a846d1, 0x6c07150f, 0x12b6bf83, 0x4d6fd5b7, 0x91d85d46,
  152044. 0x4f53f55f, 0xa9788836, 0x81509129, 0x60083bd8, 0xea876f48,
  152045. 0xa7672683, 0xc15b2489, 0xe80b2e7a, 0x42d1d992, 0x985ef8d2,
  152046. 0xcf3de492, 0x9c57b029, 0xb1487627, 0xfe02f83c, 0x8ae5b687,
  152047. 0xaeba4fe4, 0x5d6b8196, 0x8a86f09b, 0xa16e523d, 0xd88f566b,
  152048. 0xba268949, 0x309a6e9a },
  152049. { 0xbdfbe97a, 0xef27ee50, 0xb8c50c4d, 0x1a5fe70f, 0x7fe09f5c,
  152050. 0xcc7beb01, 0xbed36cc5, 0x8fa15a85, 0x7550ed3a, 0xc0c3acdb,
  152051. 0xeb908681, 0xc581ef87, 0xc49d5ccb, 0xa15b3362, 0x1fa264e8,
  152052. 0x0fbb1714, 0x8e1eee88, 0x267f8d8f, 0x21c2b63d, 0xd31ccfd6,
  152053. 0x53be7efd, 0x924dbe7d, 0xdb2a358a, 0xd42e877f, 0x75d68ac1,
  152054. 0xcf9673c7, 0x714fea55, 0xe35978fd, 0x5769b202, 0xeeb36653,
  152055. 0xd7593789, 0x0458258a },
  152056. { 0xa042dbdf, 0x5df71a74, 0x5779dfa2, 0x2d405857, 0x0d2e6657,
  152057. 0x0e66cba7, 0xca2e892e, 0x285d6745, 0x0f0e6b5f, 0xf56a8def,
  152058. 0xa30767c3, 0xe0ee851d, 0x43346b9c, 0x98c05658, 0xd6b3c742,
  152059. 0xb35fce26, 0x39777e00, 0xc0895bff, 0xe7b6d886, 0x83c8f6a6,
  152060. 0x4f02904b, 0xbee14843, 0x2e84ec34, 0x7f74915b, 0x96d10991,
  152061. 0xbaaf663c, 0xe41facc0, 0x004b8757, 0x6f86c029, 0xa2b880e5,
  152062. 0x95b77358, 0x53f4a3e0 },
  152063. { 0x89fc48e7, 0x11bb08ce, 0xafab5aeb, 0xba60c577, 0xa0c1cb5a,
  152064. 0xf06bcbf8, 0x79757cb6, 0x7d2efaea, 0x76319160, 0xe26d90b1,
  152065. 0x2b77b7a9, 0x42aa1ab6, 0x285df2bf, 0x38eec0cd, 0xf3a8f7f0,
  152066. 0xd35947f5, 0xfc1cb5b5, 0x97c8dc0e, 0xc45845cf, 0xfeb8cca0,
  152067. 0x249e26f2, 0x16e8d989, 0x483ed89a, 0x7c264e6d, 0x51d91073,
  152068. 0x13a3f145, 0x305e99f0, 0x8501562e, 0x6908d563, 0xaaf98d74,
  152069. 0xd723d236, 0x0a99e653 },
  152070. { 0xabbc0559, 0x23536f46, 0x9aa1a160, 0xc163067b, 0x0c1681b5,
  152071. 0x229fd229, 0x1378e907, 0x61254be1, 0xab793a2d, 0xc60ff57a,
  152072. 0x466552db, 0xa6f2df8b, 0x8c170a36, 0x9ad31893, 0x29b74d9a,
  152073. 0xc5cd9abe, 0xf7848523, 0xcf747273, 0x0d0e3063, 0xc126a93a,
  152074. 0x4248e3d8, 0xfe2021e3, 0x8323ddfa, 0xd97343ee, 0x332639e7,
  152075. 0x9f768775, 0x75325548, 0x9650fc31, 0x3eebf7ea, 0xb595dbd1,
  152076. 0x010fcbc0, 0x3a95cb45 },
  152077. { 0x39d7ff2e, 0x954e68cb, 0xc1d5c48f, 0x8dd1cb4b, 0x7169438a,
  152078. 0x02a92c77, 0x91cad8ce, 0x7965c0b0, 0x32cd08d2, 0x0c5798ab,
  152079. 0xa6902bda, 0x1a5bc3c3, 0x5186d218, 0x545d0925, 0xd27e64db,
  152080. 0xf0077cdb, 0x8cd092da, 0x0157caa4, 0x24532ab3, 0x2a2fa3a0,
  152081. 0x41ccaba3, 0xa5fb639b, 0x4744aee6, 0x01702dc1, 0xcdba93da,
  152082. 0x485bb436, 0x329784f1, 0x93597f66, 0xdad672c3, 0x5d713c1d,
  152083. 0x030b7245, 0x366d222e },
  152084. { 0x573ea5b2, 0xd50b4875, 0xa90da44d, 0x0fce401b, 0x7a1a0310,
  152085. 0x7b53fa65, 0xcf114460, 0x722a80a5, 0xa538bf49, 0x0b8ebf05,
  152086. 0xd32acd21, 0xae141147, 0x7b5ad07d, 0x6692712c, 0x3f48ca07,
  152087. 0x6dc5fee7, 0x2b8a78d8, 0x98ed1499, 0xdd2f1759, 0x4e8b3145,
  152088. 0x5f971b8e, 0x43408de1, 0xadf1b368, 0x055ea6dd, 0xe5932b7e,
  152089. 0x4bb76e73, 0xd30893fd, 0x44287153, 0x0661bfda, 0x173dccd2,
  152090. 0x79defd25, 0x9072ba99 },
  152091. { 0x9620ea39, 0x474de4dd, 0xc831cee8, 0xfbf1649f, 0xcd3a9c43,
  152092. 0x0b0e8bb1, 0x3f3df1d5, 0x6a38286f, 0x8f0ec9b3, 0x4ed072b3,
  152093. 0x729c09e3, 0xa6e4c987, 0x8ad12242, 0xea3e8ac6, 0xfbdfa5ba,
  152094. 0x6ae0e22b, 0xb0a0f592, 0x56171ecf, 0x6b871f8d, 0x33b2886d,
  152095. 0x35e11bda, 0x6b19bea9, 0x7f0f153f, 0x4d815a40, 0x7d6c02ee,
  152096. 0x7e608d97, 0xb6a88f46, 0x7e8f23d9, 0x439d1654, 0x26ac9652,
  152097. 0x35546c29, 0x8d92c6bd },
  152098. { 0xabeb0ff7, 0xb3e0d7ce, 0x3e0e42f8, 0xfbe35254, 0xde808499,
  152099. 0x57d1b226, 0x1cd44bc3, 0x9ece2e1f, 0x435cfee1, 0x1245adbc,
  152100. 0xf93f581c, 0x874ee840, 0xbda0b947, 0x916a779c, 0xfa57ae0a,
  152101. 0xabcc815a, 0xf0a621b0, 0x97adec2d, 0x81f90bdc, 0xbe6a502b,
  152102. 0x53bde63d, 0x54bf9de1, 0x78884c25, 0xa88fdabf, 0xcbbb5470,
  152103. 0x30aa52b1, 0x29053ef5, 0xf805396c, 0x8dd827ea, 0x8d43d898,
  152104. 0x5c1ae5c0, 0x4e4bec17 },
  152105. { 0xfcc09676, 0xbf8483a2, 0x19ea9a94, 0x457c4a3f, 0xd702a5dd,
  152106. 0xa6852ef3, 0x843fe7d8, 0xe7915fd2, 0x16e35158, 0x644bba98,
  152107. 0x9ed746f0, 0x8d1b95d0, 0xb90af0b5, 0x47704581, 0xd4fd135e,
  152108. 0x0bd4bc6b, 0xb4e833a5, 0xa6dce067, 0xff56a9a1, 0x2c0e8f30,
  152109. 0xec2c63fe, 0xa9c80800, 0x98f508a8, 0x449c20a5, 0x3292813a,
  152110. 0x02b94cb3, 0xec7e81a2, 0x647e3d28, 0xb4877677, 0x72e67d1a,
  152111. 0x6f9ded24, 0x7a4aa3f5 },
  152112. { 0xe27a0045, 0x559ef1ba, 0xb242cb50, 0xdc812d4f, 0x39cf8d24,
  152113. 0x23a478e4, 0x9b3f9c54, 0x97544fc5, 0xaffa1fcf, 0x5ac68132,
  152114. 0x34a2c83b, 0x74f8fee0, 0xcd3f4bb7, 0x96cc640f, 0xb0512ea6,
  152115. 0x775dce9d, 0xcdce381e, 0x67dca19d, 0xa9d3fe55, 0xc1eeb3f3,
  152116. 0x1a19274f, 0x38e0bf42, 0x28d69b12, 0x15992fb4, 0x9fd09df8,
  152117. 0x48fcebde, 0xb41ab5df, 0xdc9dfa4f, 0xc0a269c5, 0x0cbd7dc8,
  152118. 0xf7f0ade1, 0x60282a7b },
  152119. { 0xdceea2e7, 0x7c07e538, 0x3c42061d, 0x38a322c8, 0x4f1f6516,
  152120. 0x676828f9, 0xc7776a10, 0xf21b69fb, 0xb5e6b405, 0xc63a3417,
  152121. 0x91a7b642, 0x4c99f258, 0x2cad1440, 0x38692ca8, 0x00869bcd,
  152122. 0xf1e82ffe, 0x16fe466a, 0xc30b714e, 0x19019138, 0x5fb742f9,
  152123. 0x0fa516ae, 0xe90166d0, 0xd8c73a43, 0x5550f7ac, 0xfbc5c372,
  152124. 0x2d6a407d, 0x68cc39ed, 0xe47a7539, 0x4a5fbe70, 0x3fd286d9,
  152125. 0x23c6b942, 0x5f4ae9c7 },
  152126. { 0x53f4d561, 0xd96a2dda, 0x16da1992, 0x286d45d0, 0xfdd4b051,
  152127. 0x449a01fb, 0x9f2195ea, 0x25488a0d, 0xa37661b3, 0xc4151b0a,
  152128. 0xf9e5ee02, 0xb98c471e, 0xa8658817, 0xa4bca86e, 0x7a68fc0a,
  152129. 0xbbcadb87, 0x6b7366a9, 0x88b34649, 0x15661c2d, 0x32ee98d4,
  152130. 0xc901420c, 0xf5b3b4c6, 0x2f2752af, 0xa2352735, 0x510e4d9c,
  152131. 0x2f64ce73, 0xaca4aa80, 0x939a7f26, 0x401aa503, 0x9cd3e291,
  152132. 0xdc46afd2, 0x92a01423 },
  152133. { 0x1c2f7dbd, 0xe9f24be1, 0xb7d527fa, 0xda8c900f, 0x8648f128,
  152134. 0x963e25bb, 0x48141941, 0x9ab713e2, 0x7a6756fb, 0xe87f7d01,
  152135. 0x058d90bd, 0x274dd85e, 0x82566abd, 0x823fee7a, 0x74240195,
  152136. 0x9f6230d7, 0xacb5e46e, 0x04579f2c, 0x16a4c87e, 0x2a226263,
  152137. 0xd99b0857, 0x9ca19a43, 0xe488789e, 0x86dc2ba3, 0x9406c3bd,
  152138. 0xf960b5b9, 0x8960957e, 0x6f2c428b, 0x161c515b, 0x90748706,
  152139. 0xaa88cb9b, 0x0fc8fe1e },
  152140. { 0xfeb90f2d, 0x68ae1bed, 0xa48b1559, 0xf393bb3c, 0xf64e9635,
  152141. 0x2be62f9c, 0xf8be75c2, 0x354c2410, 0x5e6f7529, 0xbd7ea703,
  152142. 0x162cab31, 0xc264868e, 0xc860f3ff, 0xb1391e70, 0x1d89837e,
  152143. 0xdf367c75, 0x2bf32941, 0xe150b6b4, 0x78c1318f, 0x95e8f46e,
  152144. 0xa2c4b160, 0x2b3f1dab, 0x701afbf3, 0xc6ccf5ce, 0x5e8874c5,
  152145. 0x3ad27530, 0x5dc6dcbe, 0x39285e51, 0xd99892dd, 0x3c954d86,
  152146. 0xdfd3789f, 0x2d0ba862 },
  152147. { 0xb472e1af, 0xeacd8ee8, 0xb76abbcc, 0xeb354eae, 0xd0d93fbd,
  152148. 0x9b520bf8, 0xfe6fc706, 0xfccd60d7, 0xa4ee2f39, 0xa9353dde,
  152149. 0x9a81e51e, 0x5eb0925e, 0xd1366777, 0xee334da1, 0xd5354d69,
  152150. 0xc1d28c9f, 0x92a5ed54, 0xb9771755, 0xb7f70d81, 0x5d3e367f,
  152151. 0xa933ae7a, 0x7be7eeca, 0xe23cfbb7, 0x264cf1f9, 0x89497681,
  152152. 0x0d129f4a, 0x09b6235b, 0x705375a4, 0x48a376da, 0xccf64c75,
  152153. 0x4d41dbfc, 0x963c8712 },
  152154. { 0xde36a814, 0xbae290cb, 0x733b12b5, 0x9bdb0195, 0xf77fe0e1,
  152155. 0x0ebad867, 0x29720cea, 0x0a7d19fd, 0x9029ec72, 0x434d7651,
  152156. 0xbb51911e, 0x856aff17, 0xd80a7f60, 0xd0a25d9a, 0xf848c106,
  152157. 0xffca86af, 0x43ad749c, 0x53e8bdf9, 0xe3e696bb, 0xfb9e0284,
  152158. 0xeeee4215, 0x3eb6630a, 0x2ecf3c63, 0x9d8fbb9e, 0x4e00c0c0,
  152159. 0x71da4ffa, 0x5d57beac, 0xb296be59, 0xa8cec7ef, 0x1751fbad,
  152160. 0xff55d7bd, 0x2d03eb3c },
  152161. { 0x04f2ec1d, 0xeb16925f, 0x0d147ee2, 0xa878f276, 0xaad9d9e0,
  152162. 0x442df604, 0x3f71035b, 0x891df44b, 0x8cb95d5b, 0xc28272b3,
  152163. 0x5ee8ed23, 0x6f14efb5, 0x13b0f3e3, 0xf3c4460f, 0x6bd7335e,
  152164. 0x889f9bd7, 0xf755ba6e, 0x889ee771, 0xed219b6c, 0x626984fe,
  152165. 0xec2ee411, 0x2d44c737, 0x63efcd37, 0xb94385a2, 0x6637826b,
  152166. 0xd909321b, 0x3ee6b7a7, 0xc24f8a79, 0xa7cf61b7, 0xa3ca8d24,
  152167. 0xc54bacd9, 0x842e40c1 },
  152168. { 0xa661d843, 0x5a268ed6, 0x4f5b30cd, 0x02328cca, 0x1311e177,
  152169. 0x16e6fed1, 0xc6695967, 0x690decb4, 0x57b2e280, 0xbdac5bf6,
  152170. 0x1efe42d0, 0x827f82ca, 0xca5fca2f, 0xc554ec0a, 0xdde45506,
  152171. 0xac5276c1, 0xe3077513, 0xb7f4cb08, 0xcc8797cc, 0x8caf6d9a,
  152172. 0x0d9332d2, 0xd5964814, 0x285a409f, 0xcc6ae297, 0x6223d093,
  152173. 0x7773c2a5, 0x5128fc09, 0x2d5266ac, 0xbc31fe6c, 0xa596b7cb,
  152174. 0xcac91328, 0x0e63319a },
  152175. { 0xf0360ac2, 0xb5cd2fad, 0x285e605a, 0x86b660de, 0xe25b9b14,
  152176. 0x82c6cf10, 0xaa9ac554, 0x9d5fa38d, 0x526c070e, 0x3dfcf1b8,
  152177. 0x3fccc52d, 0x0379a96b, 0x0bfcc7f5, 0xe3659c29, 0x69d3e6a1,
  152178. 0x5b1a3db5, 0x9b7b42d5, 0xb41528b5, 0x9c22a006, 0x934defa4,
  152179. 0x9b4ce3b6, 0x90f38018, 0xb3abaf32, 0xb073bc04, 0xff8389e2,
  152180. 0x27a5a222, 0xffa5a35b, 0x0b7a9d51, 0x28e1a7c2, 0x4939ecef,
  152181. 0x1872705a, 0x88839da2 },
  152182. { 0x701ce29a, 0x56b66c30, 0x58981d50, 0x3acaf126, 0x105f9f21,
  152183. 0xd4dafc0c, 0x373e3d13, 0xfee571e6, 0xfa2ee3ca, 0xe7269c86,
  152184. 0xdd20385a, 0xf5cca64a, 0x3000e9ac, 0x217f2757, 0x0e7273ef,
  152185. 0xc934db47, 0x355b6776, 0x4294f4f7, 0x6fc05180, 0x1faa36b9,
  152186. 0xb052190b, 0x8f88b1db, 0xe9eaef52, 0x35791b90, 0xdb681b90,
  152187. 0xf37fb2eb, 0x4415c369, 0x39d0a51d, 0x1d2e21c9, 0xfc59cca7,
  152188. 0xa1f50c26, 0x64128cfe },
  152189. { 0xe8f5b0b5, 0xf03678a2, 0xd340f059, 0x5c7e249c, 0x93ca7cec,
  152190. 0x41440441, 0xbc83af98, 0x075ca346, 0xfaa8bbb0, 0xf39f0033,
  152191. 0xf38230f7, 0x3d18f0ed, 0xd448f345, 0x78dff00c, 0xd51aa475,
  152192. 0x849228c0, 0x30c928d1, 0xdd4e2708, 0x8f12cfd3, 0xc66ba686,
  152193. 0x88b3a206, 0x091049db, 0x016dae01, 0xd865d059, 0xe253e37d,
  152194. 0x4599e905, 0x7ce9871b, 0x322cf0c2, 0x174a132e, 0x014f54da,
  152195. 0xbdabcbda, 0x93634a09 },
  152196. { 0xa9a2e304, 0x62826b27, 0xc1a4c124, 0xc57e1866, 0x22381710,
  152197. 0x913ab832, 0xa9847cfe, 0x7e9b6b85, 0x2b5f46fd, 0x29655cf1,
  152198. 0x8038e66d, 0x7295572b, 0x6fa95eab, 0xe4cba601, 0xb9deda81,
  152199. 0xbbc11071, 0x3f1cf61e, 0x97f0009a, 0x373e0cfb, 0x5372777b,
  152200. 0xd139d63b, 0x302f909c, 0x4f87d78e, 0x1ed672da, 0xb4048763,
  152201. 0x362077a3, 0x9dcc22b2, 0xc408c32d, 0x26deeee7, 0x4b4c5bf2,
  152202. 0xbc06357e, 0x266cb467 },
  152203. { 0xb56363e8, 0x6faa4154, 0x3c1aa4db, 0x4b4fd078, 0x2b9e6597,
  152204. 0x14358dde, 0xfa004b84, 0x5b34ae3e, 0xf19911a6, 0xcf44b2ec,
  152205. 0xa536bf78, 0x55caa833, 0x8870dc95, 0x606e1eb9, 0x09f3511d,
  152206. 0xe3c3287d, 0x9d5cf364, 0x68b2f4eb, 0x63ab8c9e, 0xc154e892,
  152207. 0xc36ab611, 0x1548828e, 0xa1b7d120, 0x0932bfcb, 0x5315b8d7,
  152208. 0x7ee7b5bc, 0xf7473ac1, 0x782fd0d1, 0x3c8f2af3, 0xbcb029a8,
  152209. 0x52454ee1, 0x4b1d5a1b },
  152210. { 0x63d52c0c, 0x12fe5174, 0x188c099d, 0x3735525e, 0x360e3956,
  152211. 0x5c621563, 0xacfa5a43, 0x88b3f1ca, 0x797e8107, 0x90123a0a,
  152212. 0xb15e080a, 0xba31f6b5, 0xfca3dada, 0xd7de5e12, 0x0df511c8,
  152213. 0x3287361b, 0x65757d4e, 0x7cc800d4, 0x5207ec91, 0x10810f3d,
  152214. 0x30eea0e3, 0x0d4e56f1, 0x3ea5a2ec, 0xbbf7ee13, 0xbe6abbd0,
  152215. 0x6fc07762, 0x120bf619, 0xc831fdce, 0xb622d42a, 0xe07439fa,
  152216. 0x508e4b27, 0x8186b93f },
  152217. { 0x09312867, 0xc619d154, 0xbfaf7db4, 0x7e042c05, 0x1f5f5dda,
  152218. 0xc1cf1668, 0xa4fc3d82, 0x50aa5057, 0xce68b8fe, 0xed30ed65,
  152219. 0xbeb4d644, 0xecb01c0b, 0x831c0497, 0x7b5dc444, 0x9b7d9b1c,
  152220. 0x351e6a00, 0xd9477c91, 0x4bb863b9, 0x05d4110a, 0xaba65891,
  152221. 0x43580b7a, 0x30086cf4, 0x90be357e, 0xb139c076, 0x27b5214e,
  152222. 0x12bfff1a, 0x22c3ab57, 0x79cfc6d7, 0xf34a9bfa, 0x4743de57,
  152223. 0xc9ee2b2a, 0x0bf97e97 },
  152224. { 0xdda19e96, 0x96ec4ec8, 0x6c306e8b, 0x54ce18ea, 0x65f6918a,
  152225. 0x7e83612b, 0x0d9a0d99, 0x1ac6f68b, 0x62fdcc09, 0x98a697a4,
  152226. 0x95bc3e13, 0x65ce25f1, 0xb3939730, 0x1896ecda, 0x32f12806,
  152227. 0x9eb81a0f, 0x1d2dc7df, 0xd3d7416e, 0xad473599, 0xe22c7976,
  152228. 0x9f5ef439, 0x3de37a9a, 0x9e69d94e, 0x6b7ac0ab, 0x0a9d0bc8,
  152229. 0xe6bfa9e0, 0x5676f120, 0x576a870d, 0xfeaac23f, 0x3bd91bb4,
  152230. 0x3e40aabb, 0x8fe5482c },
  152231. { 0xce9a4d1e, 0x85ae67c2, 0x4f1d2038, 0x4c3eb803, 0x25d06192,
  152232. 0x5c6c8f3a, 0x308fb41c, 0x803de0ad, 0xe71c294e, 0x9961f5bc,
  152233. 0xf02eb0da, 0xdc62078d, 0xb64ae8b6, 0xc87ef515, 0x50b4d18f,
  152234. 0x69679f1e, 0x52199f43, 0xc5c009a1, 0x0f640a5f, 0xa7d484be,
  152235. 0x23dab566, 0x4c918bb1, 0x64275d2c, 0xa67c114c, 0xcad2ded6,
  152236. 0x95a913b9, 0x6b4b5c8d, 0x189ed18b, 0xb42d3bf6, 0x4aeb6206,
  152237. 0xbbc8bc3f, 0x3928c669 },
  152238. { 0xdacb4b64, 0xde4bea4a, 0xf26179a1, 0x03f62a44, 0x7a9112a4,
  152239. 0xf3aac94e, 0xd36f331e, 0x90448fbd, 0x407b85c4, 0x426042bc,
  152240. 0x2121b77b, 0x5ad8a596, 0x67cee984, 0x31674a4f, 0x4e3b2f0d,
  152241. 0x7fae8bbe, 0xa7c930eb, 0x681df6dd, 0xc259d0d4, 0xadeefa98,
  152242. 0xbea1c1fd, 0x1b14d9e6, 0x21d405d1, 0x3baadc8b, 0x73892754,
  152243. 0xf01dff93, 0xf071cde4, 0x81c35b3e, 0x9150d0d9, 0x1704d2e1,
  152244. 0x355134f6, 0x6ccc888f },
  152245. { 0x7ad7504c, 0xf8d36f0e, 0xf7959ddd, 0xbca3265f, 0xfede67aa,
  152246. 0x0dcd1ede, 0xbaebf32f, 0x1276f4ce, 0x014edcfc, 0x6825a6e6,
  152247. 0x99ad8eb7, 0x0b8c1a82, 0x09b8ce1e, 0x312024a9, 0x9cbd351a,
  152248. 0xcb8fd98b, 0xfab1e8be, 0xa4841378, 0x3973cacf, 0x17ed0f5d,
  152249. 0x259d5254, 0xa17e1484, 0x74b91393, 0x53d5b843, 0x1aca3ce9,
  152250. 0x8f792b21, 0xc8c0f815, 0x035ff110, 0xad4ed7bd, 0x6afa6357,
  152251. 0xb26faef9, 0x2f151980 },
  152252. { 0x29d2d439, 0x0c8631da, 0xbc039955, 0x121fbbc2, 0x6c05b75b,
  152253. 0x3e5a9792, 0xb6ce47ec, 0x6d6cf4c0, 0x9d88c658, 0xbaaa1767,
  152254. 0xf3355a17, 0x031db9e7, 0x0aef5a85, 0x8381e3d8, 0x15a31bdf,
  152255. 0xc71db290, 0x9498fd7d, 0x638f6b74, 0x13beeef6, 0x44edf3f9,
  152256. 0xf4ab67b3, 0xe6173271, 0xfd22df11, 0x3a202c70, 0x205c4e92,
  152257. 0xf7be0389, 0xa8eb9920, 0x1c219085, 0xbeb54aaa, 0x6c805ce8,
  152258. 0x0ac58d65, 0x354b05b7 },
  152259. { 0x7a9170e9, 0x7171e236, 0x4cad50cd, 0x01eec42d, 0x3cddccfb,
  152260. 0xffbe824f, 0xa66cae1a, 0xa73e8ce3, 0x965c7d01, 0xb7138a7f,
  152261. 0x5c3d971e, 0x00058e3f, 0x2ff0a72b, 0x52591ac3, 0xbbbce76f,
  152262. 0xa32fb5bc, 0xa9f81a18, 0xf3241ab8, 0xeca68630, 0xf31d3332,
  152263. 0x4482f13b, 0x847af9fc, 0xa4681be2, 0x6196e217, 0xe55efcf9,
  152264. 0x9938f932, 0x70acc705, 0x3e7dacb8, 0xcf09fac2, 0xd41be893,
  152265. 0xae3523a1, 0x48dc55c4 },
  152266. { 0xa5092193, 0x8e623826, 0x6898970c, 0xe46ec362, 0x25c9eb41,
  152267. 0x2f1356af, 0x83c7d245, 0x41780640, 0x97d00e38, 0x982def67,
  152268. 0xa512151c, 0x382eb6e7, 0x8af58869, 0x154e1077, 0x8a51cf02,
  152269. 0x18707075, 0x71313c58, 0xcdeba9f7, 0xba155904, 0x5d67b973,
  152270. 0x1d0d7b3a, 0x851c9f4b, 0x8b8af2cd, 0x19f29d71, 0x986b8d62,
  152271. 0xcb94ccff, 0xb93b9c33, 0x8725e24b, 0x66e38c68, 0x405ce4c5,
  152272. 0x0b6dc021, 0x5f6a8edd },
  152273. { 0x8f9a8690, 0x83704ca5, 0x2f76a407, 0x3f369766, 0x69201028,
  152274. 0xfbc12d8c, 0xbce3a4cf, 0x4cd58f16, 0x04aab26d, 0x7804664a,
  152275. 0x4ea457a8, 0x005cfbba, 0xb8a59794, 0x537951b3, 0x4fe1f739,
  152276. 0x4ca2b9e4, 0xdf325797, 0xe4428acd, 0x0ea243db, 0x648da342,
  152277. 0xf43ce01e, 0xcce6562b, 0xf27db490, 0x840f0421, 0x8bfb7cf0,
  152278. 0x156ccb70, 0x5a8797d3, 0x9b33480d, 0x9eb814bb, 0x2e12e07a,
  152279. 0xca7f87ac, 0x1ca65072 },
  152280. { 0x2b9d25a0, 0xfbb321cf, 0x40a746db, 0x66affdca, 0x59e368b5,
  152281. 0xc1c1530e, 0x7d80068f, 0x56ed1ea4, 0x5647dd68, 0x9b74d8fe,
  152282. 0x89b78da8, 0x1d96b507, 0x8bbe3391, 0x39b75243, 0x0d858c5f,
  152283. 0xef8d443e, 0x9646aa34, 0x4dd2db49, 0xe667543c, 0x7fad3bd1,
  152284. 0x68980985, 0xd0d710c0, 0x49facaba, 0x9f7aff32, 0x14f9a192,
  152285. 0x055dec1c, 0x1fb307a1, 0xaca66399, 0x35ffff64, 0xac44fd91,
  152286. 0xcbad3cee, 0x462cafb6 },
  152287. { 0xde3237dd, 0x1660a647, 0x82b87404, 0x95f735cc, 0xddfa55f8,
  152288. 0xf7879f59, 0x726b914a, 0x15ef043e, 0x1c93e298, 0x1875393d,
  152289. 0x6ef18331, 0xa1a2be74, 0x25a9a12b, 0x4e7e8dfc, 0xa9c3917f,
  152290. 0xdfefc97d, 0x0a2ebe41, 0xbc875d03, 0xa732d1cc, 0x0f75d235,
  152291. 0xd9baa6d3, 0x06fee7fe, 0x65f48576, 0xaa784fab, 0x513f83c0,
  152292. 0x23155e22, 0x3e8f9d13, 0xd2fb7718, 0xb546eafd, 0x2a291503,
  152293. 0x6cd93608, 0x1293c98c },
  152294. { 0x49d53b77, 0x72781251, 0x96eafac7, 0xa6ab403d, 0x4a36b711,
  152295. 0xb7d7c7db, 0x87e771c1, 0x8238c708, 0x33b37522, 0x495f6abf,
  152296. 0x8c87530d, 0xb0b0289c, 0xe77b111a, 0xca83cb86, 0xa1bd189e,
  152297. 0xbe1c0fb8, 0x1ae9d7c7, 0x58cfb2fb, 0x4940c3e8, 0xd05c23c5,
  152298. 0x74ad9107, 0x16e79e41, 0x064e7142, 0xa0a47f05, 0xfdfd614f,
  152299. 0xc6929cd4, 0x3946988b, 0xedb2584c, 0xe46f8fb1, 0x73e4b5f3,
  152300. 0x68ea94ba, 0x53b79aa1 },
  152301. { 0x44bbb6a1, 0x216fafce, 0x67821728, 0xd3a5bba0, 0xa9dd939a,
  152302. 0xef1e4b30, 0xf19efafe, 0x022eaf3d, 0x7b4ec014, 0xfed5abce,
  152303. 0x512c6738, 0x64968ee6, 0x29fe89a2, 0x23119869, 0x47397c05,
  152304. 0x0d539d8d, 0x234596c4, 0x6400bc54, 0x5346611d, 0xb9287f58,
  152305. 0xc9d5da0f, 0x04099903, 0xc83af2a8, 0xe5ef4997, 0x328151e1,
  152306. 0xc89dc01b, 0x58401104, 0x150fb4a9, 0xf3872c9d, 0x40a6f7d5,
  152307. 0x56c2e833, 0x8290d6d1 },
  152308. { 0xd8546946, 0xf84637c6, 0x69ec57fa, 0xda134a39, 0xd789007e,
  152309. 0xd42359a4, 0x0dc7b809, 0xb42557fe, 0x2d6784a9, 0xe62ae52d,
  152310. 0x0bcadb5f, 0xa2714ca6, 0x33aafca5, 0xcc208de6, 0xed967811,
  152311. 0x2380ed5c, 0xdb321660, 0x6e6b55e9, 0xa675235a, 0x1bead02c,
  152312. 0xb33fa0e1, 0x51cc6ef9, 0xf06a2a08, 0xfd223e26, 0xec47b3cf,
  152313. 0x00f332e1, 0xa0aa984e, 0x459f297b, 0xee952e14, 0x6fa1d969,
  152314. 0x304fabb0, 0x506ef1ab },
  152315. { 0x35bff163, 0x11b4eb27, 0xea9fa984, 0x7130b96f, 0x9deb27ce,
  152316. 0x66aceb3f, 0x9dd1c3d5, 0xa2daf1a5, 0xa73075aa, 0xf5090a7e,
  152317. 0xe3071b58, 0x36a6af39, 0xdf73ad9c, 0xa28d633d, 0xbdc89a16,
  152318. 0xdd354cac, 0xd4dcbc3c, 0xdfea3423, 0x379d92d1, 0x6eec74d2,
  152319. 0x8eed6765, 0xe14a456f, 0xfa8feb1f, 0xfabe7743, 0xb98fcbc7,
  152320. 0x1404ccf8, 0xf71a706e, 0x6ccd2fbf, 0x4d85c678, 0xdaaf3fdb,
  152321. 0x15200344, 0x415b7dbf },
  152322. { 0x7d8377a7, 0x97010586, 0xcb803272, 0x068a3d68, 0xf03a4c32,
  152323. 0xfd67d289, 0x93c8f290, 0x4bc7095d, 0xe9e5a2b8, 0x712fa13c,
  152324. 0x0feb9f3b, 0xfc6ac6c6, 0x6e0e54c2, 0x0cda36d9, 0x86320a01,
  152325. 0x45499751, 0x97f00f11, 0xf9318c91, 0xe6936508, 0x01dc4c3f,
  152326. 0x85f068aa, 0x769a2ef9, 0xa2b5511c, 0x3522cef0, 0xb4122e05,
  152327. 0x006965ed, 0xc175d43f, 0xfce0fafc, 0xec831d59, 0x525dc9bd,
  152328. 0xaf58879d, 0x1ec314f1 },
  152329. { 0x2c8310c2, 0x0663feef, 0x457e3f74, 0xaa7e14da, 0xe5346887,
  152330. 0x392b10fc, 0x637ec2c5, 0xcde4a38f, 0xb542f8df, 0x50773320,
  152331. 0xf7de1711, 0x341302f9, 0xae4b9bc6, 0x018b1c63, 0xdd2f9e6f,
  152332. 0xf001c46e, 0x26eccfa0, 0xd3bb0a97, 0x7746e0c7, 0xa931b99d,
  152333. 0xf5875aec, 0xe0c8b6f7, 0x96939c82, 0xbb32f17c, 0x3de5a664,
  152334. 0x765135d2, 0x52abfa6b, 0x71936cb4, 0x2dc105de, 0xad5cc08f,
  152335. 0x7fff5788, 0x17e91d12 },
  152336. { 0xb7e051ca, 0xbe92ced3, 0x19c776d4, 0xc644d4fd, 0x0086784b,
  152337. 0xc8ab4b52, 0xce9d6b31, 0x3ea66227, 0xd289e9c7, 0x395249a3,
  152338. 0xd12a19ee, 0x54509e65, 0x8c365aec, 0xa7bd4692, 0x77963e0e,
  152339. 0x354997e4, 0xb599732d, 0x0d765957, 0x91d4a3b6, 0x99584aeb,
  152340. 0x1deb3e28, 0x6e653ea4, 0x572571df, 0xca7c98ed, 0xb18ae1f9,
  152341. 0xf301a38f, 0x63f7b97e, 0x1629f7c2, 0xafc4a0d5, 0xdf242282,
  152342. 0x3ddd0c01, 0x118f3b4b },
  152343. { 0x7ad4762b, 0x74a0a0a8, 0x8c58d175, 0x1aef84da, 0x4cf76d86,
  152344. 0x16ff4960, 0x7e60d98b, 0xc0be8786, 0x3ecc1dba, 0x83637ffb,
  152345. 0x5dd6147a, 0xc244a609, 0x5b0846e5, 0xa3e17834, 0xe77a4c05,
  152346. 0x735eb686, 0xdf758695, 0x5bc18b4f, 0x1bdfe52f, 0x15618d0b,
  152347. 0x00715ba1, 0x878ecc0d, 0xc2dd617f, 0x1dbdbd1a, 0x21b61710,
  152348. 0x21d2b631, 0x44f593c2, 0x22ce8a79, 0x44f17024, 0x3b9b536a,
  152349. 0x8d03e727, 0x01d0a67c },
  152350. { 0x1e46533c, 0x7b964236, 0xfb88c2ae, 0xe9477990, 0xa42c4a18,
  152351. 0x019b5d16, 0xd83c7a45, 0x7135e81d, 0x4cb663e3, 0x74a69bdd,
  152352. 0xe76c0d63, 0x7b67ecdb, 0x11e68da6, 0x03d54521, 0xd2e8650a,
  152353. 0x596cceb5, 0x2af03b37, 0xcd572dfd, 0xfabd5952, 0x52364ba1,
  152354. 0xb4ed8569, 0x7f47d456, 0xc950d5d4, 0x5ad8b572, 0x486e2f84,
  152355. 0xcadd2dfa, 0xc56bb044, 0xdd527b43, 0x997c08e6, 0xc9adba24,
  152356. 0x7da6320f, 0x1b625b06 },
  152357. { 0x4fd8446d, 0x44dfaa7b, 0xaf6febeb, 0xc01b2f01, 0xfe8838b5,
  152358. 0xbf444388, 0xbba9758b, 0xf33c434f, 0x87156bc9, 0x2b971cba,
  152359. 0x1f49098b, 0x6b245e5c, 0x2b41c5dd, 0x87dcb534, 0x34d852d7,
  152360. 0xdb1f80c6, 0x2433da34, 0x6d6e3258, 0x3f7df0c2, 0xf6682065,
  152361. 0x360cb365, 0xc4ca567c, 0x9826656a, 0x321faac2, 0xbf069768,
  152362. 0x13f5ca6f, 0xa7076639, 0x15397921, 0x8400736e, 0xbdf14328,
  152363. 0x19fc948d, 0x333eca96 },
  152364. { 0xac775d81, 0x23337948, 0xd41dbbca, 0x38c2518f, 0xbcfce948,
  152365. 0x623c7a4f, 0x54703fe7, 0xaad36236, 0x13fb3b5b, 0x2b3a13a4,
  152366. 0x7f5c01f0, 0x5db3565a, 0x52359661, 0xd72408dc, 0x1d616e91,
  152367. 0x5a17f8e5, 0xcb25b999, 0x90c16eeb, 0x3393743e, 0xf35e8cf1,
  152368. 0xe54b64a7, 0x987da74a, 0x65cd449d, 0x557b322a, 0x37e7b15d,
  152369. 0x765082a5, 0xf2cd134f, 0x4d25c742, 0x4ccf0746, 0xae9d9c07,
  152370. 0x8728d135, 0x72fc2110 },
  152371. { 0xf96004c8, 0xa906b203, 0x458055ff, 0xd83f95cf, 0x55f35909,
  152372. 0xd77d5867, 0xe550c8ee, 0x4a9ea6fb, 0x55a06081, 0x91c8cca9,
  152373. 0xbce82062, 0x4a1fee78, 0x9a3df85e, 0xeb9ade06, 0x7d3de666,
  152374. 0xfbbdcf0c, 0x5d336d51, 0x228a391b, 0x5c2ffc3c, 0x760f8d28,
  152375. 0x2f7b165b, 0x1ee48de3, 0x56177040, 0x03803d84, 0x9deff9a0,
  152376. 0xe573f648, 0xa17e35a4, 0xe1a2738e, 0x8840a6c6, 0x238ef17c,
  152377. 0xb11ed92d, 0x480946f8 },
  152378. { 0xfd71f119, 0x84c747a8, 0x53eb3695, 0x19e65c5e, 0x6298587a,
  152379. 0x0e2f6786, 0xab18d6f4, 0x48a48899, 0xc630b8c0, 0xa1a99024,
  152380. 0x2caaf892, 0x84975096, 0xe20fd624, 0xc8869aba, 0x6c2b7dd4,
  152381. 0x3b72b04d, 0x0992f7d0, 0xe2775eb6, 0x7d06e684, 0x0089c06e,
  152382. 0xe4bbd007, 0xcb3b4361, 0x4ba846e4, 0xa1ae666b, 0x46464d9e,
  152383. 0xc01c2eb2, 0xc1f8539f, 0xf86f2be6, 0xcf68afc7, 0x16e8e8ae,
  152384. 0xc7386902, 0x8dab61fd },
  152385. { 0xd54d1d45, 0x42a5c903, 0xff4f9ba2, 0xacd4297e, 0x34d478b4,
  152386. 0x2d88b520, 0x08c4621a, 0x35b2ba2b, 0x34865402, 0xd3d239bb,
  152387. 0x911f32e6, 0x1de76aed, 0x3f06fdc2, 0x877f8bcf, 0x9ec51502,
  152388. 0x802714c1, 0xa590700d, 0xa10444eb, 0x31dcc957, 0x8694229f,
  152389. 0xb8169fed, 0x5ece77ab, 0x2caf080e, 0x55be8a15, 0xcbd7cef1,
  152390. 0x3eb21b14, 0x67b97ee1, 0x9def7ad1, 0x118f690c, 0xe03ca879,
  152391. 0xf99b29e7, 0x6f77e62d },
  152392. { 0xe40bbf59, 0xa271bded, 0x6401aad6, 0x177ba453, 0x73541cd1,
  152393. 0x1755e035, 0x4b71b02f, 0x3465b466, 0xa813359f, 0x22eb7113,
  152394. 0x6f38eac7, 0x9792a8fd, 0xff3bf3b5, 0x11aa012f, 0xf85c3fbf,
  152395. 0x99aafabf, 0x06c0cc42, 0x91e0a2ef, 0x773b7b3a, 0x314d5d57,
  152396. 0xd669840a, 0xae5e2e76, 0x2e5a8be6, 0x86136073, 0xc1cf5580,
  152397. 0xee6d7578, 0x68bed102, 0x2344e00f, 0x8184f0eb, 0x799d7886,
  152398. 0xc3d2cf80, 0x63819c91 },
  152399. { 0x7884b073, 0xca5392e1, 0xeb1267ea, 0x9ec3a1fc, 0x907038a7,
  152400. 0x3d07f5f0, 0xe4c47b70, 0xcb2ac07c, 0x1bf96b91, 0xf96664ee,
  152401. 0x2aea4fbf, 0xebf57589, 0xfade6500, 0x5aabf391, 0x171d1204,
  152402. 0xc5b3376f, 0xa0d3d81a, 0x1ff60c51, 0x976a844b, 0x10b2cfe7,
  152403. 0xbda6125a, 0xe131cc9a, 0x4ebd453e, 0xe0fc16d3, 0x504b6bc1,
  152404. 0xc0d0319a, 0x0a2f8cab, 0xe43a0be7, 0x55e49b47, 0xc80afeec,
  152405. 0x8265d7ee, 0x67d48d12 },
  152406. { 0xea2d56d6, 0x068d59a7, 0x27480a63, 0xd71abd0e, 0xae7366cd,
  152407. 0x6bd11db0, 0x07204ebc, 0xfbb639ca, 0xf77e6293, 0x89a242e7,
  152408. 0x75ba8c3d, 0xdee7ca2b, 0x64a2f9a8, 0x472ddc3d, 0x7561a010,
  152409. 0x84229df4, 0xc5b649d4, 0x95f62c85, 0x4dc927cd, 0xfdd56b1b,
  152410. 0x5ee60596, 0xfe8bb120, 0xabf29401, 0x3efcaa50, 0x10d1c184,
  152411. 0xd4900d0f, 0x28b01df5, 0x2cf113a9, 0x1f0e43f5, 0xa3d7ebc3,
  152412. 0xe8384dc7, 0x27950e38 },
  152413. { 0xe1d0fa79, 0xeab21ff0, 0x048b5de9, 0x4b9fd033, 0x2fe374cb,
  152414. 0x4c934689, 0x4eb21f6b, 0xbb4827fa, 0xa925e7e7, 0x46716f79,
  152415. 0x7dd4c531, 0x1442bf36, 0xd2e96ddf, 0x2073954c, 0x8502aa89,
  152416. 0x4e0141ae, 0x8eef6cc9, 0x8ee00e1a, 0x5880cdaf, 0x55ce8491,
  152417. 0x69628046, 0xff3aba5c, 0x5d15dfbf, 0x335cc4f8, 0x9f684f25,
  152418. 0xa7f0440c, 0xbb1e5bd8, 0xae80453f, 0xff2225ab, 0xa1c99813,
  152419. 0x79b25d71, 0x54ff7884 },
  152420. { 0xde40b068, 0x27c6ee30, 0xe6f3a51e, 0x9226465b, 0xfa3b21f6,
  152421. 0xe24a4604, 0xc0418115, 0x50a5a5ad, 0x8df90d2b, 0xe3285441,
  152422. 0xdcb0c00f, 0xbb74e58f, 0x4a2c08e3, 0xc68f1b3b, 0x0ccd9ec9,
  152423. 0x339df081, 0xb786ea9f, 0x915362dc, 0xc955aead, 0x28945e31,
  152424. 0x8b6a6c6b, 0xd6a2c01d, 0x3678a427, 0x069e82dc, 0x28c9302c,
  152425. 0x17875500, 0x9fa101e6, 0x8acda965, 0xee30b286, 0x4e4e4573,
  152426. 0x3f1830fe, 0x8adbad85 },
  152427. { 0x0969d524, 0x060ae11f, 0xf39bcc79, 0xf42fdaf7, 0x7cc1fcc2,
  152428. 0x3cec6766, 0xe2336d4f, 0x456b9cf2, 0x8e1c0f7f, 0x6aa1f5de,
  152429. 0x0984fb0e, 0xcdbc2ad2, 0x1b464b28, 0x4090cfa6, 0x1243f3ef,
  152430. 0x40d86f30, 0xcd5e87e7, 0x95b16ccc, 0x3026cd41, 0x403f168c,
  152431. 0x816c0730, 0xdbe386cb, 0x58407a1d, 0x14eb86f3, 0x1717e1af,
  152432. 0xf588b4f8, 0x66cbc96c, 0xb75c41a6, 0x027e71c1, 0xf342c1aa,
  152433. 0xc0945e5f, 0x73930036 },
  152434. { 0x22cdaf42, 0x954f757d, 0xf4181aab, 0x788b591d, 0xf5514f25,
  152435. 0x8b986819, 0xf18fd5bc, 0x69642e08, 0x022ceb91, 0x92b305d1,
  152436. 0x6a4f6985, 0x1715903e, 0x61179cae, 0x4bd7d69d, 0xd29c01aa,
  152437. 0xdacdfd5d, 0xd91108cc, 0x705ddd5a, 0x64ac8f15, 0x434ac7b1,
  152438. 0xb524632f, 0x61a514e1, 0x731fc447, 0x45b9e61b, 0xe0961b31,
  152439. 0xcf561348, 0x73eaf223, 0x9c28a967, 0xaa7c99d3, 0x5bd10182,
  152440. 0xe42965e2, 0x8bc6ec4a },
  152441. { 0xe7f2a32b, 0xd096e5c0, 0x09388a30, 0xff54800c, 0x401e360c,
  152442. 0x06fe437c, 0xbb6054a6, 0x6655fc9c, 0x8457aa6e, 0x510e1860,
  152443. 0x2b29b2b7, 0xa0acfca2, 0x51b7da61, 0x732483e3, 0x6be6c8ca,
  152444. 0xe31471ee, 0x8b65c9a1, 0xe565431c, 0x48d65cbb, 0xfc9ac3b9,
  152445. 0xae9b2aa8, 0xd308fc21, 0xaa60aa6a, 0xd6a7df0d, 0x982fc0d4,
  152446. 0x2844d96a, 0x5847a4d7, 0xab012c2c, 0xdceb8955, 0x2b3c8f71,
  152447. 0xbe9c7e15, 0x8e85437d },
  152448. };
  152449. /* Perform the modular exponentiation in Fp* for SAKKE.
  152450. *
  152451. * Base is fixed to be the g parameter - a precomputed table is used.
  152452. *
  152453. * Striping: 128 points at a distance of 8 combined.
  152454. * Total of 256 points in table.
  152455. * Square and multiply performed in Fp*.
  152456. *
  152457. * base [in] Base. MP integer.
  152458. * exp [in] Exponent. MP integer.
  152459. * res [out] Result. MP integer.
  152460. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  152461. * and MEMORY_E if memory allocation fails.
  152462. */
  152463. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  152464. {
  152465. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152466. defined(WOLFSSL_SP_SMALL_STACK)
  152467. sp_digit* td;
  152468. sp_digit* t;
  152469. sp_digit* tx;
  152470. sp_digit* ty;
  152471. #else
  152472. sp_digit t[36 * 2 * 32];
  152473. sp_digit tx[2 * 32];
  152474. sp_digit ty[2 * 32];
  152475. #endif
  152476. sp_digit* r = NULL;
  152477. unsigned char e[128];
  152478. int err = MP_OKAY;
  152479. int i;
  152480. int y;
  152481. (void)base;
  152482. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152483. defined(WOLFSSL_SP_SMALL_STACK)
  152484. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 38 * 32 * 2, NULL,
  152485. DYNAMIC_TYPE_TMP_BUFFER);
  152486. if (td == NULL) {
  152487. err = MEMORY_E;
  152488. }
  152489. #endif
  152490. if (err == MP_OKAY) {
  152491. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152492. defined(WOLFSSL_SP_SMALL_STACK)
  152493. t = td;
  152494. tx = td + 36 * 32 * 2;
  152495. ty = td + 37 * 32 * 2;
  152496. #endif
  152497. r = ty;
  152498. (void)mp_to_unsigned_bin_len(exp, e, 128);
  152499. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  152500. y = e[112] >> 7;
  152501. y |= (e[96] >> 7) << 1;
  152502. y |= (e[80] >> 7) << 2;
  152503. y |= (e[64] >> 7) << 3;
  152504. y |= (e[48] >> 7) << 4;
  152505. y |= (e[32] >> 7) << 5;
  152506. y |= (e[16] >> 7) << 6;
  152507. y |= (e[0] >> 7) << 7;
  152508. XMEMCPY(ty, sp_1024_g_table[y], sizeof(sp_digit) * 32);
  152509. for (i = 126; i >= 0; i--) {
  152510. y = (e[127 - (i / 8)] >> (i & 0x7)) & 1;
  152511. y |= ((e[111 - (i / 8)] >> (i & 0x7)) & 1) << 1;
  152512. y |= ((e[95 - (i / 8)] >> (i & 0x7)) & 1) << 2;
  152513. y |= ((e[79 - (i / 8)] >> (i & 0x7)) & 1) << 3;
  152514. y |= ((e[63 - (i / 8)] >> (i & 0x7)) & 1) << 4;
  152515. y |= ((e[47 - (i / 8)] >> (i & 0x7)) & 1) << 5;
  152516. y |= ((e[31 - (i / 8)] >> (i & 0x7)) & 1) << 6;
  152517. y |= ((e[15 - (i / 8)] >> (i & 0x7)) & 1) << 7;
  152518. sp_1024_proj_sqr_32(tx, ty, t);
  152519. sp_1024_proj_mul_qx1_32(tx, ty, sp_1024_g_table[y], t);
  152520. }
  152521. }
  152522. if (err == MP_OKAY) {
  152523. sp_1024_mont_inv_32(tx, tx, t);
  152524. sp_1024_mont_mul_32(r, tx, ty, p1024_mod, p1024_mp_mod);
  152525. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  152526. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  152527. err = sp_1024_to_mp(r, res);
  152528. }
  152529. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152530. defined(WOLFSSL_SP_SMALL_STACK)
  152531. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  152532. #endif
  152533. return err;
  152534. }
  152535. #endif /* WOLFSSL_SP_SMALL */
  152536. /* Multiply p* by q* in projective coordinates.
  152537. *
  152538. * p.x' = (p.x * q.x) - (p.y * q.y)
  152539. * p.y' = (p.x * q.y) + (p.y * q.x)
  152540. * But applying Karatsuba:
  152541. * v0 = p.x * q.x
  152542. * v1 = p.y * q.y
  152543. * p.x' = v0 - v1
  152544. * p.y' = (px + py) * (qx + qy) - v0 - v1
  152545. *
  152546. * px [in,out] A single precision integer - X ordinate of number to multiply.
  152547. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  152548. * qx [in] A single precision integer - X ordinate of number of
  152549. * multiplier.
  152550. * qy [in] A single precision integer - Y ordinate of number of
  152551. * multiplier.
  152552. * t [in] Two single precision integers - temps.
  152553. */
  152554. static void sp_1024_proj_mul_32(sp_digit* px, sp_digit* py,
  152555. const sp_digit* qx, const sp_digit* qy, sp_digit* t)
  152556. {
  152557. sp_digit* t1 = t;
  152558. sp_digit* t2 = t + 2 * 32;
  152559. /* t1 = px + py */
  152560. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  152561. /* t2 = qx + qy */
  152562. sp_1024_mont_add_32(t2, qx, qy, p1024_mod);
  152563. /* t2 = (px + py) * (qx + qy) */
  152564. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  152565. /* t1 = py * qy */
  152566. sp_1024_mont_mul_32(t1, py, qy, p1024_mod, p1024_mp_mod);
  152567. /* t2 = (px + py) * (qx + qy) - (py * qy) */
  152568. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  152569. /* px = px * qx */
  152570. sp_1024_mont_mul_32(px, px, qx, p1024_mod, p1024_mp_mod);
  152571. /* py = (px + py) * (qx + qy) - (py * qy) - (px * qx) */
  152572. sp_1024_mont_sub_32(py, t2, px, p1024_mod);
  152573. /* px = (px * qx) - (py * qy)*/
  152574. sp_1024_mont_sub_32(px, px, t1, p1024_mod);
  152575. }
  152576. #ifndef WOLFSSL_SP_SMALL
  152577. /*
  152578. * Convert point from projective to affine but keep in Montgomery form.
  152579. *
  152580. * p [in,out] Point to convert.
  152581. * t [in] Temporary numbers: 2.
  152582. */
  152583. static void sp_1024_mont_map_32(sp_point_1024* p, sp_digit* t)
  152584. {
  152585. sp_digit* t1 = t;
  152586. sp_digit* t2 = t + 2 * 32;
  152587. sp_1024_mont_inv_32(t1, p->z, t2);
  152588. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  152589. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  152590. sp_1024_mont_mul_32(p->x, p->x, t2, p1024_mod, p1024_mp_mod);
  152591. sp_1024_mont_mul_32(p->y, p->y, t1, p1024_mod, p1024_mp_mod);
  152592. XMEMCPY(p->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  152593. }
  152594. #endif /* WOLFSSL_SP_SMALL */
  152595. /*
  152596. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  152597. * double P.
  152598. *
  152599. * Calculations:
  152600. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  152601. * r.x = l * (p.x + q.x * p.z^2) - 2 * p.y^2
  152602. * r.y = 2 * p.y * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  152603. * v* = v*^2 * r*
  152604. * p'.x = l^2 - 8 * p.y^2 * p.x
  152605. * p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4
  152606. * p'.z = 2 * p.y * p.z
  152607. *
  152608. * @param [in,out] vx X-ordinate of projective value in F*.
  152609. * @param [in,out] vy Y-ordinate of projective value in F*.
  152610. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  152611. * @param [in] q ECC point - second point on E(F_P^2).
  152612. * @param [in] t SP temporaries (6 used).
  152613. */
  152614. static void sp_1024_accumulate_line_dbl_32(sp_digit* vx, sp_digit* vy,
  152615. sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  152616. {
  152617. sp_digit* t1 = t + 0 * 32;
  152618. sp_digit* pz2 = t + 2 * 32;
  152619. sp_digit* rx = t + 4 * 32;
  152620. sp_digit* ry = t + 6 * 32;
  152621. sp_digit* l = t + 8 * 32;
  152622. sp_digit* ty = t + 10 * 32;
  152623. /* v = v^2 */
  152624. sp_1024_proj_sqr_32(vx, vy, t);
  152625. /* pz2 = p.z^2 */
  152626. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  152627. /* t1 = p.x + p.z^2 */
  152628. sp_1024_mont_add_32(ty, p->x, pz2, p1024_mod);
  152629. /* l = p.x - p.z^2 */
  152630. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  152631. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  152632. sp_1024_mont_mul_32(t1, l, ty, p1024_mod, p1024_mp_mod);
  152633. /* l = 3 * (p.x^2 - p.z^4) */
  152634. sp_1024_mont_tpl_32(l, t1, p1024_mod);
  152635. /* t1 = q.x * p.z^2 */
  152636. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  152637. /* t1 = p.x + q.x * p.z^2 */
  152638. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  152639. /* r.x = l * (p.x + q.x * p.z^2) */
  152640. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  152641. /* r.y = 2 * p.y */
  152642. sp_1024_mont_dbl_32(ry, p->y, p1024_mod);
  152643. /* ty = 4 * p.y ^ 2 */
  152644. sp_1024_mont_sqr_32(ty, ry, p1024_mod, p1024_mp_mod);
  152645. /* t1 = 2 * p.y ^ 2 */
  152646. sp_1024_mont_div2_32(t1, ty, p1024_mod);
  152647. /* r.x -= 2 * (p.y ^ 2) */
  152648. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  152649. /* p'.z = p.y * 2 * p.z */
  152650. sp_1024_mont_mul_32(p->z, p->z, ry, p1024_mod, p1024_mp_mod);
  152651. /* r.y = p'.z * p.z^2 */
  152652. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  152653. /* r.y = p'.z * p.z^2 * q.y */
  152654. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  152655. /* v = v^2 * r */
  152656. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  152657. /* Double point using previously calculated values
  152658. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  152659. * ty = 4 * p.y^2
  152660. * p'.z = 2 * p.y * p.z
  152661. */
  152662. /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */
  152663. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  152664. /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */
  152665. sp_1024_mont_div2_32(t1, t1, p1024_mod);
  152666. /* p'.y = 4 * p.y^2 * p.x */
  152667. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  152668. /* p'.x = l^2 */
  152669. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  152670. /* p'.x = l^2 - 4 * p.y^2 * p.x */
  152671. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  152672. /* p'.x = l^2 - 8 * p.y^2 * p.x */
  152673. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  152674. /* p'.y = 4 * p.y^2 * p.x - p.x' */
  152675. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  152676. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l */
  152677. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  152678. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4 */
  152679. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  152680. }
  152681. #ifdef WOLFSSL_SP_SMALL
  152682. /*
  152683. * Calculate gradient of line through C, P and -C-P, accumulate line and
  152684. * add P to C.
  152685. *
  152686. * Calculations:
  152687. * r.x = (q.x + p.x) * c.y - (q.x * c.z^2 + c.x) * p.y * c.z
  152688. * r.y = (c.x - p.x * c.z^2) * q.y * c.z
  152689. * v* = v* * r*
  152690. * r = p.y * c.z^3 - c.y
  152691. * c'.x = r^2 + h^3 - 2 * c.x * h^2
  152692. * c'.y = r * (c'.x - c.x * h^2) - c.y * h^3
  152693. * c'.z = (c.x - p.x * c.z^2) * c.z
  152694. *
  152695. * @param [in,out] vx X-ordinate of projective value in F*.
  152696. * @param [in,out] vy Y-ordinate of projective value in F*.
  152697. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  152698. * to.
  152699. * @param [in] p ECC point - point on E(F_p^2) to add.
  152700. * @param [in] q ECC point - second point on E(F_P^2).
  152701. * @param [in] qx_px SP that is a constant value across adds.
  152702. * @param [in] t SP temporaries (6 used).
  152703. */
  152704. static void sp_1024_accumulate_line_add_one_32(sp_digit* vx, sp_digit* vy,
  152705. sp_point_1024* c, sp_point_1024* p, sp_point_1024* q, sp_digit* qx_px,
  152706. sp_digit* t)
  152707. {
  152708. sp_digit* t1 = t;
  152709. sp_digit* t2 = t + 2 * 32;
  152710. sp_digit* rx = t + 4 * 32;
  152711. sp_digit* ry = t + 6 * 32;
  152712. sp_digit* h = t + 8 * 32;
  152713. sp_digit* r = t + 10 * 32;
  152714. /* r.x = (q.x + p.x) * c.y */
  152715. sp_1024_mont_mul_32(rx, qx_px, c->y, p1024_mod, p1024_mp_mod);
  152716. /* t2 = c.z^2 */
  152717. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  152718. /* t1 = q.x * c.z^2 */
  152719. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  152720. /* t1 = q.x * c.z^2 + c.x */
  152721. sp_1024_mont_add_32(h, t1, c->x, p1024_mod);
  152722. /* r = p.y * c.z */
  152723. sp_1024_mont_mul_32(ry, p->y, c->z, p1024_mod, p1024_mp_mod);
  152724. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  152725. sp_1024_mont_mul_32(t1, h, ry, p1024_mod, p1024_mp_mod);
  152726. /* r = p.y * c.z * c.z^2 = p.y * c.z^3 */
  152727. sp_1024_mont_mul_32(r, ry, t2, p1024_mod, p1024_mp_mod);
  152728. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  152729. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  152730. /* t1 = p.x * c.z^2 */
  152731. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  152732. /* h = c.x - p.x * c.z^2 */
  152733. sp_1024_mont_sub_32(h, c->x, t1, p1024_mod);
  152734. /* c'.z = (c.x - p.x * c.z^2) * c.z */
  152735. sp_1024_mont_mul_32(c->z, h, c->z, p1024_mod, p1024_mp_mod);
  152736. /* r.y = (c.x - p.x * c.z^2) * c.z * q.y */
  152737. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  152738. /* v = v * r */
  152739. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  152740. /* Add p to c using previously calculated values.
  152741. * h = c.x - p.x * c.z^2
  152742. * r = p.y * c.z^3
  152743. * c'.z = (c.x - p.x * c.z^2) * c.z
  152744. */
  152745. /* r = p.y * c.z^3 - c.y */
  152746. sp_1024_mont_sub_32(r, r, c->y, p1024_mod);
  152747. /* t1 = r^2 */
  152748. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  152749. /* t2 = h^2 */
  152750. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  152751. /* ry = c.x * h^2 */
  152752. sp_1024_mont_mul_32(ry, c->x, rx, p1024_mod, p1024_mp_mod);
  152753. /* t2 = h^3 */
  152754. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  152755. /* c->x = r^2 + h^3 */
  152756. sp_1024_mont_add_32(c->x, t1, t2, p1024_mod);
  152757. /* t1 = 2 * c.x * h^2 */
  152758. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  152759. /* c'.x = r^2 + h^3 - 2 * c.x * h^2 */
  152760. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  152761. /* ry = c'.x - c.x * h^2 */
  152762. sp_1024_mont_sub_32(t1, c->x, ry, p1024_mod);
  152763. /* ry = r * (c'.x - c.x * h^2) */
  152764. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  152765. /* t2 = c.y * h^3 */
  152766. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  152767. /* c'.y = r * (c'.x - c.x * h^2) - c.y * h^3 */
  152768. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  152769. }
  152770. /*
  152771. * Calculate r = pairing <P, Q>.
  152772. *
  152773. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  152774. *
  152775. * @param [in] key SAKKE key.
  152776. * @param [in] p First point on E(F_p)[q].
  152777. * @param [in] q Second point on E(F_p)[q].
  152778. * @param [in] r Result of calculation.
  152779. * @return 0 on success.
  152780. * @return MEMORY_E when dynamic memory allocation fails.
  152781. * @return Other -ve value on internal failure.
  152782. */
  152783. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  152784. {
  152785. int err = MP_OKAY;
  152786. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152787. defined(WOLFSSL_SP_SMALL_STACK)
  152788. sp_digit* td = NULL;
  152789. sp_digit* t;
  152790. sp_digit* vx;
  152791. sp_digit* vy;
  152792. sp_digit* qx_px;
  152793. #else
  152794. sp_digit t[36 * 2 * 32];
  152795. sp_digit vx[2 * 32];
  152796. sp_digit vy[2 * 32];
  152797. sp_digit qx_px[2 * 32];
  152798. sp_point_1024 pd;
  152799. sp_point_1024 qd;
  152800. sp_point_1024 cd;
  152801. #endif
  152802. sp_point_1024* p = NULL;
  152803. sp_point_1024* q = NULL;
  152804. sp_point_1024* c = NULL;
  152805. sp_digit* r = NULL;
  152806. int i;
  152807. err = sp_1024_point_new_32(NULL, pd, p);
  152808. if (err == MP_OKAY) {
  152809. err = sp_1024_point_new_32(NULL, qd, q);
  152810. }
  152811. if (err == MP_OKAY) {
  152812. err = sp_1024_point_new_32(NULL, cd, c);
  152813. }
  152814. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152815. defined(WOLFSSL_SP_SMALL_STACK)
  152816. if (err == MP_OKAY) {
  152817. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 39 * 32 * 2, NULL,
  152818. DYNAMIC_TYPE_TMP_BUFFER);
  152819. if (td == NULL) {
  152820. err = MEMORY_E;
  152821. }
  152822. }
  152823. #endif
  152824. if (err == MP_OKAY) {
  152825. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152826. defined(WOLFSSL_SP_SMALL_STACK)
  152827. t = td;
  152828. vx = td + 36 * 32 * 2;
  152829. vy = td + 37 * 32 * 2;
  152830. qx_px = td + 38 * 32 * 2;
  152831. #endif
  152832. r = vy;
  152833. sp_1024_point_from_ecc_point_32(p, pm);
  152834. sp_1024_point_from_ecc_point_32(q, qm);
  152835. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  152836. }
  152837. if (err == MP_OKAY) {
  152838. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  152839. }
  152840. if (err == MP_OKAY) {
  152841. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  152842. }
  152843. if (err == MP_OKAY) {
  152844. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  152845. }
  152846. if (err == MP_OKAY) {
  152847. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  152848. }
  152849. if (err == MP_OKAY) {
  152850. XMEMCPY(c, p, sizeof(sp_point_1024));
  152851. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  152852. vx[0] = 1;
  152853. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  152854. sp_1024_mont_add_32(qx_px, q->x, p->x, p1024_mod);
  152855. for (i = 1020; i >= 0; i--) {
  152856. /* Accumulate line into v and double point. */
  152857. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  152858. if ((i > 0) && ((p1024_order[i / 32] >> (i % 32)) & 1)) {
  152859. /* Accumulate line into v and add P into C. */
  152860. sp_1024_accumulate_line_add_one_32(vx, vy, c, p, q, qx_px, t);
  152861. }
  152862. }
  152863. /* Final exponentiation */
  152864. sp_1024_proj_sqr_32(vx, vy, t);
  152865. sp_1024_proj_sqr_32(vx, vy, t);
  152866. /* Convert from PF_p[q] to F_p */
  152867. sp_1024_mont_inv_32(vx, vx, t);
  152868. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  152869. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  152870. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  152871. err = sp_1024_to_mp(r, res);
  152872. }
  152873. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  152874. defined(WOLFSSL_SP_SMALL_STACK)
  152875. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  152876. #endif
  152877. sp_1024_point_free_32(c, 1, NULL);
  152878. sp_1024_point_free_32(q, 1, NULL);
  152879. sp_1024_point_free_32(p, 1, NULL);
  152880. return err;
  152881. }
  152882. #else
  152883. /*
  152884. * Calculate gradient of line through C, P and -C-P, accumulate line and
  152885. * add P to C.
  152886. *
  152887. * Both C and P have z ordinates to use in the calculation.
  152888. *
  152889. * Calculations:
  152890. * r.x = (q.x * c.z^2 + c.x) * p.y * c.z - (q.x * p.z^2 + p.x) * c.y * p.z
  152891. * r.y = (p.x * c.z^2 - c.x * p.z^2) * q.y * p.z * c.z
  152892. * v* = v* * r*
  152893. * h = p.x * c.z^2 - c.x * p.z^2
  152894. * r = p.y * c.z^3 - c.y * p.z^3
  152895. * c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2
  152896. * c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3
  152897. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  152898. *
  152899. * @param [in,out] vx X-ordinate of projective value in F*.
  152900. * @param [in,out] vy Y-ordinate of projective value in F*.
  152901. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  152902. * to.
  152903. * @param [in,out] p ECC point - point on E(F_p^2) to add.
  152904. * @param [in,out] q ECC point - second point on E(F_P^2).
  152905. * @param [in,out] t SP temporaries (6 used).
  152906. * @param [in,out] neg Indicates to use negative P.
  152907. * @return 0 on success.
  152908. * @return MEMORY_E when dynamic memory allocation fails.
  152909. * @return Other -ve value on internal failure.
  152910. */
  152911. static void sp_1024_accumulate_line_add_n_32(sp_digit* vx, sp_digit* vy,
  152912. const sp_point_1024* p, const sp_point_1024* q,
  152913. sp_point_1024* c, sp_digit* t, int neg)
  152914. {
  152915. sp_digit* t1 = t;
  152916. sp_digit* t2 = t + 2 * 32;
  152917. sp_digit* rx = t + 4 * 32;
  152918. sp_digit* ry = t + 6 * 32;
  152919. sp_digit* h = t + 8 * 32;
  152920. sp_digit* r = t + 10 * 32;
  152921. /* h = p.z^2 */
  152922. sp_1024_mont_sqr_32(h, p->z, p1024_mod, p1024_mp_mod);
  152923. /* rx = q.x * p.z^2 */
  152924. sp_1024_mont_mul_32(rx, q->x, h, p1024_mod, p1024_mp_mod);
  152925. /* rx = q.x * p.z^2 + p.x */
  152926. sp_1024_mont_add_32(t2, rx, p->x, p1024_mod);
  152927. /* c.y = c.y * p.z */
  152928. sp_1024_mont_mul_32(t1, c->y, p->z, p1024_mod, p1024_mp_mod);
  152929. /* r.x = (q.x * p.z^2 + p.x) * c.y * p.z */
  152930. sp_1024_mont_mul_32(rx, t2, t1, p1024_mod, p1024_mp_mod);
  152931. /* c.y = c.y * p.z^3 */
  152932. sp_1024_mont_mul_32(c->y, t1, h, p1024_mod, p1024_mp_mod);
  152933. /* t2 = c.z^2 */
  152934. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  152935. /* t1 = q.x * c.z^2 */
  152936. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  152937. /* t1 = q.x * c.z^2 + c.x */
  152938. sp_1024_mont_add_32(t1, t1, c->x, p1024_mod);
  152939. /* c.x = c.x * p.z^2 */
  152940. sp_1024_mont_mul_32(c->x, c->x, h, p1024_mod, p1024_mp_mod);
  152941. /* r = p.y * c.z */
  152942. sp_1024_mont_mul_32(r, p->y, c->z, p1024_mod, p1024_mp_mod);
  152943. if (neg) {
  152944. /* r = -p.y * c.z */
  152945. sp_1024_mont_sub_32(r, p1024_mod, r, p1024_mod);
  152946. }
  152947. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  152948. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  152949. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  152950. sp_1024_mont_sub_32(rx, ry, rx, p1024_mod);
  152951. /* t1 = p.x * c.z^2 */
  152952. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  152953. /* h = p.x * c.z^2 - c.x * p.z^2 */
  152954. sp_1024_mont_sub_32(h, t1, c->x, p1024_mod);
  152955. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z */
  152956. sp_1024_mont_mul_32(t1, h, c->z, p1024_mod, p1024_mp_mod);
  152957. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z */
  152958. sp_1024_mont_mul_32(c->z, t1, p->z, p1024_mod, p1024_mp_mod);
  152959. /* r.y = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z * q.y */
  152960. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  152961. /* r = p.y * c.z^3 */
  152962. sp_1024_mont_mul_32(t1, r, t2, p1024_mod, p1024_mp_mod);
  152963. /* r = p.y * c.z^3 - c.y * p.z^3 */
  152964. sp_1024_mont_sub_32(r, t1, c->y, p1024_mod);
  152965. /* v = v * r */
  152966. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  152967. /* Add p to c using previously calculated values.
  152968. * h = p.x * c.z^2 - c.x * p.z^2
  152969. * r = p.y * c.z^3 - c.y * p.z^3
  152970. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  152971. */
  152972. /* t1 = r^2 */
  152973. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  152974. /* t2 = h^2 */
  152975. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  152976. /* ry = c.x * p.z^2 * h^2 */
  152977. sp_1024_mont_mul_32(ry, rx, c->x, p1024_mod, p1024_mp_mod);
  152978. /* t2 = h^3 */
  152979. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  152980. /* c'.x = r^2 - h^3 */
  152981. sp_1024_mont_sub_32(c->x, t1, t2, p1024_mod);
  152982. /* t1 = 2 * c.x * p.z^2 * h^2 */
  152983. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  152984. /* c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2 */
  152985. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  152986. /* ry = c.x * p.z^2 * h^2 - c'.x */
  152987. sp_1024_mont_sub_32(t1, ry, c->x, p1024_mod);
  152988. /* ry = r * (c.x * p.z^2 * h^2 - c'.x) */
  152989. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  152990. /* t2 = c.y * p.z^3 * h^3 */
  152991. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  152992. /* c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3 */
  152993. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  152994. }
  152995. /*
  152996. * Perform n accumulate doubles and doubles of P.
  152997. *
  152998. * py = 2 * p.y
  152999. *
  153000. * For each double:
  153001. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  153002. * double P.
  153003. *
  153004. * Calculations:
  153005. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  153006. * r.x = l * (p.x + q.x * p.z^2) - py^2 / 2
  153007. * r.y = py * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  153008. * v* = v*^2 * r*
  153009. * p'.x = l^2 - 2 * py^2 * p.x
  153010. * py' = (py^2 * p.x - p'.x) * l - py^4 (= 2 * p'.y)
  153011. * p'.z = py * p.z
  153012. *
  153013. * Finally:
  153014. * p'.y = py' / 2
  153015. *
  153016. * @param [in,out] vx X-ordinate of projective value in F*.
  153017. * @param [in,out] vy Y-ordinate of projective value in F*.
  153018. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  153019. * @param [in] q ECC point - second point on E(F_P^2).
  153020. * @param [in] n Number of times to double.
  153021. * @param [in] t SP temporaries (6 used).
  153022. */
  153023. static void sp_1024_accumulate_line_dbl_n_32(sp_digit* vx, sp_digit* vy,
  153024. sp_point_1024* p, const sp_point_1024* q, int n, sp_digit* t)
  153025. {
  153026. sp_digit* t1 = t + 0 * 32;
  153027. sp_digit* pz2 = t + 2 * 32;
  153028. sp_digit* rx = t + 4 * 32;
  153029. sp_digit* ry = t + 6 * 32;
  153030. sp_digit* l = t + 8 * 32;
  153031. sp_digit* ty = t + 10 * 32;
  153032. int i;
  153033. /* py = 2 * p.y */
  153034. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  153035. for (i = 0; i < n; i++) {
  153036. /* v = v^2 */
  153037. sp_1024_proj_sqr_32(vx, vy, t);
  153038. /* pz2 = p.z^2 */
  153039. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  153040. /* t1 = p.x + p.z^2 */
  153041. sp_1024_mont_add_32(t1, p->x, pz2, p1024_mod);
  153042. /* l = p.x - p.z^2 */
  153043. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  153044. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  153045. sp_1024_mont_mul_32(ty, l, t1, p1024_mod, p1024_mp_mod);
  153046. /* l = 3 * (p.x^2 - p.z^4) */
  153047. sp_1024_mont_tpl_32(l, ty, p1024_mod);
  153048. /* t1 = q.x * p.z^2 */
  153049. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  153050. /* t1 = p.x + q.x * p.z^2 */
  153051. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  153052. /* r.x = l * (p.x + q.x * p.z^2) */
  153053. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  153054. /* ty = py ^ 2 */
  153055. sp_1024_mont_sqr_32(ty, p->y, p1024_mod, p1024_mp_mod);
  153056. /* t1 = py ^ 2 / 2 */
  153057. sp_1024_mont_div2_32(t1, ty, p1024_mod);
  153058. /* r.x -= py ^ 2 / 2 */
  153059. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  153060. /* p'.z = py * pz */
  153061. sp_1024_mont_mul_32(p->z, p->z, p->y, p1024_mod, p1024_mp_mod);
  153062. /* r.y = p'.z * p.z^2 */
  153063. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  153064. /* r.y = p'.z * p.z^2 * q.y */
  153065. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  153066. /* v = v^2 * r */
  153067. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  153068. /* Double point using previously calculated values
  153069. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  153070. * ty = py^2
  153071. * p'.z = py * p.z
  153072. */
  153073. /* t1 = py^2 ^ 2 = py^4 */
  153074. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  153075. /* py' = py^2 * p. x */
  153076. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  153077. /* p'.x = l^2 */
  153078. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  153079. /* p'.x = l^2 - py^2 * p.x */
  153080. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  153081. /* p'.x = l^2 - 2 * p.y^2 * p.x */
  153082. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  153083. /* py' = py^2 * p.x - p.x' */
  153084. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  153085. /* py' = (p.y^2 * p.x - p'.x) * l */
  153086. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  153087. /* py' = (p.y^2 * p.x - p'.x) * l * 2 */
  153088. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  153089. /* py' = (p.y^2 * p.x - p'.x) * l * 2 - p.y^4 */
  153090. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  153091. }
  153092. /* p'.y = py' / 2 */
  153093. sp_1024_mont_div2_32(p->y, p->y, p1024_mod);
  153094. }
  153095. /* Operations to perform based on order - 1.
  153096. * Sliding window. Start at bottom and stop when bottom bit is one.
  153097. * Subtract if top bit in window is one.
  153098. * Width of 6 bits.
  153099. * Pairs: #dbls, add/subtract window value
  153100. */
  153101. static const signed char sp_1024_order_op[] = {
  153102. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  153103. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  153104. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  153105. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  153106. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  153107. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  153108. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  153109. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  153110. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  153111. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  153112. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  153113. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  153114. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  153115. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  153116. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  153117. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  153118. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  153119. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  153120. -3, 1,
  153121. };
  153122. /*
  153123. * Calculate r = pairing <P, Q>.
  153124. *
  153125. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  153126. *
  153127. * Sliding window. Start at bottom and stop when bottom bit is one.
  153128. * Subtract if top bit in window is one.
  153129. * Width of 6 bits.
  153130. *
  153131. * @param [in] pm First point on E(F_p)[q].
  153132. * @param [in] qm Second point on E(F_p)[q].
  153133. * @param [in] res Result of calculation.
  153134. * @return 0 on success.
  153135. * @return MEMORY_E when dynamic memory allocation fails.
  153136. */
  153137. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  153138. {
  153139. int err;
  153140. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153141. defined(WOLFSSL_SP_SMALL_STACK)
  153142. sp_digit* td = NULL;
  153143. sp_digit* t;
  153144. sp_digit* vx;
  153145. sp_digit* vy;
  153146. sp_digit (*pre_vx)[64];
  153147. sp_digit (*pre_vy)[64];
  153148. sp_digit (*pre_nvy)[64];
  153149. sp_point_1024* pre_p;
  153150. #else
  153151. sp_digit t[36 * 2 * 32];
  153152. sp_digit vx[2 * 32];
  153153. sp_digit vy[2 * 32];
  153154. sp_digit pre_vx[16][64];
  153155. sp_digit pre_vy[16][64];
  153156. sp_digit pre_nvy[16][64];
  153157. sp_point_1024 pre_p[16];
  153158. sp_point_1024 pd;
  153159. sp_point_1024 qd;
  153160. sp_point_1024 cd;
  153161. #endif
  153162. sp_point_1024* p = NULL;
  153163. sp_point_1024* q = NULL;
  153164. sp_point_1024* c = NULL;
  153165. sp_digit* r = NULL;
  153166. int i;
  153167. int j;
  153168. err = sp_1024_point_new_32(NULL, pd, p);
  153169. if (err == MP_OKAY) {
  153170. err = sp_1024_point_new_32(NULL, qd, q);
  153171. }
  153172. if (err == MP_OKAY) {
  153173. err = sp_1024_point_new_32(NULL, cd, c);
  153174. }
  153175. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153176. defined(WOLFSSL_SP_SMALL_STACK)
  153177. if (err == MP_OKAY) {
  153178. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 86 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  153179. DYNAMIC_TYPE_TMP_BUFFER);
  153180. if (td == NULL) {
  153181. err = MEMORY_E;
  153182. }
  153183. }
  153184. #endif
  153185. if (err == MP_OKAY) {
  153186. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153187. defined(WOLFSSL_SP_SMALL_STACK)
  153188. t = td;
  153189. vx = td + 36 * 32 * 2;
  153190. vy = td + 37 * 32 * 2;
  153191. pre_vx = (sp_digit(*)[64])(td + 38 * 32 * 2);
  153192. pre_vy = (sp_digit(*)[64])(td + 54 * 32 * 2);
  153193. pre_nvy = (sp_digit(*)[64])(td + 70 * 32 * 2);
  153194. pre_p = (sp_point_1024*)(td + 86 * 32 * 2);
  153195. #endif
  153196. r = vy;
  153197. sp_1024_point_from_ecc_point_32(p, pm);
  153198. sp_1024_point_from_ecc_point_32(q, qm);
  153199. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  153200. }
  153201. if (err == MP_OKAY) {
  153202. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  153203. }
  153204. if (err == MP_OKAY) {
  153205. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  153206. }
  153207. if (err == MP_OKAY) {
  153208. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  153209. }
  153210. if (err == MP_OKAY) {
  153211. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  153212. }
  153213. if (err == MP_OKAY) {
  153214. /* Generate pre-computation table: 1, 3, ... , 31 */
  153215. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  153216. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  153217. pre_vx[0][0] = 1;
  153218. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  153219. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  153220. /* [2]P for adding */
  153221. XMEMCPY(c, p, sizeof(sp_point_1024));
  153222. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  153223. vx[0] = 1;
  153224. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  153225. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  153226. /* 3, 5, ... */
  153227. for (i = 1; i < 16; i++) {
  153228. XMEMCPY(&pre_p[i], &pre_p[i-1], sizeof(sp_point_1024));
  153229. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  153230. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  153231. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  153232. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  153233. q, &pre_p[i], t, 0);
  153234. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i], p1024_mod);
  153235. }
  153236. j = sp_1024_order_op[0] / 2;
  153237. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  153238. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  153239. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  153240. /* Accumulate line into v and double point n times. */
  153241. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  153242. sp_1024_order_op[1], t);
  153243. for (i = 2; i < 290; i += 2) {
  153244. j = sp_1024_order_op[i];
  153245. if (j > 0) {
  153246. j /= 2;
  153247. /* Accumulate line into v and add P into C. */
  153248. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  153249. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  153250. t, 0);
  153251. }
  153252. else {
  153253. j = -j / 2;
  153254. /* Accumulate line into v and add P into C. */
  153255. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  153256. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  153257. t, 1);
  153258. }
  153259. /* Accumulate line into v and double point n times. */
  153260. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  153261. sp_1024_order_op[i + 1], t);
  153262. }
  153263. /* Final exponentiation */
  153264. sp_1024_proj_sqr_32(vx, vy, t);
  153265. sp_1024_proj_sqr_32(vx, vy, t);
  153266. /* Convert from PF_p[q] to F_p */
  153267. sp_1024_mont_inv_32(vx, vx, t);
  153268. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  153269. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  153270. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  153271. err = sp_1024_to_mp(r, res);
  153272. }
  153273. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153274. defined(WOLFSSL_SP_SMALL_STACK)
  153275. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  153276. #endif
  153277. sp_1024_point_free_32(c, 1, NULL);
  153278. sp_1024_point_free_32(q, 1, NULL);
  153279. sp_1024_point_free_32(p, 1, NULL);
  153280. return err;
  153281. }
  153282. #endif /* WOLFSSL_SP_SMALL */
  153283. #ifdef WOLFSSL_SP_SMALL
  153284. /*
  153285. * Generate table for pairing.
  153286. *
  153287. * Small implementation does not use a table - returns 0 length.
  153288. *
  153289. * pm [in] Point to generate table for.
  153290. * table [in] Generated table.
  153291. * len [in,out] On in, the size of the buffer.
  153292. * On out, length of table generated.
  153293. * @return 0 on success.
  153294. * LENGTH_ONLY_E when table is NULL and only length returned.
  153295. * BUFFER_E when len is too small.
  153296. */
  153297. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  153298. word32* len)
  153299. {
  153300. int err = 0;
  153301. if (table == NULL) {
  153302. *len = 0;
  153303. err = WC_NO_ERR_TRACE(LENGTH_ONLY_E);
  153304. }
  153305. else if (*len != 0) {
  153306. err = BUFFER_E;
  153307. }
  153308. (void)*pm;
  153309. return err;
  153310. }
  153311. /*
  153312. * Calculate r = pairing <P, Q>.
  153313. *
  153314. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  153315. *
  153316. * Small implementation does not use a table - use the normal implementation.
  153317. *
  153318. * @param [in] pm First point on E(F_p)[q].
  153319. * @param [in] qm Second point on E(F_p)[q].
  153320. * @param [in] res Result of calculation.
  153321. * @param [in] table Precomputed table of values.
  153322. * @param [in] len Length of precomputed table of values in bytes.
  153323. * @return 0 on success.
  153324. * @return MEMORY_E when dynamic memory allocation fails.
  153325. */
  153326. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  153327. mp_int* res, const byte* table, word32 len)
  153328. {
  153329. (void)table;
  153330. (void)len;
  153331. return sp_Pairing_1024(pm, qm, res);
  153332. }
  153333. #else
  153334. /*
  153335. * Calc l and c for the point when doubling p.
  153336. *
  153337. * l = 3 * (p.x^2 - 1) / (2 * p.y)
  153338. * c = l * p.x - p.y
  153339. *
  153340. * @param [out] lr Gradient result - table entry.
  153341. * @param [out] cr Constant result - table entry.
  153342. * @param [in] px X-ordinate of point to double.
  153343. * @param [in] py Y-ordinate of point to double.
  153344. * @param [in] t SP temporaries (3 used).
  153345. */
  153346. static void sp_1024_accum_dbl_calc_lc_32(sp_digit* lr, sp_digit* cr,
  153347. const sp_digit* px, const sp_digit* py, sp_digit* t)
  153348. {
  153349. sp_digit* t1 = t + 33 * 2 * 32;
  153350. sp_digit* t2 = t + 34 * 2 * 32;
  153351. sp_digit* l = t + 35 * 2 * 32;
  153352. /* l = 1 / 2 * p.y */
  153353. sp_1024_mont_dbl_32(l, py, p1024_mod);
  153354. sp_1024_mont_inv_32(l, l, t);
  153355. /* t1 = p.x^2 */
  153356. sp_1024_mont_sqr_32(t1, px, p1024_mod, p1024_mp_mod);
  153357. /* t1 = p.x - 1 */
  153358. sp_1024_mont_sub_32(t1, t1, p1024_norm_mod, p1024_mod);
  153359. /* t1 = 3 * (p.x^2 - 1) */
  153360. sp_1024_mont_dbl_32(t2, t1, p1024_mod);
  153361. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  153362. /* t1 = 3 * (p.x^2 - 1) / (2 * p.y) */
  153363. sp_1024_mont_mul_32(l, l, t1, p1024_mod, p1024_mp_mod);
  153364. /* t2 = l * p.x */
  153365. sp_1024_mont_mul_32(t2, l, px, p1024_mod, p1024_mp_mod);
  153366. /* c = t2 = l * p.x - p.y */
  153367. sp_1024_mont_sub_32(t2, t2, py, p1024_mod);
  153368. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  153369. XMEMCPY(cr, t2, sizeof(sp_digit) * 32);
  153370. }
  153371. /*
  153372. * Calc l and c when adding p and c.
  153373. *
  153374. * l = (c.y - p.y) / (c.x - p.x)
  153375. * c = (p.x * c.y - cx * p.y) / (cx - p.x)
  153376. *
  153377. * @param [out] lr Gradient result - table entry.
  153378. * @param [out] cr Constant result - table entry.
  153379. * @param [in] px X-ordinate of point to add.
  153380. * @param [in] py Y-ordinate of point to add.
  153381. * @param [in] cx X-ordinate of current point.
  153382. * @param [in] cy Y-ordinate of current point.
  153383. * @param [in] t SP temporaries (3 used).
  153384. */
  153385. static void sp_1024_accum_add_calc_lc_32(sp_digit* lr, sp_digit* cr,
  153386. const sp_digit* px, const sp_digit* py, const sp_digit* cx,
  153387. const sp_digit* cy, sp_digit* t)
  153388. {
  153389. sp_digit* t1 = t + 33 * 2 * 32;
  153390. sp_digit* c = t + 34 * 2 * 32;
  153391. sp_digit* l = t + 35 * 2 * 32;
  153392. /* l = 1 / (c.x - p.x) */
  153393. sp_1024_mont_sub_32(l, cx, px, p1024_mod);
  153394. sp_1024_mont_inv_32(l, l, t);
  153395. /* c = p.x * c.y */
  153396. sp_1024_mont_mul_32(c, px, cy, p1024_mod, p1024_mp_mod);
  153397. /* t1 = c.x * p.y */
  153398. sp_1024_mont_mul_32(t1, cx, py, p1024_mod, p1024_mp_mod);
  153399. /* c = (p.x * c.y) - (c.x * p.y) */
  153400. sp_1024_mont_sub_32(c, c, t1, p1024_mod);
  153401. /* c = ((p.x * c.y) - (c.x * p.y)) / (c.x - p.x) */
  153402. sp_1024_mont_mul_32(c, c, l, p1024_mod, p1024_mp_mod);
  153403. /* t1 = c.y - p.y */
  153404. sp_1024_mont_sub_32(t1, cy, py, p1024_mod);
  153405. /* l = (c.y - p.y) / (c.x - p.x) */
  153406. sp_1024_mont_mul_32(l, t1, l, p1024_mod, p1024_mp_mod);
  153407. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  153408. XMEMCPY(cr, c, sizeof(sp_digit) * 32);
  153409. }
  153410. /*
  153411. * Calculate vx and vy given gradient l and constant c and point q.
  153412. *
  153413. * l is a the gradient and is multiplied by q->x.
  153414. * c is a the constant that is added to the multiplicative result.
  153415. * q->y is the y-ordinate in result to multiply.
  153416. *
  153417. * if dbl
  153418. * v* = v*^2
  153419. * r.x = l * q.x + c
  153420. * r.y = q->y
  153421. * v* = v* * r*
  153422. *
  153423. * @param [in,out] vx X-ordinate of projective value in F*.
  153424. * @param [in,out] vy Y-ordinate of projective value in F*.
  153425. * @param [in] l Gradient to multiply with.
  153426. * @param [in] c Constant to add with.
  153427. * @param [in] q ECC point - second point on E(F_P^2).
  153428. * @param [in] t SP temporaries (3 used).
  153429. * @param [in] dbl Indicates whether this is for doubling. Otherwise
  153430. * adding.
  153431. */
  153432. static void sp_1024_accumulate_line_lc_32(sp_digit* vx, sp_digit* vy,
  153433. const sp_digit* l, const sp_digit* c, const sp_point_1024* q,
  153434. sp_digit* t, int dbl)
  153435. {
  153436. sp_digit* rx = t + 4 * 2 * 32;
  153437. /* v = v^2 */
  153438. if (dbl) {
  153439. sp_1024_proj_sqr_32(vx, vy, t);
  153440. }
  153441. /* rx = l * q.x + c */
  153442. sp_1024_mont_mul_32(rx, l, q->x, p1024_mod, p1024_mp_mod);
  153443. sp_1024_mont_add_32(rx, rx, c, p1024_mod);
  153444. /* v = v^2 * r */
  153445. sp_1024_proj_mul_32(vx, vy, rx, q->y, t);
  153446. }
  153447. /* Operations to perform based on order - 1.
  153448. * Sliding window. Start at bottom and stop when bottom bit is one.
  153449. * Subtract if top bit in window is one.
  153450. * Width of 6 bits.
  153451. * Pairs: #dbls, add/subtract window value
  153452. */
  153453. static const signed char sp_1024_order_op_pre[] = {
  153454. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  153455. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  153456. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  153457. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  153458. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  153459. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  153460. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  153461. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  153462. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  153463. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  153464. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  153465. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  153466. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  153467. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  153468. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  153469. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  153470. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  153471. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  153472. -3, 1,
  153473. };
  153474. /*
  153475. * Generate table for pairing.
  153476. *
  153477. * Calculate the graident (l) and constant (c) at each step of the way.
  153478. * Sliding window. Start at bottom and stop when bottom bit is one.
  153479. * Subtract if top bit in window is one.
  153480. * Width of 6 bits.
  153481. *
  153482. * pm [in] Point to generate table for.
  153483. * table [in] Generated table.
  153484. * len [in,out] On in, the size of the buffer.
  153485. * On out, length of table generated.
  153486. * @return 0 on success.
  153487. * LENGTH_ONLY_E when table is NULL and only length returned.
  153488. * BUFFER_E when len is too small.
  153489. * MEMORY_E when dynamic memory allocation fauls.
  153490. */
  153491. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  153492. word32* len)
  153493. {
  153494. int err = 0;
  153495. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153496. defined(WOLFSSL_SP_SMALL_STACK)
  153497. sp_digit* td = NULL;
  153498. sp_digit* t;
  153499. sp_point_1024* pre_p;
  153500. #else
  153501. sp_digit t[36 * 2 * 32];
  153502. sp_point_1024 pre_p[16];
  153503. sp_point_1024 pd;
  153504. sp_point_1024 cd;
  153505. sp_point_1024 negd;
  153506. #endif
  153507. sp_point_1024* p = NULL;
  153508. sp_point_1024* c = NULL;
  153509. sp_point_1024* neg = NULL;
  153510. int i;
  153511. int j;
  153512. int k;
  153513. sp_table_entry_1024* precomp = (sp_table_entry_1024*)table;
  153514. if (table == NULL) {
  153515. *len = sizeof(sp_table_entry_1024) * 1167;
  153516. err = WC_NO_ERR_TRACE(LENGTH_ONLY_E);
  153517. }
  153518. if ((err == MP_OKAY) &&
  153519. (*len < (int)(sizeof(sp_table_entry_1024) * 1167))) {
  153520. err = BUFFER_E;
  153521. }
  153522. if (err == MP_OKAY) {
  153523. err = sp_1024_point_new_32(NULL, pd, p);
  153524. }
  153525. if (err == MP_OKAY) {
  153526. err = sp_1024_point_new_32(NULL, cd, c);
  153527. }
  153528. if (err == MP_OKAY) {
  153529. err = sp_1024_point_new_32(NULL, negd, neg);
  153530. }
  153531. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153532. defined(WOLFSSL_SP_SMALL_STACK)
  153533. if (err == MP_OKAY) {
  153534. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 36 * 32 * 2 + 16 *
  153535. sizeof(sp_point_1024), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  153536. if (td == NULL) {
  153537. err = MEMORY_E;
  153538. }
  153539. }
  153540. #endif
  153541. if (err == MP_OKAY) {
  153542. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153543. defined(WOLFSSL_SP_SMALL_STACK)
  153544. t = td;
  153545. pre_p = (sp_point_1024*)(td + 36 * 32 * 2);
  153546. #endif
  153547. sp_1024_point_from_ecc_point_32(p, pm);
  153548. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  153549. }
  153550. if (err == MP_OKAY) {
  153551. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  153552. }
  153553. if (err == MP_OKAY) {
  153554. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  153555. neg->infinity = 0;
  153556. c->infinity = 0;
  153557. /* Generate pre-computation table: 1, 3, ... , 31 */
  153558. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  153559. /* [2]P for adding */
  153560. sp_1024_proj_point_dbl_32(c, p, t);
  153561. /* 1, 3, ... */
  153562. for (i = 1; i < 16; i++) {
  153563. sp_1024_proj_point_add_32(&pre_p[i], &pre_p[i-1], c, t);
  153564. sp_1024_mont_map_32(&pre_p[i], t);
  153565. }
  153566. k = 0;
  153567. j = sp_1024_order_op_pre[0] / 2;
  153568. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  153569. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  153570. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x,
  153571. c->y, t);
  153572. k++;
  153573. sp_1024_proj_point_dbl_32(c, c, t);
  153574. sp_1024_mont_map_32(c, t);
  153575. }
  153576. for (i = 2; i < 290; i += 2) {
  153577. j = sp_1024_order_op_pre[i];
  153578. if (j > 0) {
  153579. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  153580. pre_p[j/2].x, pre_p[j/2].y, c->x, c->y, t);
  153581. k++;
  153582. sp_1024_proj_point_add_32(c, c, &pre_p[j/2], t);
  153583. sp_1024_mont_map_32(c, t);
  153584. }
  153585. else {
  153586. XMEMCPY(neg->x, pre_p[-j / 2].x, sizeof(pre_p->x));
  153587. sp_1024_mont_sub_32(neg->y, p1024_mod, pre_p[-j / 2].y,
  153588. p1024_mod);
  153589. XMEMCPY(neg->z, pre_p[-j / 2].z, sizeof(pre_p->z));
  153590. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  153591. neg->x, neg->y, c->x, c->y, t);
  153592. k++;
  153593. sp_1024_proj_point_add_32(c, c, neg, t);
  153594. sp_1024_mont_map_32(c, t);
  153595. }
  153596. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  153597. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x,
  153598. c->y, t);
  153599. k++;
  153600. sp_1024_proj_point_dbl_32(c, c, t);
  153601. sp_1024_mont_map_32(c, t);
  153602. }
  153603. }
  153604. *len = sizeof(sp_table_entry_1024) * 1167;
  153605. }
  153606. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153607. defined(WOLFSSL_SP_SMALL_STACK)
  153608. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  153609. #endif
  153610. sp_1024_point_free_32(neg, 1, NULL);
  153611. sp_1024_point_free_32(c, 1, NULL);
  153612. sp_1024_point_free_32(p, 1, NULL);
  153613. return err;
  153614. }
  153615. /*
  153616. * Calculate r = pairing <P, Q>.
  153617. *
  153618. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  153619. *
  153620. * Sliding window. Start at bottom and stop when bottom bit is one.
  153621. * Subtract if top bit in window is one.
  153622. * Width of 6 bits.
  153623. * Pre-generate values in window (1, 3, ...) - only V.
  153624. * Table contains all gradient l and a constant for each point on the path.
  153625. *
  153626. * @param [in] pm First point on E(F_p)[q].
  153627. * @param [in] qm Second point on E(F_p)[q].
  153628. * @param [in] res Result of calculation.
  153629. * @param [in] table Precomputed table of values.
  153630. * @param [in] len Length of precomputed table of values in bytes.
  153631. * @return 0 on success.
  153632. * @return MEMORY_E when dynamic memory allocation fails.
  153633. */
  153634. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  153635. mp_int* res, const byte* table, word32 len)
  153636. {
  153637. int err = 0;
  153638. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153639. defined(WOLFSSL_SP_SMALL_STACK)
  153640. sp_digit* td = NULL;
  153641. sp_digit* t;
  153642. sp_digit* vx;
  153643. sp_digit* vy;
  153644. sp_digit (*pre_vx)[64];
  153645. sp_digit (*pre_vy)[64];
  153646. sp_digit (*pre_nvy)[64];
  153647. #else
  153648. sp_digit t[36 * 2 * 32];
  153649. sp_digit vx[2 * 32];
  153650. sp_digit vy[2 * 32];
  153651. sp_digit pre_vx[16][64];
  153652. sp_digit pre_vy[16][64];
  153653. sp_digit pre_nvy[16][64];
  153654. sp_point_1024 pd;
  153655. sp_point_1024 qd;
  153656. sp_point_1024 cd;
  153657. #endif
  153658. sp_point_1024* p = NULL;
  153659. sp_point_1024* q = NULL;
  153660. sp_point_1024* c = NULL;
  153661. sp_digit* r = NULL;
  153662. int i;
  153663. int j;
  153664. int k;
  153665. const sp_table_entry_1024* precomp = (const sp_table_entry_1024*)table;
  153666. if (len < (int)(sizeof(sp_table_entry_1024) * 1167)) {
  153667. err = BUFFER_E;
  153668. }
  153669. if (err == MP_OKAY) {
  153670. err = sp_1024_point_new_32(NULL, pd, p);
  153671. }
  153672. if (err == MP_OKAY) {
  153673. err = sp_1024_point_new_32(NULL, qd, q);
  153674. }
  153675. if (err == MP_OKAY) {
  153676. err = sp_1024_point_new_32(NULL, cd, c);
  153677. }
  153678. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153679. defined(WOLFSSL_SP_SMALL_STACK)
  153680. if (err == MP_OKAY) {
  153681. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 86 * 32 * 2, NULL,
  153682. DYNAMIC_TYPE_TMP_BUFFER);
  153683. if (td == NULL) {
  153684. err = MEMORY_E;
  153685. }
  153686. }
  153687. #endif
  153688. if (err == MP_OKAY) {
  153689. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153690. defined(WOLFSSL_SP_SMALL_STACK)
  153691. t = td;
  153692. vx = td + 36 * 32 * 2;
  153693. vy = td + 37 * 32 * 2;
  153694. pre_vx = (sp_digit(*)[64])(td + 38 * 32 * 2);
  153695. pre_vy = (sp_digit(*)[64])(td + 54 * 32 * 2);
  153696. pre_nvy = (sp_digit(*)[64])(td + 70 * 32 * 2);
  153697. #endif
  153698. r = vy;
  153699. sp_1024_point_from_ecc_point_32(p, pm);
  153700. sp_1024_point_from_ecc_point_32(q, qm);
  153701. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  153702. }
  153703. if (err == MP_OKAY) {
  153704. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  153705. }
  153706. if (err == MP_OKAY) {
  153707. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  153708. }
  153709. if (err == MP_OKAY) {
  153710. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  153711. }
  153712. if (err == MP_OKAY) {
  153713. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  153714. }
  153715. if (err == MP_OKAY) {
  153716. /* Generate pre-computation table: 1, 3, ... , 31 */
  153717. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  153718. pre_vx[0][0] = 1;
  153719. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  153720. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  153721. /* [2]P for adding */
  153722. XMEMCPY(c, p, sizeof(sp_point_1024));
  153723. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  153724. vx[0] = 1;
  153725. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  153726. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  153727. /* 3, 5, ... */
  153728. for (i = 1; i < 16; i++) {
  153729. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  153730. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  153731. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  153732. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  153733. q, p, t, 0);
  153734. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i],
  153735. p1024_mod);
  153736. }
  153737. XMEMCPY(c->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  153738. c->infinity = 0;
  153739. j = sp_1024_order_op_pre[0] / 2;
  153740. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  153741. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  153742. k = 0;
  153743. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  153744. /* Accumulate line into v and double point. */
  153745. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  153746. precomp[k].y, q, t, 1);
  153747. k++;
  153748. }
  153749. for (i = 2; i < 290; i += 2) {
  153750. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  153751. precomp[k].y, q, t, 0);
  153752. k++;
  153753. j = sp_1024_order_op_pre[i];
  153754. if (j > 0) {
  153755. j /= 2;
  153756. /* Accumulate line into v. */
  153757. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  153758. }
  153759. else {
  153760. j = -j / 2;
  153761. /* Accumulate line into v. */
  153762. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  153763. }
  153764. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  153765. /* Accumulate line into v and double point. */
  153766. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  153767. precomp[k].y, q, t, 1);
  153768. k++;
  153769. }
  153770. }
  153771. /* Final exponentiation */
  153772. sp_1024_proj_sqr_32(vx, vy, t);
  153773. sp_1024_proj_sqr_32(vx, vy, t);
  153774. /* Convert from PF_p[q] to F_p */
  153775. sp_1024_mont_inv_32(vx, vx, t);
  153776. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  153777. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  153778. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  153779. err = sp_1024_to_mp(r, res);
  153780. }
  153781. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  153782. defined(WOLFSSL_SP_SMALL_STACK)
  153783. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  153784. #endif
  153785. sp_1024_point_free_32(c, 1, NULL);
  153786. sp_1024_point_free_32(q, 1, NULL);
  153787. sp_1024_point_free_32(p, 1, NULL);
  153788. return err;
  153789. }
  153790. #endif /* WOLFSSL_SP_SMALL */
  153791. #ifdef HAVE_ECC_CHECK_KEY
  153792. /* Read big endian unsigned byte array into r.
  153793. *
  153794. * r A single precision integer.
  153795. * size Maximum number of bytes to convert
  153796. * a Byte array.
  153797. * n Number of bytes in array to read.
  153798. */
  153799. static void sp_1024_from_bin(sp_digit* r, int size, const byte* a, int n)
  153800. {
  153801. int i;
  153802. int j;
  153803. byte* d;
  153804. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  153805. r[j] = ((sp_digit)a[i - 0] << 0) |
  153806. ((sp_digit)a[i - 1] << 8) |
  153807. ((sp_digit)a[i - 2] << 16) |
  153808. ((sp_digit)a[i - 3] << 24);
  153809. j++;
  153810. }
  153811. if (i >= 0) {
  153812. r[j] = 0;
  153813. d = (byte*)r;
  153814. switch (i) {
  153815. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  153816. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  153817. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  153818. }
  153819. j++;
  153820. }
  153821. for (; j < size; j++) {
  153822. r[j] = 0;
  153823. }
  153824. }
  153825. /* Check that the x and y ordinates are a valid point on the curve.
  153826. *
  153827. * point EC point.
  153828. * heap Heap to use if dynamically allocating.
  153829. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  153830. * not on the curve and MP_OKAY otherwise.
  153831. */
  153832. static int sp_1024_ecc_is_point_32(const sp_point_1024* point,
  153833. void* heap)
  153834. {
  153835. #ifdef WOLFSSL_SP_SMALL_STACK
  153836. sp_digit* t1 = NULL;
  153837. #else
  153838. sp_digit t1[32 * 4];
  153839. #endif
  153840. sp_digit* t2 = NULL;
  153841. sp_int32 n;
  153842. int err = MP_OKAY;
  153843. #ifdef WOLFSSL_SP_SMALL_STACK
  153844. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 4, heap, DYNAMIC_TYPE_ECC);
  153845. if (t1 == NULL)
  153846. err = MEMORY_E;
  153847. #endif
  153848. (void)heap;
  153849. if (err == MP_OKAY) {
  153850. t2 = t1 + 2 * 32;
  153851. /* y^2 - x^3 - a.x = b */
  153852. sp_1024_sqr_32(t1, point->y);
  153853. (void)sp_1024_mod_32(t1, t1, p1024_mod);
  153854. sp_1024_sqr_32(t2, point->x);
  153855. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  153856. sp_1024_mul_32(t2, t2, point->x);
  153857. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  153858. sp_1024_mont_sub_32(t1, t1, t2, p1024_mod);
  153859. /* y^2 - x^3 + 3.x = b, when a = -3 */
  153860. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  153861. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  153862. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  153863. n = sp_1024_cmp_32(t1, p1024_mod);
  153864. sp_1024_cond_sub_32(t1, t1, p1024_mod, (sp_digit)~(n >> 31));
  153865. sp_1024_norm_32(t1);
  153866. if (!sp_1024_iszero_32(t1)) {
  153867. err = MP_VAL;
  153868. }
  153869. }
  153870. #ifdef WOLFSSL_SP_SMALL_STACK
  153871. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  153872. #endif
  153873. return err;
  153874. }
  153875. /* Check that the x and y ordinates are a valid point on the curve.
  153876. *
  153877. * pX X ordinate of EC point.
  153878. * pY Y ordinate of EC point.
  153879. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  153880. * not on the curve and MP_OKAY otherwise.
  153881. */
  153882. int sp_ecc_is_point_1024(const mp_int* pX, const mp_int* pY)
  153883. {
  153884. #ifdef WOLFSSL_SP_SMALL_STACK
  153885. sp_point_1024* pub = NULL;
  153886. #else
  153887. sp_point_1024 pub[1];
  153888. #endif
  153889. const byte one[1] = { 1 };
  153890. int err = MP_OKAY;
  153891. #ifdef WOLFSSL_SP_SMALL_STACK
  153892. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), NULL,
  153893. DYNAMIC_TYPE_ECC);
  153894. if (pub == NULL)
  153895. err = MEMORY_E;
  153896. #endif
  153897. if (err == MP_OKAY) {
  153898. sp_1024_from_mp(pub->x, 32, pX);
  153899. sp_1024_from_mp(pub->y, 32, pY);
  153900. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  153901. err = sp_1024_ecc_is_point_32(pub, NULL);
  153902. }
  153903. #ifdef WOLFSSL_SP_SMALL_STACK
  153904. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  153905. #endif
  153906. return err;
  153907. }
  153908. /* Check that the private scalar generates the EC point (px, py), the point is
  153909. * on the curve and the point has the correct order.
  153910. *
  153911. * pX X ordinate of EC point.
  153912. * pY Y ordinate of EC point.
  153913. * privm Private scalar that generates EC point.
  153914. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  153915. * not on the curve, ECC_INF_E if the point does not have the correct order,
  153916. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  153917. * MP_OKAY otherwise.
  153918. */
  153919. int sp_ecc_check_key_1024(const mp_int* pX, const mp_int* pY,
  153920. const mp_int* privm, void* heap)
  153921. {
  153922. #ifdef WOLFSSL_SP_SMALL_STACK
  153923. sp_digit* priv = NULL;
  153924. sp_point_1024* pub = NULL;
  153925. #else
  153926. sp_digit priv[32];
  153927. sp_point_1024 pub[2];
  153928. #endif
  153929. sp_point_1024* p = NULL;
  153930. const byte one[1] = { 1 };
  153931. int err = MP_OKAY;
  153932. /* Quick check the lengs of public key ordinates and private key are in
  153933. * range. Proper check later.
  153934. */
  153935. if (((mp_count_bits(pX) > 1024) ||
  153936. (mp_count_bits(pY) > 1024) ||
  153937. ((privm != NULL) && (mp_count_bits(privm) > 1024)))) {
  153938. err = ECC_OUT_OF_RANGE_E;
  153939. }
  153940. #ifdef WOLFSSL_SP_SMALL_STACK
  153941. if (err == MP_OKAY) {
  153942. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  153943. DYNAMIC_TYPE_ECC);
  153944. if (pub == NULL)
  153945. err = MEMORY_E;
  153946. }
  153947. if (err == MP_OKAY && privm) {
  153948. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  153949. DYNAMIC_TYPE_ECC);
  153950. if (priv == NULL)
  153951. err = MEMORY_E;
  153952. }
  153953. #endif
  153954. if (err == MP_OKAY) {
  153955. p = pub + 1;
  153956. sp_1024_from_mp(pub->x, 32, pX);
  153957. sp_1024_from_mp(pub->y, 32, pY);
  153958. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  153959. if (privm)
  153960. sp_1024_from_mp(priv, 32, privm);
  153961. /* Check point at infinitiy. */
  153962. if ((sp_1024_iszero_32(pub->x) != 0) &&
  153963. (sp_1024_iszero_32(pub->y) != 0)) {
  153964. err = ECC_INF_E;
  153965. }
  153966. }
  153967. /* Check range of X and Y */
  153968. if ((err == MP_OKAY) &&
  153969. ((sp_1024_cmp_32(pub->x, p1024_mod) >= 0) ||
  153970. (sp_1024_cmp_32(pub->y, p1024_mod) >= 0))) {
  153971. err = ECC_OUT_OF_RANGE_E;
  153972. }
  153973. if (err == MP_OKAY) {
  153974. /* Check point is on curve */
  153975. err = sp_1024_ecc_is_point_32(pub, heap);
  153976. }
  153977. if (err == MP_OKAY) {
  153978. /* Point * order = infinity */
  153979. err = sp_1024_ecc_mulmod_32(p, pub, p1024_order, 1, 1, heap);
  153980. }
  153981. /* Check result is infinity */
  153982. if ((err == MP_OKAY) && ((sp_1024_iszero_32(p->x) == 0) ||
  153983. (sp_1024_iszero_32(p->y) == 0))) {
  153984. err = ECC_INF_E;
  153985. }
  153986. if (privm) {
  153987. if (err == MP_OKAY) {
  153988. /* Base * private = point */
  153989. err = sp_1024_ecc_mulmod_base_32(p, priv, 1, 1, heap);
  153990. }
  153991. /* Check result is public key */
  153992. if ((err == MP_OKAY) &&
  153993. ((sp_1024_cmp_32(p->x, pub->x) != 0) ||
  153994. (sp_1024_cmp_32(p->y, pub->y) != 0))) {
  153995. err = ECC_PRIV_KEY_E;
  153996. }
  153997. }
  153998. #ifdef WOLFSSL_SP_SMALL_STACK
  153999. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  154000. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  154001. #endif
  154002. return err;
  154003. }
  154004. #endif
  154005. #endif /* WOLFSSL_SP_1024 */
  154006. #endif /* WOLFCRYPT_HAVE_SAKKE */
  154007. #endif /* WOLFSSL_HAVE_SP_ECC */
  154008. #endif /* WOLFSSL_SP_ARM32_ASM */
  154009. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH | WOLFSSL_HAVE_SP_ECC */